我有一个层说“部门视口”,它有5个视口。。。。我“打开”该层,所有5个视口帧都会出现。但是,我必须逐个转到每个视口帧并打开MVIEW>才能显示视口对象。希望这能澄清一点。这个文件本身对于这个网站来说太大了,所以我举了一个例子,我可以用这个例子来描述我的意图
别担心;也许是我对术语产生了兴趣。感谢您的澄清。
再一次,也许我只是在这条阻力最小的道路上被挂断了。。。为什么首先要关闭MVIEW-->呢?
我只会问,当一个图层关闭时,该图层上的任何内容都不可见或可绘制。。。这就是为什么大多数人只需将其为视口指定的图层设置为“无打印”,以便它们可以始终保持可见,但视口帧本身不会打印。
代码可以做你想做的事情,我只是想先理解一下逻辑,如果有一个更简单的解决方案。
HTH公司 我给你一点想象的东西,想象一下:
布局1中间的单个方形视口,其框架设置为图层
“Viewport 1”,当前该层处于活动状态,并且Viewport MVIEW>处于打开状态。现在,我已经创建了5个其他视口(围绕它的小圆形视口)。这些视口的框架设置在“部门视口”层上。该层仅用于少数目的,仅在需要时“打开”,但现在“关闭”。如果我没有MVIEW>关闭这些较小的视口,当我关闭图层时,只有帧会消失,而不是对象,所以要让它们打开,我必须分别MVIEW>关闭每个,然后关闭“部门视口”图层。
这一理论在许多其他布局和视口中都有使用,这就是为什么我真的希望提出一些东西。 可以安全地假设您正在通过内置命令/菜单/按钮等修改这些视口层吗。? 除了为图层指定视口帧并使用MVIEW关闭或打开带有它们的对象之外,我目前还没有对图层做任何操作。 黑匣子你还在吗。。。对不起,我出差时间过长。。。。。或者其他人能帮我吗? 还在这里。。。回到这里,用你的例子。。。。
启用“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)
[编辑]**此时不考虑锁定层。 ... 和。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();
}
}
}
}
}
自从我第一篇文章以来,我可能忘记了提到我缺乏知识或与VLISP的交互或在Autocad中编码,但我应该把这些代码放在哪里呢?我看过VLISP编辑器,不知道代码是否要插入到那里。再次感谢您在BlackBox项目中帮助我 LISP,不同于。NET,是文档驻留的,必须将其加载到每个图形中,代码才能正常运行。。。这就是为什么你会看到如此多的LISP开发人员深情地谈论Acad。lsp(默认情况下每个会话加载一次),AcadDoc。lsp(每次打开图形时加载)和自动加载功能(允许按需加载。加载的lsp占用内存,实际加载需要一点时间)。
要尝试在论坛中发布的LISP,只需将代码粘贴到一个新的空文本文件中,并用“.lsp”文件扩展名保存它。。。然后,可以将其拖放到AutoCAD会话中进行测试,或使用AcadDoc中的加载功能。lsp等。。。有些人使用Appload Startup Suite,但我总是更喜欢Acad。lps和阿卡多克。而不是lsp(两个用户定义的文件)。
页:
1
[2]