Files
3D_EDFM_SIM-X/docs/app_designer_binding_guide.md
T

7.1 KiB
Raw Blame History

App Designer Binding Guide

Fastest Path

按原计划要最快跑通,建议只先做这一条主线:

  1. 保持真正界面文件为 EDFM_Simulator_App.mlapp
  2. 不直接改解包后的 .mlapp 内容。
  3. 用新加的控制器 EDFMAppController.m 负责绑定。
  4. 首先只保证 case01 的模板加载、配置导入导出、运行、结果导入导出、基础绘图跑通。
  5. 其他 case 和更细的参数编辑体验留到下一轮。

原因很直接:现在仓库里后端已经有统一 configcase01 模板、run_case(config)、MAT 导入导出,缺的主要就是 .mlapp 的回调连接和控件同步。

我已经补了什么

新增了 EDFMAppController.m,负责:

  • 启动默认加载 case01
  • New Config
  • 模板加载
  • config 导入导出
  • result 导入导出
  • 从 UI 回写 config
  • config 刷新 UI
  • 调用 run_case(config)
  • 基础结果摘要和绘图
  • SP/DP 页签切换
  • 三种流动模型页签切换

当前重点是让你现有 .mlapp 最快可运行,不是一次性把所有参数编辑体验做完。

你需要在 App Designer 里手动做的事

只在 EDFM_Simulator_App.mlapp 里做下面这些操作。

1. 添加控制器属性

在属性区加上:

Controller EDFMAppController

如果已经有,就保留,不要改名。

2. 添加 startup 函数

在 Code View 里确认有:

function startupApp(app)
    app.Controller = EDFMAppController(app);
    app.Controller.startup();
end

并确认构造函数里有:

runStartupFcn(app, @(~,~)startupApp(app));

3. 绑定按钮回调

把这些控件分别绑定到这些方法:

  • NewConfigButton -> onNewConfig
  • LoadTemplateButton -> onLoadTemplate
  • ImportConfigButton -> onImportConfig
  • ExportConfigButton -> onExportConfig
  • RunButton -> onRun
  • RunCurrentConfigButton -> onRun
  • ImportResultButton -> onImportResult
  • ExportResultButton -> onExportResult
  • PlotResultButton -> onPlotResult

对应方法:

function onNewConfig(app)
    app.Controller.newConfig();
end

function onLoadTemplate(app)
    app.Controller.loadTemplate(app.TemplateDropDown.Value);
end

function onImportConfig(app)
    app.Controller.importConfig();
end

function onExportConfig(app)
    app.Controller.exportConfig();
end

function onRun(app)
    app.Controller.runCurrentConfig();
end

function onImportResult(app)
    app.Controller.importResults();
end

function onExportResult(app)
    app.Controller.exportResults();
end

function onPlotResult(app)
    app.Controller.plotResults();
end

4. 绑定模型切换回调

给下面两个下拉框绑定 onModelChanged

  • ModelFlowModelDropDown
  • ModelGridModelDropDown

方法:

function onModelChanged(app)
    if ~isempty(app.Controller)
        app.Controller.syncModelTabs();
    end
end

同时把:

  • ResultTypeDropDownValueChangedFcn

绑定到 onPlotResult

5. 保持控件名不变

控制器默认依赖这些命名,不要在 App Designer 里随意改:

  • 顶栏:TemplateDropDownLoadTemplateButtonImportConfigButtonExportConfigButtonRunButtonImportResultButtonExportResultButtonStatusLabel
  • 模型:ModelFlagDropDownModelGridModelDropDownModelFlowModelDropDown
  • 网格:GridDxTextAreaGridDyTextAreaGridDzTextAreaGridNTGTextArea
  • 裂缝:FractureInputStyleDropDownFractureInputTextAreaFractureLinesTextAreaFractureHeightsTextAreaFractureFlowBarrierFlagsTextArea
  • SPSPBoundaryTextAreaSPInvalidLayerTextAreaSPMatrixKxTextAreaSPMatrixKyTextAreaSPMatrixKzTextAreaSPMatrixPoriTextAreaSPMatrixPrporEditFieldSPMatrixCporEditFieldSPRockDensityEditFieldSPFractureKfTextAreaSPFractureWfTextAreaSPFracturePorfTextAreaSPFracturePrporEditFieldSPFractureCporfEditFieldSPStressFractureEditFieldSPStressMatrixEditFieldSPStressRefPressureEditField
  • DPDPkxTextAreaDPkyTextAreaDPkzTextAreaDPkx_matrixLayerTextAreaDPky_matrixLayerTextAreaDPkz_matrixLayerTextAreaDPpori_matrixLayerTextAreaDPsigmaTextAreaDPNTGTextAreaDPprporEditFieldDPcporEditFieldDPKfTextAreaDPWfTextAreaDPPorfTextAreaDPprporfEditFieldDPcporfEditFieldDPstress_factor_fractureEditFieldDPstress_factor_matrixEditFieldDPstress_factor_ref_pressureEditField
  • 初始值和多组分主控件:InitialPressureEditFieldInitialSwEditFieldInitialCsEditFieldInitialCbEditFieldInitStatusLabelMCcs_NcTextAreaMCkr_nosurfTextAreaMCkr_surfTextAreaMCPCTextAreaMCcs_Nc_fractureTextAreaMCkr_nosurf_fractureTextAreaMCkr_surf_fractureTextAreaMCPC_fractureTextAreaMCp_grad_thresholdEditFieldMCgas_propVLEditFieldMCgas_propPLEditFieldMCgas_propKnEditFieldMCstress_factor_fractureEditFieldMCstress_factor_matrixEditFieldMCstress_factor_ref_pressureEditFieldMCbeta_non_darcy_flowEditFieldMCdensity_g_scEditFieldMCgas_modelDropDownMCprgEditFieldMCBgiEditFieldMCcgEditFieldMCvgiEditFieldMCcvgEditFieldMCPprTextAreaMCBGTextAreaMCMUGTextAreaMCdensity_w_scEditFieldMCprwEditFieldMCBwiEditFieldMCcwEditFieldMCvwiEditFieldMCcvwEditField
  • 井和排程:Well1TableFractureWellLocationTableWell2TableScheduleTableTimeTextAreaDtMinTextAreaDtMaxTextArea
  • 求解器:YitaPEditFieldYitaSEditFieldOmegaEditFieldNmaxEditFieldEpsAveEditFieldEpsMaxEditField
  • 运行和结果:RunLogTextAreaRunProgressLabelCurrentStageLabelCurrentTimeLabelCurrentDtLabelResultSummaryTextAreaResultTypeDropDownResultAxesResultTab
  • 页签组:TabGroup2TabGroup3GasWaterTabOilWaterTabMultiComponentTabSPTabDPTab

第一轮验证怎么做

  1. 在 App Designer 打开 EDFM_Simulator_App.mlapp
  2. 按上面的方式挂好属性、startup 和 callbacks。
  3. 直接运行 app。
  4. 看启动后是否自动加载 case01
  5. ModelFlowModelDropDown = 3 时是否自动切到多组分页。
  6. 不改参数直接点 Run,先验证统一链路能否起跑。

当前已知限制

  • 模板仍然只有 case01
  • 现在是“先跑通”的控制器,不是最终版用户体验。
  • UITable 里嵌套 cell 和矩阵的编辑体验还比较原始。
  • launch_edfm_simulator_app.m 目前仍指向手写 .m app,不适合你当前的 .mlapp 工作流,所以这一步先直接在 App Designer 里运行 .mlapp