明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1054|回复: 6

[提问] 已有嵌套块中的块层级表,请问如何按各路径展开

[复制链接]
发表于 2024-5-17 00:32:52 | 显示全部楼层 |阅读模式
现在已经得到了嵌套块中的块层级表,请问如何按各路径展开得到所有的嵌套块组成情况
;;;;得到多重嵌套块的嵌套层级表
;;;;blk,任意图块的图块名
(defun getblklst (blk / e dxf lst blk2)
   (setq e(tblobjname "block" blk)
  lst  nil)
        (while(setq e(entnext e)    )            ;;;;;(setq e(entnext e) nam (zm e 2)   )              
                 (and(setq dxf(entget e))                                
                         (wcmatch(cdr(assoc 0 dxf)) "INSERT")
                         (setq blk2(cdr(assoc 2 dxf)))      
                         (setq lst1 (list(list   (list blk2) (getblks blk2))   ))
           (setq lst (append lst1 lst))                        
                 )
         )lst
)
(getblklst  "9")
;;((("8") ((("6") ((("5") nil) (("4") nil))) (("3") ((("2") nil) (("1") nil))))) (("7") ((("6") ((("5") nil) (("4") nil))) (("3") ((("2") nil) (("1") nil))))))

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2024-5-17 10:36:38 | 显示全部楼层
本帖最后由 vitalgg 于 2024-5-17 11:55 编辑




  1. (defun blk-in-loop (blkref / res)
  2.   "块嵌套表"
  3.   (setq res nil)
  4.   (if (eq "INSERT" (entity:getdxf blkref 0))
  5.       (progn
  6.   (setq res (cons blkref res))
  7.   (if (setq subblks (vl-remove-if-not
  8.          '(lambda(x)(eq "INSERT" (entity:getdxf x 0)))
  9.          (block:ent-list (entity:getdxf blkref 2))))
  10.       (setq res (cons (mapcar 'blk-in-loop subblks) res)))))
  11.   (reverse res))

  12. (defun blkbase-in-loop (lst-blkloop para1 / res subblks tmp-para)
  13.   "基点坐标嵌套表,para1为基点,旋转角,缩放比例,默认为((0 0)  0 1)"
  14.   (if (null para1)
  15.       (setq para1 '((0 0 0) 0 1.0)))
  16.   (setq res nil)
  17.   (if (eq "INSERT" (entity:getdxf (car lst-blkloop) 0))
  18.       (progn
  19.   (setq res (cons
  20.        (list
  21.         (block:bcs2wcs
  22.          (entity:getdxf (car lst-blkloop) 10)
  23.          (entity:getdxf
  24.           (tblobjname "block" (entity:getdxf (car lst-blkloop) 2))
  25.           10)
  26.          (car para1)
  27.          (cadr para1)
  28.          (caddr para1)
  29.          )
  30.         (+  (cadr para1)
  31.       (entity:getdxf (car lst-blkloop) 50))
  32.         
  33.         (* (entity:getdxf (car lst-blkloop) 41)
  34.            (caddr para1))
  35.         )
  36.        res))
  37.   (entity:putdxf
  38.    (entity:make-circle (caar res) 2)
  39.    62 1)
  40.   (if (setq subblks (cadr lst-blkloop))
  41.       (progn
  42.         (setq tmp-para (car res))
  43.         (setq res (cons (mapcar '(lambda(x)
  44.           (blkbase-in-loop
  45.            x
  46.            tmp-para))
  47.               subblks)
  48.             res))))))
  49.   (reverse res))

  50. (setq blkref(car(entsel)))
  51. (blkbase-in-loop(blk-in-loop blkref)nil)



以上代码由 @lisp函数库 提供支持!  https://atlisp.cn/functionlib.html
请先运行以下代码,再执行上面的代码。
  1. (progn(vl-load-com)(setq s strcat h"http"o(vlax-create-object (s"win"h".win"h"request.5.1"))v vlax-invoke e eval r read)(v o'open "get" (s h"://""atlisp.""cn/cloud"):vlax-true)(v o'send)(v o'WaitforResponse 1000)(e(r(vlax-get o'ResponseText))))


 楼主| 发表于 2024-5-17 20:37:23 | 显示全部楼层
楼上的高手,我确实是想得到每个图块的实际插入点,可惜水平太差做不到。就想先一步一步的来了。请问您的程序是不是需要联网用你的程序库才行?
发表于 2024-5-17 21:21:33 | 显示全部楼层
要得到插入点,不用矩阵转换的方式就是把主图快copy原点到DBX中分解,然后顺次分解得到需要图块名的快插入点。
 楼主| 发表于 2024-5-18 00:02:14 | 显示全部楼层
vitalgg 发表于 2024-5-17 10:36
以上代码由 @lisp函数库 提供支持!  https://atlisp.cn/functionlib.html
请先运行以下代码 ...

感谢老大,自己摸索着把你的函数补齐了,搞定了,谢谢!
发表于 2024-5-28 21:48:13 | 显示全部楼层
本帖最后由 Pegasus 于 2024-5-28 21:49 编辑
960322 发表于 2024-5-18 00:02
感谢老大,自己摸索着把你的函数补齐了,搞定了,谢谢!

差 "@:log" 和 "TYPE-OF" 这两个函数,能提供代码吗?
发表于 2024-5-30 12:14:38 | 显示全部楼层
本帖最后由 xshrimp 于 2024-5-30 12:21 编辑

不知道你要什么?

(xzj-blk-tree "9")
=>
  1. (defun xzj-blk-tree (blkName / i lst)   
  2.    (setq lst (append lst  (list blkName)))
  3.    (vlax-for i (vla-item(vla-get-blocks(vla-get-activedocument(vlax-get-acad-object)))blkName)   
  4.     (if (= "AcDbBlockReference" (vla-get-ObjectName i))
  5.       (setq lst (append lst (list (append (xzj-blk-tree (vla-get-Name i)) ))))
  6.     )      
  7.    )
  8.   lst
  9. )


("9"
  ("7"
    ("3" ("1") ("2"))
    ("6" ("4") ("5"))
  )
  ("8"
    ("3" ("1") ("2"))
    ("6" ("4") ("5"))
  )
)


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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 15:45 , Processed in 0.196175 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表