# App Designer Binding Guide ## Fastest Path 按原计划要最快跑通,建议只先做这一条主线: 1. 保持真正界面文件为 [EDFM_Simulator_App.mlapp](C:\Users\15715\Documents\code\edfm_gui\gui_support\app\EDFM_Simulator_App.mlapp)。 2. 不直接改解包后的 `.mlapp` 内容。 3. 用新加的控制器 [EDFMAppController.m](C:\Users\15715\Documents\code\edfm_gui\gui_support\app\EDFMAppController.m) 负责绑定。 4. 首先只保证 `case01` 的模板加载、配置导入导出、运行、结果导入导出、基础绘图跑通。 5. 其他 case 和更细的参数编辑体验留到下一轮。 原因很直接:现在仓库里后端已经有统一 `config`、`case01` 模板、`run_case(config)`、MAT 导入导出,缺的主要就是 `.mlapp` 的回调连接和控件同步。 ## 我已经补了什么 新增了 [EDFMAppController.m](C:\Users\15715\Documents\code\edfm_gui\gui_support\app\EDFMAppController.m),负责: - 启动默认加载 `case01` - `New Config` - 模板加载 - config 导入导出 - result 导入导出 - 从 UI 回写 `config` - 从 `config` 刷新 UI - 调用 `run_case(config)` - 基础结果摘要和绘图 - SP/DP 页签切换 - 三种流动模型页签切换 当前重点是让你现有 `.mlapp` 最快可运行,不是一次性把所有参数编辑体验做完。 ## 你需要在 App Designer 里手动做的事 只在 [EDFM_Simulator_App.mlapp](C:\Users\15715\Documents\code\edfm_gui\gui_support\app\EDFM_Simulator_App.mlapp) 里做下面这些操作。 ### 1. 添加控制器属性 在属性区加上: ```matlab Controller EDFMAppController ``` 如果已经有,就保留,不要改名。 ### 2. 添加 startup 函数 在 Code View 里确认有: ```matlab function startupApp(app) app.Controller = EDFMAppController(app); app.Controller.startup(); end ``` 并确认构造函数里有: ```matlab runStartupFcn(app, @(~,~)startupApp(app)); ``` ### 3. 绑定按钮回调 把这些控件分别绑定到这些方法: - `NewConfigButton` -> `onNewConfig` - `LoadTemplateButton` -> `onLoadTemplate` - `ImportConfigButton` -> `onImportConfig` - `ExportConfigButton` -> `onExportConfig` - `RunButton` -> `onRun` - `RunCurrentConfigButton` -> `onRun` - `ImportResultButton` -> `onImportResult` - `ExportResultButton` -> `onExportResult` - `PlotResultButton` -> `onPlotResult` 对应方法: ```matlab 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` 方法: ```matlab function onModelChanged(app) if ~isempty(app.Controller) app.Controller.syncModelTabs(); end end ``` 同时把: - `ResultTypeDropDown` 的 `ValueChangedFcn` 绑定到 `onPlotResult`。 ### 5. 保持控件名不变 控制器默认依赖这些命名,不要在 App Designer 里随意改: - 顶栏:`TemplateDropDown`、`LoadTemplateButton`、`ImportConfigButton`、`ExportConfigButton`、`RunButton`、`ImportResultButton`、`ExportResultButton`、`StatusLabel` - 模型:`ModelFlagDropDown`、`ModelGridModelDropDown`、`ModelFlowModelDropDown` - 网格:`GridDxTextArea`、`GridDyTextArea`、`GridDzTextArea`、`GridNTGTextArea` - 裂缝:`FractureInputStyleDropDown`、`FractureInputTextArea`、`FractureLinesTextArea`、`FractureHeightsTextArea`、`FractureFlowBarrierFlagsTextArea` - SP:`SPBoundaryTextArea`、`SPInvalidLayerTextArea`、`SPMatrixKxTextArea`、`SPMatrixKyTextArea`、`SPMatrixKzTextArea`、`SPMatrixPoriTextArea`、`SPMatrixPrporEditField`、`SPMatrixCporEditField`、`SPRockDensityEditField`、`SPFractureKfTextArea`、`SPFractureWfTextArea`、`SPFracturePorfTextArea`、`SPFracturePrporEditField`、`SPFractureCporfEditField`、`SPStressFractureEditField`、`SPStressMatrixEditField`、`SPStressRefPressureEditField` - DP:`DPkxTextArea`、`DPkyTextArea`、`DPkzTextArea`、`DPkx_matrixLayerTextArea`、`DPky_matrixLayerTextArea`、`DPkz_matrixLayerTextArea`、`DPpori_matrixLayerTextArea`、`DPsigmaTextArea`、`DPNTGTextArea`、`DPprporEditField`、`DPcporEditField`、`DPKfTextArea`、`DPWfTextArea`、`DPPorfTextArea`、`DPprporfEditField`、`DPcporfEditField`、`DPstress_factor_fractureEditField`、`DPstress_factor_matrixEditField`、`DPstress_factor_ref_pressureEditField` - 初始值和多组分主控件:`InitialPressureEditField`、`InitialSwEditField`、`InitialCsEditField`、`InitialCbEditField`、`InitStatusLabel`、`MCcs_NcTextArea`、`MCkr_nosurfTextArea`、`MCkr_surfTextArea`、`MCPCTextArea`、`MCcs_Nc_fractureTextArea`、`MCkr_nosurf_fractureTextArea`、`MCkr_surf_fractureTextArea`、`MCPC_fractureTextArea`、`MCp_grad_thresholdEditField`、`MCgas_propVLEditField`、`MCgas_propPLEditField`、`MCgas_propKnEditField`、`MCstress_factor_fractureEditField`、`MCstress_factor_matrixEditField`、`MCstress_factor_ref_pressureEditField`、`MCbeta_non_darcy_flowEditField`、`MCdensity_g_scEditField`、`MCgas_modelDropDown`、`MCprgEditField`、`MCBgiEditField`、`MCcgEditField`、`MCvgiEditField`、`MCcvgEditField`、`MCPprTextArea`、`MCBGTextArea`、`MCMUGTextArea`、`MCdensity_w_scEditField`、`MCprwEditField`、`MCBwiEditField`、`MCcwEditField`、`MCvwiEditField`、`MCcvwEditField` - 井和排程:`Well1Table`、`FractureWellLocationTable`、`Well2Table`、`ScheduleTable`、`TimeTextArea`、`DtMinTextArea`、`DtMaxTextArea` - 求解器:`YitaPEditField`、`YitaSEditField`、`OmegaEditField`、`NmaxEditField`、`EpsAveEditField`、`EpsMaxEditField` - 运行和结果:`RunLogTextArea`、`RunProgressLabel`、`CurrentStageLabel`、`CurrentTimeLabel`、`CurrentDtLabel`、`ResultSummaryTextArea`、`ResultTypeDropDown`、`ResultAxes`、`ResultTab` - 页签组:`TabGroup2`、`TabGroup3`、`GasWaterTab`、`OilWaterTab`、`MultiComponentTab`、`SPTab`、`DPTab` ## 第一轮验证怎么做 1. 在 App Designer 打开 [EDFM_Simulator_App.mlapp](C:\Users\15715\Documents\code\edfm_gui\gui_support\app\EDFM_Simulator_App.mlapp)。 2. 按上面的方式挂好属性、startup 和 callbacks。 3. 直接运行 app。 4. 看启动后是否自动加载 `case01`。 5. 看 `ModelFlowModelDropDown = 3` 时是否自动切到多组分页。 6. 不改参数直接点 `Run`,先验证统一链路能否起跑。 ## 当前已知限制 - 模板仍然只有 `case01`。 - 现在是“先跑通”的控制器,不是最终版用户体验。 - `UITable` 里嵌套 cell 和矩阵的编辑体验还比较原始。 - [launch_edfm_simulator_app.m](C:\Users\15715\Documents\code\edfm_gui\gui_support\app\launch_edfm_simulator_app.m) 目前仍指向手写 `.m` app,不适合你当前的 `.mlapp` 工作流,所以这一步先直接在 App Designer 里运行 `.mlapp`。