# 图形组件类


本文介绍模型视图管理类、模型树数据类、模型参数面板类、仿真曲线视图类和模型仿真设置控件等 API。

# MwMoGraphicsViewController

模型视图管理类,负责显示模型的图标视图,组件视图和文本视图,并提供模型编辑功能。

函数名 简介
CloseMoWindow 关闭模型窗口
OpenMoWindow 打开模型窗口
CloseCurrentWindow 关闭当前窗口
CloseAllWindow 关闭所有窗口
SetMdiInterface 设置视图接口
SetClassDirty 设置脏标
GetCurrentClassKey 获取当前模型key
SaveCurrentWindow 保存当前模型
SigUpdate 模型视图更新信号
SigClassDirtyChanged 脏标变化信号
SigAppendClass 添加模型信号
SigRemoveClass 移除模型信号
SigReplaceClass 替换模型信号

# 公共类型

enum MwModelicaLayer
{
MLAYER_ICON,
MLAYER_DIAGRAM,
MLAYER_TEXT,
MLAYER_DOCUMENT,
MLAYER_UNKNOW
}
功能 模型视图层次
参数 MLAYER_ICON 模型图标图层 MLAYER_DIAGRAM 模型组件图层 MLAYER_TEXT 模型文本图层 MLAYER_DOCUMENT 模型帮助图层 MLAYER_UNKNOW
enum mogv::MoGvEvent::Type 
{ 
None = 0,
SelectChanged,
ComponentLevelChanged,
ViewChanged,
MoWindowChanged,
ActivateWindowChanged,
ModelDataChanged,
ModelAppended,
ModelRemoved
}
功能 模型视图活动
参数 None 不合法的活动 SelectChanged 组件选择变化 ComponentLevelChanged 组件层次变化 ViewChanged 视图变化 MoWindowChanged 模型窗口切换 ActivateWindowChanged 活动窗口变化 ModelDataChanged 模型数据变化 ModelAppended 模型打开或新建 ModelRemoved 卸载顶层模型或删除嵌套模型

# 公共函数

# CloseMoWindow

关闭模型窗口。

  • 语法

    /**
    * @brief 关闭模型窗口
    * @param [in] main_key 模型key
    */
    void CloseMoWindow(MWint main_key)
    
  • 说明

    关闭模型窗口。

  • 示例

    MwClassManager *class_manager = new MwClassManager;
    class_manager->Initialize();
    class_manager->GetMoHandler()->LoadMoLibrary("Modelica", "3.2.1");
    class_manager->GetMoHandler()->OpenFile(L"C:/Users/TR/Documents/MWORKS/WorkSpace/PID_Controller.mo");
    MWint mo_key 
    = class_manager->GetMoHandler()->GetTopClassInFile(L"C:/Users/TR/Documents/MWORKS/WorkSpace/PID_Controller.mo");
    
    MwMoGraphicsViewController *mo_controller 
    = new MwMoGraphicsViewController(class_manager);
    MwMoWindowMdi *mo_mdi = new MwMoWindowMdi(mo_controller);
    mo_controller->SetMdiInterface(mo_mdi);
    
    mo_controller->OpenMoWindow(mo_key);
    
    main_win.setCentralWidget(mo_mdi);
    main_win.showMaximized();
    mo_controller->CloseMoWindow(mo_key);
    

# OpenMoWindow

打开模型窗口。

  • 语法

    /**
    * @brief 打开模型窗口
    * @param[in] key                   需要打开的模型key
    * @param[in] in_new_tab            是否在新窗口中打开模型
    * @param[in] layer                 打开模型的图层
    */
    void OpenMoWindow(MWint key, bool in_new_tab = false, MwModelicaLayer layer = MLAYER_UNKNOW)
    
  • 说明

    打开模型窗口。

  • 示例

    MwClassManager *class_manager = new MwClassManager;
    class_manager->Initialize();
    class_manager->GetMoHandler()->LoadMoLibrary("Modelica", "3.2.1");
    class_manager->GetMoHandler()->OpenFile(L"C:/Users/TR/Documents/MWORKS/WorkSpace/PID_Controller.mo");
    MWint mo_key 
    = class_manager->GetMoHandler()->GetTopClassInFile(L"C:/Users/TR/Documents/MWORKS/WorkSpace/PID_Controller.mo");
    
    MwMoGraphicsViewController *mo_controller 
    = new MwMoGraphicsViewController(class_manager);
    MwMoWindowMdi *mo_mdi = new MwMoWindowMdi(mo_controller);
    mo_controller->SetMdiInterface(mo_mdi);
    
    mo_controller->OpenMoWindow(mo_key);
    
    main_win.setCentralWidget(mo_mdi);
    main_win.showMaximized();
    

# CloseCurrentWindow

关闭当前模型窗口。
  • 语法

    void CloseCurrentWindow()
    
  • 说明

    关闭当前模型窗口。

  • 示例

    MwClassManager *class_manager = new MwClassManager;
    class_manager->Initialize();
    class_manager->GetMoHandler()->LoadMoLibrary("Modelica", "3.2.1");
    class_manager->GetMoHandler()->OpenFile(L"C:/Users/TR/Documents/MWORKS/WorkSpace/PID_Controller.mo");
    MWint mo_key 
    = class_manager->GetMoHandler()->GetTopClassInFile(L"C:/Users/TR/Documents/MWORKS/WorkSpace/PID_Controller.mo");
    
    MwMoGraphicsViewController *mo_controller 
    = new MwMoGraphicsViewController(class_manager);
    MwMoWindowMdi *mo_mdi = new MwMoWindowMdi(mo_controller);
    mo_controller->SetMdiInterface(mo_mdi);
    
    mo_controller->OpenMoWindow(mo_key);
    
    main_win.setCentralWidget(mo_mdi);
    main_win.showMaximized();
    mo_controller->CloseCurrentWindow();
    

# CloseAllWindow

关闭所有模型窗口。

  • 语法

    void CloseAllWindow()
    
  • 说明

    关闭所有模型窗口。

  • 示例

    MwClassManager *class_manager = new MwClassManager;
    class_manager->Initialize();
    class_manager->GetMoHandler()->LoadMoLibrary("Modelica", "3.2.1");
    class_manager->GetMoHandler()->OpenFile(L"C:/Users/TR/Documents/MWORKS/WorkSpace/PID_Controller.mo");
    MWint mo_key 
    = class_manager->GetMoHandler()->GetTopClassInFile(L"C:/Users/TR/Documents/MWORKS/WorkSpace/PID_Controller.mo");
    
    MwMoGraphicsViewController *mo_controller 
    = new MwMoGraphicsViewController(class_manager);
    MwMoWindowMdi *mo_mdi = new MwMoWindowMdi(mo_controller);
    mo_controller->SetMdiInterface(mo_mdi);
    
    mo_controller->OpenMoWindow(mo_key);
    
    main_win.setCentralWidget(mo_mdi);
    main_win.showMaximized();
    mo_controller->CloseAllWindow();
    

# SetMdiInterface

设置视图接口类。

  • 语法

    /**
    * @brief 设置试图接口类
    * @param  [in]mdi 视图接口
    */
    void SetMdiInterface(MwMdiInterface *mdi)
    
  • 说明

    设置视图接口类,创建模型控制器后需调用该接口设置一个模型视图。

  • 示例

    MwClassManager *class_manager = new MwClassManager;
    class_manager->Initialize();
    class_manager->GetMoHandler()->LoadMoLibrary("Modelica", "3.2.1");
    class_manager->GetMoHandler()->OpenFile(L"C:/Users/TR/Documents/MWORKS/WorkSpace/PID_Controller.mo");
    MWint mo_key 
    = class_manager->GetMoHandler()->GetTopClassInFile(L"C:/Users/TR/Documents/MWORKS/WorkSpace/PID_Controller.mo");
    
    MwMoGraphicsViewController *mo_controller 
    = new MwMoGraphicsViewController(class_manager);
    MwMoWindowMdi *mo_mdi = new MwMoWindowMdi(mo_controller);
    mo_controller->SetMdiInterface(mo_mdi);
    
    mo_controller->OpenMoWindow(mo_key);
    
    main_win.setCentralWidget(mo_mdi);
    main_win.showMaximized();
    

# SetClassDirty

设置模型脏标志。

  • 语法

    /**
    * @brief 设置模型脏标志
    * @param  [in]class_key 模型key
    * @param  [in]dirty     是否设置脏标
    */
    void SetClassDirty(MWint class_key, bool dirty)
    
  • 说明

    设置模型脏标志,当中央视图的模型发送改变后,可调用该接口将模型树设置为脏标。

  • 示例

    MwClassManager *class_manager = new MwClassManager;
    class_manager->Initialize();
    class_manager->GetMoHandler()->LoadMoLibrary("Modelica", "3.2.1");
    class_manager->GetMoHandler()->OpenFile(L"C:/Users/TR/Documents/MWORKS/WorkSpace/PID_Controller.mo");
    MWint mo_key 
    = class_manager->GetMoHandler()->GetTopClassInFile(L"C:/Users/TR/Documents/MWORKS/WorkSpace/PID_Controller.mo");
    
    MwMoGraphicsViewController *mo_controller 
    = new MwMoGraphicsViewController(class_manager);
    MwMoWindowMdi *mo_mdi = new MwMoWindowMdi(mo_controller);
    mo_controller->SetMdiInterface(mo_mdi);
    
    mo_controller->OpenMoWindow(mo_key);
    
    main_win.setCentralWidget(mo_mdi);
    main_win.showMaximized();
    mo_controller->SetClassDirty(mo_key,true);
    

# GetCurrentClassKey

获取当前窗口的模型 key。

  • 语法

    MWint GetCurrentClassKey()
    
  • 说明

    获取当前窗口的模型 key。

  • 示例

    MwClassManager *class_manager = new MwClassManager;
    class_manager->Initialize();
    class_manager->GetMoHandler()->LoadMoLibrary("Modelica", "3.2.1");
    class_manager->GetMoHandler()->OpenFile(L"C:/Users/TR/Documents/MWORKS/WorkSpace/PID_Controller.mo");
    MWint mo_key 
    = class_manager->GetMoHandler()->GetTopClassInFile(L"C:/Users/TR/Documents/MWORKS/WorkSpace/PID_Controller.mo");
    
    MwMoGraphicsViewController *mo_controller 
    = new MwMoGraphicsViewController(class_manager);
    MwMoWindowMdi *mo_mdi = new MwMoWindowMdi(mo_controller);
    mo_controller->SetMdiInterface(mo_mdi);
    
    mo_controller->OpenMoWindow(mo_key);
    
    main_win.setCentralWidget(mo_mdi);
    main_win.showMaximized();
    MWint cur_key = mo_controller->GetCurrentClassKey();
    

# SaveCurrentWindow

保存当前窗口的模型。

  • 语法

    /**
    * @brief 保存当前模型
    * @param [in] close_window 是否关闭窗口
    * @param [in] show_error_dlg 是否弹出错误提示对话框(如果模型保存失败)
    */
    bool SaveCurrentWindow(
    bool close_window = false, 
    bool show_error_dlg = true)
    
  • 说明

    保存当前窗口的模型。

  • 示例

    MwClassManager *class_manager = new MwClassManager;
    class_manager->Initialize();
    class_manager->GetMoHandler()->LoadMoLibrary("Modelica", "3.2.1");
    class_manager->GetMoHandler()->OpenFile(L"C:/Users/TR/Documents/MWORKS/WorkSpace/PID_Controller.mo");
    MWint mo_key 
    = class_manager->GetMoHandler()->GetTopClassInFile(L"C:/Users/TR/Documents/MWORKS/WorkSpace/PID_Controller.mo");
    
    MwMoGraphicsViewController *mo_controller 
    = new MwMoGraphicsViewController(class_manager);
    MwMoWindowMdi *mo_mdi = new MwMoWindowMdi(mo_controller);
    mo_controller->SetMdiInterface(mo_mdi);
    
    mo_controller->OpenMoWindow(mo_key);
    
    main_win.setCentralWidget(mo_mdi);
    main_win.showMaximized();
    mo_controller->SaveCurrentWindow();
    

# 信号

# SigUpdate

模型视图更新信号,报告模型视图中发生的行为以供其他面板刷新。

  • 语法

    /*
    **  @brief 操作ClassBrowser/ModelicaWindow(ModelicaView)/PropertyPanel等面板
    *   @param [in]mo_event 模型视图行为类型
    *   @param [in]class_key_list 模型视图的行为操作对象key列表
    **  @note触发UpdateType类型的信号,激活连接信号的面板同步刷新
    */
    void SigUpdate(mogv::MoGvEvent mo_event, Qlist<MWint> class_key_list)
    
  • 说明

    模型视图更新信号,报告模型视图中发生的行为以供其他面板刷新。

# SigClassDirtyChanged

模型脏标志变化信号。

  • 语法

    void SigClassDirtyChanged(MWint class_key)
    
  • 说明

    模型脏标志变化信号。

# SigAppendClass

内核添加模型信号。

  • 语法
void SigAppendClass(MWint key)
  • 说明

    内核添加模型信号。

# SigRemoveClass

内核移除模型信号。

  • 语法

    void SigRemoveClass(MWint key)
    
  • 说明

    内核移除模型信号。

# SigReplaceClass

内核替换模型信号。

  • 语法

    void SigReplaceClass(MWint key)
    
  • 说明

    内核替换模型信号。

# MwMoWindowMdi

中央视图控件,负责管理模型视图窗口,创建后设置到 mo_controller 中。

# MwMoClassTreeModel

模型树数据类,用于将内核的模型数据操作同步到界面模型中,将 model 设置到 QTreeView 中使用。

函数名 简介
SetClassifyName 设置分类
AppendTopClass 增加顶层模型
GetTopItems 获取所有顶层节点
InsertClass 插入模型
RemoveClass 移除模型

# 公共函数

# SetClassifyName

设置顶层分类节点

  • 语法

    /**
    * @brief  设置分类
    * @param[in] name_list 分类名称列表
    */
    void SetClassifyName(const QstringList &name_list)
    
  • 说明

    设置顶层分类节点,为模型树设置分类,默认分类是“模型库”和“用户模型”。

  • 示例

    QMainWindow main_win;
    
    MwClassManager *class_manager = new MwClassManager;
    class_manager->Initialize();
    MwMoClassTreeModel *tree_model = new MwMoClassTreeModel(class_manager);
    QTreeView *tree_view = new QTreeView;
    tree_view->setModel(tree_model);
    
    main_win.setCentralWidget(tree_view);
    main_win.showMaximized();
    tree_model->SetClassifyName(QStringList() << QStringLiteral("分类1") << QStringLiteral("分类2") << QStringLiteral("分类3"));
    

# AppendTopClass

添加顶层模型。

  • 语法

    /**
    * @brief  添加顶层模型
    * @param [in]key 模型key
    * @param [in]classify_name 类型名
    */
    void AppendTopClass(MWint key, const Qstring &classify_name)
    
  • 说明

    添加顶层模型。

  • 示例

    QMainWindow main_win;
    
    MwClassManager *class_manager = new MwClassManager;
    class_manager->Initialize();
    class_manager->GetMoHandler()->LoadMoLibrary("Modelica", "3.2.1");
    MWint lib_key = class_manager->GetMoHandler()->GetKeyByTypeName("Modelica");
    
    MwMoClassTreeModel *tree_model = new MwMoClassTreeModel(class_manager);
    QTreeView *tree_view = new QTreeView;
    tree_view->setModel(tree_model);
    tree_model->SetClassifyName(QStringList() << QStringLiteral("模型库"));
    
    main_win.setCentralWidget(tree_view);
    main_win.showMaximized();
    tree_model->AppendTopClass(lib_key, QStringLiteral("模型库"));
    
    tree_model->AppendTopClass(lib_key, QStringLiteral("用户模型"));
    

# GetTopItems

获取所有顶层节点。

  • 语法

    Qlist<QStandardItem*> GetTopItems()
    
  • 说明

    获取所有顶层节点。

  • 示例

    QList<QStandardItem*> lst_item = tree_model->GetTopItems();
    QStringList lst_item_name;
    for (auto item : lst_item)
    {
        qDebug() << item->data(NameRole).value<QString>();
    }
    

# InsertClass

在指定节点下插入模型。

  • 语法

    /**
    * @brief  插入模型
    * @param [in]key 模型key
    * @param [in]parent_item 父节点
    */
    void InsertClass(MWint key, QstandardItem *parent_item)
    
  • 说明

在指定节点下插入模型,插入节点时,模型树会自动刷新。

  • 示例

    调用 MwMoClassTreeModel 的 InsertClass 接口,参数 1 设置为 PID_Controller 模型键值,参数 2 设置为 Modelica 模型树顶层节点。

    tree_model->InsertClass(mo_key, lib_item);
    

# RemoveClass

移除模型。

  • 语法

    void RemoveClass(MWint key)
    
  • 说明

    移除模型,模型视图中心和模型浏览树会自动进行移除刷新。

  • 示例

    调用 MwMoClassTreeModel 的 InsertClass 接口,参数 1 设置为 PID_Controller 模型键值,参数 2 设置为 Modelica 模型树顶层节点。

    tree_model->RemoveClass(lib_key);
    

# MwModelParameterTabWidget

模型参数面板类,能够显示选中模型或组件参数,并且支持对各种类型的参数进行编辑,能够与中央视图进行联动。

函数名 简介
GetParamEditMode 获取参数编辑模式
SlotUpdate 更新面板

# 公共类型

enum MwParamEditMode
{ 
PEM_Panel,
PEM_Dialog
}
功能 参数编辑模式
参数 PEM_Panel 面板模式 PEM_Dialog 对话框模式

# 公共函数

# GetParamEditMode

获取参数编辑模式。

  • 语法

    MwParamEditMode GetParamEditMode()
    
  • 说明

    获取参数编辑模式。

  • 示例

    QMainWindow main_win;
    
    MwClassManager *class_manager = new MwClassManager;
    class_manager->Initialize();
    MwMoGraphicsViewController *mo_controller = new MwMoGraphicsViewController(class_manager);
    MwModelParameterTabWidget *param_wgt = new MwModelParameterTabWidget(mo_controller, PEM_Dialog);
    
    main_win.setCentralWidget(param_wgt);
    main_win.showMaximized();
    MwParamEditMode edit_mode = param_wgt->GetParamEditMode();
    

# 公共槽函数

# SlotUpdate

响应模型视图模块更新信号,刷新参数面板。

  • 语法

    void SlotUpdate(mogv::MoGvEvent mo_event, Qlist<MWint> ckass_key_list)
    
  • 说明

    响应模型视图模块更新信号,刷新参数面板。

# MwSimPlotWindow

仿真曲线视图类,用于显示仿真变量曲线。

函数名 简介
GetPlotWinIndex 获取曲线ID
AddCurveToCurrentView 添加变量到曲线图
SigWindowClosed 窗口关闭信号

# GetPlotWinIndex

获取曲线窗口编号。

  • 语法

    size_t GetPlotWinIndex()
    
  • 说明

    获取曲线窗口编号,每个曲线窗口存在唯一 ID,通过获取 ID 号可定位到曲线窗口。

  • 示例

    MwClassManager *class_manager = new MwClassManager;
    class_manager->Initialize();
    
    MwSimPlotWindow *plot_win = new MwSimPlotWindow(2, true, class_manager);
    size_t win_index = plot_win->GetPlotWinIndex();
    

# AddCurveToCurrentView

添加变量曲线到当前视图中。

  • 语法

    /**
    * @brief  增加变量曲线到当前视图
    * @param [in]curve_name 曲线名称
    * @param [in]data 曲线数据
    * @return 返回曲线
    */
    MwPlotCurve* AddCurveToCurrentView(
    const QString &curve_name, 
    MwAbstractData *data)
    
  • 说明

    添加变量曲线到当前视图中,通过传入变量的名称和当前结果数据,即可创建变量曲线。

  • 示例

    调用MwSimPlotWindow的AddCurveToCurrentView接口,参数1设置为PI.u_m,参数2设置为(MwAbstractData*)sim_data

    plot_win->AddCurveToCurrentView("PI.u_m", (MwAbstractData*)sim_data);
    

# SigWindowClosed

窗口关闭信号。

  • 语法

    void SigWindowClosed(MwSimPlotWindow *plot_win)
    
  • 说明

    窗口关闭信号。

# MwSimConfigWidget

模型仿真设置控件,用于显示和修改模型仿真设置。

函数名 简介
GetSimConfig 获取仿真设置

模块描述:模型仿真设置控件,用于显示和修改模型仿真设置。

模块使用:

MwExperimentData exp_data;
MwSimConfigWidget sim_config_wgt = new MwSimConfigWidget(exp_data, &main_win);

# 公共类型

struct MwExperimentData
{
   MWdouble startTime;
   MWdouble stopTime;
   MWdouble intervalLength;
   MWcint numberOfIntervals;
   std::string algorithm;
   MWdouble tolerance;
   MWdouble fixedOrInitStepSize;
   std::vector<std::pair<MWdouble, MWdouble>> pieceWiseStep;
}
功能 仿真配置
参数 startTime 仿真开始时间 stopTime 仿真终止时间 intervalLength 仿真输出步长 numberOfIntervals 仿真输出步数 algorithm 积分算法 tolerance 精度 fixedOrInitStepSize 初始积分步长 pieceWiseStep 分段固定积分步长数组

# GetSimConfig

获取界面上得仿真设置。

  • 语法

    /**
    * @brief  求解器仿真条件对象
    */
    void GetSimConfig(MwExperimentData *sim_config)
    
  • 说明

    获取界面上得仿真设置。

  • 示例

    MwSimConfigWidget *sim_config_wgt = new MwSimConfigWidget(new MwExperimentData);
    QDialog dlg;
    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(sim_config_wgt);
    dlg.setLayout(layout);
    sim_config_wgt->GetSimConfig(&exp_data);