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.pswp.cn/news/447637.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447637.shtml
英文地址,請注明出處:http://en.pswp.cn/news/447637.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

開車人千金難買的知識!(組圖)

開車的人千金難買的知識: 前言: 一、 發動機是怎樣被您自己開壞的 二、 變速箱是怎樣被您自己開壞的 三、 排水口(很重要您肯定不知道的) 四、 離合 五、 水箱 六、 方向助力 七、 空調 八、底盤 九、愛車是如何被自己撞壞的&#x…

如何在 IDEA 啟動多個 Spring Boot 工程實例

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 一個工程啟動多個實例,分別占用不同的端口。 step 1 在IDEA上點擊Application右邊的下三角 ,彈出選項后,點擊Ed…

安裝micro/go-micro

創建文件夾,拉取相關包 mkdir golang.org cd golang.org mkdir x cd x git clone https://github.com/golang/net.git git clone https://github.com/golang/crypto.git git clone https://github.com/golang/sys.git git clone https://github.com/golang/…

剎車八個技巧 教你踩得又穩又好

駕車加速行駛,這是誰都可以做到的。但是如果我們不能夠正確地操作剎車,汽車有可能在一瞬間變成事故的兇器,因此,也許我們可以說剎車技術是駕駛汽車的境界之一。以下為大家列舉八種剎車技巧,如果全部掌握的話&#xff0…

springcloud 注解 @EnableDiscoveryClient 與 @EnableEurekaClient 的區別

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 在使用 Spring Cloud feign 服務發現時提到兩種注解: EnableDiscoveryClient、EnableEurekaClient 。 spring cloud 中 disc…

開車路上怎樣趕走瞌睡蟲?網友支招如何防路困

春困秋乏,秋天時不時來個哈欠打個盹也是人之常情,可是如果您正在路上開車可就是危險之極的事情了!要知道,這在路上開快車不是最危險的,最危險的是走神,而打瞌睡更是要命的!可這打瞌睡是身體疲乏…

重啟 docker 服務、Docker 重啟

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1. 我的情況 :重啟阿里云 ECS 服務器后,一切服務都停止了。 重啟 XXX 服務通用命令:service xxx re…

25歲肥胖!美研究:晚年恐出現病態肥胖

如果您現在剛好25歲,最好注意一下現在的體重,因為美國紐約大學最新研究發現,如果在25歲這個年齡,您的體重是超重的,10年后肥胖的機率會比較高,男生恐怕高到23.1%,女生高到46.9%,而年…

linux 查看 CPU 使用率

1:top 前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 top -bn 1 -i -c top命令可以看到總體的系統運行狀態和cpu使用效率 %us: 表示用戶空間程序的cpu使用效率 %sy:表示…

新研究:長壽又健康的秘訣

最近對南加州一個退休社區,成千上萬90歲以上者的一項具有里程碑意義的研究,指出了長壽的可能因素。吸煙致使壽命縮短,運動使人活得更長。即使從事非運動的方式,保持活躍的生活,也會延長壽命。肥胖不好,但過…

解決: service endpoint with name xxx already exists ( docker 已刪除的容器卻依舊存在)

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1. 啟動服務報錯如題 確認 我已經 docker rm -f XXX 了。也確認 各個容器端口并不重復。 重新啟動容器服務依舊報錯: 粗…

廣州駕考科目三電子考16日全面啟動

駕考科目三人工考“短暫復出” 增加13天過渡期,16日全面啟動電子考 南方日報訊(記者/趙琦玉 通訊員/交宣)昨日,廣州駕考科目三電子考試新政在實施2天之后,陡然“剎車”進行調整。從昨日起至本月15日共13天的過渡期內,已預約科目三…

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

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1.我的情況: 實踐 springCloud , 啟動了注冊中心 eureka、也啟動了 服務生產者、服務消費者。 eureka 端口: 1…

延長汽車壽命的6個良好習慣

怎樣最大程度的使用你的汽車涉及到許多東西,比如保養維護,還有良好的駕駛習慣。很多人對正確的維護保養對延長汽車壽命的重要性已很了解,所以我們這里集中談一談什么是良好的駕車習慣。駕車習慣和方式決定了汽車的預期壽命,換另一…

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項…