ahlzl 发表于 2010-5-23 14:29:00

[原创]用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 *****

15054487766 发表于 2019-11-19 08:50:00


因为获取的是数据库文档,类型不统一,所以需要强制转换类型

xiaolinzi666 发表于 2019-10-15 17:42:00

不错支持一下

panshuai2046 发表于 2019-10-29 21:34:00

为什么没有后续的更新了

小狼 发表于 2010-5-23 15:31:00

老卢,牛啊!
重定义要做的像自定义一样强大就好了

yxr_MJTD 发表于 2010-5-23 15:38:00

好东西,下来学习一下.

ahlzl 发表于 2010-5-23 15:38:00

这是一个“子实体”例子,各部分颜色不同,拖动夹点时的效果很爽。
另,感觉重定义也能搞出这效果。

雪山飞狐_lzh 发表于 2010-5-23 20:09:00

重定义确实可以实现,不过属性框里显示的还是原实体
想办法把Cad的属性框用自己的偷换掉,应该就差不多了,呵呵

ahlzl 发表于 2010-5-23 20:28:00

这是学习SDK(\entity\SimpleSquare)的成果,以前没解决的问题是:Mgtriangle ent = (Mgtriangle)trans.GetObject(res.ObjectId, OpenMode.ForWrite);转换会失败(小狼也碰到过类似的情况)。

flydyt 发表于 2010-5-25 21:43:00

老兄,能提供自定义实体的代码吗。
页: [1] 2
查看完整版本: [原创]用C#体会自定义实体的强大(2010年6月21日更新)