You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

308 lines
9.3 KiB
Vue

1 month ago
<template>
<div class="scrollable-form">
<el-form label-position="right" label-width="130px" :model="wellData.Base">
<div name="wellBaseData" class="well-param">
<el-divider content-position="left">数据</el-divider>
<el-form-item label="名字:" label-position="right" class="well-param-item">
<el-input v-model="wellData.Base.Name" class="well-param-input" />
</el-form-item>
<el-form-item label="X" label-position="right" class="well-param-item">
<el-input v-model="wellData.Base.X" class="well-param-input" />
</el-form-item>
<el-form-item label="Y" label-position="right" class="well-param-item">
<el-input v-model="wellData.Base.Y" class="well-param-input" />
</el-form-item>
<el-form-item label="Z" label-position="right" class="well-param-item">
<el-input v-model="wellData.Base.Z" class="well-param-input" />
</el-form-item>
<el-form-item label="角度:" class="well-param-item">
<el-input-number :precision="1" v-model.number="wellData.Base.Angle" class="well-param-input" />
</el-form-item>
</div>
</el-form>
<el-form label-position="right" label-width="130px" :model="wellData.Parameter">
<div name="wellBaseParameter" class="well-param">
<el-divider content-position="left">参数</el-divider>
<el-form-item label="井支角度:" label-position="right" class="well-param-item">
<el-input-number :precision="2" v-model.number="wellData.Parameter.BranchAngle" class="well-param-input" />
</el-form-item>
<el-form-item label="右侧井支数:" label-position="right" class="well-param-item">
<el-input-number :precision="0" v-model.number="wellData.Parameter.BranchCountRight"
class="well-param-input" />
</el-form-item>
<el-form-item label="右侧垂直靶前距:" label-position="right" class="well-param-item">
<el-input-number :precision="2" v-model.number="wellData.Parameter.BranchDistanceRight"
class="well-param-input" />
</el-form-item>
<el-form-item label="左侧井支数:" label-position="right" class="well-param-item">
<el-input-number :precision="0" v-model.number="wellData.Parameter.BranchCountLeft"
class="well-param-input" />
</el-form-item>
<el-form-item label="左侧垂直靶前距:" label-position="right" class="well-param-item">
<el-input-number :precision="2" v-model.number="wellData.Parameter.BranchDistanceLeft"
class="well-param-input" />
</el-form-item>
<el-form-item label="水平井段长度:" label-position="right" class="well-param-item">
<el-input-number :precision="2" v-model.number="wellData.Parameter.BranchLength" class="well-param-input" />
</el-form-item>
<el-form-item label="井支间距:" label-position="right" class="well-param-item">
<el-input-number :precision="2" v-model.number="wellData.Parameter.BranchSpace" class="well-param-input" />
</el-form-item>
<!-- <el-collapse>
<el-collapse-item title="井支" name="wellBranches" class="well-param">
<el-form-item
v-for="(htvp, index) in wellData.WellBranches.WellBranch"
:key="index"
:item="htvp"
class="well-param-item"
>
<template #label>
{{ htvp.PointStart.Base.Name }}
</template>
<el-input v-model="htvp.HowToViewPoint[0].Symbol.Name" style="width: 150px" />
</el-form-item>
</el-collapse-item>
</el-collapse> -->
</div>
</el-form>
<div class="button-container">
<el-button type="primary" @click="btnChangeProperty" style="margin-top: 15px">修改参数</el-button>
</div>
</div>
</template>
<script setup>
import { ref, onMounted, onUnmounted } from "vue";
import { emitter } from "~/utils/eventBus";
import "@/assets/css/element.css";
import { parseXML, parseXMLWithNoAttr } from "@/utils/xmlParser";
import { convertNumericStrings } from "@/utils/objHelper";
import { ElDivider } from "element-plus";
import { COMMAND } from '~/utils/commandTypes'
import { XMLBuilder } from "fast-xml-parser";
import { STORAGE_KEYS } from "~/utils/storageKeys"
import { useWebSocket } from "@/composables/useWebSocket";
// 当前页图件token的 key
const currentTokenKey = STORAGE_KEYS.WELL_RECOMMAND_TOKEN;
const { send } = useWebSocket();
let sourceElementData = null;
let elementId = 0;
const defaultProperty = {
Base: {
Name: "",
X: 0,
Y: 0,
Z: 0,
Angle: 0,
},
Parameter: {
BranchAngle: 0,
BranchCountRight: 0,
BranchDistanceRight: 0,
BranchCountLeft: 0,
BranchDistanceLeft: 0,
BranchLength: 0,
BranchSpace: 0,
},
WellBranches: {
WellBranch: [
{
HowToViewCurve: [
{
Base: {
Name: "",
Style: "0",
},
Property: {
Base: {
Width: 0,
Color: 0,
Style: 0,
SmoothStep: 0,
Offset: 0,
},
Wave: {
T: 0,
A: 0,
N: 0,
},
},
Name: "",
},
],
HowToViewPoint: [
{
Font: {
W: 0,
H: 0,
O: 0,
B: 0,
I: 0,
U: 0,
S: 0,
CS: 0,
OP: 0,
CP: 0,
Q: 0,
PF: 0,
FN: "",
},
Symbol: {
Name: "",
Height: 0,
Width: 0,
Angle: 0,
FrColor: 0,
BkColor: 0,
EnableFrColor: 0,
EnableBkColor: 0,
},
Text: {
Height: 0,
Width: 0,
Angle: 0,
DeltX: 0,
DeltY: 0,
Style: 0,
FrColor: 0,
BkColor: 0,
},
Name: "",
},
],
PointStart: {
Base: {
Name: "",
X: 0,
Y: 0,
Z: 0,
Angle: 0,
},
},
PointEnd: {
Base: {
Name: "",
X: 0,
Y: 0,
Z: 0,
Angle: 0,
},
},
},
],
},
};
// 井组参数
const wellData = ref(defaultProperty);
// 修改参数按钮事件
const btnChangeProperty = () => {
let xmlData = wellData.value;
// 更新 sourceElementData 的值
sourceElementData.Element.WellGroup.Base.Name = xmlData.Base.Name;
sourceElementData.Element.WellGroup.Base.X = xmlData.Base.X;
sourceElementData.Element.WellGroup.Base.Y = xmlData.Base.Y;
sourceElementData.Element.WellGroup.Base.Z = xmlData.Base.Z;
sourceElementData.Element.WellGroup.Base.Angle = xmlData.Base.Angle;
sourceElementData.Element.WellGroup.Parameter.BranchAngle =
xmlData.Parameter.BranchAngle;
sourceElementData.Element.WellGroup.Parameter.BranchCountRight =
xmlData.Parameter.BranchCountRight;
sourceElementData.Element.WellGroup.Parameter.BranchDistanceRight =
xmlData.Parameter.BranchDistanceRight;
sourceElementData.Element.WellGroup.Parameter.BranchCountLeft =
xmlData.Parameter.BranchCountLeft;
sourceElementData.Element.WellGroup.Parameter.BranchDistanceLeft =
xmlData.Parameter.BranchDistanceLeft;
sourceElementData.Element.WellGroup.Parameter.BranchLength =
xmlData.Parameter.BranchLength;
sourceElementData.Element.WellGroup.Parameter.BranchSpace =
xmlData.Parameter.BranchSpace;
// 配置选项
const options = {
attributeNamePrefix: "", // 属性前缀
attrNodeName: "", // 属性节点名称
textNodeName: "#text", // 文本节点名称
ignoreAttributes: false, // 是否忽略属性
format: true, // 是否格式化输出
indentBy: " ", // 缩进字符
};
const builder = new XMLBuilder(options);
const xmlString = builder.build(sourceElementData);
send(COMMAND.SET_ELEMENT_PROPERTY, {
elementID: elementId,
data: xmlString,
}, localStorage.getItem(currentTokenKey));
};
onMounted(() => {
emitter.on(EMIT_COMMAND.SOURCE_CHANGED, () => {
wellData.value = defaultProperty;
});
});
// 接收井数据
emitter.on(EMIT_COMMAND.WELL_GROUP_DATA, (data) => {
let xmlString = data.propData;
elementId = data.id;
sourceElementData = parseXML(xmlString);
let items = sourceElementData.Element.WellGroup;
let handleData = convertNumericStrings(items);
wellData.value = handleData;
});
// 移除监听
onBeforeUnmount(() => {
emitter.off(EMIT_COMMAND.WELL_GROUP_DATA);
emitter.off(EMIT_COMMAND.SOURCE_CHANGED);
});
onUnmounted(() => {
// unsubscribe();
});
</script>
<style scoped>
.scrollable-form {
max-height: 900px;
min-height: 600px;
width: 290px;
height: 650px;
}
.well-param-item {
height: 25px;
}
.well-param-input {
width: 130px;
height: 25px;
}
.button-container {
display: flex;
bottom: 20px;
right: 20px;
position: fixed;
justify-content: flex-end;
width: 290px;
z-index: 3;
}
</style>