raptor22 发表于 2022-7-5 20:04:42

将选定块移动到sp

嘿,好了,
我正试图找到一种方法来简化一个过程,这应该在每一张图纸中完成,我需要清理大量的图纸,这是真正的混乱。问题是,你可以在几个层中找到一个块,例如,当块“门”只能在其层“门”中找到时,你可以在几个不相关的层中找到它,墙上有墙、楼梯和儿子,并且需要太多的时间才能将所有这些都转移到适当的层。
是否有任何lisp或方法使其更容易?我的意思是一个lisp,你可以选择几个相关的块(不同的门块),并将它们全部转移到一个特定的层(门层)。
 
谢谢

BIGAL 发表于 2022-7-5 20:14:27

这可以使用过滤器完成,只需选择一个块并删除属性,如图层和插入,然后它将找到所有具有此名称的块,然后只需打开属性并选择正确的图层。

raptor22 发表于 2022-7-5 20:19:02

 
谢谢你的回复,我已经使用了Filter,这是一个方便的命令。重点是通过使用Filter,你几乎可以选择你想要的所有块,但是当你在一个脏的绘图块上工作时,块可能会相互阻塞,你需要先分解它们,然后处理它们,有时由于意外的问题会导致另一个混乱。。。。我只是想知道是否有人有更好的方法来解决这个问题。。甚至还有另一种使用快速选择的过滤器。。。。

Tharwat 发表于 2022-7-5 20:19:55

将此作为一个示例。
 
笔记:
*用所需的层名称替换“我的层名称”字符串。
*您可以添加任意数量的代码来代替Block1、Block2。。。。等作为您的区块名称。
*块对象不能是动态的,否则它们将不会被选中,您需要另一个过滤器来处理此问题。
 

(defun c:mtl(/ ss e i)
;;; Tharwat 02.mar.2015 ;;;
(if (and (tblsearch "LAYER" "My-Layer-Name") ;;; Only one layer name here
          (setq ss
               (ssget "_:L" '((0 . "INSERT") (2 . "Block1,Block2,Block3")))) ;;; A list of block names separated with a comma
          )
   (repeat (setq i (sslength ss))
   (setq e (entget (ssname ss (setq i (1- i)))))
   (entmod (subst '(8 . "Layer3") (assoc 8 e) e))
   )
   )
(princ)
)

Frans 发表于 2022-7-5 20:26:20

如果您有一个嵌套块(“wall1”中的“door1”),只需重新定义原始块(“door1”),所有块(“door1”)都将更新,包括嵌套块

raptor22 发表于 2022-7-5 20:31:48

 
非常感谢。
 
 
 
谢谢,我尝试了你的代码,但在我编写命令-MTL时,它根本不起作用-什么都没有发生,命令行已经为新命令做好了准备。。。如果你能修改它,那就太好了。非常感谢。
 
顺便说一句,我不能感激你的好意。。。

BIGAL 发表于 2022-7-5 20:37:56

您是否更改了红色和蓝色的代码以匹配您的dwg?

Tharwat 发表于 2022-7-5 20:43:36

 
不客气
 
您只是更改了程序的命令名,没有更改我指示的突出显示的单词。
 
我怀疑你是否读过我早些时候在节目的同一帖子中写的笔记

raptor22 发表于 2022-7-5 20:49:05

 
 
嘿。。。
 
我很抱歉你是对的,我的错。。。我完全按照你说的做了,它成功了,再次谢谢。。。但是,不是将我的块插入到给定的层名称(06门),而是将它们全部插入到一个名为“Layer3”的层中,这个名称以前不存在。

Lee Mac 发表于 2022-7-5 20:51:07

尝试以下程序,更改突出显示的部分以适合:
 

(defun c:blklaymap ( / enx idx lay map sel )
   (setq
       map
      '(
         ("Door" . "Door Layer")
         ("Wall" . "Wall Layer")
       )
       map (mapcar '(lambda ( x ) (cons (strcase (car x)) (cdr x))) map)
   )
   (if
       (setq sel
         (ssget "_X"
               (append
                  '(
                     ( 0 . "INSERT")
                     (-4 . "<OR")
                     ( 2 . "`*U*")
                   )
                   (mapcar '(lambda ( x ) (cons 2 (car x))) map)
                  '(
                     (-4 . "OR>")
                   )
               )
         )
       )
       (repeat (setq idx (sslength sel))
         (setq enx (entget (ssname sel (setq idx (1- idx)))))
         (if (setq lay (cdr (assoc (strcase (LM:name->effectivename (cdr (assoc 2 enx)))) map)))
               (entmod (subst (cons 8 lay) (assoc 8 enx) enx))
         )
       )
   )
   (princ)
)

;; Block Name -> Effective Block Name-Lee Mac
;; blk - Block name

(defun LM:name->effectivename ( blk / rep )
   (if
       (and (wcmatch blk "`**")
         (setq rep
               (cdadr
                   (assoc -3
                     (entget
                           (cdr (assoc 330 (entget (tblobjname "block" blk))))
                        '("AcDbBlockRepBTag")
                     )
                   )
               )
         )
         (setq rep (handent (cdr (assoc 1005 rep))))
       )
       (cdr (assoc 2 (entget rep)))
       blk
   )
)

(princ)
页: [1] 2
查看完整版本: 将选定块移动到sp