画线靠近多段线
drawing line close to polyline
我有一个三角形作为折线,我想画一个海拔高度。我给命令 "line"
或 "_line"
正确的点,但 AutoCAD 绘制了从顶点到相邻顶点的线。
不仅在 AutoLISP 中,AutoCAD 也不会让我在多段线中绘制从顶点到边缘中间的直线。
我该怎么做?
我想在多段线中添加一个顶点,但这并没有多大帮助。我尝试添加连接器:一个圆圈或另一个对象关闭
足够的线并将高度连接到它,但这也没有帮助。
有什么建议吗?
首先,我怀疑您当前尝试的问题是在向 LINE
命令提供点时活动对象捕捉模式的影响。
有几种方法可以避免这种情况:
1。使用 "None" 对象捕捉修饰符
当通过 AutoLISP command
表达式向 AutoCAD 命令提供点时,您可以通过在点前加上 none
或 non
来避免任何活动对象捕捉模式的影响对象捕捉修改器。
这类似于您在点前添加 end
以强制激活端点对象捕捉修改器的方式,但在这种情况下,none
或 non
表示 "ignore all Object Snap modes"。可以找到可用前缀的完整列表 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,则它可能在非英语语言中具有其他含义。
dot/period 前缀 .
(在 "_.line"
中使用)导致 AutoCAD 始终使用命令的原始定义,而不是重新定义的版本(如果用户使用了 UNDEFINE
命令,则可能存在)。
2。暂时禁用对象捕捉
虽然上述方法承认可能存在活动的对象捕捉模式,强制为每个点输入忽略此类模式,但如果您发出许多涉及大量点输入的命令调用,您可能会发现简单地暂时更简洁完全禁用对象捕捉,然后在程序完成后重新启用之前的活动模式。
实现此目的的明显方法是存储 OSMODE
系统变量的当前值,在发出 command
表达式之前将此类系统变量设置为 0
,然后将 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
,当用户发现他们丢失了对象捕捉设置时,他们会中风。
因此,一种更 'graceful' 的暂时禁用 OSMODE
的方法是使用位 16384,当它被设置时,表示对象捕捉已被关闭。
现在,与其使用 if
语句来测试位 16384
是否存在于 OSMODE
值中,如果是,则从该值中减去它,我们可以使使用 AutoLISP logior
(包括按位 OR
)函数在单个表达式中考虑两种情况:
(setvar 'osmode (logior 16384 (getvar 'osmode)))
这将 return 位 16384
和 OSMODE
系统变量的当前值之间按位包含 OR
运算的结果。因此,如果 16384
已经存在于值中,它将被 returned,否则将被添加。
可以这样实现:
(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[=108= 重新打开对象捕捉].
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路线,使用相关Block容器的AddLine
方法,例如要在模型空间中创建一条直线,您可以使用:
(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)
)
我有一个三角形作为折线,我想画一个海拔高度。我给命令 "line"
或 "_line"
正确的点,但 AutoCAD 绘制了从顶点到相邻顶点的线。
不仅在 AutoLISP 中,AutoCAD 也不会让我在多段线中绘制从顶点到边缘中间的直线。
我该怎么做?
我想在多段线中添加一个顶点,但这并没有多大帮助。我尝试添加连接器:一个圆圈或另一个对象关闭 足够的线并将高度连接到它,但这也没有帮助。
有什么建议吗?
首先,我怀疑您当前尝试的问题是在向 LINE
命令提供点时活动对象捕捉模式的影响。
有几种方法可以避免这种情况:
1。使用 "None" 对象捕捉修饰符
当通过 AutoLISP command
表达式向 AutoCAD 命令提供点时,您可以通过在点前加上 none
或 non
来避免任何活动对象捕捉模式的影响对象捕捉修改器。
这类似于您在点前添加 end
以强制激活端点对象捕捉修改器的方式,但在这种情况下,none
或 non
表示 "ignore all Object Snap modes"。可以找到可用前缀的完整列表 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,则它可能在非英语语言中具有其他含义。dot/period 前缀
.
(在"_.line"
中使用)导致 AutoCAD 始终使用命令的原始定义,而不是重新定义的版本(如果用户使用了UNDEFINE
命令,则可能存在)。
2。暂时禁用对象捕捉
虽然上述方法承认可能存在活动的对象捕捉模式,强制为每个点输入忽略此类模式,但如果您发出许多涉及大量点输入的命令调用,您可能会发现简单地暂时更简洁完全禁用对象捕捉,然后在程序完成后重新启用之前的活动模式。
实现此目的的明显方法是存储 OSMODE
系统变量的当前值,在发出 command
表达式之前将此类系统变量设置为 0
,然后将 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
,当用户发现他们丢失了对象捕捉设置时,他们会中风。
因此,一种更 'graceful' 的暂时禁用 OSMODE
的方法是使用位 16384,当它被设置时,表示对象捕捉已被关闭。
现在,与其使用 if
语句来测试位 16384
是否存在于 OSMODE
值中,如果是,则从该值中减去它,我们可以使使用 AutoLISP logior
(包括按位 OR
)函数在单个表达式中考虑两种情况:
(setvar 'osmode (logior 16384 (getvar 'osmode)))
这将 return 位 16384
和 OSMODE
系统变量的当前值之间按位包含 OR
运算的结果。因此,如果 16384
已经存在于值中,它将被 returned,否则将被添加。
可以这样实现:
(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[=108= 重新打开对象捕捉].
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路线,使用相关Block容器的AddLine
方法,例如要在模型空间中创建一条直线,您可以使用:
(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)
)