This commit is contained in:
Yuan 2023-10-17 17:23:32 +08:00
parent cdb02a8e20
commit 05b62058b1
9 changed files with 2962 additions and 2613 deletions

79
src/drawApp/IbpScene.ts Normal file
View File

@ -0,0 +1,79 @@
import { toUint8Array } from 'js-base64';
import { getPublishMapInfoByName } from 'src/api/PublishApi';
import { GraphicData, IGraphicApp, IGraphicStorage } from 'src/jl-graphic';
import { ibpGraphicData } from 'src/protos/ibpGraphics';
import { useIbpStore } from 'src/stores/ibp-store';
import { IbpLightData } from './graphics/IbpLightInteraction';
import { IBPButtonData } from './graphics/IBPButtonInteraction';
import { IbpTextData } from './graphics/IbpTextInteraction';
import { IbpAlarmData } from './graphics/IbpAlarmInteraction';
import { IbpKeyData } from './graphics/IbpKeyInteraction';
import { ArrowData } from './graphics/ArrowInteraction';
import { IBPButtonTemplate } from 'src/graphics/IBPButton/IBPButton';
import { IbpLightTempalte } from 'src/graphics/ibpLight/IbpLight';
import { IbpAlarmTemplate } from 'src/graphics/ibpAlarm/IbpAlarm';
import { IbpKeyTemplate } from 'src/graphics/ibpKey/IbpKey';
import { TextContentTemplate } from 'src/graphics/textContent/TextContent';
import { ArrowTemplate } from 'src/graphics/arrow/Arrow';
export function initIbpScene(lineApp: IGraphicApp, sceneName: string) {
const ibpScene = lineApp.initScene(sceneName, {
dataLoader: ibpSceneDataLoader,
mouseToolOptions: {
wheelZoom: false,
},
});
const graphicTemplate = [
new IBPButtonTemplate(new IBPButtonData()),
new IbpLightTempalte(new IbpLightData()),
new IbpAlarmTemplate(new IbpAlarmData()),
new IbpKeyTemplate(new IbpKeyData()),
new TextContentTemplate(new IbpTextData()),
new ArrowTemplate(new ArrowData()),
];
ibpScene.registerGraphicTemplates(...graphicTemplate);
return ibpScene;
}
async function ibpSceneDataLoader(): Promise<IGraphicStorage> {
const ibpStore = useIbpStore();
const { proto } = await getPublishMapInfoByName({
name: ibpStore.ibpMapCode,
detail: true,
});
if (proto) {
const storage = ibpGraphicData.IBPGraphicStorage.deserialize(
toUint8Array(proto)
);
const datas: GraphicData[] = [];
storage.ibpLights.forEach((ibpLight) => {
datas.push(new IbpLightData(ibpLight));
});
storage.ibpButtons.forEach((ibpButton) => {
datas.push(new IBPButtonData(ibpButton));
});
storage.IBPTexts.forEach((ibpText) => {
datas.push(new IbpTextData(ibpText));
});
storage.ibpAlarms.forEach((ibpAlarm) => {
datas.push(new IbpAlarmData(ibpAlarm));
});
storage.ibpKeys.forEach((ibpKey) => {
datas.push(new IbpKeyData(ibpKey));
});
storage.ibpArrows.forEach((ibpArrow) => {
datas.push(new ArrowData(ibpArrow));
});
return {
canvasProperty: storage.canvas,
datas,
};
} else {
return Promise.resolve({ datas: [] });
}
}

View File

@ -13,7 +13,6 @@ import {
JlGraphic, JlGraphic,
} from 'src/jl-graphic'; } from 'src/jl-graphic';
import { useLineStore } from 'src/stores/line-store'; import { useLineStore } from 'src/stores/line-store';
// import { DisplayObject, FederatedMouseEvent } from 'pixi.js';
export class PlatformData extends GraphicDataBase implements IPlatformData { export class PlatformData extends GraphicDataBase implements IPlatformData {
constructor(data?: graphicData.Platform) { constructor(data?: graphicData.Platform) {

View File

@ -17,6 +17,9 @@ import {
import { DisplayObject, FederatedMouseEvent } from 'pixi.js'; import { DisplayObject, FederatedMouseEvent } from 'pixi.js';
import { KilometerSystem } from 'src/graphics/signal/Signal'; import { KilometerSystem } from 'src/graphics/signal/Signal';
import { useLineStore } from 'src/stores/line-store'; import { useLineStore } from 'src/stores/line-store';
import { useIbpStore } from 'src/stores/ibp-store';
const ibpStore = useIbpStore();
export class StationData extends GraphicDataBase implements IStationData { export class StationData extends GraphicDataBase implements IStationData {
constructor(data?: graphicData.Station) { constructor(data?: graphicData.Station) {
@ -132,28 +135,14 @@ export class StationState extends GraphicStateBase implements IStationState {
} }
} }
const emergencyStationControlConfig: MenuItemOptions = { const openIbpMenuItem: MenuItemOptions = {
name: '紧急站控', name: '打开IBP',
};
const centralControlConfig: MenuItemOptions = {
name: '中控',
};
const stationControlConfig: MenuItemOptions = {
name: '站控',
};
const interlockControlConfig: MenuItemOptions = {
name: '联锁控',
}; };
const StationOperateMenu: ContextMenu = ContextMenu.init({ const StationOperateMenu: ContextMenu = ContextMenu.init({
name: '车站操作菜单', name: '车站操作菜单',
groups: [ groups: [
{ {
items: [ items: [openIbpMenuItem],
emergencyStationControlConfig,
centralControlConfig,
stationControlConfig,
interlockControlConfig,
],
}, },
], ],
}); });
@ -194,30 +183,9 @@ export class StationOperateInteraction extends GraphicInteractionPlugin<Station>
const target = e.target as DisplayObject; const target = e.target as DisplayObject;
const station = target.getGraphic() as Station; const station = target.getGraphic() as Station;
this.app.updateSelected(station); this.app.updateSelected(station);
// emergencyStationControlConfig.handler = () => { openIbpMenuItem.handler = () => {
// station.states.ipRtuStusInEmergencyCtrl = true; ibpStore.setIbpParam(station.datas.code, station.datas.refIbpMapCode);
// station.states.ipRtuStusInLocalCtrl = false; };
// station.states.ipRtuStusInCentralCtrl = false; StationOperateMenu.open(e.global);
// station.doRepaint();
// };
// stationControlConfig.handler = () => {
// station.states.ipRtuStusInEmergencyCtrl = false;
// station.states.ipRtuStusInCentralCtrl = false;
// station.states.ipRtuStusInLocalCtrl = true;
// station.doRepaint();
// };
// centralControlConfig.handler = () => {
// station.states.ipRtuStusInEmergencyCtrl = false;
// station.states.ipRtuStusInLocalCtrl = false;
// station.states.ipRtuStusInCentralCtrl = true;
// station.doRepaint();
// };
// interlockControlConfig.handler = () => {
// station.states.ipRtuStusInEmergencyCtrl = false;
// station.states.ipRtuStusInLocalCtrl = false;
// station.states.ipRtuStusInCentralCtrl = false;
// station.doRepaint();
// };
// StationOperateMenu.open(e.global);
} }
} }

View File

@ -20,7 +20,7 @@ export function destroyLineApp(): void {
export function initLineApp(): IGraphicApp { export function initLineApp(): IGraphicApp {
lineApp = newGraphicApp({}); lineApp = newGraphicApp({});
lineApp?.enableWsMassaging({ lineApp.enableWsMassaging({
engine: ClientEngine.Centrifugo, engine: ClientEngine.Centrifugo,
wsUrl: `${getWebsocketUrl()}`, wsUrl: `${getWebsocketUrl()}`,
token: getOnlyToken() as string, token: getOnlyToken() as string,

View File

@ -198,7 +198,7 @@ export function initLineScene(lineApp: IGraphicApp, sceneName: string) {
const lineScene = lineApp.initScene(sceneName, options); const lineScene = lineApp.initScene(sceneName, options);
const categoryType = useLineStore().categoryType; const categoryType = useLineStore().categoryType;
if (!categoryType) { if (!categoryType) {
throw new Error('获取到厂商信息'); throw new Error('获取到厂商信息');
} }
const getTypeConsts = getCategoryConsts(categoryType); const getTypeConsts = getCategoryConsts(categoryType);
const graphicTemplate = [ const graphicTemplate = [

View File

@ -26,7 +26,7 @@ const textContentConsts = {
}; };
export class TextContent extends JlGraphic { export class TextContent extends JlGraphic {
static Type = 'textContent'; static Type = 'textContent';
contentGraph: VectorText = new VectorText(''); //车站名 contentGraph: VectorText = new VectorText('');
constructor() { constructor() {
super(TextContent.Type); super(TextContent.Type);
this.addChild(this.contentGraph); this.addChild(this.contentGraph);

View File

@ -42,11 +42,32 @@
<div id="psl-app-container" class="overflow-hidden"></div> <div id="psl-app-container" class="overflow-hidden"></div>
</q-page-container> </q-page-container>
</q-dialog> </q-dialog>
<DraggableDialog
:title="`${ibpStore.stationCode}IBP`"
v-model="ibpStore.isIbpDialogOpen"
:width="1250"
:height="800"
>
<div
id="ibp-app-container"
class="overflow-hidden"
style="width: 1250px; height: 800px"
></div>
</DraggableDialog>
</q-layout> </q-layout>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { onMounted, ref, computed, onUnmounted, watch, reactive } from 'vue'; import {
onMounted,
ref,
computed,
onUnmounted,
watch,
reactive,
nextTick,
} from 'vue';
import DraggableDialog from 'src/components/common/DraggableDialog.vue';
import { useLineStore } from 'src/stores/line-store'; import { useLineStore } from 'src/stores/line-store';
import { usePslStore } from 'src/stores/psl-store'; import { usePslStore } from 'src/stores/psl-store';
import { useRoute, useRouter } from 'vue-router'; import { useRoute, useRouter } from 'vue-router';
@ -64,6 +85,7 @@ import { CategoryType } from 'src/components/CategoryType';
import TrainInfoEcharts from 'src/components/line-app/infos/TrainInfoEcharts.vue'; import TrainInfoEcharts from 'src/components/line-app/infos/TrainInfoEcharts.vue';
import { GatedBox } from 'src/graphics/gatedBox/GatedBox'; import { GatedBox } from 'src/graphics/gatedBox/GatedBox';
import { getPublishMapInfoByName } from 'src/api/PublishApi'; import { getPublishMapInfoByName } from 'src/api/PublishApi';
import { useIbpStore } from 'src/stores/ibp-store';
const $q = useQuasar(); const $q = useQuasar();
const canvasWidth = ref(0); const canvasWidth = ref(0);
@ -72,6 +94,7 @@ const headerHeight = ref(0);
const route = useRoute(); const route = useRoute();
const router = useRouter(); const router = useRouter();
const lineStore = useLineStore(); const lineStore = useLineStore();
const ibpStore = useIbpStore();
const testManageStore = useTestManageStore(); const testManageStore = useTestManageStore();
const pslDialog = ref(false); const pslDialog = ref(false);
const simulationId = (route.query.simulationId as string) || ''; const simulationId = (route.query.simulationId as string) || '';
@ -317,6 +340,22 @@ function pslHide() {
pslDialog.value = false; pslDialog.value = false;
} }
watch(
() => ibpStore.isIbpDialogOpen,
(val) => {
if (val === true) {
nextTick(() => {
const container = document.getElementById('ibp-app-container');
console.log(container);
if (!container) return;
const ibpScene = ibpStore.getIbpScene();
ibpScene?.bindDom(container);
ibpScene?.reload();
});
}
}
);
interface LinkParams extends Omit<LinkInfo, 'pid' | 'code'> { interface LinkParams extends Omit<LinkInfo, 'pid' | 'code'> {
name: string; name: string;
pid: string; pid: string;

26
src/stores/ibp-store.ts Normal file
View File

@ -0,0 +1,26 @@
import { defineStore } from 'pinia';
import { initIbpScene } from 'src/drawApp/IbpScene';
import { getLineApp } from 'src/drawApp/lineApp';
export const useIbpStore = defineStore('ibp', {
state: () => ({
lineId: NaN,
lineName: '',
stationCode: '',
ibpMapCode: '',
isIbpDialogOpen: false,
}),
actions: {
getIbpScene() {
const lineApp = getLineApp();
if (!lineApp) return;
const ibpScene = initIbpScene(lineApp, 'ibp');
return ibpScene;
},
setIbpParam(stationCode: string, ibpMapCode: string) {
this.stationCode = stationCode;
this.ibpMapCode = ibpMapCode;
this.isIbpDialogOpen = true;
},
},
});

5370
yarn.lock

File diff suppressed because it is too large Load Diff