RoSiNiNo 发表于 2017-9-12 07:00:12

布局中的冻结层

您好,
我正在尝试在每个布局的每个其他视口中冻结选定项的图层
此代码似乎适用于活动布局,但不适用于所有其他布局
如何仅获取布局中的视口,而不获取布局本身
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 *****

RoSiNiNo 发表于 2017-9-12 07:22:43

好了,这两个问题我都找到答案了。
您必须使用数据库。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);
      }

RoSiNiNo 发表于 2017-9-12 07:33:32

好吧,这个也不起作用。
我只是尝试了第一个布局中的一个图层,然后切换到下一个图层,它似乎可以正常工作,但后来我在另一个视口中再次尝试,但它不起作用。

RoSiNiNo 发表于 2017-9-13 01:13:37

经过一点点测试,我可以看到只有我第一次使用这个命令时它才正常工作。然后它就不再工作了。
此外,如果我在第一次使用之前更改布局,它就不起作用了。

gile 发表于 2017-9-13 06:34:47

您好,
这似乎适用于我:
使用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]
查看完整版本: 布局中的冻结层