乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 75|回复: 4

布局中的冻结层

[复制链接]

1

主题

4

帖子

1

银币

初来乍到

Rank: 1

铜币
8
发表于 2017-9-12 07:00:12 | 显示全部楼层 |阅读模式
您好,
我正在尝试在每个布局的每个其他视口中冻结选定项的图层
此代码似乎适用于活动布局,但不适用于所有其他布局
如何仅获取布局中的视口,而不获取布局本身
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Runtime;
  5. using Autodesk.AutoCAD.Colors;
  6. [assembly: CommandClass(typeof(RSNNGrundbeanspruchung.Commands))]
  7. namespace RSNNGrundbeanspruchung
  8. {
  9.     public class Commands
  10.     {
  11.         [CommandMethod("AFLayerfrierenTest")]
  12.         public static void AFFrierenTest()
  13.         {
  14.             var doc = Application.DocumentManager.MdiActiveDocument;
  15.             var db = HostApplicationServices.WorkingDatabase;
  16.             var ed = doc.Editor;
  17.             PromptEntityOptions peo = new PromptEntityOptions("\nObjekt zeigen: ");
  18.             peo.SetRejectMessage("\nKein gültiges Objekt gewählt. Objekt zeigen: ");
  19.             peo.AddAllowedClass(typeof(Entity), false);
  20.             do
  21.             {
  22.                 PromptEntityResult per = ed.GetEntity(peo);
  23.                 if (per.Status != PromptStatus.OK)
  24.                     return;
  25.                 ObjectId objId = per.ObjectId;
  26.                 using (var tr = db.TransactionManager.StartTransaction())
  27.                 {
  28.                     Entity ent = (Entity)tr.GetObject(objId, OpenMode.ForRead);
  29.                     LayerTable Layers = (LayerTable)tr.GetObject(db.LayerTableId, OpenMode.ForRead);
  30.                     LayerTableRecord Layer = (LayerTableRecord)tr.GetObject(ent.LayerId, OpenMode.ForWrite);
  31.                     peo.Message = string.Format("\nLayer: "{0}" wird in anderen Fenstern ausgeschaltet.\nObjekt zeigen: ", Layer.Name);
  32.                     // Freeze "Test" layer in all viewports
  33.                     ObjectId[] ids = new ObjectId[1] { ent.LayerId };
  34.                     DBDictionary layoutDict = (DBDictionary)tr.GetObject(db.LayoutDictionaryId, OpenMode.ForRead);
  35.                     foreach (DBDictionaryEntry entry in layoutDict)
  36.                     {
  37.                         if (entry.Key != "Model")
  38.                         {
  39.                             Layout lay = (Layout)tr.GetObject(entry.Value, OpenMode.ForRead);
  40.                             foreach (ObjectId vpId in lay.GetViewports())
  41.                             {
  42.                                 Viewport vp = (Viewport)tr.GetObject(vpId, OpenMode.ForWrite);
  43.                                 if (ed.CurrentViewportObjectId != vpId)
  44.                                     vp.FreezeLayersInViewport(ids.GetEnumerator());
  45.                                 
  46.                             }
  47.                         }
  48.                     }
  49.                    tr.Commit();
  50.                 }
  51.             } while (true);
  52.         }
  53.     }
  54. }

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

1

主题

4

帖子

1

银币

初来乍到

Rank: 1

铜币
8
发表于 2017-9-12 07:22:43 | 显示全部楼层
好了,这两个问题我都找到答案了。
您必须使用数据库。GetViewports(false)。
  1.         [CommandMethod("AFLayerfrierenTest2")]
  2.         public static void AFFrierenTest2()
  3.         {
  4.             var doc = Application.DocumentManager.MdiActiveDocument;
  5.             var db = HostApplicationServices.WorkingDatabase;
  6.             var ed = doc.Editor;
  7.             PromptEntityOptions peo = new PromptEntityOptions("\nObjekt zeigen: ");
  8.             peo.SetRejectMessage("\nKein gültiges Objekt gewählt. Objekt zeigen: ");
  9.             peo.AddAllowedClass(typeof(Entity), false);
  10.             do
  11.             {
  12.                 PromptEntityResult per = ed.GetEntity(peo);
  13.                 if (per.Status != PromptStatus.OK)
  14.                     return;
  15.                 ObjectId objId = per.ObjectId;
  16.                 using (var tr = db.TransactionManager.StartTransaction())
  17.                 {
  18.                     Entity ent = (Entity)tr.GetObject(objId, OpenMode.ForRead);
  19.                     LayerTable Layers = (LayerTable)tr.GetObject(db.LayerTableId, OpenMode.ForRead);
  20.                     LayerTableRecord Layer = (LayerTableRecord)tr.GetObject(ent.LayerId, OpenMode.ForWrite);
  21.                     peo.Message = string.Format("\nLayer: "{0}" wird in anderen Fenstern ausgeschaltet.\nObjekt zeigen: ", Layer.Name);
  22.                     // Freeze "Test" layer in all viewports
  23.                     ObjectId[] ids = new ObjectId[1] { ent.LayerId };
  24.                     ObjectIdCollection layerIds = new ObjectIdCollection();
  25.                     layerIds.Add(ent.LayerId);
  26.                     foreach (ObjectId vpId in db.GetViewports(false))
  27.                     {
  28.                         Viewport vp = (Viewport)tr.GetObject(vpId, OpenMode.ForWrite);
  29.                         if (ed.CurrentViewportObjectId != vpId)
  30.                             vp.FreezeLayersInViewport(layerIds.GetEnumerator());
  31.                     }
  32.                     tr.Commit();
  33.                 }
  34.             } while (true);
  35.         }

回复

使用道具 举报

1

主题

4

帖子

1

银币

初来乍到

Rank: 1

铜币
8
发表于 2017-9-12 07:33:32 | 显示全部楼层
好吧,这个也不起作用。
我只是尝试了第一个布局中的一个图层,然后切换到下一个图层,它似乎可以正常工作,但后来我在另一个视口中再次尝试,但它不起作用。
回复

使用道具 举报

1

主题

4

帖子

1

银币

初来乍到

Rank: 1

铜币
8
发表于 2017-9-13 01:13:37 | 显示全部楼层
经过一点点测试,我可以看到只有我第一次使用这个命令时它才正常工作。然后它就不再工作了。
此外,如果我在第一次使用之前更改布局,它就不起作用了。
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2017-9-13 06:34:47 | 显示全部楼层
您好,
这似乎适用于我:
使用Autodesk.AutoCAD.ApplicationServices
使用Autodesk.AutoCAD.DatabaseServices
使用Autodesk.AutoCAD.EditorInput
使用Autodesk.AutoCAD.Runtime
[程序集:CommandClass(typeof(VpFreezeBySelection.Commands))]
名称空间选择
{
公共类命令
{
[CommandMethod(“TEST”,CommandFlags.NoTileMode|commandFlag.NoPaperSpace)]
公共无效测试()
{
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[ent.Layer]}
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()
}
}
}
}
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-4 12:49 , Processed in 0.149891 second(s), 62 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表