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
相关产品推荐
相关产品推荐

