autocad - 在折线附近画线

标签 autocad polyline autocad-plugin autolisp

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

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

我怎样才能做到这一点?

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

有什么建议么?

最佳答案

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

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

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

通过 AutoLISP 向 AutoCAD 命令提供点时 command表达式,您可以通过在该点前面加上 none 来避免任何事件对象捕捉模式的影响。或 non对象捕捉修改器。

这类似于您可能在一个点前面加上 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
    

    但是,这种方法的缺点是如果在 OSMODE 期间发生错误。设置为 0 , 在没有合适的 error handler 的情况下, OSMODE将保持等于 0当用户发现他们丢失了对象捕捉设置时,他们会中风。

    因此,一种更“优雅”的方式来临时禁用 OSMODE是利用第 16384 位,该位在设置时表示对象捕捉已关闭。

    现在,而不是使用 if语句测试是否位 16384存在于 OSMODE值,如果是,从值中减去它,我们可以使用 AutoLISP logior (包括按位 OR )函数以在单个表达式中解释这两种情况:

    (setvar 'osmode (logior 16384 (getvar 'osmode)))
    

    这将返回按位包含的结果 OR16384 之间的操作和 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/

    相关文章:

    animation - 使用 SVG animate 为折线的外观设置动画

    python - 通过 Python 打开一个新的 AutoCAD 实例

    c# - AutoCAD resbuf 迁移

    c# - 以编程方式获取 AutoCAD 中 block 的位置及其 ObjectId

    javascript - 获取用户自由手绘折线的坐标。 (用于 JavaScript 的 ArcGIS API)

    vb6 - 诊断自愈 MSI

    c++ - 学习 CAD/CAE 文件格式的起点?

    lisp - 复制时如何更新实体的扩展数据信息

    python - 如何使用 python win32com.client 在 Excel 中添加折线?

    lisp - 设置和重置系统变量 - AutoCAD LISP