项目目标:我们将创建一个新的字典对象,它用来表示我们雇员就职的 ‘Acme 公司‘(呵呵,当然是虚构的一家公司)的部门。这个“部门”字典对象将包含一个表示部门经理的记录。我们还会加入代码到雇员创建过程,这个过程会加入一个索引到雇员工作的部门。
我们要说明的是如何在DWG文件中创建自定义数据,包括“每个图形”的自定义数据和“每个实体”的自定义数据。“每个图形”的自定义数据是指只在整个图形中加入一次的数据,它表示对象可以引用的单一类型或特性。“每个实体”的自定义数据是指是为特定的对象或数据库中的实体加入的数据。
代码如下:
view plaincopy to clipboardprint?
using System;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.Colors;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
[assembly: CommandClass(typeof(CsMgdAcad7.Class1))] //在运行autocad的同时加载Class1程序
namespace CsMgdAcad7
{
class Class1
{
public Class1()
{
}
private ObjectId CreateEmployeeDefinition()
{
ObjectId newBtrId = new ObjectId(); //定义一个objectid的对象作为返回值
Database db = HostApplicationServices.WorkingDatabase; //获得当前工作空间的数据库
using (Transaction trans = db.TransactionManager.StartTransaction()) //开始事务
{
BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForWrite);
if (bt.Has("em"))
{
newBtrId = bt["em"];
}
else
{
Point3d center = new Point3d(10, 10, 10);
//圆
Circle circle = new Circle(center,Vector3d.ZAxis,2);
//多文本
MText text=new MText();
text.Contents = "我爱中国人";
text.Location = center;
//椭圆
Ellipse ellipse = new Ellipse(center,Vector3d.ZAxis,new Vector3d(3,0,0),0.5,0,0);
ObjectId empId = CreateLayer();
text.LayerId = empId;
circle.LayerId = empId;
ellipse.LayerId = empId;
text.ColorIndex = 2;
circle.ColorIndex = 3;
ellipse.ColorIndex = 1;
BlockTableRecord newBtr = new BlockTableRecord();
newBtr.Name = "em";
newBtrId = bt.Add(newBtr);
trans.AddNewlyCreatedDBObject(newBtr, true); //让事务知道你在cad当中添加了块表
newBtr.AppendEntity(circle); //在cad当中输出圆
newBtr.AppendEntity(text);//在cad当中输出多文本
newBtr.AppendEntity(ellipse);//在cad当中输出椭圆
trans.AddNewlyCreatedDBObject(circle, true); //让事务知道你在cad当中添加了圆
trans.AddNewlyCreatedDBObject(text, true);//让事务知道你在cad当中添加了多文本
trans.AddNewlyCreatedDBObject(ellipse, true);//让事务知道你在cad当中添加了椭圆
trans.Commit(); //提交数据
}
}
CreateDivision(); //建立职工词典
return newBtrId;
}
private void CreateDivision()
{
Database db = HostApplicationServices.WorkingDatabase;
using (Transaction trans = db.TransactionManager.StartTransaction())
{
DBDictionary NOD = (DBDictionary)trans.GetObject(db.NamedObjectsDictionaryId, OpenMode.ForWrite);
DBDictionary acmeDict;
try
{
acmeDict = (DBDictionary)trans.GetObject(NOD.GetAt("ACME_DIVISION"), OpenMode.ForRead);
}
catch
{
acmeDict = new DBDictionary();
NOD.SetAt("ACME_DIVISION", acmeDict);
trans.AddNewlyCreatedDBObject(acmeDict, true);
}
DBDictionary divDict;
try
{
divDict = (DBDictionary)trans.GetObject(acmeDict.GetAt("Sales"), OpenMode.ForWrite);
}
catch
{
divDict = new DBDictionary();
acmeDict.UpgradeOpen();
acmeDict.SetAt("Sales", divDict);
trans.AddNewlyCreatedDBObject(divDict, true);
}
Xrecord mgrXRec;
try
{
mgrXRec = (Xrecord)trans.GetObject(divDict.GetAt("Department Manager"), OpenMode.ForWrite);
}
catch
{
mgrXRec = new Xrecord();
mgrXRec.Data = new ResultBuffer(new TypedValue((int)DxfCode.Text, "Randolph P. Brokwell"));
divDict.SetAt("Department Manager", mgrXRec);
trans.AddNewlyCreatedDBObject(mgrXRec, true);
}
trans.Commit();
}
}
private ObjectId CreateLayer()
{
ObjectId layerId;
Database db = HostApplicationServices.WorkingDatabase;
using (Transaction trans = db.TransactionManager.StartTransaction())
{
//获得layer表...
LayerTable lt = (LayerTable)trans.GetObject(db.LayerTableId, OpenMode.ForRead);
//Check if EmployeeLayer exists...
if (lt.Has("em"))
{
layerId = lt["em"];
}
else
{
//否则,创建个layer.
LayerTableRecord ltr = new LayerTableRecord();
ltr.Name = "em"; // 设置layer名称
ltr.Color = Color.FromColorIndex(ColorMethod.ByAci, 2);
// 将读的形式更新为写的形式
lt.UpgradeOpen();
layerId = lt.Add(ltr);
trans.AddNewlyCreatedDBObject(ltr, true);
}
trans.Commit();
}
return layerId;
}
[CommandMethod("CREATE")]
public void CreateEmployee()
{
Database db = HostApplicationServices.WorkingDatabase; //获得当前工作空间的数据库
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; //获得文档编辑
using(Transaction trans=db.TransactionManager.StartTransaction()) //使用事务获取数据库对象
try
{
BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForWrite); //首先取得层表
BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace],OpenMode.ForWrite);
BlockReference br = new BlockReference(new Point3d(0, 10, 0), CreateEmployeeDefinition()); //新建个3D型的椭圆
btr.AppendEntity(br);
trans.AddNewlyCreatedDBObject(br, true);//让事务知道你在cad当中新建了个椭圆
Xrecord xRec = new Xrecord();
xRec.Data = new ResultBuffer(
new TypedValue((int)DxfCode.Text, "我爱中国11"),
new TypedValue((int)DxfCode.Real, 72000),
new TypedValue((int)DxfCode.Text, "Sales"));
br.CreateExtensionDictionary();
DBDictionary brExtDict = (DBDictionary)trans.GetObject(br.ExtensionDictionary, OpenMode.ForWrite, false);
brExtDict.SetAt("EmployeeData", xRec);
trans.AddNewlyCreatedDBObject(xRec, true);
trans.Commit();
}
catch(System.Exception e)
{
ed.WriteMessage("程序有错:" + e.Message);
}
}
}
}
using System;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.Colors;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
[assembly: CommandClass(typeof(CsMgdAcad7.Class1))] //在运行autocad的同时加载Class1程序
namespace CsMgdAcad7
{
class Class1
{
public Class1()
{
}
private ObjectId CreateEmployeeDefinition()
{
ObjectId newBtrId = new ObjectId(); //定义一个objectid的对象作为返回值
Database db = HostApplicationServices.WorkingDatabase; //获得当前工作空间的数据库
using (Transaction trans = db.TransactionManager.StartTransaction()) //开始事务
{
BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForWrite);
if (bt.Has("em"))
{
newBtrId = bt["em"];
}
else
{
Point3d center = new Point3d(10, 10, 10);
//圆
Circle circle = new Circle(center,Vector3d.ZAxis,2);
//多文本
MText text=new MText();
text.Contents = "我爱中国人";
text.Location = center;
//椭圆
Ellipse ellipse = new Ellipse(center,Vector3d.ZAxis,new Vector3d(3,0,0),0.5,0,0);
ObjectId empId = CreateLayer();
text.LayerId = empId;
circle.LayerId = empId;
ellipse.LayerId = empId;
text.ColorIndex = 2;
circle.ColorIndex = 3;
ellipse.ColorIndex = 1;
BlockTableRecord newBtr = new BlockTableRecord();
newBtr.Name = "em";
newBtrId = bt.Add(newBtr);
trans.AddNewlyCreatedDBObject(newBtr, true); //让事务知道你在cad当中添加了块表
newBtr.AppendEntity(circle); //在cad当中输出圆
newBtr.AppendEntity(text);//在cad当中输出多文本
newBtr.AppendEntity(ellipse);//在cad当中输出椭圆
trans.AddNewlyCreatedDBObject(circle, true); //让事务知道你在cad当中添加了圆
trans.AddNewlyCreatedDBObject(text, true);//让事务知道你在cad当中添加了多文本
trans.AddNewlyCreatedDBObject(ellipse, true);//让事务知道你在cad当中添加了椭圆
trans.Commit(); //提交数据
}
}
CreateDivision(); //建立职工词典
return newBtrId;
}
private void CreateDivision()
{
Database db = HostApplicationServices.WorkingDatabase;
using (Transaction trans = db.TransactionManager.StartTransaction())
{
DBDictionary NOD = (DBDictionary)trans.GetObject(db.NamedObjectsDictionaryId, OpenMode.ForWrite);
DBDictionary acmeDict;
try
{
acmeDict = (DBDictionary)trans.GetObject(NOD.GetAt("ACME_DIVISION"), OpenMode.ForRead);
}
catch
{
acmeDict = new DBDictionary();
NOD.SetAt("ACME_DIVISION", acmeDict);
trans.AddNewlyCreatedDBObject(acmeDict, true);
}
DBDictionary divDict;
try
{
divDict = (DBDictionary)trans.GetObject(acmeDict.GetAt("Sales"), OpenMode.ForWrite);
}
catch
{
divDict = new DBDictionary();
acmeDict.UpgradeOpen();
acmeDict.SetAt("Sales", divDict);
trans.AddNewlyCreatedDBObject(divDict, true);
}
Xrecord mgrXRec;
try
{
mgrXRec = (Xrecord)trans.GetObject(divDict.GetAt("Department Manager"), OpenMode.ForWrite);
}
catch
{
mgrXRec = new Xrecord();
mgrXRec.Data = new ResultBuffer(new TypedValue((int)DxfCode.Text, "Randolph P. Brokwell"));
divDict.SetAt("Department Manager", mgrXRec);
trans.AddNewlyCreatedDBObject(mgrXRec, true);
}
trans.Commit();
}
}
private ObjectId CreateLayer()
{
ObjectId layerId;
Database db = HostApplicationServices.WorkingDatabase;
using (Transaction trans = db.TransactionManager.StartTransaction())
{
//获得layer表...
LayerTable lt = (LayerTable)trans.GetObject(db.LayerTableId, OpenMode.ForRead);
//Check if EmployeeLayer exists...
if (lt.Has("em"))
{
layerId = lt["em"];
}
else
{
//否则,创建个layer.
LayerTableRecord ltr = new LayerTableRecord();
ltr.Name = "em"; // 设置layer名称
ltr.Color = Color.FromColorIndex(ColorMethod.ByAci, 2);
// 将读的形式更新为写的形式
lt.UpgradeOpen();
layerId = lt.Add(ltr);
trans.AddNewlyCreatedDBObject(ltr, true);
}
trans.Commit();
}
return layerId;
}
[CommandMethod("CREATE")]
public void CreateEmployee()
{
Database db = HostApplicationServices.WorkingDatabase; //获得当前工作空间的数据库
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; //获得文档编辑
using(Transaction trans=db.TransactionManager.StartTransaction()) //使用事务获取数据库对象
try
{
BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForWrite); //首先取得层表
BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace],OpenMode.ForWrite);
BlockReference br = new BlockReference(new Point3d(0, 10, 0), CreateEmployeeDefinition()); //新建个3D型的椭圆
btr.AppendEntity(br);
trans.AddNewlyCreatedDBObject(br, true);//让事务知道你在cad当中新建了个椭圆
Xrecord xRec = new Xrecord();
xRec.Data = new ResultBuffer(
new TypedValue((int)DxfCode.Text, "我爱中国11"),
new TypedValue((int)DxfCode.Real, 72000),
new TypedValue((int)DxfCode.Text, "Sales"));
br.CreateExtensionDictionary();
DBDictionary brExtDict = (DBDictionary)trans.GetObject(br.ExtensionDictionary, OpenMode.ForWrite, false);
brExtDict.SetAt("EmployeeData", xRec);
trans.AddNewlyCreatedDBObject(xRec, true);
trans.Commit();
}
catch(System.Exception e)
{
ed.WriteMessage("程序有错:" + e.Message);
}
}
}
}
里面加了点注释。对于cad的二次开发还处于模糊当中,还在努力学习中。迫切需要人来一起交流。
0 评论:
发表评论