OpenCascade Tcl vs. ACIS Scheme
摘要Abstract:本文通過(guò)OpenCascade的Tcl/Tk和ACIS的Scheme的對(duì)比來(lái)說(shuō)明腳本語(yǔ)言在程序中的重要作用。及通過(guò)在Tcl中實(shí)現(xiàn)自定義的命令來(lái)理解Draw Test Harness的實(shí)現(xiàn),在此基礎(chǔ)上更有利于對(duì)OpenCascade的理解,其中Draw Test Harness一些命令的實(shí)現(xiàn)可以做為程序?qū)崿F(xiàn)的參考。?
關(guān)鍵字Key Words:OpenCascade, Tcl/Tk, ACIS, Scheme, Test?
一、引言 Introduction
解釋型的語(yǔ)言為程序開(kāi)發(fā)提供了快速原型方法,由于是解釋型的程序開(kāi)發(fā)語(yǔ)言,所以用它編寫(xiě)的程序不需要編譯和鏈接就可以在解釋器中直接運(yùn)行,用這種方式可以快速驗(yàn)證一些想法,用來(lái)測(cè)試程序等。?
解釋型的腳本開(kāi)發(fā)語(yǔ)言有很多,流行的有Python、Tcl/Tk、Perl、Lua、LISP、Javascript等等。在應(yīng)用程序中嵌入這些腳本語(yǔ)言,方便程序的擴(kuò)展,用戶可以根據(jù)需要對(duì)程序進(jìn)行定制。像應(yīng)力分析軟件Abaqus中就使用了Python對(duì)其進(jìn)行二次開(kāi)發(fā);繪圖軟件AutoCAD中可使用AutoLISP對(duì)其進(jìn)行二次開(kāi)發(fā);造船軟件KCS Tribon中也使用了Python;AVEVA Marine/Plant中使用了PML;許多游戲程序中使用了Lua等等。程序有了腳本這個(gè)二次開(kāi)發(fā)的強(qiáng)有力工具,軟件開(kāi)發(fā)者只需要關(guān)注核心領(lǐng)域,其它各種客戶化的需求,可以通過(guò)這些腳本來(lái)實(shí)現(xiàn),既能滿足用戶花樣繁多的需求,也可確保程序質(zhì)量。?
ACIS對(duì)Scheme的擴(kuò)展為Scheme解釋器提供了調(diào)用ACIS內(nèi)部函數(shù)和訪問(wèn)ACIS內(nèi)部數(shù)據(jù)的功能,其中,每個(gè)Scheme函數(shù)都調(diào)用相應(yīng)的ACIS C++函數(shù)。開(kāi)發(fā)者可以利用Scheme來(lái)熟悉ACIS的基本功能、測(cè)試某些思想或者產(chǎn)生應(yīng)用程序原型。Scheme語(yǔ)言的初學(xué)者可以通過(guò)它來(lái)熟悉和掌握ACIS的Scheme程序開(kāi)發(fā)方法。?
OpenCascade中使用Tcl/Tk來(lái)實(shí)現(xiàn)的Draw Test Harness提供了交互創(chuàng)建、顯示和修改形狀的功能。可以編寫(xiě)Tcl的腳本來(lái)自定義Draw或者實(shí)現(xiàn)程序的自動(dòng)化測(cè)試。?
本文通過(guò)OpenCascade的Tcl/Tk和ACIS的Scheme的對(duì)比來(lái)說(shuō)明腳本在程序中的重要作用。及通過(guò)在Tcl中實(shí)現(xiàn)自定義的命令來(lái)理解Draw Test Harness的實(shí)現(xiàn),在此基礎(chǔ)上更有利于對(duì)OpenCascade的理解,其中一些命令的實(shí)現(xiàn)代碼可以做為程序?qū)崿F(xiàn)的參考。?
二、ACIS Scheme
ACIS中的Scheme接口是一些函數(shù)的集合,基于Scheme的應(yīng)用程序可以通過(guò)這些函數(shù)調(diào)用ACIS的API、類(lèi)的公共成員函數(shù)及訪問(wèn)ACIS的數(shù)據(jù)。ACIS系統(tǒng)中含有一個(gè)Scheme解釋器,Scheme應(yīng)用程序就在這個(gè)解釋器上運(yùn)行,所以該解釋器負(fù)責(zé)Scheme應(yīng)用程序與ACIS系統(tǒng)之間的通信。ACIS中的Scheme解釋器是按Elk版的Scheme語(yǔ)言規(guī)則設(shè)計(jì)的,它被用來(lái)解釋Scheme命令并調(diào)用相關(guān)的C++代碼。?
Figure 2.1 Scheme and ACIS?
Scheme的多功能性來(lái)自解釋器語(yǔ)言的可擴(kuò)展能力。應(yīng)用程序開(kāi)發(fā)者可以快速地將Scheme語(yǔ)言用于自己的開(kāi)發(fā)任務(wù),他們可以用C++擴(kuò)展Scheme,然后就可以利用這些擴(kuò)展寫(xiě)可解釋執(zhí)行的Scheme過(guò)程。開(kāi)發(fā)者也可以構(gòu)造特殊的Scheme數(shù)據(jù)類(lèi)型和相應(yīng)的操作方法,Scheme應(yīng)用程序和C++函數(shù)可以使用這些自定義的Scheme數(shù)據(jù)類(lèi)型。?
Figure 2.2 ACIS Scheme pipeline?
與C++相比Scheme是一種快速程序設(shè)計(jì)語(yǔ)言。盡管C++語(yǔ)言有很多優(yōu)點(diǎn),但是也不得承認(rèn)它的復(fù)雜性,例如要用C++開(kāi)發(fā)ACIS應(yīng)用程序,需要包含所需的組件頭文件并在程序中初始化這些組件,除此之外還要進(jìn)行復(fù)雜的程序調(diào)試,所以使用C++開(kāi)發(fā)應(yīng)用程序的速度就受到較大影響。與其相反,Scheme可以進(jìn)行交互式程序開(kāi)發(fā),一段程序或一個(gè)命令的執(zhí)行結(jié)果會(huì)及時(shí)反映出來(lái),正是這種機(jī)制使我們可以利用Scheme語(yǔ)言進(jìn)行快速的程序開(kāi)發(fā)。雖然Scheme不能替代C++成為主要的軟件開(kāi)發(fā)工具,但是在開(kāi)發(fā)一個(gè)軟件系統(tǒng)之前可以利用它進(jìn)行算法的測(cè)試。?
Scheme語(yǔ)言與C++語(yǔ)言相比有三個(gè)特點(diǎn):沒(méi)有指針、不需要頭文件及可進(jìn)行交互式程序設(shè)計(jì),程序員可以在解釋器中立即執(zhí)行這些程序,從這個(gè)特點(diǎn)來(lái)看Scheme更像Basic和Prolog等程序設(shè)計(jì)語(yǔ)言。?
在ACIS中使用Scheme來(lái)生成一個(gè)立方體的命令如下所示:
上述命令生成一個(gè)正方體,總共調(diào)用兩個(gè)ACIS Scheme過(guò)程position和solid:block,#[entity 1 0]是該正方體的默認(rèn)名稱。?
Figure 2.3 The block made by ACIS Scheme?
三、OpenCascade Tcl
Tcl是一種用于控制和擴(kuò)展應(yīng)用程序的動(dòng)態(tài)語(yǔ)言,也稱為腳本語(yǔ)言。它的名字代表“工具命令語(yǔ)言”Tool Command Language。Tcl提供的通用編程能力可以滿足大多數(shù)應(yīng)用程序的需要。而且Tcl既是可嵌入的(embeded),也是可擴(kuò)展的(extensible)。它的解釋器是一個(gè)C函數(shù)庫(kù),可以很容易地整合到應(yīng)用程序中;而任何一個(gè)應(yīng)用程序都可以通過(guò)增加命令來(lái)擴(kuò)展Tcl內(nèi)核的功能。Tcl最有用的一個(gè)擴(kuò)展就是Tk,這是一個(gè)用于開(kāi)發(fā)圖形用戶界面(Graphical User Interface, GUI)應(yīng)用程序的工具集。Tk擴(kuò)展了Tcl內(nèi)核的功能,增加了構(gòu)建用戶界面的命令,使您可以使用Tcl腳本來(lái)構(gòu)建圖形用戶界面,而不必寫(xiě)C代碼。?
Tcl/Tk一起為應(yīng)用程序開(kāi)發(fā)者和使用者提供了很多好處。首先是快速開(kāi)發(fā)。很多有意思的程序完全可以用Tcl腳本編寫(xiě)。這使您可以在比C/C++或Java更高的層次上進(jìn)行開(kāi)發(fā),Tk隱藏了C或Java程序員必須關(guān)心的很多細(xì)節(jié)。與低級(jí)工具相比,使用Tcl/Tk所需要學(xué)習(xí)的知識(shí)更少,需要編寫(xiě)的代碼更少。通過(guò)幾個(gè)小時(shí)的學(xué)習(xí),Tcl/Tk新手用戶就可以創(chuàng)建有意思的用戶界面,很多開(kāi)發(fā)人員從其他工具集轉(zhuǎn)而使用Tcl/Tk工具集后,應(yīng)用程序開(kāi)發(fā)所需的代碼數(shù)量和開(kāi)發(fā)時(shí)間都減少了90%。?
Tcl/Tk適于快速開(kāi)發(fā)的另一個(gè)原因在于Tcl是解釋型語(yǔ)言。使用Tcl應(yīng)用程序時(shí),可以在運(yùn)行中生成和使用新的腳本,而無(wú)需重新編譯和重啟程序。這使您可以迅速嘗試新的想法,迅速修正程序中的錯(cuò)誤。因?yàn)門(mén)cl是解釋型語(yǔ)言,它的運(yùn)行速度比C程序慢。但是通過(guò)內(nèi)部?jī)?yōu)化,與編譯語(yǔ)言相比的大部分性能差距都可以消除。例如,您可以運(yùn)行有數(shù)百條Tcl命令的腳本,鼠標(biāo)的每一次移動(dòng)都不會(huì)有能感知的延遲。在一些特別的場(chǎng)合,當(dāng)性能成為重要問(wèn)題時(shí),可以把Tcl腳本中影響性能的部分替換為C代碼。?
Tcl的第二個(gè)好處是在于它是跨平臺(tái)的語(yǔ)言,它的大多數(shù)擴(kuò)展包括Tk也是如此。這意味著在一個(gè)平臺(tái)(如Linux)上開(kāi)發(fā)的程序,在大多數(shù)情況下可以不加改動(dòng)地在另一個(gè)平臺(tái)上運(yùn)行,如在Macintosh或Windows上運(yùn)行。?
Tcl還是第一種擁有原生Unicode支持的動(dòng)態(tài)語(yǔ)言。因此,Tcl可以處理這個(gè)世界上幾乎所有的書(shū)面語(yǔ)言。Tcl無(wú)需擴(kuò)展就可以處理Unicode支持的所有文本。?
使用Tcl的另一個(gè)顯著優(yōu)點(diǎn)在于它和它的大多數(shù)擴(kuò)展都是免費(fèi)的開(kāi)源軟件。Tcl和Tk遵循BSD授權(quán),允許所有人免費(fèi)下載、查看、修改及再發(fā)布。?
Tcl是一種絕妙的“膠合語(yǔ)言”,可以讓?xiě)?yīng)用程序很容易地?fù)碛袕?qiáng)大的腳本語(yǔ)言功能。例如,要為一個(gè)已經(jīng)存在的應(yīng)用程序添加腳本能力,只需要實(shí)現(xiàn)幾條新的Tcl命令,用來(lái)為應(yīng)用程序提供相應(yīng)的基本功能。然后再把您的新命令和Tcl庫(kù)鏈接起來(lái)生成全功能的腳本語(yǔ)言,該語(yǔ)言就包含了Tcl提供的命令(稱為T(mén)cl內(nèi)核)和您編寫(xiě)的那些命令。?
Tcl還為用戶提供了方便。一旦學(xué)習(xí)了Tcl/Tk,就能為任何Tcl/Tk應(yīng)用程序編寫(xiě)腳本,只需要學(xué)習(xí)該應(yīng)用程序特有的少數(shù)幾條命令即可。這使得更多的用戶有能力對(duì)應(yīng)用程序進(jìn)行個(gè)性化改造和強(qiáng)化。?
在Tcl中實(shí)現(xiàn)自定義命令很方便,只需要按Tcl的格式定義一個(gè)命令函數(shù)。基于對(duì)象的命令函數(shù)的聲明如下:
為了能在Tcl中調(diào)用一個(gè)命令函數(shù),必須先調(diào)用Tcl_CreateObjCommand注冊(cè)它,格式如下所示:
這就是把Tcl中的字符串與實(shí)現(xiàn)它的C函數(shù)關(guān)聯(lián)起來(lái)“魔術(shù)”。更詳細(xì)內(nèi)容請(qǐng)參考:《 Create New Commands in Tcl 》。下面主要來(lái)分析一下Draw Test Harness代碼實(shí)現(xiàn):?
首先在Draw_PInterp.hxx中將Tcl_Interp定義為*Draw_PInterp,并在類(lèi)Draw_Interpretor中對(duì)Tcl解釋器進(jìn)行了簡(jiǎn)單封裝,在Init時(shí)創(chuàng)建一個(gè)新的Tcl_Interp,并可管理自定義的命令;?
然后,在Draw_Main中來(lái)加載Tcl的解析器。程序代碼如下所示:?
// Declarations of macros DRAW_MAIN to be used in executables instead of explicit main/WinMain #ifndef WNT // main() #define DRAW_MAIN int main (Standard_Integer argc, char* argv[])\ { return _main_ (argc, argv, Draw_InitAppli);} #else // WinMain() and main() #define DRAW_MAIN Standard_Integer PASCAL WinMain (HINSTANCE hInstance, HINSTANCE hPrevinstance, LPSTR lpCmdLine, Standard_Integer nCmdShow)\ { return _WinMain_ (hInstance, hPrevinstance, lpCmdLine, nCmdShow, Draw_InitAppli);}\ \ int main ( int argc, char * argv[], char * envp[])\ { return _main_ (argc, argv, envp, Draw_InitAppli);} #endif
自定義了main函數(shù),實(shí)現(xiàn)如下所示:?
// ======================================================================= // function : _main_ // purpose : // ======================================================================= Standard_Integer _main_ ( int argc, char * argv[], char * envp[], const FDraw_InitAppli fDraw_InitAppli) { Draw_IsConsoleSubsystem = Standard_True; // return _WinMain_(::GetModuleHandle(NULL), NULL, GetCommandLine(), SW_SHOW, fDraw_InitAppli); theDraw_InitAppli = fDraw_InitAppli; // ParseCommandLine(GetCommandLine()); // MKV 01.02.05 #if ((TCL_MAJOR_VERSION > 8) || ((TCL_MAJOR_VERSION == 8) && (TCL_MINOR_VERSION >= 4))) Tcl_FindExecutable(argv[ 0 ]); #endif Draw_Appli(::GetModuleHandle(NULL), NULL, GetCommandLine(), SW_SHOW, fDraw_InitAppli); return 0 ; }
Draw Test Harness中自定義的命令是通過(guò)類(lèi)Draw_Commands來(lái)添加的,程序如下所示:
void Draw::Commands(Draw_Interpretor& theCommands) { Draw::BasicCommands(theCommands); Draw::VariableCommands(theCommands); Draw::GraphicCommands(theCommands); Draw::PloadCommands(theCommands); Draw::UnitCommands(theCommands); }
分別對(duì)應(yīng)的定義文件為:?
l Draw_BasicCommands.cxx:基本命令;?
l Draw_VariableCommands.cxx:變量命令;?
l Draw_GraphicCommands.cxx:圖形命令;?
l Draw_PloadCommands.cxx:加載命令;?
l Draw_UnitCommands.cxx:?jiǎn)挝幻睿?
如可以打開(kāi)Draw_BasicCommands可以看到OpenCascade定義了哪些基本命令,我發(fā)現(xiàn)一個(gè)查看OpenCascade編譯時(shí)的配置信息的命令dversion:?
運(yùn)行結(jié)果如下圖所示:?
Figure 3.1 dversion command in Draw Test Harness?
由上圖可知編譯OpenCascade時(shí)的相關(guān)配置信息,如版本號(hào)、使用了哪些第三方庫(kù)、編譯器類(lèi)型及版本、系統(tǒng)類(lèi)型x86/AMD64、操作系統(tǒng)等等。?
Figure 3.2 The OS OpenCascade supported?
由上圖可知OpenCascade可識(shí)別的操作系統(tǒng)涵蓋發(fā)當(dāng)今主流的操作系統(tǒng),如Windows、Mac OS、Android、Linux等。?
最后以一個(gè)實(shí)現(xiàn)光線追蹤的腳本來(lái)演示一下使用腳本的靈活性,Tcl腳本如下所示:?
# Script reproducing creation of bottle model as described in OCCT Tutorial pload MODELING VISUALIZATION puts " Writing \"eryar@163.com\"... " box body 0 0 0 130 20 8 # define text Courier Consolas text2brep text2d eryar@ 163 .com Times-Roman 18 bold composite= 0 #text2brep text2d eryar@ 163 .com Consolas 18 bold composite= 0 #text2brep text2d eryar@ 163 .com Courier 18 bold composite= 0 prism text text2d 0 0 2 ttranslate text 4 5 6 # cut operation bcut bodytext body text ttranslate text 0 20 0 puts " Showing result... " # display result vdisplay bodytext vdisplay text vzfit vfit vsetdispmode 1 # set ray tracing if { [regexp {HAVE_OPENCL} [dversion]] } { puts " Trying raytrace mode... " if { ! [ catch {vraytrace 1 }] } { vtextureenv on 1 vfit } }
腳本實(shí)現(xiàn)了在一個(gè)box上cut掉文本后的光線跟蹤效果,如下圖所示:?
Figure 3.3 Ray Tracing Rendering by Tcl?
理解了Tcl的作用之后,我認(rèn)為OpenCascade提供的最快速的的開(kāi)發(fā)方式應(yīng)該就是全部使用Tcl/Tk來(lái)開(kāi)發(fā)程序。利用OpenCascade已經(jīng)定義好的命令,包括操作ApplicationFramework的自定義命令。在此基礎(chǔ)上,使用Tk來(lái)實(shí)現(xiàn)GUI及用戶交互操作,這樣開(kāi)發(fā)程序事辦功倍,而且還可提供用戶二次開(kāi)發(fā)功能,即使用Tcl/Tk來(lái)對(duì)程序進(jìn)行二次開(kāi)發(fā),擴(kuò)展能力強(qiáng)。?
四、結(jié)論 Conclusion
造型程序中引入腳本語(yǔ)言的共同優(yōu)點(diǎn)有:腳本語(yǔ)言是解釋執(zhí)行,不需要編譯鏈接,可以即時(shí)驗(yàn)證一些想法。還可使用腳本來(lái)執(zhí)行自動(dòng)化測(cè)試,保證算法質(zhì)量。便于擴(kuò)展,提供用戶二次開(kāi)發(fā)的工具。?
與ACIS的Scheme相比,OpenCascade的Tcl/Tk有著明顯的優(yōu)勢(shì)。其中最明顯的就是源代碼開(kāi)放,可以通過(guò)查看源程序,來(lái)完全理解腳本的實(shí)現(xiàn)。而這在ACIS中是不可能的。?
理解如何在Tcl實(shí)現(xiàn)自定義的命令后,可以查看OpenCascade在Draw Test Harness中相關(guān)程序的實(shí)現(xiàn)方法,對(duì)學(xué)習(xí)一些造型算法的使用還是很有幫助的。?
五、后記 Postscript
在曹金鳳《Python語(yǔ)言在Abaqus中的應(yīng)用》的序言一中看到這樣一段話:“我還想順便談一個(gè)體會(huì):同50年前有限元方法出現(xiàn)的時(shí)代相比,現(xiàn)在有了大量有效的計(jì)算力學(xué)軟件。既然已經(jīng)有了大家公認(rèn)的很優(yōu)秀的分析平臺(tái),研究者不應(yīng)再奮力去開(kāi)發(fā)具有競(jìng)爭(zhēng)力的新軟件了,而應(yīng)當(dāng)把精力花在基于這些平臺(tái)進(jìn)行二次開(kāi)發(fā)上面了。從科學(xué)技術(shù)共同體的角度去思考,這應(yīng)當(dāng)是如今計(jì)算力學(xué)軟件研發(fā)的最佳策略。”——隋允康于北京工業(yè)大學(xué)。?
對(duì)于這段話的大部分內(nèi)容是贊同的,即站在巨人的肩上才能看得更遠(yuǎn)。但縱觀當(dāng)今力學(xué)分析的CAE軟件優(yōu)秀的大都是國(guó)外產(chǎn)品,如ANSYS、Abaqus、COADE.CAESAR、MSC/PATRAN、ADINA等等,而國(guó)內(nèi)同類(lèi)產(chǎn)品鮮有耳聞。原因可能是CAE軟件的開(kāi)發(fā)涉及的知識(shí)很多,需要計(jì)算機(jī)圖形學(xué)、軟件工程、力學(xué)、數(shù)學(xué)等等多學(xué)科知識(shí)的結(jié)合,所以開(kāi)發(fā)具有自主知識(shí)產(chǎn)權(quán)的CAE軟件也是國(guó)家科技實(shí)力的一個(gè)表現(xiàn)。若只是在外國(guó)人的平臺(tái)上二次開(kāi)發(fā),總是會(huì)受制于人。也許有些狹隘,如今世界已然是個(gè)地球村,科學(xué)無(wú)國(guó)界。?
六、參考資料 References
1. Tcl and the Tk Toolkit?
2. Practical Programming in Tcl and Tk?
3. Tcl/Tk A Developer’s Guide?
4. http://sourceforge.net/projects/tcl/
6. 詹海生等, 基于ACIS的幾何造型技術(shù)與系統(tǒng)開(kāi)發(fā), 清華大學(xué)出版社, 2002?
7. 曹金鳳, 王旭春, 孔亮. Python語(yǔ)言在Abaqus中的應(yīng)用. 機(jī)械工業(yè)出版社, 2011
?
致謝:
??? 感謝王婷讓我接觸到ABAQUS這個(gè)軟件。
?
PDF Version: OpenCascade Tcl vs. ACIS Scheme
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
