OCCT基础
基礎
構成總覽
- Root類
- 基本類型,如布爾,字符,整數或實數
- 安全處理動態創建的對象,確保自動刪除未引用的對象
- 可配置的內存管理器,提高了應用程序的性能
- 包含運行時類型信息機制,有助于創建復雜應用
- 異常管理
- 一些C++的流
- 集合類
- 字符串
- 集合
- 向量和矩陣
- 向量矩陣的基本計算
- 基礎幾何類
- 基礎幾何(點,圓等)
- 基礎幾何動作(縮放等)
- 常用的數學工具
- 求解一組線性代數方程的算法
- 找到一個或多個自變量函數最小值的算法
- 找到一個或一組非線性方程的根的算法
- 找到方陣的特征值和特征向量的算法
- 原子類
- 應用服務
- 單位轉換工具,提供處理數量和相關物理單位的統一機制,詳情UnitsAPI
- 表達式的基本解釋器,用于腳本創建等等。詳情ExprIntrp
- 用于處理配置資源文件和可自定義消息文件的工具。詳情
- 進度指示和用戶中斷接口
庫的組織方法
模塊和工具
整個OCCT庫由一組模塊組成。Root模塊提供了基礎的服務并被其他模塊所使用。
每個模塊主要由一個或多個工具包組成。在計算機中,工具包由共享庫(例如.so或.dll)表示。
包
一個包由語義上由聯系的類組織在一起。例如:幾何包包括點,線,圓等。包的命名規范,通常情況下包的命名為:包名_類名。例如:集合包下的圓的名字就是:Geom_Circle。包中的內容可以包括的數據類型:
- 枚舉
- 對象類
- 異常
- 指向其他對象類的指針在包中
數據類型
對象是數據類型的實例,其定義決定了如何使用它。每種數據類型由一個或多個類實現,這些類構成系統的基本元素。
Open CASCADE技術中的數據類型分為兩類:
- 由值操作的數據類型
- 由句柄操作的數據類型
由值操作的數據類型
由值操縱的類型的變量包含實例本身。
有三種類型:
- 基礎類型
- 枚舉類型
- 不是直接從Standard_Transient繼承的類定義的類型。
由句柄操作的數據類型
由句柄操縱的類型的變量包含對實例的引用。
注意
由句柄操作的類型默認是NULL。因此我們需要使用
來進行賦初值。
類型:
由繼承自Transient類的類
什么時候需要句柄類型的數據?
- 如果對象的生命周期比較長,那么就使用句柄類型的。
- 如果對象的生命周期短,那么就是用值類型的。
- 如果一個對象只在一段時間內創建,但在整個應用程序的生命周期中都存在,那么最好的選擇可能是由句柄操作的類或聲明為全局變量的值。
使用句柄的編程方法
句柄的定義
句柄是在OCCT中的智能指針。幾個句柄可以同時使用一個對象,單個句柄可以引用多個對象,但一次只能引用一個對象。如果需要引用其他對象,必須像使用C ++指針一樣取消引用句柄。
類的組織
類Standard_Transient是OCCT類大的基類,可以被句柄操作。
從Transient派生(直接或間接)的類的對象通常使用new在動態內存中分配,并由句柄操作。句柄的定義使用模板類opencascade :: handle <>
在OCCT中,為句柄定義了附加的typedef,直接在相關的句柄中添加Handle_即可:
Handle_Geom_Line aLine; //“Handle_Geom_Line”的本質是使用typedef重定義了“opencascade :: handleL <Geom_Line>”使用句柄:
句柄的特征在于它引用的對象。
聲明句柄:
聲明句柄會創建一個不引用任何對象的空句柄。可以通過其方法IsNull()檢查句柄為空。要使句柄無效,可以使用Nullify()方法。
初始化句柄:
可以創建一個新對象,或者可以為其分配另一個句柄的值,但是它們的類型必須是兼容的。
- 內聯值可以一行代碼解決
- 外聯使用宏的方式
類型管理:
Open CASCADE技術提供了一種以通用方式描述數據類型層次結構的方法,可以在運行時檢查給定對象的確切類型(類似于C ++ RTTI)。
如果需要使用這個功能,類聲明應包括OCCT RTTI的聲明。
多態:
顯式類型轉換:
強制類型轉換
如果轉換與引用對象的實際類型不兼容,則“強制轉換”的句柄變為空(并且不會引發異常)。穩健的做法如下:
void MyFunction (const Handle(A) & a) { Handle(B) b = Handle(B)::DownCast(a); if (! b.IsNull()) { //我們可以使用b,如果b是A的子類 } else { // } }向下轉換特別適用于不同類型的對象集合; 但是,這些對象應該從相同的根類繼承。
例:
使用句柄創建對象
要創建一個由句柄操作的對象,請聲明句柄并使用標準C ++ new運算符對其進行初始化,然后立即調用構造函數。構造函數可以是實例化對象的類源中指定的任何構造函數。
注意:
與指針不同,刪除操作符不適用于句柄; 引用的對象在不再使用時會自動銷毀。
調用方法類
方法類近似于C++中的靜態函數。使用類名::方法名的方式的形式調用
例如:
釋放與處理
刪除對象之前,必須確保不再引用該對象。為了減少與此對象生命管理相關的編程負載,Open CASCADE技術中的刪除功能由handle操作的類的引用計數器保護。句柄在不再引用時自動刪除對象。通常,用戶不需要在Standard_Transient的子類實例上顯式調用delete運算符。
創建同一對象的新句柄時,引用計數器會遞增。當句柄被銷毀,無效或重新分配給另一個對象時,該計數器會遞減。當引用計數器變為0時,句柄會自動刪除該對象。
分配原理的例子:
通過定義以下內容,您可以輕松地將對象的引用轉換為void *:
void *pointer; Handle(Some_class) aHandle; // 這里復制指針 Pointer = &aHandle; aHandle = * (Handle(Some_Class) *)pointer;周期
如果兩個或多個對象通過句柄相互引用,則會出現循環。在這種情況下,自動銷毀將不起作用。
考慮例如圖形,其對象(圖元)必須知道它們所屬的圖形對象,即圖元必須具有對完整圖形對象的引用。如果兩個基元和圖形都由句柄操縱,并且它們通過將句柄保持為字段來相互引用,則會出現循環。當應用程序中的最后一個句柄被破壞時,圖形對象不會被刪除,因為它的句柄存儲在它自己的數據結構中。
避免這種情況有兩種方法:
- 將C ++指針用于一種引用,例如從基元到圖形
- 當需要銷毀圖形對象時,將一組句柄(例如,基元中的圖形的句柄)置為NULL
插件管理
插件的分發
插件是可以動態加載到客戶端應用程序中的組件,不需要直接鏈接到它。
插件可用于:
- 實現驅動程序的機制,即根據當前事務動態更改驅動程序實現(例如,檢索存儲在另一個應用程序版本中的文檔),
- 將處理資源限制到所需的最小值(例如,只要用戶不需要,它就不會在運行時加載任何應用程序服務),
- 促進模塊化開發(應用程序可以提供基本功能,而一些高級功能將作為插件添加時可用)。
在全局通用標識符(GUID)的幫助下識別插件。
C++插件實現
路徑位置
$CSF_PluginDefaults/PluginC++客戶端插件實現
例子:
FAFactory.h
FAFactory.c
#include <FAFactory.hxx>#include <FADriver_PartRetriever.hxx> #include <FADriver_PartStorer.hxx> #include <FirstAppSchema.hxx> #include <Standard_Failure.hxx> #include <FACDM_Application.hxx> #include <Plugin_Macro.hxx>static Standard_GUID StorageDriver ("45b3c690-22f3-11d2-b09e-0000f8791463"); static Standard_GUID RetrievalDriver("45b3c69c-22f3-11d2-b09e-0000f8791463"); static Standard_GUID Schema ("45b3c6a2-22f3-11d2-b09e-0000f8791463");//====================================================== // function : Factory // purpose : //======================================================Handle(Standard_Transient) FAFactory::Factory (const Standard_GUID& theGUID) { if (theGUID == StorageDriver) { std::cout << "FAFactory : Create store driver\n"; static Handle(FADriver_PartStorer) sd = new FADriver_PartStorer(); return sd; }if (theGUID == RetrievalDriver) { std::cout << "FAFactory : Create retrieve driver\n"; static Handle(FADriver_PartRetriever) rd = new FADriver_PartRetriever(); return rd; }if (theGUID == Schema) { std::cout << "FAFactory : Create schema\n"; static Handle(FirstAppSchema) s = new FirstAppSchema(); return s; }Standard_Failure::Raise ("FAFactory: unknown GUID"); return Handle(Standard_Transient)(); }// export plugin function "PLUGINFACTORY" PLUGIN(FAFactory)
Root類
基本數據類型
OCCT中的基本數據類型與C++之間的對比
表中大部分數據類型都是對其相應的C++類型的typedef的重命名。但是,有幾個個例:
- Standard_Boolean是對是作為C ++ unsigned int基本類型的typedef實現的。
- Standard_ExtString是對C ++ short基本類型的typedef實現的。
內存管理
在工作會話中,幾何建模應用程序創建和刪除在動態內存(堆)中分配的大量C ++對象。在這種情況下,用于分配和釋放的標準存儲器的的性能可能是不夠的。
因此,Open CASCADE技術采用標準包中實現的專用內存管理器。
內存管理器基于以下原則:
- 小內存陣列被分組成集群然后再循環(不在使用也不會回到系統中,被循環使用)。
- 大的內存陣列通過系統的標準功能進行分配和解除分配(當不再使用時,陣列將被釋放到系統中)。
內存管理器的用法
使用OCCT內存管理,我們不需要傳統的malloc和free,取而代之的是Standard :: Allocate(),和Standard :: Free()。同時,使用Standard :: Reallocate()來代替C中的realloc()。
配置內存管理器
OCCT存儲器管理器可以被配置為將不同的優化技術應用于不同的存儲器塊(取決于它們的大小),甚至可以避免任何優化并直接使用C函數malloc()和free()。
- MMGT_OPT:如果設置為0(默認值),則每個內存塊直接在C內存堆中分配(通過malloc()和free()函數)。在這種情況下,忽略除MMGT_CLEAR之外的所有其他選項; 如果設置為1,則內存管理器執行如下所述的優化; 如果設置為2,則使用英特爾?TBB優化內存管理器。
- MMGT_CLEAR:如果設置為1(默認值),則每個分配的內存塊由零清零; 如果設置為0,則按原樣返回內存塊。
- MMGT_CELLSIZE:定義在大型內存池中分配的塊的最大大小。默認值為200。
- MMGT_NBPAGES:定義為頁面中的小塊分配的內存塊的大小(取決于操作系統)。默認值為1000。
- MMGT_THRESHOLD:定義在內部循環而不是返回到堆的塊的最大大小。默認值為40000。
- MMGT_MMAP:當設置為1(默認)時,使用操作系統的內存映射功能分配大內存塊; 如果設置為0,它們將通過malloc()在C堆中分配。
內存管理器的優化
當MMGT_OPT設置為1時,使用以下優化技術:
- 尺寸小于MMGT_CELLSIZE的小塊不單獨分配。而是分配在大型的內存池(每個池的大小為MMGT_NBPAGES的大小)。每個新的內存塊都安排在當前池的備用位置。當前內存池完全占用時,將分配下一個內存池,依此類推。
- 大小大于MMGT_CELLSIZE但小于MMGT_THRESHOLD的中型塊直接在堆中分配(使用malloc()和free())。當通過方法Standard :: Free()釋放這些塊時,它們就像小塊一樣被回收。
- 大小大于MMGT_THRESHOLD的大塊,包括用于小塊的內存池,根據MMGT_MMAP的值進行分配:如果為0,則這些塊在堆中分配; 否則,它們使用管理內存的操作系統特定功能進行分配。調用Standard :: Free()時,會立即將大塊返回給系統。
優點和缺點
OCCT內存管理器的主要優點在于它的小型和中型塊的回收,這使得應用程序在不斷分配和釋放類似大小的多個內存塊時工作得更快。
相關的缺點是在程序執行期間回收的存儲器不會返回到操作系統。這可能會導致大量內存消耗,甚至被誤解為內存泄漏。為了最大限度地減少這種影響,必須在完成內存密集型操作后調用Standard :: Purge方法。
OCCT內存管理器需要注意的是:
- 僅當MMGT_OPT為1 時,在每個存儲塊的開頭分配額外的4個字節(或64位平臺上的8個字節)以保持其大小
- 每個分配的內存塊的大小最多為8個字節(當MMGT_OPT為0(默認值); 32位平臺的典型值為4個字節)。
OCCT內存管理器使用互斥鎖來鎖定對空閑列表的訪問,因此在不同線程經常同時調用內存管理器的情況下,它可能比非優化模式更差的性能。原因是malloc()和free()的現代實現采用了幾個分配場所,從而避免了等待互斥釋放的延遲。
異常
每個異常都直接或通過繼承另一個異常從Standard_Failure繼承。
拋出異常
DomainError::Raise(“Cannot cope with this condition”);捕捉異常
try { OCC_CATCH_SIGNALS // try block } catch(DomainError) { // handle DomainError exceptions here }注意
通常,為了編寫與平臺無關的代碼,建議在try {}塊或其他可能發生信號的代碼中插入宏OCC_CATCH_SIGNALS。
集合類
Collections 集合組件包含處理數據的動態大小的聚集體的類。集合類是通用的(類似C ++模板),也就是說,它們定義了一個結構和算法,允許保存各種對象,這些對象不一定從唯一的根類繼承。當您需要使用給定類型對象的集合時,必須為此特定類型的元素實例化它。
字符串
字符串是基于ASCII / Unicode UTF-8(普通8位字符類型)和UTF-16 / UCS-2(16位字符類型)處理動態大小的字符序列的類。它們提供內置內存管理的編輯操作,使相對對象比普通字符數組更容易使用。
- 使用內置字符串管理器對字符串對象進行編輯操作
- 處理動態大小的字符序列
- 從ASCII到UTF-8字符串的轉換。
分類
TCollection_AsciiString:
ASCII字符的可變長度序列(正常的8位字符類型)。它提供了內置內存管理的編輯操作,使AsciiString對象比普通字符數組更容易使用。
TCollection_ExtendedString:
可變長度的“擴展”(UNICODE)字符序列(16位字符類型)。它提供了內置內存管理的編輯操作,使ExtendedString對象比普通的擴展字符數組更容易使用。
ExtendedString對象遵循值語義;也就是說,它們是實際的字符串,而不是字符串的句柄,并通過賦值進行復制。您可以使用HExtendedString對象來獲取字符串的句柄。
集合
通用集合
Array
TCollection_Array1:與C陣列類似的一維數組,即固定大小但在構造時動態標注尺寸。
TCollection_Array2:固定大小但在構造時動態標注尺寸的二維數組。
TCollection_HArray1:與C容器類似的一維數組,即固定大小但在構造時動態標注尺寸。HArray1對象是數組的句柄。
TCollection_HArray2:是TCollection_HArray1的二維形態
TCollection_HSequence:這是一個由整數索引的序列。這個序列是可變大小的結構。
TCollection_List:這些是非唯一對象的有序列表,可以使用迭代器按順序訪問。列表中的項目插入在任何位置都非常快。但是,如果列表很長,則按值搜索項目可能會很慢,因為它需要順序搜索。
TCollection_Sequence:這是一個由整數索引的序列。
Map
Map是動態擴展的數據結構,可以使用Key快速訪問數據。TCollection_BasicMap是地圖的根類。
Map的一般屬性
映射項可能包含復雜的非單一數據,因此使用數組管理它們可能很困難。所以,需要使用Map數據結構。
DataMap是一個通用類,它依賴于三個參數:
- Key是地圖中條目的鍵類型,
- Item是與地圖中的鍵相關聯的元素的類型,
- Hasher是鍵上的哈希類型。
DoubleMap是一個泛型類,它依賴于四個參數:
- Key1是地圖中條目的第一個鍵的類型,
- Key2是地圖中條目的第二個鍵的類型,
- Hasher1是第一個鍵上的哈希類型,
- Hasher2是第二個鍵上的哈希類型。
IndexedDataMap是一個通用類,它依賴于三個參數:
- Key是地圖中條目的鍵類型,
- Item是與地圖中的鍵相關聯的元素的類型,
- Hasher是鍵上的哈希類型。
常用的數學算法
Open CASCADE技術中提供的數學算法包括:
- 向量和矩陣
- 幾何圖元
- 數學算法
向量和矩陣
Vectors和Matrices組件提供了基本類型Vector和Matrix的C ++實現,它們經常用于定義更復雜的數據結構。
算法包括:
- 涉及矢量和矩陣的基本計算;
- 計算方陣的特征值和特征向量;
- 求解一組線性代數方程;
- 找到一組非線性方程的根的算法;
- 用于查找一個或多個自變量的最小函數的算法。
向量和矩陣具有的范圍,必須在聲明時定義,并且在聲明后不能更改。
math_Vector v(1, 3); // a vector of dimension 3 with range (1..3) math_Matrix m(0, 2, 0, 2); // a matrix of dimension 3x3 with range (0..2, 0..2) math_Vector v(N1, N2); // a vector of dimension N2-N1+1 with range (N1..N2)它們不能被共享并通過賦值進行復制。
math_Vector v1(1, 3), v2(0, 2); v2 = v1; // v1 is copied into v2. a modification of v1 does not affect v2 math_Vector v(1, 3); math_Matrix m(1, 3, 1, 3); Standard_Real value;v(2) = 1.0; value = v(1); m(1, 3) = 1.0; value = m(2, 2);Vector和Matrix對象上的某些操作可能不合法。在這種情況下會引發異常。使用了兩個異常:
- 當操作中涉及的兩個矩陣或向量具有不兼容的維度時,會引發Standard_DimensionError異常。
- 當操作中涉及的兩個矩陣或向量具有不兼容的維度時,會引發Standard_DimensionError異常。
數學算法
Gauss算法,為一組線性方程求Gauss解
class Gauss { public: Gauss (const math_Matrix& A); Standard_Boolean IsDone() const; void Solve (const math_Vector& B, math_Vector& X) const; }; #include <math_Vector.hxx> #include <math_Matrix.hxx> main () { math_Vector a(1, 3, 1, 3); math_Vector b1(1, 3), b2(1, 3); math_Vector x1(1, 3), x2(1, 3); // a, b1 and b2 are set here to the appropriate values math_Gauss sol(a); // computation of the // LU decomposition of A if(sol.IsDone()) { // is it OK ? sol.Solve(b1, x1); // yes, so compute x1 sol.Solve(b2, x2); // then x2 ... } else { // it is not OK: // fix up sol.Solve(b1, x1); // error: // StdFail_NotDone is raised } }
原子類
原子類是用來支持各種類別日期和時間信息的處理,以及大多數物理量的基本類型。例如長度,面積,體積,質量,密度,重量,溫度,壓力等。
原子類提供以下功能:
- 表示大部分數學和物理量的原始類型的定義;
- 單位轉換工具提供統一的機制來處理數量和相關的物理單位:檢查單位兼容性,執行不同單位之間的價值轉換等(參見)
- 管理時間信息(如日期和時間段)的資源
- 用于管理顏色定義的資源
轉載于:https://www.cnblogs.com/pcdack/p/10482911.html
總結
- 上一篇: 小白基础知识必备|| 整型常量与进制间的
- 下一篇: bash ps1变量_Shell PS1