版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
CATIACAA二次開發(fā)詳細教程第一講:基本概念1.什么是組件?由于本人是自學,屬于摸著石頭過河,所以很多東西顯得比較幼稚,大家請見諒。
CAA,全稱ComponentApplicationArchitecture,組件應用架構。這個東西對不搞軟件的人來說可能很陌生,我也很陌生啊,原來光知道“面向對象的技術”就很牛逼了,“組件技術”難道更牛逼嗎?
既然類和組件有著這么多類似的地方,那么傳統(tǒng)的面向對象編程和面向組件編程有什么區(qū)別呢?簡單的說,面向對象關注的是組合在一個二進制可執(zhí)行文件中的各個類的關系,而面向組件的編程關注的是在彼此獨立的基礎上模塊之間的交互性,這種交互性使得你并不需要熟悉它們內部的工作原理。
這兩種方法最基本的不同在于它們對最終的應用程序的觀點。在傳統(tǒng)的面向對象編程中,盡管你可以精心的把所有的商業(yè)邏輯分布在不同的類中,一旦這些類被編譯,它們就被固化成了一個巨大的二進制代碼。所有的類共享同一個物理單元(通常是一個可執(zhí)行文件)、被操作系統(tǒng)認為是同一個進程,使用同一個地址空間以及共享相同的安全策略等等。如果多個開發(fā)者在同一份代碼上進行開發(fā),他們甚至還要共享源文件。在這種情況下,修改一個類可能會讓整個項目被重新鏈接,并重新進行必要的測試,更嚴重的,還有可能要修改其他的類。但是,在面向組件開發(fā)中,應用程序是由一系列可以互相交互的二進制模塊組合而成的。
一個具體的二進制組件可能并不能完成什么工作。有些組件是為了提供一些常規(guī)服務而編寫的,例如通信的封裝或者文件訪問組件。也有一些是為了某些特定應用而專門開發(fā)的。一個應用程序的設計者可以通過把這些不同的組件提供的功能粘合在一起來實現(xiàn)他們需要的商業(yè)邏輯。很多面向組件的技術——例如:COM、J2EE、CORBA和.NET都為二進制組件提供了的無縫鏈接的機制。而唯一的不同就是你需要在組件通信上花費的力氣。
把一個二進制應用程序分解成不同的二進制組件的動機和把不同的類放到不同的文件中是類似的。后者使得不同的類的開發(fā)人員可以彼此獨立的工作,盡管即時修改了一個類也要重新鏈接整個應用程序,但是你只需要重新編譯被修改的部分就可以了。
但是,面向組件的開發(fā)還是和簡單軟件項目的管理更復雜一些。因為一個面向組件的應用程序是一個二進制代碼塊的集合,你可以把組件當作是LEGO的積木塊一樣,隨心所欲的拆裝它們。如果你需要修改一個組件的實現(xiàn),只需要修改那個組件就可以了,而組件的客戶機不需要重新編譯也不需要重新開發(fā)。對于那些不常用到的組件,組件甚至可以在一個程序運行的時候被更新。這些改進和增強使得組件可以立即進行更新,而所有該組件的客戶都將立即受益。無論是在同一臺機器上還是通過網(wǎng)絡遠程訪問。
面向組件的應用程序也更易于擴展。當你需要實現(xiàn)新的需求的時候,你可以提供一個新的組件,而不去影響那些和新需求無關的組件。這些特點使得面向組件的開發(fā)降低了大型軟件項目長期維護的成本,這是一個最實際的商業(yè)問題,也正是如此,組件技術才如此迅速的被接受。
面向組件的應用程序通??梢愿斓捻憫袌?,因為你可以有很大的選擇空間,不僅僅是自己開發(fā)的組件,還可以從第三方廠商來購買某些組件,從而避免了重復制造輪子。這里,VB就是一個很好的例子,豐富的ActiveX控件使得很多人在快速開發(fā)中得到了享受。
面向對象和面向組件另一個重要的不同在于這兩種技術在繼承和重用模型上的側重點不同。
在面向對象的分析和設計中,應用程序通常被分解成復雜的類繼承結構。類的設計和要解決的商業(yè)問題緊密結合。你可以從已有基類繼承并特化其行為來實現(xiàn)代碼重用。問題在于,這是一種很糟糕的重用的方法。當你從一個基類派生一個子類的時候,你必須對基類的實現(xiàn)有透徹的理解才可能保證不出問題。例如:修改一個成員變量會不會帶來副作用?這會對基類中的代碼有什么影響?重載基類的方法會不會破壞那些想使用基類版本的客戶的行為?等等。
這種形式的重用被稱為白盒重用(White-boxreuse),因為當你重用的時候你就需要去了解基類實現(xiàn)的細節(jié)。顯然。白盒重用在可擴展性較高的大型應用中并不經(jīng)濟,也很難得到第三方Framework廠商的支持。
面向組件的開發(fā)采用了黑盒重用(Black-boxreuse)的方法,它可以讓你對組件內部全然不知的情況下來使用組件公開的接口。這樣,你就可以遠離那些復雜的繼承關系。而面向組件的開發(fā)者也可以把更多的精力放在制定組件和客戶的溝通的接口上了。
最后,面向對象編程提供了有限的工具和設計模式來處理和應用程序運行時相關的問題,例如多線程、并發(fā)管理、安全、分布式應用和版本控制等。面向對象的開發(fā)者當面對這些“公共需求”的時候,或多或少的需要自己來解決問題。但是面向組件的開發(fā)方式卻使你在這方面要靈活的多。
以下是CSDN社區(qū)網(wǎng)友對組件的一個討論:
1面向對象是面向組件的基礎,組件是在對象的基礎上加上屬性和事件
2復用粒度的大小不同。通常多個密切相關的對象組織在一起完成一個/或多特定的功能。組件有多個側面(facet),不同的使用者可能只使用其中的部分。
3級別不一樣,“面向對象”是對語言級別的,“組件”是對應用級別的。組件可以由對象實體組成。??
4組件由一個或若干個對象組成。對象提供可訪問的接口。
5可笑,現(xiàn)在很多人把面向對象編程理解為面向組件編程,真是幼稚!
6組件是一種面向應用的概念,對象是一種面向編程方法的概念。一般進行組件編程都是用面向對象的方法編程進行實現(xiàn)。組件已經(jīng)是一種能實際應用的實例了。本人的理解,見笑了。
7面向對象是在代碼一級對數(shù)據(jù)和方法的封裝,C++,JAVA
面向組件是在二進制代碼上的封裝,COM/COM+,CORBA
8面向組件的集成度和可重用度更高(如樓上的meking_lee所說的),面向組件渴望一種真正的接口級的搭積木的軟件模式,目前在語言特性上支持這一點的就只有java了(當然也許我見識短)。
9用C++實現(xiàn)組件,是因為沒有直接支持組件的語言?,F(xiàn)在的組件太大了。
10應該說是面向對像和基于組件2.CAA架構CATIA本身是按照組件模型建立起來的,用戶可以通過開發(fā)自己的CAA組件,對DASSAULTSYSTEMES的CATIAV5進行擴展;也可以把用戶自己開發(fā)的CAA組件結合起來,實現(xiàn)用戶自定義應用。
CAA應用的框架結構遵從組件對象模型,有自己的框架結構。每個應用有至少一個框架(framework),每個框架有至少一個模塊(module)。每個框架里面有一個文件,這個文件通過宏“AddPrereqComponent(framenwork,protected)”來聲明“聲明”這個框架的一些首先必備的其他框架名稱,framework是框架名稱。CAA的編譯器就是通過文件,來把頭文件搜索限制在首先必備框架所包含的接口中。
每個模塊下面定義了一個文件,這個文件指明了這個模塊中所有文件在編譯時用到的其它模塊和一些外部庫以及為編譯器提供如何編譯的模塊必須信息,還指定在不同的操作系統(tǒng)下面編譯時的一些可能的特殊要求。CAA環(huán)境對Cnext能夠運行的所有操作系統(tǒng)中采用同樣的編譯器,這為開發(fā)者提供了很大的方便,因為他們可以不需要知道怎樣用不同的編譯器和怎么寫makefile。但是MKMK并不能做所有的事情,開發(fā)者至少要說明他們想要做什么。我們在自己的源文件中用到其它模塊的接口,要在中進行說明。程序結構采用了COM組件模型,組件模型中有兩個常用的概念:接口(Interface)和實現(xiàn)(Implement)。接口是一個包含許多純虛函數(shù)的抽象對象,這些純虛函數(shù)指明了接口支持的方法。實現(xiàn)是一個具體定義接口中的方法的對象,一個實現(xiàn)對象必須顯式聲明它支持哪些接口,還必須定義它支持的接口中的所有抽象方法,實現(xiàn)對象可以支持一個或多個接口,而客戶應用只能通過這些接口與實現(xiàn)對象發(fā)生聯(lián)系。
下面的這個圖好像比較能體現(xiàn)CAA的思想,不過要仔細看看。
'sRADE??RADE,RapidApplicationDevelopmentEnvironment,快速應用研發(fā)環(huán)境,是一個可視化的集成開發(fā)環(huán)境,它提供完整的編程工具組。RADE以MicrosoftVisualC++為載體,開發(fā)工具完全集成在了VC++環(huán)境中,并且提供了一個CAA框架程序編譯器,但同時也限制了VC++的部分功能??梢哉fCATIACAA–RADE是目前所有高端CAD/CAM開發(fā)環(huán)境中最為復雜、同時也是功能最為強大的一個。
CAAV5RADE包括一系列工具:TCK(ToolConfigurationKey)、MAB(多工作空間應用生成器)、CUT(C++單元調試管理器)、MKMK(CAA編譯工具)、CID(C++交互式面板)等,以插件的形式與MSDevVC++集成到一起。然后借助于這些工具在MSDev??環(huán)境下開發(fā)自己的CAA組件。
TCK管理RADE環(huán)境,TCK命令是用來管理開發(fā)工具包的安裝,用來創(chuàng)建一個工作環(huán)境。當在WinowsNT上用CAAV5的可視化創(chuàng)建工具(以插件形式嵌入MicrosoftDeveloperStudio),tck_init和tck_profile命令在打開一個V5的工作區(qū)時被自動調用。
MKMK(多工作區(qū)應用編譯器)是DS(DassaultSystems)原代碼編譯工具,它構建在平臺無關(UNIX和WindowsNT)的標準編譯器上,它支持面向組件的設計模式。MKMK提供一種統(tǒng)一的工具來編譯和連接CAA應用而不管是用的什么編程語言(Fortran,C,C++,IDL,Express,CIRCE,...)。
CUT是單元調試管理器,CUT用mkodt命令來運行傳遞給測試框架中的測試對象,通過選擇不同的命令參數(shù)來決定選擇測試一個對象或者所有對象。
CID即C++交互式面板,CID根據(jù)軟件開發(fā)人員的需求,支持從設計、開發(fā)到測試、推廣及維護的整個開發(fā)設計周期,CID提供對RADE產(chǎn)品的單點訪問。盡管CID在WindowsNT下運行,它能夠產(chǎn)生Unix程序代碼。
MAB多工作空間應用生成器產(chǎn)品,它為CATIAV5應用程序提供一個集成統(tǒng)一的編譯、鏈接、編輯、生成環(huán)境。MAB能夠承擔多工作空間編輯,鏈接,運行代碼生成,以及各工作空間之間依賴性的有效管理。MAB還可以監(jiān)控任一工作空間的源代碼的變更,在整個編譯過程中顯示跟蹤該變更,使編譯過程只需要編譯更改部分即可。
CATIACAA二次開發(fā)第二講:添加Workbench這一部分很重要請注意認真看,說它重要是因為在后面程序的調試中可能會出現(xiàn)錯誤,請你務必在安裝開發(fā)vc環(huán)境的時候注意,在安裝vc的時候記得有個地方自己選,最好你都裝了,如果你沒有裝也沒有關系,到時候從vc的安裝文件里面考出來也可以,就是關于RADE中會用到的lib庫,在vc中的目錄為vc98/mfc/lib目錄下,如果你調試出現(xiàn)問題,比如error沒有找到或者別的你就要從安裝盤里面把所有的lib里面的文件考到你的vc對應安裝目錄下。2進入正題新建工作空間
你按照我以前的帖子安裝完開發(fā)環(huán)境在vc下面就有了RADE的菜單
找個標簽頁你可以選擇下面的復選框,以后新建工程的時候就不會彈出了,然后選擇ok
你可以先建立你的開發(fā)目錄然后選擇WorkspaceDirectory的時候指定目錄,with就選擇mkmk,toollevel選擇你的版本。點擊next
選擇創(chuàng)建一個新的框架frame,然后finish,彈出newframework對話框,輸入你的frame名字,下面的選擇如圖所示,frameworkt’ype-implementation,frameworkfunction-development,然后ok
彈出下面的配置對話框
然后ok,dos窗口閃動幾下就可以了創(chuàng)建module有了工作空間和框架下面就是添加module了,好像你做的所有開發(fā)都在module里面(我也是剛入門,很多東西還不懂^_^)
Project目錄下面選擇newmodule彈出下面的對話框
輸入你的module名字,moduleinformation選擇sharedobject,也就是交互式(caa的開發(fā)分為交互式和批處理,聽似水年華這么跟我講的^_^),然后ok。彈出下面的產(chǎn)生文件對話框
然后點擊ok,你的module就添加到workspace里面了,在vc的fileview窗口如下所示:
載入必須的API函數(shù)選擇菜單如下所示:
彈出如下的對話框
Mode選擇第一項,然后點擊add,添加函數(shù)所在目錄,選到你的catia目錄下面的B14,一定要選對。添加后的結果為
點擊ok,彈出調入需要的文件對話框如下
點擊close,dos窗口閃動完成。插入資源,也就是菜單、對話框等在RADE環(huán)境的insert-catiaresource-catiapattern…,
彈出對話框如下
選擇ok,彈出下面的對話框
選擇workObjecttype為workbench,然后輸入你的workbench名字,點擊associatedworkshop(也就是你要你的菜單出現(xiàn)在那兒,catia里面的一個workshop對應一個模塊,比如機械設計、曲面等)右面的按鈕,彈出下面的對話框
選擇PRDWorkshop,也就是你做的菜單要出現(xiàn)在“機械設計”模塊里面,點擊ok回到原來對話框
點擊next彈出
不用選擇直接next,出現(xiàn)對話框
這個對話框是讓你選生成類的前綴,可以不用去管,然后點擊finish彈出將要生成文件對話框
Ok,完成配置,回到vc界面下fileview窗口可以看到變化如下
同時將上圖里面的刪除。
多了一個文件包。刪除多余文件并修改mk文件打開你的工作空間所在目錄,找到你建立的frame框架文件夾,然后打開刪除里面的第一次建立的module,我這兒是MyModule1,同時刪除PublicInterfaces文件夾下面對應第一次建立的module的頭文件,我這兒是,修改.mk文件,因為里面未包含這一個頭文件的Module,打開該文件后在后面添加下面代碼LINK_WITH=$(WIZARD_LINK_MODULES)?\
CATPrsWksPRDWorkshop
(3)指定你的菜單出現(xiàn)位置,打開userframd/Cnext/resource/msgcatalog下面的文件,修改="Infrastructure"里面引號里面的內容為MechanicalDesign,也就是變?yōu)?"MechanicalDesign",這樣你的菜單就出現(xiàn)在“機械設計”里面了。.編譯調試編譯之前先更新一下運行環(huán)境,如下所示
選擇creat/updateruntimeview,彈出下面對話框
選擇圖中的設置,點擊ok完成更新調試mkmk選擇環(huán)境下面的菜單如下
選擇mkmk進行編譯彈出下面的對話框
選中你的workbench,在上面的復選框選擇編譯時要檢測的選項,點擊ok完成編譯生成可執(zhí)行文件下面生成你的workbench,選擇編譯環(huán)境下的菜單如下所示
彈出下面的對話框
選擇里面的文件和debug標簽頁,選擇executeblefordebugsession文本框右面的箭頭,選擇brose彈出下面的對話框和選擇
選中里面的文件,然后選擇打開,然后點擊ok。執(zhí)行文件工程查看菜單(馬上就要大功告成了激動啊。。。。。)選擇環(huán)境下的菜單如下
開始啟動catia了,等著看結果嘍^_^
嘿嘿看到了吧,這就是你的菜單了,下面就是要添加菜單響應.友情提示順序一定不能錯,在建立完workspace也就是產(chǎn)生frame以后就要loadprerequisiteworkspace。出現(xiàn)問題的時候要更新一下編譯環(huán)境creat/updateruntimeview如果是出現(xiàn)的錯誤為缺少庫文件,記得開篇說的那樣看看自己的vc哦^_^CATIACAA二次開發(fā)第三講:添加Addin(菜單、對話框)下面簡單介紹addin的制作:
所謂Addin,是在系統(tǒng)已有的Workbench中插入新的工具條或者菜單。下面的例子,
我們來在PartDesign中插入一個工具條。
1、新建一個module命名為PartAddin,并將它設為active。
2、做接口CATIPrtWksAddin的implemention,
insert->component,彈出對話框如圖,輸入addin的名字,點擊add再點擊瀏覽選擇要執(zhí)行的接口,如圖。
要選擇的接口為CATIPrtWksAddin注意Searchworkspace為你的CATIA安裝路徑,并將下面的單選框設為空。點ok完成。文件相應的試圖如下:
3、此時建立了一個空的Addin。在文件中可以看到這個Addin的聲明:
NewAddin?????CATIPrtWksAddin?libPartDesignAddin
但是,要創(chuàng)建一個工具條,我們還需要在這個類:NewAddin中添加一些函數(shù)。
在NewAddin類中添加兩個Public函數(shù)聲明:
voidCreateCommands();
CATCmdContainer*CreateToolbars();
在中添加宏定義:
#include""???????
MacDeclareHeader(PartCmdHeader);
這兩個函數(shù)及宏都可以按ctrl+F1查到,CreateCommands里面的代碼只是用MacDeclareHeader生成的PartCmdHeader定義命令的header(不知道怎么翻譯,就是工具條或菜單里面可以看到的執(zhí)行命令的按鈕了,這個命令是連接界面命令和實現(xiàn)代碼的橋梁。)如:?
newPartCmdHeader(“point”,“CmdModule”,“TestCmd”,(void*)NULL);
newPartCmdHeader("line","CmdModule","LinCmd",(void*)NULL);第一個參數(shù)是按鈕的名字,第二、三個代表按鈕執(zhí)行的命令所在的module和命令的名字,參數(shù)四缺省就行了。
CreateToolbars里面就是要建的工具條和菜單的主要內容:
NewAccess(CATCmdContainer,pPartBenchTlb,PartBenchTlb);
NewAccess(CATCmdStarter,pPointCmd,PointCmd);
SetAccessCommand(pPointCmd,"point");
SetAccessChild(pPartBenchTlb,pPointCmd);
NewAccess(CATCmdStarter,pLineCmd,LineCmd);
SetAccessCommand(pLineCmd,"line");
SetAccessNext(pPointCmd,pLineCmd);
這三個函數(shù)都可以查到,NewAccess肯定是新建了,常用的類有CATCmdWorkbench(Theworkbench'saccessisaCATCmdContainerwhichcontainscontainers:oneforit'smenubarandoneforeachtoolbar.)、CATCmdContainer(Classtocreatethecontainer'saccesslikeamenubar,amenu,asubmenu,atoolbaroraniconbox)、CATCmdStarter、(Astarterisaleafoftheworkshop'saccessestree.AteachstarteryouattachaCATCommandHeadertolaunchtheassociatedcommand.
)
NewAccess,SetAccessCommand,SetAccessChild,SetAccessNext等幾個命令的使用。其具體含義可以參看API文檔的說明。(SetAccessCommand就是將starter與上面的PartCmdHeader建立的東西連接了,注意參數(shù)“l(fā)ine”)其他的顧名就可思義。
4、此時編譯,發(fā)生幾個連接錯誤。主要是CATCmdContainer類型及Newaccess的定義的頭文件及其Module的添加。在.h文件中加上:#include""
在.cpp中加入:#include""
#include""
在.mk文件中加入:WIZARD_LINK_MODULES=?\
JS0FMJS0GROUPPrtWorkshopMechanicalModelerUIUUID\
CATApplicationFrame
#ENDWIZARDEDITIONZONE?
LINK_WITH=$(WIZARD_LINK_MODULES)?\
CATApplicationFrame?
在中加入:
AddPrereqComponent("ConstraintModelerUI",Protected);
注意:每次換行時,都要加一斜線用來繼續(xù)執(zhí)行下面的module.
到此addin就做成了。剩下的就是定義資源文件,也就是換換名字或給按鈕連接個圖片。和前面的workbench一樣工具條名字在“”中進行定義:
=”測試工具條”;
在定義圖片。
下面簡單介紹一下命令的響應,
(1)首先就是前面提到的
newPartCmdHeader(“point”,“CmdModule”,“TestCmd”,(void*)NULL);
你做的命令所在的模塊和命令名一定要和上面的名字對應。新建一個名為CmdModule的Module。將此Module設為當前的Project,選擇“Insert”?“CATIAResource”?“Command…”,插入一個名位TestCmd的Command:(2)Dialog的插入
將CmdModule設為當前Project,選擇“Insert”?“CATIAResource”?“Dialog…”,并將其名字設為TestDialog。
然后在中添加控件,這里的控件與一般VC程序差不多,不再詳述。添加三個回調函數(shù)。
在Command()的BuildGraph()函數(shù)或者其構造函數(shù)中添加代碼:
TestDialog*pi=newTestDialog();
pi->Build();
pi->SetVisibility(CATDlgShow);
注意先加其頭文件:
#include""
在的Build()函數(shù)中添加
在三個回調函數(shù)中加入
RequestDelayedDestruction();
此語句功能為執(zhí)行Dialog的析構函數(shù)。
編譯(MKMK),更新(Create/Updateruntimevirw),運行tools->openruntimewindow輸入cnext。去partdesign里找你的工具調就行了。補充:在自己做的workbench里加工具條和菜單代碼是一樣的,一般加在文件里面,它里面已經(jīng)有了工具條的代碼,宏定義headerclass也已經(jīng)自動添加到里面
在做以上例子時最好參考CAAV5Encyclopedia\userinterfaces\WintopFrame里面的Createworkbench、CreateAddin例子,資源文件的定義在這里也講的比較詳細CATIACAA二次開發(fā)第四講:創(chuàng)建自定義特征本例是使用CAAC++開發(fā)方式,建立一個自定義的用戶特征,實現(xiàn)的功能是使一個任意曲面可以根據(jù)給定曲面的形狀來生成和目標形狀相同的形狀,類似于生活中縫補的概念,其具體的開發(fā)步驟如下:
(1)創(chuàng)建一個庫(catalog)來定義特征的StartUp。用CATfctEditorAssistant-new-catalog命令創(chuàng)建catalog,通過.osm文件定義catalog里StartUp數(shù)據(jù)結構。對StartUp的定義要根據(jù)自
定義特征的性質,選用合適的container,在feature定義中,要對對自定義特征的輸入輸出和該特征的中性數(shù)據(jù)給予明確的定義。
(2)創(chuàng)建一個擴展接口來訪問特征的屬性。通常在該接口中定義設置和獲取自定義特征屬性的方法。在本文中接口的作用是
取得被縫合的表面和支撐面。
(3)創(chuàng)建一個可以實例化該特征的工廠(Factory)。該工廠的作用是打開創(chuàng)建的catalog獲取startup,然后實例化自定義特征并設置它的屬性。本文中為創(chuàng)建縫合面,然后打開catalog并獲取startup,實例化特征設置其屬性。
(4)創(chuàng)建工具條Toolbar。使用CATCommandHeader類創(chuàng)建命令頭,最簡單的方法就是使用宏命令:
#include""、MacDeclareHeade(rMyHea-der)。CommandHeader添加到工具條的Addin函數(shù)中,createco-mmand(s)用來實例化一個新的命令,createtoolbars用來確定訪問順序,SetAccessCommand的作用是將命令頭與按鈕相連,SetAccessChild以及SetAccessNext這兩個宏則可以順序連接到入口。
(5)創(chuàng)建對話框Panal。在Bulid函數(shù)里添加設置對話框各按鈕相應的功能函數(shù),并為各按鈕設置默認的初始值。用CATStateCommand類創(chuàng)建StateCommand命令,在BuildGraph里
定義狀態(tài)表(StartChart)來實現(xiàn)用戶意圖。
(6)最后應用CATIBuild方法,當輸入改變時對新的特征更新。本文中具體為移除可能的更新錯誤、獲取新的輸入數(shù)據(jù)、定義程序上的結果、生成特征并存儲結果。主要程序代碼(略)。
運行程序后,生成圖1所示的三張不同形狀的曲面,其中黃色兩個曲面為參考面,綠色為目標曲面。
當在創(chuàng)建的自定義特征對話框中,參考曲面選擇sphericalsurface,目標曲面選擇baseplane時,點擊ok按鈕后,原綠色平面就生成了縫合球面后的新特征,如圖2所示。
圖2以球面為參考生成的自定義特征
當在創(chuàng)建的自定義特征對話框中,參考曲面選擇prismsurface,目標曲面選擇baseplane時,點擊ok按鈕,原綠色平面就生成了縫合后的新特征,如圖3所示。
CATIACAA二次開發(fā)詳細教程(5)添加一個點在創(chuàng)建任何幾何對象之前,必須在激活的函數(shù)命令中添加以下代碼,:CATFrmEditor*pEditor=CATFrmEditor::GetCurrentEditor();if(pEditor==NULL){printf("errorgettingtheFRMeditor");}CATDocument*pDoc=pEditor->GetDocument();CATIContainerOfDocument_varspConODocs=pDoc;CATIContainer*pSpecContainer=NULL;HRESULThr=spConODocs->GetSpecContainer(pSpecContainer);if(spConODocs==NULL_var){printf("errorgettingthecontainerofdocuments");}以上代碼的主要功能是獲取editor,thedocumentandthecontainer。CATIGSMFactory_varspGSMFactory=NULL_var;CATIPrtFactory_varspPrtFactory=NULL_var;CATICkeParmFactory_varspParmFactory=NULL_var;spGSMFactory=pSpecContainer;spPrtFactory=pSpecContainer;spParmFactory=pSpecContainer;以上代碼設置工廠,在這基礎上你才可以造型,GSMFactory用于創(chuàng)建底層的幾何對象比如點、線等。PrtFactory包含創(chuàng)建孔特征、拉伸特征實體等函數(shù)。ParmFactory包含設定參數(shù)的函數(shù)。在以上的基礎上可以創(chuàng)建點了,步驟如下:(1)創(chuàng)建一個三維數(shù)組(x,y,z)定義點坐標。doubleCoords[3];Coords[0]=0;Coords[1]=0;Coords[2]=0;(2)創(chuàng)建一個CATIGSMPoint并將其轉換為CATISpecObjectCATIGSMPoint_varspPoint1=spGSMFactory->CreatePoint(Coords);10.};doublept_bottom_right[2]={50.,10.};doublept_top_right[2]={50.,50.};doublept_top_left[2]={10.,50.};spPt_bottom_left=sketch2DFactory->CreatePoint(pt_bottom_left);spPt_bottom_right=sketch2DFactory->CreatePoint(pt_bottom_right);spPt_top_right=sketch2DFactory->CreatePoint(pt_top_right);spPt_top_left=sketch2DFactory->CreatePoint(pt_top_left);開始創(chuàng)建線:CATI2DLine_varspLine1,spLine2,spLine3,spLine4;spLine1=sketch2DFactory->CreateLine(pt_bottom_left,pt_bottom_right);spLine2=sketch2DFactory->CreateLine(pt_bottom_right,pt_top_right);spLine3=sketch2DFactory->CreateLine(pt_top_right,pt_top_left);spLine4=sketch2DFactory->CreateLine(pt_top_left,pt_bottom_left);將線連接起來:CATI2DCurve_varspCurve1(spLine1);CATI2DCurve_varspCurve2(spLine2);CATI2DCurve_varspCurve3(spLine3);CATI2DCurve_varspCurve4(spLine4);spCurve1->SetStartPoint(spPt_bottom_left);spCurve1->SetEndPoint(spPt_bottom_right);spCurve2->SetStartPoint(spPt_bottom_right);spCurve2->SetEndPoint(spPt_top_right);spCurve3->SetStartPoint(spPt_top_right);spCurve3->SetEndPoint(spPt_top_left);spCurve4->SetStartPoint(spPt_top_left);spCurve4->SetEndPoint(spPt_bottom_left);然后退出草圖:spSketch->CloseEdition();CATIACAA二次開發(fā)詳細教程(9)創(chuàng)建圓角三角形1)創(chuàng)建三個點(參見教程5)
2)將點連成線(參見教程6)
3)通過三點創(chuàng)建一個參考平面,后面進行圓弧倒角時要用到該平面。
CATIGSMPlane3Points_varSupportplane=spGSMFactory->CreatePlane(spPoint1,spPoint2,spPoint3);
CATISpecObject_varspSupportplane=Supportplane;
4)創(chuàng)建倒角半徑的參數(shù):
CATICkeParm_varRadius1=NULL_var;
CATICkeMagnitude_varspRadMag=spParamDictionary->FindMagnitude("LENGTH");
CATUnicodeStringname("Radius1");
Radius1=spParmFactory->CreateDimension(spRadMag,name,.01);
5)創(chuàng)建倒角::
CATIGSMCorner_varCorner1=spGSMFactory->CreateCorner(spLine1,
spLine2,
spSupportplane,
Radius1,
CATGSMSameOrientation,
CATGSMSameOrientation,
FALSE);
CATISpecObject_varspCorner1=Corner1;
6)裁剪去多余的線和點:
CATIGSMSplit_varSplit1=spGSMFactory->CreateSplit(spLine1,
spRadius1,
CATGSMSameOrientation);
CATISpecObject_varspSplit1=Split1;CATIGSMSplit_varSplit1a=spGSMFactory->CreateSplit(spSplit1,
spRadius3,
CATGSMInvertOrientation);
CATISpecObject_varspSplit1a=Split1a;
7)將線和圓弧依次連接起來,創(chuàng)建一個序列:
CATLISTV(CATISpecObject_var)joincurves;
(spSplit1a);
(spSplit2a);
(spSplit3a);
(spRadius1);
(spRadius2);
(spRadius3);
8)在講序列連接起來之前,需要創(chuàng)建一個最小的結合距離:
CATICkeParm_varMergedist=NULL_var;
CATICkeMagnitude_varspMergedist=spParamDictionary->FindMagnitude("LENGTH");
CATUnicodeStringmergename("MergeDistance");
Mergedist=spParmFactory->CreateDimension(spMergedist,
mergename,
.0001);
9)連接起來并插入到視圖中:
Nowwecanjointhislistofobjectsintoasingleshapeandinsertitintothepart.
CATIGSMAssemble_varCurveAssy=spGSMFactory->CreateAssemble(joincurves,
Mergedist,
FALSE);
CATISpecObject_varspCurveAssy=CurveAssy;spCurveAssy->Update();
CATIGSMProceduralView_varspCurObj=Curveassembly;
spCurObj->InsertInProceduralView();
CATIACAA二次開發(fā)詳細教程(10)文檔操作方法創(chuàng)建加載保存一、創(chuàng)建(Createthenewdocument)CATDocument*pDoc=NULL;rc=CATDocumentServices::New("Part",pDoc);if(NULL!=pDoc){cout<<"NewdocumentcreatedOK"<<endl<<flush;}else{cout<<"ERRORincreatingNewdocument"<<endl<<flush;return2;}Nowthatthesessionisopened,youcancreateanewdocumentusingtheNewstaticmethodofCATDocumentServices.Thismethodcreatesadocumentandinitializesit,allowingittobeloadedandstoredandmakingiteditable.Inthisusecase,apre-defineddocumenttype,"Part",isusedasadocumenttype.Ininteractivemode,thisisthenamethatappearswhenperformingaFile/Newoperation.Itisnotthefileextension,which,inthiscase,is"CATPart".二、打開(Loadthedocument)CATDocument*pDoc=NULL;rc=CATDocumentServices::Open(argv[1],pDoc);if(SUCCEEDED(rc)&&(NULL!=pDoc)){cout<<"DocumentopenedOK"<<endl<<flush;}else{cout<<"ERRORinopeninganexistingdocument"<<endl<<flush;return2;}Nowthatthesessionisopened,youcanloadanexistingdocumentusingtheOpenstaticmethodofCATDocumentServices.Thismethodneeds,asafirstparameter,theentirestoragepathnameanddocumentnameoftheexistingdocumentthatwewanttoloadintothesession.Inthisusecase,weenterthisinformationasanargumenttotheprogram.ThesecondparameteroftheOpenmethodreturnsaCATDocumentpointertothedocumentithasloaded.Oncethedocumentexistsinthesession,youcanworkwithobjectswithinit,usingspecificinterfacesexternaltotheObjectModelerBaseframework.三、獲取當前文檔CATFrmEditor*pEditor=GetEditor();if(NULL!=pEditor){cout<<"EditorgotOK"<<endl<<flush;}else{cout<<"ERRORingettingthecurrenteditor"<<endl<<flush;return1;}CATDocument*pDoc=pEditor->GetDocument();if(NULL!=pDoc){cout<<"DocumentopenedOK"<<endl<<flush;}else{cout<<"ERRORinopeninganexistingdocument"<<endl<<flush;return2;}四、提取根容器(RetrievingtheDocumentRootContainer)CATInit*piInitOnDoc=NULL;rc=pDoc->QueryInterface(IID_CATInit,(void**)&piInitOnDoc);if(FAILED(rc)){cout<<"ERRORinQueryInterfaceonCATInitfordoc"<<endl<<flush;return3;}constCATIdentidCATIContainer="CATIContainer";CATIContainer*piRootContainer=NULL;piRootContainer=(CATIContainer*)piInitOnDoc->GetRootContainer(idCATIContainer);if(NULL==piRootContainer){cout<<"ERRORinGetRootContainer"<<endl<<flush;return4;}ThedocumentrootcontainerisretrievedusingtheCATInit::GetRootContainermethod.TheCATIContainerhandleretrievedthroughGetRootContainerwillbenecessarywheneveryouwanttocreateormanipulateobjectsinthedocument.五、保存文檔(SavetheDocument)另存rc=CATDocumentServices::SaveAs(*pDoc,argv[1]);if(SUCCEEDED(rc)){cout<<"DocumentsavedOK"<<endl<<flush;}else{cout<<"ERRORinsavingdocument"<<endl<<flush;return5;}Tosavethenewdocument,usetheSaveAsstaticmethodofCATDocumentServices.ThismethodtakesthepointertothedocumentcreatedbyNewasafirstparameter,andthestoragepathnameanddocumentnameunderwhichthedocumentistobestoredasasecondparameter.Inthisusecase,wepassthestoragepathnameanddocumentnameasanargumenttotheprogram.保存rc=CATDocumentServices::Save(*pDoc);if(SUCCEEDED(rc)){cout<<"DocumentsavedOK"<<endl<<flush;}else{cout<<"ERRORinsavingdocument"<<endl<<flush;return3;}Tosavethenewdocumentunderthesamename,usetheSavestaticmethodofCATDocumentServices.ThismethodtakestheCATDocumentpointertothedocumentastheonlyparameter.六、刪除(Removethedocument)rc=CATDocumentServices::Remove(*pDoc);if(SUCCEEDED(rc)){cout<<"DocumentremovedOK"<<endl<<flush;}else{cout<<"ERRORinremovingdocument"<<endl<<flush;return6;}Ifyoueverneededtore-openthedocumentduringthissamesession,itwouldthenbenecessarytoalsoremoveitfromthesessionafterhavingsavedit.Otherwise,youneednotworryaboutitsincedeletingthesessionwillautomaticallyremovethedocumentaswell.Toremovethedocument,youshouldusetheRemovestaticmethodofCATDocumentServices.七、按指定文檔格式保存(ExportingaDocumentFormatType)DefiningtheNewDocumentFormatTypeCATProduct_OmbExportTypeCATIExportTypeManager libCAAOmbExportTypeAnewdocumentformattypeissimplydefinedbyaddinganewentryinthecurrentframework'sdictionary.ThisnewentrywillcausetheFile/SaveAsdialogboxtolistthenewformattypeamongthetypesdefinedtothesaveoperation.Thefirstparameter,CATProduct_OmbExportType,indicatesthattheexportingdocumentisaProduct-typedocument.,adocumenthavinga.CATProductsuffix)andthattheexporteddocumentformattypeis"OmbExportType",whichwillalsobethesuffixofthesaveddocument.ThesecondparameterindicatesthatthisnewdocumenttypewillimplementtheCATIExportTypeManagerinterfaceinordertodefinethespecificsaveoperationsnecessarytoexportthenewdocument.Thelastparameteristhenameofthelibraryinwhichtheimplementationmoduleistobefound.ImplementingCATIExportTypeManager?SeetheObjectModelerarticles[]foradetailedexplanationaboutinterfaceimplementations.TheimplementationofCATIExportTypeManagerisfoundinthemoduledefiningtheCAAEOmbExportTypeDataimplementationclass.CATImplementClass(CAAEOmbEExportTypeData, CodeExtension, CATBaseUnknown, CATProduct_OmbExportType);TheCATImplementClassmacrodefinestheimplementationclassCAAEOmbExportTypeDataasacodeextensionimplementingtheCATProduct_OmbExportTypelatetype.#include""TIE_CATIExportTypeManager(CAAEOmbExportTypeData);TheabovestatementindicatesthatthisisanimplementationoftheCATIExportTypeManagerinterface.HRESULTCAAEOmbExportTypeData::ExportData(CATDocument*pDoc,CATUnicodeStringpath){cout<<"**************BeginExportData1"<<endl<<flush;HRESULTrc=CATDocumentServices::SaveAs(*pDoc, path);return
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《統(tǒng)計學》課件 3統(tǒng)計數(shù)據(jù)與顯示
- 湖南中考歷史三年(2023-2025)真題分類匯編:專題04 世界古代史近代史選擇題(解析版)
- 辦公室員工績效考核標準制度
- 中醫(yī)適宜技術知識課件
- 2026年醫(yī)療辦公室崗位考核基礎理論測評練習題及解析
- 2026年縣醫(yī)保局面試核心考點專項突破練習題及解答
- 2026年及未來5年中國工業(yè)自動化系統(tǒng)行業(yè)發(fā)展監(jiān)測及投資戰(zhàn)略咨詢報告
- 2026年及未來5年中國汽車再制造行業(yè)發(fā)展趨勢及投資前景預測報告
- 2026及未來5年中國5G網(wǎng)絡切片行業(yè)市場研究分析及發(fā)展前景研判報告
- 房屋交付質量安全承諾函(4篇)
- 腫瘤放射治療的新技術進展
- 退崗修養(yǎng)協(xié)議書范本
- 高考語文二輪復習高中語文邏輯推斷測試試題附解析
- 土壤微生物群落結構優(yōu)化研究
- 2024外研版四年級英語上冊Unit 4知識清單
- 四川省南充市2024-2025學年部編版七年級上學期期末歷史試題
- 國有企業(yè)三位一體推進內控風控合規(guī)建設的問題和分析
- 2025年高二數(shù)學建模試題及答案
- 儲能集裝箱知識培訓總結課件
- 幼兒園中班語言《雪房子》課件
- 房地產(chǎn)項目開發(fā)管理方案
評論
0/150
提交評論