2016-08-21 1 views
1
;;----------------=={ Add Objects to Block }==----------------;; 
;;               ;; 
;; Adds all objects in the provided SelectionSet to the  ;; 
;; definition of the specified block.      ;; 
;;------------------------------------------------------------;; 
;; Author: Lee Mac, Copyright © 2011 - www.lee-mac.com  ;; 
;;------------------------------------------------------------;; 

(defun LM:AddObjectstoBlock (doc block ss/lst mat) 

    (setq lst (LM:ss->vla ss) 
      mat (LM:Ref->Def block) 
      mat (vlax-tmatrix (append (mapcar 'append (car mat) (mapcar 'list (cadr mat))) '((0. 0. 0. 1.)))) 
    ) 
    (foreach obj lst (vla-transformby obj mat)) 

    (vla-CopyObjects doc (LM:SafearrayVariant vlax-vbobject lst) 
     (vla-item (vla-get-Blocks doc) (cdr (assoc 2 (entget block)))) 
    ) 
    (foreach obj lst (vla-delete obj)) 
    (vla-regen doc acAllViewports) 

이 유형의 구문이 AutoLISP에서 사용 된 것은 이번이 처음입니다.AutoLISP에서 ":"및 "->"사용

저는 실제로 "LM:"의 의미에 대해 설명하려고합니다.

"Ref->"의 사용도 저에게는 질문입니다. "Ref"은 정의되지 않은 것처럼 보이므로 어떤 식 으로든 시스템의 일부 여야합니다. "Ref->"과 같은 사용법을 설명하는 문서를 가져올 수는 없습니다.

로컬 변수 ss"LM:ss->"으로 액세스하는 이유는 무엇입니까?

감사합니다.

답변

2

이 구문 유형은 AutoLISP/Visual LISP의 구성이 아닙니다. Lee Mac의 표준입니다.

:이 방법으로 그것을 이해 "LM :"실제로 "리 맥"의 바로 가기를 의미한다)

(LM : SS-> VLA SS) VLA-객체 목록으로 설정 선택에서 데이터 유형을 전환 shound 선택 집합은 선택된 요소의 목록과 비슷하지만 vla-object가 아닌 유형 엔터티로 정의됩니다. 아마도 (ssget) 또는 (ssgetfirst)

(LM : Ref-> Def 블록)에 의해 참조를 기반으로 블록 정의를 가져올 수 있습니다. 여기서 "LM : Ref-> Def"는 함수의 전체 이름입니다. "Ref"는 어떤 종류의 변수도 아니며 함수 이름의 일부입니다.

"LM : ss->"는 함수의 매개 변수로 정의 된 ss를 사용한다는 것을 의미하지 않지만 "LM : ss-> vla"는 함수의 이름입니다.

+0

마지막으로 "->"가 포함 된 함수의 이름을보고 나서 이해했습니다. 그래서 저는 LISP의 일환으로 "=>"가있을 수 있지만 리 맥 협약은 실제 "->"가 아니라고 생각합니다. – Giuseppe

0

의 AutoLISP의 함수를 정의 할 때, 생성 된 함수에 다른 동작을 부여하는 유일한 명명 규칙 프리픽스 예 c:

에게이다

(defun c:test () 
    (princ "\nHello World!") 
    (princ) 
) 

c: 접두사 사용 함수 이름에 함수가 AutoCAD 명령 줄에서 직접 명령으로 평가 될 수 있음을 의미합니다.

여기서 AutoCAD 명령 줄에 test을 입력하면 Hello World!이 명령 줄 창에서 새 줄에 인쇄됩니다.

기능 대신으로 정의 된 경우 :

오류 메시지가 발생할 것 AutoCAD를 명령 줄에서 test을 입력하면
(defun test () 
    (princ "\nHello World!") 
    (princ) 
) 

: 함수에 대한

Command: test Unknown command "TEST". Press F1 for help.

평가하기 위해, 사용자는 대신 (test)을 입력해야합니다.염두에두고


LM:의 사용은 나의 라이브러리 함수로 식별보다 다른 의미가 없으며, 같은 이름의 함수가 동일한 네임 스페이스에 정의 될 확률을 줄일 수 있습니다. I와 같은 함수를 정의한다면

예를 들면 :는 (적어도 AutoCAD의 관계 임) 수행이 함수 유비쿼터스 동작의 일반 네이밍 주어

(defun AddLine (pt1 pt2) 
    (entmakex 
     (list 
      '(0 . "LINE") 
      (cons 10 pt1) 
      (cons 11 pt2) 
     ) 
    ) 
) 

잘있을 수있다 Document Namespace 내에서 같은 이름으로 정의 된 다른 함수.

결과적으로 위의 defun 표현식이 평가 될 때 기존 함수가 재정의되거나 자체 defun 표현식이 나중에 평가 될 경우 기존 함수가 위의 함수를 재정의합니다.

내 자신의 저자 접두사 LM:와 함수 이름을 앞에 붙여

: 나는 문서 네임 스페이스 내에서 LM:AddLine을 평가할 때,이 함수의 내 자신의 정의는 항상 사용됩니다 수 있도록 돕고

(defun LM:AddLine (pt1 pt2) 
    (entmakex 
     (list 
      '(0 . "LINE") 
      (cons 10 pt1) 
      (cons 11 pt2) 
     ) 
    ) 
) 

하고, 다른로드 된 프로그램에서 사용되는 함수의 정의를 '오염시킬'가능성이 적습니다.


마찬가지로, 함수 이름 내 ->의 사용은 순수한 명명 규칙이며, 함수에 대한 다른 의미를 부여하지 않는다. 이 VLA-개체 목록에 (내가 ss을 축약 한) 선택 설정을 변환하는 표준 기능 from my library 때문에

는 예를 들어, 내 기능 LM:ss->vla 명명했다.