我有一个三角形作为折线,我想画一个高度。我发出命令 "line"
或 "_line"
正确的点,但 AutoCAD 绘制从顶点到相邻顶点的线。
不只是在 AutoLISP 中,AutoCAD 不允许我在折线中从顶点到边的中间画一条线。
我怎样才能做到这一点?
我想在折线中添加一个顶点,但这并没有太大帮助。我试图添加连接器:一个圆圈或另一个关闭的对象
足够到线并将高度连接到它,但这也无济于事。
有什么建议么?
最佳答案
首先,我怀疑您当前尝试的问题是在向 LINE
提供点时事件对象捕捉模式的影响。命令。
有几种方法可以避免这种情况:
1.使用“无”对象捕捉修改器
通过 AutoLISP 向 AutoCAD 命令提供点时 command
表达式,您可以通过在该点前面加上 none
来避免任何事件对象捕捉模式的影响。或 non
对象捕捉修改器。
这类似于您可能在一个点前面加上 end
。强制激活端点对象捕捉修改器,但在这种情况下,none
或 non
表示“忽略所有对象捕捉模式”。可以找到可用前缀的完整列表 here .
下面是这个方法的一个例子:
(setq p '(0.0 0.0 0.0)
q '(1.0 1.0 0.0)
)
(command "_.line" "_non" p "_non" q "")
关于上面的几点说明:
_
(在 "_.line"
和 "_non"
中使用)导致 AutoCAD 将输入解释为非本地化命令输入(即英语),否则,如果将此类输入提供给非英语版本的 AutoCAD,则它可能具有其他含义在非英语语言中。 .
(在 "_.line"
中使用)导致 AutoCAD 始终使用命令的原始定义,而不是重新定义的版本(如果用户使用了 UNDEFINE
命令,则可能存在)。 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
, 在没有合适的 error handler 的情况下, OSMODE
将保持等于 0
当用户发现他们丢失了对象捕捉设置时,他们会中风。因此,一种更“优雅”的方式来临时禁用
OSMODE
是利用第 16384 位,该位在设置时表示对象捕捉已关闭。现在,而不是使用
if
语句测试是否位 16384
存在于 OSMODE
值,如果是,从值中减去它,我们可以使用 AutoLISP logior
(包括按位 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
现在,如果代码在关闭对象捕捉时遇到错误,对象捕捉设置不会丢失 - 用户可能只需要使用 F3 重新打开对象捕捉。
3. 完全避免命令调用
当然,避免对象捕捉对命令点输入的影响的最安全的方法是完全避免命令!
相反,您可以使用
entmake
或 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)
)
关于autocad - 在折线附近画线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57253997/