CATIA CAA二次開發專題(七)---遍歷特徵樹
在應用開發中,遍歷特徵樹是常見需求,通過遍歷特徵結構樹,可以獲取大量資訊。這裡給出一個遍歷函式,供參考。
函式採用遞迴演算法,從給出的特徵出發,遍歷以該特徵為根的特徵樹,如果根是零部件, 遍歷整個零部件特徵。
適當修改,即可完成特定特徵物件的搜尋。
這裡有兩個函式,第一個GetRootObject()可以獲取根特徵,這裡根特徵可以是Part和Product。
引數CATDocument *pDoc可以根據之前的方法獲取。
第二個函式:void NavigateSpecTree(CATISpecObject_var spObject,CATUnicodeString path)的第一個引數由函式1獲取,
第二個引數為初始值為“”。這個引數是為了在遞迴呼叫時,記錄特徵的路徑。
CATISpecObject_var GetRootObject(CATDocument *pDoc)
{
HRESULT rc;
CATISpecObject_var spRoot;
if (pDoc==NULL)
{
CATUnicodeString hint="GetDocument Failed";
MessageBox(NULL ,hint,_T("提醒" ), MB_OK);
return NULL_var ;
}
CATUnicodeString type;
type=pDoc->GetType();
if (type=="CATProduct")
{
CATIDocRoots* piDocRootsOnDoc=NULL;
rc=pDoc->QueryInterface(IID_CATIDocRoots,(void**)&piDocRootsOnDoc);
if (FAILED(rc)||piDocRootsOnDoc==NULL) return NULL_var;
CATListValCATBaseUnknown_var *pRootProducts;
pRootProducts=piDocRootsOnDoc->GiveDocRoots();
piDocRootsOnDoc->Release();
piDocRootsOnDoc=NULL;
if (pRootProducts==NULL) return NULL_var;
CATIProduct_var spRootProduct=NULL_var;
spRootProduct=(*pRootProducts)[1];
CATIProduct *piProductOnRoot=NULL;
rc=spRootProduct->QueryInterface(IID_CATIProduct,(void**)&piProductOnRoot);
if (FAILED(rc)||piProductOnRoot==NULL) return NULL_var;
spRoot=piProductOnRoot;
}
else {
CATInit *pDocAsInit = NULL ;
rc = pDoc->QueryInterface(IID_CATInit, (void**)&pDocAsInit);
if ( FAILED(rc) )
{
CATUnicodeString hint="CATInit Failed";
MessageBox(NULL ,hint,_T("提醒" ), MB_OK);
return NULL_var ;
}
CATIPrtContainer *pSpecContainer = NULL ;
pSpecContainer = (CATIPrtContainer*)pDocAsInit->GetRootContainer("CATIPrtContainer");
if ( NULL == pSpecContainer )
{
CATUnicodeString hint="Get CATIPrtContainer Failed";
MessageBox(NULL ,hint,_T("提醒" ), MB_OK);
return NULL_var ;
}
pDocAsInit->Release();
pDocAsInit = NULL ;
spRoot = pSpecContainer->GetPart() ;
if ( NULL_var == spRoot )
{
CATUnicodeString hint="GetPart Failed";
MessageBox(NULL ,hint,_T("提醒" ), MB_OK);
return NULL_var ;
}
pSpecContainer->Release();
pSpecContainer = NULL ;
}
return spRoot;
}
void NavigateSpecTree(CATISpecObject_var spObject,CATUnicodeString path)
{
if (spObject==NULL_var)
return;
else {
CATIDescendants_var spDescendants=spObject;
CATListValCATISpecObject_var spDescendantsList;
CATUnicodeString title,type="",disName;
disName=spObject->GetName();
type=spObject->GetType();
if (type=="MechanicalPart") path="";
if (path.GetLengthInChar()>1) path.Append("\\");
path.Append(disName);
if (type=="ASMPRODUCT")
{
cout<<"ASMPRODUCT"<<endl;
CATIProduct_var spProductOnRoot=spObject;
CATListValCATBaseUnknown_var *childrenList=spProductOnRoot->GetChildren();
//piProductOnRoot->Release();
//piProductOnRoot=NULL;
if (childrenList==NULL)
{
CATUnicodeString hint1="當前文件沒有Part或Product";
MessageBox(NULL ,hint1,_T("提醒" ), MB_OK);
return;
}
int size=childrenList->Size();
CATIProduct_var spChild;
CATUnicodeString nm;
for (int i=1;i<=size;i++)
{
spChild=(*childrenList)[i];
spChild->GetPrdInstanceName(nm);
CATIProduct_var pRef;
pRef=spChild->GetReferenceProduct();
CATILinkableObject *pLink=NULL;
pRef->QueryInterface(IID_CATILinkableObject,(void**)&pLink);
CATDocument *pDoc1;
pDoc1=pLink->GetDocument();
pLink->Release();
pLink=NULL;
if (pDoc1==NULL) return;
CATISpecObject_var spPart=GetRootObject(pDoc1);
path.Append("\\");path.Append(nm);
NavigateSpecTree(spPart,path);
}
}
else {
if (type!=NULL&&disName!=NULL)
cout<<path.ConvertToChar()<<" Type:"<<type.ConvertToChar()<<" Name:"<<disName.ConvertToChar()<<endl;
if (spDescendants!=NULL)
{
spDescendants->GetDirectChildren("CATISpecObject",spDescendantsList);
if (spDescendantsList!=NULL)
for (int i=1;i<=spDescendantsList.Size();i++) {
NavigateSpecTree(spDescendantsList[i],path);
}
else {
//cout<<"spDescendantsList is Null"<<endl;
CATILinkableObject *pLinkable;
CATDocument *pDoc;
spDescendants->QueryInterface(IID_CATILinkableObject,(void**)&pLinkable);
pDoc=pLinkable->GetDocument();
//cout<<"Doc:"<<pDoc->DisplayName()<<endl;
}
} //else cout<<"spDescendants is Null"<<endl;
}
}
}
通過這兩個函式,就可以遍歷整個零件或產品文件。
執行結果,輸出特徵的名稱、型別的資訊。程式在CATIA V5 CAA 2012上除錯通過。
相關推薦
CATIA CAA二次開發專題(七)---遍歷特徵樹
在應用開發中,遍歷特徵樹是常見需求,通過遍歷特徵結構樹,可以獲取大量資訊。這裡給出一個遍歷函式,供參考。 函式採用遞迴演算法,從給出的特徵出發,遍歷以該特徵為根的特徵樹,如果根是零部件, 遍歷整個零部件特徵。 適當修改,即可完成特定特徵物件的搜尋。
CATIA CAA二次開發專題(九)---3DE平臺的特徵樹遍歷
因為應用開發需要移植到3DE平臺,所以又開始了新的征程。 在3DE平臺上,因為使用中心資料庫儲存設計文件和安全原因,很多V5平臺的特徵及介面做了很大的 改變,給剛剛有點熟悉V5平臺的我,很大的困擾。只有又開始昏天黑地的啃文件,摸索著解決。 搜尋特徵樹是二次開發基礎的
學習 MeteoInfo二次開發教程(一)
mat 沒有 組件 資源管理 img 教程 layer 添加 bbs 來自氣象家園:http://bbs.06climate.com/forum.php?mod=viewthread&tid=6631 按照教程,沒有太大問題,有些是對c#操作不熟悉導致。 1.添加d
學習 MeteoInfo二次開發教程(三)
開發教程 cnblogs false raw class .dll dll inf legend 1.breakList的問題 ((PolygonBreak) aLS.breakList[0]).DrawFill=false; 新的類庫將LegendScheme的brea
學習 MeteoInfo二次開發教程(四)
手動添加 map dem itl 數控 nas 字號 south title 教程四的問題不大。 1.private void AddMapFrame_ChinaSouthSea()、private void AddTitle()兩個函數和public Form1()函數並
GeoMesa編譯與二次開發專欄(3) — GeoMesa原始碼編譯
前言 1、參考:GeoMesa官方英文文件:https://www.geomesa.org/documentation/developer/introduction.html 2、本篇介紹瞭如何編譯GeoMesa原始碼,即官方文件中所謂的從原始碼構建GeoMesa,以及對GeoM
GeoMesa編譯與二次開發專欄(2) — GeoMesa簡介
本篇參考的文件與部落格: 1、GeoMesa官網介紹:https://www.geomesa.org/documentation/index.html 2、阿里雲-GeoMesa開發指南:https://help.aliyun.com/document_detail/87287.html
GeoMesa編譯與二次開發專欄(1) — 開篇
開篇前言 1、近期因專案需要,筆者開始研究利用GeoMesa-Kafka儲存“流式”資料(例如動態的軌跡點資料,攝像頭的音、視訊流資料等)。採用邊學習邊總結的方式,筆者定期對研究進行總結,方得此專欄。 2、由於專案需求的限定,本專欄的原始碼編譯、使用者手冊、入門教程暫時主要限於
Openmeetings4.0.0二次開發日誌(一)
由於公司業務要求,需要尋找一款開源的視訊會議專案加入到我們公司的業務中。網上此類的開源專案雖然很多,但是坑也很多,要麼有的已經停止更新維護多年,要麼有的bug成災,要麼有的連著硬體軟體一起賣。。。。。為了找個強大好用的開源把我折騰得夠嗆,一番尋找之後,發現了Op
POI開發入門(四)遍歷Excel 和文字提取
Apache POI (四) 遍歷Excel 和文字提取 一、 Excel遍歷 直接上程式碼: package com.poi.hello; import java.io.FileInputStre
CATIA VBA二次開發(一)快速入門之巨集指令碼
CATIA巨集(Macro)是CATIA向用戶提供的一種記錄 、重放使用者操作的工具(CATIAVBAProject也屬於巨集,本書中把VBAProject放在CATIA VBA一節中講,本節重點講巨集指令碼)。當用戶啟用錄製巨集操作時,系統
學習MeteoInfo二次開發教程(十二)
odi 資源 level 無法訪問 .cn oid pub images bsp 1.添加新的Form窗體: 在解決方案資源管理器中,右鍵MeteoInfoDemo,“添加”,“Windows 窗體” 2.新窗體中添加好layersLegend1和Layout之後,要把la
Win10系統下安裝CAA二次開發程式,VS介面上不出現CAA選單欄或選單欄為灰色的
問題描述:Win10系統下安裝了CATIA_CAA V5R19和V4R24兩個版本,其中V5R19版本安裝完成後VS2005中沒有出現CAA選單欄,V5R24安裝完成後VS2008中出現部分整合選單且為灰色不可用。 V5R19採用的VS2005中沒有整合選單問題的解決方法:
ArcEngine二次開發_01(滑鼠左擊右擊地圖響應不同事件)
主要是現在開始做畢業設計,然後想把做的過程和有些程式碼分享給大家,會比較簡單一點,但是還是慢慢分享,希望做到後面有高階操作分享給大家。 step01: 首先把AxMapControl控制元件拖到地圖上,然後最好把屬性Name改一下,不然預設為AxMapControl1,不利
[Revit]Autodesk Revit 二次開發整理(資料、準備工作和環境搭建)
1 前言 Revit被Autodesk收購之後,整理和開放了一大部分API,供開發者實現自己的功能和程式,總體來說API的功能比較完善,畢竟市面上已經出現了各式各樣的外掛。 本人也是初學者,在Revit分類中分享一些自己記錄的筆記內容。 2 準備工作 工欲善其事,必先利其器。 2.1 語言 首先,定下你自己
AutoCAD ObjectARX 二次開發(2020版)--4,使用ARX嚮導建立CAD二次開發專案(程式設計框架)--
手動建立ObjectARX應用程式非常麻煩,在此步驟中,將介紹ObjectARX嚮導。 在這裡,我們將使用ObjectARX嚮導建立我們的ObjectARX應用程式。 本節的程式的需求是,接收CAD使用者的輸入。 首先,開啟VS2017,新建專案 在左邊的樹形目錄裡依次選擇 Visual C++&
JAVA實現EXCEL公式專題(七)——統計函數
length trace trac 復雜 manage 排列 public ram script 統計函數主要實現的是較為復雜的統計函數如countif、sumif、frequency,也是,直接上代碼/** * 項目名稱: * 文件說明: * 主要特點
大數據技術之輔助排序和二次排序案例(GroupingComparator)
group http pac ppr instance div lec tex boolean 大數據技術之輔助排序和二次排序案例(GroupingComparator) 1)需求 有如下訂單數據 訂單id 商品id 成交金額
VBA二次學習筆記(2)——兩個Excel表內容比較
integer then 控制 圖片 amp 員工 工作 表格 獲取 說明(2018-9-3 22:38:58): 1. 就是之前問同事要來的作業,有兩個格式一樣的Excel文件,一個是正確答案,一個是員工作答的。通過代碼將兩個文件進行比對,把不同之處列出來。 正文: S
Git工程開發實踐(七)——GitLab服務搭建
gin ash -c ons smtp服務 ota shell roo 目前 Git工程開發實踐(七)——GitLab服務搭建 操作系統:RHEL 7.3 WorkStation 一、GitLab簡介 1、GitLab簡介 ?GitLab是一個利用Ruby on Rails