我有一个三角形作为折线,我想绘制一个高度。我给出命令"line"
或"_line"
正确的点,但是AutoCAD绘制了从顶点到相邻顶点的线。
不只是在AutoLISP中,AutoCAD也不允许我在折线中从顶点到边的中间画一条线。
我怎样才能做到这一点?
我想在折线中添加一个顶点,但这并没有太大帮助。我试图添加连接器:一个圆或另一个距离该线足够近的物体,并将高度连接到该物体,但这都没有帮助。
有什么建议么?
首先,我怀疑您当前尝试的问题是在为LINE
命令提供点时激活的对象捕捉模式的影响。
有几种方法可以避免这种情况:
1.使用“无”对象捕捉修改器通过AutoLISP command
表达式为AutoCAD命令提供点时,可以通过在该点之前加上none
或“ non
对象捕捉”修饰符来避免任何活动的“对象捕捉”模式的影响。
这类似于你怎么可能与之前的一个点end
,迫使端点对象捕捉改性剂的活化,但在这种情况下,none
或non
手段“忽略所有对象捕捉模式”。可用前缀的完整列表可在此处找到。
这是此方法的示例:
(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,则在非英语版本的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
,并且没有适当的错误处理程序,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容器的方法,例如,在模型空间中创建您可能使用的Line:
(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)
)