2

我是AutoCAD中LISP的新手。下面显示的代码在斜线上绘制圆(半径为 1)。我不明白的是“a”的值不会以 1 为增量增加。在 autocad 中绘制的圆的中心是 (1,1) , (1.7071,1.7071) , (3,3) , (3.7071 ,3.7071) , (5,5) ... 有人可以请。解释为什么?

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

1 回答 1

1

使用 AutoLISP 命令功能时,您必须注意活动对象捕捉。一种方法是在 (command ...) 表达式中强制对象捕捉到“无”:

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

或者,您可以通过在代码开头将 OSMODE 系统变量设置为 0 并在最后恢复之前的值来停用每个 osnap(为了真正安全,此方法应该需要和错误处理程序来确保重置之前的值以防代码执行过程中发生错误)。

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

另一种方法是使用更快且不关心 osnaps 的 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)
)
于 2016-08-11T11:58:33.930 回答