求助各位大神,帮忙想一个思路
本帖最后由 xufansw 于 2015-12-25 11:20 编辑问题:如图片所示,选中图片左边最外面的框,程序自动将框里面的对象进行分图层(效果如图片右边所示),小弟想了好久也没想出什么办法,求各位大神指点迷津。 这个已经解决了,可以用KLayout软件处理。 (defun c:tt (/ DXF-10 ENT GET LA LEN N NN SEL)
(vl-load-com)
(defun TABLE (S / D R)
(while (setq D (tblnext S (null D)))
(setq R (cons (cdr (assoc 2 D)) R))
)
)
(princ "\n功能 [选择封闭给里的所有对象]")
(setq La (TABLE "LAYER"))
(and
(setq sel (car (entsel "\n选择封闭多线段:")))
(setq ent (entget sel))
(setq dxf-10 (vl-remove-if '(lambda (x) (/= (car x) 10)) ent))
)
(if (and dxf-10 (setq get (ssget "_wP" (mapcar 'cdr dxf-10) '((0 . "LWPOLYLINE")))))
(progn
(setq n 0
len (sslength get)
)
(repeat len
(setq
nn (vlax-ename->vla-object (ssname get (setq len (1- len))))
)
(vla-put-Layer nn (nth n la))
(setq n (1+ n))
)
)
)
(princ)
) 琴剑江山_10184 发表于 2015-12-25 13:30 static/image/common/back.gif
大哥,可能是我没表达清楚,就像这个图片,一开始所有的框都在一个图层里,要实现的是,把最外面那个框放在【图层1】里,假如这时候隐藏掉【图层1】中所有的对象,再把最外面的框放到【图层2】里(就像图片里在【图层2】中就有3个框),假如再隐藏掉【图层3】中所有的对象,再把再把最外面的框放到【图层4】里,以此类推,直到所有对象都隐藏掉结束。
需要注意一点,不知道会产生多少个图层。
遍历所有框,再框范围内再找框,如果有的话,就把框内框改到下一级图层里。然后再继续(当然把上级图层的框关闭)。
一级级的把框内的框往下级图层里挤。 mikewolf2k 发表于 2015-12-25 14:51 static/image/common/back.gif
遍历所有框,再框范围内再找框,如果有的话,就把框内框改到下一级图层里。然后再继续(当然把上级图层的框 ...
大哥,一开始我就这么想着去写的,我发现有点问题。
我按照您的意思举个例子哈。
k1范围内找框,找到了6个框k2、k3、k4、k5、k7,将这6个框放到下一个【图层2】里,k1图层关闭。
下一步程序该怎么做呢?或者说怎么保证程序从【图层2】里的对象选到框k2或者k3再去进行上面的步骤呢?而且还要保证k2和k3是同一个同层,k4和k5是同一个图层。 1得到多个框的选择集
2遍历选择集内每个框,取出没有被其它框包围的框——图层1,选择集去掉这部分框
3遍历选择集内每个框,没有被其它框包围的框——图层2,选择集去掉这部分框
4、如此循环直到选择集为空,循环几次就有几层
以下是我的分析:
1. K1(A层)范围内找,找到K2-K7,K2-K7放入B层。
2. 关闭A层,有K2-K7,在K2-K7范围内找,把所有框内的框放入C层。结果是K2、K3在B层,K4-K7在C层。在找K6的时候,里面没东西,不操作;找到K2的时候,里面的K4、K6都会被找到,都会被改到下层。
3. 关闭B层,有K4-K7,重复上述操作,把K6、K7放入D层。
4. 关闭C层,有K6、K7。经过查找,没有框内物体了。程序结束。
wzg356 发表于 2015-12-25 15:43 static/image/common/back.gif
1得到多个框的选择集
2遍历选择集内每个框,取出没有被其它框包围的框——图层1,选择集去掉这部分框
3遍 ...
这个方法好~ 这程序有啥用?图层分这么多,而且是这么个分层原则,对于以后的使用来说也是个麻烦。 如果不用数学方法,可以用选择的话,给你一个选择次数最少的方法,效率会高很多
1.所有对象加xdata数据为1
2.用每个对象的节点ssget "_wP"选一次,被选中的对像xdata加1
3.遍历全部对象,xdata 为1的放图层1 ,2的放图层2... ...
页:
[1]
2