源地址:https://blog.csdn.net/u012158162/article/details/67644392

一。目的
在ObjectArx中已经有了许多实体,如AcDbLine,AcDbCircle,AcDbArc等,
但在用户使用Cad时,会有一些对他们来讲常用的“实体“,如一扇门,如
果我们能提供一个“门实体“,让用户能向添加直线一样方便,相信用户是
很乐意接受由此功能的软件!这是,我们为这个“门“就相当于一个自定
义实体”!(PS:希望没理解错)!
本文将介绍创建一个长方体的自定义实体,支持简单的编辑以及二维,三维
显示!
二。相关知识储备
1)既然是自定义实体,那你就必须将其显示出来,来告诉用户你的
自定义实体“长”什么样子,如下函数:(与MFC中的OnPaint()有点相似)
virtual Adesk::Boolean subWorldDraw (AcGiWorldDraw *mode) ;扩
可以看出这是一个虚函数,由父类AcDbEntity继承而来,并且绝对需要你
重写的函数,与之类似的还有其他几个从父类继承而来的虚函数,理论上都
需要重写!
2)由于这里需要绘制长方体,就涉及到面的绘制,可以用到以下二个函数
(二者择其一即可完成面的绘制)
    virtual Adesk::Boolean  mesh(const Adesk::UInt32 rows,
                                 const Adesk::UInt32 columns,
                                 const AcGePoint3d* pVertexList,
                                 const AcGiEdgeData* pEdgeData = NULL,
                                 const AcGiFaceData* pFaceData = NULL,
                                 const AcGiVertexData* pVertexData = NULL,
                                 const bool bAutoGenerateNormals = true
                                 ) const = 0;

virtual Adesk::Boolean  shell(const Adesk::UInt32 nbVertex,
                                 const AcGePoint3d* pVertexList,
                                 const Adesk::UInt32 faceListSize,
                                 const Adesk::Int32* pFaceList,
                                 const AcGiEdgeData* pEdgeData = NULL,
                                 const AcGiFaceData* pFaceData = NULL,
                                 const AcGiVertexData* pVertexData = NULL,
                                 const struct resbuf* pResBuf = NULL,
                                 const bool bAutoGenerateNormals = true
                                 ) const = 0;

3 )需要获取当前用户采取什么模式预览:
    virtual AcGiRegenType           regenType() const = 0;
还回值为枚举型
三。实现流程
1)首先创建一个继承自AcDbEntity的自定义实体类,将几个必须由自定义
实体 类 实现的虚函数声明!
2)绘制你的自定义实体:
[cpp]  view plain  copy
  1. void AcDbMyEntity::MyEntityShell(AcGiWorldDraw *mode, const AcGePoint3d &ptBase, INT32 xLen, INT32 yLen, INT32 zLen)
  2. {
  3. const INT32 POINT_COUNT = 8;
  4. AcGePoint3d ptList[POINT_COUNT] = {};
  5. INT32 index = 0;
  6. ptList[index++].set(ptBase[X],          ptBase[Y],          ptBase[Z]);
  7. ptList[index++].set(ptBase[X] + xLen,   ptBase[Y],          ptBase[Z]);
  8. ptList[index++].set(ptBase[X] + xLen,   ptBase[Y] + yLen,   ptBase[Z]);
  9. ptList[index++].set(ptBase[X],          ptBase[Y] + yLen,   ptBase[Z]);
  10. ptList[index++].set(ptBase[X],          ptBase[Y],          ptBase[Z] + zLen);
  11. ptList[index++].set(ptBase[X] + xLen,   ptBase[Y],          ptBase[Z] + zLen);
  12. ptList[index++].set(ptBase[X] + xLen,   ptBase[Y] + yLen,   ptBase[Z] + zLen);
  13. ptList[index++].set(ptBase[X],          ptBase[Y] + yLen,   ptBase[Z] + zLen);
  14. Adesk::Int32 faceList[] = {4, 0, 1, 2, 3,
  15. 4, 4, 5, 6, 7,
  16. 4, 0, 1, 5, 4,
  17. 4, 1, 2, 6, 5,
  18. 4, 2, 3, 7, 6,
  19. 4, 3, 0, 4, 7,
  20. };
  21. INT32 faceLen = sizeof(faceList) / sizeof(faceList[0]);
  22. AcGiFaceData faceData;
  23. INT32 baseColor = 10;
  24. INT32 incColor = 30;
  25. short colors[] = {(baseColor += incColor),
  26. (baseColor += incColor),
  27. (baseColor += incColor),
  28. (baseColor += incColor),
  29. (baseColor += incColor),
  30. (baseColor += incColor)};
  31. faceData.setColors(colors);
  32. mode->geometry().shell(POINT_COUNT, ptList, faceLen, faceList, NULL, &faceData);
  33. }
这里我采用的是shell(),当然mesh()也是可以的,简单说一下这个函数,
如facelist 第一组属性,{4,0,1,2,3,****}
第一个数字4表明此面是由4个点组成,后面0,1,2,3是ptList中点的索引,由
此4点组 成一个面,后面几组数值以此类推!
3)支持二维三维显示:
[cpp]  view plain  copy
  1. Adesk::Boolean AcDbMyEntity::subWorldDraw (AcGiWorldDraw *mode) {
  2. assertReadEnabled () ;
  3. INT32 xBase = m_ptBase[X];
  4. INT32 yBase = m_ptBase[Y];
  5. INT32 zBase = m_ptBase[Z];
  6. INT32 xLen = m_len3D[X];
  7. INT32 yLen = m_len3D[Y];
  8. INT32 zLen = m_len3D[Z];
  9. switch (mode->regenType())
  10. {
  11. case kAcGiStandardDisplay:
  12. {
  13. const INT32 POINT_COUNT = 5;
  14. AcGePoint3d ptList[POINT_COUNT] = {};
  15. INT32 index = 0;
  16. ptList[index++].set(xBase,          yBase,          zBase);
  17. ptList[index++].set(xBase + xLen,   yBase,          zBase);
  18. ptList[index++].set(xBase + xLen,   yBase + yLen,   zBase);
  19. ptList[index++].set(xBase,          yBase + yLen,   zBase);
  20. ptList[index].set(xBase,            yBase,          zBase);
  21. mode->geometry().polyline(POINT_COUNT, ptList);
  22. m_enShowMode = en2D;
  23. }
  24. break;;
  25. case eAcGiRegenTypeInvalid:
  26. case kAcGiHideOrShadeCommand:
  27. case kAcGiRenderCommand:
  28. case kAcGiForExplode:
  29. case kAcGiSaveWorldDrawForProxy:
  30. {
  31. MyEntityShell(mode, m_ptBase, xLen, yLen, zLen);
  32. }
  33. default:
  34. break;;
  35. }
  36. return (AcDbEntity::subWorldDraw (mode)) ;
  37. }
四。效果截图:
1)三维实体,每一面都有特定颜色,可以简单的加宽
2)二维显示,只显示底面
3)编辑二维下的长宽
五。源码地址:
http://download.csdn.net/detail/u012158162/9797021
六。后记
浮名本事身外物,不着方寸也风流---香独秀

ObjectARX第一课:创建自定义实体相关推荐

  1. ObjectArx创建自定义实体

    ObjectArx创建自定义实体 一.目的 在ObjectArx中已经有了许多实体,如AcDbLine,AcDbCircle,AcDbArc等,但在用户使用Cad时,会有一些对他们来讲常用的" ...

  2. 利用c语言在屏幕上画出窗口,第一课:创建一个windows窗口

    跟我一起学图形编程                               作者:姚明联系方式: 欢迎使用我的图形学教程.我是计算机专业的学生,对图形图像技术有浓厚的兴趣,就读期间广泛的涉及相关知 ...

  3. Python入门到精通三天速成第一讲——创建自定义类

    class Person:def set_name(self, name):self.name = namedef get_name(self):return self.namedef greet(s ...

  4. ObjectARX简单自定义实体的实现

    目录 1. ObjectARX向导(Wizard)的安装 2. 创建自定义实体工程CustomStair 3. 添加实体类 3.1 利用向导添加自定义类 3.2 "初始化"自定义类 ...

  5. 专题---自定义实体类

    目录 一.概述 二.项目初始化 2.1 创建空解决方案 2.2 DBX操作 2.2.1 创建DBX 2.2.2 调试DBX 2.2.3 创建实体类 2.2.4 调试实体类 2.3 ARX操作 2.3. ...

  6. 掌握 ASP.NET 之路:自定义实体类简介

    发布日期 : 5/24/2005| 更新日期 : 5/24/2005 Karl Seguin Microsoft Corporation 摘要:有些情况下,非类型化的 DataSet 可能并非数据操作 ...

  7. 掌握 ASP.NET 之路:自定义实体类简介 来源 :msdn

    ADODB.RecordSet 和常常被遗忘的 MoveNext 的时代已经过去,取而代之的是 Microsoft ADO.NET 强大而又灵活的功能.我们的新武器就是 System.Data 名称空 ...

  8. ObjectARX C++自定义实体

    ObjectARX C++自定义实体 实现流程 首先创建一个继承自AcDbEntity的自定义实体类,重写几个虚函数方法: .从AcDbEntity类中重载几个必须的虚函数: virtual Ades ...

  9. ObjectARX自定义实体

    说明: 此次绘制的CAD自定义实体是一个矩形,具有拉伸功能.因为初次接触自定义实体,在一次次制作的过程中遇到了很多困难,幸好有老大和同事的帮助,当然还有广大网友们的文章协助,才完成了这个自定义实体的绘 ...

最新文章

  1. java 集合 接口_Java集合之Collection接口
  2. js通过正则表达式解析xml 获取指定的内容
  3. 清华大学施路平:双脑驱动的人工通用智能
  4. mysql 存储过程无效_用VC通过DLL包连接MySQL,执行存储过程后,再执行其他查询无效?解决方法...
  5. OGNL探秘之一:数据转换的乐园
  6. windows中使用scrapyd遇到的问题
  7. 学习笔记4 :opencv 、PIL、matplotlib.image打开、保存图片
  8. GPU架构(三十三)
  9. 全面掌握ping命令(四)ping命令常用参数
  10. 虚拟打印机可以设置默认保存路径吗
  11. matlab锁相放大器,锁相放大器原理和模块实现与仿真.DOC
  12. HTMl账号密码登录跳转下一个页面问题/网页输入正确的账号面膜登录下一个界面/PHP网页禁止某个链接直链访问
  13. 【常识】气体单位%Vol、ppm、%LEL
  14. 录屏存储为gif图片
  15. notepad编译java文件_notepad编译java
  16. Linux后端开发-POSIX标准以及shell编程
  17. LaTeX的一般图文混排介绍
  18. MySQL——VARCHAR和CHAR类型
  19. 输出N阶方阵 ,输出该方阵及方阵主对角线的总和
  20. 基于java的坦克大战游戏系统毕业设计-5.0(论文设计+源码+PPT答辩).rar

热门文章

  1. 儿知错父之过下一句_“子不孝父之过”下一句是什么?
  2. 如何打开SQL Server(MSSQLSERVER)
  3. qiskit学习——建立你的第一个量子算法:量子隐形传态
  4. 基于Scrapy爬取伯乐在线网站
  5. siege 用户登录_Siege详解
  6. SweetAlert 插件
  7. 神探Python程序员,带你千里捉小三!
  8. azkaban简介及azkaban部署、原理和使用介绍
  9. 985高校发布讣告:终年43岁!本月已有3位年轻教师去世…
  10. 人口数据集:地级市常住人口与户籍人口、人口1%抽样调查数据两大维度指标数据