乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 241|回复: 12

[原创]用C#体会自定义实体的强大(2010年6月21日更新)

[复制链接]

46

主题

261

帖子

8

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
445
发表于 2010-5-23 14:29:00 | 显示全部楼层 |阅读模式
自定义实体一直是ARX专利(现在还是),但我们还是可以在C#中体会它的强大。运行前请引用附件中的DLL,运行环境: 2008。
2010年6月21日更新:添加了一个新的DLL,可用于CAD2010及以上版本。
  1. using System;
  2. using Autodesk.ahlzl;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.EditorInput;
  6. using Autodesk.AutoCAD.Geometry;
  7. using Autodesk.AutoCAD.Runtime;
  8. namespace CS_调用
  9. {
  10.     public class Class1
  11.     {
  12.         [CommandMethod("T1")] // 创建自定义实体
  13.         public void Test1()
  14.         {
  15.             Mgtriangle ent = new Mgtriangle();
  16.             ent.Direction = Vector3d.XAxis;
  17.             ent.CrankAngle = Math.PI / 6;
  18.             ent.CrankCenPt = new Point3d(100.0, 0.0, 0.0);
  19.             ent.CrankRadius = 10.0;
  20.             ent.LinkLength = 30.0;
  21.             ent.PistonSize = 5.0;
  22.             AppendEntity(ent);
  23.         }
  24.         [CommandMethod("T2")] // 编辑自定义实体
  25.         public void Test2()
  26.         {
  27.             Database db = HostApplicationServices.WorkingDatabase;
  28.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  29.             PromptEntityOptions opt = new PromptEntityOptions("\n请选择Mgtriangle自定义实体");
  30.             opt.SetRejectMessage("您选择的不是Mgtriangle自定义实体,请重新选择!");
  31.             opt.AddAllowedClass(typeof(Mgtriangle), true);
  32.             PromptEntityResult res = ed.GetEntity(opt);
  33.             if (res.Status != PromptStatus.OK)
  34.             {
  35.                 return;
  36.             }
  37.             using (Transaction trans = db.TransactionManager.StartTransaction())
  38.             {
  39.                 Mgtriangle ent = (Mgtriangle)trans.GetObject(res.ObjectId, OpenMode.ForWrite);
  40.                 ed.WriteMessage("\n您选择的对象是:" + ent.GetType().Name + ", 请您添加代码修改自定义实体!");
  41.             }   
  42.         }
  43.         private ObjectId AppendEntity(Entity ent)
  44.         {
  45.             ObjectId entId;
  46.             Database db = HostApplicationServices.WorkingDatabase;
  47.             using (Transaction trans = db.TransactionManager.StartTransaction())
  48.             {
  49.                 BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId,
  50.                     OpenMode.ForRead);
  51.                 BlockTableRecord btr = (BlockTableRecord)trans.GetObject
  52.                     (bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  53.                 entId = btr.AppendEntity(ent);
  54.                 trans.AddNewlyCreatedDBObject(ent, true);
  55.                 trans.Commit();
  56.             }
  57.             return entId;
  58.         }
  59.     }
  60. }

hrcz3tdahvn.JPG

hrcz3tdahvn.JPG


本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

0

主题

1

帖子

1

银币

初来乍到

Rank: 1

铜币
1
发表于 2019-11-19 08:50:00 | 显示全部楼层

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

使用道具 举报

0

主题

1

帖子

1

银币

初来乍到

Rank: 1

铜币
1
发表于 2019-10-15 17:42:00 | 显示全部楼层
不错  支持一下
回复

使用道具 举报

11

主题

20

帖子

2

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
64
发表于 2019-10-29 21:34:00 | 显示全部楼层
为什么没有后续的更新了
回复

使用道具 举报

13

主题

53

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
105
发表于 2010-5-23 15:31:00 | 显示全部楼层
老卢,牛啊!
重定义要做的像自定义一样强大就好了
回复

使用道具 举报

21

主题

97

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
181
发表于 2010-5-23 15:38:00 | 显示全部楼层
好东西,下来学习一下.
回复

使用道具 举报

46

主题

261

帖子

8

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
445
发表于 2010-5-23 15:38:00 | 显示全部楼层
这是一个“子实体”例子,各部分颜色不同,拖动夹点时的效果很爽。
另,感觉重定义也能搞出这效果。
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2010-5-23 20:09:00 | 显示全部楼层
重定义确实可以实现,不过属性框里显示的还是原实体
想办法把Cad的属性框用自己的偷换掉,应该就差不多了,呵呵
回复

使用道具 举报

46

主题

261

帖子

8

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
445
发表于 2010-5-23 20:28:00 | 显示全部楼层
这是学习SDK(\entity\SimpleSquare)的成果,以前没解决的问题是:Mgtriangle ent = (Mgtriangle)trans.GetObject(res.ObjectId, OpenMode.ForWrite);转换会失败(小狼也碰到过类似的情况)。
回复

使用道具 举报

10

主题

16

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
56
发表于 2010-5-25 21:43:00 | 显示全部楼层
老兄,能提供自定义实体的代码吗。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2024-11-22 02:13 , Processed in 0.381209 second(s), 89 queries .

© 2020-2024 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表