乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 58|回复: 4

[编程交流] 选择所有相交的块

[复制链接]

8

主题

45

帖子

39

银币

初来乍到

Rank: 1

铜币
45
发表于 2022-7-5 15:09:07 | 显示全部楼层 |阅读模式
尊敬的各位:,
我正在寻找lisp来选择通过特定多段线相交的所有块。
我有多段线绘制的通风管道系统方案,其中插入了流量阻尼器。
我的多段线具有与风管尺寸相对应的特定线型。
因此,我想选择,例如,位于线型为“TZB_100”的多段线上的所有块,然后我可以将值100写入flow damper block Attibute tag“SIZE”。
其次,其他尺寸125、160。。。。
 
最后,我可以创建特定流量阻尼器和其他组件的数量清单。
计划图纸
160912mox4hh87rrbhrxnz.png
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 15:34:21 | 显示全部楼层
你好
 
就这样吧。
 
  1. (defun c:Test (/ int sel ent get bks lws ins)
  2. ;;        Tharwat . Date: 17.Jun.2018        ;;
  3. (and
  4.    (setq int -1
  5.          sel (ssget "_:L"
  6.                     '((-4 . "<OR")
  7.                       (-4 . "<AND")
  8.                       (0 . "LWPOLYLINE")
  9.                       (6 . "TZB_100,TZB_125,TZB_160")
  10.                       (-4 . "AND>")
  11.                       (-4 . "<AND")
  12.                       (0 . "INSERT")
  13.                       (2 . "dn_cu")
  14.                       (-4 . "AND>")
  15.                       (-4 . "OR>")
  16.                      )
  17.              )
  18.    )
  19.    (progn
  20.      (while (setq ent (ssname sel (setq int (1+ int))))
  21.        (if (= (cdr (assoc 0 (setq get (entget ent)))) "INSERT")
  22.          (setq bks (cons get bks))
  23.          (setq lws (cons get lws))
  24.        )
  25.      )
  26.      (and bks lws)
  27.    )
  28.    (foreach lw lws
  29.      (foreach bk bks
  30.        (and
  31.          (setq ins (cdr (assoc 10 bk)))
  32.          (equal (distance
  33.                   (vlax-curve-getclosestpointto (cdr (assoc -1 lw)) ins)
  34.                   ins
  35.                 )
  36.                 0.0
  37.                 1e-4
  38.          )
  39.          (vl-some
  40.            '(lambda (att)
  41.               (and
  42.                 (eq (vla-get-tagstring att) "DN")
  43.                 (vla-put-textstring att (substr (cdr (assoc 6 lw)) 5))
  44.               )
  45.             )
  46.            (vlax-invoke
  47.              (vlax-ename->vla-object (cdr (assoc -1 bk)))
  48.              'getattributes
  49.            )
  50.          )
  51.          (setq bks (vl-remove bk bks))
  52.        )
  53.      )
  54.    )
  55. )
  56. (princ)
  57. ) (vl-load-com)
回复

使用道具 举报

8

主题

45

帖子

39

银币

初来乍到

Rank: 1

铜币
45
发表于 2022-7-5 15:48:53 | 显示全部楼层
完美的塔尔瓦特,
首先,我很困惑,因为在我看来它什么都没做。
但是当我看到这些代码时,我意识到它可以工作,但它可以与“dn\u cu”块和属性标记“dn”一起工作,而不是与“Flow damper JL”块和标记“SIZE”一起工作。
当我改变它时,它完全符合我的需要。
 
你对我的帮助超出了我的预期:)
 
“Flow damper JL”块存在一个小问题,因为它是动态块,如果它是动态旋转的,则显示为匿名(块名:“Flow damper JL”,匿名名称:“*U20”),并且不是由代码选择的。
 
是否可以修改它以根据原始名称选择块?
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 15:55:47 | 显示全部楼层
嗨,Jozef,
 
很抱歉,由于工作负荷过重,回复时间太晚。
 
我已经修改了程序,将动态块“Flow Damper JL”和相关标记字符串“SIZE”包括在内,因此请尝试以下程序并告诉我。
 
  1. (defun c:Test (/ int sel ent get obj bks lws ins)
  2. ;;        Tharwat . Date: 19.Jun.2018        ;;
  3. (and
  4.    (setq int -1
  5.          sel (ssget "_:L"
  6.                     '((-4 . "<OR")
  7.                       (-4 . "<AND")
  8.                       (0 . "*POLYLINE")
  9.                       (6 . "TZB_100,TZB_125,TZB_160")
  10.                       (-4 . "AND>")
  11.                       (-4 . "<AND")
  12.                       (0 . "INSERT")
  13.                       (2 . "`*U*,Flow damper-JL,dn_cu")
  14.                       (-4 . "AND>")
  15.                       (-4 . "OR>")
  16.                      )
  17.              )
  18.    )
  19.    (progn
  20.      (while (setq ent (ssname sel (setq int (1+ int))))
  21.        (cond ((wcmatch (cdr (assoc 0 (setq get (entget ent)))) "*LINE")
  22.               (setq lws (cons get lws))
  23.              )
  24.              ((wcmatch (vla-get-effectivename
  25.                          (setq obj (vlax-ename->vla-object ent))
  26.                        )
  27.                        "Flow damper-JL,dn_cu"
  28.               )
  29.               (setq bks (cons (list obj get) bks))
  30.              )
  31.        )
  32.      )
  33.      (and bks lws)
  34.    )
  35.    (foreach lw lws
  36.      (foreach bk bks
  37.        (and
  38.          (setq ins (cdr (assoc 10 (cadr bk))))
  39.          (or (equal
  40.                (distance
  41.                  (vlax-curve-getclosestpointto (cdr (assoc -1 lw)) ins)
  42.                  ins
  43.                )
  44.                0.0
  45.                1e-4
  46.              )
  47.              (vlax-invoke
  48.                (car bk)
  49.                'intersectwith
  50.                (vlax-ename->vla-object (cdr (assoc -1 lw)))
  51.                AcExtendnone
  52.              )
  53.          )
  54.          (vl-some
  55.            '(lambda (att)
  56.               (and
  57.                 (wcmatch (vla-get-tagstring att) "DN,SIZE")
  58.                 (progn (vla-put-textstring att (substr (cdr (assoc 6 lw)) 5)) t)
  59.               )
  60.             )
  61.            (vlax-invoke (car bk) 'getattributes)
  62.          )
  63.          (setq bks (vl-remove bk bks))
  64.        )
  65.      )
  66.    )
  67. )
  68. (princ)
  69. ) (vl-load-com)
回复

使用道具 举报

8

主题

45

帖子

39

银币

初来乍到

Rank: 1

铜币
45
发表于 2022-7-5 16:10:37 | 显示全部楼层
非常感谢你。
它工作完美:
如果你能抽出时间的话,我有个新主意。
是否可以基于位于同一多段线上的主块属性修改次块属性?
我描述了原因:
当我创建由多段线绘制的通风管道系统方案时,我在每个具有不同气流的段上插入块“dn\u cu”。
然后我对段进行编号(“CU”标记),并添加以m3/h为单位的气流(“V”标记)。
之后,我将所有属性导出到excel,并对风管尺寸(“DN”标记)进行尺寸标注,然后将其导入回AutoCAD。
因此,“dn\u cu”块是我的主要块,包含有关管道方案的信息。
然后,我需要修改辅助块ar块(阻尼器、衰减器等)的“大小”属性最后根据“DN”属性更改多段线线段的线型。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-14 21:04 , Processed in 1.510044 second(s), 66 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表