ksperopoulos 发表于 2022-7-5 17:29:05

图层代码-发布时速度较慢

下面的代码是从我编写的一个更大的程序中提取出来的。这一部分在打开的文件中查找层。如果不存在,则创建层。如果它确实存在,则会确保它已解冻、打开并解锁。然后在这两种情况下,它将层设置为当前层。我遇到的问题是,当我在AutoCAD中发出命令时,在继续之前有很长的延迟。我不知道为什么。当我删除这部分代码时,它运行得非常快。我做过什么会导致这种情况吗?
 

   (setq oldlay(getvar "clayer")
         laycoll (vla-get-Layers doc)
         layname "G-ANNO-DIMS"
   )
   (if (vl-catch-all-error-p (setq layobj (vl-catch-all-apply 'vla-Item (list laycoll layname))))
       (progn
         (setq layobj (vla-Add laycoll layname))
         (vla-put-Color layobj acWhite)
         (vla-put-Description layobj "Dimensions")
         (vla-put-Freeze layobj :vlax-false)
         (vla-put-LayerOn layobj :vlax-true)
         (vla-put-Linetype layobj "Continuous")
         (vla-put-Lineweight layobj acLnWt025)
         (vla-put-Lock layobj :vlax-false)
         (vla-put-Plottable layobj :vlax-true)
         (vla-put-ViewportDefault layobj :vlax-false)
         (setvar "clayer" layname)
       )
       (progn
         (if (= (vla-get-Freeze layobj) :vlax-true) (vla-put-Freeze layobj :vlax-false))
         (if (= (vla-get-LayerOn layobj) :vlax-false) (vla-put-LayerOn layobj :vlax-true))
         (if (= (vla-get-Lock layobj) :vlax-true) (vla-put-Lock layobj :vlax-false))
         (vla-Regen doc acAllViewports)
         (setvar "clayer" layname)
       )
   )

Lee Mac 发表于 2022-7-5 17:43:33

尝试忽略以下内容:
(vla-Regen doc acAllViewports)

ksperopoulos 发表于 2022-7-5 17:53:51

谢谢李。现在回想起来,这很有道理。当图层被锁定或冻结并且需要重新生成时,我如何克服这种情况?我应该在每个单独的if函数中容纳它吗?

Lee Mac 发表于 2022-7-5 18:04:16

 
我将确保在程序评估期间,图形最多只重新生成一次,并且这种重新生成作为程序执行的最后一个操作发生。您可以使用一个布尔变量,该变量将在一个条件语句中定义,以确定实际上是否需要重新生成。

ksperopoulos 发表于 2022-7-5 18:16:46

我不认为这正是你所建议的李,但我认为这可能是沿着相同的路线。你同意这是一个解决方案吗?
 

   (setq oldlay(getvar "clayer")
         laycoll (vla-get-Layers doc)
         layname "G-ANNO-DIMS"
   )
   (if (vl-catch-all-error-p (setq layobj (vl-catch-all-apply 'vla-Item (list laycoll layname))))
       (progn
         (setq layobj (vla-Add laycoll layname))
         (vla-put-Color layobj acWhite)
         (vla-put-Description layobj "Dimensions")
         (vla-put-Freeze layobj :vlax-false)
         (vla-put-LayerOn layobj :vlax-true)
         (vla-put-Linetype layobj "Continuous")
         (vla-put-Lineweight layobj acLnWt025)
         (vla-put-Lock layobj :vlax-false)
         (vla-put-Plottable layobj :vlax-true)
         (vla-put-ViewportDefault layobj :vlax-false)
         (setvar "clayer" layname)
       )
       (progn
         (if (= (setq layfrz (vla-get-Freeze layobj)) :vlax-true) (vla-put-Freeze layobj :vlax-false))
         (if (= (vla-get-LayerOn layobj) :vlax-false) (vla-put-LayerOn layobj :vlax-true))
         (if (= (setq laylck (vla-get-Lock layobj)) :vlax-true) (vla-put-Lock layobj :vlax-false))
         (if (or (= layfrz :vlax-true) (= laylck :vlax-true)) (vla-Regen doc acAllViewports))
         (setvar "clayer" layname)
       )
   )

Lee Mac 发表于 2022-7-5 18:21:31

准确地说,前提是在整个程序中没有多个类似的代码块。

ksperopoulos 发表于 2022-7-5 18:34:25

不。这是我代码中唯一需要重新生成的时间。非常感谢你的帮助。
页: [1]
查看完整版本: 图层代码-发布时速度较慢