AutoCAD 2021中筛选内部为空的闭合多段线的LISP程序需求
AutoLISP 例程:筛选内部无块的闭合多段线
实现思路
要筛选内部为空(无块对象)的闭合多段线,核心逻辑如下:
- 仅处理用户选中的闭合轻量多段线(通过对象类型
LWPOLYLINE和闭合属性位70=1过滤) - 对每一条目标多段线,获取其内部质心点作为检测点
- 在质心附近的极小区域内搜索块对象(
INSERT类型),无块则判定为内部为空 - 最终将所有符合条件的多段线设置为当前选择集
完整代码
(defun c:SelectEmptyPoly (/ ss i poly pt ss-ins empty-polys) ;; 初始化存储空多段线的列表 (setq empty-polys '()) ;; 获取用户选中的闭合轻量多段线 (setq ss (ssget '((0 . "LWPOLYLINE") (70 . 1)))) (if ss (progn (setq i 0) (repeat (sslength ss) (setq poly (ssname ss i)) ;; 获取多段线的质心(确保点在闭合区域内部) (setq pt (vlax-curve-getAreaCentroid poly)) (if pt (progn ;; 在质心周围极小窗口内搜索块对象 (setq ss-ins (ssget "_WP" (list (mapcar '- pt '(0.1 0.1)) (mapcar '+ pt '(0.1 0.1))) '((0 . "INSERT")))) ;; 未找到块则加入结果列表 (if (not ss-ins) (setq empty-polys (cons poly empty-polys)) ) ) ) (setq i (1+ i)) ) ;; 将结果设置为当前选择集 (if empty-polys (progn (setq ss (ssadd)) (foreach p empty-polys (ssadd p ss) ) (setvar "SELECTIONSET" ss) (princ (strcat "\n找到 " (itoa (sslength ss)) " 个内部为空的闭合多段线。")) ) (princ "\n未找到内部为空的闭合多段线。") ) ) (princ "\n请先选中至少一个闭合多段线。") ) (princ) ; 静默退出,避免返回多余值 )
使用说明
- 加载程序:将代码复制到AutoCAD命令行回车,或保存为
.lsp文件后用APPLOAD命令加载 - 执行命令:输入
SelectEmptyPoly(可缩写为SEP)并回车 - 结果:程序会自动筛选选中的闭合多段线,高亮显示内部为空的目标对象
关键细节说明
- 闭合多段线过滤:
ssget的过滤条件(70 . 1)确保仅处理闭合的轻量多段线,排除未闭合的对象 - 内部点获取:
vlax-curve-getAreaCentroid函数返回多段线的质心坐标,保证点处于闭合区域内部,避免误判 - 精准检测:使用极小窗口(
_WP窗口选择)搜索块,避免选中多段线外部的块对象,提高检测准确性
内容的提问来源于stack exchange,提问作者Kevin. Perez
相关产品推荐
相关产品推荐

