日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

开源项目Hopsan代码梳理、流程分析

發布時間:2023/12/15 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 开源项目Hopsan代码梳理、流程分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ? ?Hosan開源項目是液壓、電力等行業的仿真開源軟件,由瑞典林平大學開發,可以仿真電力、液壓等。更具體的了解,請參考:《Hopsan -- 液壓、電力等行業的仿真開源軟件》。

? ? ??Hosan開源項目編譯參考:《Hopsan完全編譯構建指南》、《Hopsan的源碼編譯》。

代碼梳理、流程分析如下:

(1):HopsanEssentials的構造函數

在HopsanGUI/CoreAccess.cpp文件的頂部聲明了一個hopsan::HopsanEssentials類型的全局變量gHopsanCore,本工程啟動時,首先就會調用HopsanEssentials的構造函數,流程如下:

  • 創建NodeFactory對象mpNodeFactory。
  • 創建ComponentFactory對象mpComponentFactory。
  • 如果是第一次調用構造函數,則創建QuantityRegister類對象mpQuantityRegister。在該類中,構造測試量和其單位的映射,如:速度為鍵,速度的單位m/s。
  • 構造LoadExternal類對象mpExternalLoader,以便加載外部dll中包含的元件。
  • 然后以步驟1創建的對象mpNodeFactory為參數,調用register_default_nodes函數,該函數返回后,mpNodeFactory就包含了系統所有默認的節點。
  • 調用步驟2的mpComponentFactory對象中的registerCreatorFunction函數。注意:這個函數的第二個參數是一個函數指針,該函數指針是以類模板實現的,能支持任何返回值類型且無參數的任何函數。每個被創建的對象所在的類都有一個靜態的Creator()函數,在其中創建該類的對象,如下
  • 做一些錯誤檢測及清除錯誤狀態的工作,如:看已經注冊過的組件是否重復注冊等。
  • (1.1)ClassFactory類

    ClassFactory類是一個模板類,如下:

    template <typename _Key, typename _Base, typename _Predicator = std::less<_Key> >class ClassFactory { }

    說明:

    • _Base 是創出函數的返回值,即1節中6步驟中提到的registerCreatorFunction函數第2個參數表示的函數指針的返回值。
    • Key是區分創建組件的關鍵字,本項目一般是字符串類型,如:“NodeSignal”字符串表示NodeSignal類的組件、DummyComponent表示DummyComponent類的組件等等。
    • _Predicator是map的排序準則,默認是按第一個參數key小寫排序。

    NodeFactory、ComponentFactory都是ClassFactory模板類的實例,如下:

    typedef ClassFactory<HString, Node> NodeFactory; typedef ClassFactory<HString, Component> ComponentFactory;

    (1.2)registerCreatorFunction?

    ClassFactory模板類的registerCreatorFunction功能如下:

    • 將以key為鍵,創建組件的構造器也即函數指針為值的鍵值對, 插入名為mFactoryMap的map中,方便以后查找。
    • 將key為鍵,創建組件的構造器也即函數指針為值構成的pair插入語 mRegStatusVector,以便在構造函數提示信息,參見1節中的步驟7。

    (1.3)類的繼承關系

    (2)執行流程?

    (2.1)界面啟動流程

  • main函數被調用。
  • 創建DesktopHandler對象,并調用該對象的setupPaths()函數安裝一些目錄。
  • 創建Configuration對象,設置一些配置信息。
  • 創建CopyStack對象。
  • 創建GUIMessageHandler對象,用于處理應用程序的警告、錯誤、普通消息。
  • 創建MainWindow對象,并調用其createContents函數創建各種面板、主界面等。
  • 處理命令行參數。
  • 閃屏提示。
  • 調用MainWindow對象的initializeWorkspace函數,加載各種組件庫等。
  • 主程序、主界面啟動。
  • 流程如下:

    (2.2)?initializeWorkspace

    流程如下:

  • 以路徑graphics/builtinCAF/hidden/builtin_hidden.xml為參數,InternalLib為第二個參數,Hidden為第三個參數調用LibraryHandler類loadLibrary,即加載隱藏的內部組件。
  • 調用LibraryHandler類loadLibrary 函數加載
  • ?../componentLibraries/defaultLibrary/defaultComponentLibrary.xml配置文件中的組件。

    ? ? 3 調用LibraryHandler類loadLibrary 函數加載如下目錄下的組件:

    ../componentLibraries/autoLibs/

    ? ? 4 調用LibraryHandler類loadLibrary 函數加載

    ?graphics/builtinCAF/visible/builtin_visible.xml配置文件中的組件。

    ? ? 5 加載以前創建的外部庫(在元件樹)

    ? ? 6 創建plot widget對象gpPlotWidget,并隱藏。

    ? ? ?7 創建FindWidget對象,并隱藏。

    ? ? 8 處理命令行中參數包含.hmf的參數,認為此參數就是模型文件,并加載該模型到視圖。

    ? ? ?9 調整元件樹窗體部件、向閃屏界面發送加載組件完成信息。

    (2.3)LibraryHandler的loadLibrary函數(第1個參數是表示路徑的字符串)

    流程如下:

    (2.4) LibraryHandler類的loadLibrary函數(第1個參數是SharedComponentLibraryPtrT類型

  • 讀取第1參數即pLibrary的xml文件指向的信息,并綁定這些信息到pLibrary對象。
  • 將pLibrary對象對象加入到類型為Qlist的mLoadedLibraries成員變量。
  • 調用CoreLibraryAccess類的loadComponentLib函數加載pLibrary表示的庫。
  • 調用recompileLibrary函數編譯該庫。
  • 再次調用CoreLibraryAccess類的loadComponentLib函數加載pLibrary表示的庫。
  • 如果pLibrary庫的版本號小于0.3,則遞歸搜索pLibrary庫目錄下的xml文件且xml節點是hopsanobjectappearance的文件,并把該文件的絕對路徑加入到pLibrary庫的cafFiles
  • 遍歷pLibrary庫的cafFiles,對每個遍歷到的元素構建ModelObjectAppearance對象,也就是組件的外表對象,如:組件在樹視圖、設計視圖上的名稱、圖標等。
  • 如果步驟7)中的ModelObjectAppearance對象的typeName類型不是subsystem且不是ConditionalSubsystem,則去1.1節中的ClassFactory類中看這種類型是不是注冊過,如果沒注冊或者其hmf文件不存在,則彈出加載這種類型的組件失敗的錯誤。
  • 構造ComponentLibraryEntry對象,并設置該對象的各種屬性,并將該對象加入到mLibraryEntries,并告知閃屏界面,正在加載這個組件。
  • 加載類型不為InternalLib的其它用戶自定義的類型到配置文件。
  • 發送contentsChanged信號,以便形成組件樹視圖。
  • (2.5)CoreLibraryAccess類的loadComponentLib

    ?流程如下:

    (2.6)組件注冊文件的生成

    ?子目錄下的后綴名為.cci的文件內容如下:

    pComponentFactory->registerCreatorFunction("SignalFirstOrderFilter",SignalFirstOrderFilter::Creator);

    這些組件注冊代碼是由generateLibraryFiles.py通過python生成的

    總結

    以上是生活随笔為你收集整理的开源项目Hopsan代码梳理、流程分析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。