明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2158|回复: 9

[讨论] 是分别进行ssget"W" pts还是进行点线关系判断--取决于数据量的大小

[复制链接]
发表于 2014-11-4 23:42:24 | 显示全部楼层 |阅读模式
本帖最后由 llsheng_73 于 2014-11-5 02:07 编辑

一般情况,一掉到选多线段内的某类图元,总是习惯性地想到取多线段坐标作为选择范围,进行ssget"W"方式选择
这样处理最为常见.但对于较大量的多线段的时候,实际选择次数跟多线段的条数一样,我也没仔细测试过循环的进行ssget会不会比较慢(仅仅凭感觉这么觉得,当然好象也有人提到过图元较多的时候ssget会比较慢)
另外ssget"W"方式得到的选择结果有可能会受屏幕放大率的影响......这是最头痛的
于是想到先把多线段和要处理的图元全选出来,得到该类图元的坐标与图元名关联起来....
循环处理多线段,判断与图元关联的坐标是否在多线段内,如果在,对多线段或者图元进行处理,并且将这个关联去掉(这是关键,因为这样会随循环的运行,关联表越来越小,从而减少运行时间)
下边给出这样一个示例
  1. (defun plinexy(e / a q m p p1);;;LWPolyline,POLYLINE顶点,去掉完全重合点
  2.     (setq a(vlax-ename->vla-object e)
  3.    q(vlax-safearray->list(vlax-variant-value(vla-get-Coordinates a)))
  4.    m(if(=(vla-get-objectname a)"AcDb3dPolyline")'(setq p1(list (car q)(cadr q)(caddr q))q(cdddr q))
  5.       '(setq p1(list (car q)(cadr q))q (cddr q))))
  6.     (while q(eval m)
  7.       (setq p(if(member p1 p)p(append p(list p1))))))
  8. (defun SstoEs(ss / a lst)
  9.   (if ss(progn(setq a -1)(repeat(sslength ss)(setq lst(cons(ssname ss(setq a(1+ a)))lst))))))
  10. (defun pinpt(p pt / a)
  11.    (setq pt(if(equal(car pt)(last pt))pt(cons(last pt)pt))ang 0)
  12.    (equal(abs(apply'+(mapcar'(lambda(x)(setq a(-(angle p(nth(vl-position x(cdr pt))pt))(angle p x)))
  13.       (cond((> a pi)(- a pi))((< a(- 0 pi))(+ a pi))(T a)))(cdr pt))))pi 1e-6))
  14. (defun lst-(l1 l2)(if l2(foreach x l2(setq l1(vl-remove x l1)))l1))
  15. (defun c:tt(/ s e i en)
  16.   (vl-load-com)
  17.   (setq s(mapcar'(lambda(x)(cons x(cdr(assoc 10(entget x)))))(sstoes(ssget"X"'((0 . "INSERT")(8 . "*code,*CODE")))))
  18. s1(mapcar'(lambda(x)(cons x(plinexy x)))(sstoes(ssget"X"'((0 . "*polyline")(-4 . "<OR")(70 . 1)(70 . 129)(-4 . "OR>")))))
  19. i 0)
  20.   (repeat(length s1)
  21.     (if(setq x(nth i s1)e(vl-remove-if-not'(lambda(y)(pinpt(cdr y)(cdr x)))s))
  22.       (progn
  23. (setq en(entget(car x)))
  24. (entmod(subst(cons 8(vl-string-subst"_POLYGON""_CODE"(cdr(assoc 8(entget(caar e))))))(assoc 8 en)en))
  25.       (setq s(lst- s e))))
  26.     (setq i(1+ i)))
  27.   )


用坛友神秘将军的图测试下,速度比较理想,由于所用测试图有可能涉及一些资料方面的问题,因此不作为测试图上传...
有兴趣的坛友可以根据自己的需求对TT稍作修改进行测试,并与常用方法进行下比较,然后看看对比结果吧

最先发的测试有点问题,忽略了数据量太大的时候不宜用foreach来循环......

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2014-11-5 16:07:11 | 显示全部楼层
坐个沙发[em0]。
发表于 2014-11-5 16:46:21 | 显示全部楼层
早期版本cad构建大选择集的时候是非常慢的,尤其是手工选择并remove掉部分实体的情况,这在现在版本中已经捕那么明显,应该是选择集构建方法优化特同时,电脑速度也大幅度提升的结果。
个人不赞成使用ssget-w的方法,除了屏幕相关外,w本身的包围也有时并不可靠。
发表于 2014-11-6 10:11:06 | 显示全部楼层
73兄最近甚是高产啊,多段线圈住,获取内部的指定类型图元,这个很有用,多研究研究
发表于 2014-11-6 13:48:13 | 显示全部楼层
另外ssget"W"方式得到的选择结果有可能会受屏幕放大率的影响......这是最头痛的
->既然都知道用"W",代表已有視窗範圍,放大後再選就好了,可以不要想的太複雜

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

->如果不是屬於點,線類的圖元,如雲,弧,圓,圖塊等,要多少點對才能代表它?
发表于 2014-12-31 20:22:34 | 显示全部楼层
lsjj 发表于 2014-11-6 13:48
另外ssget"W"方式得到的选择结果有可能会受屏幕放大率的影响......这是最头痛的
->既然都知道用"W",代表已 ...


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

我处理这方面的问题是
选取出点表最大四点角
zoom一下再往下处理
一般问题都能解决
发表于 2015-1-9 14:44:38 | 显示全部楼层
ysq101 发表于 2014-12-31 20:22
另外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-10 16:05:59 | 显示全部楼层
勤快小熠 发表于 2015-1-9 14:44
这位大神, 我是新手,我不太理解你的意思。。。。
我的程序也必须要根据屏幕来,我这句要怎么修改才可以 ...

前面加个  command zoom w p1 p3(一定要对角点)
             处理后再command zoom p 返回原来的屏幕大小
发表于 2015-1-12 15:54:10 | 显示全部楼层
ysq101 发表于 2015-1-10 16:05
前面加个  command zoom w p1 p3(一定要对角点)
             处理后再command zoom p 返回原来的屏幕大 ...

又简单又好用 谢谢啦~
发表于 2015-1-12 17:53:52 | 显示全部楼层
勤快小熠 发表于 2015-1-12 15:54
又简单又好用 谢谢啦~

新手表示只能这样了。。
这个缺点是屏幕会闪一下。。
不是没办法我就不会用这招呀
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-23 09:56 , Processed in 0.558971 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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