Эх сурвалжийг харах

Merge branch 'master' of http://adicom-hxx.natapp1.cc/CQ_ADI/airoptweb

lichunyang 6 сар өмнө
parent
commit
d2fe6c735b

+ 5 - 3
src/style/index.css

@@ -194,6 +194,7 @@ body{
 }
 .el-form-item__label{
   color: #333333;
+  padding: 0;
     font-size: 14px;
     line-height: 30px;
 letter-spacing: 1px;
@@ -314,7 +315,7 @@ position: relative;
   }
   .btncolor{
     background-color: #F5FAFF !important;
-    width: 150px !important;
+    /* width: 150px !important; */
   }
   .left_main_content{
     width: 195px;
@@ -734,9 +735,10 @@ height: 30px;
   border-bottom: 2px solid #FFD153 !important;
 }
 
-.el-card__body {
+.el-card {
   border-radius: 0px 0px 0px 0px;
-  border: 1px solid #B3B3B3;
+  border: 1px solid #B3B3B3 !important;
+  overflow: auto;
 }
 
 .dialog_style {

+ 14 - 14
src/views/components/fileuploads.vue

@@ -120,22 +120,22 @@ const initWebUploader = () => {
     console.log('fileName.value',fileName.value)
      emit('update-fileName', fileName.value)
      // 文件上传类型
-    const fax = fileName.value.split(".")[1]
-    if (props.accept.indexOf(fax) < 0) {
-      //判断上传支持文件类型
-      uploader.value.reset()
-      ElMessage.error("只支持" + props.accept + "格式文件!")
-      return
-    }
+      const ext = fileName.value.split('.').pop().toLowerCase();  // 获取扩展名
+      const acceptList = props.accept.split(',').map(e => e.trim().toLowerCase());
+      if (!acceptList.includes('.' + ext)) {
+      uploader.value.reset();
+      ElMessage.error(`只支持 ${props.accept} 格式文件!`);
+      return;
+      }
     uploader.value
       .md5File(file)
       .progress((percentage) => {
         //显示加密进度
         console.log("Percentage:", percentage)
       })
-      .then((md5) => {
+      .then((hash) => {
         // 完成
-        md5.value = md5
+        md5.value = hash
       })
     if (files.value.length > 0) {
       uploader.value.removeFile(files.value[0].id)
@@ -176,7 +176,7 @@ const initWebUploader = () => {
   uploader.value.on("uploadProgress", (file, percentage) => {
     let prage = Math.floor(percentage * 100)
     files.value.forEach((fileObj) => {
-      if ((fileObj.id = file.id)) {
+      if ((fileObj.id === file.id)) {
         fileObj.msg = "上传中"
         emit('upload-status', "上传中")
         }
@@ -246,10 +246,10 @@ const initWebUploader = () => {
   })
 }
 const uploaderClear = () => {
-  uploader.value.reset()
-  percentage.value = 0
-  files.value = []
-}
+  uploader.value.reset();
+  files.value = [];
+  files.value.forEach(file => file.percentage = 0);
+};
 const fileDel = (fileId) => {
   console.log(fileId)
   getUUID()

+ 112 - 68
src/views/home.vue

@@ -1154,7 +1154,7 @@
                 <!-- 单独的代理优化器 -->
           <el-dialog v-model="dialog.dboptimizer" align-center :modal="false" :close-on-click-modal="false"
             :append-to-body="true" draggable :fullscreen="false" :modal-append-to-body="false" modal-class="summary-dlg"
-            :before-close="handleClose" width="430" class="dialog_class bgcolor tianjia sel colortext">
+            :before-close="handleClose" width="530" class="dialog_class bgcolor tianjia sel colortext">
 
             <template #header="{ titleId, titleClass }">
               <div class="my-header ">
@@ -1418,19 +1418,19 @@
                               </el-table-column>
                               <el-table-column prop="upper" label="上限值">
                                 <template #default="{ row }">
-                                  <el-input type="text" v-model.Number="row.upper" oninput="value=value.replace(/[^0-9.-]/g, '').replace(/(\..*?)\..*/g, '$1').replace(/^-(?=\.)/, '')"
+                                  <el-input type="text" v-model="row.upper" 
                                     @change="handleEdit(row)" />
                                 </template>
                               </el-table-column>
                               <el-table-column prop="lower" label="下限值">
                                 <template #default="{ row }">
-                                  <el-input v-model.Number="row.lower" oninput="value=value.replace(/[^0-9.-]/g, '').replace(/(\..*?)\..*/g, '$1').replace(/^-(?=\.)/, '')"
+                                  <el-input v-model="row.lower"  
                                     @change="handleEdit(row)" />
                                 </template>
                               </el-table-column>
                               <el-table-column prop="reference" label="基准值" >
                                 <template #default="{ row }">
-                                  <el-input v-model.Number="row.reference" oninput="value=value.replace(/[^0-9.]/g, '').replace(/(\..*?)\..*/g, '$1')"
+                                  <el-input v-model="row.reference" 
                                     @change="handleEdit(row)" />
                                 </template>
                               </el-table-column>
@@ -1469,21 +1469,19 @@
                               </el-table-column> -->
                               <el-table-column prop="reference" label="约束基准值">
                                 <template #default="{ row }">
-                                  <el-input v-model.Number="row.reference" oninput="value=value.replace(/[^0-9.]/g, '').replace(/(\..*?)\..*/g, '$1')"
+                                  <el-input v-model="row.reference" 
                                     @change="handleEdit(row)" />
                                 </template>
                               </el-table-column>
                               <el-table-column prop="upper" label="上限值">
                                 <template #default="{ row }">
-                                  <el-input v-model.Number="row.upper" 
-                                    
-                                  oninput="value=value.replace(/[^0-9.-]/g, '').replace(/(\..*?)\..*/g, '$1').replace(/^-(?=\.)/, '')"
+                                  <el-input v-model="row.upper" 
                                     @change="handleEdit(row)" />
                                 </template>
                               </el-table-column>
                               <el-table-column prop="lower" label="下限值">
                                 <template #default="{ row }">
-                                  <el-input v-model.Number="row.lower" oninput="value=value.replace(/[^0-9.-]/g, '').replace(/(\..*?)\..*/g, '$1').replace(/^-(?=\.)/, '')"
+                                  <el-input v-model="row.lower"
                                     @change="handleEdit(row)" />
                                 </template>
                               </el-table-column>
@@ -1499,24 +1497,7 @@
                           <div class="eloptimize classtable" v-if="activeIndex2 == 2">
                             <el-table :data="eloptimize" border style="width: 100%" height="100">
                               <el-table-column type="index" label="编号" width="70" />
-                              <!-- <el-table-column prop="qi" label="启用" width="70">
-                  <template v-slot="scope">
-                    <el-checkbox :label="false" v-model="scope.row.qi" />
-                  </template>
-                </el-table-column> -->
-                              <!-- <el-table-column prop="data" label="目标类型" width="120">
-                  <template v-slot="scope">
-                    <el-select v-model="scope.row.device"  class="no-border " :suffix-icon="CaretBottom"  placeholder="请选择">
-                          <el-option
-                            v-for="item in options"
-                            :key="item.value"
-                            :label="item.label"
-                            :value="item.value">
-                          </el-option>
-                        </el-select>
-
-                  </template>
-            </el-table-column> -->
+                              
                               <el-table-column prop="name" label="目标名称">
                                 <template #default="{ row }">
                                   <el-input v-model="row.name" />
@@ -1535,7 +1516,7 @@
                               </el-table-column>
                               <el-table-column prop="weight" label="权重系数">
                                 <template #default="{ row }">
-                                  <el-input v-model.Number="row.weight" oninput="value=value.replace(/[^0-9.]/g, '').replace(/(\..*?)\..*/g, '$1')"
+                                  <el-input v-model="row.weight" 
                                     @change="handleEdit(row)" />
                                 </template>
                               </el-table-column>
@@ -1553,7 +1534,7 @@
                               </el-table-column> -->
                               <el-table-column prop="reference" label="约束基准值">
                                 <template #default="{ row }">
-                                  <el-input v-model.Number="row.reference" oninput="value=value.replace(/[^0-9.]/g, '').replace(/(\..*?)\..*/g, '$1')"
+                                  <el-input v-model="row.reference" 
                                     @change="handleEdit(row)" />
                                 </template>
                               </el-table-column>
@@ -1575,13 +1556,14 @@
                         <div class="dibu">
                           <div class="footer-add">
                             <div class="sev_ruwu">
-                              <div class="disflex ">
-                                <el-form-item label="新增变量数:">
+                              <div class="disflex flexend">
+                                <el-form-item label="新增变量数:" v-if="activeIndex2 === 0">
                                   <el-input v-model="tableval" maxlength="18"
                                     oninput="value=value.replace(/[^\a-\z\A-\Z0-9\u4E00-\u9FA5]/g,'')" class="w-50 m-2"
-                                     /> </el-form-item>
-                                <el-button class="btncolor">导入</el-button>
-                                <el-button class="btncolor" @click="onAddItem">新增</el-button>
+                                  /> 
+                                </el-form-item>
+                                <el-button class="btncolor" v-if="activeIndex2 === 0">导入</el-button>
+                                <el-button class="btncolor" @click="onAddItem">新建</el-button>
                                 <el-button class="btncolor" @click="onokItem">确认</el-button>
                               </div>
                             </div>
@@ -1922,8 +1904,8 @@ const datatree = ref([
 
 ])
 let options1 = ref([
-  { label: '最大化', value: -1 },
-  { label: '最小化', value: 1 },
+  { label: '最大化', value: "-1" },
+  { label: '最小化', value: "1" },
 ])
 let options2 = ref([
   { label: '升力系数', value: '升力系数' },
@@ -2279,6 +2261,25 @@ const handleClick = (tab, event) => {
     echartzongshow.value = false;
   }
 }
+
+const validateInput = (row)  => {
+    // 允许输入 None / none / 负数 / 小数
+    if (/^(none|None|-?\d*\.?\d*)$/.test(row.upper)) {
+      row.upper = row.upper; // 允许输入
+    } else {
+      row.upper = row.upper.slice(0, -1); // 删除最后输入的非法字符
+    }
+}
+
+const validateInput1 = (row)  => {
+    // 允许输入 None / none  / 小数
+    if (/^(none|None|\d*\.?\d*)$/.test(row.upper)) {
+      row.upper = row.upper; // 允许输入
+    } else {
+      row.upper = row.upper.slice(0, -1); // 删除最后输入的非法字符
+    }
+}
+
 //表格点击事件
 const handleEdit = (row) => {
   // console.log('编辑后的数据:', row);
@@ -3012,10 +3013,11 @@ const getissue = () => {
       }
         })
         res.rows = res.rows.map((item, index) => {
-          item.lower = Number(item.lower); // 将属性转换为数字
-          item.upper = Number(item.upper);
-          item.reference = Number(item.reference);
-          
+          item.lower = item.lower ?? 'none'
+          item.upper = item.upper ?? 'none'
+          item.reference = item.reference ?? 'none'
+          item.name = item.name ?? 'none'
+          item.remark = item.remark ?? 'none'
 
           treeitem.value = {
             id: "1-1-1-" + index,
@@ -3070,10 +3072,10 @@ const getyueshu = () => {
         let childernarr = Sidebarref.value.datatree[0].children[0].children;
         res.rows = res.rows.map((item, index) => {
           // 确保转换为数字
-          item.con = Number(item.con);
-          item.reference = Number(item.reference);
-          item.upper = Number(item.upper); // 添加对 upper 的处理
-          item.lower = Number(item.lower); // 添加对 lower 的处理
+          item.con = item.con ?? 'none';
+          item.reference = item.reference ?? 'none';
+          item.upper =item.upper ?? 'none';
+          item.lower = item.lower ?? 'none'; 
           console.log('item:', item);
 
           treeitem2.value = {
@@ -3127,12 +3129,13 @@ const getmub = () => {
         })
  let   childernarr=Sidebarref.value.datatree[0].children[0].children
         res.rows = res.rows.map((item, index) => {
-          item.optdir = Number(item.optdir); // 将id属性转换为数字
-          item.weight = Number(item.weight);
-          item.scaling = Number(item.scaling);
-          item.factor = Number(item.factor);
-          item.reference = Number(item.reference);
-          item.remark = item.remark;
+          item.optdir = item.optdir ?? 'none'; 
+          item.weight = item.weight ?? 'none';
+          item.scaling = item.scaling ?? 'none';
+          item.factor = item.factor ?? 'none';
+          item.reference = item.reference ?? 'none';
+          item.remark = item.remark ?? 'none';
+          item.name = item.name ?? 'none';
 
           treeitem3.value = {
             id: "1-3-3-" + index,
@@ -3191,15 +3194,50 @@ const getarr = (name, arrays) => {
 const convertToStringArray = (result, Data) => {
   console.log('Data:', Data);
   result = Data.map(row => {
-    // 获取每一列的数据,排除带有 'id' 的字段
-    return Object.keys(row)
-      .filter(key => !key.includes('id'))  // 过滤掉包含 'id' 的字段
-      .map(key => {
-        const value = row[key];
-        return (value === null || value === undefined || value === '') ? ' ' : value; // 处理 null、undefined 和空字符串
-      })
-      .join(',');  // 将每个字段的值用逗号连接
-  }).join(';');
+    
+    const vid = row.vid || ' ';
+    const name = row.name || ' ';
+    const upper = row.upper ?? ' ';
+    const lower = row.lower ?? ' ';
+    const reference = row.reference ?? ' ';
+    const remark = row.remark || ' ';
+
+    // 将字段连接为一个以逗号分隔的字符串
+    return `${vid},${name},${upper},${lower},${reference},${remark}`;
+  }).join(';');  // 每行之间用分号分隔
+  return result;
+}
+
+const convertToStringArray1 = (result, Data) => {
+  console.log('Data:', Data);
+  result = Data.map(row => {
+    
+    const conid = row.conid || ' ';
+    const name = row.name || ' ';
+    const upper = row.upper ?? ' ';
+    const lower = row.lower ?? ' ';
+    const reference = row.reference ?? ' ';
+
+    // 将字段连接为一个以逗号分隔的字符串
+    return `${conid},${name},${reference},${upper},${lower}`;
+  }).join(';');  // 每行之间用分号分隔
+  return result;
+}
+
+const convertToStringArray2 = (result, Data) => {
+  console.log('Data:', Data);
+  result = Data.map(row => {
+    
+    const fid = row.fid || ' ';
+    const name = row.name || ' ';
+    const optdir = row.optdir ?? ' ';
+    const weight = row.weight ?? ' ';
+    const reference = row.reference ?? ' ';
+    const remark = row.remark || ' ';
+
+    // 将字段连接为一个以逗号分隔的字符串
+    return `${fid},${name},${optdir},${weight},${reference},${remark}`;
+  }).join(';');  // 每行之间用分号分隔
   return result;
 }
 
@@ -3215,13 +3253,13 @@ const onokItem = () => {
   } else if (activeIndex2.value == 1) {
     conlist.value = '';
     console.log("tabledata:",tableData.value)
-    conlist.value = convertToStringArray(conlist.value, tableData.value)
+    conlist.value = convertToStringArray1(conlist.value, tableData.value)
     restrain();
 
   } else if (activeIndex2.value == 2) {
     funlist.value = '';
     console.log("eloptimize:",eloptimize.value)
-    funlist.value = convertToStringArray(funlist.value, eloptimize.value)
+    funlist.value = convertToStringArray2(funlist.value, eloptimize.value)
     funlistaa();
 
   }
@@ -3230,9 +3268,9 @@ const onokItem = () => {
 //设计变量的添加
 const devise = () => {
   const params = {
-    transCode: 'MDO0008',
+    transCode: 'MDO0054',
     pid: pid.value,
-    varlist: svarlist.value
+    vartr: svarlist.value
   }
   request(params)
     .then((res) => {
@@ -3249,9 +3287,9 @@ const devise = () => {
 //约束的添加restrain
 const restrain = () => {
   const params = {
-    transCode: 'MDO0009',
+    transCode: 'MDO0055',
     pid: pid.value,
-    conlist: conlist.value
+    vartr: conlist.value
   }
   request(params)
     .then((res) => {
@@ -3268,9 +3306,9 @@ const restrain = () => {
 //优化目标接口
 const funlistaa = () => {
   const params = {
-    transCode: 'MDO0010',
+    transCode: 'MDO0056',
     pid: pid.value,
-    funlist: funlist.value
+    vartr: funlist.value
   }
   request(params)
     .then((res) => {
@@ -4102,7 +4140,12 @@ color: #2267B1;
 }
 
 .footer-add {
-  width: 530px;
+  width: 600px;
+}
+
+.flexend {
+  display: flex;
+  justify-content: flex-end;
 }
 
 .dibu {
@@ -4126,6 +4169,7 @@ color: #2267B1;
 .dibu .btncolor {
   margin-top: 2px;
   height: 27px;
+  width: 70px;
   background: #FFFFFF;
   box-shadow: 0px 2px 2px 0px #B3B3B3;
   border-radius: 0px 0px 0px 0px;

+ 16 - 2
src/views/titlecomponent/ADflow.vue

@@ -38,7 +38,7 @@
                 :projectId="124" 
                 solverType="exampleSolver" 
                 accept=".cgns"
-                upId="uniqueId1" 
+                upId="adflow" 
                 name="点击选择文件"
                 :imgSrc="meshFileImgSrc"
                 @upload-success="handleFileUploadSuccess"
@@ -350,6 +350,7 @@ import { ref, onMounted, reactive, provide, nextTick } from "vue"
 import { ElMessage, ElButton, ElDialog, ElSelect } from "element-plus"
 import { Edit, CaretBottom, Delete } from "@element-plus/icons-vue"
 import { request, uploadFile } from "@/utils/request"
+import emitter from "@/utils/emitter"
 import fileUploads from "../components/fileuploads.vue";
 import meshFile from "@/assets/img/meshFile.png";
 import inputParams from "@/assets/img/inputParams.png";
@@ -529,7 +530,9 @@ const getadflow = (id) => {
   request(params)
     .then((res) => {
       if (res.hasOwnProperty("adid")) {
-        getadflowAssign(res)
+        getadflowAssign(res);
+        console.log('adid flow:',adid.value)
+        emitter.emit("adidFromadflow", adid);
       }
     })
     .catch((err) => {
@@ -539,6 +542,7 @@ const getadflow = (id) => {
 
 const getadflowAssign = (data) => {
   pid.value = data.pid
+  adid.value = data.adid
   adflowvalue.value.gridfile = data.gridfile
   adflowvalue.value.fid = data.fid
   adflowvalue.value.proname = data.proname
@@ -636,6 +640,16 @@ const getUploadStatus = (newValue) => {
 const fileDel = () => {
 }
 
+onMounted(() => {
+  emitter.on("requestGetadid", getadflow); // 监听事件
+});
+
+onUnmounted(() => {
+  emitter.off("requestGetadid", getadflow); // 解绑事件
+});
+
+
+
 defineExpose({
   getadflow,
   getadflowAssign,

+ 33 - 40
src/views/titlecomponent/Doptimize.vue

@@ -20,8 +20,8 @@
                     </el-option>
                 </el-select>
                 </el-form-item>
-                <el-form-item label="代理模型:" :label-width="formLabelWidth200">
-                  <el-select v-model="youhua.surromod" :suffix-icon="CaretBottom" placeholder="请选择">
+                <el-form-item label="选择代理模型:" :label-width="formLabelWidth200">
+                  <el-select v-model="youhua.surromod" :suffix-icon="CaretBottom" placeholder="请选择" @change="handlesurromodChange">
                     <el-option v-for="item in daililist" :key="item.value" :label="item.label" :value="item.value">
                     </el-option>
                   </el-select>
@@ -40,9 +40,9 @@
               <el-form-item label="优化进程数:"  :label-width="formLabelWidth200">
                 <el-input v-model="youhua.proscount" :step="100" :min="0" :max="1000" controls-position="right" />
               </el-form-item>
-              <el-form-item label="屏幕输出等级:"  :label-width="formLabelWidth200">
+              <!-- <el-form-item label="屏幕输出等级:"  :label-width="formLabelWidth200">
                 <el-input v-model="youhua.iout" :step="100" :min="0" :max="1000" controls-position="right" />
-                </el-form-item>
+                </el-form-item> -->
               <!-- <el-form-item label="低可信度样本点数:"  :label-width="formLabelWidth200">
                   <div style="display: flex;">
                 <el-input type="text" style="margin-right: 10px;" v-model="youhua.nslf">
@@ -153,20 +153,20 @@ import { ElMessage, ElButton, ElDialog, ElSelect } from 'element-plus'
 import { Edit, CaretBottom } from '@element-plus/icons-vue'
 import { request } from "@/utils/request";
 let formLabelWidth3=ref(100)
-let formLabelWidth200=ref(200)
+let formLabelWidth200=ref(180)
 let youhua = ref({
   algorithm: 'SurroOpt',
   iout: 19,
   proscount:'1',
   irestart: '0',
-  ndoe: '拉丁超立方LHS',
+  ndoe: '0',
   ns: 10,
   nsmax: 100,
   nslf: 20,
   nsmaxlf: 200,
   nsmk: 10,
   nsmaxmk: 100,
-  xtol: -1e-8,
+  xtol: 1e-8,
   feasibilitytolreal: -1e-6,
   feasibilitytolsurro: -1e-6,
   surromod: 'Kriging',
@@ -176,10 +176,10 @@ let youhua = ref({
   dcmp: '0',
   paraopt: '1',
   regular: '0',
-  infill: 'EI+MSP',
+  infill: '0',
   nparallel: 1,
-  iopt: '当前最优+局部优化',
-  icstr: '概率相乘法',
+  iopt: '0',
+  icstr: '0',
   ipopsize: 50,
   maxgen: 100,
   pc: 0.9,
@@ -202,7 +202,8 @@ let tdlist = ref([
   {label:'蒙特卡洛MCD',value:'2'},
 ])
 
-let dlival=ref('Kriging')
+let nsurro = ref("310")
+let n_kriging = ref("1")
 let daililist = ref([
   { label: 'Kriging', value: 'Kriging' },
   { label: 'GEK', value: 'GEK' },
@@ -272,6 +273,25 @@ let daililist9= ref([
   { label: '概率相乘法', value: '0' },
 ])
 
+const handlesurromodChange = (val) => {
+  if(val === 'Kriging') {
+    nsurro.value ="310"
+    n_kriging.value = "1"
+  }else if(val === 'GEK'){
+    nsurro.value ="310"
+    n_kriging.value = "2"
+  }else if(val === 'Co-Kriging'){
+    nsurro.value ="410"
+    n_kriging.value = "1"
+  }else if(val === 'HK'){
+    nsurro.value ="4"
+    n_kriging.value = "12"
+  }else if(val === 'MHK'){
+    nsurro.value ="4"
+    n_kriging.value = "12"
+  }
+}
+
 const getDoptimize = (id) => {
   pid.value = id;
   const params = {
@@ -281,35 +301,6 @@ const getDoptimize = (id) => {
   request(params).then((res) => {
     console.log('chushihua')
     if (res.hasOwnProperty('suid')) {
-      // suid.value = res.suid;
-      // youhua.value.algorithm = res.algorithm;
-      // youhua.value.iout = res.iout;
-      // youhua.value.irestart = res.irestart;
-      // youhua.value.ndoe = res.ndoe;
-      // youhua.value.ns = res.ns;
-      // youhua.value.nsmax = res.nsmax;
-      // youhua.value.nslf = res.nslf;
-      // youhua.value.nsmaxlf = res.nsmaxlf;
-      // youhua.value.nsmk = res.nsmk;
-      // youhua.value.nsmaxmk = res.nsmaxmk;
-      // youhua.value.xtol = res.xtol;
-      // youhua.value.feasibilitytolreal = res.feasibilitytolreal;
-      // youhua.value.feasibilitytolsurro = res.feasibilitytolsurro;
-      // youhua.value.surromod = res.surromod;
-      // youhua.value.corr = res.corr;
-      // youhua.value.consttheta = res.consttheta;
-      // youhua.value.porder = res.porder;
-      // youhua.value.dcmp = res.dcmp;
-      // youhua.value.paraopt = res.paraopt;
-      // youhua.value.regular = res.regular;
-      // youhua.value.infill = res.infill;
-      // youhua.value.nparallel = res.nparallel;
-      // youhua.value.iopt = res.iopt;
-      // youhua.value.icstr = res.icstr;
-      // youhua.value.ipopsize = res.ipopsize;
-      // youhua.value.maxgen = res.maxgen;
-      // youhua.value.pc = res.pc;
-      // youhua.value.pm = res.pm;
 
       getDoptimizeAssign(res);
 
@@ -360,6 +351,8 @@ const getaddDsave = () => {
     transCode: 'MDO0032',
     pid: pid.value,
     suid: suid.value,
+    nsurro:nsurro.value,
+    n_kriging:n_kriging.value,
     algorithm: youhua.value.algorithm,
     iout: youhua.value.iout,
     irestart: youhua.value.irestart,

+ 1 - 1
src/views/titlecomponent/Toptimize.vue

@@ -94,7 +94,7 @@ const getToptimize = (id) => {
 }
 
 const getToptimizeAssign = (data) => {
-  pid.value = data.pid;
+  // pid.value = data.pid;
   grid.value = data.grid;
   youhua.value.algorithm = data.algorithm;
   youhua.value.majoriterationslimit = data.majoriterationslimit;

+ 14 - 1
src/views/titlecomponent/Xfoil.vue

@@ -160,6 +160,7 @@ import { ElMessage, ElButton, ElDialog, ElSelect } from "element-plus"
 import { Edit, CaretBottom } from "@element-plus/icons-vue"
 import { tr } from "element-plus/es/locale/index.mjs"
 import { request, uploadFile } from "@/utils/request"
+import emitter from "@/utils/emitter"
 import inputParams from "@/assets/img/inputParams.png"
 import configParams from "@/assets/img/configParams.png"
 import analysisParams from "@/assets/img/analysisParams.png"
@@ -326,6 +327,7 @@ const getxfoil = (id) => {
   request(params).then((res) => {
     if (res.hasOwnProperty("xfid")) {
       getxfoilAssign(res);
+      emitter.emit("xfidFromxfoil", xfid);
     }
   })
   .catch((err) => {
@@ -348,7 +350,7 @@ const getxfoilAssign = (data) => {
 }
 
 const getxfoilsave = () => {
-  console.log("pid:",pid.value);
+  // console.log("pid:",pid.value);
   const params = {
     transCode: "MDO0047",
     pid: pid.value,
@@ -373,6 +375,17 @@ const getxfoilsave = () => {
     })
 }
 
+
+onMounted(() => {
+  emitter.on("requestGetxfid", getxfoil); // 监听事件
+});
+
+onUnmounted(() => {
+  emitter.off("requestGetxfid", getxfoil); // 解绑事件
+});
+
+
+
 defineExpose({
   getxfoil,
   getxfoilAssign,

+ 1 - 1
src/views/titlecomponent/ffds.vue

@@ -13,7 +13,7 @@
           :projectId="123" 
           solverType="exampleSolver" 
           accept=".xyz" 
-          upId="uniqueId1" 
+          upId="ffds" 
           name="点击选择文件"
           :imgSrc="imageSrc"
           @upload-success="handleFileUploadSuccess"

+ 1 - 1
src/views/vuetree/eltree.vue

@@ -25,7 +25,7 @@ onMounted(() => {
   </div>
   <Handle  v-if="props.node.data.label!='模块化'"  type="source" :position="Position.Right"  />
   <Handle id="target-c" type="source" :position="Position.Top"  /> 
-   <Handle  v-if="props.node.data.label!='模块化'"  id="target-b" type="target"  :position="Position.Left" /> 
+  <Handle  v-if="props.node.data.label!='模块化'"  id="target-b" type="target"  :position="Position.Left" /> 
   <Handle id="target-d" type="target" :position="Position.Bottom"  /> 
   </div>
 <!-- </div> -->

+ 315 - 53
src/views/vuetree/index.vue

@@ -9,14 +9,6 @@
     <template  #node-default="props">
       <eltree :node="props" />
     </template>
-
-    <template #edge-default="props">
-      <custom-edge :sourceX="props.sourceX" 
-                  :sourceY="props.sourceY" 
-                  :targetX="props.targetX" 
-                  :targetY="props.targetY"
-                  :label="props.data.label" />
-    </template>
  
     <Background pattern-color="#aaa" :gap="16" />
 
@@ -97,30 +89,131 @@
         </div>
       </template>
       <div style="margin-top: 5px;padding: 10px 35px;">
-        <el-card>
+        <div v-if="datacontent === '1'">
+          <el-card :shadow="none" style="min-height: 240px; max-height: 480px;">
           <el-checkbox v-model="checkAll" 
           :indeterminate="isIndeterminate"
           @change="handlecheckAllchange">全选</el-checkbox>
           <div class="eldesign classtable">
-            <el-table :data="shujuliutable" border>
+            <el-table :data="youhuaFFDtable" border :show-header="false">
             <el-table-column
               type="index"
               label=""
-              :header-cell-style="{ display: 'none' }"
             ></el-table-column>
-            <el-table-column prop="flag" width="55">
+            <el-table-column prop="steamflag" width="55">
               <template #default="{ row }">
                 <el-checkbox
                 :false-label="0"
                 :true-label="1" 
-                v-model="row.flag" 
+                v-model="row.steamflag" 
                 @change="handlecheckFlagchange"></el-checkbox>
               </template>
             </el-table-column>
-            <el-table-column prop="data" label="" ></el-table-column>
+            <el-table-column prop="name" label="" ></el-table-column>
             </el-table>
           </div>
-        </el-card>
+          </el-card>
+        </div>
+        <div v-if="datacontent === '2'">
+          <el-card :shadow="none" style="min-height: 240px; max-height: 480px;">
+          <el-checkbox v-model="checkAll" 
+          :indeterminate="isIndeterminate"
+          @change="handlecheckAllchange">全选</el-checkbox>
+          <div class="eldesign classtable">
+            <el-table :data="youhuaCSTtable" border :show-header="false">
+            <el-table-column
+              type="index"
+              label=""
+            ></el-table-column>
+            <el-table-column prop="steamflag" width="55">
+              <template #default="{ row }">
+                <el-checkbox
+                :false-label="0"
+                :true-label="1" 
+                v-model="row.steamflag" 
+                @change="handlecheckFlagchange"></el-checkbox>
+              </template>
+            </el-table-column>
+            <el-table-column prop="name" label="" ></el-table-column>
+            </el-table>
+          </div>
+          </el-card>
+        </div>
+        <div v-if="datacontent === '3'">
+          <el-card :shadow="none" style="min-height: 240px; max-height: 480px;">
+          <el-checkbox v-model="checkAll" 
+          :indeterminate="isIndeterminate"
+          @change="handlecheckAllchange">全选</el-checkbox>
+          <div class="eldesign classtable">
+            <el-table :data="ADflowyouhuatable" border :show-header="false">
+            <el-table-column
+              type="index"
+              label=""
+            ></el-table-column>
+            <el-table-column prop="steamflag" width="55">
+              <template #default="{ row }">
+                <el-checkbox
+                :false-label="0"
+                :true-label="1" 
+                v-model="row.steamflag" 
+                @change="handlecheckFlagchange"></el-checkbox>
+              </template>
+            </el-table-column>
+            <el-table-column prop="name" label="" ></el-table-column>
+            <el-table-column prop="steamtype">
+              <template #default="{ row }">
+                <el-select v-model="row.steamtype">
+                  <el-option 
+                  v-for="item in steamtypeoptions"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                  />
+                </el-select>
+              </template>
+            </el-table-column>
+            </el-table>
+          </div>
+          </el-card>
+        </div>
+        <div v-if="datacontent === '4'">
+          <el-card :shadow="none" style="min-height: 240px; max-height: 480px;">
+          <el-checkbox v-model="checkAll" 
+          :indeterminate="isIndeterminate"
+          @change="handlecheckAllchange">全选</el-checkbox>
+          <div class="eldesign classtable">
+            <el-table :data="Xfoilyouhuatable" border :show-header="false">
+            <el-table-column
+              type="index"
+              label=""
+            ></el-table-column>
+            <el-table-column prop="steamflag" width="55">
+              <template #default="{ row }">
+                <el-checkbox
+                :false-label="0"
+                :true-label="1" 
+                v-model="row.steamflag" 
+                @change="handlecheckFlagchange"></el-checkbox>
+              </template>
+            </el-table-column>
+            <el-table-column prop="name" label="" show-overflow-tooltip></el-table-column>
+            <el-table-column prop="steamtype">
+              <template #default="{ row }">
+                <el-select v-model="row.steamtype">
+                  <el-option 
+                  v-for="item in steamtypeoptions"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                  />
+                </el-select>
+              </template>
+            </el-table-column>
+            </el-table>
+          </div>
+          </el-card>
+        </div>
+        
       </div>
       <template #footer>
         <div class="dialog-footer">
@@ -227,6 +320,7 @@ const changeName = ref({
   
 })
 
+
 onNodeContextMenu((e) => {
   noid.value = e.node;
   changeName.value.name = e.node.data.label;
@@ -258,9 +352,7 @@ emitter.on('child2Data', data => {
   datatree.value = data;
   console.log(datatree.value);
 })
-onUnmounted(() => {
-  emitter.off('child2Data');
-});
+
 function onNodeClick(e) {
   noid.value = e.node;
   changeName.value.name=e.node.data.label;
@@ -367,8 +459,6 @@ function onNodeDoubleClick(e) {
     emit('optimizerfalse','CST');
   }else if(e.node.data.name=="ADflow"){
     emit('optimizerfalse','ADflow');
-  }else if(e.node.data.name=="CST"){
-    emit('optimizerfalse','CST');
   }else if(e.node.data.name=="FFD"){
     emit('optimizerfalse','FFD');
   }else if(e.node.data.name=="TACS"){
@@ -402,7 +492,7 @@ function onEdgeClick(e) {
       previousEdge.style = {
         ...previousEdge.style,
         stroke: previousEdge.originalColor,  // 恢复原始颜色
-        strokeWidth: 1,                      // 恢复原始宽度
+        strokeWidth: previousEdge.originalWidth,// 恢复原始宽度
       };
     }
   }
@@ -413,6 +503,7 @@ function onEdgeClick(e) {
 
   // 暂时更改当前选中边缘的样式
   seledge.value.originalColor = seledge.value.style.stroke;  // 保存当前边缘的原始颜色
+  seledge.value.originalWidth = seledge.value.style.strokeWidth; // 保存当前边缘的原始宽度
   seledge.value.style = {
     ...seledge.value.style,
     stroke: '#2267B1',       // 设置选中边缘的颜色
@@ -421,50 +512,195 @@ function onEdgeClick(e) {
 
   // 保存当前选中的边缘作为上一个选中边缘
   previousEdge = seledge.value;
+
 }
 
 
 let dataflowshow=ref(false);
 
-let shujuliutable = ref([
-  {data: '升力系数Cl',flag:1},
-  {data: '阻力系数Cd',flag:1},
-  {data: '压阻力系数Cdp',flag:1},
-  {data: '上表面转换点位置xtr-upper',flag:1},
-  {data: '下表面转换点位置xtr-lower',flag:1},
+let youhuaFFDtable = ref([
+  { name:'FFD参数(sample)', steamflag:1 }
+])
+
+let youhuaCSTtable = ref([
+  { name:"上表面CST参数(upper)", steamflag:1 },
+  { name:'下表面CST参数(lower)', steamflag:1 }
+])
+
+let steamtypeoptions = ref([
+  { label:'约束条件', value:1 },
+  { label:'优化目标', value:2 }
+])
+
+let ADflowyouhuatable = ref([
+  { code: "cl", name:'升力系数Cl', comtype:2 , steamflag:1, steamtype:1 },
+  { code: "cd", name:'阻力系数Cd', comtype:2 , steamflag:1, steamtype:1 },
+  { code: "cm", name:'力矩系数Cm', comtype:2 , steamflag:1, steamtype:1 },
+  { code: " ", name:'体积', comtype:2 , steamflag:1, steamtype:1 },
 ])
 
+let Xfoilyouhuatable = ref([
+  // { code:'', name:'升力系数Cl', comtype:2 , steamflag:1, steamtype:1 },
+  // { code:'', name:'阻力系数Cd', comtype:2 , steamflag:1, steamtype:1 },
+  // { code:'', name:'压阻力系数Cdp', comtype:2 , steamflag:1, steamtype:1 },
+  // { code:'', name:'力矩系数Cm', comtype:2 , steamflag:1, steamtype:1 },
+  // { code:'', name:'上表面转换点位置xtr-upper', comtype:2 , steamflag:1, steamtype:1 },
+  // { code:'', name:'下表面转换点位置xtr-lower', comtype:2 , steamflag:1, steamtype:1 },
+])
 
 let checkAll = ref(false);
 let isIndeterminate = ref(false);
-const handlecheckAllchange = (val) => {
-  shujuliutable.value.forEach((item) => {
-    item.flag = val;
-  });
-  isIndeterminate.value = false;
+const dataTables = {
+  '1': youhuaFFDtable,
+  '2': youhuaCSTtable,
+  '3': ADflowyouhuatable,
+  '4': Xfoilyouhuatable
 };
 
 const handlecheckFlagchange = () => {
-  let checkedCount = shujuliutable.value.filter((item) => item.flag).length;
-  checkAll.value = checkedCount === shujuliutable.value.length;
-  isIndeterminate.value = checkedCount > 0 && checkedCount < shujuliutable.value.length;
+  const table = dataTables[datacontent.value];
+  if (!table) return;
+
+  let checkedCount = table.value.filter(item => Boolean(item.steamflag)).length;
+  checkAll.value = checkedCount === table.value.length;
+  isIndeterminate.value = checkedCount > 0 && checkedCount < table.value.length;
+};
+
+const handlecheckAllchange = (val) => {
+  const table = dataTables[datacontent.value];
+  if (!table) return;
+
+  table.value.forEach(item => item.steamflag = val ? 1 : 0);
+  isIndeterminate.value = false;
 };
 
 
 const confirmselection=()=>{
-  let checkedData = shujuliutable.value.filter((item) => item.flag).map((item) => item.data);
+  const table = dataTables[datacontent.value];
+  let checkedData = table.value.filter((item) => item.steamflag).map((item) => item.name);
   console.log('xuanzhongshuju:',checkedData);
   console.log('seledge:',seledge.value);
   seledge.value.label=checkedData.join('\n');
+  if(datacontent.value === '4') {
+    dataFlowsave();
+  }
+  
   dataflowshow.value = false;
 }
 
 
+
+const xfid = ref('')
+const adid = ref('')
+// 监听组件xfoil返回的xfid
+const handleXfid = (xfidFromB) => {
+  xfid.value = xfidFromB.value;
+};
+
+const handleAdid = (adidFromB) => {
+  adid.value = adidFromB.value;
+}
+
+
+let datacontent = ref('')
 function onEdgeDoubleClick(e) {
-  handlecheckFlagchange();
+  
   console.log('Edge Double Click', e)
   seledge.value = e.edge;
-  dataflowshow.value = true
+  // dataflowshow.value = true
+  console.log('qidian:',e.edge.sourceNode.data.name);
+  console.log('zhongdian:',e.edge.targetNode.data.name);
+  let qidian = e.edge.sourceNode.data.name;
+  let zhongdian = e.edge.targetNode.data.name;
+  let youhualist = ['优化器','代理优化器','进化优化器','梯度优化器'];
+  if( youhualist.includes(qidian) && zhongdian ==='FFD' ){
+    datacontent.value = '1';
+    dataflowshow.value = true;
+  }else if( youhualist.includes(qidian) && zhongdian ==='CST') {
+    datacontent.value = '2';
+    dataflowshow.value = true;
+  }else if( qidian === 'ADflow' && youhualist.includes(zhongdian) ) {
+    datacontent.value = '3';
+    emitter.emit('requestGetadid',pid.value);
+    console.log('adid:',adid.value)
+    if(adid.value) {
+      // querydataFlow(adid);
+      dataflowshow.value = true;
+    }else{
+      ElMessage.error('ADflow未初始化!')
+    }
+  }else if ( qidian === 'Xfoil' && youhualist.includes(zhongdian) ) {
+    datacontent.value = '4';
+    emitter.emit('requestGetxfid',pid.value);
+    console.log('xfid:',xfid.value)
+    if(xfid.value) {
+      querydataFlow(xfid);
+      dataflowshow.value = true;
+    }else{
+      ElMessage.error('Xfoil未初始化!')
+    }
+  }
+  console.log('leixing:',datacontent.value);
+
+  nextTick(() => {
+    handlecheckFlagchange();
+  });
+}
+
+const querydataFlow = (comid) => {
+  const params = {
+    transCode: "MDO0052",
+    pid: pid.value,
+    comid: comid.value
+  }
+  request(params).then((res) => {
+    if(datacontent.value === '4'){
+      Xfoilyouhuatable.value = res.params;
+      handlecheckFlagchange();
+    }
+    
+  })
+  .catch((err) => {
+      ElMessage.error(err.returnMsg)
+  })
+}
+
+const dataFlowsave = () => {
+  const params = {
+    transCode: "MDO0053",
+    paramstr: convertToStringArray([],Xfoilyouhuatable.value),
+  };
+  request(params).then((res) => {
+    ElMessage({
+        message: res.returnMsg,
+        type: 'success',
+      })
+  })
+  .catch((err) => {
+      ElMessage.error(err.returnMsg)
+  })
+}
+
+const convertToStringArray = (result, Data) => {
+  console.log('Data:', Data);
+
+  // 安全检查 Data,确保它是一个数组
+  if (!Array.isArray(Data)) {
+    console.error('Data should be an array');
+    return result; // 返回原 result 或者根据需要返回其他默认值
+  }
+
+  result = Data.map(row => {
+    // 获取每一行的 `code`, `name`, `value` 和 `flag`
+    const paramid = row.paramid ?? ' ';
+    const steamflag = row.steamflag ?? '';
+    const steamtype = row.steamtype ?? ' ';
+
+    // 将字段连接为一个以逗号分隔的字符串
+    return `${paramid},${steamflag},${steamtype}`;
+  }).join(';');  // 每行之间用分号分隔
+
+  return result;
 }
 
 
@@ -649,10 +885,41 @@ function toggleDarkMode() {
 onMounted(() => {
   setTimeout(function() {
     getroter();
-}, 1500);
+  }, 1500);
   // childfun();
 
+  if (vueFlowRef.value) {
+    vueFlowRef.value.$el.addEventListener('click', (event) => {
+      // 确保点击的不是边缘
+      if (seledge.value && !event.target.closest('.vue-flow__edge')) {
+        // 恢复选中边缘的原始样式
+        seledge.value.style = {
+          ...seledge.value.style,
+          stroke: seledge.value.originalColor,
+          strokeWidth: previousEdge?.originalWidth || 1, // 恢复原始宽度
+        };
+
+        // 清空选中的边缘
+        seledge.value = null;
+        Edgeid.value = null;
+        previousEdge = null;
+      }
+    });
+  }
+
+  emitter.on("xfidFromxfoil", handleXfid);
+  emitter.on("adidFromadflow", handleAdid);
 });
+
+
+onUnmounted(() => {
+  emitter.off('child2Data');
+
+  emitter.off("xfidFromxfoil", handleXfid);
+  emitter.off("adidFromadflow", handleAdid);
+});
+
+
 // 获取链接
 const getroter=()=>{
   //datatree.value[0].children=[];
@@ -736,18 +1003,16 @@ defineExpose({changeAllEdgesColor,linestrokeWidth,getroter,onSelection,bgcolorfu
   /* 设置edges的左对齐 */
 }
 
-.edge-label {
-  position: absolute;
-  background-color: rgba(0, 0, 0, 0.6);
-  color: white;
-  padding: 5px;
-  border-radius: 4px;
-  font-size: 14px;
-  white-space: pre-line;  /* 保证文本支持换行 */
+.vue-flow__edge-text {
+  transform:  translateY(-10px); /* 将 label 向上偏移 */
+  background: transparent !important;
+  font-size: 8px;
+  font-family: 'Source Sans Pro-Regular';
+  color: #333333;
 }
 
-.edge-label-line {
-  margin-bottom: 4px; /* 控制每行的间距 */
+.vue-flow__edge-textbg {
+  fill: transparent !important; /* 将背景设置为透明 */
 }
 
 #contextMenu {
@@ -817,8 +1082,5 @@ panel {
 .field{
   display: flex;
 }
-.node-label, .edge-label,.custom-node span {
-    text-transform: none; /* 确保文本不转换为大写 */
-    font-family: 'Inter-Regular';
-}
+
 </style>