Xfoil.vue 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. <template>
  2. <div class="XFpdding">
  3. <ul>
  4. <li
  5. class="item"
  6. v-for="(tab, index) in tabslist"
  7. :key="index"
  8. :class="{ active: currentTab === index }"
  9. @click="selectTab(index)"
  10. >
  11. {{ tab.name }}
  12. </li>
  13. </ul>
  14. <!-- 来流参数 -->
  15. <div v-show="currentTab == '0'">
  16. <div class="eldesign classtable" style="margin-top: 10px">
  17. <el-table :data="inParams" border style="width: 100%; height: 400px">
  18. <el-table-column type="index" width="70" label="编号"/>
  19. <!-- <el-table-column prop="code" width="70" label="编码" /> -->
  20. <el-table-column prop="name" label="参数名称">
  21. <!-- <template #default="{ row }">
  22. <el-input v-model="row.name" />
  23. </template> -->
  24. </el-table-column>
  25. <el-table-column prop="value" label="参数值">
  26. <template #default="{ row }">
  27. <el-input v-model="row.value" type="number" />
  28. </template>
  29. </el-table-column>
  30. <el-table-column prop="flag" label="启用" width="100">
  31. <template v-slot="scope">
  32. <el-checkbox
  33. :false-label="-1"
  34. :true-label="1"
  35. :label="false"
  36. v-model="scope.row.flag"
  37. />
  38. </template>
  39. </el-table-column>
  40. </el-table>
  41. </div>
  42. </div>
  43. <!-- 分析参数 -->
  44. <div v-show="currentTab == '2'">
  45. <div class="eldesign classtable" style="margin-top: 10px">
  46. <el-table :data="outParams" border style="width: 100%">
  47. <el-table-column type="index" width="70" label="编号" />
  48. <!-- <el-table-column prop="code" width="70" label="编码" /> -->
  49. <el-table-column prop="name" label="参数名称">
  50. <!-- <template #default="{ row }">
  51. <el-input v-model="row.name" @change="handleEdit(row)" />
  52. </template> -->
  53. </el-table-column>
  54. <el-table-column prop="value" label="参数值">
  55. <template #default="{ row }">
  56. <el-input v-model.number="row.value" @change="handleEdit(row)" />
  57. </template>
  58. </el-table-column>
  59. <el-table-column prop="flag" label="启用" width="100">
  60. <template v-slot="scope">
  61. <el-checkbox
  62. :false-label="-1"
  63. :true-label="1"
  64. :label="false"
  65. v-model="scope.row.flag"
  66. />
  67. </template>
  68. </el-table-column>
  69. </el-table>
  70. </div>
  71. </div>
  72. <!-- 设置参数 -->
  73. <div v-show="currentTab == '1'">
  74. <div class="eldesign classtable" style="margin-top: 10px">
  75. <el-form-item label="计算完成:" :label-width="formLabelWidth1">
  76. <el-radio-group v-model="analyzed">
  77. <el-radio label="1">是</el-radio>
  78. <el-radio label="0">否</el-radio>
  79. </el-radio-group>
  80. </el-form-item>
  81. <el-form-item label="迭代次数:" :label-width="formLabelWidth1">
  82. <el-input
  83. v-model="xfoilvalue.iter"
  84. :step="100"
  85. :min="0"
  86. :max="1000"
  87. controls-position="right"
  88. />
  89. </el-form-item>
  90. <el-form-item label="表面求解点个数:" :label-width="formLabelWidth1">
  91. <el-input
  92. v-model="xfoilvalue.ppar"
  93. :step="100"
  94. :min="0"
  95. :max="1000"
  96. controls-position="right"
  97. />
  98. </el-form-item>
  99. <!-- <el-form-item label="结果文件:" :label-width="formLabelWidth1"></el-form-item> -->
  100. <div class="cheinput">
  101. <el-form-item label="压力分布:" :label-width="formLabelWidth1">
  102. <el-input
  103. v-model="xfoilvalue.cpwr"
  104. :step="100"
  105. :min="0"
  106. :max="1000"
  107. controls-position="right"
  108. />
  109. </el-form-item>
  110. <el-checkbox v-model="checked1" style="width:40px;height:40px" />
  111. </div>
  112. <div class="cheinput">
  113. <el-form-item label="翼型坐标:" :label-width="formLabelWidth1">
  114. <el-input
  115. v-model="xfoilvalue.yxzb"
  116. :step="100"
  117. :min="0"
  118. :max="1000"
  119. controls-position="right"
  120. />
  121. </el-form-item>
  122. <el-checkbox v-model="checked2" style="width:40px;height:40px" />
  123. </div>
  124. <div class="cheinput">
  125. <el-form-item label="力和力矩:" :label-width="formLabelWidth1">
  126. <el-input
  127. v-model="xfoilvalue.pacc"
  128. :step="100"
  129. :min="0"
  130. :max="1000"
  131. controls-position="right"
  132. />
  133. </el-form-item>
  134. <el-checkbox v-model="checked3" style="width:40px;height:40px" />
  135. </div>
  136. </div>
  137. </div>
  138. </div>
  139. </template>
  140. <script setup>
  141. import { ref, onMounted, reactive, provide, nextTick } from "vue"
  142. import { ElMessage, ElButton, ElDialog, ElSelect } from "element-plus"
  143. import { Edit, CaretBottom } from "@element-plus/icons-vue"
  144. import { tr } from "element-plus/es/locale/index.mjs"
  145. import { request, uploadFile } from "@/utils/request"
  146. let formLabelWidth3 = ref(100)
  147. let formLabelWidth1 = ref(170)
  148. let formLabelWidth2 = ref(250)
  149. let currentTab = ref(0)
  150. let checked1 = ref(true)
  151. let checked2 = ref(true)
  152. let checked3 = ref(true)
  153. let analyzed = ref('1')
  154. let pid = ref()
  155. let xfid = ref()
  156. let xfoilvalue = ref({
  157. iter: 100,
  158. ppar: 200,
  159. cpwr:"op.dat",
  160. yxzb:"airfoil.dat",
  161. pacc:"output.dat"
  162. })
  163. let tabslist = ref([
  164. { id: "0", name: "来流参数" },
  165. { id: "1", name: "设置参数" },
  166. { id: "2", name: "分析参数" }
  167. ])
  168. let inParams = ref([
  169. {
  170. code: "alpha",
  171. value: 0.1,
  172. name: "AoA",
  173. flag: 1,
  174. },
  175. {
  176. code: "mach,",
  177. value: 0.1,
  178. name: "MA",
  179. flag: 1,
  180. },
  181. {
  182. code: "reynolds",
  183. value: 6.5e6,
  184. name: "Re",
  185. flag: 1,
  186. }
  187. ])
  188. let outParams = ref([
  189. {
  190. code: "cl",
  191. value: "0.0",
  192. name: "升力系数Cl",
  193. flag: 1,
  194. },
  195. {
  196. code: "cd",
  197. value: "0.00436",
  198. name: "阻力系数Cd",
  199. flag: 1,
  200. },
  201. {
  202. code: "cdp",
  203. value: "0.1",
  204. name: "压阻力系数Cdp",
  205. flag: 1,
  206. },
  207. {
  208. code: "cm",
  209. value: "0.1",
  210. name: "力矩系数Cm",
  211. flag: 1,
  212. },
  213. {
  214. code: "xtr_upper",
  215. value: "0.1",
  216. name: "上表面转换点位置xtr-upper",
  217. flag: 1,
  218. },
  219. {
  220. code: "xtr_lower",
  221. value: "0.1",
  222. name: "下表面转换点位置xtr-lower",
  223. flag: 1,
  224. }
  225. ])
  226. // 选项卡
  227. const selectTab = (index) => {
  228. currentTab.value = index
  229. }
  230. // 新建表格行
  231. const addRow = () => {
  232. lailiutable.value.push({
  233. data: 0,
  234. name: "",
  235. enable: -1
  236. })
  237. }
  238. const convertToStringArray = (result, Data) => {
  239. console.log('Data:', Data);
  240. // 安全检查 Data,确保它是一个数组
  241. if (!Array.isArray(Data)) {
  242. console.error('Data should be an array');
  243. return result; // 返回原 result 或者根据需要返回其他默认值
  244. }
  245. result = Data.map(row => {
  246. // 获取每一行的 `code`, `name`, `value` 和 `flag`
  247. const code = row.code || ' ';
  248. const name = row.name || ' ';
  249. const value = (row.value === null || row.value === undefined || row.value === '') ? ' ' : row.value;
  250. const flag = row.flag || ' ';
  251. // 将字段连接为一个以逗号分隔的字符串
  252. return `${code},${name},${value},${flag}`;
  253. }).join(';'); // 每行之间用分号分隔
  254. return result;
  255. }
  256. const getxfoil = (id) => {
  257. pid.value = id;
  258. const params = {
  259. transCode: "MDO0046",
  260. pid: pid.value,
  261. };
  262. request(params).then((res) => {
  263. if (res.hasOwnProperty("xfid")) {
  264. getxfoilAssign(res);
  265. }
  266. })
  267. .catch((err) => {
  268. ElMessage.error(err.returnMsg)
  269. })
  270. }
  271. const getxfoilAssign = (data) => {
  272. xfid.value = data.xfid;
  273. xfoilvalue.value.iter = data.iter;
  274. xfoilvalue.value.ppar = data.ppar;
  275. xfoilvalue.value.cpwr = data.cpwr;
  276. xfoilvalue.value.yxzb = data.yxzb;
  277. xfoilvalue.value.pacc = data.pacc;
  278. analyzed.value = data.analyzed;
  279. inParams.value = data.inParams;
  280. outParams.value = data.outParams;
  281. }
  282. const getxfoilsave = () => {
  283. const params = {
  284. transCode: "MDO0047",
  285. pid: pid.value,
  286. iter: xfoilvalue.value.iter,
  287. ppar: xfoilvalue.value.ppar,
  288. cpwr: xfoilvalue.value.cpwr,
  289. yxzb: xfoilvalue.value.yxzb,
  290. pacc: xfoilvalue.value.pacc,
  291. analyzed: analyzed.value,
  292. checked:1,
  293. inParams: convertToStringArray([],inParams.value),
  294. outParams: convertToStringArray([],outParams.value)
  295. };
  296. request(params).then((res) => {
  297. ElMessage({
  298. message: res.returnMsg,
  299. type: 'success',
  300. })
  301. })
  302. .catch((err) => {
  303. ElMessage.error(err.returnMsg)
  304. })
  305. }
  306. defineExpose({
  307. getxfoil,
  308. getxfoilAssign,
  309. getxfoilsave
  310. })
  311. </script>