jaredmccullough 发表于 2022-7-6 22:51:34

很抱歉,当我说“应用”时,我的意思是“打开”或“关闭”一个层。这只是一个有益的方面的例子。
 
我有一个层说“部门视口”,它有5个视口。。。。我“打开”该层,所有5个视口帧都会出现。但是,我必须逐个转到每个视口帧并打开MVIEW>才能显示视口对象。希望这能澄清一点。这个文件本身对于这个网站来说太大了,所以我举了一个例子,我可以用这个例子来描述我的意图

BlackBox 发表于 2022-7-6 22:55:06

 
别担心;也许是我对术语产生了兴趣。感谢您的澄清。
 
 
再一次,也许我只是在这条阻力最小的道路上被挂断了。。。为什么首先要关闭MVIEW-->呢?
 
我只会问,当一个图层关闭时,该图层上的任何内容都不可见或可绘制。。。这就是为什么大多数人只需将其为视口指定的图层设置为“无打印”,以便它们可以始终保持可见,但视口帧本身不会打印。
 
代码可以做你想做的事情,我只是想先理解一下逻辑,如果有一个更简单的解决方案。
 
HTH公司

jaredmccullough 发表于 2022-7-6 22:59:16

我给你一点想象的东西,想象一下:
 
布局1中间的单个方形视口,其框架设置为图层
“Viewport 1”,当前该层处于活动状态,并且Viewport MVIEW>处于打开状态。现在,我已经创建了5个其他视口(围绕它的小圆形视口)。这些视口的框架设置在“部门视口”层上。该层仅用于少数目的,仅在需要时“打开”,但现在“关闭”。如果我没有MVIEW>关闭这些较小的视口,当我关闭图层时,只有帧会消失,而不是对象,所以要让它们打开,我必须分别MVIEW>关闭每个,然后关闭“部门视口”图层。
 
这一理论在许多其他布局和视口中都有使用,这就是为什么我真的希望提出一些东西。

BlackBox 发表于 2022-7-6 23:02:40

可以安全地假设您正在通过内置命令/菜单/按钮等修改这些视口层吗。?

jaredmccullough 发表于 2022-7-6 23:03:17

除了为图层指定视口帧并使用MVIEW关闭或打开带有它们的对象之外,我目前还没有对图层做任何操作。

jaredmccullough 发表于 2022-7-6 23:09:26

黑匣子你还在吗。。。对不起,我出差时间过长。。。。。或者其他人能帮我吗?

BlackBox 发表于 2022-7-6 23:11:04

还在这里。。。回到这里,用你的例子。。。。
 
启用“Viewport 1”时,所有未启用“Viewport 1”MVIEW-->的视口关闭。。。然后,当从“Viewport 1”切换到“Department Viewports”(或任何其他层)时,“Viewport 1”上的所有视口都变为MVIEW-->关闭,“Department Viewports”上的视口变为MVIEW-->打开?
 
如果我正确理解你;柠檬挤压。
 

(vl-load-com)
;;;--------------------------------------------------------------------;
(defun ViewportReactor:Start ()
(or *ViewportReactor*
   (setq *ViewportReactor*
            (vlr-sysvar-reactor
            "My viewport reactor "
            '(
                (:vlr-sysvarchanged . ViewportCallback:SysVarChanged)
               )
            )
   )
)
(princ)
)
;;;--------------------------------------------------------------------;
(defun ViewportCallback:SysVarChanged (rea var / clayer)
(if (and (= "CLAYER" (strcase (car var))) (cadr var))
   (vlax-for x (vla-get-paperspace
               (vla-get-activedocument
                   (vlax-get-acad-object)
               )
               )
   (if (= "AcDbViewport" (vla-get-objectname x))
       (progn
         (setq clayer (strcase (getvar 'clayer)))
         (vl-catch-all-apply
         'vla-put-viewporton
         (list
             x
             (if (= clayer (strcase (vla-get-layer x)))
               :vlax-true
               :vlax-false
             )
         )
         )
         (vla-update x)
       )
   )
   )
)
(princ)
)
;;;--------------------------------------------------------------------;
(ViewportReactor:Start)
(princ)

 
[编辑]**此时不考虑锁定层。

BlackBox 发表于 2022-7-6 23:15:25

... 和。NET(包括锁定层检查);快速编写,未经测试:
 

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Runtime;

using acApp = Autodesk.AutoCAD.ApplicationServices.Application;

using System.Collections.Generic;



namespace CADTutor.Sample.ViewportsToggle
{
   class Events : IExtensionApplication
   {
       void IExtensionApplication.Initialize()
       {
         acApp.DocumentManager.DocumentCreated += onDocumentCreated;

         Document doc = acApp.DocumentManager.MdiActiveDocument;

         doc.Database.SystemVariableChanged += onSystemVariableChanged;
       }
       void IExtensionApplication.Terminate()
       {
       }
       static void onDocumentCreated(object sender, DocumentCollectionEventArgs e)
       {
         Document doc = e.Document;

         if (doc != null)
               doc.Database.SystemVariableChanged += onSystemVariableChanged;
       }
       static void onSystemVariableChanged(object sender,
         Autodesk.AutoCAD.DatabaseServices.SystemVariableChangedEventArgs e)
       {
         if (e.Changed == true && e.Name.ToUpper() == "CLAYER")
         {
               Database db = HostApplicationServices.WorkingDatabase;

               using (Transaction tr = db.TransactionManager.StartOpenCloseTransaction())
               {
                   BlockTableRecord btr =
                     (BlockTableRecord)tr.GetObject(
                           SymbolUtilityServices.GetBlockPaperSpaceId(db),
                           OpenMode.ForRead);

                   string clayer = db.Clayer.ToString().ToUpper();

                   List<LayerTableRecord> layersToLock = new List<LayerTableRecord>();

                   foreach (ObjectId id in btr)
                   {
                     Viewport vp =
                           tr.GetObject(id, OpenMode.ForRead) as Viewport;

                     if (vp != null)
                     {
                           string vpLayer = vp.Layer.ToUpper();

                           LayerTableRecord ltr =
                               (LayerTableRecord)tr.GetObject(vp.LayerId, OpenMode.ForWrite);

                           if (ltr.IsLocked == true)
                           {
                               layersToLock.Add(ltr);

                               ltr.IsLocked = false;
                           }

                           vp.UpgradeOpen();

                           if (clayer == vp.Layer.ToUpper())
                               vp.On = true;

                           else
                               vp.On = false;
                     }
                   }

                   foreach (LayerTableRecord ltr in layersToLock)
                     ltr.IsLocked = true;

                   tr.Commit();
               }
         }
       }
   }
}

jaredmccullough 发表于 2022-7-6 23:16:18

自从我第一篇文章以来,我可能忘记了提到我缺乏知识或与VLISP的交互或在Autocad中编码,但我应该把这些代码放在哪里呢?我看过VLISP编辑器,不知道代码是否要插入到那里。再次感谢您在BlackBox项目中帮助我

BlackBox 发表于 2022-7-6 23:21:09

LISP,不同于。NET,是文档驻留的,必须将其加载到每个图形中,代码才能正常运行。。。这就是为什么你会看到如此多的LISP开发人员深情地谈论Acad。lsp(默认情况下每个会话加载一次),AcadDoc。lsp(每次打开图形时加载)和自动加载功能(允许按需加载。加载的lsp占用内存,实际加载需要一点时间)。
 
要尝试在论坛中发布的LISP,只需将代码粘贴到一个新的空文本文件中,并用“.lsp”文件扩展名保存它。。。然后,可以将其拖放到AutoCAD会话中进行测试,或使用AcadDoc中的加载功能。lsp等。。。有些人使用Appload Startup Suite,但我总是更喜欢Acad。lps和阿卡多克。而不是lsp(两个用户定义的文件)。
页: 1 [2]
查看完整版本: VB使用la切换视口