You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AutoLISP创建对象时自动捕捉附近对象,除关闭OSNAP外还有其他解决方法吗?

解决AutoLISP创建对象时被OSNAP干扰的替代方案

除了全局关闭对象捕捉(OSNAP),还有以下几种更灵活的解决办法:

1. 使用_non透明命令临时禁用单步捕捉

在调用AutoCAD命令时,给指定坐标前加上_non前缀,强制AutoCAD忽略当前的对象捕捉设置,仅对当前坐标输入生效,不会改变全局OSMODE变量。

修改后的代码示例:

(progn
    (command "_line" (list 0 0 0) (list 500 500 500) "")
    (command "_.-VIEW" "_swiso")
    (command "_circle" "_non" (list 250 250 250) 50) ; 添加_non前缀
    (command "_LIST" (ssget "_L") "")
)

2. 使用AutoLISP原生实体创建函数(绕过命令行)

直接通过AutoLISP的底层函数创建实体,这类操作不经过命令行,完全不受对象捕捉设置的影响,是更可靠的方式。

方式A:使用entmake函数

(progn
    (command "_line" (list 0 0 0) (list 500 500 500) "")
    (command "_.-VIEW" "_swiso")
    ; 用entmake创建圆
    (entmake
        (list
            '(0 . "CIRCLE")       ; 实体类型
            '(10 250 250 250)     ; 圆心坐标
            '(40 . 50)            ; 半径
        )
    )
    (command "_LIST" (ssget "_L") "")
)

方式B:使用ActiveX/VLAX函数(适用于AutoCAD 2000及以上版本)

(progn
    (command "_line" (list 0 0 0) (list 500 500 500) "")
    (command "_.-VIEW" "_swiso")
    ; 用VLAX函数创建圆
    (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
    (vla-AddCircle (vla-get-ModelSpace doc) (vlax-3d-point 250 250 250) 50)
    (command "_LIST" (ssget "_L") "")
)

3. 临时保存并恢复OSMODE设置(灵活切换捕捉状态)

如果允许临时关闭捕捉但需要保留用户原有设置,可先保存当前OSMODE值,创建完成后再恢复:

(progn
    (command "_line" (list 0 0 0) (list 500 500 500) "")
    (command "_.-VIEW" "_swiso")
    ; 保存当前OSMODE设置
    (setq old-osmode (getvar "OSMODE"))
    ; 临时关闭捕捉
    (setvar "OSMODE" 0)
    (command "_circle" (list 250 250 250) 50)
    ; 恢复之前的捕捉设置
    (setvar "OSMODE" old-osmode)
    (command "_LIST" (ssget "_L") "")
)

内容的提问来源于stack exchange,提问作者Jason Rancourt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.02 03:47:31