我有一个三角形作为折线,我想绘制一个高度。我给命令"line"
或"_line"
设置了正确的点,但是AutoCAD绘制了从顶点到相邻顶点的线。
不仅仅是在AutoLISP中,AutoCAD不允许我从顶点到折线的边中间绘制一条线。
我该怎么做?
我想在折线中添加一个顶点,但这并没有太大帮助。我试图添加连接器:圆或另一个对象关闭 足够的直线并连接高度,但这也无济于事。
有什么建议吗?
答案 0 :(得分:5)
首先,我怀疑您当前尝试的问题是在提供指向LINE
命令的点时活动对象捕捉模式的影响。
有几种方法可以避免这种情况:
通过AutoLISP command
表达式为AutoCAD命令提供点时,可以通过在点之前添加none
或non
Object Snap来避免任何活动的Object Snap模式的影响。修饰符。
这类似于您在点之前加上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
命令)。
尽管上述方法承认可能存在活动的“对象捕捉”模式,从而迫使每个点输入都忽略了这种模式,但是如果您发出许多涉及多个点输入的命令调用,则可能会发现更干净的方法是暂时禁用对象完全捕捉,然后在程序完成后重新启用以前的活动模式。
实现此目的的明显方法是存储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
但是,此方法的缺点是,如果在没有适当的error handler的情况下将OSMODE
设置为0
的过程中发生错误,则{{1} }保持等于OSMODE
,并且当用户发现自己丢失了“对象捕捉”设置时,他将会中风。
因此,暂时禁用0
的另一种“优美”方法是利用16384位,该位在置位时表示对象捕捉已关闭。
现在,无需使用OSMODE
语句来测试if
值中是否存在位16384
,如果存在,请从值中减去它,我们可以使用AutoLISP OSMODE
(包括按位logior
)函数可以在一个表达式中说明这两种情况:
OR
这将返回位(setvar 'osmode (logior 16384 (getvar 'osmode)))
与系统变量OR
的当前值之间的按位包含16384
运算的结果。因此,如果值中已经存在OSMODE
,它将被返回,否则将被添加。
这可以实现如下:
16384
现在,如果在关闭“对象捕捉”时代码遇到错误,则“对象捕捉”设置不会丢失-用户可能只需要使用 F3 重新打开“对象捕捉”即可。
当然,要避免“对象捕捉”对命令点输入的影响,最防弹的方法就是完全避免使用命令!
相反,您可以使用entmake
或entmakex
函数将DXF数据直接附加到图形数据库:
(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
或者,您可以遵循Visual LISP ActiveX路由并使用相关Block容器的AddLine
方法,例如在模型空间中创建一条线,您可以使用:
(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)))