- 积分
- 64862
- 明经币
- 个
- 注册时间
- 2005-11-29
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
本帖最后由 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来循环......
|
|