如何把选择集分批处理呢?
合并多段线这个插件,我经常用,但是我发现这个插件,在处理数据多的时候,卡的怀疑人生!!!经常性崩溃。
data:image/png;base64,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
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秒都不到。
data:image/png;base64,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
所以,我寻思是不是可以把选择集拆分成多个,然后分批次处理?
这样8万条线,起码应该可以从28秒缩短到6秒以内。
思路有了,但是没想好怎么去实现,求助坛友,看看有什么好方法。
本帖最后由 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,基本上也不可能会崩溃卡死了。
cchessbd 发表于 2024-4-17 21:13
建议采用lee-mac的合并多段线吧,测了2700的图,速度很快只要1秒不到。
原来如此,找到原因了,他那个把模糊距离给省略了,所以才那么快的。
(command "_.pedit" "_m" sel "" "_j" "" "")
(command "_.pedit" "_m" sel "" "_j" "0.05" "")
这两个差距非常巨大 测试如图:
可以呀,用两个点和矩刑框,然后这个切分为若干个小方块,在每个小方块中用SSGET中的W窗口方式,把线连接,这样每个就快了,最后再用这两个点再选一次。 本帖最后由 你有种再说一遍 于 2024-4-14 20:43 编辑
这个命令肯定存在问题呀,是给你小批量的实现的.
内部用的是forfor,时间复杂度O(n*n)
如果你想大批量,
要自己去构造四叉树,时间复杂度是O(m*log4(n))
构造邻接表也可以,直接O(n) 你有种再说一遍 发表于 2024-4-14 20:41
这个命令肯定存在问题呀,是给你小批量的实现的.
内部用的是forfor,时间复杂度O(n*n)
如果你想大批量,
你说得对,我也感觉到这个命令的不合理性,但是你说的我也不懂。。。所以也想不到其他办法 aws 发表于 2024-4-14 20:44
你说得对,我也感觉到这个命令的不合理性,但是你说的我也不懂。。。所以也想不到其他办法
编程不了解时间复杂度是不行的哦.
两个for,就是两两对比,每个图元都和全部图元比较一次才找到需要的.
那为什么不制造一个有序结构先,然后每次都折半查找呢?
这就各种数据结构的概念. 你有种再说一遍 发表于 2024-4-14 20:56
编程不了解时间复杂度是不行的哦.
两个for,就是两两对比,每个图元都和全部图元比较一次才找到需要的.
...
你所说的这个方法,lisp可以实现吗 aws 发表于 2024-4-14 21:07
你所说的这个方法,lisp可以实现吗
辛苦一点就可以实现,就是太辛苦了.... 你有种再说一遍 发表于 2024-4-14 22:13
辛苦一点就可以实现,就是太辛苦了....
:lol哈哈,那相比较来说,目前最优解,还是划分选择集呀 画什么图需要用到天天合并8W的线条?就为了偶尔省一下30s,意义不大。