是分别进行ssget"W" pts还是进行点线关系判断--取决于数据量的大小
本帖最后由 llsheng_73 于 2014-11-5 02:07 编辑一般情况,一掉到选多线段内的某类图元,总是习惯性地想到取多线段坐标作为选择范围,进行ssget"W"方式选择
这样处理最为常见.但对于较大量的多线段的时候,实际选择次数跟多线段的条数一样,我也没仔细测试过循环的进行ssget会不会比较慢(仅仅凭感觉这么觉得,当然好象也有人提到过图元较多的时候ssget会比较慢)
另外ssget"W"方式得到的选择结果有可能会受屏幕放大率的影响......这是最头痛的
于是想到先把多线段和要处理的图元全选出来,得到该类图元的坐标与图元名关联起来....
循环处理多线段,判断与图元关联的坐标是否在多线段内,如果在,对多线段或者图元进行处理,并且将这个关联去掉(这是关键,因为这样会随循环的运行,关联表越来越小,从而减少运行时间)
下边给出这样一个示例
(defun plinexy(e / a q m p p1);;;LWPolyline,POLYLINE顶点,去掉完全重合点
(setq a(vlax-ename->vla-object e)
q(vlax-safearray->list(vlax-variant-value(vla-get-Coordinates a)))
m(if(=(vla-get-objectname a)"AcDb3dPolyline")'(setq p1(list (car q)(cadr q)(caddr q))q(cdddr q))
'(setq p1(list (car q)(cadr q))q (cddr q))))
(while q(eval m)
(setq p(if(member p1 p)p(append p(list p1))))))
(defun SstoEs(ss / a lst)
(if ss(progn(setq a -1)(repeat(sslength ss)(setq lst(cons(ssname ss(setq a(1+ a)))lst))))))
(defun pinpt(p pt / a)
(setq pt(if(equal(car pt)(last pt))pt(cons(last pt)pt))ang 0)
(equal(abs(apply'+(mapcar'(lambda(x)(setq a(-(angle p(nth(vl-position x(cdr pt))pt))(angle p x)))
(cond((> a pi)(- a pi))((< a(- 0 pi))(+ a pi))(T a)))(cdr pt))))pi 1e-6))
(defun lst-(l1 l2)(if l2(foreach x l2(setq l1(vl-remove x l1)))l1))
(defun c:tt(/ s e i en)
(vl-load-com)
(setq s(mapcar'(lambda(x)(cons x(cdr(assoc 10(entget x)))))(sstoes(ssget"X"'((0 . "INSERT")(8 . "*code,*CODE")))))
s1(mapcar'(lambda(x)(cons x(plinexy x)))(sstoes(ssget"X"'((0 . "*polyline")(-4 . "<OR")(70 . 1)(70 . 129)(-4 . "OR>")))))
i 0)
(repeat(length s1)
(if(setq x(nth i s1)e(vl-remove-if-not'(lambda(y)(pinpt(cdr y)(cdr x)))s))
(progn
(setq en(entget(car x)))
(entmod(subst(cons 8(vl-string-subst"_POLYGON""_CODE"(cdr(assoc 8(entget(caar e))))))(assoc 8 en)en))
(setq s(lst- s e))))
(setq i(1+ i)))
)
用坛友神秘将军的图测试下,速度比较理想,由于所用测试图有可能涉及一些资料方面的问题,因此不作为测试图上传...
有兴趣的坛友可以根据自己的需求对TT稍作修改进行测试,并与常用方法进行下比较,然后看看对比结果吧
最先发的测试有点问题,忽略了数据量太大的时候不宜用foreach来循环......
坐个沙发。 早期版本cad构建大选择集的时候是非常慢的,尤其是手工选择并remove掉部分实体的情况,这在现在版本中已经捕那么明显,应该是选择集构建方法优化特同时,电脑速度也大幅度提升的结果。
个人不赞成使用ssget-w的方法,除了屏幕相关外,w本身的包围也有时并不可靠。 73兄最近甚是高产啊,多段线圈住,获取内部的指定类型图元,这个很有用,多研究研究 另外ssget"W"方式得到的选择结果有可能会受屏幕放大率的影响......这是最头痛的
->既然都知道用"W",代表已有視窗範圍,放大後再選就好了,可以不要想的太複雜
于是想到先把多线段和要处理的图元全选出来,得到该类图元的坐标与图元名关联起来....
->不覺得重工嗎?如果圖元是在程序中建立,直接分類就好,如果還要再選一次才分類,不是多此一舉嗎?
->如果不是屬於點,線類的圖元,如雲,弧,圓,圖塊等,要多少點對才能代表它? lsjj 发表于 2014-11-6 13:48 static/image/common/back.gif
另外ssget"W"方式得到的选择结果有可能会受屏幕放大率的影响......这是最头痛的
->既然都知道用"W",代表已 ...
另外ssget"W"方式得到的选择结果有可能会受屏幕放大率的影响......这是最头痛的
我处理这方面的问题是
选取出点表最大四点角
zoom一下再往下处理
一般问题都能解决 ysq101 发表于 2014-12-31 20:22 static/image/common/back.gif
另外ssget"W"方式得到的选择结果有可能会受屏幕放大率的影响......这是最头痛的
我处理这方面的问题 ...
这位大神, 我是新手,我不太理解你的意思。。。。
我的程序也必须要根据屏幕来,我这句要怎么修改才可以不用管屏幕了?
(setq ss(ssget "cp"
(list p1 p2 p3 p4)
(list '(-4 . "<AND")
'(-4 . "<OR")
(cons 50 (* pi 0))
(cons 50 (* pi 1))
'(-4 . "OR>")
'(0 . "TEXT")
'(-4 . "AND>")
)
)
)
勤快小熠 发表于 2015-1-9 14:44 static/image/common/back.gif
这位大神, 我是新手,我不太理解你的意思。。。。
我的程序也必须要根据屏幕来,我这句要怎么修改才可以 ...
前面加个command zoom w p1 p3(一定要对角点)
处理后再command zoom p 返回原来的屏幕大小 ysq101 发表于 2015-1-10 16:05 static/image/common/back.gif
前面加个command zoom w p1 p3(一定要对角点)
处理后再command zoom p 返回原来的屏幕大 ...
又简单又好用 谢谢啦~ 勤快小熠 发表于 2015-1-12 15:54 static/image/common/back.gif
又简单又好用 谢谢啦~
新手表示只能这样了。。
这个缺点是屏幕会闪一下。。
不是没办法我就不会用这招呀
页:
[1]