nod684 发表于 2022-7-6 07:33:57

LISP重命名块以匹配

谁能帮我制定一个lisp,将重命名块名以匹配其层名?
我需要的是在多个层上选择多个块,每个块名称应该采用其层名称。我这里有一千多块,用来装订15层的图纸
 
例子:
层名称:E-Ligh-BR
区块名称:X-??-$0$-E-Ligh-BR

irneb 发表于 2022-7-6 08:16:53

我认为这实际上行不通。每个块名称都必须是唯一的。如果重命名其中一个,则也会重命名其所有引用。如果在同一层上有两种不同的块类型,会发生什么情况?或者,这种情况永远不会发生,也就是说,你也有1000层?
 
你提到Bined。这些块最初来自外部参照,也应该有一个来自外部参照的层,名称如下:XrefName$LayerName。如果不希望这样做,则应只重新绑定DWG,并使用“插入”选项而不是“绑定”选项。
 
顺便说一句,那$0$... 名称中的部分实际上告诉我您有嵌套的外部参照,内部有重复的块。或者在某些时候,有人使用了RefEdit,但它没有正确关闭(这在RefEdit中很常见)。如果是这种情况,那么你要做的就是合并“重复”块定义,并更改对合并版本的所有引用,然后清除旧的重复项。这可能有点复杂,这取决于您希望测试关于块定义相等性的“准确性”。如果测试只是检查两个块的名称中是否有相同的结束部分(即在最后一个$之后),那么可能就不那么复杂了。
 
如果后者:而不是为你写,我会给你一些提示:
 
[列表]
[*]使用tblnext逐步遍历图形中的每个块定义。
[*]使用assoc和块定义名称的相关DXF代码获取当前块的名称。在这种情况下2。
[*]对于每个名称,检查名称中是否有$。为此使用wcmatch。
[*]如果是这样的名称,请去掉前面的部分。各种各样的方法。但这里有一个非常简单的例子:
[/列表]
;; Say the name is stored in a variable name
(while (wcmatch name "*$*") (setq name (substr name 2)))
[列表]
[*]现在将该名称与原始名称一起存储在一个列表中,供以后使用,使用cons。但您应该使用assoc检查该名称是否已经在该列表中。例如:
[/列表]
(if (setq found (assoc name SavedList))
(setq SavedList (subst (cons name (cons OriginalName (cdr found))) found SavedList))
(setq SavedList (cons (list name OriginalName) SavedList)))
[列表]
[*]遍历所有块后,您会得到一个列表,其中包含不同名称的重复块的子列表。
[*]由此,您应该能够将每个子列表中的第一个重命名为“正确”的名称。您可能需要检查是否已经定义了这样的名称-使用tblsearch。
[*]对于其余的原始名称,您需要搜索它们的引用(如果没有嵌套块,请使用ssget),否则,请使用entnext再次遍历块定义并在其定义内。使用entget获取dxf数据列表。
[列表]
[*]对于每个插入对象,对照其中一个原始对象检查其名称。
[*]如果找到,使用entmod将其名称更改为新的已清理名称。
[/列表]
 
[*]最后清除图形。
[/列表]
可能会将所有这些合并到一个循环中,并/或使其更高效。但无论你做什么,原则都是一样的。

nod684 发表于 2022-7-6 08:45:53

 
 
我想你是对的。我最终会做一个块,删除所有其他块
并将该块重新插入到各自的位置。。。
页: [1]
查看完整版本: LISP重命名块以匹配