画线接近折线

时间:2019-07-29 12:34:19

标签: autocad polyline autocad-plugin autolisp

我有一个三角形作为折线,我想绘制一个高度。我给命令"line""_line"设置了正确的点,但是AutoCAD绘制了从顶点到相邻顶点的线。

不仅仅是在AutoLISP中,AutoCAD不允许我从顶点到折线的边中间绘制一条线。

我该怎么做?

我想在折线中添加一个顶点,但这并没有太大帮助。我试图添加连接器:圆或另一个对象关闭 足够的直线并连接高度,但这也无济于事。

有什么建议吗?

1 个答案:

答案 0 :(得分:5)

首先,我怀疑您当前尝试的问题是在提供指向LINE命令的点时活动对象捕捉模式的影响。

有几种方法可以避免这种情况:

1。使用“无”对象捕捉修改器

通过AutoLISP command表达式为AutoCAD命令提供点时,可以通过在点之前添加nonenon Object Snap来避免任何活动的Object Snap模式的影响。修饰符。

这类似于您在点之前加上end来强制激活“端点对象捕捉”修改器的方式,但是在这种情况下,nonenon表示 “忽略所有对象捕捉模式” 。可用前缀的完整列表可以在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

但是,此方法的缺点是,如果在没有适当的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 重新打开“对象捕捉”即可。

3。完全避免命令调用

当然,要避免“对象捕捉”对命令点输入的影响,最防弹的方法就是完全避免使用命令!

相反,您可以使用entmakeentmakex函数将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)))