ffds.vue 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. <template>
  2. <div class="XFpdding">
  3. <div>
  4. <el-form-item label="FFD box:" :label-width="formLabelWidth1">
  5. <el-input
  6. v-model="cstnum"
  7. :max="20"
  8. controls-position="right"
  9. @keydown.enter="keydownenter"
  10. >
  11. <template #append>
  12. <fileUploads
  13. :projectId="123"
  14. solverType="exampleSolver"
  15. accept=".xyz"
  16. upId="uniqueId1"
  17. name="点击选择文件"
  18. :imgSrc="imageSrc"
  19. />
  20. </template>
  21. </el-input>
  22. <el-form-item label="FFD包围盒:" :label-width="formLabelWidth1" style="align-items: center;">
  23. <el-row align="middle" :gutter="20">
  24. <el-col :span="22">
  25. <el-input
  26. v-model="ffdvalue.fname"
  27. :max="20"
  28. controls-position="right"
  29. @keydown.enter="keydownenter"
  30. />
  31. </el-col>
  32. <el-col :span="2">
  33. <el-upload
  34. class="upload-demo"
  35. action="your-upload-api-endpoint"
  36. :on-success="handleUploadSuccess"
  37. :on-error="handleUploadError"
  38. :show-file-list="false"
  39. >
  40. <img
  41. src=""
  42. alt="Button Image"
  43. style="width: 40px; height: 40px; cursor: pointer;"
  44. @click="handleUploadClick"
  45. />
  46. </el-upload>
  47. </el-col>
  48. </el-row>
  49. </el-form-item>
  50. <el-form-item label="参考坐标系:" :label-width="formLabelWidth1">
  51. <el-radio-group v-model="order">
  52. <el-radio :value="0" :label="0">x-y-z</el-radio>
  53. <el-radio :value="1" :label="1">x-z-y</el-radio>
  54. <el-radio :value="2" :label="2">y-x-z</el-radio>
  55. <el-radio :value="3" :label="3">y-z-x</el-radio>
  56. <el-radio :value="4" :label="4">z-x-y</el-radio>
  57. <el-radio :value="5" :label="5">z-y-x</el-radio>
  58. </el-radio-group>
  59. </el-form-item>
  60. </div>
  61. <el-form-item label="控制点数:" :label-width="formLabelWidth1">
  62. <div style="display: flex">
  63. <el-input type="text" style="margin-right: 10px" v-model="ffdvalue.nx">
  64. <!-- <template #prepend>X方向</template> -->
  65. <template #prefix>X方向</template>
  66. </el-input>
  67. <el-input type="text" style="margin-right: 10px" v-model="ffdvalue.ny">
  68. <template #prefix>Y方向</template>
  69. </el-input>
  70. <el-input type="text" style="margin-right: 10px" v-model="ffdvalue.nz">
  71. <template #prefix>Z方向</template>
  72. </el-input>
  73. <el-button @click="generateTable">应用</el-button>
  74. </div>
  75. </el-form-item>
  76. <div class="classtable">
  77. <el-table :data="tableDatacst1" style="width: 100%" border>
  78. <el-table-column prop="表格" label="表格" width="180" />
  79. <el-table-column
  80. v-for="(item, index) in tablecstHeaders"
  81. :key="index"
  82. :prop="item.prop"
  83. :label="item.label"
  84. >
  85. <template #default="{ row }">
  86. <el-input v-model="row[item.prop]" />
  87. </template>
  88. </el-table-column>
  89. </el-table>
  90. </div>
  91. </div>
  92. </template>
  93. <script setup>
  94. import { ref, onMounted, reactive, provide, nextTick } from "vue"
  95. import { RouterView, RouterLink, useRouter, useRoute } from "vue-router"
  96. import myheader from "@/components/header.vue"
  97. import fileUploads from '../components/fileuploads.vue'
  98. import { request, uploadFile } from "@/utils/request"
  99. import { ElMessage, ElButton, ElDialog, ElSelect } from "element-plus"
  100. import { Edit, CaretBottom } from "@element-plus/icons-vue"
  101. let formLabelWidth3 = ref(100)
  102. let formLabelWidth200 = ref(200)
  103. let cstnum = ref("")
  104. let pid = ref()
  105. let fid = ref()
  106. let ffdid = ref()
  107. let ffdvalue = ref({
  108. fname: "",
  109. nx: 0,
  110. ny: 0,
  111. nz: 0
  112. })
  113. let order = ref(0)
  114. let vars = ref()
  115. let tableDatacst1 = ref([])
  116. let tablecstHeaders = ref([]) // 表格列头
  117. const imageSrc = new URL('@/assets/flowimg/ffdFileSave.png', import.meta.url).href;
  118. const generateTable = () => {
  119. console.log("generateTable");
  120. // 获取X, Y, Z方向的数值
  121. const xCount = Number(ffdvalue.value.nx);
  122. const yCount = Number(ffdvalue.value.ny);
  123. const zCount = Number(ffdvalue.value.nz);
  124. // 根据选中的参考坐标系来确定列名和行名
  125. let columns = [];
  126. let rows = [];
  127. switch (order.value) {
  128. case 0: // x-y-z
  129. columns = Array.from({ length: xCount }, (_, i) => ({ label: `x${i + 1}`, prop: `x${i + 1}` }));
  130. rows = Array.from({ length: yCount }, (_, i) => ({ label: `y${i + 1}`, prop: `y${i + 1}` }));
  131. break;
  132. case 1: // x-z-y
  133. columns = Array.from({ length: xCount }, (_, i) => ({ label: `x${i + 1}`, prop: `x${i + 1}` }));
  134. rows = Array.from({ length: zCount }, (_, i) => ({ label: `z${i + 1}`, prop: `z${i + 1}` }));
  135. break;
  136. case 2: // y-x-z
  137. columns = Array.from({ length: yCount }, (_, i) => ({ label: `y${i + 1}`, prop: `y${i + 1}` }));
  138. rows = Array.from({ length: xCount }, (_, i) => ({ label: `x${i + 1}`, prop: `x${i + 1}` }));
  139. break;
  140. case 3: // y-z-x
  141. columns = Array.from({ length: yCount }, (_, i) => ({ label: `y${i + 1}`, prop: `y${i + 1}` }));
  142. rows = Array.from({ length: zCount }, (_, i) => ({ label: `z${i + 1}`, prop: `z${i + 1}` }));
  143. break;
  144. case 4: // z-x-y
  145. columns = Array.from({ length: zCount }, (_, i) => ({ label: `z${i + 1}`, prop: `z${i + 1}` }));
  146. rows = Array.from({ length: xCount }, (_, i) => ({ label: `x${i + 1}`, prop: `x${i + 1}` }));
  147. break;
  148. case 5: // z-y-x
  149. columns = Array.from({ length: zCount }, (_, i) => ({ label: `z${i + 1}`, prop: `z${i + 1}` }));
  150. rows = Array.from({ length: yCount }, (_, i) => ({ label: `y${i + 1}`, prop: `y${i + 1}` }));
  151. break;
  152. default:
  153. break;
  154. }
  155. // 更新表格列头
  156. tablecstHeaders.value = columns;
  157. // 生成表格的数据行
  158. tableDatacst1.value = [];
  159. for (let i = 1; i <= rows.length; i++) {
  160. let row = { 表格: rows[i - 1].label };
  161. columns.forEach((column) => {
  162. row[column.prop] = null; // 每个单元格初始化为空
  163. });
  164. tableDatacst1.value.push(row);
  165. }
  166. };
  167. // 用来生成 vars,存储表格中除了行名与列名的所有值
  168. const generateVars = () => {
  169. let values = [];
  170. tableDatacst1.value.forEach(row => {
  171. tablecstHeaders.value.forEach(col => {
  172. let value = row[col.prop];
  173. if (value === null || value === undefined || value === '') {
  174. value = ' ';
  175. }
  176. values.push(value);
  177. });
  178. });
  179. // 将值拼接成用逗号分隔的字符串
  180. vars.value = values.join(',');
  181. };
  182. const initializeTableFromVars = () => {
  183. if (!vars.value) return;
  184. const values = vars.value.split(',');
  185. let index = 0;
  186. // 遍历 tableDatacst1 中的每一行
  187. tableDatacst1.value.forEach(row => {
  188. columns.forEach(col => {
  189. if (index < values.length) {
  190. // 将解析后的值赋给相应的单元格
  191. row[col.prop] = values[index] === ' ' ? '' : values[index]; // 空格用空字符串代替
  192. index++;
  193. }
  194. });
  195. });
  196. };
  197. // ffd查询
  198. const getffd = (id) => {
  199. pid.value = id;
  200. const params = {
  201. transCode: "MDO0043",
  202. pid: pid.value
  203. };
  204. request(params).then((res) => {
  205. if (res.hasOwnProperty("ffdid")) {
  206. ffdid.value = res.ffd;
  207. ffdvalue.value.fname = res.fname;
  208. ffdvalue.value.nx = res.nx;
  209. ffdvalue.value.ny = res.ny;
  210. ffdvalue.value.nz = res.nz;
  211. order.value = Number(res.order);
  212. vars.value = res.vars;
  213. initializeTableFromVars();
  214. }
  215. })
  216. .catch((err) => {
  217. ElMessage.error(err.returnMsg)
  218. })
  219. };
  220. // ffd保存
  221. const getffdsave = () => {
  222. generateVars();
  223. const params = {
  224. transCode: "MDO0044",
  225. pid: pid.value,
  226. fid: fid.value,
  227. fname: ffdvalue.value.fname,
  228. nx: ffdvalue.value.nx,
  229. ny: ffdvalue.value.ny,
  230. nz: ffdvalue.value.nz,
  231. order: order.value,
  232. vars: vars.value,
  233. checked:1
  234. };
  235. request(params)
  236. .then((res) => {
  237. ElMessage({
  238. message: res.returnMsg,
  239. type: 'success',
  240. })
  241. })
  242. .catch((err) => {
  243. ElMessage.error(err.returnMsg);
  244. });
  245. };
  246. defineExpose({ getffd, getffdsave });
  247. </script>