知道如何用.NET在AutoCAD中添加一个插件来显示图纸集数据吗?

非常感谢DevTech美国团队的Fenton Webb,他提供的代码是这篇文章中代码的基础。谢谢,Fents:-)

Fenton最近为一位想用定制的树视图来显示AutoCAD中的图纸集管理器内的信息的ADN会员写了个例子。Fenton的版本用了WPF,我简单化一下,使用了WinForms,但可能后续也会做一个使用WPF的例子。

我对Fenton的代码做了些修改,所以,如果有任何错误,很可能是我的而不是他的。我只是填充了一些类型的数据,但我没有操作这些数据(我不知道是否有任何真正的需要),别人可能需要做进一步的工作来使用这些数据,甚至把代码截取出来。

总之,下面是C#代码。为使代码运行,将需要增加对acsmcomponents18.tlb(或acsmcomponents17.tlb如果使用AutoCAD 2007-2009年)的参考,以及AcMgd.dllAcDbMgd.dllVisual Studio提供的.NET组件。

usingAutodesk.AutoCAD.ApplicationServices;

usingAutodesk.AutoCAD.EditorInput;

usingAutodesk.AutoCAD.Runtime;

usingAutodesk.AutoCAD.Windows;

usingacApp =

  Autodesk.AutoCAD.ApplicationServices;

usingACSMCOMPONENTS18Lib;

usingSystem.Windows.Forms;

usingSystem;

   

namespaceMyApplication

{

 publicclassCommands

  {

   staticPaletteSetps =null;

   staticUserControl1userControl =null;

   

    [CommandMethod("SSTREE")]

   publicvoidPopulateCustomSheetTree()

    {

     // Check the state of the paletteset

   

     if(ps ==null)

      {

       // Then create it

   

        ps =newPaletteSet("Custom Sheet Tree");

        userControl =newUserControl1();

        ps.Add("MySheetView", userControl);

      }

   

      ps.Visible =true;

   

     // Get the AutoCAD Editor

   

     Editored =

        acApp.Application.DocumentManager.MdiActiveDocument.Editor;

   

     // Get the SheetSet Manager

   

     AcSmSheetSetMgrmgr =newAcSmSheetSetMgr();

   

     // Create a new SheetSet Database

   

     AcSmDatabasedb =newAcSmDatabase();

   

     // Try and load a default DST file...

   

     try

      {

        db =

          mgr.OpenDatabase(

           @"C:/Program Files/Autodesk/AutoCAD 2011/Sample/"+

           @"Sheet Sets/Architectural/IRD Addition.dst",

           true

          );

      }

     catch(System.Exceptionex)

      {

        ed.WriteMessage(ex.ToString());

       return;

      }

   

     // Lock the db for processing

   

      db.LockDb(db);

   

     AcSmSheetSetss = db.GetSheetSet();

   

     // Create a root item in the TreeView,

     // the name of the SheetSet

   

     TreeNoderoot =newTreeNode(ss.GetName());

      userControl.treeView1.Nodes.Add(root);

   

      ProcessEnumerator(ss.GetSheetEnumerator(), root);

   

      db.UnlockDb(db,true);

      mgr.Close(db);

    }

   

   voidProcessEnumerator(IAcSmEnumComponentiter,TreeNoderoot)

    {

     IAcSmComponentitem = iter.Next();

     while(item !=null)

      {

       stringtype = item.GetTypeName();

       switch(type)

        {

         case"AcSmSubset":

           try

            {

             AcSmSubsetsubset = (AcSmSubset)item;

             stringsubName = subset.GetName();

   

             if(!String.IsNullOrEmpty(subName))

              {

               TreeNodetn = AddTreeNode(root, subName);

               IAcSmEnumComponentenumerator =

                  (IAcSmEnumComponent)subset.GetSheetEnumerator();

                ProcessEnumerator(enumerator, tn);

              }

            }

           catch{ }

           break;

   

         case"AcSmSheet":

           try

            {

             AcSmSheetsh = (AcSmSheet)item;

             stringshName = sh.GetName();

   

             if(!String.IsNullOrEmpty(shName))

              {

               TreeNodetn = AddTreeNode(root, shName);

               IAcSmEnumComponentenumerator =

                  (IAcSmEnumComponent)sh.GetSheetViews();

                ProcessEnumerator(enumerator, tn);

              }

            }

           catch{ }

           break;

   

         case"AcSmSheetViews":

           try

            {

             AcSmSheetsh = (AcSmSheet)item;

             stringshName = sh.GetName();

   

             if(!String.IsNullOrEmpty(shName))

              {

               TreeNodetn = AddTreeNode(root, shName);

               IAcSmEnumComponentenumerator =

                  (IAcSmEnumComponent)sh.GetSheetViews();

                ProcessEnumerator(enumerator, tn);

              }

            }

           catch{ }

           break;

   

         case"AcSmSheetView":

           try

            {

             AcSmSheetViewsv = (AcSmSheetView)item;

             stringsvName = sv.GetName();

   

             if(!String.IsNullOrEmpty(svName))

                AddTreeNode(root, svName);

            }

           catch{ }

           break;

   

         case"AcSmCustomPropertyValue":

           AcSmCustomPropertyValuepv =

              (AcSmCustomPropertyValue)item;

   

            AddTreeNode(

              root,

             "Custom property value: "+ pv.GetValue().ToString()

            );

           break;

   

         case"AcSmObjectReference":

           AcSmObjectReferenceor =

              (AcSmObjectReference)item;

   

            AddTreeNode(

              root,

             "Object reference: "+

              or.GetReferencedObject().GetTypeName()

            );

           break;

   

         case"AcSmCustomPropertyBag":

           try

            {

             AcSmCustomPropertyBagbag =

                (AcSmCustomPropertyBag)item;

   

             TreeNodetn = AddTreeNode(root,"Custom property bag");

             IAcSmEnumComponentenumerator =

                (IAcSmEnumComponent)bag.GetPropertyEnumerator();

              ProcessEnumerator(enumerator, tn);

            }

           catch{ }

           break;

   

         case"AcSmAcDbLayoutReference":

           AcSmAcDbLayoutReferencelr =

              (AcSmAcDbLayoutReference)item;

   

            AddTreeNode(

              root,

             "Layout reference: "+ lr.GetName()

            );

           break;

   

         case"AcSmFileReference":

           AcSmFileReferencefr = (AcSmFileReference)item;

   

            AddTreeNode(

              root,

             "Layout reference: "+ fr.GetFileName()

            );

           break;

   

         case"AcSmAcDbViewReference":

           AcSmAcDbViewReferencevr = (AcSmAcDbViewReference)item;

   

            AddTreeNode(

              root,

             "View reference: "+ vr.GetName()

            );

           break;

   

         case"AcSmResources":

           try

            {

             AcSmResourcesres = (AcSmResources)item;

   

             TreeNodetn = AddTreeNode(root,"Resources");

             IAcSmEnumComponentenumerator =

                (IAcSmEnumComponent)res.GetEnumerator();

              ProcessEnumerator(enumerator, tn);

            }

           catch{ }

           break;

   

         default:

           Documentdoc =

              acApp.Application.DocumentManager.MdiActiveDocument;

           Editored = doc.Editor;

            ed.WriteMessage("/nMissed Type = "+ type);

           break;

        }

        item = iter.Next();

      }

    }

   

   privateTreeNodeAddTreeNode(TreeNoderoot,stringname)

    {

     // Create a new node on the tree view

   

     TreeNodenode =newTreeNode(name);

   

     // Add it to what we have

   

      root.Nodes.Add(node);

     returnnode;

    }

  }

}

您将需要添加一个新的UserControl到您的项目中的一个TreeView,并设置Dock属性为fill(填补)。一定要保持默认名称UserControl1treeView1。除此之外,没有任何用户界面的工作需要作。

下面是我们运行SSTREE命令和把硬编码的DST导入到SheetSet管理器(用SSM命令显示)进行的比较:

 

 

显然你可以多做一些工作,使两个用户界面看起来相同(图标等),但那是更多的关于递归解析SheetSet树的问题,而不是我侧重要介绍的东西。如果您在用其它DST文件时遇到任何问题,一定要出来发表评论。

原文(英语):http://through-the-interface.typepad.com/through_the_interface/2010/05/populating-a-tree-view-inside-autocad-with-sheet-set-data-using-net.html