|
|
@@ -1,5 +1,5 @@
|
|
|
import * as THREE from 'three';
|
|
|
-import { CSS3DObject, CSS3DSprite } from 'three/examples/jsm/renderers/CSS3DRenderer.js';
|
|
|
+import { CSS3DSprite } from 'three/examples/jsm/renderers/CSS3DRenderer.js';
|
|
|
import { getModelMonitorTags } from './gasPump.data';
|
|
|
import ArrowFlow from '../../comment/threejs/ArrowFlow';
|
|
|
// import * as dat from 'dat.gui';
|
|
|
@@ -91,89 +91,71 @@ class gasPumpUnder {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
- /** 根据各个泵的状态控制动画 */
|
|
|
- handleAnimation(monitorData?: any) {
|
|
|
- if (!monitorData) return;
|
|
|
+ /**
|
|
|
+ * 【核心不变式】泵号 → 该泵所接的管道箭头。左右分配只在这里写一次。
|
|
|
+ *
|
|
|
+ * 1# 瓦斯泵 = 场景左侧管(A 组,x≈-9.3,管号与泵号一致)
|
|
|
+ * 2# 瓦斯泵 = 场景右侧管(B+R 组,x≈-5.5)
|
|
|
+ *
|
|
|
+ * 现场若与上述左右相反,只需调换本表两行,几何与动画代码一律不动。
|
|
|
+ */
|
|
|
+ private readonly pumpArrows = {
|
|
|
+ 1: ['airInA', 'airOutA', 'waterInA', 'waterOutA'],
|
|
|
+ 2: ['airInB', 'airInR', 'airOutB', 'airOutR', 'waterInB', 'waterInR', 'waterOutB', 'waterOutR'],
|
|
|
+ } as const;
|
|
|
|
|
|
- this.airInA?.hideElement();
|
|
|
- this.airInB?.hideElement();
|
|
|
- this.airInR?.hideElement();
|
|
|
- this.airInL?.hideElement();
|
|
|
- this.airOutA?.hideElement();
|
|
|
- this.airOutB?.hideElement();
|
|
|
- this.airOutR?.hideElement();
|
|
|
- this.airOutL?.hideElement();
|
|
|
- this.waterInA?.hideElement();
|
|
|
- this.waterInB?.hideElement();
|
|
|
- this.waterInR?.hideElement();
|
|
|
- this.waterInL?.hideElement();
|
|
|
- this.waterOutA?.hideElement();
|
|
|
- this.waterOutB?.hideElement();
|
|
|
- this.waterOutR?.hideElement();
|
|
|
- this.waterOutL?.hideElement();
|
|
|
- // 进气动画控制
|
|
|
- const jqf1Open = this.modelMonitorTags.find((e) => e.domId === 'jqf1' && parseInt(monitorData[e.code]) > 0);
|
|
|
- const jqf2Open = this.modelMonitorTags.find((e) => e.domId === 'jqf2' && parseInt(monitorData[e.code]) > 0);
|
|
|
+ /**
|
|
|
+ * 泵运行信号表:泵号 → 该泵的运行状态点位。
|
|
|
+ * 由页面按站型注入(布尔台新站用变频器状态、老站用磁力启动器断路器状态)。
|
|
|
+ * 未注入时不点亮任何箭头,避免误判。
|
|
|
+ */
|
|
|
+ runSignals: Record<number, { code: string }> | null = null;
|
|
|
|
|
|
- if (jqf1Open && jqf2Open) {
|
|
|
- this.airInB?.showElement();
|
|
|
- this.airInR?.showElement();
|
|
|
- this.airInL?.showElement();
|
|
|
- } else if (jqf1Open) {
|
|
|
- this.airInB?.showElement();
|
|
|
- this.airInR?.showElement();
|
|
|
- } else if (jqf2Open) {
|
|
|
- this.airInA?.showElement();
|
|
|
- this.airInL?.showElement();
|
|
|
- }
|
|
|
+ setRunSignals(signals: Record<number, { code: string }> | null) {
|
|
|
+ this.runSignals = signals;
|
|
|
+ }
|
|
|
|
|
|
- // 出气动画控制
|
|
|
- const cqf1Open = this.modelMonitorTags.find((e) => e.domId === 'cqf1' && parseInt(monitorData[e.code]) > 0);
|
|
|
- const cqf2Open = this.modelMonitorTags.find((e) => e.domId === 'cqf2' && parseInt(monitorData[e.code]) > 0);
|
|
|
+ /**
|
|
|
+ * 判断某台泵是否运行。
|
|
|
+ *
|
|
|
+ * 已注入 runSignals 时(布尔台两站)按泵运行状态判定;
|
|
|
+ * 未注入时(寸草塔1/2、保德等未接入该机制的站型)保持历史上的阀门口径回落,
|
|
|
+ * 避免这些站的箭头因本次改动而全部不再流动。
|
|
|
+ */
|
|
|
+ private isPumpRunning(data: any, pumpNo: number): boolean {
|
|
|
+ if (!data) return false;
|
|
|
|
|
|
- if (cqf1Open && cqf2Open) {
|
|
|
- this.airOutB?.showElement();
|
|
|
- this.airOutR?.showElement();
|
|
|
- this.airOutL?.showElement();
|
|
|
- } else if (cqf1Open) {
|
|
|
- this.airOutB?.showElement();
|
|
|
- this.airOutR?.showElement();
|
|
|
- } else if (cqf2Open) {
|
|
|
- this.airOutA?.showElement();
|
|
|
- this.airOutL?.showElement();
|
|
|
+ const code = this.runSignals?.[pumpNo]?.code;
|
|
|
+ if (code) {
|
|
|
+ const raw = data[code];
|
|
|
+ if (raw === undefined || raw === null || raw === '') return false;
|
|
|
+ const value = Number(raw);
|
|
|
+ return Number.isFinite(value) && value === 1;
|
|
|
}
|
|
|
|
|
|
- // 进水动画控制
|
|
|
- const jsf1Open = this.modelMonitorTags.find((e) => e.domId === 'jsf1' && parseInt(monitorData[e.code]) == 1);
|
|
|
- const jsf2Open = this.modelMonitorTags.find((e) => e.domId === 'jsf2' && parseInt(monitorData[e.code]) == 1);
|
|
|
+ // 回落到旧的阀门开度口径:该泵的任一进气/出气阀门开启即认为有流动
|
|
|
+ const valvePrefixes = pumpNo === 1 ? ['jqf1', 'cqf1'] : ['jqf2', 'cqf2'];
|
|
|
+ return valvePrefixes.some((domId) => {
|
|
|
+ const tag = this.modelMonitorTags.find((e) => e.domId === domId);
|
|
|
+ if (!tag) return false;
|
|
|
+ const value = Number(data[tag.code]);
|
|
|
+ return Number.isFinite(value) && value > 0;
|
|
|
+ });
|
|
|
+ }
|
|
|
|
|
|
- if (jsf1Open && jsf2Open) {
|
|
|
- this.waterInB?.showElement();
|
|
|
- this.waterInR?.showElement();
|
|
|
- this.waterInL?.showElement();
|
|
|
- } else if (jsf1Open) {
|
|
|
- this.waterInB?.showElement();
|
|
|
- this.waterInR?.showElement();
|
|
|
- } else if (jsf2Open) {
|
|
|
- this.waterInA?.showElement();
|
|
|
- this.waterInL?.showElement();
|
|
|
- }
|
|
|
+ /** 根据各泵运行状态控制动画:泵运行时该泵所接的水、气四路管道全部流动 */
|
|
|
+ handleAnimation(monitorData?: any) {
|
|
|
+ if (!monitorData) return;
|
|
|
|
|
|
- // 出水动画控制
|
|
|
- const csf1Open = this.modelMonitorTags.find((e) => e.domId === 'csf1' && parseInt(monitorData[e.code]) == 1);
|
|
|
- const csf2Open = this.modelMonitorTags.find((e) => e.domId === 'csf2' && parseInt(monitorData[e.code]) == 1);
|
|
|
+ // 先全部隐藏,后续只点亮运行中泵所接的管路
|
|
|
+ Object.values(this.pumpArrows).forEach((names) => {
|
|
|
+ names.forEach((name) => this[name]?.hideElement());
|
|
|
+ });
|
|
|
|
|
|
- if (csf1Open && csf2Open) {
|
|
|
- this.waterOutB?.showElement();
|
|
|
- this.waterOutR?.showElement();
|
|
|
- this.waterOutL?.showElement();
|
|
|
- } else if (csf1Open) {
|
|
|
- this.waterOutB?.showElement();
|
|
|
- this.waterOutR?.showElement();
|
|
|
- } else if (csf2Open) {
|
|
|
- this.waterOutA?.showElement();
|
|
|
- this.waterOutL?.showElement();
|
|
|
- }
|
|
|
+ ([1, 2] as const).forEach((pumpNo) => {
|
|
|
+ if (!this.isPumpRunning(monitorData, pumpNo)) return;
|
|
|
+ this.pumpArrows[pumpNo].forEach((name) => this[name]?.showElement());
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
clearCssText = () => {
|