乐筑天下

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

[编程交流] SSGET-带Promp的块分解

[复制链接]

35

主题

145

帖子

114

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
180
发表于 2022-7-5 15:24:46 | 显示全部楼层 |阅读模式
我的目标是让程序分解具有Description属性的属性块,该属性具有字符串“VV??”,“VB??”,“VY??”,“VD??”,“VG??”,“VT??”,“VN??”,“VP??”,“V3??”,“V4??”。问号是任何非空白字符。
 
下面左边的图片显示了“before”块,after显示了分解后的前一个块以及设置到另一层的部分实体。我不得不手动更改图形,因为我认为不可能提出自动解决方案。但我想提示用户能够选择要更改到某一层的行(在本例中为“FTG Hndwhl”),然后继续下一个符合标准的块。
 

                               
登录/注册后可看大图

 
以下是迄今为止的代码(改编自之前的ronjonp代码):
 
 
提供的测试图纸不是原生AutoCAD文档,因此它会对您咆哮,并让您意识到这一点。有2个块符合测试图纸中的标准。
 
请告诉我你认为它需要什么。
 
格雷格
162452ti78iriyjx17mn11.jpg
Test1.DWG
回复

使用道具 举报

17

主题

1274

帖子

25

银币

后起之秀

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

铜币
260
发表于 2022-7-5 15:32:19 | 显示全部楼层
不确定它是否有用,但我经常使用“突发”来放置0层定义的对象,这些对象以前显示了块插入到其插入层上的层的属性。BURST只分解一个级别,而EXPLODE将块内的多段线减少为直线和圆弧。分解甚至分解块内的维度,而爆裂则不会。
回复

使用道具 举报

58

主题

3353

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1761
发表于 2022-7-5 15:38:41 | 显示全部楼层
我觉得写这个有点脏,但给你。
  1. (defun c:test (/ _getattvalue s)
  2. ;; RJP - Simple get attribute value sub .. no error checking
  3. (defun _getattvalue (block tag)
  4.    (vl-some
  5.      '(lambda (att)
  6. (cond ((eq (strcase tag) (strcase (vla-get-tagstring att))) (vla-get-textstring att)))
  7.       )
  8.      (vlax-invoke block 'getattributes)
  9.    )
  10. )
  11. ;; RJP - added (66 . 1) to filter ( attributed blocks )
  12. (cond        ((setq s (ssget "_C" '(7.244 2.071) '(16.665 10.003) '((0 . "INSERT") (66 . 1))))
  13. (foreach en (vl-remove-if 'listp (mapcar 'cadr (ssnamex s)))
  14.    (if (and ;; If we have a value, and it does not match the filter then remove item from selection
  15.             (setq v (_getattvalue (vlax-ename->vla-object en) "Description"))
  16.             ;; vl-string-search example ( more legible IMO )
  17.             (vl-some '(lambda (x) (wcmatch (strcase v) (strcat "*" x "*")))
  18.                      '("VV" "VB" "VY" "VD" "VG" "VT" "VN" "VP" "V3" "V4")
  19.             )
  20.        )
  21.      (progn (foreach i (vlax-invoke (vlax-ename->vla-object en) 'explode)
  22.               (if (= "AcDbAttributeDefinition" (vla-get-objectname i))
  23.                 (vl-catch-all-apply 'vla-delete (list i))
  24.                 (entmod (append (entget (vlax-vla-object->ename i)) '((8 . "NewLayer"))))
  25.               )
  26.             )
  27.             (entdel en)
  28.      )
  29.    )
  30. )
  31. ;; Highlight selection
  32. ;; (sssetfirst nil s)
  33. )
  34. )
  35. (princ)
  36. )
  37. (vl-load-com)
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 15:40:23 | 显示全部楼层
 
好肮脏的心灵永远是一种快乐
 
回复

使用道具 举报

58

主题

3353

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1761
发表于 2022-7-5 15:49:33 | 显示全部楼层
英雄联盟
回复

使用道具 举报

35

主题

145

帖子

114

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
180
发表于 2022-7-5 15:52:16 | 显示全部楼层
 
罗恩·琼普,谢谢你(不管脏不脏)!
 
这很好,但它将整个块更改为新层,而不是保留在其本机层。只有来自块的一些多段线需要转到新图层,并让用户手动拾取它们。
 
但我想了很多,我有了另一个想法。分解块后,是否可以由“刚分解的块”组成集合,从而用户可以在多段线之间循环,并提示用户将高亮显示的多段线更改为新图层?这可能是一个比手动拾取更好的解决方案。但我不知道这是否可行。
 
格雷格
回复

使用道具 举报

35

主题

145

帖子

114

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
180
发表于 2022-7-5 15:58:58 | 显示全部楼层
有什么想法吗?
 
格雷格
回复

使用道具 举报

58

主题

3353

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1761
发表于 2022-7-5 16:02:12 | 显示全部楼层
试试这个。。在我看来,我还是太过手动了,但是。你在不同层上用这些分解的信息做什么?
 
  1. (defun c:test (/ _getattvalue o s ll ur)
  2. ;; RJP - Simple get attribute value sub .. no error checking
  3. (defun _getattvalue (block tag)
  4.    (vl-some
  5.      '(lambda (att)
  6. (cond ((eq (strcase tag) (strcase (vla-get-tagstring att))) (vla-get-textstring att)))
  7.       )
  8.      (vlax-invoke block 'getattributes)
  9.    )
  10. )
  11. ;; RJP - added (66 . 1) to filter ( attributed blocks )
  12. (cond
  13.    ((setq s (ssget "_C" '(7.244 2.071) '(16.665 10.003) '((0 . "INSERT") (66 . 1))))
  14.     (foreach en (vl-remove-if 'listp (mapcar 'cadr (ssnamex s)))
  15.       (if (and        ;; If we have a value, and it does not match the filter then remove item from selection
  16.         (setq v (_getattvalue (setq o (vlax-ename->vla-object en)) "Description"))
  17.         ;; vl-string-search example ( more legible IMO )
  18.         (vl-some '(lambda (x) (wcmatch (strcase v) (strcat "*" x "*")))
  19.                  '("VV" "VB" "VY" "VD" "VG" "VT" "VN" "VP" "V3" "V4")
  20.         )
  21.    )
  22. (progn
  23.    (vlax-invoke (vlax-get-acad-object) 'zoomcenter (vlax-get o 'insertionpoint) 1)
  24.    (foreach i (vlax-invoke o 'explode)
  25.      (if (= "AcDbAttributeDefinition" (vla-get-objectname i))
  26.        (vl-catch-all-apply 'vla-delete (list i))
  27.        (progn
  28.          (vla-put-color i 1)
  29.          (vla-update i)
  30.          (if
  31.            (getpoint "\nPick a point to change red object layer or enter for no change: ")
  32.             (entmod (append (entget (vlax-vla-object->ename i)) '((8 . "NewLayer"))))
  33.          )
  34.        )
  35.      )
  36.    )
  37.    (entdel en)
  38. )
  39.       )
  40.     )
  41.     ;; Highlight selection
  42.     ;; (sssetfirst nil s)
  43.    )
  44. )
  45. (princ)
  46. )
回复

使用道具 举报

35

主题

145

帖子

114

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
180
发表于 2022-7-5 16:07:52 | 显示全部楼层
 
我感谢你的帮助!
 
背景故事:客户想要不同层次的符号,这就是它的来源。符号由块生成。创建dwg时,客户端所需级别的粒度超过了生成数据的程序的能力。因此,我必须制定一个程序,将具有完全相同图形内容的图形转换为符合客户CAD标准的图形。
 
我希望这有点道理。
 
格雷格
回复

使用道具 举报

58

主题

3353

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1761
发表于 2022-7-5 16:14:17 | 显示全部楼层
下面是一个快速示例,通过块内已知长度的对象更改层。。
 
  1. 3
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-7 09:42 , Processed in 0.950848 second(s), 76 queries .

© 2020-2025 乐筑天下

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