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

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) ; 静默退出,避免返回多余值
)

使用说明

  1. 加载程序:将代码复制到AutoCAD命令行回车,或保存为.lsp文件后用APPLOAD命令加载
  2. 执行命令:输入SelectEmptyPoly(可缩写为SEP)并回车
  3. 结果:程序会自动筛选选中的闭合多段线,高亮显示内部为空的目标对象

关键细节说明

  • 闭合多段线过滤:ssget的过滤条件(70 . 1)确保仅处理闭合的轻量多段线,排除未闭合的对象
  • 内部点获取:vlax-curve-getAreaCentroid函数返回多段线的质心坐标,保证点处于闭合区域内部,避免误判
  • 精准检测:使用极小窗口(_WP窗口选择)搜索块,避免选中多段线外部的块对象,提高检测准确性

内容的提问来源于stack exchange,提问作者Kevin. Perez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 08:31:01