diff --git a/Bin/Config/Common/ModelParaDefinesNM_cn.dat b/Bin/Config/Common/ModelParaDefinesNM_cn.dat
index b3a47e5..0a1d04b 100644
--- a/Bin/Config/Common/ModelParaDefinesNM_cn.dat
+++ b/Bin/Config/Common/ModelParaDefinesNM_cn.dat
@@ -1 +1 @@
-77u/PD94bWwgcup_mpadmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCg0KPCEtLSoqKioqKioqKiwzyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotLT4NCjwhLS0gICAg5pys5paH5qGj55qE55uu55qE5piv5bu656uLV1RBSeaVsOWAvOinoyhOTSnmqKHlnZfnmoTlj4LmlbDlrprkuYkgICAgICAgICAgICAgICAgLS0+DQo8IS0tICAgIOS7heWMheWQq1BFQknmsYLop6PlmajmiYDpnIDnmoTlgqjlsYLlj4LmlbAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPg0KPCEtLSAgICBEYXRlOiAyMDI2MDYxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+DQo8IS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi0tPg0KDQo8IS0tDQogICAg5Y+C5pWw6IyD5Zu077yaaOOAgVBp44CBS+OAgXBoaeOAgUN0aeOAgUNm44CBU29p44CBU3dpDQogICAg5a+55bqUIEhYX05XVE1fTU9ERUxfSU5QVVQ6OkJhc2Ug57uT5p6E5L2T5a2X5q61DQogICAg6YCa6L+HIF9wYXJhSGVscGVyLT5sb2FkUGFyYURlZmluZXMoKSDliqDovb3vvIxzS2V5IOagh+ivhuS4uiBzX05tX1NlcmllDQotLT4NCg0KPFJvb3Q+DQoNCiAgPFBhcmFHcm91cCBOYW1lPSIiIEFsaWFzPSLlgqjlsYLlj4LmlbAiPg0KICAgIDxQYXJhSXRlbSBOYW1lPSJoIiAgIEFsaWFzPSLlgqjlsYLljprluqYiICAgICAgIFVuaXQ9Im0iICAgICBEZWZhdWx0PSIxMCIgICAgTWF4PSIxMDAwMCIgIE1pbj0iMWUtMDUiICBEaWdpdD0iMyIgIERlc2M9InJlc2Vydm9pciB0aGlja25lc3MiIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9IlBpIiAgQWxpYXM9IuWIneWni+WOi+WKmyIgICAgICAgVW5pdD0iTVBhIiAgIERlZmF1bHQ9IjQwIiAgICBNYXg9IjUwMCIgICAgTWluPSIwLjEiICAgIERpZ2l0PSI1IiAgRGVzYz0iaW5pdGlhbCBmb3JtYXRpb24gcHJlc3N1cmUiIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9IksiICAgQWxpYXM9Iua4l+mAj+eOhyIgICAgICAgICBVbml0PSJtRCIgICAgRGVmYXVsdD0iMSIgICAgIE1heD0iMTAwMDAiICBNaW49IjAiICAgICAgRGlnaXQ9IjYiICBEZXNjPSJwZXJtZWFiaWxpdHkiIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9InBoaSIgQWxpYXM9IuWtlOmameW6piIgICAgICAgICBVbml0PSIiICAgICAgRGVmYXVsdD0iMC4xIiAgIE1heD0iMSIgICAgICBNaW49IjFlLTA1IiAgRGlnaXQ9IjQiICBEZXNjPSJwb3Jvc2l0eSIgLz4NCiAgICA8UGFyYUl0ZW0gTmFtZT0iQ3RpIiBBbGlhcz0i57u85ZCI5Y6L57yp57O75pWwIiAgIFVuaXQ9IjEvTVBhIiBEZWZhdWx0PSIwLjAwMSIgTWF4PSIxMCIgICAgIE1pbj0iMWUtMzAiICBEaWdpdD0iMTAiIFNjaWVudGlmaWM9IjEiIERlc2M9InRvdGFsIGNvbXByZXNzaWJpbGl0eSIgLz4NCiAgICA8UGFyYUl0ZW0gTmFtZT0iQ2YiICBBbGlhcz0i5bKp55+z5Y6L57yp57O75pWwIiAgIFVuaXQ9IjEvTVBhIiBEZWZhdWx0PSIwLjAwMDEiIE1heD0iMTAiICAgIE1pbj0iMWUtMzAiICBEaWdpdD0iMTAiIFNjaWVudGlmaWM9IjEiIERlc2M9InJvY2sgY29tcHJlc3NpYmlsaXR5IiAvPg0KICAgIDxQYXJhSXRlbSBOYW1lPSJTb2kiIEFsaWFzPSLliJ3lp4vlkKvmsrnppbHlkozluqYiIFVuaXQ9IiIgICAgICBEZWZhdWx0PSIwLjgiICAgTWF4PSIxIiAgICAgIE1pbj0iMCIgICAgICBEaWdpdD0iNiIgIERlc2M9ImluaXRpYWwgb2lsIHNhdHVyYXRpb24iIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9IlN3aSIgQWxpYXM9IuWIneWni+WQq+awtOmlseWSjOW6piIgVW5pdD0iIiAgICAgIERlZmF1bHQ9IjAuMiIgICBNYXg9IjEiICAgICAgTWluPSIwIiAgICAgIERpZ2l0PSI2IiAgRGVzYz0iaW5pdGlhbCB3YXRlciBzYXR1cmF0aW9uIiAvPg0KICA8L1BhcmFHcm91cD4NCg0KPC9Sb290Pg0K
\ No newline at end of file
+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
\ No newline at end of file
diff --git a/Bin/Config/Common/ModelParaDefinesNM_en.dat b/Bin/Config/Common/ModelParaDefinesNM_en.dat
index 0cf9301..dfcee32 100644
--- a/Bin/Config/Common/ModelParaDefinesNM_en.dat
+++ b/Bin/Config/Common/ModelParaDefinesNM_en.dat
@@ -1 +1 @@
-77u/PD94bWwgcup_mpadmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCg0KPCEtLSoqKioqKioqKiwzyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotLT4NCjwhLS0gICAgVGhpcyBmaWxlIGRlZmluZXMgcGFyYW1ldGVycyBmb3IgdGhlIFdUQUkgTnVtZXJpY2FsIChOTSkgICAgLS0+DQo8IS0tICAgIG1vZHVsZS4gT25seSBQRUJJIHNvbHZlciByZXNlcnZvaXIgcGFyYW1ldGVycyBhcmUgaW5jbHVkZWQuICAtLT4NCjwhLS0gICAgQXV0aG9yKHMpOiBhdXRvLWdlbmVyYXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPg0KPCEtLSAgICBEYXRlOiAyMDI2MDYxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+DQo8IS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi0tPg0KDQo8IS0tDQogICAgUGFyYW1ldGVyIHNjb3BlOiBoLCBQaSwgSywgcGhpLCBDdGksIENmLCBTb2ksIFN3aQ0KICAgIENvcnJlc3BvbmRzIHRvIEhYX05XVE1fTU9ERUxfSU5QVVQ6OkJhc2Ugc3RydWN0IGZpZWxkcw0KICAgIExvYWRlZCB2aWEgX3BhcmFIZWxwZXItPmxvYWRQYXJhRGVmaW5lcygpLCBzS2V5ID0gc19ObV9TZXJpZQ0KLS0+DQoNCjxSb290Pg0KDQogIDxQYXJhR3JvdXAgTmFtZT0iIiBBbGlhcz0iUmVzZXJ2b2lyIFBhcmFtZXRlcnMiPg0KICAgIDxQYXJhSXRlbSBOYW1lPSJoIiAgIEFsaWFzPSJSZXNlcnZvaXIgVGhpY2tuZXNzIiAgICAgICAgIFVuaXQ9Im0iICAgICBEZWZhdWx0PSIxMCIgICAgTWF4PSIxMDAwMCIgIE1pbj0iMWUtMDUiICBEaWdpdD0iMyIgIERlc2M9InJlc2Vydm9pciB0aGlja25lc3MiIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9IlBpIiAgQWxpYXM9IkluaXRpYWwgUHJlc3N1cmUiICAgICAgICAgICAgVW5pdD0iTVBhIiAgIERlZmF1bHQ9IjQwIiAgICBNYXg9IjUwMCIgICAgTWluPSIwLjEiICAgIERpZ2l0PSI1IiAgRGVzYz0iaW5pdGlhbCBmb3JtYXRpb24gcHJlc3N1cmUiIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9IksiICAgQWxpYXM9IlBlcm1lYWJpbGl0eSIgICAgICAgICAgICAgICAgVW5pdD0ibUQiICAgIERlZmF1bHQ9IjEiICAgICBNYXg9IjEwMDAwIiAgTWluPSIwIiAgICAgIERpZ2l0PSI2IiAgRGVzYz0icGVybWVhYmlsaXR5IiAvPg0KICAgIDxQYXJhSXRlbSBOYW1lPSJwaGkiIEFsaWFzPSJQb3Jvc2l0eSIgICAgICAgICAgICAgICAgICAgIFVuaXQ9IiIgICAgICBEZWZhdWx0PSIwLjEiICAgTWF4PSIxIiAgICAgIE1pbj0iMWUtMDUiICBEaWdpdD0iNCIgIERlc2M9InBvcm9zaXR5IiAvPg0KICAgIDxQYXJhSXRlbSBOYW1lPSJDdGkiIEFsaWFzPSJUb3RhbCBDb21wcmVzc2liaWxpdHkiICAgICAgIFVuaXQ9IjEvTVBhIiBEZWZhdWx0PSIwLjAwMSIgTWF4PSIxMCIgICAgIE1pbj0iMWUtMzAiICBEaWdpdD0iMTAiIFNjaWVudGlmaWM9IjEiIERlc2M9InRvdGFsIGNvbXByZXNzaWJpbGl0eSIgLz4NCiAgICA8UGFyYUl0ZW0gTmFtZT0iQ2YiICBBbGlhcz0iUm9jayBDb21wcmVzc2liaWxpdHkiICAgICAgICBVbml0PSIxL01QYSIgRGVmYXVsdD0iMC4wMDAxIiBNYXg9IjEwIiAgICBNaW49IjFlLTMwIiAgRGlnaXQ9IjEwIiBTY2llbnRpZmljPSIxIiBEZXNjPSJyb2NrIGNvbXByZXNzaWJpbGl0eSIgLz4NCiAgICA8UGFyYUl0ZW0gTmFtZT0iU29pIiBBbGlhcz0iSW5pdGlhbCBPaWwgU2F0dXJhdGlvbiIgICAgICBVbml0PSIiICAgICAgRGVmYXVsdD0iMC44IiAgIE1heD0iMSIgICAgICBNaW49IjAiICAgICAgRGlnaXQ9IjYiICBEZXNjPSJpbml0aWFsIG9pbCBzYXR1cmF0aW9uIiAvPg0KICAgIDxQYXJhSXRlbSBOYW1lPSJTd2kiIEFsaWFzPSJJbml0aWFsIFdhdGVyIFNhdHVyYXRpb24iICAgIFVuaXQ9IiIgICAgICBEZWZhdWx0PSIwLjIiICAgTWF4PSIxIiAgICAgIE1pbj0iMCIgICAgICBEaWdpdD0iNiIgIERlc2M9ImluaXRpYWwgd2F0ZXIgc2F0dXJhdGlvbiIgLz4NCiAgPC9QYXJhR3JvdXA+DQoNCjwvUm9vdD4NCg==
\ No newline at end of file
+77u/PD94bWwgcup_mpadmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCg0KPCEtLSoqKioqKioqKiwzyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotLT4NCjwhLS0gICAgVGhpcyBmaWxlIGRlZmluZXMgcGFyYW1ldGVycyBmb3IgdGhlIFdUQUkgTnVtZXJpY2FsIChOTSkgICAgLS0+DQo8IS0tICAgIG1vZHVsZS4gT25seSBQRUJJIHNvbHZlciByZXNlcnZvaXIgcGFyYW1ldGVycyBhcmUgaW5jbHVkZWQuICAtLT4NCjwhLS0gICAgRGF0ZTogMjAyNjA2MTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPg0KPCEtLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotLT4NCg0KPCEtLQ0KICAgIFBhcmFtZXRlciBzY29wZTogaCwgUGksIEssIHBoaSwgQ3RpLCBDZiwgU29pLCBTd2kNCiAgICBDb3JyZXNwb25kcyB0byBIWF9OV1RNX01PREVMX0lOUFVUOjpCYXNlIHN0cnVjdCBmaWVsZHMNCiAgICBMb2FkZWQgdmlhIF9wYXJhSGVscGVyLT5sb2FkUGFyYURlZmluZXMoKSwgc0tleSA9IHNfTm1fU2VyaWUNCi0tPg0KDQo8Um9vdD4NCg0KICA8UGFyYUdyb3VwIE5hbWU9IiIgQWxpYXM9IlJlc2Vydm9pciBQYXJhbWV0ZXJzIj4NCiAgICA8UGFyYUl0ZW0gTmFtZT0iaCIgICBBbGlhcz0iUmVzZXJ2b2lyIFRoaWNrbmVzcyIgICAgICAgICBVbml0PSJtIiAgICAgRGVmYXVsdD0iMTAiICAgIE1heD0iMTAwMDAiICBNaW49IjFlLTA1IiAgRGlnaXQ9IjMiICBEZXNjPSJyZXNlcnZvaXIgdGhpY2tuZXNzIiAvPg0KICAgIDxQYXJhSXRlbSBOYW1lPSJQaSIgIEFsaWFzPSJJbml0aWFsIFByZXNzdXJlIiAgICAgICAgICAgIFVuaXQ9Ik1QYSIgICBEZWZhdWx0PSI0MCIgICAgTWF4PSI1MDAiICAgIE1pbj0iMC4xIiAgICBEaWdpdD0iNSIgIERlc2M9ImluaXRpYWwgZm9ybWF0aW9uIHByZXNzdXJlIiAvPg0KICAgIDxQYXJhSXRlbSBOYW1lPSJLIiAgIEFsaWFzPSJQZXJtZWFiaWxpdHkiICAgICAgICAgICAgICAgIFVuaXQ9Im1EIiAgICBEZWZhdWx0PSIxIiAgICAgTWF4PSIxMDAwMCIgIE1pbj0iMCIgICAgICBEaWdpdD0iNiIgIERlc2M9InBlcm1lYWJpbGl0eSIgLz4NCiAgICA8UGFyYUl0ZW0gTmFtZT0icGhpIiBBbGlhcz0iUG9yb3NpdHkiICAgICAgICAgICAgICAgICAgICBVbml0PSIiICAgICAgRGVmYXVsdD0iMC4xIiAgIE1heD0iMSIgICAgICBNaW49IjFlLTA1IiAgRGlnaXQ9IjQiICBEZXNjPSJwb3Jvc2l0eSIgLz4NCiAgICA8UGFyYUl0ZW0gTmFtZT0iQ3RpIiBBbGlhcz0iVG90YWwgQ29tcHJlc3NpYmlsaXR5IiAgICAgICBVbml0PSIxL01QYSIgRGVmYXVsdD0iMC4wMDEiIE1heD0iMTAiICAgICBNaW49IjFlLTMwIiAgRGlnaXQ9IjEwIiBTY2llbnRpZmljPSIxIiBEZXNjPSJ0b3RhbCBjb21wcmVzc2liaWxpdHkiIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9IkNmIiAgQWxpYXM9IlJvY2sgQ29tcHJlc3NpYmlsaXR5IiAgICAgICAgVW5pdD0iMS9NUGEiIERlZmF1bHQ9IjAuMDAwMSIgTWF4PSIxMCIgICAgTWluPSIxZS0zMCIgIERpZ2l0PSIxMCIgU2NpZW50aWZpYz0iMSIgRGVzYz0icm9jayBjb21wcmVzc2liaWxpdHkiIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9IlNvaSIgQWxpYXM9IkluaXRpYWwgT2lsIFNhdHVyYXRpb24iICAgICAgVW5pdD0iIiAgICAgIERlZmF1bHQ9IjAuOCIgICBNYXg9IjEiICAgICAgTWluPSIwIiAgICAgIERpZ2l0PSI2IiAgRGVzYz0iaW5pdGlhbCBvaWwgc2F0dXJhdGlvbiIgLz4NCiAgICA8UGFyYUl0ZW0gTmFtZT0iU3dpIiBBbGlhcz0iSW5pdGlhbCBXYXRlciBTYXR1cmF0aW9uIiAgICBVbml0PSIiICAgICAgRGVmYXVsdD0iMC4yIiAgIE1heD0iMSIgICAgICBNaW49IjAiICAgICAgRGlnaXQ9IjYiICBEZXNjPSJpbml0aWFsIHdhdGVyIHNhdHVyYXRpb24iIC8+DQogIDwvUGFyYUdyb3VwPg0KDQogIDxQYXJhR3JvdXAgTmFtZT0iIiBBbGlhcz0iV2VsbCBQYXJhbWV0ZXJzIj4NCiAgICA8UGFyYUl0ZW0gTmFtZT0iV19YIiAgICBBbGlhcz0iWCBDb29yZGluYXRlIiAgICAgICAgICAgIFVuaXQ9Im0iICAgICAgRGVmYXVsdD0iMCIgICAgIE1heD0iMTAwMDAiICBNaW49Ii0xMDAwMCIgRGlnaXQ9IjYiICBEZXNjPSJ3ZWxsIFggY29vcmRpbmF0ZSIgLz4NCiAgICA8UGFyYUl0ZW0gTmFtZT0iV19ZIiAgICBBbGlhcz0iWSBDb29yZGluYXRlIiAgICAgICAgICAgIFVuaXQ9Im0iICAgICAgRGVmYXVsdD0iMCIgICAgIE1heD0iMTAwMDAiICBNaW49Ii0xMDAwMCIgRGlnaXQ9IjYiICBEZXNjPSJ3ZWxsIFkgY29vcmRpbmF0ZSIgLz4NCiAgICA8UGFyYUl0ZW0gTmFtZT0iV19SdyIgICBBbGlhcz0iV2VsbGJvcmUgUmFkaXVzIiAgICAgICAgIFVuaXQ9Im0iICAgICAgRGVmYXVsdD0iMC4xIiAgIE1heD0iMTAiICAgICBNaW49IjAuMDAxIiAgRGlnaXQ9IjYiICBEZXNjPSJ3ZWxsYm9yZSByYWRpdXMiIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9IldfU2tpbiIgQWxpYXM9IlNraW4gRmFjdG9yIiAgICAgICAgICAgICBVbml0PSIiICAgICAgIERlZmF1bHQ9IjAiICAgICBNYXg9IjEwMDAiICAgTWluPSItMTAwIiAgIERpZ2l0PSI2IiAgRGVzYz0ic2tpbiBmYWN0b3IiIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9IldfQyIgICAgQWxpYXM9IldlbGxib3JlIFN0b3JhZ2UgQ29lZmYiICBVbml0PSJtMy9NUGEiIERlZmF1bHQ9IjAiICAgICBNYXg9IjEwMDAiICAgTWluPSIwIiAgICAgIERpZ2l0PSI2IiAgRGVzYz0id2VsbGJvcmUgc3RvcmFnZSBjb2VmZmljaWVudCIgLz4NCiAgPC9QYXJhR3JvdXA+DQoNCjwvUm9vdD4NCg==
\ No newline at end of file
diff --git a/Bin/XmlFiles/ModelParaDefinesNM_cn.xml b/Bin/XmlFiles/ModelParaDefinesNM_cn.xml
index bcfbe42..814d67f 100644
--- a/Bin/XmlFiles/ModelParaDefinesNM_cn.xml
+++ b/Bin/XmlFiles/ModelParaDefinesNM_cn.xml
@@ -25,4 +25,12 @@
+
+
+
+
+
+
+
+
diff --git a/Bin/XmlFiles/ModelParaDefinesNM_en.xml b/Bin/XmlFiles/ModelParaDefinesNM_en.xml
index 8cf0f55..c3ab67d 100644
--- a/Bin/XmlFiles/ModelParaDefinesNM_en.xml
+++ b/Bin/XmlFiles/ModelParaDefinesNM_en.xml
@@ -25,4 +25,12 @@
+
+
+
+
+
+
+
+
diff --git a/Include/nmNum/nmGUI/nmGridRowUtils.h b/Include/nmNum/nmGUI/nmGridRowUtils.h
index e516a7d..47f2d54 100644
--- a/Include/nmNum/nmGUI/nmGridRowUtils.h
+++ b/Include/nmNum/nmGUI/nmGridRowUtils.h
@@ -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 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& mapWellParas);
+
+ /// @brief 为每口井创建 Group 分组并填充参数项
+ /// @param mapWellParas 井ID → 参数列表(已剥掉前缀)
+ /// @param bDnMode 是否为设计模式
+ void buildWellGroups(QMap& 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 m_mapWellNames;
+
private slots:
/// @brief 参数值改变后的回调(iGridRowItem::sigValueChanged 触发)
diff --git a/Include/nmNum/nmSubWxs/nmWxParaPropertyPebi.h b/Include/nmNum/nmSubWxs/nmWxParaPropertyPebi.h
index 51719a3..c781a5e 100644
--- a/Include/nmNum/nmSubWxs/nmWxParaPropertyPebi.h
+++ b/Include/nmNum/nmSubWxs/nmWxParaPropertyPebi.h
@@ -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 mapWellNames = QMap());
// 允许备份/恢复原有的参数内容
virtual void backupOldParas(QMap& map,
diff --git a/Src/nmNum/nmGUI/nmGridRowUtils.cpp b/Src/nmNum/nmGUI/nmGridRowUtils.cpp
index deb34e8..900ed15 100644
--- a/Src/nmNum/nmGUI/nmGridRowUtils.cpp
+++ b/Src/nmNum/nmGUI/nmGridRowUtils.cpp
@@ -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 map)
+{
+ m_mapWellNames = map;
+}
+
bool nmGridRowUtils::buildRowUtils(QStringList listParas,
bool bDnMode,
QWidget* pWxDlg)
{
- // 当前直接转发至基类,后续可在此拦截参数列表或做前置/后置处理
- return iGridRowUtils::buildRowUtils(listParas, bDnMode, pWxDlg);
+ // 分离储层参数和井参数
+ QStringList listRes;
+ QMap 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& 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& mapWellParas,
+ bool bDnMode)
+{
+ bool bProperOrder = true;
+
+ // 按井ID排序遍历
+ QList 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);
+ }
+}
+
// ================================================================
// 槽函数
// ================================================================
diff --git a/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp b/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp
index 3254626..6a3b7be 100644
--- a/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp
+++ b/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp
@@ -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 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 mapWellNames;
+ mapWellNames[0] = tr("Well-1");
+ mapWellNames[1] = tr("Well-2");
+
+ pParaWx->refreshUIs(listParas, true, mapWellNames);
nmAttrRegistry* pReg = pDataManager->getAttrRegistry();
if (pReg != nullptr)
diff --git a/Src/nmNum/nmSubWxs/nmWxParaPropertyPebi.cpp b/Src/nmNum/nmSubWxs/nmWxParaPropertyPebi.cpp
index 72ceed0..e4d97fe 100644
--- a/Src/nmNum/nmSubWxs/nmWxParaPropertyPebi.cpp
+++ b/Src/nmNum/nmSubWxs/nmWxParaPropertyPebi.cpp
@@ -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 mapWellNames /*= QMap()*/)
{
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);
// 恢复原有的参数内容