非常感谢DevTech美国团队的Fenton Webb,他提供的代码是这篇文章中代码的基础。谢谢,Fents!:-)
Fenton最近为一位想用定制的树视图来显示AutoCAD中的图纸集管理器内的信息的ADN会员写了个例子。Fenton的版本用了WPF,我简单化一下,使用了WinForms,但可能后续也会做一个使用WPF的例子。
我对Fenton的代码做了些修改,所以,如果有任何错误,很可能是我的而不是他的。我只是填充了一些类型的数据,但我没有操作这些数据(我不知道是否有任何真正的需要),别人可能需要做进一步的工作来使用这些数据,甚至把代码截取出来。
总之,下面是C#代码。为使代码运行,将需要增加对acsmcomponents18.tlb(或acsmcomponents17.tlb如果使用AutoCAD 2007-2009年)的参考,以及AcMgd.dll,AcDbMgd.dll和Visual 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(填补)。一定要保持默认名称UserControl1和treeView1。除此之外,没有任何用户界面的工作需要作。
下面是我们运行SSTREE命令和把硬编码的DST导入到SheetSet管理器(用SSM命令显示)进行的比较:
显然你可以多做一些工作,使两个用户界面看起来相同(图标等),但那是更多的关于递归解析SheetSet树的问题,而不是我侧重要介绍的东西。如果您在用其它DST文件时遇到任何问题,一定要出来发表评论。