画线靠近多段线

drawing line close to polyline

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

不仅在 AutoLISP 中,AutoCAD 也不会让我在多段线中绘制从顶点到边缘中间的直线。

我该怎么做?

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

有什么建议吗?

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

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

1。使用 "None" 对象捕捉修饰符

当通过 AutoLISP command 表达式向 AutoCAD 命令提供点时,您可以通过在点前加上 nonenon 来避免任何活动对象捕捉模式的影响对象捕捉修改器。

这类似于您在点前添加 end 以强制激活端点对象捕捉修改器的方式,但在这种情况下,nonenon 表示 "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 位 16384OSMODE 系统变量的当前值之间按位包含 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)
)