llsheng_73 发表于 2014-11-4 23:42:24

是分别进行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来循环......

434939575 发表于 2014-11-5 16:07:11

坐个沙发。

ll_j 发表于 2014-11-5 16:46:21

早期版本cad构建大选择集的时候是非常慢的,尤其是手工选择并remove掉部分实体的情况,这在现在版本中已经捕那么明显,应该是选择集构建方法优化特同时,电脑速度也大幅度提升的结果。
个人不赞成使用ssget-w的方法,除了屏幕相关外,w本身的包围也有时并不可靠。

伪书虫86 发表于 2014-11-6 10:11:06

73兄最近甚是高产啊,多段线圈住,获取内部的指定类型图元,这个很有用,多研究研究

lsjj 发表于 2014-11-6 13:48:13

另外ssget"W"方式得到的选择结果有可能会受屏幕放大率的影响......这是最头痛的
->既然都知道用"W",代表已有視窗範圍,放大後再選就好了,可以不要想的太複雜

于是想到先把多线段和要处理的图元全选出来,得到该类图元的坐标与图元名关联起来....
->不覺得重工嗎?如果圖元是在程序中建立,直接分類就好,如果還要再選一次才分類,不是多此一舉嗎?

->如果不是屬於點,線類的圖元,如雲,弧,圓,圖塊等,要多少點對才能代表它?

ysq101 发表于 2014-12-31 20:22:34

lsjj 发表于 2014-11-6 13:48 static/image/common/back.gif
另外ssget"W"方式得到的选择结果有可能会受屏幕放大率的影响......这是最头痛的
->既然都知道用"W",代表已 ...


另外ssget"W"方式得到的选择结果有可能会受屏幕放大率的影响......这是最头痛的

我处理这方面的问题是
选取出点表最大四点角
zoom一下再往下处理
一般问题都能解决

勤快小熠 发表于 2015-1-9 14:44:38

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>")
                     )
                )
)

ysq101 发表于 2015-1-10 16:05:59

勤快小熠 发表于 2015-1-9 14:44 static/image/common/back.gif
这位大神, 我是新手,我不太理解你的意思。。。。
我的程序也必须要根据屏幕来,我这句要怎么修改才可以 ...

前面加个command zoom w p1 p3(一定要对角点)
             处理后再command zoom p 返回原来的屏幕大小

勤快小熠 发表于 2015-1-12 15:54:10

ysq101 发表于 2015-1-10 16:05 static/image/common/back.gif
前面加个command zoom w p1 p3(一定要对角点)
             处理后再command zoom p 返回原来的屏幕大 ...

又简单又好用 谢谢啦~

ysq101 发表于 2015-1-12 17:53:52

勤快小熠 发表于 2015-1-12 15:54 static/image/common/back.gif
又简单又好用 谢谢啦~

新手表示只能这样了。。
这个缺点是屏幕会闪一下。。
不是没办法我就不会用这招呀
页: [1]
查看完整版本: 是分别进行ssget"W" pts还是进行点线关系判断--取决于数据量的大小