知道如何用.NET在AutoCAD中添加一个插件来显示图纸集数据吗?
2010-05-10 15:35
696 查看
非常感谢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组件。
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Windows;
using acApp =
Autodesk.AutoCAD.ApplicationServices;
using ACSMCOMPONENTS18Lib;
using System.Windows.Forms;
using System;
namespace MyApplication
{
public class Commands
{
static PaletteSet ps = null;
static UserControl1 userControl = null;
[CommandMethod("SSTREE")]
public void PopulateCustomSheetTree()
{
// Check the state of the paletteset
if (ps == null)
{
// Then create it
ps = new PaletteSet("Custom Sheet Tree");
userControl = new UserControl1();
ps.Add("MySheetView", userControl);
}
ps.Visible = true;
// Get the AutoCAD Editor
Editor ed =
acApp.Application.DocumentManager.MdiActiveDocument.Editor;
// Get the SheetSet Manager
AcSmSheetSetMgr mgr = new AcSmSheetSetMgr();
// Create a new SheetSet Database
AcSmDatabase db = new AcSmDatabase();
// 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.Exception ex)
{
ed.WriteMessage(ex.ToString());
return;
}
// Lock the db for processing
db.LockDb(db);
AcSmSheetSet ss = db.GetSheetSet();
// Create a root item in the TreeView,
// the name of the SheetSet
TreeNode root = new TreeNode(ss.GetName());
userControl.treeView1.Nodes.Add(root);
ProcessEnumerator(ss.GetSheetEnumerator(), root);
db.UnlockDb(db, true);
mgr.Close(db);
}
void ProcessEnumerator(IAcSmEnumComponent iter, TreeNode root)
{
IAcSmComponent item = iter.Next();
while (item != null)
{
string type = item.GetTypeName();
switch (type)
{
case "AcSmSubset":
try
{
AcSmSubset subset = (AcSmSubset)item;
string subName = subset.GetName();
if (!String.IsNullOrEmpty(subName))
{
TreeNode tn = AddTreeNode(root, subName);
IAcSmEnumComponent enumerator =
(IAcSmEnumComponent)subset.GetSheetEnumerator();
ProcessEnumerator(enumerator, tn);
}
}
catch { }
break;
case "AcSmSheet":
try
{
AcSmSheet sh = (AcSmSheet)item;
string shName = sh.GetName();
if (!String.IsNullOrEmpty(shName))
{
TreeNode tn = AddTreeNode(root, shName);
IAcSmEnumComponent enumerator =
(IAcSmEnumComponent)sh.GetSheetViews();
ProcessEnumerator(enumerator, tn);
}
}
catch { }
break;
case "AcSmSheetViews":
try
{
AcSmSheet sh = (AcSmSheet)item;
string shName = sh.GetName();
if (!String.IsNullOrEmpty(shName))
{
TreeNode tn = AddTreeNode(root, shName);
IAcSmEnumComponent enumerator =
(IAcSmEnumComponent)sh.GetSheetViews();
ProcessEnumerator(enumerator, tn);
}
}
catch { }
break;
case "AcSmSheetView":
try
{
AcSmSheetView sv = (AcSmSheetView)item;
string svName = sv.GetName();
if (!String.IsNullOrEmpty(svName))
AddTreeNode(root, svName);
}
catch { }
break;
case "AcSmCustomPropertyValue":
AcSmCustomPropertyValue pv =
(AcSmCustomPropertyValue)item;
AddTreeNode(
root,
"Custom property value: " + pv.GetValue().ToString()
);
break;
case "AcSmObjectReference":
AcSmObjectReference or =
(AcSmObjectReference)item;
AddTreeNode(
root,
"Object reference: " +
or.GetReferencedObject().GetTypeName()
);
break;
case "AcSmCustomPropertyBag":
try
{
AcSmCustomPropertyBag bag =
(AcSmCustomPropertyBag)item;
TreeNode tn = AddTreeNode(root, "Custom property bag");
IAcSmEnumComponent enumerator =
(IAcSmEnumComponent)bag.GetPropertyEnumerator();
ProcessEnumerator(enumerator, tn);
}
catch { }
break;
case "AcSmAcDbLayoutReference":
AcSmAcDbLayoutReference lr =
(AcSmAcDbLayoutReference)item;
AddTreeNode(
root,
"Layout reference: " + lr.GetName()
);
break;
case "AcSmFileReference":
AcSmFileReference fr = (AcSmFileReference)item;
AddTreeNode(
root,
"Layout reference: " + fr.GetFileName()
);
break;
case "AcSmAcDbViewReference":
AcSmAcDbViewReference vr = (AcSmAcDbViewReference)item;
AddTreeNode(
root,
"View reference: " + vr.GetName()
);
break;
case "AcSmResources":
try
{
AcSmResources res = (AcSmResources)item;
TreeNode tn = AddTreeNode(root, "Resources");
IAcSmEnumComponent enumerator =
(IAcSmEnumComponent)res.GetEnumerator();
ProcessEnumerator(enumerator, tn);
}
catch { }
break;
default:
Document doc =
acApp.Application.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor;
ed.WriteMessage("/nMissed Type = " + type);
break;
}
item = iter.Next();
}
}
private TreeNode AddTreeNode(TreeNode root, string name)
{
// Create a new node on the tree view
TreeNode node = new TreeNode(name);
// Add it to what we have
root.Nodes.Add(node);
return node;
}
}
}
您将需要添加一个新的UserControl到您的项目中的一个TreeView中, 并设置Dock属性为fill(填补)。一定要保持默认名称UserControl1和treeView1。除此之外,没有任何用户界面的工作需要作。
下面是我们运行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
Fenton 最近为一位想用定制的树视图来显示AutoCAD中的图纸集管理器内的信息的ADN会员写了个例子。Fenton的版本用了WPF, 我简单化一下,使用了WinForms,但可能后续也会做一个使用WPF的例子。
我对Fenton的代码做了些修改,所以,如果有任何错误,很可能是我的而不是他的。我只是填充了一些类型的数据,但我没有操作这些数据(我不知道是否有任何真正的需要),别人可能需要做进一步的工作来使用这些数据,甚至把代码截取出来。
总之,下面是C#代码。为使代码运行,将需要增加对acsmcomponents18.tlb (或acsmcomponents17.tlb如果使用AutoCAD 2007-2009年)的参考,以及 AcMgd.dll, AcDbMgd.dll 和Visual Studio提供的.NET组件。
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Windows;
using acApp =
Autodesk.AutoCAD.ApplicationServices;
using ACSMCOMPONENTS18Lib;
using System.Windows.Forms;
using System;
namespace MyApplication
{
public class Commands
{
static PaletteSet ps = null;
static UserControl1 userControl = null;
[CommandMethod("SSTREE")]
public void PopulateCustomSheetTree()
{
// Check the state of the paletteset
if (ps == null)
{
// Then create it
ps = new PaletteSet("Custom Sheet Tree");
userControl = new UserControl1();
ps.Add("MySheetView", userControl);
}
ps.Visible = true;
// Get the AutoCAD Editor
Editor ed =
acApp.Application.DocumentManager.MdiActiveDocument.Editor;
// Get the SheetSet Manager
AcSmSheetSetMgr mgr = new AcSmSheetSetMgr();
// Create a new SheetSet Database
AcSmDatabase db = new AcSmDatabase();
// 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.Exception ex)
{
ed.WriteMessage(ex.ToString());
return;
}
// Lock the db for processing
db.LockDb(db);
AcSmSheetSet ss = db.GetSheetSet();
// Create a root item in the TreeView,
// the name of the SheetSet
TreeNode root = new TreeNode(ss.GetName());
userControl.treeView1.Nodes.Add(root);
ProcessEnumerator(ss.GetSheetEnumerator(), root);
db.UnlockDb(db, true);
mgr.Close(db);
}
void ProcessEnumerator(IAcSmEnumComponent iter, TreeNode root)
{
IAcSmComponent item = iter.Next();
while (item != null)
{
string type = item.GetTypeName();
switch (type)
{
case "AcSmSubset":
try
{
AcSmSubset subset = (AcSmSubset)item;
string subName = subset.GetName();
if (!String.IsNullOrEmpty(subName))
{
TreeNode tn = AddTreeNode(root, subName);
IAcSmEnumComponent enumerator =
(IAcSmEnumComponent)subset.GetSheetEnumerator();
ProcessEnumerator(enumerator, tn);
}
}
catch { }
break;
case "AcSmSheet":
try
{
AcSmSheet sh = (AcSmSheet)item;
string shName = sh.GetName();
if (!String.IsNullOrEmpty(shName))
{
TreeNode tn = AddTreeNode(root, shName);
IAcSmEnumComponent enumerator =
(IAcSmEnumComponent)sh.GetSheetViews();
ProcessEnumerator(enumerator, tn);
}
}
catch { }
break;
case "AcSmSheetViews":
try
{
AcSmSheet sh = (AcSmSheet)item;
string shName = sh.GetName();
if (!String.IsNullOrEmpty(shName))
{
TreeNode tn = AddTreeNode(root, shName);
IAcSmEnumComponent enumerator =
(IAcSmEnumComponent)sh.GetSheetViews();
ProcessEnumerator(enumerator, tn);
}
}
catch { }
break;
case "AcSmSheetView":
try
{
AcSmSheetView sv = (AcSmSheetView)item;
string svName = sv.GetName();
if (!String.IsNullOrEmpty(svName))
AddTreeNode(root, svName);
}
catch { }
break;
case "AcSmCustomPropertyValue":
AcSmCustomPropertyValue pv =
(AcSmCustomPropertyValue)item;
AddTreeNode(
root,
"Custom property value: " + pv.GetValue().ToString()
);
break;
case "AcSmObjectReference":
AcSmObjectReference or =
(AcSmObjectReference)item;
AddTreeNode(
root,
"Object reference: " +
or.GetReferencedObject().GetTypeName()
);
break;
case "AcSmCustomPropertyBag":
try
{
AcSmCustomPropertyBag bag =
(AcSmCustomPropertyBag)item;
TreeNode tn = AddTreeNode(root, "Custom property bag");
IAcSmEnumComponent enumerator =
(IAcSmEnumComponent)bag.GetPropertyEnumerator();
ProcessEnumerator(enumerator, tn);
}
catch { }
break;
case "AcSmAcDbLayoutReference":
AcSmAcDbLayoutReference lr =
(AcSmAcDbLayoutReference)item;
AddTreeNode(
root,
"Layout reference: " + lr.GetName()
);
break;
case "AcSmFileReference":
AcSmFileReference fr = (AcSmFileReference)item;
AddTreeNode(
root,
"Layout reference: " + fr.GetFileName()
);
break;
case "AcSmAcDbViewReference":
AcSmAcDbViewReference vr = (AcSmAcDbViewReference)item;
AddTreeNode(
root,
"View reference: " + vr.GetName()
);
break;
case "AcSmResources":
try
{
AcSmResources res = (AcSmResources)item;
TreeNode tn = AddTreeNode(root, "Resources");
IAcSmEnumComponent enumerator =
(IAcSmEnumComponent)res.GetEnumerator();
ProcessEnumerator(enumerator, tn);
}
catch { }
break;
default:
Document doc =
acApp.Application.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor;
ed.WriteMessage("/nMissed Type = " + type);
break;
}
item = iter.Next();
}
}
private TreeNode AddTreeNode(TreeNode root, string name)
{
// Create a new node on the tree view
TreeNode node = new TreeNode(name);
// Add it to what we have
root.Nodes.Add(node);
return node;
}
}
}
您将需要添加一个新的UserControl到您的项目中的一个TreeView中, 并设置Dock属性为fill(填补)。一定要保持默认名称UserControl1和treeView1。除此之外,没有任何用户界面的工作需要作。
下面是我们运行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
相关文章推荐
- 如何用数据驱动实现通用化巡检APP(如何一个界面里添加多个点击拍照按钮并显示在不同的imageview里)
- 在网页中添加一个GradView,一个Button,一点button将MyStudents表中的数据显示在GradView中(DataSet,DataTable,List(选作))
- 数据结构--如何对一个线性表里面的元素赋值,并且显示插入一个数据后的情况
- 11-28 (数据绑定)在网页中添加一个GradView,一个Button,一点button将MyStudents表中的数据显示在GradView中
- rcp(插件开发)如何在一个透视图中显示多个视图
- 建站或者网站搬家换空间的时候,企业站长最关心的一个问题是该如何选择网站空间,而这一问题对于一些擅长的站长来说非常小意思,但对于部分企业站长来说是一个比较头疼的问题。根据不完整数据显示,很多企业站长因为
- [AutoCAD2008新功能介绍3]在AutoCAD中使用.NET来添加一个新的缩放比例
- 添加数据之后不跳页面显示一个漂亮的提示信息(非ajax提交数据)
- 如何在mfc对话框中添加一个显示网页的窗口
- 一个使用GridView显示数据,并且可以进行添加、修改、删除操作的例子
- 你知道吗,如何使用select2插件实现下拉框一次性选多个值、以及数据的回显
- 大数据架构和模式(一)大数据分类和架构简介 大数据架构和模式(二)如何知道一个大数据解决方案是否适合您的组织
- JQ的一个树形显示数据插件
- 如何将不同信息的数据对象合并显示到同一个页面上或者滚动窗口中
- 如何在TabControl中响应右键鼠标(添加一个ContextMenu就可以了),如何让在tab标签处右键菜单和在内容处右键菜单显示不同的菜单?
- 如何将从数据库中取得的一个数据显示在lable上
- Flex中如何创建一个自定义数据显示Tips的slider控件。鼠标按住滑标察看效果
- ideal中如何添加几个不同的项目在同一个idea的显示页面
- 学习插件的第1天,在body上添加一个节点,用来显示弹出层