magicheno 发表于 2020-5-24 00:09:33

请教下大侠,可以保留嵌套块里的最内部的那个块吗,那些图元炸掉了,就都变成一根一根细线了,比如卫生间的台盆,淋浴,和整个户型都是一个块,炸掉之后,台盆也都变成一根一根线了

masterlong 发表于 2020-5-26 18:16:56

可以做到
不过最近没时间
半个月以后
如果你还需要这样的程序
可以私信我

magicheno 发表于 2020-5-27 19:36:24

masterlong 发表于 2020-5-26 18:16
可以做到
不过最近没时间
半个月以后


需要的哈,希望大侠出手相助

原地踏步 发表于 2020-6-2 08:59:56

很好的程序,学习一下。

magicheno 发表于 2020-6-7 13:15:29

masterlong 发表于 2020-5-26 18:16
可以做到
不过最近没时间
半个月以后


大侠,等级受限貌似私信消息发不出来,大侠上次说的嵌套块的保留最底层块的事情,可以出手相助吗

masterlong 发表于 2020-6-7 16:39:30

这两天要赶图
10日吧

masterlong 发表于 2020-6-10 17:48:03

本帖最后由 masterlong 于 2020-6-10 17:51 编辑

xxn基础上改了一下
代码比较乱
应该能用
命令 : xxm
注意最后的说明文字

你先试试看
反馈下结果
没啥问题我再更新到首贴



(defun c:xxm()   ;;(load "xxn```嵌套块内部分解.lsp")   ;;(myloadlsp "xxn```嵌套块内部分解.lsp")
(princ "\n开始全图执行多层嵌套块改单层,可能需要一点时间")(princ)
   (alert "n开始全图执行多层嵌套块改单层,可能需要一点时间")
   ;;(getkword)
(setvar "cmdecho" 0)
(command "undo" "g")
(xxm_main)
(command "undo" "e")
(princ "done")
(princ)
)
(defun xxm_main()
(vla-PurgeAll *doc*)

;;指定忽略块名列表(允许使用通配符)————允许通配符的情况下,本身带特殊字符的块名在核查的时候,应该会出现误判吧???
;;————是否应该分两个表:完全名称表和通配名称表?
      ;;完全名称表,需要进行特殊字符核查==============此表需使用者设定
      (setq ignblk__list__1 '())
      (setq ignblk__list__1 (mapcar '(lambda(x) (checkstr (strcase x))) ignblk__list__1))
      ;;通配名称表====================================此表需使用者设定
      ;;(setq ignblk__list__2 '())
      (setq ignblk__list__2 '("QGY_*" "图名块*" "图名KL块*"))   ;;个人设定
      (setq ignblk__list__2 (mapcar 'strcase ignblk__list__2))

;;得到嵌套块相关8列表
(xxn_get_bob_list_and_str ignblk__list__1 ignblk__list__2)

;;顶层嵌套块改单层(必须是顶层,因为嵌套块也可能被嵌套,此时若先处理的是非顶层嵌套块的话,可能会引起其它问题)
(if bob_list_top
(progn
   ;;建立一个标记点
   (command "point" "non" '(0 0))
   (setq lastpoent (entlast))
   (foreach x bob_list_top
    (setq xblknm x);;块名
    ;;插入图块
    (command "insert" xblknm "non" '(0 0) 1 1 0)
    (command "_.explode" (entlast))
    ;;插入图块设为选择集
    (setq ssss (ssget "p"))
   
   
    ;;循环方式将多层嵌套块分解至单层,得到分解后的选择集————————由于开始没有考虑这个功能,所以这里的代码比较“混乱”
    (setq loop T   evenexplodeNIL)
    (while loop
   ;;(oldss2act ss)
   (setq blkss (ssget "p" '((0 . "insert"))))
         
         ;;xxn原程序段需做调整,以适应xxm的功能需求。
         (setq jixu 0)
         (foreach yy (ss2list blkss)   (setq y yy)(~~ (strcase (cdr (assoc 2 (entget y)))))
         (setq currbn (strcase (cdr (assoc 2 (entget y)))))
         ;;保留非嵌套块和忽略列表不炸开,在这里添加判断
         (if(or
               (member currbn bob_list_low)
               (member currbn ignblk__list__1)
               (vl-some '(lambda(bnm) (wcmatch currbn bnm)) ignblk__list__2)
            )
             ()
             ;;如果是嵌套块,执行下面的代码,同时将jixu+1 ,同时设 evenexplode = T
             (progn
               (setq jixu (1+ jixu))   ;;
               (setq evenexplodeT)   ;;如果曾经执行过炸开
               
               (if (= 1 (cdr (assoc 66 (entget y))))
                (progn
               (burst-one y)
               (command "_.explode" y)
                     ;;同名块删除属性,如果屏蔽这一小节,同名属性块会保留属性————但是程序结束后,因块定义改变会导致图块多出一些文字
                     (setq haveattblkss (ssget "x" (list '(0 . "insert") (cons 2 xblknm))))
                     (foreach z (ss2list haveattblkss)
                      (while (setq
                        z (entnext z)
                        zlist (entget z)
                        ztype (cdr (assoc 0 zlist))
                        loop (= "ATTRIB" ztype)
                         )
                     (vla-erase (*ent2obj* z))
                      )
                     )
                )
                (command "_.explode" y)
               )
             )
         )
         )
   
   (if (> jixu 0) (setq loop T) (setq loop NIL))
   (setq ss (entbackss lastpoent))
    )
    (oldss2act ss)
    (if (setq tempattss (ssget "p" '((0 . "ATTDEF"))))
   (progn
      (command "erase" tempattss "")
   )
    )
    (setq ss (entbackss lastpoent))
   
    ;;做同名块(不插入)
    (if evenexplode
   (command "block" xblknm "y" "0,0" ss "")
   (command "erase" ssss "")
    )
   )
   ;;删除标记点
   (entdel lastpoent)
   
      ;;循环执行
      ;;;;;;(xxm_main)   xxm不能用循环执行,否则无限循环了。某些代码需要相应修改下......
      
)
)
(princ)
)


代码复制到首贴的lsp文件里再加载
本来打算上传附件
但是
现在必须要安装flashplayer最新版才能上传附件吗?
在我看来最新版自带的什么助手就是个流氓软件



masterlong 发表于 2020-6-10 18:23:47


magicheno 发表于 2020-6-10 22:04:29

masterlong 发表于 2020-6-10 17:48
xxn基础上改了一下
代码比较乱
应该能用


大侠,可以框选单个或多个多层嵌套的块,默认好像是全图的,好像很费时间,而且就一直直接卡住在那里了,不动了

magicheno 发表于 2020-6-10 23:09:23

masterlong 发表于 2020-6-10 17:48
xxn基础上改了一下
代码比较乱
应该能用


低版本试了下,XXN可以用不过话很长时间,XXM貌似用了没效果的
页: 1 2 [3] 4 5 6
查看完整版本: 嵌套块内部分解