2016-08-11 8 views
2

저는 autocad에서 LISP를 처음 사용했습니다. 아래에 표시된 코드는 원 (반지름이 1 인)을 경 사진 선으로 그립니다. AutoCAD에서 그려지는 원의 중심은 (1,1), (1.7071,1.7071), (3,3), (3.7071)입니다. , 3.7071), (5,5) ... 누군가 pls 수 있습니다. 이유를 설명해라?autocad에서 autolisp리스트가 포인트로 사용되었습니다.

(defun c:wwq() 
    (setq a 0) 
    (while (< a 10) 
     (setq a (+ 1 a)) 
     (setq pt1 (list a a)) 
     (command "circle" pt1 1)  
    ) 
) 

답변

1

AutoLISP 명령 기능을 사용하는 동안 활성 개체 스냅에주의해야합니다. 당신이 코드의 시작에서 OSMODE의 시스템 변수를 0으로 설정하여 모든 개체 스냅을 비활성화 할 수 있습니다,

(defun c:wwq (/ a pt1) 
    (setq a 0) 
    (while (< a 10) 
    (setq a (+ 1 a)) 
    (setq pt1 (list a a)) 
    (command "_circle" "_none" pt1 1) 
) 
    (princ) 
) 

또는 : 한 가지 방법은 식 (... 명령) 개체가 이내 "없음"의 스냅없는 강제하는 것입니다 마지막에 이전 값을 되돌립니다 (실제로 안전하기 때문에이 메서드는 코드 실행 중에 오류가 발생할 경우 이전 값이 다시 설정되도록 보장하기 위해 오류 처리기가 필요합니다).

(defun c:wwq (/ a pt1 os) 
    (setq a 0 
    os (getvar 'osmode) 
) 
    (setvar 'osmode 0) 
    (while (< a 10) 
    (setq a (+ 1 a)) 
    (setq pt1 (list a a)) 
    (command "_circle" pt1 1) 
) 
    (setvar 'osmode os) 
    (princ) 
) 

또 다른 방법은 osnap에 대해 신경 쓰지 않고 빠르다는 entmake 기능을 사용하는 것입니다.

(defun c:wwq (/ a) 
    (setq a 0.0) 
    (while (< a 10.0) 
    (setq a (+ 1.0 a)) 
    (entmake 
     (list 
     (cons 0 "CIRCLE") 
     (list 10 a a 0.0) 
     (cons 40 1.0) 
    ) 
    ) 
) 
    (princ) 
)