feat: PEBI参数面板支持多井参数分组显示

- XML新增直井求解参数定义(X/Y/Rw/Skin/C)
- nmGridRowUtils支持按井ID前缀分组构建参数项
- nmWxParaPropertyPebi扩展refreshUIs接口传递井名
- 使用"W{ID}_"前缀路由机制,构建时自动剥离前缀
feature/nm-para-property-20260615
lh 3 weeks ago
parent 30dd9b33af
commit 3609bb5df1

@ -1 +1 @@
77u/PD94bWwgcup_mpadmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCg0KPCEtLSoqKioqKioqKiwzyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotLT4NCjwhLS0gICAg5pys5paH5qGj55qE55uu55qE5piv5bu656uLV1RBSeaVsOWAvOinoyhOTSnmqKHlnZfnmoTlj4LmlbDlrprkuYkgICAgICAgICAgICAgICAgLS0+DQo8IS0tICAgIOS7heWMheWQq1BFQknmsYLop6PlmajmiYDpnIDnmoTlgqjlsYLlj4LmlbAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPg0KPCEtLSAgICBEYXRlOiAyMDI2MDYxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+DQo8IS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi0tPg0KDQo8IS0tDQogICAg5Y+C5pWw6IyD5Zu077yaaOOAgVBp44CBS+OAgXBoaeOAgUN0aeOAgUNm44CBU29p44CBU3dpDQogICAg5a+55bqUIEhYX05XVE1fTU9ERUxfSU5QVVQ6OkJhc2Ug57uT5p6E5L2T5a2X5q61DQogICAg6YCa6L+HIF9wYXJhSGVscGVyLT5sb2FkUGFyYURlZmluZXMoKSDliqDovb3vvIxzS2V5IOagh+ivhuS4uiBzX05tX1NlcmllDQotLT4NCg0KPFJvb3Q+DQoNCiAgPFBhcmFHcm91cCBOYW1lPSIiIEFsaWFzPSLlgqjlsYLlj4LmlbAiPg0KICAgIDxQYXJhSXRlbSBOYW1lPSJoIiAgIEFsaWFzPSLlgqjlsYLljprluqYiICAgICAgIFVuaXQ9Im0iICAgICBEZWZhdWx0PSIxMCIgICAgTWF4PSIxMDAwMCIgIE1pbj0iMWUtMDUiICBEaWdpdD0iMyIgIERlc2M9InJlc2Vydm9pciB0aGlja25lc3MiIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9IlBpIiAgQWxpYXM9IuWIneWni+WOi+WKmyIgICAgICAgVW5pdD0iTVBhIiAgIERlZmF1bHQ9IjQwIiAgICBNYXg9IjUwMCIgICAgTWluPSIwLjEiICAgIERpZ2l0PSI1IiAgRGVzYz0iaW5pdGlhbCBmb3JtYXRpb24gcHJlc3N1cmUiIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9IksiICAgQWxpYXM9Iua4l+mAj+eOhyIgICAgICAgICBVbml0PSJtRCIgICAgRGVmYXVsdD0iMSIgICAgIE1heD0iMTAwMDAiICBNaW49IjAiICAgICAgRGlnaXQ9IjYiICBEZXNjPSJwZXJtZWFiaWxpdHkiIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9InBoaSIgQWxpYXM9IuWtlOmameW6piIgICAgICAgICBVbml0PSIiICAgICAgRGVmYXVsdD0iMC4xIiAgIE1heD0iMSIgICAgICBNaW49IjFlLTA1IiAgRGlnaXQ9IjQiICBEZXNjPSJwb3Jvc2l0eSIgLz4NCiAgICA8UGFyYUl0ZW0gTmFtZT0iQ3RpIiBBbGlhcz0i57u85ZCI5Y6L57yp57O75pWwIiAgIFVuaXQ9IjEvTVBhIiBEZWZhdWx0PSIwLjAwMSIgTWF4PSIxMCIgICAgIE1pbj0iMWUtMzAiICBEaWdpdD0iMTAiIFNjaWVudGlmaWM9IjEiIERlc2M9InRvdGFsIGNvbXByZXNzaWJpbGl0eSIgLz4NCiAgICA8UGFyYUl0ZW0gTmFtZT0iQ2YiICBBbGlhcz0i5bKp55+z5Y6L57yp57O75pWwIiAgIFVuaXQ9IjEvTVBhIiBEZWZhdWx0PSIwLjAwMDEiIE1heD0iMTAiICAgIE1pbj0iMWUtMzAiICBEaWdpdD0iMTAiIFNjaWVudGlmaWM9IjEiIERlc2M9InJvY2sgY29tcHJlc3NpYmlsaXR5IiAvPg0KICAgIDxQYXJhSXRlbSBOYW1lPSJTb2kiIEFsaWFzPSLliJ3lp4vlkKvmsrnppbHlkozluqYiIFVuaXQ9IiIgICAgICBEZWZhdWx0PSIwLjgiICAgTWF4PSIxIiAgICAgIE1pbj0iMCIgICAgICBEaWdpdD0iNiIgIERlc2M9ImluaXRpYWwgb2lsIHNhdHVyYXRpb24iIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9IlN3aSIgQWxpYXM9IuWIneWni+WQq+awtOmlseWSjOW6piIgVW5pdD0iIiAgICAgIERlZmF1bHQ9IjAuMiIgICBNYXg9IjEiICAgICAgTWluPSIwIiAgICAgIERpZ2l0PSI2IiAgRGVzYz0iaW5pdGlhbCB3YXRlciBzYXR1cmF0aW9uIiAvPg0KICA8L1BhcmFHcm91cD4NCg0KPC9Sb290Pg0K
77u/PD94bWwgcup_mpadmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCg0KPCEtLSoqKioqKioqKiwzyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotLT4NCjwhLS0gICAg5pys5paH5qGj55qE55uu55qE5piv5bu656uLV1RBSeaVsOWAvOinoyhOTSnmqKHlnZfnmoTlj4LmlbDlrprkuYkgICAgICAgICAgICAgICAgLS0+DQo8IS0tICAgIOS7heWMheWQq1BFQknmsYLop6PlmajmiYDpnIDnmoTlgqjlsYLlj4LmlbAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPg0KPCEtLSAgICBEYXRlOiAyMDI2MDYxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+DQo8IS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi0tPg0KDQo8IS0tDQogICAg5Y+C5pWw6IyD5Zu077yaaOOAgVBp44CBS+OAgXBoaeOAgUN0aeOAgUNm44CBU29p44CBU3dpDQogICAg5a+55bqUIEhYX05XVE1fTU9ERUxfSU5QVVQ6OkJhc2Ug57uT5p6E5L2T5a2X5q61DQogICAg6YCa6L+HIF9wYXJhSGVscGVyLT5sb2FkUGFyYURlZmluZXMoKSDliqDovb3vvIxzS2V5IOagh+ivhuS4uiBzX05tX1NlcmllDQotLT4NCg0KPFJvb3Q+DQoNCiAgPFBhcmFHcm91cCBOYW1lPSIiIEFsaWFzPSLlgqjlsYLlj4LmlbAiPg0KICAgIDxQYXJhSXRlbSBOYW1lPSJoIiAgIEFsaWFzPSLlgqjlsYLljprluqYiICAgICAgIFVuaXQ9Im0iICAgICBEZWZhdWx0PSIxMCIgICAgTWF4PSIxMDAwMCIgIE1pbj0iMWUtMDUiICBEaWdpdD0iNiIgIERlc2M9InJlc2Vydm9pciB0aGlja25lc3MiIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9IlBpIiAgQWxpYXM9IuWIneWni+WOi+WKmyIgICAgICAgVW5pdD0iTVBhIiAgIERlZmF1bHQ9IjQwIiAgICBNYXg9IjUwMCIgICAgTWluPSIwLjEiICAgIERpZ2l0PSI2IiAgRGVzYz0iaW5pdGlhbCBmb3JtYXRpb24gcHJlc3N1cmUiIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9IksiICAgQWxpYXM9Iua4l+mAj+eOhyIgICAgICAgICBVbml0PSJtRCIgICAgRGVmYXVsdD0iMSIgICAgIE1heD0iMTAwMDAiICBNaW49IjAiICAgICAgRGlnaXQ9IjYiICBEZXNjPSJwZXJtZWFiaWxpdHkiIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9InBoaSIgQWxpYXM9IuWtlOmameW6piIgICAgICAgICBVbml0PSIiICAgICAgRGVmYXVsdD0iMC4xIiAgIE1heD0iMSIgICAgICBNaW49IjFlLTA1IiAgRGlnaXQ9IjYiICBEZXNjPSJwb3Jvc2l0eSIgLz4NCiAgICA8UGFyYUl0ZW0gTmFtZT0iQ3RpIiBBbGlhcz0i57u85ZCI5Y6L57yp57O75pWwIiAgIFVuaXQ9IjEvTVBhIiBEZWZhdWx0PSIwLjAwMSIgTWF4PSIxMCIgICAgIE1pbj0iMWUtMzAiICBEaWdpdD0iMTAiIFNjaWVudGlmaWM9IjEiIERlc2M9InRvdGFsIGNvbXByZXNzaWJpbGl0eSIgLz4NCiAgICA8UGFyYUl0ZW0gTmFtZT0iQ2YiICBBbGlhcz0i5bKp55+z5Y6L57yp57O75pWwIiAgIFVuaXQ9IjEvTVBhIiBEZWZhdWx0PSIwLjAwMDEiIE1heD0iMTAiICAgIE1pbj0iMWUtMzAiICBEaWdpdD0iMTAiIFNjaWVudGlmaWM9IjEiIERlc2M9InJvY2sgY29tcHJlc3NpYmlsaXR5IiAvPg0KICAgIDxQYXJhSXRlbSBOYW1lPSJTb2kiIEFsaWFzPSLliJ3lp4vlkKvmsrnppbHlkozluqYiIFVuaXQ9IiIgICAgICBEZWZhdWx0PSIwLjgiICAgTWF4PSIxIiAgICAgIE1pbj0iMCIgICAgICBEaWdpdD0iNiIgIERlc2M9ImluaXRpYWwgb2lsIHNhdHVyYXRpb24iIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9IlN3aSIgQWxpYXM9IuWIneWni+WQq+awtOmlseWSjOW6piIgVW5pdD0iIiAgICAgIERlZmF1bHQ9IjAuMiIgICBNYXg9IjEiICAgICAgTWluPSIwIiAgICAgIERpZ2l0PSI2IiAgRGVzYz0iaW5pdGlhbCB3YXRlciBzYXR1cmF0aW9uIiAvPg0KICA8L1BhcmFHcm91cD4NCg0KICA8UGFyYUdyb3VwIE5hbWU9IiIgQWxpYXM9IuS6leWPguaVsCI+DQogICAgPFBhcmFJdGVtIE5hbWU9IldfWCIgICAgQWxpYXM9IljlnZDmoIciICAgICAgIFVuaXQ9Im0iICAgIERlZmF1bHQ9IjAiICAgICBNYXg9IjEwMDAwIiAgTWluPSItMTAwMDAiIERpZ2l0PSI2IiAgRGVzYz0id2VsbCBYIGNvb3JkaW5hdGUiIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9IldfWSIgICAgQWxpYXM9IlnlnZDmoIciICAgICAgIFVuaXQ9Im0iICAgIERlZmF1bHQ9IjAiICAgICBNYXg9IjEwMDAwIiAgTWluPSItMTAwMDAiIERpZ2l0PSI2IiAgRGVzYz0id2VsbCBZIGNvb3JkaW5hdGUiIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9IldfUnciICAgQWxpYXM9IuS6leetkuWNiuW+hCIgICAgVW5pdD0ibSIgICAgRGVmYXVsdD0iMC4xIiAgIE1heD0iMTAiICAgICBNaW49IjAuMDAxIiAgRGlnaXQ9IjYiICBEZXNjPSJ3ZWxsYm9yZSByYWRpdXMiIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9IldfU2tpbiIgQWxpYXM9IuihqOearuezu+aVsCIgICAgVW5pdD0iIiAgICAgRGVmYXVsdD0iMCIgICAgIE1heD0iMTAwMCIgICBNaW49Ii0xMDAiICAgRGlnaXQ9IjYiICBEZXNjPSJza2luIGZhY3RvciIgLz4NCiAgICA8UGFyYUl0ZW0gTmFtZT0iV19DIiAgICBBbGlhcz0i5LqV562S5YKo6ZuG57O75pWwIiBVbml0PSJtMy9NUGEiIERlZmF1bHQ9IjAiIE1heD0iMTAwMCIgICBNaW49IjAiICAgICAgRGlnaXQ9IjYiICBEZXNjPSJ3ZWxsYm9yZSBzdG9yYWdlIGNvZWZmaWNpZW50IiAvPg0KICA8L1BhcmFHcm91cD4NCg0KPC9Sb290Pg0K

@ -1 +1 @@
77u/PD94bWwgcup_mpadmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCg0KPCEtLSoqKioqKioqKiwzyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotLT4NCjwhLS0gICAgVGhpcyBmaWxlIGRlZmluZXMgcGFyYW1ldGVycyBmb3IgdGhlIFdUQUkgTnVtZXJpY2FsIChOTSkgICAgLS0+DQo8IS0tICAgIG1vZHVsZS4gT25seSBQRUJJIHNvbHZlciByZXNlcnZvaXIgcGFyYW1ldGVycyBhcmUgaW5jbHVkZWQuICAtLT4NCjwhLS0gICAgQXV0aG9yKHMpOiBhdXRvLWdlbmVyYXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPg0KPCEtLSAgICBEYXRlOiAyMDI2MDYxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+DQo8IS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi0tPg0KDQo8IS0tDQogICAgUGFyYW1ldGVyIHNjb3BlOiBoLCBQaSwgSywgcGhpLCBDdGksIENmLCBTb2ksIFN3aQ0KICAgIENvcnJlc3BvbmRzIHRvIEhYX05XVE1fTU9ERUxfSU5QVVQ6OkJhc2Ugc3RydWN0IGZpZWxkcw0KICAgIExvYWRlZCB2aWEgX3BhcmFIZWxwZXItPmxvYWRQYXJhRGVmaW5lcygpLCBzS2V5ID0gc19ObV9TZXJpZQ0KLS0+DQoNCjxSb290Pg0KDQogIDxQYXJhR3JvdXAgTmFtZT0iIiBBbGlhcz0iUmVzZXJ2b2lyIFBhcmFtZXRlcnMiPg0KICAgIDxQYXJhSXRlbSBOYW1lPSJoIiAgIEFsaWFzPSJSZXNlcnZvaXIgVGhpY2tuZXNzIiAgICAgICAgIFVuaXQ9Im0iICAgICBEZWZhdWx0PSIxMCIgICAgTWF4PSIxMDAwMCIgIE1pbj0iMWUtMDUiICBEaWdpdD0iMyIgIERlc2M9InJlc2Vydm9pciB0aGlja25lc3MiIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9IlBpIiAgQWxpYXM9IkluaXRpYWwgUHJlc3N1cmUiICAgICAgICAgICAgVW5pdD0iTVBhIiAgIERlZmF1bHQ9IjQwIiAgICBNYXg9IjUwMCIgICAgTWluPSIwLjEiICAgIERpZ2l0PSI1IiAgRGVzYz0iaW5pdGlhbCBmb3JtYXRpb24gcHJlc3N1cmUiIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9IksiICAgQWxpYXM9IlBlcm1lYWJpbGl0eSIgICAgICAgICAgICAgICAgVW5pdD0ibUQiICAgIERlZmF1bHQ9IjEiICAgICBNYXg9IjEwMDAwIiAgTWluPSIwIiAgICAgIERpZ2l0PSI2IiAgRGVzYz0icGVybWVhYmlsaXR5IiAvPg0KICAgIDxQYXJhSXRlbSBOYW1lPSJwaGkiIEFsaWFzPSJQb3Jvc2l0eSIgICAgICAgICAgICAgICAgICAgIFVuaXQ9IiIgICAgICBEZWZhdWx0PSIwLjEiICAgTWF4PSIxIiAgICAgIE1pbj0iMWUtMDUiICBEaWdpdD0iNCIgIERlc2M9InBvcm9zaXR5IiAvPg0KICAgIDxQYXJhSXRlbSBOYW1lPSJDdGkiIEFsaWFzPSJUb3RhbCBDb21wcmVzc2liaWxpdHkiICAgICAgIFVuaXQ9IjEvTVBhIiBEZWZhdWx0PSIwLjAwMSIgTWF4PSIxMCIgICAgIE1pbj0iMWUtMzAiICBEaWdpdD0iMTAiIFNjaWVudGlmaWM9IjEiIERlc2M9InRvdGFsIGNvbXByZXNzaWJpbGl0eSIgLz4NCiAgICA8UGFyYUl0ZW0gTmFtZT0iQ2YiICBBbGlhcz0iUm9jayBDb21wcmVzc2liaWxpdHkiICAgICAgICBVbml0PSIxL01QYSIgRGVmYXVsdD0iMC4wMDAxIiBNYXg9IjEwIiAgICBNaW49IjFlLTMwIiAgRGlnaXQ9IjEwIiBTY2llbnRpZmljPSIxIiBEZXNjPSJyb2NrIGNvbXByZXNzaWJpbGl0eSIgLz4NCiAgICA8UGFyYUl0ZW0gTmFtZT0iU29pIiBBbGlhcz0iSW5pdGlhbCBPaWwgU2F0dXJhdGlvbiIgICAgICBVbml0PSIiICAgICAgRGVmYXVsdD0iMC44IiAgIE1heD0iMSIgICAgICBNaW49IjAiICAgICAgRGlnaXQ9IjYiICBEZXNjPSJpbml0aWFsIG9pbCBzYXR1cmF0aW9uIiAvPg0KICAgIDxQYXJhSXRlbSBOYW1lPSJTd2kiIEFsaWFzPSJJbml0aWFsIFdhdGVyIFNhdHVyYXRpb24iICAgIFVuaXQ9IiIgICAgICBEZWZhdWx0PSIwLjIiICAgTWF4PSIxIiAgICAgIE1pbj0iMCIgICAgICBEaWdpdD0iNiIgIERlc2M9ImluaXRpYWwgd2F0ZXIgc2F0dXJhdGlvbiIgLz4NCiAgPC9QYXJhR3JvdXA+DQoNCjwvUm9vdD4NCg==
77u/PD94bWwgcup_mpadmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCg0KPCEtLSoqKioqKioqKiwzyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotLT4NCjwhLS0gICAgVGhpcyBmaWxlIGRlZmluZXMgcGFyYW1ldGVycyBmb3IgdGhlIFdUQUkgTnVtZXJpY2FsIChOTSkgICAgLS0+DQo8IS0tICAgIG1vZHVsZS4gT25seSBQRUJJIHNvbHZlciByZXNlcnZvaXIgcGFyYW1ldGVycyBhcmUgaW5jbHVkZWQuICAtLT4NCjwhLS0gICAgRGF0ZTogMjAyNjA2MTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPg0KPCEtLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotLT4NCg0KPCEtLQ0KICAgIFBhcmFtZXRlciBzY29wZTogaCwgUGksIEssIHBoaSwgQ3RpLCBDZiwgU29pLCBTd2kNCiAgICBDb3JyZXNwb25kcyB0byBIWF9OV1RNX01PREVMX0lOUFVUOjpCYXNlIHN0cnVjdCBmaWVsZHMNCiAgICBMb2FkZWQgdmlhIF9wYXJhSGVscGVyLT5sb2FkUGFyYURlZmluZXMoKSwgc0tleSA9IHNfTm1fU2VyaWUNCi0tPg0KDQo8Um9vdD4NCg0KICA8UGFyYUdyb3VwIE5hbWU9IiIgQWxpYXM9IlJlc2Vydm9pciBQYXJhbWV0ZXJzIj4NCiAgICA8UGFyYUl0ZW0gTmFtZT0iaCIgICBBbGlhcz0iUmVzZXJ2b2lyIFRoaWNrbmVzcyIgICAgICAgICBVbml0PSJtIiAgICAgRGVmYXVsdD0iMTAiICAgIE1heD0iMTAwMDAiICBNaW49IjFlLTA1IiAgRGlnaXQ9IjMiICBEZXNjPSJyZXNlcnZvaXIgdGhpY2tuZXNzIiAvPg0KICAgIDxQYXJhSXRlbSBOYW1lPSJQaSIgIEFsaWFzPSJJbml0aWFsIFByZXNzdXJlIiAgICAgICAgICAgIFVuaXQ9Ik1QYSIgICBEZWZhdWx0PSI0MCIgICAgTWF4PSI1MDAiICAgIE1pbj0iMC4xIiAgICBEaWdpdD0iNSIgIERlc2M9ImluaXRpYWwgZm9ybWF0aW9uIHByZXNzdXJlIiAvPg0KICAgIDxQYXJhSXRlbSBOYW1lPSJLIiAgIEFsaWFzPSJQZXJtZWFiaWxpdHkiICAgICAgICAgICAgICAgIFVuaXQ9Im1EIiAgICBEZWZhdWx0PSIxIiAgICAgTWF4PSIxMDAwMCIgIE1pbj0iMCIgICAgICBEaWdpdD0iNiIgIERlc2M9InBlcm1lYWJpbGl0eSIgLz4NCiAgICA8UGFyYUl0ZW0gTmFtZT0icGhpIiBBbGlhcz0iUG9yb3NpdHkiICAgICAgICAgICAgICAgICAgICBVbml0PSIiICAgICAgRGVmYXVsdD0iMC4xIiAgIE1heD0iMSIgICAgICBNaW49IjFlLTA1IiAgRGlnaXQ9IjQiICBEZXNjPSJwb3Jvc2l0eSIgLz4NCiAgICA8UGFyYUl0ZW0gTmFtZT0iQ3RpIiBBbGlhcz0iVG90YWwgQ29tcHJlc3NpYmlsaXR5IiAgICAgICBVbml0PSIxL01QYSIgRGVmYXVsdD0iMC4wMDEiIE1heD0iMTAiICAgICBNaW49IjFlLTMwIiAgRGlnaXQ9IjEwIiBTY2llbnRpZmljPSIxIiBEZXNjPSJ0b3RhbCBjb21wcmVzc2liaWxpdHkiIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9IkNmIiAgQWxpYXM9IlJvY2sgQ29tcHJlc3NpYmlsaXR5IiAgICAgICAgVW5pdD0iMS9NUGEiIERlZmF1bHQ9IjAuMDAwMSIgTWF4PSIxMCIgICAgTWluPSIxZS0zMCIgIERpZ2l0PSIxMCIgU2NpZW50aWZpYz0iMSIgRGVzYz0icm9jayBjb21wcmVzc2liaWxpdHkiIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9IlNvaSIgQWxpYXM9IkluaXRpYWwgT2lsIFNhdHVyYXRpb24iICAgICAgVW5pdD0iIiAgICAgIERlZmF1bHQ9IjAuOCIgICBNYXg9IjEiICAgICAgTWluPSIwIiAgICAgIERpZ2l0PSI2IiAgRGVzYz0iaW5pdGlhbCBvaWwgc2F0dXJhdGlvbiIgLz4NCiAgICA8UGFyYUl0ZW0gTmFtZT0iU3dpIiBBbGlhcz0iSW5pdGlhbCBXYXRlciBTYXR1cmF0aW9uIiAgICBVbml0PSIiICAgICAgRGVmYXVsdD0iMC4yIiAgIE1heD0iMSIgICAgICBNaW49IjAiICAgICAgRGlnaXQ9IjYiICBEZXNjPSJpbml0aWFsIHdhdGVyIHNhdHVyYXRpb24iIC8+DQogIDwvUGFyYUdyb3VwPg0KDQogIDxQYXJhR3JvdXAgTmFtZT0iIiBBbGlhcz0iV2VsbCBQYXJhbWV0ZXJzIj4NCiAgICA8UGFyYUl0ZW0gTmFtZT0iV19YIiAgICBBbGlhcz0iWCBDb29yZGluYXRlIiAgICAgICAgICAgIFVuaXQ9Im0iICAgICAgRGVmYXVsdD0iMCIgICAgIE1heD0iMTAwMDAiICBNaW49Ii0xMDAwMCIgRGlnaXQ9IjYiICBEZXNjPSJ3ZWxsIFggY29vcmRpbmF0ZSIgLz4NCiAgICA8UGFyYUl0ZW0gTmFtZT0iV19ZIiAgICBBbGlhcz0iWSBDb29yZGluYXRlIiAgICAgICAgICAgIFVuaXQ9Im0iICAgICAgRGVmYXVsdD0iMCIgICAgIE1heD0iMTAwMDAiICBNaW49Ii0xMDAwMCIgRGlnaXQ9IjYiICBEZXNjPSJ3ZWxsIFkgY29vcmRpbmF0ZSIgLz4NCiAgICA8UGFyYUl0ZW0gTmFtZT0iV19SdyIgICBBbGlhcz0iV2VsbGJvcmUgUmFkaXVzIiAgICAgICAgIFVuaXQ9Im0iICAgICAgRGVmYXVsdD0iMC4xIiAgIE1heD0iMTAiICAgICBNaW49IjAuMDAxIiAgRGlnaXQ9IjYiICBEZXNjPSJ3ZWxsYm9yZSByYWRpdXMiIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9IldfU2tpbiIgQWxpYXM9IlNraW4gRmFjdG9yIiAgICAgICAgICAgICBVbml0PSIiICAgICAgIERlZmF1bHQ9IjAiICAgICBNYXg9IjEwMDAiICAgTWluPSItMTAwIiAgIERpZ2l0PSI2IiAgRGVzYz0ic2tpbiBmYWN0b3IiIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9IldfQyIgICAgQWxpYXM9IldlbGxib3JlIFN0b3JhZ2UgQ29lZmYiICBVbml0PSJtMy9NUGEiIERlZmF1bHQ9IjAiICAgICBNYXg9IjEwMDAiICAgTWluPSIwIiAgICAgIERpZ2l0PSI2IiAgRGVzYz0id2VsbGJvcmUgc3RvcmFnZSBjb2VmZmljaWVudCIgLz4NCiAgPC9QYXJhR3JvdXA+DQoNCjwvUm9vdD4NCg==

@ -25,4 +25,12 @@
<ParaItem Name="Swi" Alias="初始含水饱和度" Unit="" Default="0.2" Max="1" Min="0" Digit="6" Desc="initial water saturation" />
</ParaGroup>
<ParaGroup Name="" Alias="井参数">
<ParaItem Name="W_X" Alias="X坐标" Unit="m" Default="0" Max="10000" Min="-10000" Digit="6" Desc="well X coordinate" />
<ParaItem Name="W_Y" Alias="Y坐标" Unit="m" Default="0" Max="10000" Min="-10000" Digit="6" Desc="well Y coordinate" />
<ParaItem Name="W_Rw" Alias="井筒半径" Unit="m" Default="0.1" Max="10" Min="0.001" Digit="6" Desc="wellbore radius" />
<ParaItem Name="W_Skin" Alias="表皮系数" Unit="" Default="0" Max="1000" Min="-100" Digit="6" Desc="skin factor" />
<ParaItem Name="W_C" Alias="井筒储集系数" Unit="m3/MPa" Default="0" Max="1000" Min="0" Digit="6" Desc="wellbore storage coefficient" />
</ParaGroup>
</Root>

@ -25,4 +25,12 @@
<ParaItem Name="Swi" Alias="Initial Water Saturation" Unit="" Default="0.2" Max="1" Min="0" Digit="6" Desc="initial water saturation" />
</ParaGroup>
<ParaGroup Name="" Alias="Well Parameters">
<ParaItem Name="W_X" Alias="X Coordinate" Unit="m" Default="0" Max="10000" Min="-10000" Digit="6" Desc="well X coordinate" />
<ParaItem Name="W_Y" Alias="Y Coordinate" Unit="m" Default="0" Max="10000" Min="-10000" Digit="6" Desc="well Y coordinate" />
<ParaItem Name="W_Rw" Alias="Wellbore Radius" Unit="m" Default="0.1" Max="10" Min="0.001" Digit="6" Desc="wellbore radius" />
<ParaItem Name="W_Skin" Alias="Skin Factor" Unit="" Default="0" Max="1000" Min="-100" Digit="6" Desc="skin factor" />
<ParaItem Name="W_C" Alias="Wellbore Storage Coeff" Unit="m3/MPa" Default="0" Max="1000" Min="0" Digit="6" Desc="wellbore storage coefficient" />
</ParaGroup>
</Root>

@ -86,6 +86,14 @@ public:
/// @param s 来源标识,如 "WDT" 等
void setParaSrcTag(QString s);
// ================================================================
// 多井分组支持
// ================================================================
/// @brief 设置井名映射永久ID → 显示名)
/// @param map 井ID到显示名称的映射如 {0: "Well-1", 3: "测试井A"}
void setWellNames(QMap<int, QString> map);
// ================================================================
// 序列化
// ================================================================
@ -139,6 +147,23 @@ protected:
/// @brief 参数项创建完成后的绑定处理(如产液段与有效长度的关联)
virtual void bindItems() override;
// ================================================================
// 多井分组内部方法
// ================================================================
/// @brief 将参数列表拆分为储层参数和井参数
/// @param listParas (in) 完整的参数列表
/// @param listRes (out) 储层参数(无前缀)
/// @param mapWellParas (out) 井ID → 该井的参数列表(已剥掉前缀)
void splitWellParas(QStringList listParas,
QStringList& listRes,
QMap<int, QStringList>& mapWellParas);
/// @brief 为每口井创建 Group 分组并填充参数项
/// @param mapWellParas 井ID → 参数列表(已剥掉前缀)
/// @param bDnMode 是否为设计模式
void buildWellGroups(QMap<int, QStringList>& mapWellParas, bool bDnMode);
public slots:
/// @brief 获取指定参数的当前值(供子项内部查询用)
@ -147,6 +172,11 @@ public slots:
/// @param bOk 是否成功获取
virtual void slotGetValueOf(QString sPara, QVariant& o, bool& bOk) override;
private:
/// @brief 井名映射永久ID → 显示名)
QMap<int, QString> m_mapWellNames;
private slots:
/// @brief 参数值改变后的回调iGridRowItem::sigValueChanged 触发)

@ -26,7 +26,8 @@ public:
/// @param bReserveOlds (in) 是否保留原来比如原先属性页已经有s和k这时候新的列表里面也包括s和k
/// @note 参数列表必须是在系统中配置的参数listParas已经包括了显示顺序
/// 但对于层级,由系统配置来决定
virtual void refreshUIs(QStringList& listParas, bool bReserveOlds = true);
virtual void refreshUIs(QStringList& listParas, bool bReserveOlds = true,
QMap<int, QString> mapWellNames = QMap<int, QString>());
// 允许备份/恢复原有的参数内容
virtual void backupOldParas(QMap<QString, QVariant>& map,

@ -1,4 +1,7 @@
#include "nmGridRowUtils.h"
#include "iGridRowGroup.h"
#include "iParameter.h"
#include "iSysParaHelper.h"
// ================================================================
// 构造与析构
@ -23,12 +26,42 @@ void nmGridRowUtils::initUI()
iGridRowUtils::initUI();
}
void nmGridRowUtils::setWellNames(QMap<int, QString> map)
{
m_mapWellNames = map;
}
bool nmGridRowUtils::buildRowUtils(QStringList listParas,
bool bDnMode,
QWidget* pWxDlg)
{
// 当前直接转发至基类,后续可在此拦截参数列表或做前置/后置处理
return iGridRowUtils::buildRowUtils(listParas, bDnMode, pWxDlg);
// 分离储层参数和井参数
QStringList listRes;
QMap<int, QStringList> mapWellParas;
splitWellParas(listParas, listRes, mapWellParas);
// 构建储层参数(基类处理)
if (!iGridRowUtils::buildRowUtils(listRes, bDnMode, pWxDlg))
{
return false;
}
// 构建井分组
if (!mapWellParas.isEmpty())
{
buildWellGroups(mapWellParas, bDnMode);
// 井分组追加完成后,重新备份、绑定、计算布局
bkAllItems();
bindItems();
double h = getUtilHeight();
QRectF rt = QRectF(0, 0, 300, h);
setBounds(rt);
setMinimumHeight(h);
}
return true;
}
// ================================================================
@ -124,7 +157,37 @@ bool nmGridRowUtils::createAndAddItem(iGridRowItem* pParent,
iParameter* p,
QString sPara)
{
return iGridRowUtils::createAndAddItem(pParent, p, sPara);
// 检查父级是否为井分组,若是则设置 nameInner含井前缀
QString sNameInner;
if (nullptr != pParent)
{
QString sTagLayer = pParent->getTagLayer();
if (!sTagLayer.isEmpty() && nullptr != p)
{
sNameInner = sTagLayer + p->m_sName;
}
}
int nOldCount = (nullptr != pParent ? pParent->getChildCount() : 0);
if (!iGridRowUtils::createAndAddItem(pParent, p, sPara))
{
return false;
}
// 设置 nameInner
if (!sNameInner.isEmpty() && nullptr != pParent)
{
if (pParent->getChildCount() == nOldCount + 1)
{
iGridRowItem* pItem = pParent->getChildAt(nOldCount);
if (nullptr != pItem)
{
pItem->setNameInner(sNameInner);
}
}
}
return true;
}
void nmGridRowUtils::connectSignalsOf(iGridRowItem* p)
@ -141,6 +204,87 @@ void nmGridRowUtils::bindItems()
iGridRowUtils::bindItems();
}
// ================================================================
// 多井分组实现
// ================================================================
void nmGridRowUtils::splitWellParas(QStringList listParas,
QStringList& listRes,
QMap<int, QStringList>& mapWellParas)
{
listRes.clear();
mapWellParas.clear();
foreach (QString sPara, listParas)
{
// 检查是否匹配 "WN_" 格式N为井永久ID
if (sPara.length() >= 2
&& sPara.at(0).toUpper() == 'W'
&& sPara.at(1).isDigit())
{
// 提取井ID
int i = 1;
while (i < sPara.length() && sPara.at(i).isDigit())
{
i++;
}
if (i < sPara.length() && sPara.at(i) == '_')
{
int nWellId = sPara.mid(1, i - 1).toInt();
QString sBaseName = sPara.mid(i + 1); // 剥掉 "WN_" 前缀
mapWellParas[nWellId] << sBaseName;
continue;
}
}
// 非井参数,归入储层
listRes << sPara;
}
}
void nmGridRowUtils::buildWellGroups(QMap<int, QStringList>& mapWellParas,
bool bDnMode)
{
bool bProperOrder = true;
// 按井ID排序遍历
QList<int> listIds = mapWellParas.keys();
qSort(listIds);
foreach (int nWellId, listIds)
{
QStringList listParas = mapWellParas[nWellId];
if (listParas.isEmpty())
{
continue;
}
// 井前缀,如 "W0_"
QString sPrefix = QString("W%1_").arg(nWellId);
// 显示名称
QString sWellName = tr("Well #%1").arg(nWellId);
if (m_mapWellNames.contains(nWellId))
{
sWellName = m_mapWellNames[nWellId];
}
// 创建井分组(纯标题,不需要编辑器)
iGridRowGroup* pGroup = new iGridRowGroup(nullptr);
Q_ASSERT(nullptr != pGroup);
pGroup->setParaSrcTag(m_sParaSrcTag);
pGroup->setTagInner(sWellName); // Group 标题
pGroup->setTagLayer(sPrefix); // 井前缀标识
connectSignalsOf(pGroup);
pGroup->setDlgBase(this);
m_vecGridItems.append(pGroup);
// 在该分组下构建参数项
_buildRowUtils(listParas, pGroup, bDnMode, bProperOrder);
}
}
// ================================================================
// 槽函数
// ================================================================

@ -591,7 +591,15 @@ bool nmSubWndUtils::fillNmDockWxs(iSubWnd* pSubWnd)
QStringList listParas;
listParas << "h" << "Pi" << "K" << "phi" << "Cti" << "Cf" << "Soi" << "Swi";
pParaWx->refreshUIs(listParas);
// 测试井参数(第一版显示验证,后续改为从数据层动态组装)
listParas << "W0_W_X" << "W0_W_Y" << "W0_W_Rw" << "W0_W_Skin" << "W0_W_C";
listParas << "W1_W_X" << "W1_W_Y" << "W1_W_Rw" << "W1_W_Skin" << "W1_W_C";
QMap<int, QString> mapWellNames;
mapWellNames[0] = tr("Well-1");
mapWellNames[1] = tr("Well-2");
pParaWx->refreshUIs(listParas, true, mapWellNames);
// 通过 nmAttrRegistry 批量读取储层参数初始化UI替代逐个 getter 调用)
nmAttrRegistry* pReg = pDataManager->getAttrRegistry();
@ -874,7 +882,16 @@ bool nmSubWndUtils::loadRsts(iSubWnd* pSubWnd, \
QStringList listParas;
listParas << "h" << "Pi" << "K" << "phi" << "Cti" << "Cf" << "Soi" << "Swi";
pParaWx->refreshUIs(listParas);
// 测试井参数(第一版显示验证,后续改为从数据层动态组装)
listParas << "W0_W_X" << "W0_W_Y" << "W0_W_Rw" << "W0_W_Skin" << "W0_W_C";
listParas << "W1_W_X" << "W1_W_Y" << "W1_W_Rw" << "W1_W_Skin" << "W1_W_C";
QMap<int, QString> mapWellNames;
mapWellNames[0] = tr("Well-1");
mapWellNames[1] = tr("Well-2");
pParaWx->refreshUIs(listParas, true, mapWellNames);
nmAttrRegistry* pReg = pDataManager->getAttrRegistry();
if (pReg != nullptr)

@ -85,7 +85,8 @@ void nmWxParaPropertyPebi::initUI_HelpBox()
m_pHelpBox->setReadOnly(true);
}
void nmWxParaPropertyPebi::refreshUIs(QStringList& listParas, bool bReserveOlds /*= true*/)
void nmWxParaPropertyPebi::refreshUIs(QStringList& listParas, bool bReserveOlds /*= true*/,
QMap<int, QString> mapWellNames /*= QMap<int, QString>()*/)
{
if (nullptr == m_pMainLayout)
{
@ -117,6 +118,7 @@ void nmWxParaPropertyPebi::refreshUIs(QStringList& listParas, bool bReserveOlds
connect(m_pGridItemUtils, SIGNAL(sigParaChanged(QString, QVariant)),
this, SIGNAL(sigParaChanged(QString, QVariant)));
m_pMainLayout->addWidget(m_pGridItemUtils);
m_pGridItemUtils->setWellNames(mapWellNames);
m_pGridItemUtils->buildRowUtils(listParas, false, this);
// 恢复原有的参数内容

Loading…
Cancel
Save