乐筑天下

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

[编程交流] 如果有多个,只留下一个块

[复制链接]

9

主题

24

帖子

15

银币

初来乍到

Rank: 1

铜币
45
发表于 2022-7-5 17:05:54 | 显示全部楼层 |阅读模式
大家好,
 
我正在寻找一个例程,它可以在图形中找到一个特定的块,如果有更多具有相同名称的块删除除一个以外的所有。
 
我在多个图形上运行lisp,根据该图形的“键”更改某些块的属性。因此,关键是块,它应该只在这些图纸中出现一次,否则代码中的所有计算都会出错。
这些键可以位于图形中的任何位置,这意味着它们不在彼此的顶部或具有相同的插入点。
 
任何想法都将受到高度赞赏。
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-5 17:13:51 | 显示全部楼层
完全未经测试,可能很危险:
 
  1. [b][color=BLACK]([/color][/b]defun c:foo [b][color=FUCHSIA]([/color][/b]/ bn b ss en i[b][color=FUCHSIA])[/color][/b]
  2. [b][color=FUCHSIA]([/color][/b]while [b][color=NAVY]([/color][/b]not bn[b][color=NAVY])[/color][/b]
  3.    [b][color=NAVY]([/color][/b]setq b [b][color=MAROON]([/color][/b]strcase [b][color=GREEN]([/color][/b]getstring [color=#2f4f4f]"\nBLOCK Name:   "[/color][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  4.    [b][color=NAVY]([/color][/b]cond [b][color=MAROON]([/color][/b][b][color=GREEN]([/color][/b]not [b][color=BLUE]([/color][/b]snvalid b[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
  5.          [b][color=MAROON]([/color][/b][b][color=GREEN]([/color][/b]not [b][color=BLUE]([/color][/b]tblsearch [color=#2f4f4f]"BLOCK"[/color] b[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
  6.          [b][color=MAROON]([/color][/b][b][color=GREEN]([/color][/b]setq ss [b][color=BLUE]([/color][/b]ssget [color=#2f4f4f]"X"[/color] [b][color=RED]([/color][/b]list [b][color=PURPLE]([/color][/b]cons 0 [color=#2f4f4f]"INSERT"[/color][b][color=PURPLE])[/color][/b][b][color=PURPLE]([/color][/b]cons 2 b[b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b][b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
  7.          [b][color=MAROON]([/color][/b][b][color=GREEN]([/color][/b]setq bn b[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
  8. [b][color=FUCHSIA]([/color][/b]setq i 0[b][color=FUCHSIA])[/color][/b]
  9. [b][color=FUCHSIA]([/color][/b]while [b][color=NAVY]([/color][/b]setq en [b][color=MAROON]([/color][/b]ssname ss i[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  10.         [b][color=NAVY]([/color][/b]if [b][color=MAROON]([/color][/b]/= i 0[b][color=MAROON])[/color][/b]
  11.              [b][color=MAROON]([/color][/b]entdel en[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  12.         [b][color=NAVY]([/color][/b]setq i [b][color=MAROON]([/color][/b]1+ i[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
  13. [b][color=FUCHSIA]([/color][/b]prin1[b][color=FUCHSIA])[/color][/b][b][color=BLACK])[/color][/b]

 
 
而且可能对动态块完全无用。
 
 
-大卫
回复

使用道具 举报

9

主题

24

帖子

15

银币

初来乍到

Rank: 1

铜币
45
发表于 2022-7-5 17:17:15 | 显示全部楼层
谢谢你的重播David,
 
我担心此代码将无法在我正在工作的模式下工作。我的代码中的所有处理都是在后台的多个图形上完成的,其中ssget选择是不可能的。
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 17:26:25 | 显示全部楼层
Davids代码将在多个DWG上工作,无需交互,只需采取不同的方法。
 
C: foo意味着在键盘上键入,因此2个选项(defun foo)将在键盘上或脚本中工作(foo)或(C:foo)
 
您可以硬编码块名或询问一次,然后将say保存到文本文件中。(setq b
 
使用脚本将更改多个DWG。我想这就是你现在要做的。如果没有,请解释你是怎么做的。
回复

使用道具 举报

9

主题

24

帖子

15

银币

初来乍到

Rank: 1

铜币
45
发表于 2022-7-5 17:30:33 | 显示全部楼层
比加尔,
谢谢你出现在地平线上。
 
更多的信息可能确实有用。
这是我正在寻找解决方案的代码的一部分。
 
  1. (setq *acad (vlax-get-acad-object)
  2. docx  (vla-get-activedocument *acad)   
  3. doc (vla-getinterfaceobject *acad (if (< (setq acVer (atoi (getvar "ACADVER"))) 16)
  4.        "ObjectDBX.AxDbDocument" (strcat "ObjectDBX.AxDbDocument." (itoa acVer))))
  5. dwgs files
  6.      dwgs (vl-sort dwgs '<)
  7. )
  8. (foreach dwg dwgs;for each dwg of the dwgs list
  9. (setq dprefix (vl-filename-directory dwg))
  10. (setq emsg (vl-catch-all-apply '(lambda ()
  11. (vla-open doc dwg :vlax-false)
  12.       (setq my_doc  (vla-get-activedocument (vlax-get-acad-object)))
  13.                           
  14. (if (= drawing "1")                                  
  15.      (progn
  16.      (vlax-for layout (vla-get-layouts doc)
  17.      (vlax-for ent (vla-get-block layout)
  18.    (if (and (vlax-property-available-p ent 'hasattributes)
  19.         (eq (vla-get-name ent) bname_dwg))
  20. (progn
  21.   (setq atts (vlax-invoke ent 'getattributes))
  22.                 (foreach att atts
  23.                         (if (= (vla-get-tagstring att) tag_dwg)
  24.                                 (progn
  25.                                         (setq edit t)
  26.                                         (vla-put-textstring att val_dwg)
  27.                                         (setq key_dwg (vla-get-textstring att))
  28.                                         (setq val_dwg (itoa (+ (atoi val_dwg) _inc) ))
  29.                                 )
  30.                         )
  31.                 )
  32. )
  33.    )
  34. )))
  35. );end if
  36. ; here i call another function to change the tag
  37. (if (= TAG_EMPLOYER "1")
  38. (replace_tags "DWG_" "EMPLOYER#" "B" "Sheet1" key_dwg 1))                            
  39. ))))
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 17:35:53 | 显示全部楼层
谢谢Roy_043,
 
实现您的想法,并在每次绘制完成后将结果设置为零。
它现在工作得很好,当我运行代码时,我只需要少检查一件事。
 
我喜欢这个论坛:D
回复

使用道具 举报

9

主题

24

帖子

15

银币

初来乍到

Rank: 1

铜币
45
发表于 2022-7-5 17:41:14 | 显示全部楼层
我会这样写(基本上就像罗伊那样):
  1. (vlax-for layout (vla-get-layouts doc)
  2. (setq found nil)
  3. (vlax-for ent (vla-get-block layout)
  4.    (if
  5.      (and
  6.        (eq (vla-get-name ent) bname_dwg)
  7.        (vlax-property-available-p ent 'hasattributes) ; Required?
  8.      )
  9.      (if found
  10.        (vla-delete ent) ; Already found one so delete.
  11.        (progn
  12.          (setq found T)
  13.          ... ; Do your stuff.
  14.        )
  15.      )
  16.    )
  17. )
  18. )

现在我考虑在Documents集合中包含一个使用(getfield)和调用(vla open)的提示符。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 17:48:00 | 显示全部楼层
@Grrr:我认为你的代码没有按预期工作。你测试过了吗?
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 17:49:55 | 显示全部楼层
@罗伊,这完全没有经过测试,在看了第二眼之后,我不应该包括这一行(我甚至不记得我添加了它-哈哈):
  1. (defun C:test ( / CADapp Docs BlkNms )
  2. (setq CADapp (vlax-get-acad-object))
  3. (setq Docs (vla-get-Documents CADapp))
  4. (vlax-for doc Docs
  5.         (vlax-for blk (vla-get-Blocks doc)
  6.                 (if
  7.                         (and
  8.                                 (eq (vla-get-IsLayout blk) :vlax-false)
  9.                                 (eq (vla-get-IsDynamicBlock blk) :vlax-false)
  10.                                 (eq (vla-get-IsXRef blk) :vlax-false)
  11.                         )
  12.                         (setq BlkNms (cons (vla-get-Name blk) BlkNms))
  13.                 )
  14.         ); iterate blkdefs
  15.         (vlax-for layout (vla-get-Layouts doc)
  16.                 (vlax-for obj (vla-get-Block layout)
  17.                         (if
  18.                                 (and
  19.                                         (= (vla-get-ObjectName obj) "AcDbBlockReference")
  20.                                         (not (vl-remove (vla-get-EffectiveName obj) BlkNms)) ; first block that remove its name from this list is NOT deleted
  21.                                 )
  22.                                 (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-delete (list obj)))
  23.                                         (progn
  24.                                                 (vla-put-Lock (vla-item (vla-get-Layers doc) (vla-get-Layer obj)) :vlax-false)
  25.                                                 (vl-catch-all-error-p (vl-catch-all-apply 'vla-delete (list obj)))
  26.                                         ); progn
  27.                                 ); if
  28.                         ); if
  29.                 ); iterate graphical objects
  30.         ); iterate tabs
  31. ); iterate docs               
  32. (princ)
  33. );| defun |; (vl-load-com) (princ)

也许我不得不把它改成:
  1. (eq (vla-get-IsDynamicBlock blk) :vlax-false)

此外,它不符合以下标准:
 
我不知道你是否指的是其他问题。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 17:56:21 | 显示全部楼层
@Grrr:我看到的主要问题是blkNms列表。
 
建议:
  1. (eq (vla-get-HasAttributes blk) :vlax-false)
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 09:53 , Processed in 0.808493 second(s), 72 queries .

© 2020-2025 乐筑天下

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