明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2095|回复: 28

[提问] 如何把选择集分批处理呢?

[复制链接]
发表于 2024-4-14 16:40:09 | 显示全部楼层 |阅读模式
合并多段线这个插件,我经常用,但是我发现这个插件,在处理数据多的时候,

卡的怀疑人生!!!经常性崩溃。

8万条直线,合并多段线花费了将近30秒
命令如下:

(defun c:hb(/ etime ss stime)
        (setq ss(ssget '((0 . "*line,arc"))))
        (setvar "CMDECHO" 0)
        (setvar "PEDITACCEPT" 1)
        (setq stime(getvar "MILLISECS"))
        (vl-cmdf "_.pedit" "m" ss "" "j" 0.05 "")
        (setq etime(getvar "MILLISECS"))
        (sssetfirst nil(ssget "p" '((0 . "*line,arc"))));---此处为了防止漏了对象,所以加了这一行
        (setvar "CMDECHO" 1)
        (princ(strcat "\n处理完毕!耗时:"(rtos(- etime stime))" ms"))
        (princ)
)
但是在处理1万根直线的时候,连1秒都不到。

所以,我寻思是不是可以把选择集拆分成多个,然后分批次处理?
这样8万条线,起码应该可以从28秒缩短到6秒以内。
思路有了,但是没想好怎么去实现,求助坛友,看看有什么好方法。


本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2024-4-18 11:01:27 | 显示全部楼层
本帖最后由 aws 于 2024-6-24 15:08 编辑

最终的处理方式:

  • (defun c:jj(/ etime ss stime)
  •   (setq ss(ssget '((0 . "*line,arc"))))
  •   (if(>(sslength ss)20000)
  •     (progn(alert(strcat "注意:\n选取了"(rtos(sslength ss))"个对象\n已超过设置范围,自动退出!"))(quit))
  •   )
  •   (setvar "CMDECHO" 0)
  •   (setvar "PEDITACCEPT" 1)
  •   (setq stime(getvar "MILLISECS"))
  •   (vl-cmdf "_.pedit" "m" ss "" "j" "" "")
  •   (setq etime(getvar "MILLISECS"))
  •   (sssetfirst nil(ssget "p" '((0 . "*line,arc"))))
  •   (setvar "CMDECHO" 1)
  •   (princ(strcat "\n处理完毕!耗时:"(rtos(- etime stime))" ms"))
  •   (princ)
  • )



pedit这个命令如果输入模糊距离,对运行速度影响很大,
然后就是人工设置阈值上限,数量特别多的时候,就多合并几次吧
虽然我拿8万条线做测试,但也仅仅是测试,现实场景恐怕也控制在2万条以内。
没了模糊距离,2万条合并,耗时:3281 ms,基本上也不可能会崩溃卡死了。


回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2024-4-18 10:47:04 | 显示全部楼层
cchessbd 发表于 2024-4-17 21:13
建议采用lee-mac的合并多段线吧,测了2700的图,速度很快只要1秒不到。

原来如此,找到原因了,他那个把模糊距离给省略了,所以才那么快的。
(command "_.pedit" "_m" sel "" "_j" "" "")
(command "_.pedit" "_m" sel "" "_j" "0.05" "")
这两个差距非常巨大
 楼主| 发表于 2024-4-14 16:42:47 | 显示全部楼层
测试如图:



本帖子中包含更多资源

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

x
发表于 2024-4-14 18:40:39 | 显示全部楼层
可以呀,用两个点和矩刑框,然后这个切分为若干个小方块,在每个小方块中用SSGET中的W窗口方式,把线连接,这样每个就快了,最后再用这两个点再选一次。
发表于 2024-4-14 20:41:17 | 显示全部楼层
本帖最后由 你有种再说一遍 于 2024-4-14 20:43 编辑

这个命令肯定存在问题呀,是给你小批量的实现的.
内部用的是forfor,时间复杂度O(n*n)
如果你想大批量,
要自己去构造四叉树,时间复杂度是O(m*log4(n))
构造邻接表也可以,直接O(n)
 楼主| 发表于 2024-4-14 20:44:44 | 显示全部楼层
你有种再说一遍 发表于 2024-4-14 20:41
这个命令肯定存在问题呀,是给你小批量的实现的.
内部用的是forfor,时间复杂度O(n*n)
如果你想大批量,

你说得对,我也感觉到这个命令的不合理性,但是你说的我也不懂。。。所以也想不到其他办法
发表于 2024-4-14 20:56:01 | 显示全部楼层
aws 发表于 2024-4-14 20:44
你说得对,我也感觉到这个命令的不合理性,但是你说的我也不懂。。。所以也想不到其他办法

编程不了解时间复杂度是不行的哦.
两个for,就是两两对比,每个图元都和全部图元比较一次才找到需要的.
那为什么不制造一个有序结构先,然后每次都折半查找呢?
这就各种数据结构的概念.
 楼主| 发表于 2024-4-14 21:07:38 | 显示全部楼层
你有种再说一遍 发表于 2024-4-14 20:56
编程不了解时间复杂度是不行的哦.
两个for,就是两两对比,每个图元都和全部图元比较一次才找到需要的.
...

你所说的这个方法,lisp可以实现吗
发表于 2024-4-14 22:13:01 | 显示全部楼层
aws 发表于 2024-4-14 21:07
你所说的这个方法,lisp可以实现吗

辛苦一点就可以实现,就是太辛苦了....
 楼主| 发表于 2024-4-14 22:32:47 | 显示全部楼层
你有种再说一遍 发表于 2024-4-14 22:13
辛苦一点就可以实现,就是太辛苦了....

哈哈,那相比较来说,目前最优解,还是划分选择集呀
发表于 2024-4-15 09:13:49 | 显示全部楼层
画什么图需要用到天天合并8W的线条?就为了偶尔省一下30s,意义不大。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 14:59 , Processed in 0.206534 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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