1. 程式人生 > >CATIA CAA二次開發專題(七)---遍歷特徵樹

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