• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            eryar

            PipeCAD - Plant Piping Design Software.
            RvmTranslator - Translate AVEVA RVM to OBJ, glTF, etc.
            posts - 603, comments - 590, trackbacks - 0, articles - 0

            Open CASCADE Foundation Classes – Basics

            Posted on 2012-08-23 20:28 eryar 閱讀(4435) 評(píng)論(2)  編輯 收藏 引用 所屬分類(lèi): 2.OpenCASCADE

            Open CASCADE Foundation ClassesBasics

            Open CASCADE 基礎(chǔ)庫(kù)之基本功能

            eryar@163.com

            本章主要介紹Open CASCADE的基本功能,如內(nèi)存管理(memory management)、手柄編程(programming with handles)、基本類(lèi)型(primitive types)、異常處理(exception handling)、泛型編程(genericity by downcasting)、Plug-in的創(chuàng)建等……

            一、數(shù)據(jù)類(lèi)型 Data Types

            1.1 基本類(lèi)型 Primitive Types

            基本類(lèi)型是由語(yǔ)言定義的且他們是由值控制的。有些基本類(lèi)型從類(lèi)Storable繼承而來(lái)。這就意味著他們可以在持久性對(duì)象中使用,或者被包含在對(duì)象的方法中,或者作為對(duì)象內(nèi)部的一部分。由類(lèi)Standard_Storable派生的類(lèi)有:

            l Boolean: 用來(lái)表示邏輯數(shù)據(jù)。只有兩種狀態(tài):Standard_TrueStandard_False;

            l Character: 用來(lái)表示任意ASCII字符;

            l ExtCharacter: 用來(lái)表示字符的擴(kuò)展;

            l Integer: 用來(lái)表示整數(shù);

            l Real: 用來(lái)表示實(shí)數(shù);

            l ShortReal: 用來(lái)表示實(shí)數(shù)的另一種選擇,精度要低;

            也有非存儲(chǔ)類(lèi)型,如:

            l CString:

            l ExtString:

            l Address:

            下表所示為Open CASCADE中基本類(lèi)型與C++中基本類(lèi)型對(duì)應(yīng)表:

            C++ Types

            Open CASCADE Types

            int

            Standard_Integer

            double

            Standard_Real

            float

            Standard_ShortReal

            unsigned int

            Standard_Boolean

            Standard_False = 0;

            Standard_True = 1;

            char

            Standard_Character

            short

            Standard_ExtCharacter

            char*

            Standard_CString

            void*

            Standard_Address

            short*

            Standard_ExtString

            clip_image002 使用上述基本類(lèi)型的注意事項(xiàng):

            具體請(qǐng)參考《Open CASCADE Foundation Classes User's Guide》;

            1.2 由值控制的類(lèi)型

            由值控制的變量類(lèi)型分為三類(lèi):

            l 基本類(lèi)型;

            l 枚舉類(lèi)型;

            l 不是由類(lèi)Standard_Persistent直接或間接派生的類(lèi);

            由值控制的變量比由手柄控制的變量更直接,更快,就是不能保存到文件。

            clip_image004

            1.3 由引用控制的類(lèi)型

            由手柄控制的變量分為兩類(lèi):

            l 由類(lèi)Persistent派生的類(lèi),這種類(lèi)可以保存到文件;

            l 由類(lèi)Transient派生的類(lèi);

            clip_image006

            1.4 屬性的結(jié)論

            clip_image008

            二、手柄編程 Programming with Handles

            2.1 手柄定義 Handle Definition

            手柄與C++的指針(pointer)類(lèi)似。幾個(gè)手柄可以引用同一個(gè)對(duì)象,同樣地,一個(gè)手柄也可以引用了幾個(gè)對(duì)象,但是一次只能是一個(gè)對(duì)象。為了訪問(wèn)引用的對(duì)象,必須先解除引用(de-referenced),就像使用C++的指針一樣。臨時(shí)變量和持久變量既可以是由值控制的也可以是由手柄控制的。引用非持久性對(duì)象的手柄稱(chēng)為不可存儲(chǔ)手柄。因此,持久性對(duì)象不能包含不可存儲(chǔ)手柄。

            類(lèi)的組織:使用手柄的類(lèi)的對(duì)象可以是持久的也可是臨時(shí)的。從類(lèi)Standard_Transient繼承的類(lèi)的實(shí)例是臨時(shí)的,而從類(lèi)Standard_Persistent繼承的類(lèi)的實(shí)例是持久的。本章只討論臨時(shí)類(lèi)及其相關(guān)的手柄。持久類(lèi)及其相關(guān)的手柄的組織與此類(lèi)似。

            類(lèi)Standard_TransientOpen CASCADE中由手柄控制的類(lèi)層次結(jié)構(gòu)中的基類(lèi)。它有引用計(jì)數(shù)部分,所有的子類(lèi)都繼承此部分。當(dāng)使用Handle()類(lèi)時(shí),就可知引手柄引用實(shí)例的數(shù)量。

            直接或間接由類(lèi)Transient派生的類(lèi),CDL extractor將創(chuàng)建類(lèi)的相應(yīng)的手柄Handle(),類(lèi)名是相同的,只是在類(lèi)名前加上了“Handle_*”。Open CASCADE提供預(yù)處理器的宏定義Handle(),用來(lái)產(chǎn)生相應(yīng)類(lèi)的帶手柄的類(lèi)。

            使用手柄:在對(duì)臨時(shí)對(duì)象執(zhí)行任何操作之前,你必須聲明手柄。如:若點(diǎn)(Point)和線(Line)是從包Geom中定義的兩個(gè)臨時(shí)對(duì)象,代碼如下:

            clip_image010

            聲明手柄創(chuàng)建了一個(gè)未指向任何對(duì)象的空手柄。手柄可以通過(guò)其方法IsNull()來(lái)驗(yàn)證。使用手柄無(wú)效,可使用方法Nullify()。

            只要類(lèi)型兼容,既可以從創(chuàng)建新的對(duì)象或通過(guò)賦值來(lái)初始化手柄。手柄僅用于共享的對(duì)象。對(duì)于所有的本地操作,建議使用由值控制的類(lèi)。

            2.2 類(lèi)型管理 Type Management

            Open CASCADE提供一種描述數(shù)據(jù)類(lèi)型層次的通用方式,并且可以運(yùn)行時(shí)檢查對(duì)象類(lèi)型,與C++的RTTI類(lèi)似。對(duì)于從類(lèi)Standard_Transient繼承的每個(gè)類(lèi),CDL extractor從類(lèi)Standard_Type創(chuàng)建代碼。由類(lèi)Standard_Transient派生的類(lèi)的虛函數(shù)DynamicType()返回一個(gè)實(shí)例。通過(guò)虛函數(shù)IsKind()來(lái)檢查給定的對(duì)象是不是指定的類(lèi)型。

            2.3 使用手柄創(chuàng)建對(duì)象 Using Handles to Create Objects

            創(chuàng)建由手柄控制的對(duì)象,聲明手柄并使用標(biāo)準(zhǔn)C++的new操作符,緊隨其后調(diào)用構(gòu)造函數(shù)。

            clip_image012

            與指針不同的是,手柄不需要delete。因?yàn)楫?dāng)手柄引用的對(duì)象為零時(shí),對(duì)象將會(huì)被自動(dòng)釋放。

            2.4 方法調(diào)用 Invoking Methods

            當(dāng)你使用手柄的時(shí)候,就跟使用C++的指針一樣。調(diào)用手柄引用對(duì)象的方法使用操作符->。檢查或修改手柄的狀態(tài),通過(guò)操作符點(diǎn).來(lái)實(shí)現(xiàn)。下例所示為訪問(wèn)一個(gè)點(diǎn)對(duì)象的坐標(biāo):

            clip_image014

            下例所示為如何檢查笛卡爾坐標(biāo)點(diǎn)的類(lèi)型:

            clip_image016

            當(dāng)調(diào)用一個(gè)空Null手柄時(shí),NullObject異常將會(huì)產(chǎn)生。

            調(diào)用類(lèi)方法:類(lèi)方法就是C++類(lèi)中的靜態(tài)函數(shù)。即用類(lèi)名加上“::”和方法名來(lái)調(diào)用。

            clip_image018

            2.5 手柄釋放 Handle De-allocation

            在刪除一個(gè)對(duì)象之前,必須其沒(méi)有被引用。為了減少管理對(duì)象生命周期的編程工作量,Open CASCADE中對(duì)象的刪除函數(shù)是由手柄控制類(lèi)的引用計(jì)數(shù)(reference counter)來(lái)確保。手柄就是用來(lái)管理引用計(jì)數(shù),當(dāng)對(duì)象不再引用時(shí)將會(huì)調(diào)用delete將其刪除。當(dāng)是Standard_Transient的子類(lèi)時(shí),通常不需要直接使用delete操作符。當(dāng)對(duì)相同的對(duì)象使用new時(shí),引用計(jì)數(shù)將會(huì)增加。當(dāng)手柄被銷(xiāo)毀、置為空或重新賦值,引用計(jì)數(shù)將會(huì)減少。當(dāng)引用計(jì)數(shù)為0時(shí)對(duì)象將會(huì)自動(dòng)調(diào)用delete操作符。內(nèi)存分配的原理如下所示:

            clip_image020

            Cycles

            本段內(nèi)容不清楚,具體內(nèi)容請(qǐng)參考原文。

            2.6 不使用CDL創(chuàng)建類(lèi) Creating Transient Classes without CDL

            盡管可用CDL extractor生成手柄類(lèi)及其相關(guān)C++代碼,然而也可不用CDL管理手柄。為此,在文件Standard_DefineHandle.hxx中提供了幾個(gè)宏定義:

            DECLARE_STANDARD_HANDLE(class_name, ancestor_name) 這個(gè)宏定義了以class_name為類(lèi)名并繼承類(lèi)ancestor_name的手柄類(lèi)。這個(gè)宏必須放在頭文件中,且基類(lèi)必須是可用的。

            IMPLEMENT_STANDARD_HANDLE(class_name, ancestor_name) 這個(gè)宏實(shí)現(xiàn)了轉(zhuǎn)換方法DownCast(),應(yīng)該在C++文件中使用。

            DEFINE_STANDARD_RTTI(class_name) 這個(gè)宏聲明方法需要RTTI支持,應(yīng)該在類(lèi)的public中使用。

            IMPLEMENT_STANDARD_RTTIEXT(class_name, ancestor_name) 實(shí)現(xiàn)上面的方法。

            注:在使用這些宏的時(shí)候,必須確保參數(shù)的正確性,特別是父類(lèi)的名字。否則定義將會(huì)不正確,且編譯也不會(huì)報(bào)錯(cuò)。

            clip_image022

            clip_image024

            三、內(nèi)存管理 Memory Management in Open CASCADE

            在幾何建模的過(guò)程中,程序創(chuàng)建和刪除相當(dāng)數(shù)量的C++對(duì)象在動(dòng)態(tài)內(nèi)存中,也就是堆中(heap)。在這種情況下,標(biāo)準(zhǔn)函數(shù)管理內(nèi)存的性能可能不足夠。所以,Open CASCADE在標(biāo)準(zhǔn)包中實(shí)現(xiàn)了內(nèi)存的管理。

            3.1 用法 Usage

            使用Open CASCADE內(nèi)存管理只需要在C中使用malloc()的地方使用Standard::Allocate();在使用free()的地方使用Standard::Free();在使用realloc()的地方使用Standard::Reallocate()。

            C++中,類(lèi)的操作符new()和delete()已經(jīng)定義了在申請(qǐng)內(nèi)存時(shí)使用Standard::Allocate()并在釋放時(shí)使用Standard::Free()。所以,類(lèi)所有的對(duì)象的內(nèi)存都將由Open CASCADE的內(nèi)存管理器來(lái)管理。

            CDL extractor為所有的類(lèi)定義了new()和delete()。所以,所有的Open CASCADE的類(lèi)(小部分除外)都使用Open CASCADE的內(nèi)存管理器。

            由于操作符new()和delete()被繼承,所以,所有從Open CASCADE派生的類(lèi),所有從Standard_Transient類(lèi)派生的類(lèi)都是由內(nèi)存管理器管理。

            注:若重載了部分從Standard_Transient類(lèi)派生類(lèi)的new()和delete(),盡管不推薦這樣做,方法Delete()必須重定義,以便對(duì)這樣的指針使用delete操作。這將確保合適的delete()函數(shù)將會(huì)被調(diào)用,即使是由手柄控制的對(duì)象。

            3.2 配置內(nèi)存管理器 Configuring Memory Manager

            Open CASCADE內(nèi)存管理器可以被配置以便對(duì)不同的內(nèi)存區(qū)域使用不同的優(yōu)化技術(shù),或者根本不使用任何優(yōu)化而直接使用Cmalloc()和free()函數(shù)。配置方法為修改環(huán)境變量的值:

            l MMGT_OPT

            l MMGT_CLEAR

            l MMGT_CELLSIZE:

            l MMGT_NBPAGES:

            l MMGT_THRESHOLD:

            l MMGT_REENTRANT:

            3.3 實(shí)現(xiàn)細(xì)節(jié) Implementation details

            本段內(nèi)容請(qǐng)參考原文。

            四、異常處理 Exception Handling

            異常處理提供了一種從指定點(diǎn)轉(zhuǎn)換到其他點(diǎn)的一種方法。一個(gè)方法可能會(huì)產(chǎn)生一個(gè)異常,將程序從正常執(zhí)行處轉(zhuǎn)換到捕捉異常處。Open CASCADE提供了異常類(lèi)的層次,其基類(lèi)是包Standard中的Standard_FailureCDL extractor使用標(biāo)準(zhǔn)接口生成異常類(lèi)。

            Open CASCADE也提供將系統(tǒng)信號(hào)的轉(zhuǎn)換成異常的支持,如數(shù)除0這樣所有的情況都可以用安全、統(tǒng)一的方法來(lái)處理了。但是為了支持不同的平臺(tái),也使用了一些特殊的方法。

            如下內(nèi)容為在Open CASCADE中使用異常處理的推薦方法。

            4.1 產(chǎn)生異常 Raising an Exception

            類(lèi)C++的語(yǔ)法:產(chǎn)生適當(dāng)?shù)漠惓⑿枰{(diào)用指定類(lèi)型的Raise()方法。

            clip_image026

            產(chǎn)生了一個(gè)DomainError類(lèi)型的異常并可附上相關(guān)信息“Cannot cope with this condition”,信息字符串是可選的。這個(gè)異常可以被捕捉DomainError類(lèi)型的Handler捕捉到:

            clip_image028

            正常使用異常處理:異常不能被當(dāng)作編程技巧來(lái)替代“goto”,但可作為防止方法被誤用的一種方法。

            五、Plug-In管理

            本段內(nèi)容請(qǐng)參考原文。

            六、結(jié)論

            本章內(nèi)容介紹了一些C++編程的知識(shí)及Open CASCADE對(duì)C++的包裝。其中,手柄編程是C++中常見(jiàn)的方法,這種引用計(jì)數(shù)的方式使內(nèi)存的管理更方便。

             

            eryar@163.com

            Pudongxin Shanghai China

            2012-8-23

            Feedback

            # re: Open CASCADE Foundation Classes &ndash; Basics  回復(fù)  更多評(píng)論   

            2012-08-24 13:18 by 力為
            用這個(gè)的越來(lái)越多了,好事情!

            # re: Open CASCADE Foundation Classes &ndash; Basics  回復(fù)  更多評(píng)論   

            2012-08-26 09:17 by eryar
            學(xué)習(xí)學(xué)習(xí), 希望能做點(diǎn)東西出來(lái)@力為
            久久久久综合国产欧美一区二区| 伊人久久无码精品中文字幕| 一本一道久久a久久精品综合| 久久国产热精品波多野结衣AV| 97久久超碰国产精品旧版| 97久久久精品综合88久久| 99久久99久久精品国产片果冻| 久久99国产综合精品| 国产女人aaa级久久久级| 中文精品99久久国产| 婷婷久久综合九色综合绿巨人| 亚洲精品乱码久久久久久蜜桃图片| 国产精品99久久免费观看| 亚洲AV无码久久精品狠狠爱浪潮| 99精品久久久久久久婷婷| 国产精品美女久久福利网站| 青青热久久综合网伊人| 亚洲人成无码久久电影网站| 亚洲国产综合久久天堂| 亚洲欧美另类日本久久国产真实乱对白| 亚洲人AV永久一区二区三区久久| 伊人久久大香线蕉综合Av| 精品久久久久久亚洲精品| 99久久精品国产一区二区| 精品久久久久久无码不卡| 五月丁香综合激情六月久久| 久久精品国产亚洲综合色| 精品久久久久久久无码 | 国产精品成人久久久| 久久99久久99精品免视看动漫| 国产成人久久精品麻豆一区| 亚洲国产成人久久综合野外 | 久久99久国产麻精品66| 精品免费tv久久久久久久| 亚洲精品国产自在久久| 国产精品久久影院| 伊人色综合九久久天天蜜桃| 2022年国产精品久久久久| 国产精品久久久久久久久软件| 久久青草国产精品一区| 波多野结衣AV无码久久一区|