2016-08-11 5 views
2

私はautocadでLISPを使いました。以下に示すコードは、円(半径1)を斜線で描いています。私が理解できないことは、 "a"の値が1ずつ増加しないことです。オートキャドに描かれる円の中心は(1,1)、(1.7071,1.7071)、(3,3)、(3.7071 、3.7071)、(5,5)...誰かがplsすることができます。理由を説明?autocadでオートリストのリストとして使用されている

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

答えて

1

AutoLISPコマンド機能を使用している間は、アクティブなオブジェクトスナップを気にする必要があります。

(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) 
) 

それとも、あなたはコードの初めに0にOSMODEシステム変数を設定することにより、すべてのオブジェクトスナップを無効にすることができます 一つの方法は、(コマンド...)式の中で、「なし」にスナップオブジェクトを強制することです最後に前の値を戻します(本当に安全です。このメソッドは、コード実行中にエラーが発生した場合に前の値がリセットされるようにするために、エラーハンドラが必要です)。

(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) 
) 

もう1つの方法は、より速く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) 
) 
関連する問題