布局中的冻结层
您好,我正在尝试在每个布局的每个其他视口中冻结选定项的图层
此代码似乎适用于活动布局,但不适用于所有其他布局
如何仅获取布局中的视口,而不获取布局本身
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Colors;
namespace RSNNGrundbeanspruchung
{
public class Commands
{
public static void AFFrierenTest()
{
var doc = Application.DocumentManager.MdiActiveDocument;
var db = HostApplicationServices.WorkingDatabase;
var ed = doc.Editor;
PromptEntityOptions peo = new PromptEntityOptions("\nObjekt zeigen: ");
peo.SetRejectMessage("\nKein gültiges Objekt gewählt. Objekt zeigen: ");
peo.AddAllowedClass(typeof(Entity), false);
do
{
PromptEntityResult per = ed.GetEntity(peo);
if (per.Status != PromptStatus.OK)
return;
ObjectId objId = per.ObjectId;
using (var tr = db.TransactionManager.StartTransaction())
{
Entity ent = (Entity)tr.GetObject(objId, OpenMode.ForRead);
LayerTable Layers = (LayerTable)tr.GetObject(db.LayerTableId, OpenMode.ForRead);
LayerTableRecord Layer = (LayerTableRecord)tr.GetObject(ent.LayerId, OpenMode.ForWrite);
peo.Message = string.Format("\nLayer: \"{0}\" wird in anderen Fenstern ausgeschaltet.\nObjekt zeigen: ", Layer.Name);
// Freeze "Test" layer in all viewports
ObjectId[] ids = new ObjectId { ent.LayerId };
DBDictionary layoutDict = (DBDictionary)tr.GetObject(db.LayoutDictionaryId, OpenMode.ForRead);
foreach (DBDictionaryEntry entry in layoutDict)
{
if (entry.Key != "Model")
{
Layout lay = (Layout)tr.GetObject(entry.Value, OpenMode.ForRead);
foreach (ObjectId vpId in lay.GetViewports())
{
Viewport vp = (Viewport)tr.GetObject(vpId, OpenMode.ForWrite);
if (ed.CurrentViewportObjectId != vpId)
vp.FreezeLayersInViewport(ids.GetEnumerator());
}
}
}
tr.Commit();
}
} while (true);
}
}
}
**** Hidden Message ***** 好了,这两个问题我都找到答案了。
您必须使用数据库。GetViewports(false)。
public static void AFFrierenTest2()
{
var doc = Application.DocumentManager.MdiActiveDocument;
var db = HostApplicationServices.WorkingDatabase;
var ed = doc.Editor;
PromptEntityOptions peo = new PromptEntityOptions("\nObjekt zeigen: ");
peo.SetRejectMessage("\nKein gültiges Objekt gewählt. Objekt zeigen: ");
peo.AddAllowedClass(typeof(Entity), false);
do
{
PromptEntityResult per = ed.GetEntity(peo);
if (per.Status != PromptStatus.OK)
return;
ObjectId objId = per.ObjectId;
using (var tr = db.TransactionManager.StartTransaction())
{
Entity ent = (Entity)tr.GetObject(objId, OpenMode.ForRead);
LayerTable Layers = (LayerTable)tr.GetObject(db.LayerTableId, OpenMode.ForRead);
LayerTableRecord Layer = (LayerTableRecord)tr.GetObject(ent.LayerId, OpenMode.ForWrite);
peo.Message = string.Format("\nLayer: \"{0}\" wird in anderen Fenstern ausgeschaltet.\nObjekt zeigen: ", Layer.Name);
// Freeze "Test" layer in all viewports
ObjectId[] ids = new ObjectId { ent.LayerId };
ObjectIdCollection layerIds = new ObjectIdCollection();
layerIds.Add(ent.LayerId);
foreach (ObjectId vpId in db.GetViewports(false))
{
Viewport vp = (Viewport)tr.GetObject(vpId, OpenMode.ForWrite);
if (ed.CurrentViewportObjectId != vpId)
vp.FreezeLayersInViewport(layerIds.GetEnumerator());
}
tr.Commit();
}
} while (true);
}
好吧,这个也不起作用。
我只是尝试了第一个布局中的一个图层,然后切换到下一个图层,它似乎可以正常工作,但后来我在另一个视口中再次尝试,但它不起作用。 经过一点点测试,我可以看到只有我第一次使用这个命令时它才正常工作。然后它就不再工作了。
此外,如果我在第一次使用之前更改布局,它就不起作用了。 您好,
这似乎适用于我:
使用Autodesk.AutoCAD.ApplicationServices
使用Autodesk.AutoCAD.DatabaseServices
使用Autodesk.AutoCAD.EditorInput
使用Autodesk.AutoCAD.Runtime
[程序集:CommandClass(typeof(VpFreezeBySelection.Commands))]
名称空间选择
{
公共类命令
{
公共无效测试()
{
var doc=Application.DocumentManager.MdiActiveDocument
var db=doc.Database
var-ed=doc.Editor
var per=ed.GetEntity(“\n选择一个实体:”)
如果(per.Status!=PromptStatus.OK)
返回
使用(var tr=db.TransactionManager.StartTransaction())
{
var lt=(LayerTable)tr.GetObject(db.LayerTableId,OpenMode.ForRead)
var ent=(实体)tr.GetObject(per.ObjectId,OpenMode.ForRead)
var id=new[]{lt}
var dic=(DBDictionary)tr.GetObject(db.layoutdirectionaryid,OpenMode.ForRead)
foreach(dic中的DBDictionaryEntry条目)
{
如果(entry.Key==“Model”)
继续
var layout=(layout)tr.GetObject(entry.Value,OpenMode.ForRead)
foreach(布局中的ObjectId.GetViewports())
{
如果(id!=ed.CurrentViewportObjectId)
{
var-vp=(视口)tr。GetObject(id,OpenMode.ForWrite)
vp.FreezeLayersInViewport(id.GetEnumerator())
}
}
}
tr.Commit()
}
}
}
}
页:
[1]