[原创]用C#体会自定义实体的强大(2010年6月21日更新)
自定义实体一直是ARX专利(现在还是),但我们还是可以在C#中体会它的强大。运行前请引用附件中的DLL,运行环境: 2008。2010年6月21日更新:添加了一个新的DLL,可用于CAD2010及以上版本。using System;
using Autodesk.ahlzl;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
namespace CS_调用
{
public class Class1
{
// 创建自定义实体
public void Test1()
{
Mgtriangle ent = new Mgtriangle();
ent.Direction = Vector3d.XAxis;
ent.CrankAngle = Math.PI / 6;
ent.CrankCenPt = new Point3d(100.0, 0.0, 0.0);
ent.CrankRadius = 10.0;
ent.LinkLength = 30.0;
ent.PistonSize = 5.0;
AppendEntity(ent);
}
// 编辑自定义实体
public void Test2()
{
Database db = HostApplicationServices.WorkingDatabase;
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
PromptEntityOptions opt = new PromptEntityOptions("\n请选择Mgtriangle自定义实体");
opt.SetRejectMessage("您选择的不是Mgtriangle自定义实体,请重新选择!");
opt.AddAllowedClass(typeof(Mgtriangle), true);
PromptEntityResult res = ed.GetEntity(opt);
if (res.Status != PromptStatus.OK)
{
return;
}
using (Transaction trans = db.TransactionManager.StartTransaction())
{
Mgtriangle ent = (Mgtriangle)trans.GetObject(res.ObjectId, OpenMode.ForWrite);
ed.WriteMessage("\n您选择的对象是:" + ent.GetType().Name + ", 请您添加代码修改自定义实体!");
}
}
private ObjectId AppendEntity(Entity ent)
{
ObjectId entId;
Database db = HostApplicationServices.WorkingDatabase;
using (Transaction trans = db.TransactionManager.StartTransaction())
{
BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId,
OpenMode.ForRead);
BlockTableRecord btr = (BlockTableRecord)trans.GetObject
(bt, OpenMode.ForWrite);
entId = btr.AppendEntity(ent);
trans.AddNewlyCreatedDBObject(ent, true);
trans.Commit();
}
return entId;
}
}
}
**** Hidden Message *****
因为获取的是数据库文档,类型不统一,所以需要强制转换类型 不错支持一下 为什么没有后续的更新了 老卢,牛啊!
重定义要做的像自定义一样强大就好了
好东西,下来学习一下. 这是一个“子实体”例子,各部分颜色不同,拖动夹点时的效果很爽。
另,感觉重定义也能搞出这效果。
重定义确实可以实现,不过属性框里显示的还是原实体
想办法把Cad的属性框用自己的偷换掉,应该就差不多了,呵呵
这是学习SDK(\entity\SimpleSquare)的成果,以前没解决的问题是:Mgtriangle ent = (Mgtriangle)trans.GetObject(res.ObjectId, OpenMode.ForWrite);转换会失败(小狼也碰到过类似的情况)。 老兄,能提供自定义实体的代码吗。
页:
[1]
2