• <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

            OpenCascade Tcl vs. ACIS Scheme

            Posted on 2014-01-19 12:57 eryar 閱讀(3756) 評論(7)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

            OpenCascade Tcl vs. ACIS Scheme

            eryar@163.com

            摘要Abstract:本文通過OpenCascade的Tcl/Tk和ACIS的Scheme的對比來說明腳本語言在程序中的重要作用。及通過在Tcl中實現自定義的命令來理解Draw Test Harness的實現,在此基礎上更有利于對OpenCascade的理解,其中Draw Test Harness一些命令的實現可以做為程序實現的參考。

            關鍵字Key Words:OpenCascade, Tcl/Tk, ACIS, Scheme, Test

            一、引言 Introduction

            解釋型的語言為程序開發提供了快速原型方法,由于是解釋型的程序開發語言,所以用它編寫的程序不需要編譯和鏈接就可以在解釋器中直接運行,用這種方式可以快速驗證一些想法,用來測試程序等。

            解釋型的腳本開發語言有很多,流行的有Python、Tcl/Tk、Perl、Lua、LISP、Javascript等等。在應用程序中嵌入這些腳本語言,方便程序的擴展,用戶可以根據需要對程序進行定制。像應力分析軟件Abaqus中就使用了Python對其進行二次開發;繪圖軟件AutoCAD中可使用AutoLISP對其進行二次開發;造船軟件KCS Tribon中也使用了Python;AVEVA Marine/Plant中使用了PML;許多游戲程序中使用了Lua等等。程序有了腳本這個二次開發的強有力工具,軟件開發者只需要關注核心領域,其它各種客戶化的需求,可以通過這些腳本來實現,既能滿足用戶花樣繁多的需求,也可確保程序質量。

            ACIS對Scheme的擴展為Scheme解釋器提供了調用ACIS內部函數和訪問ACIS內部數據的功能,其中,每個Scheme函數都調用相應的ACIS C++函數。開發者可以利用Scheme來熟悉ACIS的基本功能、測試某些思想或者產生應用程序原型。Scheme語言的初學者可以通過它來熟悉和掌握ACIS的Scheme程序開發方法。

            OpenCascade中使用Tcl/Tk來實現的Draw Test Harness提供了交互創建、顯示和修改形狀的功能。可以編寫Tcl的腳本來自定義Draw或者實現程序的自動化測試。

            本文通過OpenCascade的Tcl/Tk和ACIS的Scheme的對比來說明腳本在程序中的重要作用。及通過在Tcl中實現自定義的命令來理解Draw Test Harness的實現,在此基礎上更有利于對OpenCascade的理解,其中一些命令的實現代碼可以做為程序實現的參考。

            二、ACIS Scheme

            ACIS中的Scheme接口是一些函數的集合,基于Scheme的應用程序可以通過這些函數調用ACIS的API、類的公共成員函數及訪問ACIS的數據。ACIS系統中含有一個Scheme解釋器,Scheme應用程序就在這個解釋器上運行,所以該解釋器負責Scheme應用程序與ACIS系統之間的通信。ACIS中的Scheme解釋器是按Elk版的Scheme語言規則設計的,它被用來解釋Scheme命令并調用相關的C++代碼。

            wps_clip_image-23561

            Figure 2.1 Scheme and ACIS

            Scheme的多功能性來自解釋器語言的可擴展能力。應用程序開發者可以快速地將Scheme語言用于自己的開發任務,他們可以用C++擴展Scheme,然后就可以利用這些擴展寫可解釋執行的Scheme過程。開發者也可以構造特殊的Scheme數據類型和相應的操作方法,Scheme應用程序和C++函數可以使用這些自定義的Scheme數據類型。

            wps_clip_image-2462

            Figure 2.2 ACIS Scheme pipeline

            與C++相比Scheme是一種快速程序設計語言。盡管C++語言有很多優點,但是也不得承認它的復雜性,例如要用C++開發ACIS應用程序,需要包含所需的組件頭文件并在程序中初始化這些組件,除此之外還要進行復雜的程序調試,所以使用C++開發應用程序的速度就受到較大影響。與其相反,Scheme可以進行交互式程序開發,一段程序或一個命令的執行結果會及時反映出來,正是這種機制使我們可以利用Scheme語言進行快速的程序開發。雖然Scheme不能替代C++成為主要的軟件開發工具,但是在開發一個軟件系統之前可以利用它進行算法的測試。

            Scheme語言與C++語言相比有三個特點:沒有指針、不需要頭文件及可進行交互式程序設計,程序員可以在解釋器中立即執行這些程序,從這個特點來看Scheme更像Basic和Prolog等程序設計語言。

            在ACIS中使用Scheme來生成一個立方體的命令如下所示:

            acis>(solid:block(position -10-10-10) (position 101010)) 
            # [entity 
            1 0

            上述命令生成一個正方體,總共調用兩個ACIS Scheme過程position和solid:block,#[entity 1 0]是該正方體的默認名稱。

            wps_clip_image-7598

            Figure 2.3 The block made by ACIS Scheme

            三、OpenCascade Tcl

            Tcl是一種用于控制和擴展應用程序的動態語言,也稱為腳本語言。它的名字代表“工具命令語言”Tool Command Language。Tcl提供的通用編程能力可以滿足大多數應用程序的需要。而且Tcl既是可嵌入的(embeded),也是可擴展的(extensible)。它的解釋器是一個C函數庫,可以很容易地整合到應用程序中;而任何一個應用程序都可以通過增加命令來擴展Tcl內核的功能。Tcl最有用的一個擴展就是Tk,這是一個用于開發圖形用戶界面(Graphical User Interface, GUI)應用程序的工具集。Tk擴展了Tcl內核的功能,增加了構建用戶界面的命令,使您可以使用Tcl腳本來構建圖形用戶界面,而不必寫C代碼。

            Tcl/Tk一起為應用程序開發者和使用者提供了很多好處。首先是快速開發。很多有意思的程序完全可以用Tcl腳本編寫。這使您可以在比C/C++或Java更高的層次上進行開發,Tk隱藏了C或Java程序員必須關心的很多細節。與低級工具相比,使用Tcl/Tk所需要學習的知識更少,需要編寫的代碼更少。通過幾個小時的學習,Tcl/Tk新手用戶就可以創建有意思的用戶界面,很多開發人員從其他工具集轉而使用Tcl/Tk工具集后,應用程序開發所需的代碼數量和開發時間都減少了90%。

            Tcl/Tk適于快速開發的另一個原因在于Tcl是解釋型語言。使用Tcl應用程序時,可以在運行中生成和使用新的腳本,而無需重新編譯和重啟程序。這使您可以迅速嘗試新的想法,迅速修正程序中的錯誤。因為Tcl是解釋型語言,它的運行速度比C程序慢。但是通過內部優化,與編譯語言相比的大部分性能差距都可以消除。例如,您可以運行有數百條Tcl命令的腳本,鼠標的每一次移動都不會有能感知的延遲。在一些特別的場合,當性能成為重要問題時,可以把Tcl腳本中影響性能的部分替換為C代碼。

            Tcl的第二個好處是在于它是跨平臺的語言,它的大多數擴展包括Tk也是如此。這意味著在一個平臺(如Linux)上開發的程序,在大多數情況下可以不加改動地在另一個平臺上運行,如在Macintosh或Windows上運行。

            Tcl還是第一種擁有原生Unicode支持的動態語言。因此,Tcl可以處理這個世界上幾乎所有的書面語言。Tcl無需擴展就可以處理Unicode支持的所有文本。

            使用Tcl的另一個顯著優點在于它和它的大多數擴展都是免費的開源軟件。Tcl和Tk遵循BSD授權,允許所有人免費下載、查看、修改及再發布。

            Tcl是一種絕妙的“膠合語言”,可以讓應用程序很容易地擁有強大的腳本語言功能。例如,要為一個已經存在的應用程序添加腳本能力,只需要實現幾條新的Tcl命令,用來為應用程序提供相應的基本功能。然后再把您的新命令和Tcl庫鏈接起來生成全功能的腳本語言,該語言就包含了Tcl提供的命令(稱為Tcl內核)和您編寫的那些命令。

            Tcl還為用戶提供了方便。一旦學習了Tcl/Tk,就能為任何Tcl/Tk應用程序編寫腳本,只需要學習該應用程序特有的少數幾條命令即可。這使得更多的用戶有能力對應用程序進行個性化改造和強化。

            在Tcl中實現自定義命令很方便,只需要按Tcl的格式定義一個命令函數。基于對象的命令函數的聲明如下:

            typedef int (Tcl_ObjCmdProc) _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int objc, struct Tcl_Obj * CONST * objv)); 

            為了能在Tcl中調用一個命令函數,必須先調用Tcl_CreateObjCommand注冊它,格式如下所示:

            EXTERN Tcl_Command Tcl_CreateObjCommand (Tcl_Interp * interp,  CONST char * cmdName, Tcl_ObjCmdProc * proc, ClientData clientData,  Tcl_CmdDeleteProc * deleteProc); 

            這就是把Tcl中的字符串與實現它的C函數關聯起來“魔術”。更詳細內容請參考:《Create New Commands in Tcl》。下面主要來分析一下Draw Test Harness代碼實現:

            首先在Draw_PInterp.hxx中將Tcl_Interp定義為*Draw_PInterp,并在類Draw_Interpretor中對Tcl解釋器進行了簡單封裝,在Init時創建一個新的Tcl_Interp,并可管理自定義的命令;

            然后,在Draw_Main中來加載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函數,實現如下所示:

             

            //=======================================================================
            //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中自定義的命令是通過類Draw_Commands來添加的,程序如下所示:

            void Draw::Commands(Draw_Interpretor& theCommands)
            {
              Draw::BasicCommands(theCommands);
              Draw::VariableCommands(theCommands);
              Draw::GraphicCommands(theCommands);
              Draw::PloadCommands(theCommands);
              Draw::UnitCommands(theCommands);
            }

            分別對應的定義文件為:

            l Draw_BasicCommands.cxx:基本命令;

            l Draw_VariableCommands.cxx:變量命令;

            l Draw_GraphicCommands.cxx:圖形命令;

            l Draw_PloadCommands.cxx:加載命令;

            l Draw_UnitCommands.cxx:單位命令;

            如可以打開Draw_BasicCommands可以看到OpenCascade定義了哪些基本命令,我發現一個查看OpenCascade編譯時的配置信息的命令dversion:

            wps_clip_image-25219

            運行結果如下圖所示:

            wps_clip_image-19115

            Figure 3.1 dversion command in Draw Test Harness

            由上圖可知編譯OpenCascade時的相關配置信息,如版本號、使用了哪些第三方庫、編譯器類型及版本、系統類型x86/AMD64、操作系統等等。

            wps_clip_image-298

            Figure 3.2 The OS OpenCascade supported

            由上圖可知OpenCascade可識別的操作系統涵蓋發當今主流的操作系統,如Windows、Mac OS、Android、Linux等。

            最后以一個實現光線追蹤的腳本來演示一下使用腳本的靈活性,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
                }
            }

            腳本實現了在一個box上cut掉文本后的光線跟蹤效果,如下圖所示:

            wps_clip_image-6133

            Figure 3.3 Ray Tracing Rendering by Tcl

            理解了Tcl的作用之后,我認為OpenCascade提供的最快速的的開發方式應該就是全部使用Tcl/Tk來開發程序。利用OpenCascade已經定義好的命令,包括操作ApplicationFramework的自定義命令。在此基礎上,使用Tk來實現GUI及用戶交互操作,這樣開發程序事辦功倍,而且還可提供用戶二次開發功能,即使用Tcl/Tk來對程序進行二次開發,擴展能力強。

            四、結論 Conclusion

            造型程序中引入腳本語言的共同優點有:腳本語言是解釋執行,不需要編譯鏈接,可以即時驗證一些想法。還可使用腳本來執行自動化測試,保證算法質量。便于擴展,提供用戶二次開發的工具。

            與ACIS的Scheme相比,OpenCascade的Tcl/Tk有著明顯的優勢。其中最明顯的就是源代碼開放,可以通過查看源程序,來完全理解腳本的實現。而這在ACIS中是不可能的。

            理解如何在Tcl實現自定義的命令后,可以查看OpenCascade在Draw Test Harness中相關程序的實現方法,對學習一些造型算法的使用還是很有幫助的。

            五、后記 Postscript

            在曹金鳳《Python語言在Abaqus中的應用》的序言一中看到這樣一段話:“我還想順便談一個體會:同50年前有限元方法出現的時代相比,現在有了大量有效的計算力學軟件。既然已經有了大家公認的很優秀的分析平臺,研究者不應再奮力去開發具有競爭力的新軟件了,而應當把精力花在基于這些平臺進行二次開發上面了。從科學技術共同體的角度去思考,這應當是如今計算力學軟件研發的最佳策略。”——隋允康于北京工業大學。

            對于這段話的大部分內容是贊同的,即站在巨人的肩上才能看得更遠。但縱觀當今力學分析的CAE軟件優秀的大都是國外產品,如ANSYS、Abaqus、COADE.CAESAR、MSC/PATRAN、ADINA等等,而國內同類產品鮮有耳聞。原因可能是CAE軟件的開發涉及的知識很多,需要計算機圖形學、軟件工程、力學、數學等等多學科知識的結合,所以開發具有自主知識產權的CAE軟件也是國家科技實力的一個表現。若只是在外國人的平臺上二次開發,總是會受制于人。也許有些狹隘,如今世界已然是個地球村,科學無國界。

            六、參考資料 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/

            5. http://www.tcl.tk/

            6. 詹海生等, 基于ACIS的幾何造型技術與系統開發, 清華大學出版社, 2002

            7. 曹金鳳, 王旭春, 孔亮. Python語言在Abaqus中的應用. 機械工業出版社, 2011

            致謝:
                感謝王婷讓我接觸到ABAQUS這個軟件。

            Feedback

            # re: OpenCascade Tcl vs. ACIS Scheme  回復  更多評論   

            2014-01-19 16:22 by 王婷
            不明覺厲…

            # re: OpenCascade Tcl vs. ACIS Scheme  回復  更多評論   

            2014-02-12 02:41 by louql
            博主很有毅力啊,堅持學習OpenCASCADE這么長時間,佩服!
            不知博主的專業方向是做什么的,CAE?

            # re: OpenCascade Tcl vs. ACIS Scheme  回復  更多評論   

            2014-02-12 13:10 by eryar
            @louql
            過獎啦。

            一是興趣,喜歡寫點代碼;
            二是朋友們的交流、鼓勵,及實際應用,可以用OpenCascade解決些實際問題,很有成就感。

            本來學的是輪機工程,現在做造船CAD程序開發。

            # re: OpenCascade Tcl vs. ACIS Scheme  回復  更多評論   

            2014-10-11 17:56 by BugWang
            樓主我想問問如何入手OPENCASCADE,我是想找一些關于這些類的example(示例代碼)但是找了好久沒找到,他的tutorial上面倒是有一個制作水壺的例子,但是我的任務要做的東西和tutorial差太多不知道如何下手。。好糾結啊,周圍每一個人用過這個東西,求如何入門。。

            # re: OpenCascade Tcl vs. ACIS Scheme  回復  更多評論   

            2014-10-11 19:00 by eryar
            @BugWang
            Hi Wang,

            你好!

            可以從最簡單的Hello World!程序入門,從而體驗一下occ的編碼風格,再慢慢深入。

            Hello World的示例程序如下:
            http://www.shnenglu.com/eryar/archive/2013/08/22/202708.html

            # re: OpenCascade Tcl vs. ACIS Scheme  回復  更多評論   

            2015-06-29 17:34 by fast
            我還想順便談一個體會:同50年前有限元方法出現的時代相比,現在有了大量有效的計算力學軟件。既然已經有了大家公認的很優秀的分析平臺,研究者不應再奮力去開發具有競爭力的新軟件了,而應當把精力花在基于這些平臺進行二次開發上面了。從科學技術共同體的角度去思考,這應當是如今計算力學軟件研發的最佳策略。”

            當年運十就是這么下馬的

            # re: OpenCascade Tcl vs. ACIS Scheme  回復  更多評論   

            2015-06-29 19:16 by eryar
            @fast

            哦,剛google運十了解了下,可惜啊!
            99久久er这里只有精品18| 亚洲国产成人久久综合区| 国内精品久久久久久99| 久久国产精品久久精品国产| 一级做a爰片久久毛片16| 国内精品久久久久久久涩爱| 久久人人爽人人爽人人片AV东京热| 亚洲人AV永久一区二区三区久久| 久久久精品人妻一区二区三区四| 久久精品亚洲男人的天堂| 久久香蕉国产线看观看精品yw| 久久青青草原综合伊人| 久久综合亚洲鲁鲁五月天| 久久久久久久尹人综合网亚洲| 欧美黑人激情性久久| 99久久精品免费观看国产| 欧美喷潮久久久XXXXx| 久久久亚洲精品蜜桃臀| 久久精品亚洲中文字幕无码麻豆| 色8激情欧美成人久久综合电| 91精品国产91久久久久久青草| 色婷婷综合久久久中文字幕| 欧美精品九九99久久在观看| 国产综合免费精品久久久| 久久精品一区二区| 亚洲国产另类久久久精品小说| 亚洲国产成人精品女人久久久| 久久久久久亚洲精品无码| 久久精品国产91久久综合麻豆自制| 久久久免费精品re6| 亚洲伊人久久精品影院| 一本一本久久A久久综合精品| 亚洲精品无码久久毛片| 伊人久久大香线蕉精品不卡| 久久久中文字幕日本| 精品久久人人爽天天玩人人妻 | 久久精品国产2020| 久久亚洲国产最新网站| 久久久久久久免费视频| 久久精品国产欧美日韩99热| 亚洲婷婷国产精品电影人久久 |