irneb 发表于 2022-7-6 10:16:12

顺便说一句,这是同一代码的更高效(更不用说更“功能性”)版本:
请注意,新的layerstate list函数甚至没有任何局部变量,只有一个temp不断重复使用,以获取0层dxf数据及其字典,然后图层状态字典的dxf数据。它返回并计算一次通过vl删除的层列表,如果不是。。。部分我还为其添加了一个通配符匹配,然后添加了额外的layerstate delete wcmatch,您只需从任何位置调用它:
通配符照常工作,例如“my*”将匹配名为MyState、My1、mY3、my、my等的状态。

irneb 发表于 2022-7-6 10:18:57

如果不是的话,可能会将2 vl移除合并为一个,但我不确定这是否会更有效。无论如何,如果图层状态名称的效率是一个大问题,那么你还有很多其他问题!

irneb 发表于 2022-7-6 10:22:06

不,我认为这是不可能的:从这个函数的帮助中,第三个参数允许位图值4使用VP覆盖,但前提是第二个参数不是nil并且包含视口的名称。因此,如果将nil发送给它,它“应该”在不使用VP覆盖的情况下恢复整个图形的状态。。。至少我是这样理解的。只有将VP的ename传递给它,才能仅通过在第3个参数中添加4来启用该恢复的VP覆盖。

Lee Mac 发表于 2022-7-6 10:25:30

 
但是我怀疑它会把效率提高太多。。。
 
或者有VL方法:
 
14
15这将不可避免地较慢。

irneb 发表于 2022-7-6 10:26:02

谢谢,李-使用ActiveX获取layerstate字典可能比DXF路径更快。虽然这是一件一次性的事情,但它不太可能节省超过几微秒的总时间。即使(正如你也注意到的)结合2 vl remove也没什么用-我能看到的只是(mapcar的cdr…)在某些情况下,可能需要查看较短的列表。当然,正如我所提到的:如果你有如此多的状态,以至于开始等待(超过一秒钟)该函数进行计算,那么你的绘图就出了严重的问题。该函数应该能够在一秒钟内获得100多个状态。
 
顺便说一句,我注意到你通常只使用引用的lambda。(函数(lambda…方法高于正常值)有什么真正的好处吗?(lambda…?还是主要是较少键入?:wink:

alanjt 发表于 2022-7-6 10:31:33

您可以使用foreach来完成它,而不是使用mapcar和vl remove if来完成两次。您可以将许多and检查组合在一起(尤其是因为您正在检查entget是否有效,当它将工作或使程序崩溃时),因为这些检查在图形中始终存在,所以很多都是不必要的。。。。。但正如人们所说,它不会给你那么多的增加。

Lee Mac 发表于 2022-7-6 10:33:17

 
我不时地从一个切换到另一个。在过去,我看到通过使用“function”性能略有提高,因为这可能会消除口译员的一些腿部工作,但我相信差异确实很小。
 
16

Lee Mac 发表于 2022-7-6 10:35:59

根据Alan的建议:
 
在具有10个图层状态的图形上进行快速测试:
 
layerstate-list1=Irneb的第一篇文章
layerstate-list2=我的mods到Irneb的代码
layerstate-list3=我的VL方法
layerstate-list4=Irneb的代码和Alan的建议
 
正如预测的那样,VL方法要慢得多。。。
 
使用优化的FAS在同一图纸上:
 
19

alanjt 发表于 2022-7-6 10:39:14

有趣的是,双vl删除if单步通过和所有错误的and检查比foreach和cons更快。我想知道是什么阻碍了它的发展?
 
李,谢谢你开支票。

Lee Mac 发表于 2022-7-6 10:42:02

 
这正是我所想的——尽管“foreach”的性能在编译测试中大放异彩(如上所述)。
 
 
别担心,伙计
页: 1 [2]
查看完整版本: 删除图层状态multi-drawi