天天看點

Open Cascade DataExchange IGES

摘要Abstract:本文結合OpenCascade和Initial Graphics Exchange Specification來對IGES格式進行詳細說明,了解IGES格式的結構,進而友善對OpenCascade中IGES格式檔案讀寫的實作進行了解。   關鍵字Key Words:IGES、Open Cascade、Data Exchange

Open Cascade DataExchange IGES

[email protected]

摘要Abstract:本文結合OpenCascade和Initial Graphics Exchange Specification來對IGES格式進行詳細說明,了解IGES格式的結構,進而友善對OpenCascade中IGES格式檔案讀寫的實作進行了解。 

關鍵字Key Words:IGES、Open Cascade、Data Exchange 

一、引言 Introduction

目前市面上的CAD系統都有自己的資料檔案,各個系統之間的資料結構和格式各不相同,這樣極大影響了設計和制造部門之間或企業之間的資料傳輸和程式銜接的自動化,同樣給CMM和CAD/CAM的資料通信帶來困難。是以,迫切需要資料交換檔案格式的标準化。 

産品資料的正确交換可以使雙方不必重建資料,提高效率。産品資料交換的通常做法是使用資料交換接口,即需要交換的每一系統與标準資料格式(中性格式)之間開發雙向轉換接口,兩系統通過中性格式進行交換。 

20世紀70年代末80年代初以來,國際上已做了大量資料交換标準的研究、制定工作。自1980年最早出現IGES1.0後,又産生了許多其他規範如XBF、SET、VDA-FS、PDDI、ESP、CAD*I、PDES等。這些規範各有不同的目的和使用範圍,同時也存在着各種問題。在這些規範中,應用最成熟、最廣泛的是IGES(Initial Graphics Exchange Specification)。ISO在上述規範的基礎上,制定了新的資料交換标準STEP(Standard for the Exchange of Product Model data),其目的是覆寫過去已經存在的規範的功能,并解決實際應用中存在的問題。 

IGES是在美國國家标準局的倡導下,由美國國家标準協會(ANSI)組織波音公司、通過公司等共同商議制訂的,1980年公布第一版,以後不斷完善和擴充,版本不斷更新,從IGES1.0僅包含二維圖形到IGES3.0支援曲面和三維線框幾何,IGES4.0版支援構造實體幾何(CSG)造型技術,IGES5.0支援邊界表示(BRep)造型技術。目前幾乎所有有影響的CAD/CAM系統都配有IGES接口,如Pro/E、CATIA、OpenCascade等。它由一系列産品的幾何、繪圖、結構和其他資訊組成,可以處理CAD/CAM系統中的在部分資訊,是用來定義産品幾何形狀的現代互動圖形标準。 

本文結合OpenCascade和Initial Graphics Exchange Specification來對IGES格式進行詳細說明,了解IGES格式的結構,進而友善對OpenCascade中IGES格式檔案讀寫實作的方式進行了解。 

二、IGES規範 the Initial Graphics Exchange Specification

IGES是一種按特定的檔案結構安排的資料格式,用來描述産品的設計和生産資訊,可用它來交換CAD/CAM系統中以計算機可讀的形式産生和存儲的各種資訊。标準的IGES檔案包含固定長ASCII碼(Fixed Format)、壓縮的ASCII碼(Compressed Format)和二進制(Binary Format)三種格式。 

固定長ASCII碼的IGES檔案每行為80個字元,整個檔案分為五段(Section):開始段(Start)、全局段(Global)、元素索引段(Direction Entry)、參數資料段(Parameter Data)和結束段(Terminate)。如圖2.1所示: 

Open Cascade DataExchange IGES

Figure 2.1 Fixed File Formats of ASCII IGES File 

段辨別符位于每行的第73列,74~80列指定為用于段每行的序号。序号都以1開始,且連續不間斷,其值對應該段的列數。段辨別符是這樣規定的,字元“B”和“C”表示标記段;“S”表示開始段;“G”表示全局段;“D”表示元素索引段;“P”表示參數記錄參數記錄段;“T”表示結束段。固定長的ASCII格式的IGES格式的大概結構如下圖2.2所示: 

Open Cascade DataExchange IGES

Figure 2.2 General file structure of the Fixed Format 

下面結合具體的IGES檔案來對每個段進行說明,僅包含一個點的示例檔案如下所示: 

Open Cascade DataExchange IGES

Figure 2.3 IGES demo file Generated by OpenCascade 

開始段Start Section:該段是為提供一個可讀檔案的序言,主要記錄圖形檔案的最初來源及生成該IGES檔案的相同名稱。IGES檔案至少有一個開始記錄。 

全局段Global Section:主要包含前處理器的描述資訊及為處理該檔案的後處理器所需要的資訊。參數以自由的格式輸入,用逗号分隔參數,用分号結束一個參數。主要參數有檔案名、前處理器版本、機關、檔案生成日期、作者姓名及機關、IGES的版本、繪圖示準代碼等。如圖2.3中的2~5行。 

元素索引段Directory Entry Section:該段主要為檔案提供一個索引,并含有每個實體的屬性資訊,檔案中每個實體都有一個目錄條目,大小一樣,由8個字元組成一個域,共20個域,每個條目占用兩行。如圖2.4所示: 

Open Cascade DataExchange IGES

Figure 2.4 Format of the Directory Entry(DE) Section in the Fixed Format 

每一項内容如下: 

l 元素類型号(Entity Type Number):說明元素的類型; 

l 參數指針(Parameter Data):說明該元素的參數在參數資料段的開始序号; 

l 圖層:存放圖層名和它的指針; 

l 參數記錄數(Parameter Line Count):數字代表該元素的參數在參數資料段的行數; 

參數資料段Parameter Data Section:該段記錄了每個元素的幾何資料。根據每個圖形元素參數數的多少,決定它将有幾行。如圖2.3所示,116為點,它有三個資料X,Y和Z,分别為1,2,3。 

結束段Terminate Section:隻占一行,在前32個字元裡,分别用8個字元記錄了開始段、全局段、索引段和參數資料段的段碼和每段的總行數。第33~72個字元沒有用到。最後8個字元為結束段的段碼和行數。 

三、OpenCascade中IGES讀寫 OpenCascade IGES Reader/Writer

OpenCascade中提供IGES的程式接口有如下功能: 

l 加載IGES檔案到記憶體;loading IGES files into memory; 

l 檢查IGES檔案的一緻性;checking IGES files consistency; 

l 轉換IGES檔案到OCCT的形狀;translating IGES files into OCCT shapes; 

l 轉換OCCT的形狀到IGES檔案;translating OCCT shapes into IGES files; 

l 通路IGES檔案模型;accessing the IGES model; 

l 選擇IGES檔案模型中的實體;selecting entities from the IGES model; 

l 通路IGES檔案模型中的每個實體;accessing each entity in the IGES model; 

實作上述功能的包是IGESControl,可處理的IGES檔案格式的版本為5.3。讀取IGES檔案實體到OCCT形狀的方法如下所示: 

Standard_Integer ReadIGES(const Standard_CString& aFileName,
                          Handle(TopTools_HSequenceOfShape)& aHSequenceOfShape)
{
    IGESControl_Reader Reader;

    Standard_Integer status = Reader.ReadFile(aFileName);

    if (status != IFSelect_RetDone) 
    {
        return status;
    }
        
    Reader.TransferRoots();
    
    TopoDS_Shape aShape = Reader.OneShape();     
    aHSequenceOfShape->Append(aShape);

    return status;
}      

将OCCT形狀轉換為IGES檔案方法如下所示:

Standard_Boolean SaveIGES(const Standard_CString& aFileName,
                          const Handle(TopTools_HSequenceOfShape)& aHSequenceOfShape)
{

    IGESControl_Controller::Init();
    IGESControl_Writer ICW (Interface_Static::CVal("XSTEP.iges.unit"),
               Interface_Static::IVal("XSTEP.iges.writebrep.mode"));
    
    for (Standard_Integer i=1;i<=aHSequenceOfShape->Length();i++)
    {
        ICW.AddShape (aHSequenceOfShape->Value(i));
    }

    ICW.ComputeModel();
    Standard_Boolean result = ICW.Write(aFileName );
    return result;
}      

四、程式示例 Example Code

通過将OpenCascade中的形狀資料導出到IGES檔案,結合IGES規格書,可以友善對IGES格式的了解。如下程式所示為将簡單的點、線和圓導出到IGES檔案: 

/*
*    Copyright (c) 2014 eryar All Rights Reserved.
*
*           File : Main.cpp
*         Author : [email protected]
*           Date : 2014-01-04 20:00
*        Version : 1.0v
*
*    Description : Export OpenCascade shape to IGES entities.
*
*      Key Words : OpenCascade, IGES, DataExchange
*                  
*/

#define WNT
#include <gp_Pnt.hxx>
#include <gp_Circ.hxx>

#include <TopoDS_Vertex.hxx>
#include <TopoDS_Edge.hxx>

#include <TopTools_ListIteratorOfListOfShape.hxx>

#include <BRepBuilderAPI_MakeVertex.hxx>
#include <BRepBuilderAPI_MakeEdge.hxx>

#include <IGESControl_Controller.hxx>
#include <IGESControl_Writer.hxx>


#pragma comment(lib, "TKernel.lib")
#pragma comment(lib, "TKMath.lib")
#pragma comment(lib, "TKBRep.lib")
#pragma comment(lib, "TKTopAlgo.lib")
#pragma comment(lib, "TKIGES.lib")


void SaveIges(const std::string& igesFile, const TopTools_ListOfShape& shapes)
{
    IGESControl_Controller::Init();
    IGESControl_Writer igesWriter;

    for (TopTools_ListIteratorOfListOfShape si(shapes); si.More(); si.Next())
    {
        igesWriter.AddShape(si.Value());
    }

    igesWriter.ComputeModel();
    igesWriter.Write(igesFile.c_str());
}


int main(void)
{
    // vertices.
    TopTools_ListOfShape vertices;
    TopoDS_Vertex theVertex = BRepBuilderAPI_MakeVertex(gp_Pnt(1.0, 2.0, 3.0));

    vertices.Append(theVertex);

    SaveIges("vertex.iges", vertices);

    // edges.
    TopTools_ListOfShape edges;
    TopoDS_Edge theLine = BRepBuilderAPI_MakeEdge(gp_Pnt(3.0, 4.0, 5.0), gp_Pnt(6.0, 7.0, 8.0));
    TopoDS_Edge theCircle = BRepBuilderAPI_MakeEdge(gp_Circ(gp::XOY(), 9.0));

    edges.Append(theLine);
    edges.Append(theCircle);

    SaveIges("edge.iges", edges);

    // put them together.
    TopTools_ListOfShape shapes;
    shapes.Append(theVertex);
    shapes.Append(theLine);
    shapes.Append(theCircle);
    
    SaveIges("shapes.iges", shapes);

    return 0;
}      

生成的IGES檔案内容如下所示: 

Open Cascade DataExchange IGES

Figure 4.1 Simple Fixed Format IGES File 

結合下圖4.2中實體類型号與實體類型的對應表可知,上圖4.1中的元素索引D段可以看總共有三個實體,一個是類型号為116的點;一個是類型号為110的直線;一個是類型号為100的圓。 

從資料參數P段可以看出116對應的點的坐标為(1,2,3);110對應的直線的兩個端點坐标為(3,4,5)和(6,7,8);100對應的圓的資料為圓心在(0,0)半徑為9的位于XY平面上的圓。圓的參數資料項每項資料說明見圖4.3。 

将IGES在OpenCascade中顯示如圖4.4所示。 

Open Cascade DataExchange IGES

Figure 4.2 Curve and Surface Entities 

Open Cascade DataExchange IGES

Figure 4.3 Parameter Data of Circle Entity in IGES 

Open Cascade DataExchange IGES

Figure 4.4 IGES Entities in OpenCascade 

五、結論 Conclusion

結合OpenCascade生成的IGES檔案和Initial Graphics Exchange Specification來對IGES格式進行學習。 

雖然目前許多CAD/CAM系統主要應用是在不同系統間交換工程圖紙、零件模型、運動仿真和動态實驗所需要的幾何資料,裝配或銷售産品所需要的圖形檔案,但是IGES标準在具體應用中經常出現以下問題: 

l 交換過程中會出現錯誤或資料丢失現象。由于IGES所支援的實體十分龐大,在實際應用中,每一個CAD/CAM系統不可能實作IGES支援的所有實體,而隻能實作它所涉及的實體的交換,即隻能實作IGES實體集的一個子集,但不同系統所實作的子集不可能完全相同。系統之間隻能交換所實作子集的交集部分。 

l 發送系統前處理器生成的IGES檔案的實體類型超出了接收系統後處理器可能接受的實體類型範圍,以及發送系統與接收系統之間實體類型集雖相同,但有關屬性如顔色、字型、線型等代碼不同,也将使部分資料丢失。 

l IGES的目的隻是傳輸工程圖形及相應資訊,它無法描述CIMS環境所需要的産品資料的全部資訊。而且IGES對實體的定義是模糊的,這将造成各CAX系統對IGES中定義的實體有不同的了解,如相同的3D曲線功能會因不同軟體的計算方式不同而使在使用IGES來執行圖形交換時出現不同的曲線或丢失該曲線。 

l IGES檔案本身規模太大,影響資料檔案的處理速度,使資料傳輸效率不高。 

l 在轉換資料的過程中發生的錯誤很難确定,常要人工去處理IGES檔案,如在轉換資料的過程中經常發生某個或某幾個小曲面丢失的情況,這是要利用原有曲面邊界重新生成曲面;某些小曲面(Face)在轉換過程中變成大曲面(Surface),此時要對曲面進行裁剪。 

六、參考資料 References

1. 李原,張開富,餘劍鋒. 計算機輔助幾何設計技術及應用. 西北工業大學出版社. 2007 

2. US PRO. Initial Graphics Exchange Specification .1997