【问题标题】:Autocad C# delete layout viewportsAutoCAD C# 删除布局视口
【发布时间】:2018-02-20 03:47:57
【问题描述】:

谁能帮我创建一个 C# 代码来删除布局中的视口。

我尝试了一个删除视口的代码,它编译没有问题,但它没有删除视口,我不确定我在这里做错了什么。

谢谢

public class Class1
{
    [CommandMethod("haha")]
    
    public static void CreateModelViewports()
    {
        Document doc = Application.DocumentManager.MdiActiveDocument;
        Database db = doc.Database;
        using (Transaction trans = db.TransactionManager.StartTransaction())
        {
            var viewportTable = (ViewportTable)trans.GetObject(db.ViewportTableId, OpenMode.ForWrite);
            foreach (ObjectId id in viewportTable)
            {
                var viewport = (ViewportTableRecord)trans.GetObject(id, OpenMode.ForRead);
                // Delete the active viewport
               
                    viewport.UpgradeOpen();
                    viewport.Erase();
                
            }
                           
            trans.Commit();
        }
    }

}

【问题讨论】:

  • 您至少尝试过吗? stackoverflow.com/help/how-to-ask
  • 我是 Autocad 的 C# 新手,只是想获取一个可以删除视口的代码。我什至不知道如何开始。这就是我所拥有的。
  • 您需要在调试器中单步执行您的代码。

标签: c# .net autocad


【解决方案1】:

您正在删除 ViewportTableRecord 而不是 Viewport

您需要从要擦除其视口的布局中获取BlockTableRecordId。然后遍历该BlockTableRecord 中的每个ObjectId 以查看它是否是Viewport。只有这样你才能删除它们

因此,如果您想删除当前布局中的所有视口,请执行以下操作(您必须在图纸空间中才能工作,因为它不会检查)

[CommandMethod("GOO")]
    public static void test()
    {
        Database DB = Application.DocumentManager.MdiActiveDocument.Database;
        using (Transaction trans = DB.TransactionManager.StartTransaction())
        {
            LayoutManager LM = LayoutManager.Current;
            string currentLo = LM.CurrentLayout;
            DBDictionary LayoutDict = trans.GetObject(DB.LayoutDictionaryId, OpenMode.ForRead) as DBDictionary;
            Layout CurrentLo = trans.GetObject((ObjectId)LayoutDict[currentLo], OpenMode.ForRead) as Layout;
            BlockTableRecord BlkTblRec = trans.GetObject(CurrentLo.BlockTableRecordId, OpenMode.ForRead) as BlockTableRecord;
            foreach (ObjectId ID in BlkTblRec)
            {
                Viewport VP = trans.GetObject(ID, OpenMode.ForRead) as Viewport;
                if (VP != null)
                {
                    VP.UpgradeOpen();
                    VP.Erase();
                }
            }
            trans.Commit();
        }
    }

【讨论】:

  • 嘿 Mavios,非常感谢您指出我做错了什么,我确实尝试了您的代码,但我得到了一个致命错误,它只会破坏 autocad。我会尝试使用块表记录 id 看看我是否有任何运气。
  • @Itop 我编辑了代码以使其仅适用于当前布局。我已经测试了代码并且它可以工作。您可能没有正确加载 Layout 对象。
  • 嗨 Mavios,它现在可以工作了,我第一次运行它时一定是做错了什么。非常感谢您在这方面帮助我,我非常感谢您的时间和努力。
  • @Istop 很乐意为您提供帮助。最后一件事,您只需选择我的答案作为可接受的解决方案,这样其他人可能会受益。
  • 我遇到了问题。
猜你喜欢
  • 2021-03-19
  • 2011-01-09
  • 2014-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-30
相关资源
最近更新 更多