明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1949|回复: 5

[讨论]:关于layout切换时重生成的问题

[复制链接]
发表于 2002-10-12 17:22 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2002-10-12 17:22:11 编辑

问题的起因是这样:有一张很大的图(防洪工程大坝,好几公里长),出图时分段出图,
用分成了几十张layout图纸出图。这个图regen需要5分钟。在layout中切换时,会引起
漫长的regen,(说明:LayoutRegenCtl系统变量设成0了。如果让它自动cache的话,
你会死得很难看,除非你有几个G的内存,而且这种cache的有效性也不高)。于是我想
写个程序,一个命令把所有layout中的所有viewport物体关闭掉,即抢在regen之前关掉它。

程序代码如下:
(defun setvtest (hide / acada doc layouts layout objs obj)
  (setq acada (vlax-get-acad-object))
  (setq doc (vla-get-ActiveDocument acada))
  (setq layouts (vla-get-Layouts doc))
  (vlax-for layout layouts  ; 遍历layout
    (if (= :vlax-false (vla-get-modeltype layout))
      (progn
        (setq objs (vla-get-block layout))
        (vlax-for obj objs ; 遍历layout中的物体
          (if (= "AcDbViewport" (vla-get-objectname obj)) ;是viewport
;;; =========处理代码=============
            (vla-put-ViewportOn
              obj
              (if hide
                :vlax-false
                :vlax-true
              )
            )
;;; =========处理代码=============
          )
        )
      )
    )
  )
)

设想是这样:(setvtest T)关闭所有viewport,(setvtest nil)打开所有viewport
这个简单的程序试运行一下,不成功。提示出错。

查帮助,发现还有一个method,改成
(vla-display obj (if hide :vlax-false :vlax-true))
试验,不成功

再改:用autolisp传统方法:
;;;           (setq ent (entget (vlax-vla-object->ename obj)))
;;;           (setq ent (subst (cons 68 0) (assoc 68 ent) ent))
;;;           (entmod ent)
还是不成功

于是想别的办法,如果把viewport的visible设成false, 如何呢:
(vla-put-visible obj (if hide :vlax-false :vlax-true))
程序运行成功,但结果不是我要的:viewport的边框invisible了,
但里面照样有显示,切换时regen你没商量。

那么,就没有办法设置不在当前layout中的viewport的viewportOn属性了吗?
如果能做到这点,我认为是最好的解决办法。

现在我的做法是:把图纸空间中的物体放在特定的层上,对图纸空间操作时,
冻结所有与图纸空间无关的层。使用了layer state 保存与恢复功能
(感谢express和AutoCAD 2002,这个功能非常有用),切换时重生成时间
大大减少。但毕竟还是不太方便。

我还有一个设想,如果有个程序,把各个视口中的图层冻结,也不错。
autocad是能够单独控制各个视口的图层状态的。不过要为每个视口保护现场,
需要时可以恢复。实现有点麻烦。

大家能不能讨论讨论,有经验或主意的朋友,请不吝赐教。


[ps: 如果论坛支持贴html就好了。
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2002-10-13 10:35 | 显示全部楼层

up

 楼主| 发表于 2002-10-15 10:57 | 显示全部楼层

up

发表于 2008-1-4 20:28 | 显示全部楼层

我把这个老帖子顶出来吧
有时布局多了的确比较烦,点开一个布局都那么慢,有没有办法点开布局的时候不重新生成,等到我们需要的时候可以按比如“F5”键进行刷新……

发表于 2008-1-6 15:57 | 显示全部楼层
本帖最后由 作者 于 2008-1-6 17:06:31 编辑

你的程序有问题,你的想法也有问题.
首先,跨布局操作视口是有问题的.
其次,每个布局就是一个视口,你能PUT布局OFF吗?
我的做法是:只用一个LAYOUT.做多个视口,做一个关闭一个.视口做完后全部处于关闭状态.以上操作用程序完成.需要时再把视口打开.
  1. ;;;打开或关闭VIEWPORT.如果是打开的则关闭,如果是关闭的则打开.
  2. (defun c:vw ()
  3.   (princ "\n打开或关闭VIEWPORT.")
  4.   (setvar "cmdecho" 0)
  5.   (setvar "LAYOUTREGENCTL" 0)
  6.   (setq n 0 i 0 h 0)
  7.   (if (/= 0 (getvar "tilemode"))
  8.     (princ "\n只能在图纸空间使用.")
  9.   (if (setq ss (ssget '((0 . "VIEWPORT"))))
  10.     (repeat (sslength ss)
  11.       (setq vo (vlax-ename->vla-object (ssname ss n)))
  12.       (if (= :vlax-true (vla-get-viewporton vo))
  13. (progn
  14. (vla-put-viewporton vo :vlax-false)(setq i (1+ i)))
  15. (progn
  16. (vla-put-viewporton vo :vlax-true)(setq h (1+ h)))
  17.       )
  18.       (setq n (1+ n))
  19.     )
  20.   )
  21.     )
  22.   (princ (strcat "\n打开了" (rtos h 2 0) "个视口"))
  23.   (princ (strcat "\n关闭了" (rtos i 2 0) "个视口"))
  24.   (princ)
  25. )
发表于 2008-1-6 20:36 | 显示全部楼层

好东西,前些日子正烦这个呢...

批量打印布局,最后打到"虚拟内存不足"

晕死...总共就16个布局,受不了...(以前没用过布局.呵呵)

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

本版积分规则

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

GMT+8, 2024-5-10 21:44 , Processed in 0.165560 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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