首先,我怀疑您当前尝试的问题是向对象提供点时活动对象捕捉模式的影响LINE
命令。
有几种方法可以避免这种情况:
1.使用“无”对象捕捉修改器
通过 AutoLISP 向 AutoCAD 命令提供点时command
表达式,您可以通过在该点前面加上none
or non
对象捕捉修改器。
这类似于您在一个点之前使用end
强制激活端点对象捕捉修改器,但在这种情况下,none
or non
means “忽略所有对象捕捉模式”。可以找到可用前缀的完整列表here.
下面是该方法的一个示例:
(setq p '(0.0 0.0 0.0)
q '(1.0 1.0 0.0)
)
(command "_.line" "_non" p "_non" q "")
对上面的几点说明:
2. 暂时禁用对象捕捉
虽然上述方法承认可能存在活动的对象捕捉模式,强制每个点输入忽略此类模式,但如果您发出涉及大量点输入的许多命令调用,您可能会发现简单地暂时完全禁用对象捕捉会更干净,然后在程序完成后重新启用之前的活动模式。
实现这一点的明显方法是存储当前值OSMODE
系统变量,将该系统变量设置为0
在发出您的command
表达式,然后重置OSMODE
系统变量为其先前的值,例如:
(setq p '(0.0 0.0 0.0)
q '(1.0 1.0 0.0)
m (getvar 'osmode) ;; Store current OSMODE
)
(setvar 'osmode 0) ;; Set OSMODE to 0 (disables all snaps)
(command "_.line" p q "")
(setvar 'osmode m) ;; Reset OSMODE to stored value
然而,这种方法有一个缺点,如果在该时间内发生错误OSMODE
被设定为0
,在没有适当的错误处理程序, OSMODE
将保持等于0
当用户发现自己丢失了对象捕捉设置时,他们会感到愤怒。
因此,一种更“优雅”的方式来暂时禁用OSMODE
是利用位 16384,该位设置后表示对象捕捉已关闭。
现在,而不是使用if
测试是否位的语句16384
存在于OSMODE
值,如果是,则从该值中减去它,我们可以使用 AutoLISPlogior
(包括按位OR
) 函数在单个表达式中考虑这两种情况:
(setvar 'osmode (logior 16384 (getvar 'osmode)))
这将返回按位包含的结果OR
位之间的运算16384
和当前值OSMODE
系统变量。因此,如果16384
已存在于值中,则将返回该值,否则将添加该值。
这可以按如下方式实现:
(setq p '(0.0 0.0 0.0)
q '(1.0 1.0 0.0)
m (getvar 'osmode) ;; Store current OSMODE
)
(setvar 'osmode (logior 16384 m)) ;; Turn off Object Snap
(command "_.line" p q "")
(setvar 'osmode m) ;; Reset OSMODE to stored value
Now, if the code encounters an error whilst Object Snap is turned off, the Object Snap settings are not lost - the user may simply need to turn Object Snap back on using F3.
3. 完全避免命令调用
当然,避免对象捕捉对命令点输入影响的最可靠方法是完全避免命令!
相反,您可以使用entmake or entmakex函数将DXF数据直接附加到绘图数据库:
(setq p '(0.0 0.0 0.0)
q '(1.0 1.0 0.0)
)
(entmake (list '(0 . "LINE") (cons 10 p) (cons 11 q)))
或者,您可以遵循 Visual LISP ActiveX 路线并使用AddLine相关 Block 容器的方法,例如要在模型空间中创建一条线,您可以使用:
(vl-load-com)
(setq p '(0.0 0.0 0.0)
q '(1.0 1.0 0.0)
)
(vla-addline
(vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
(vlax-3D-point p)
(vlax-3D-point q)
)