找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 484|回复: 8

[求助] 如何对显示区以外的实体进行选择?最佳路由计算方法?

[复制链接]
发表于 2016-7-4 20:33:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
当用(SSGET "W" "C"...有时超出当前显示范围的实体就会丢失(选择不到), 用ssget "X"将图中所有实体进行遍历,计算方法又不可取,数据量太大,在用户不干预的情况下,如何对显示区以外的实体进行操作?我现在要搞一个最佳路径的选取的程序(line.PLINE找连续的路由),有没有什么好办法?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-7-4 20:41:24 | 显示全部楼层
你有个误区,遍历数据库一点也不慢。你自己写其他算法反而可能慢。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-4 20:55:10 | 显示全部楼层
原本就一个区域进行选择,也不过10多条线,全图可要成百上千啊...再问一下显示区以外的实选择丢失如何避免?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-4 20:57:22 | 显示全部楼层
我常遇到此时,当口选择第一点后,再移屏选择第二点,第一点不在当前显示范围了,有部分不在当前显示区域的实体就没选择到,如何办?

点评

另外,不管哪个方案,选择40多万实体,才不到1秒的时间,很在意吗?  详情 回复 发表于 2016-7-4 21:15
判断选择实体的包围盒4个点是否都在屏幕内,有一个不在,ZOOM BOX。论坛早有解决方案,开源函数库论坛搜索函数: xd::doc:safezoom  详情 回复 发表于 2016-7-4 21:12
给你上组数据,眼见为实 画43万个直线,进行测试,上面是X全选数据库建立选集,下面是窗口两点显示。看到结果了吗? 和想象的出入很大吧? 时间差了快1倍啊。 测试代码:  详情 回复 发表于 2016-7-4 21:10
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-7-4 21:10:05 | 显示全部楼层
挚友01 发表于 2016-7-4 20:57
我常遇到此时,当口选择第一点后,再移屏选择第二点,第一点不在当前显示范围了,有部分不在当前显示区域的 ...

给你上组数据,眼见为实


  1. 命令: tt
  2. 选择对象:
  3. 循环10c次X全选构建43万实体选择集时间:
  4.    第1次:0.474
  5.    第2次:0.476
  6.    第3次:0.466
  7.    第4次:0.463
  8.    第5次:0.465
  9.    第6次:0.47
  10.    第7次:0.466
  11.    第8次:0.458
  12.    第9次:0.468
  13.    第10次:0.463
  14. 10次平均时间:0.4669

  15. 窗口两点显示屏幕内43万实体选择集时间:
  16.    第1次:0.801
  17.    第2次:0.805
  18.    第3次:0.787
  19.    第4次:0.787
  20.    第5次:0.807
  21.    第6次:0.837
  22.    第7次:0.802
  23.    第8次:0.807
  24.    第9次:0.813
  25.    第10次:0.802
  26. 10次平均时间:0.8048
复制代码


画43万个直线,进行测试,上面是X全选数据库建立选集,下面是窗口两点显示。看到结果了吗? 和想象的出入很大吧? 时间差了快1倍啊。

测试代码:
  1. (defun c:tt ()
  2.   (xdrx_prompt "\n循环10c次X全选构建43万实体选择集时间:")
  3.   (setq i 0
  4.         t2 0
  5.   )
  6.   (repeat 10
  7.     (xdrx_runtime t)
  8.     (setq ss (ssget "x"))
  9.     (setq t1 (xdrx_runtime)
  10.           i (1+ i)
  11.           t2 (+ t2 t1)
  12.     )
  13.     (xdrx_prompt "\n   第" i "次:" t1)
  14.   )
  15.   (xdrx_prompt "\n10次平均时间:" (/ t2 10.0))
  16.   (xdrx_prompt "\n\n窗口两点显示屏幕内43万实体选择集时间:")
  17.   (setq i 0
  18.         t2 0
  19.   )
  20.   (repeat 10
  21.     (xdrx_runtime t)
  22.     (setq ss (ssget "w" p1 p2))
  23.     (setq t1 (xdrx_runtime)
  24.           i (1+ i)
  25.           t2 (+ t2 t1)
  26.     )
  27.     (xdrx_prompt "\n   第" i "次:" t1)
  28.   )
  29.   (xdrx_prompt "\n10次平均时间:" (/ t2 10.0))
  30.   (princ)
  31. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-7-4 21:12:15 | 显示全部楼层
挚友01 发表于 2016-7-4 20:57
我常遇到此时,当口选择第一点后,再移屏选择第二点,第一点不在当前显示范围了,有部分不在当前显示区域的 ...

判断选择实体的包围盒4个点是否都在屏幕内,有一个不在,ZOOM BOX。论坛早有解决方案,开源函数库论坛搜索函数: xd::doc:safezoom
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-7-4 21:15:08 | 显示全部楼层
挚友01 发表于 2016-7-4 20:57
我常遇到此时,当口选择第一点后,再移屏选择第二点,第一点不在当前显示范围了,有部分不在当前显示区域的 ...

另外,不管哪个方案,选择40多万实体,才不到1秒的时间,很在意吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-4 21:42:41 | 显示全部楼层
本帖最后由 挚友01 于 2016-7-4 21:43 编辑

(if (or (< Cx1 (- (car (getvar "VIEWCTR"))(/ (* (car (getvar "SCREENSIZE"))(getvar "viewsize"))(* (cadr (getvar "SCREENSIZE")) 2.0))))                                                                                                                                                                                                                                          
        (> Cx2 (+ (car (getvar "VIEWCTR"))(/ (* (car (getvar "SCREENSIZE"))(getvar "viewsize"))(* (cadr (getvar "SCREENSIZE")) 2.0))))
        (< Cy1 (- (cadr (getvar "VIEWCTR"))(/ (getvar "viewsize") 2.0)))                                                                                                                                                                                                                                         
        (> Cy2 (+ (cadr (getvar "VIEWCTR"))(/ (getvar "viewsize") 2.0)))
    )        
        (command "ZOOM" "W" (list Cx1 Cy1) (list Cx2 Cy2))
)
我原来是这种办法解决的,总感觉的不彻底,遍历所有符合要求的实体到没什么,但我想知道有没有更好的办法,因为下一步,要判断每条线是不有交线,然后再找最佳路径,怕数据处理太慢,不管怎么说,多谢了...

点评

1、你得有一个函数 获得屏幕的四个角点坐标 (论坛搜,有) 2、还得有个函数,你选择实体时候的那些点,判断他们是否在屏幕的四个点围成的多边形里面,如果有一个不在,说明有部分实体在屏幕外面,这时候,  详情 回复 发表于 2016-7-4 21:58
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-7-4 21:58:14 | 显示全部楼层
挚友01 发表于 2016-7-4 21:42
(if (or (< Cx1 (- (car (getvar "VIEWCTR"))(/ (* (car (getvar "SCREENSIZE"))(getvar "viewsize"))(* (c ...

1、你得有一个函数
      获得屏幕的四个角点坐标 (论坛搜,有)
2、还得有个函数,你选择实体时候的那些点,判断他们是否在屏幕的四个点围成的多边形里面,如果有一个不在,说明有部分实体在屏幕外面,这时候,你ZOOM下窗口(根据你那些点),把他们都显示到屏幕里面。

3、然后做你想做的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-5-14 07:54 , Processed in 0.303710 second(s), 45 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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