明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2525|回复: 23

[源码] CAD中快速查找图元

[复制链接]
发表于 2019-12-25 13:39 | 显示全部楼层 |阅读模式
300明经币
本帖最后由 刘炎华 于 2021-12-6 20:03 编辑

求助:怎么在选中一条线或多义线后,全图范围内查找相同的对象。感谢!

最佳答案

查看完整内容

(defun c:tt (/ judge l lst-name name obj ss t-get-length t-length) (defun T-get-Length (obj / t-length) (cond ((or (= (vla-get-ObjectName obj) "AcDbPolyline") (= (vla-get-ObjectName obj) "AcDbLine") ) (setq T-Length (vla-get-Length obj)) ) ((= (vla-get-ObjectName obj) "AcDbArc") (setq T-Length (vla-get-ArcLength obj)) ) ((= (vla-get-ObjectName ob ...
发表于 2019-12-25 13:39 | 显示全部楼层
本帖最后由 taoyi0727 于 2019-12-25 17:21 编辑

(defun c:tt (/ judge l lst-name name obj ss t-get-length t-length)
        (defun T-get-Length (obj / t-length)
                (cond
                        ((or
                                 (= (vla-get-ObjectName obj) "AcDbPolyline")
                                 (= (vla-get-ObjectName obj) "AcDbLine")
                         )
                                (setq T-Length (vla-get-Length obj))
                        )
                        ((= (vla-get-ObjectName obj) "AcDbArc")
                                (setq T-Length (vla-get-ArcLength obj))
                        )
                        ((= (vla-get-ObjectName obj) "AcDbCircle")
                                (setq T-Length (* pi (vla-get-Radius obj) 2))
                        )
                        ((= (vla-get-ObjectName obj) "AcDbSpline")
                                (setq endpar (vlax-curve-getEndParam obj))
                                (setq T-Length (vlax-curve-getDistAtParam obj endpar))
                        )
                )
                T-Length
        )
        (setq judge t)
        (while (and
                                         judge
                                         (setq ss (ssget ":E:S"))
                                 )
                (setq obj (vlax-ename->vla-object (ssname ss 0)))
                (setq T-Length (T-get-Length obj))
                (if T-Length
                        (progn
                                (setq ss (ssget "x"))
                                (while (setq name (ssname ss 0))
                                        (setq l (T-get-Length (vlax-ename->vla-object name)))
                                        (if (equal T-Length l 0.1);容差0.1,这个自己根据需要来改
                                                (setq lst-name (append lst-name (list name)))
                                        )
                                        (ssdel name ss)
                                )
                                (setq judge nil)
                        )
                )
        )
        (if lst-name
                (progn
                        (setq ss (ssadd))
                        (foreach x lst-name
                                (ssadd x ss)
                        )
                        (sssetfirst nil ss)
                        (princ (strcat "\n找到 " (itoa (sslength ss)) " 个对象\n"))
                        (princ)
                )
        )
)
看下是不是这样的

回复

使用道具 举报

发表于 2019-12-25 14:03 | 显示全部楼层
回复

使用道具 举报

发表于 2019-12-25 14:08 | 显示全部楼层
本帖最后由 qiannianhuazi 于 2019-12-26 11:08 编辑

查找相同多义线.命令 FJ 试试查找多义线(可以有效避免选取镜像的,对称的多义线,且可提示位置和数量)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复

使用道具 举报

发表于 2019-12-25 17:01 | 显示全部楼层
楼上能加个个数统计会更好
回复

使用道具 举报

发表于 2019-12-25 17:20 | 显示全部楼层
bai2000 发表于 2019-12-25 17:01
楼上能加个个数统计会更好

已经加上数量统计了
回复

使用道具 举报

发表于 2019-12-25 18:38 | 显示全部楼层
taoyi0727 发表于 2019-12-25 14:56
(defun c:tt (/ judge l lst-name name obj ss t-get-length t-length)
        (defun T-get-Length (obj / t-le ...

加上个只选择物体所在图层的?
回复

使用道具 举报

发表于 2019-12-25 21:11 | 显示全部楼层
  1. (defun c:tt () ;同长、同图层曲线
  2.   (if (setq s1 (car (entsel "\n选曲线: ")))
  3.     (progn
  4.       (setq ll (xyp-CurveLength s1)
  5.             la (xyp-DXF 8 s1)
  6.             i  -1
  7.             qf (list '(0 . "*LINE,ARC,CIRCLE,ELLIPSE") (cons 8 la))
  8.             ss (ssget "x" qf)
  9.             ss1 (ssadd)
  10.       )
  11.       (while (setq s1 (ssname ss (setq i (1+ i))))
  12.         (if (equal (xyp-CurveLength s1) ll 1e-3)(ssadd s1 ss1))
  13.       )
  14.       (sssetfirst nil ss1)
  15.       (princ (strcat "\n找到 " (itoa (sslength ss1)) " 个对象"))
  16.     )
  17.   )
  18.   (princ)
  19. )

点评

院长这个更加简短 只选择所在层的,符合我,谢谢  发表于 2019-12-26 08:55

评分

参与人数 1明经币 +1 收起 理由
linheyuanpcb + 1 赞一个!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2019-12-25 23:19 | 显示全部楼层
taoyi0727 发表于 2019-12-25 14:56
(defun c:tt (/ judge l lst-name name obj ss t-get-length t-length)
        (defun T-get-Length (obj / t-le ...

非常感谢!帮我解决了这个问题
回复

使用道具 举报

 楼主| 发表于 2019-12-26 12:15 来自手机 | 显示全部楼层
taoyi0727 发表于 2019-12-25 13:39
(defun c:tt (/ judge l lst-name name obj ss t-get-length t-length)
        (defun T-get-Length (obj / t-le ...

您好!如果图档太大查找会卡死,可以设条件查找对象为相同图层吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-20 09:14 , Processed in 0.201562 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表