明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2102|回复: 8

[求助]指定嵌套块中图元的句柄,如何找到该块?

[复制链接]
发表于 2006-11-21 16:55 | 显示全部楼层 |阅读模式

指定嵌套块中图元的句柄,如何找到该块.

比如图元a属于块111,而块222引用了111,333引用了222.现在知道图元a的句柄,如何返回111\222\333?

发表于 2006-11-22 15:21 | 显示全部楼层
这程序有甚么用途吗?
 楼主| 发表于 2006-11-22 16:48 | 显示全部楼层

别人要我做的程序中的一部分.

我感觉自己的算法太繁琐了,上来看看有没有简捷的办法

发表于 2006-11-22 17:08 | 显示全部楼层
先把你的算法贴上来看看好吗?
 楼主| 发表于 2006-11-23 17:17 | 显示全部楼层

(defun c:zz ()
    (setq txt (strcase (getstring "\n输入图元句柄:") nil))
    (setq tt txt)
    (setq sn 0)
    (setq n 5)
    (while (zerop sn)
 (setq sn 1)
 (setq blk (cdr (assoc 2 (tblnext "block" t))))
 (setq en (cdr (assoc -2 (tblsearch "BLOCK" blk))))
 (setq en_data (entget en))
 (setq si 0 sii -1)
 (while (or (zerop (setq sii (1+ sii))) (and (zerop si) (setq en (entnext en))))
     (if (equal (cdr (assoc n en_data)) txt)
  (setq si  1
        sn  0
        n   2
        txt blk
        tt  (strcat tt "," txt)
  )
  (setq en_data (entget en))
     )
 )
 (while (and (= sn 1) (setq blk (tblnext "block")))
     (setq blk (cdr (assoc 2 blk)))
     (setq en (cdr (assoc -2 (tblsearch "BLOCK" blk))))
     (setq en_data (entget en))
     (setq si 0 sii -1)
     (while (or (zerop (setq sii (1+ sii))) (and (zerop si) (setq en (entnext en))))
  (if (equal (cdr (assoc n en_data)) txt)
      (setq si  1
     sn  0
     n   2
     txt blk
     tt  (strcat tt "," txt)
      )
      (setq en_data (entget en))
  )
     )
 )
    )
    tt
)

 

大体就是这个意思了,这段代码还不完善.

算法是这样了,至于程序问题有空再慢慢调吧.

如果没有简洁的算法,也只能把这个完善完善拿来用了

发表于 2006-11-23 18:32 | 显示全部楼层

这个得用递归做了

 

 楼主| 发表于 2006-11-24 16:10 | 显示全部楼层


(defun c:zz (/ txt tt1 tt2 sn si sii n m blk )
    (setq txt (strcase (getstring "\n输入图元句柄:") nil))
    (setq tt1 ",")
    (setq tt2 (strcat txt ","))
    (setq sn 0)
    (setq n 5)
    (while (zerop sn)
 (setq sn 1) 
 (setq blk (cdr (assoc 2 (tblnext "block" t))))
 (search_block)
 (while (setq blk (tblnext "block"))
     (setq blk (cdr (assoc 2 blk)))
     (search_block)
 )
 (if (setq m (vl-string-position 44 tt1 1))
     (progn
  (setq txt (substr tt1 2  (1- m)))
  (setq tt2 (strcat tt2  txt ","))
  (setq tt1 (substr tt1 (1+ m)))
  (setq sn 0)
     )
 )
    )
    tt2
)

(defun search_block()
    (setq en (cdr (assoc -2 (tblsearch "BLOCK" blk))))
    (setq en_data (entget en))
    (setq si 0 sii -1)
    (while (or (and (zerop si) (setq en (entnext en))) (zerop (setq sii (1+ sii))))
 (if (equal (cdr (assoc n en_data)) txt)
     (progn
  (setq n 2)
  (if (not (or (vl-string-search (strcat "," blk ",") tt1)
        (vl-string-search (strcat "," blk ",") tt2)
    )
      )
      (setq tt1 (strcat tt1 blk ","))
  )
     )  
 )
 (if (zerop sii) (setq si 1) (setq en_data (entget en)))
    )
)

这是完善后的代码。

就功能来说,是能实现了。但是,我对这段代码十分不满意,因为它执行过程中做出的无效计算太多了。希望有对AutoCAD了解得比较深的高手指点一下。

运行refedit命令,会出现以下视图,其中块的层次关系是存在哪里的,可以直接取到么??

发表于 2006-11-24 21:24 | 显示全部楼层

请看一下是不是楼主想要的功能....

(Defun C:Test (/ old_Hand LOOP_SEARCH lstHand en vn blocks blk)
  ;;     .
  (Defun IterBlk (blk / lstTmp new_Hand)
    (if LOOP_SEARCH
      (progn
 (setq lstHand (cons blk lstHand))
 (setq lstTmp '())
 ;;    .
 (vlax-for vn (vla-item blocks blk)
   (setq new_Hand (vla-get-Handle vn))
   (if (equal new_Hand old_Hand)
     (progn
       (setq LOOP_SEARCH nil)
     )
     (progn
       (if (equal (vla-get-ObjectName vn) "AcDbBlockReference")
  (setq lstTmp (cons (vla-get-name vn) lstTmp))
       )
     )
   )
 )
 ;;    .
 (foreach tmp lstTmp
   (if LOOP_SEARCH
     (IterBlk tmp)
   )
 )
      )
    )
  )
  ;; 主程序开始   .
  (vl-load-com)
  (setq old_Hand (strcase (getstring "\n输入图元句柄:")))
  (setq blocks (vla-get-blocks (vla-get-ActiveDocument (vlax-get-acad-object))))
  (vlax-for blk blocks
    ;;(setq old_Hand "1A60") ; 输入的句柄 .
    (setq LOOP_SEARCH T) ; 是否找到的标志 .
    (setq lstHand '()) ; 块嵌套的列表 .
    (setq blk (vla-get-name blk))
    (IterBlk blk)
    (if (null LOOP_SEARCH)
      (progn
 (princ (strcat "\n名柄" old_Hand "属于块"))
 (foreach str (reverse (cdr (reverse lstHand)))
   (princ (strcat str "属于块"))
 )
 (princ (last lstHand))
      )
    )
  )
  (prin1)
)

 楼主| 发表于 2006-11-28 16:07 | 显示全部楼层

8楼的程序令我受益匪浅,尤其是稍微须改一下就可以取得所有嵌套块的层次关系。

再次谢过了。

我在一楼的问题若是用这段程序来完成的话,也可以实现。但是,其效率甚至还不如我发在7楼的算法高。难道就没有可以更高效的算法存在么?

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

本版积分规则

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

GMT+8, 2024-5-5 19:46 , Processed in 0.725504 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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