ObjectArx创建自定义实体

ObjectArx创建自定义实体


一。目的
在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)绘制你的自定义实体:
void AcDbMyEntity::MyEntityShell(AcGiWorldDraw *mode, const AcGePoint3d &ptBase, INT32 xLen, INT32 yLen, INT32 zLen)
{const INT32 POINT_COUNT = 8;AcGePoint3d ptList[POINT_COUNT] = {};INT32 index = 0;ptList[index++].set(ptBase[X],			ptBase[Y],			ptBase[Z]);ptList[index++].set(ptBase[X] + xLen,	ptBase[Y],			ptBase[Z]);ptList[index++].set(ptBase[X] + xLen,	ptBase[Y] + yLen,	ptBase[Z]);ptList[index++].set(ptBase[X],			ptBase[Y] + yLen,	ptBase[Z]);ptList[index++].set(ptBase[X],			ptBase[Y],			ptBase[Z] + zLen);ptList[index++].set(ptBase[X] + xLen,	ptBase[Y],			ptBase[Z] + zLen);ptList[index++].set(ptBase[X] + xLen,	ptBase[Y] + yLen,	ptBase[Z] + zLen);ptList[index++].set(ptBase[X],			ptBase[Y] + yLen,	ptBase[Z] + zLen);Adesk::Int32 faceList[] = {4, 0, 1, 2, 3,4, 4, 5, 6, 7,4, 0, 1, 5, 4,4, 1, 2, 6, 5,4, 2, 3, 7, 6,4, 3, 0, 4, 7,};INT32 faceLen = sizeof(faceList) / sizeof(faceList[0]);AcGiFaceData faceData;INT32 baseColor = 10;INT32 incColor = 30;short colors[] = {(baseColor += incColor),(baseColor += incColor),(baseColor += incColor),(baseColor += incColor),(baseColor += incColor),(baseColor += incColor)};faceData.setColors(colors);mode->geometry().shell(POINT_COUNT, ptList, faceLen, faceList, NULL, &faceData);
}

这里我采用的是shell(),当然mesh()也是可以的,简单说一下这个函数,如facelist
第一组属性,{4,0,1,2,3,****}
第一个数字4表明此面是由4个点组成,后面0,1,2,3是ptList中点的索引,由此4点组
成一个面,后面几组数值以此类推!
3)支持二维三维显示:
Adesk::Boolean AcDbMyEntity::subWorldDraw (AcGiWorldDraw *mode) {assertReadEnabled () ;INT32 xBase = m_ptBase[X];INT32 yBase = m_ptBase[Y];INT32 zBase = m_ptBase[Z];INT32 xLen = m_len3D[X];INT32 yLen = m_len3D[Y];INT32 zLen = m_len3D[Z];switch (mode->regenType()){case kAcGiStandardDisplay:{const INT32 POINT_COUNT = 5;AcGePoint3d ptList[POINT_COUNT] = {};INT32 index = 0;ptList[index++].set(xBase,			yBase,			zBase);ptList[index++].set(xBase + xLen,	yBase,			zBase);ptList[index++].set(xBase + xLen,	yBase + yLen,	zBase);ptList[index++].set(xBase,			yBase + yLen,	zBase);ptList[index].set(xBase,			yBase,			zBase);mode->geometry().polyline(POINT_COUNT, ptList);m_enShowMode = en2D;}break;;case eAcGiRegenTypeInvalid:case kAcGiHideOrShadeCommand:case kAcGiRenderCommand:case kAcGiForExplode:case kAcGiSaveWorldDrawForProxy:{MyEntityShell(mode, m_ptBase, xLen, yLen, zLen);}default:break;;		}return (AcDbEntity::subWorldDraw (mode)) ;
}

四。效果截图:
1)三维实体,每一面都有特定颜色,可以简单的加宽

2)二维显示,只显示底面

3)编辑二维下的长宽

五。源码地址:
http://download.csdn.net/detail/u012158162/9797021

六。后记
浮名本事身外物,不着方寸也风流 ---香独秀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/447637.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开车人千金难买的知识!(组图)

开车的人千金难买的知识: 前言: 一、 发动机是怎样被您自己开坏的 二、 变速箱是怎样被您自己开坏的 三、 排水口(很重要您肯定不知道的) 四、 离合 五、 水箱 六、 方向助力 七、 空调 八、底盘 九、爱车是如何被自己撞坏的&#x…

如何在 IDEA 启动多个 Spring Boot 工程实例

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 一个工程启动多个实例,分别占用不同的端口。 step 1 在IDEA上点击Application右边的下三角 ,弹出选项后,点击Ed…

重启 docker 服务、Docker 重启

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. 我的情况 :重启阿里云 ECS 服务器后,一切服务都停止了。 重启 XXX 服务通用命令:service xxx re…

linux 查看 CPU 使用率

1:top 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 top -bn 1 -i -c top命令可以看到总体的系统运行状态和cpu使用效率 %us: 表示用户空间程序的cpu使用效率 %sy:表示…

解决: service endpoint with name xxx already exists ( docker 已删除的容器却依旧存在)

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. 启动服务报错如题 确认 我已经 docker rm -f XXX 了。也确认 各个容器端口并不重复。 重新启动容器服务依旧报错: 粗…

解决:There was an unexpected error (type=Internal Server Error,..). No instances available for XXX

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1.我的情况: 实践 springCloud , 启动了注册中心 eureka、也启动了 服务生产者、服务消费者。 eureka 端口: 1…

springCloud - 第3篇 - 消费者调用服务 ( RestTemplate + Ribbon )

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 一、新建 ribbon 工程: 1. file - new - module 2. spring Initializr - module SDK 选择自己的 JDK ,其余的可…

延长汽车使用寿命,抛弃六大用车坏习惯

汽车使用越来越普及,因为用车习惯问题导致汽车寿命减短,因错误用车习惯导致伤车、损车的例子比比皆是。而用车习惯得当与否,直接关系到汽车的使用寿命。例如发动机,如果保养得当,开50万~60万公里都没问题。汽车使用越来…

解决:Whitelabel Error Page This application has no explicit mapping for /error...UnknownHostException

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. 我的情况 : springcloud 实践,启动 ribbon 工程后,请求接口报错: Whitelabel Error…

springCloud - 第4篇 - 消费者调用服务 ( Feign )

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 一、新建 ribbon 工程: 1. file - new - module 2. spring Initializr - module SDK 选择自己的 JDK ,其余的可…

使用 idea 创建第一个 springboot 项目

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 如今springboot越来越火,越来越多的公司选择使用springboot作为项目的开发框架,其设计目的就是用来简化spring项…

坚持步行的惊人效果,网上被疯狂转载!

俗话说,人老腿先老。由于人体2/3的肌肉集中在下半身,所以六十多岁的人可以有年轻人七成的握力和臂力,但下半身力量却只剩下四成。不过,大家也不必担心。最近,包括以色列、美国在内的科学家们发现,温和地健步…

springCloud - 第5篇 - 断路器 Hystrix ( Feign 、Ribbon )

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 一、为什么要有熔断 在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RP…

springCloud - 第6篇 - 网关的实现:ZUUL

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 在Spring Cloud 微服务系统中,一种常见的负载均衡方式是,客户端的请求首先经过负载均衡(zuul、Ngnix…

亚特兰大峰会精彩看点:软件吞噬世界,OpenStack是变革核心

摘要:5月12日早9点,OpenStack Atlanta峰会在超过90家赞助厂商和4500名参会者的陪伴下拉开了序幕。Jonathan Bryce特别提出了Superuser和Marketplace两个新概念,软件正在吞噬整个世界,OpenStack是这场变革的核心。 第一天精彩看点…

解决: Gitee 自已提交的代码提交人头像为他人、码云上独自开发的项目显示为 2 个开发者

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. 我的情况 : 项目一直只有我一个开发者,却莫名的出来了一个完全不认识的开发者,我新建后 push 的…

为什么有些语言会比别的快?

摘要:为什么有些语言比别的快:JIT与字节码的使用,带来了Java和C#这样介于前两者之间的中间选择;编译型语言比解释型快,引入的间接层越多,速度越慢;语言设施上的投入力度;语言本身的设…

解决:idea - maven project 中 jar 报红线

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. 如图: 2. 找到报红线的工程,执行 mvn clean后,再 mvn install 。这样会从私服重新拉取 jar 。 …

springCloud - 第7篇 - 配置文件管理中心 ( SpringCloud Config )

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 一、简介 分布式的系统往往有多个服务,会有不同的配置文件。 不同环境配置文件内容也各不相同: 开发环境、测试…

springCloud - 第8篇 - 配置文件管理中心 - 集群模式(负载匀衡)使用

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 当微服务系统中 应用服务有很多时(serviceA 、serviceB ...),会都从同一个配置中心读取配置文件。此…