From 47005eb430570da68e4ee08188e6256c3a8e0b3f Mon Sep 17 00:00:00 2001 From: dong <58670809@qq.com> Date: Thu, 29 Jun 2023 16:29:48 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=88=86=E9=9A=94?= =?UTF-8?q?=E7=AC=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/draw-app/DrawProperties.vue | 7 +- .../draw-app/properties/SeparatorProperty.vue | 55 +++++ src/drawApp/graphics/SeparatorInteraction.ts | 43 ++++ src/drawApp/graphics/TrainInteraction.ts | 92 +++++++ src/drawApp/index.ts | 11 + src/graphics/separator/Separator.ts | 90 +++++++ .../separator/SeparatorDrawAssistant.ts | 227 ++++++++++++++++++ src/layouts/DrawLayout.vue | 6 + src/protos/stationLayoutGraphics.ts | 141 ++++++++++- 9 files changed, 670 insertions(+), 2 deletions(-) create mode 100644 src/components/draw-app/properties/SeparatorProperty.vue create mode 100644 src/drawApp/graphics/SeparatorInteraction.ts create mode 100644 src/graphics/separator/Separator.ts create mode 100644 src/graphics/separator/SeparatorDrawAssistant.ts diff --git a/src/components/draw-app/DrawProperties.vue b/src/components/draw-app/DrawProperties.vue index 61d68b7..31f4a2b 100644 --- a/src/components/draw-app/DrawProperties.vue +++ b/src/components/draw-app/DrawProperties.vue @@ -81,6 +81,9 @@ + @@ -108,12 +111,13 @@ import TurnoutProperty from './properties/TurnoutProperty.vue'; import SectionProperty from './properties/SectionProperty.vue'; import RunLineProperty from './properties/RunLineProperty.vue'; import PathLineProperty from './properties/PathLineProperty.vue'; +import SeparatorProperty from './properties/SeparatorProperty.vue'; import { Link } from 'src/graphics/link/Link'; import { Rect } from 'src/graphics/rect/Rect'; import { Platform } from 'src/graphics/platform/Platform'; import { Station } from 'src/graphics/station/Station'; import { StationLine } from 'src/graphics/stationLine/StationLine'; -import { Train } from 'src/graphics/train/Train'; +// import { Train } from 'src/graphics/train/Train'; import { useDrawStore } from 'src/stores/draw-store'; import { IscsFan } from 'src/graphics/iscs-fan/IscsFan'; import { Signal } from 'src/graphics/signal/Signal'; @@ -123,6 +127,7 @@ import { Section } from 'src/graphics/section/Section'; import { TrainWindow } from 'src/graphics/trainWindow/TrainWindow'; import { PathLine } from 'src/graphics/pathLine/PathLine'; import { AxleCounting } from 'src/graphics/axleCounting/AxleCounting'; +import { Separator } from 'src/graphics/separator/Separator'; const drawStore = useDrawStore(); diff --git a/src/components/draw-app/properties/SeparatorProperty.vue b/src/components/draw-app/properties/SeparatorProperty.vue new file mode 100644 index 0000000..5785cc1 --- /dev/null +++ b/src/components/draw-app/properties/SeparatorProperty.vue @@ -0,0 +1,55 @@ + + + diff --git a/src/drawApp/graphics/SeparatorInteraction.ts b/src/drawApp/graphics/SeparatorInteraction.ts new file mode 100644 index 0000000..303ca13 --- /dev/null +++ b/src/drawApp/graphics/SeparatorInteraction.ts @@ -0,0 +1,43 @@ +import * as pb_1 from 'google-protobuf'; +import { ISeparatorData, Separator } from 'src/graphics/separator/Separator'; +import { graphicData } from 'src/protos/stationLayoutGraphics'; +import { GraphicDataBase } from './GraphicDataBase'; + +export class SeparatorData extends GraphicDataBase implements ISeparatorData { + constructor(data?: graphicData.Separator) { + let separator; + if (!data) { + separator = new graphicData.Separator({ + common: GraphicDataBase.defaultCommonInfo(Separator.Type), + }); + } else { + separator = data; + } + super(separator); + } + + public get data(): graphicData.Separator { + return this.getData(); + } + get code(): string { + return this.data.code; + } + set code(v: string) { + this.data.code = v; + } + get separatorType(): string { + return this.data.separatorType; + } + set separatorType(v: string) { + this.data.separatorType = v; + } + clone(): SeparatorData { + return new SeparatorData(this.data.cloneMessage()); + } + copyFrom(data: SeparatorData): void { + pb_1.Message.copyInto(data.data, this.data); + } + eq(other: SeparatorData): boolean { + return pb_1.Message.equals(this.data, other.data); + } +} diff --git a/src/drawApp/graphics/TrainInteraction.ts b/src/drawApp/graphics/TrainInteraction.ts index 83d5a1e..95d7f42 100644 --- a/src/drawApp/graphics/TrainInteraction.ts +++ b/src/drawApp/graphics/TrainInteraction.ts @@ -4,6 +4,14 @@ import { graphicData } from 'src/protos/stationLayoutGraphics'; import { GraphicDataBase, GraphicStateBase } from './GraphicDataBase'; import { state } from 'src/protos/device_status'; import { train } from 'src/protos/train'; +import { MenuItemOptions } from 'src/jl-graphic/ui/Menu'; +import { ContextMenu } from 'src/jl-graphic/ui/ContextMenu'; +import { + GraphicApp, + GraphicInteractionPlugin, + JlGraphic, +} from 'src/jl-graphic'; +import { DisplayObject, FederatedMouseEvent } from 'pixi.js'; export class TrainData extends GraphicDataBase implements ITrainData { constructor(data?: graphicData.Train) { @@ -202,3 +210,87 @@ class StateTrain extends train.TrainInfo { } } } + +const negativeDirectionConfig: MenuItemOptions = { + name: '反方向运行', +}; +const HoldTrainConfig: MenuItemOptions = { + name: '扣车', +}; +const openDoorConfig: MenuItemOptions = { + name: '开门', +}; +const editGroupConfig: MenuItemOptions = { + name: '修改车组号', +}; +const TrainOperateMenu: ContextMenu = ContextMenu.init({ + name: '列车操作菜单', + groups: [ + { + items: [ + negativeDirectionConfig, + HoldTrainConfig, + openDoorConfig, + editGroupConfig, + ], + }, + ], +}); + +export class TrainOperateInteraction extends GraphicInteractionPlugin { + static Name = 'train_operate_menu'; + constructor(app: GraphicApp) { + super(TrainOperateInteraction.Name, app); + app.registerMenu(TrainOperateMenu); + } + static init(app: GraphicApp) { + return new TrainOperateInteraction(app); + } + filter(...grahpics: JlGraphic[]): Train[] | undefined { + return grahpics.filter((g) => g.type === Train.Type).map((g) => g as Train); + } + bind(g: Train): void { + g.eventMode = 'static'; + g.cursor = 'pointer'; + g.selectable = true; + g.on('_rightclick', this.onContextMenu, this); + } + + unbind(g: Train): void { + g.selectable = false; + g.eventMode = 'none'; + g.off('_rightclick', this.onContextMenu, this); + } + + onContextMenu(e: FederatedMouseEvent) { + const target = e.target as DisplayObject; + const train = target.getGraphic() as Train; + this.app.updateSelected(train); + negativeDirectionConfig.handler = () => { + const mode = train.states.mode; + if (!train.states.mode.ipModeTrainDirUp) { + mode.ipModeTrainDirUp = true; + mode.ipModeTrainDirDown = false; + } else if (!train.states.mode.ipModeTrainDirDown) { + mode.ipModeTrainDirUp = false; + mode.ipModeTrainDirDown = true; + } + train.chagneDirection(); + }; + HoldTrainConfig.handler = () => { + train.states.mode.ipModeTrainHolded = + !train.states.mode.ipModeTrainHolded; + train.chagneState(); + }; + openDoorConfig.handler = () => { + train.states.mode.ipModeTrainDoorOpen = + !train.states.mode.ipModeTrainDoorOpen; + train.chagneState(); + }; + editGroupConfig.handler = () => { + train.states.trainId = '022'; + train.doRepaint(); + }; + TrainOperateMenu.open(e.global); + } +} diff --git a/src/drawApp/index.ts b/src/drawApp/index.ts index 76733af..b45f48e 100644 --- a/src/drawApp/index.ts +++ b/src/drawApp/index.ts @@ -79,6 +79,9 @@ import { PathLine, PathLineTemplate } from 'src/graphics/pathLine/PathLine'; import { PathLineDraw } from 'src/graphics/pathLine/PathLineDrawAssistant'; import { PathLineData } from './graphics/PathLineInteraction'; import { toStorageTransform } from './graphics/GraphicDataBase'; +import { SeparatorDraw } from 'src/graphics/separator/SeparatorDrawAssistant'; +import { Separator, SeparatorTemplate } from 'src/graphics/separator/Separator'; +import { SeparatorData } from './graphics/SeparatorInteraction'; // export function fromStoragePoint(p: graphicData.Point): Point { // return new Point(p.x, p.y); @@ -165,6 +168,7 @@ export function initDrawApp(dom: HTMLElement): JlDrawApp { | TrainDraw | OneClickGenerateDraw | AxleCountingDraw + | SeparatorDraw )[] = []; if (draftType === 'Line') { drawAssistants = [ @@ -189,6 +193,7 @@ export function initDrawApp(dom: HTMLElement): JlDrawApp { app, new AxleCountingTemplate(new AxleCountingData()) ), + new SeparatorDraw(app, new SeparatorTemplate(new SeparatorData())), ]; DrawSignalInteraction.init(app); } else { @@ -305,6 +310,9 @@ export function saveDrawDatas(app: JlDrawApp) { } else if (AxleCounting.Type === g.type) { const axleCountingData = (g as AxleCounting).saveData(); storage.axleCountings.push((axleCountingData as AxleCountingData).data); + } else if (Separator.Type === g.type) { + const separatorData = (g as Separator).saveData(); + storage.separators.push((separatorData as SeparatorData).data); } }); const base64 = fromUint8Array(storage.serialize()); @@ -375,6 +383,9 @@ export async function loadDrawDatas(app: GraphicApp) { storage.axleCountings.forEach((axleCounting) => { datas.push(new AxleCountingData(axleCounting)); }); + storage.separators.forEach((separator) => { + datas.push(new SeparatorData(separator)); + }); app.loadGraphic(datas); } else { app.loadGraphic([]); diff --git a/src/graphics/separator/Separator.ts b/src/graphics/separator/Separator.ts new file mode 100644 index 0000000..5a7e27d --- /dev/null +++ b/src/graphics/separator/Separator.ts @@ -0,0 +1,90 @@ +import { Color, Graphics } from 'pixi.js'; +import { GraphicData, JlGraphic, JlGraphicTemplate } from 'src/jl-graphic'; + +export interface ISeparatorData extends GraphicData { + get code(): string; // 编号 + set code(v: string); + get separatorType(): string; // 类型 + set separatorType(v: string); + clone(): ISeparatorData; + copyFrom(data: ISeparatorData): void; + eq(other: ISeparatorData): boolean; +} + +export enum separatorTypeEnum { + turnout = 'turnout', // 道岔分隔符 + endA = 'endA', // A端尽头分隔符 + endB = 'endB', // B端尽头分隔符 + section = 'section', // 区段分隔符 +} + +export const SeparatorConsts = { + height: 15, + lineWidth: 2, + lineColor: '0x617799', + circleColor: '0xEF0200', + radius: 5, +}; + +export class Separator extends JlGraphic { + static Type = 'Separator'; + rectGraphic: Graphics = new Graphics(); + circleGraphic: Graphics = new Graphics(); + constructor() { + super(Separator.Type); + this.addChild(this.rectGraphic); + this.addChild(this.circleGraphic); + } + get datas(): ISeparatorData { + return this.getDatas(); + } + doRepaint(): void { + const rectGraphic = this.rectGraphic; + rectGraphic.clear(); + if (!this.datas.separatorType) { + this.datas.separatorType = separatorTypeEnum.endA; + } + const typeArr = ['section', 'turnout']; + if (typeArr.includes(this.datas.separatorType)) { + rectGraphic.lineStyle( + SeparatorConsts.lineWidth, + new Color(SeparatorConsts.lineColor) + ); + rectGraphic.moveTo(0, -SeparatorConsts.height / 2); + rectGraphic.lineTo(0, SeparatorConsts.height / 2); + if (this.datas.separatorType == 'turnout') { + this.circleGraphic.lineStyle(1, SeparatorConsts.circleColor); + this.circleGraphic.drawCircle(0, 0, SeparatorConsts.radius); + } + } + const endTypeArr = ['endA', 'endB']; + if (endTypeArr.includes(this.datas.separatorType)) { + let d = SeparatorConsts.radius; + if (this.datas.separatorType == 'endB') { + d = -d; + } + rectGraphic.lineStyle( + SeparatorConsts.lineWidth, + new Color(SeparatorConsts.lineColor) + ); + rectGraphic.moveTo(0, 0); + rectGraphic.lineTo(-d, 0); + rectGraphic.lineTo(-d, -d); + rectGraphic.lineTo(-d * 3, -d); + rectGraphic.moveTo(-d, 0); + rectGraphic.lineTo(-d, d); + rectGraphic.lineTo(-d * 3, d); + } + } +} + +export class SeparatorTemplate extends JlGraphicTemplate { + constructor(dataTemplate: ISeparatorData) { + super(Separator.Type, { + dataTemplate, + }); + } + new(): Separator { + return new Separator(); + } +} diff --git a/src/graphics/separator/SeparatorDrawAssistant.ts b/src/graphics/separator/SeparatorDrawAssistant.ts new file mode 100644 index 0000000..a315d21 --- /dev/null +++ b/src/graphics/separator/SeparatorDrawAssistant.ts @@ -0,0 +1,227 @@ +import { FederatedPointerEvent, IHitArea, IPointData, Point } from 'pixi.js'; +import { + GraphicDrawAssistant, + GraphicIdGenerator, + GraphicInteractionPlugin, + GraphicRelation, + GraphicRelationParam, + GraphicStore, + JlDrawApp, + JlGraphic, + distance2, + linePoint, +} from 'src/jl-graphic'; +import { Section } from '../section/Section'; +import { + ISeparatorData, + Separator, + SeparatorConsts, + SeparatorTemplate, + separatorTypeEnum, +} from './Separator'; +import { SeparatorData } from 'src/drawApp/graphics/SeparatorInteraction'; +import { Turnout } from '../turnout/Turnout'; + +export class SeparatorDraw extends GraphicDrawAssistant< + SeparatorTemplate, + ISeparatorData +> { + SeparatorGraph: Separator; + constructor(app: JlDrawApp, template: SeparatorTemplate) { + super(app, template, 'sym_o_square', '不展示1'); + this.SeparatorGraph = this.graphicTemplate.new(); + this.container.addChild(this.SeparatorGraph); + SeparatorInteraction.init(app); + } + + bind(): void { + super.bind(); + this.SeparatorGraph.loadData(this.graphicTemplate.datas); + this.SeparatorGraph.doRepaint(); + } + + onLeftDown(e: FederatedPointerEvent): void { + this.container.position.copyFrom(this.toCanvasCoordinates(e.global)); + this.createAndStore(true); + } + + redraw(p: Point): void { + this.container.position.copyFrom(p); + } + + prepareData(data: ISeparatorData): boolean { + data.transform = this.container.saveTransform(); + return true; + } + oneGenerates() { + const SeparatorAll = this.app.queryStore.queryByType( + Separator.Type + ); + this.app.deleteGraphics(...SeparatorAll); + const rMap = new Map(); + const sections = this.app.queryStore.queryByType
(Section.Type); + const turnouts = this.app.queryStore.queryByType(Turnout.Type); + function setKey(gr: GraphicRelationParam): string { + let key = ''; + key = `${gr.g.id}_${gr.param}`; + return key; + } + sections.forEach((section) => { + const allR = section.relationManage.getRelationsOfGraphic(section); + const port: string[] = []; + allR.forEach((relation, index) => { + const r = relation.getRelationParam(section); + port.push(r.param); + const other = relation.getOtherRelationParam(section); + if (!rMap.has(setKey(r))) { + rMap.set(setKey(r), { ...r }); + } + if (!rMap.has(setKey(other))) { + rMap.set(setKey(other), { ...other, repetition: true }); + } + if (index == allR.length - 1) { + if (!port.includes('A')) { + rMap.set(`${section.id}_A`, { + g: section, + param: 'A', + separatorType: separatorTypeEnum.endA, + }); + } + if (!port.includes('B')) { + rMap.set(`${section.id}_B`, { + g: section, + param: 'B', + separatorType: separatorTypeEnum.endB, + }); + } + } + }); + }); + turnouts.forEach((turnout) => { + const allR = turnout.relationManage.getRelationsOfGraphic(turnout); + const port: string[] = []; + allR.forEach((relation, index) => { + const r = relation.getRelationParam(turnout); + port.push(r.param); + const other = relation.getOtherRelationParam(turnout); + if (!rMap.has(setKey(r)) && r.param == 'C') { + rMap.set(setKey(r), { + ...r, + separatorType: separatorTypeEnum.turnout, + }); + } + if (!rMap.has(setKey(other)) && other.param == 'C') { + rMap.set(setKey(other), { + ...other, + separatorType: separatorTypeEnum.turnout, + repetition: true, + }); + } + if (index == allR.length - 1) { + if (!port.includes('A')) { + rMap.set(`${turnout.id}_A`, { + g: turnout, + param: 'A', + separatorType: separatorTypeEnum.endB, + }); + } + if (!port.includes('B')) { + rMap.set(`${turnout.id}_B`, { + g: turnout, + param: 'B', + separatorType: separatorTypeEnum.endA, + }); + } + } + }); + }); + rMap.forEach((item) => { + if (!item.repetition) { + const sType = item.separatorType || separatorTypeEnum.section; + const separator = new Separator(); + const data = new SeparatorData(); + data.separatorType = sType; + separator.loadData(data); + let p; + if (item.g.type == Section.Type) { + p = item.g.getStartPoint(); + if (item.param == 'B') { + p = item.g.getEndPoint(); + } + } else if (item.g.type == Turnout.Type) { + const ps = item.g.getPortPoints(); + let l = 2; + if (item.param == 'A') { + l = 0; + } else if (item.param == 'B') { + l = 1; + } + p = ps[l][0]; + } + const tps = item.g.localToCanvasPoint(p); + separator.position.set(tps.x, tps.y); + separator.id = GraphicIdGenerator.next(); + this.storeGraphic(separator); + } + }); + } +} + +//碰撞检测 +export class SeparatorGraphicHitArea implements IHitArea { + separator: Separator; + constructor(separator: Separator) { + this.separator = separator; + } + contains(x: number, y: number): boolean { + let contains = false; + const endTypeArr = ['endA', 'endB']; + let d = SeparatorConsts.radius; + if (endTypeArr.includes(this.separator.datas.separatorType)) { + if (this.separator.datas.separatorType == 'endB') { + d = -d; + } + const tolerance = SeparatorConsts.lineWidth; + const p1 = new Point(0, 0); + const p2 = new Point(-d, 0); + const p3 = new Point(-d, -d); + const p4 = new Point(-d * 3, -d); + const p5 = new Point(-d, d); + const p6 = new Point(-d * 3, d); + const p = new Point(x, y); + contains = contains || linePoint(p1, p2, p, tolerance); + contains = contains || linePoint(p2, p3, p, tolerance); + contains = contains || linePoint(p3, p4, p, tolerance); + contains = contains || linePoint(p2, p5, p, tolerance); + contains = contains || linePoint(p5, p6, p, tolerance); + } + return contains; + } +} + +export class SeparatorInteraction extends GraphicInteractionPlugin { + static Name = 'Separator_transform'; + constructor(app: JlDrawApp) { + super(SeparatorInteraction.Name, app); + } + static init(app: JlDrawApp) { + return new SeparatorInteraction(app); + } + filter(...grahpics: JlGraphic[]): Separator[] | undefined { + return grahpics + .filter((g) => g.type === Separator.Type) + .map((g) => g as Separator); + } + bind(g: Separator): void { + g.eventMode = 'static'; + g.cursor = 'pointer'; + g.scalable = true; + g.rotatable = true; + g.rectGraphic.hitArea = new SeparatorGraphicHitArea(g); + } + unbind(g: Separator): void { + g.eventMode = 'none'; + g.scalable = false; + g.rotatable = false; + } +} diff --git a/src/layouts/DrawLayout.vue b/src/layouts/DrawLayout.vue index 16ee051..c850163 100644 --- a/src/layouts/DrawLayout.vue +++ b/src/layouts/DrawLayout.vue @@ -178,6 +178,8 @@ import { errorNotify, successNotify } from 'src/utils/CommonNotify'; import { saveAsDraft } from 'src/api/DraftApi'; import { ApiError } from 'src/boot/axios'; import { OneClickGenerate } from 'src/graphics/trainWindow/oneClickDrawAssistant'; +import { Separator } from 'src/graphics/separator/Separator'; +import { SeparatorDraw } from 'src/graphics/separator/SeparatorDrawAssistant'; const route = useRoute(); const router = useRouter(); @@ -303,6 +305,10 @@ function buildRelations() { } function oneClickGeneration() { + const separatorDraw = drawStore + .getDrawApp() + .getDrawAssistant(Separator.Type) as SeparatorDraw; + separatorDraw.oneGenerates(); drawStore.getDrawApp().interactionPlugin(OneClickGenerate.Type).resume(); } diff --git a/src/protos/stationLayoutGraphics.ts b/src/protos/stationLayoutGraphics.ts index e72c60c..da66860 100644 --- a/src/protos/stationLayoutGraphics.ts +++ b/src/protos/stationLayoutGraphics.ts @@ -25,9 +25,10 @@ export namespace graphicData { polygons?: Polygon[]; trainWindows?: TrainWindow[]; axleCountings?: AxleCounting[]; + separators?: Separator[]; }) { super(); - pb_1.Message.initialize(this, Array.isArray(data) ? data : [], 0, -1, [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17], this.#one_of_decls); + pb_1.Message.initialize(this, Array.isArray(data) ? data : [], 0, -1, [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18], this.#one_of_decls); if (!Array.isArray(data) && typeof data == "object") { if ("canvas" in data && data.canvas != undefined) { this.canvas = data.canvas; @@ -80,6 +81,9 @@ export namespace graphicData { if ("axleCountings" in data && data.axleCountings != undefined) { this.axleCountings = data.axleCountings; } + if ("separators" in data && data.separators != undefined) { + this.separators = data.separators; + } } } get canvas() { @@ -187,6 +191,12 @@ export namespace graphicData { set axleCountings(value: AxleCounting[]) { pb_1.Message.setRepeatedWrapperField(this, 17, value); } + get separators() { + return pb_1.Message.getRepeatedWrapperField(this, Separator, 18) as Separator[]; + } + set separators(value: Separator[]) { + pb_1.Message.setRepeatedWrapperField(this, 18, value); + } static fromObject(data: { canvas?: ReturnType; links?: ReturnType[]; @@ -205,6 +215,7 @@ export namespace graphicData { polygons?: ReturnType[]; trainWindows?: ReturnType[]; axleCountings?: ReturnType[]; + separators?: ReturnType[]; }): RtssGraphicStorage { const message = new RtssGraphicStorage({}); if (data.canvas != null) { @@ -258,6 +269,9 @@ export namespace graphicData { if (data.axleCountings != null) { message.axleCountings = data.axleCountings.map(item => AxleCounting.fromObject(item)); } + if (data.separators != null) { + message.separators = data.separators.map(item => Separator.fromObject(item)); + } return message; } toObject() { @@ -279,6 +293,7 @@ export namespace graphicData { polygons?: ReturnType[]; trainWindows?: ReturnType[]; axleCountings?: ReturnType[]; + separators?: ReturnType[]; } = {}; if (this.canvas != null) { data.canvas = this.canvas.toObject(); @@ -331,6 +346,9 @@ export namespace graphicData { if (this.axleCountings != null) { data.axleCountings = this.axleCountings.map((item: AxleCounting) => item.toObject()); } + if (this.separators != null) { + data.separators = this.separators.map((item: Separator) => item.toObject()); + } return data; } serialize(): Uint8Array; @@ -371,6 +389,8 @@ export namespace graphicData { writer.writeRepeatedMessage(16, this.trainWindows, (item: TrainWindow) => item.serialize(writer)); if (this.axleCountings.length) writer.writeRepeatedMessage(17, this.axleCountings, (item: AxleCounting) => item.serialize(writer)); + if (this.separators.length) + writer.writeRepeatedMessage(18, this.separators, (item: Separator) => item.serialize(writer)); if (!w) return writer.getResultBuffer(); } @@ -431,6 +451,9 @@ export namespace graphicData { case 17: reader.readMessage(message.axleCountings, () => pb_1.Message.addToRepeatedWrapperField(message, 17, AxleCounting.deserialize(reader), AxleCounting)); break; + case 18: + reader.readMessage(message.separators, () => pb_1.Message.addToRepeatedWrapperField(message, 18, Separator.deserialize(reader), Separator)); + break; default: reader.skipField(); } } @@ -3955,4 +3978,120 @@ export namespace graphicData { C = 2 } } + export class Separator extends pb_1.Message { + #one_of_decls: number[][] = []; + constructor(data?: any[] | { + common?: CommonInfo; + code?: string; + separatorType?: string; + }) { + super(); + pb_1.Message.initialize(this, Array.isArray(data) ? data : [], 0, -1, [], this.#one_of_decls); + if (!Array.isArray(data) && typeof data == "object") { + if ("common" in data && data.common != undefined) { + this.common = data.common; + } + if ("code" in data && data.code != undefined) { + this.code = data.code; + } + if ("separatorType" in data && data.separatorType != undefined) { + this.separatorType = data.separatorType; + } + } + } + get common() { + return pb_1.Message.getWrapperField(this, CommonInfo, 1) as CommonInfo; + } + set common(value: CommonInfo) { + pb_1.Message.setWrapperField(this, 1, value); + } + get has_common() { + return pb_1.Message.getField(this, 1) != null; + } + get code() { + return pb_1.Message.getFieldWithDefault(this, 2, "") as string; + } + set code(value: string) { + pb_1.Message.setField(this, 2, value); + } + get separatorType() { + return pb_1.Message.getFieldWithDefault(this, 3, "") as string; + } + set separatorType(value: string) { + pb_1.Message.setField(this, 3, value); + } + static fromObject(data: { + common?: ReturnType; + code?: string; + separatorType?: string; + }): Separator { + const message = new Separator({}); + if (data.common != null) { + message.common = CommonInfo.fromObject(data.common); + } + if (data.code != null) { + message.code = data.code; + } + if (data.separatorType != null) { + message.separatorType = data.separatorType; + } + return message; + } + toObject() { + const data: { + common?: ReturnType; + code?: string; + separatorType?: string; + } = {}; + if (this.common != null) { + data.common = this.common.toObject(); + } + if (this.code != null) { + data.code = this.code; + } + if (this.separatorType != null) { + data.separatorType = this.separatorType; + } + return data; + } + serialize(): Uint8Array; + serialize(w: pb_1.BinaryWriter): void; + serialize(w?: pb_1.BinaryWriter): Uint8Array | void { + const writer = w || new pb_1.BinaryWriter(); + if (this.has_common) + writer.writeMessage(1, this.common, () => this.common.serialize(writer)); + if (this.code.length) + writer.writeString(2, this.code); + if (this.separatorType.length) + writer.writeString(3, this.separatorType); + if (!w) + return writer.getResultBuffer(); + } + static deserialize(bytes: Uint8Array | pb_1.BinaryReader): Separator { + const reader = bytes instanceof pb_1.BinaryReader ? bytes : new pb_1.BinaryReader(bytes), message = new Separator(); + while (reader.nextField()) { + if (reader.isEndGroup()) + break; + switch (reader.getFieldNumber()) { + case 1: + reader.readMessage(message.common, () => message.common = CommonInfo.deserialize(reader)); + break; + case 2: + message.code = reader.readString(); + break; + case 3: + message.separatorType = reader.readString(); + break; + default: reader.skipField(); + } + } + return message; + } + serializeBinary(): Uint8Array { + return this.serialize(); + } + static deserializeBinary(bytes: Uint8Array): Separator { + return Separator.deserialize(bytes); + } + } } From 3f7014066d8e04f46cc12bf5f3672ae4cdbc5eee Mon Sep 17 00:00:00 2001 From: dong <58670809@qq.com> Date: Thu, 29 Jun 2023 16:34:11 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E5=88=86=E9=9A=94=E7=AC=A6=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/graphics/separator/SeparatorDrawAssistant.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/graphics/separator/SeparatorDrawAssistant.ts b/src/graphics/separator/SeparatorDrawAssistant.ts index a315d21..af4d9ee 100644 --- a/src/graphics/separator/SeparatorDrawAssistant.ts +++ b/src/graphics/separator/SeparatorDrawAssistant.ts @@ -1,14 +1,11 @@ -import { FederatedPointerEvent, IHitArea, IPointData, Point } from 'pixi.js'; +import { FederatedPointerEvent, IHitArea, Point } from 'pixi.js'; import { GraphicDrawAssistant, GraphicIdGenerator, GraphicInteractionPlugin, - GraphicRelation, GraphicRelationParam, - GraphicStore, JlDrawApp, JlGraphic, - distance2, linePoint, } from 'src/jl-graphic'; import { Section } from '../section/Section'; @@ -28,7 +25,7 @@ export class SeparatorDraw extends GraphicDrawAssistant< > { SeparatorGraph: Separator; constructor(app: JlDrawApp, template: SeparatorTemplate) { - super(app, template, 'sym_o_square', '不展示1'); + super(app, template, 'sym_o_square', '不展示'); this.SeparatorGraph = this.graphicTemplate.new(); this.container.addChild(this.SeparatorGraph); SeparatorInteraction.init(app); From 04c4b8908e1fb01e38dea01d819a7e999d8929d5 Mon Sep 17 00:00:00 2001 From: joylink_zhaoerwei Date: Thu, 29 Jun 2023 16:51:53 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E5=85=AC=E9=87=8C=E6=A0=87--=E8=BD=A6?= =?UTF-8?q?=E7=AB=99=E5=92=8C=E8=AE=A1=E8=BD=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../properties/AxleCountingProperty.vue | 40 +++++++++-- .../draw-app/properties/StationProperty.vue | 40 +++++++++-- .../graphics/AxleCountingInteraction.ts | 11 +-- src/drawApp/graphics/StationInteraction.ts | 11 ++- src/graphics/axleCounting/AxleCounting.ts | 5 +- src/graphics/station/Station.ts | 17 +++-- src/protos/stationLayoutGraphics.ts | 72 ++++++++++--------- 7 files changed, 133 insertions(+), 63 deletions(-) diff --git a/src/components/draw-app/properties/AxleCountingProperty.vue b/src/components/draw-app/properties/AxleCountingProperty.vue index c273ae4..1d29693 100644 --- a/src/components/draw-app/properties/AxleCountingProperty.vue +++ b/src/components/draw-app/properties/AxleCountingProperty.vue @@ -16,14 +16,23 @@ lazy-rules autogrow /> + @@ -72,6 +81,13 @@ import { computed, onMounted, reactive, watch } from 'vue'; const drawStore = useDrawStore(); const axleCountingModel = reactive(new AxleCountingData()); +const kilometerSystem = reactive({ coordinateSystem: '', kilometer: 0 }); + +const CoordinateSystemOptions = [ + { label: '车辆段', value: 'DEPOT' }, + { label: '停车场', value: 'PARKING_LOT' }, + { label: '正线', value: 'MAIN_LINE' }, +]; drawStore.$subscribe; watch( @@ -79,6 +95,11 @@ watch( (val) => { if (val && val.type == AxleCounting.Type) { axleCountingModel.copyFrom(val.saveData() as AxleCountingData); + if (axleCountingModel.kilometerSystem) { + kilometerSystem.coordinateSystem = + axleCountingModel.kilometerSystem.coordinateSystem; + kilometerSystem.kilometer = axleCountingModel.kilometerSystem.kilometer; + } } } ); @@ -87,11 +108,20 @@ onMounted(() => { const axleCounting = drawStore.selectedGraphic as AxleCounting; if (axleCounting) { axleCountingModel.copyFrom(axleCounting.saveData()); + if (axleCountingModel.kilometerSystem) { + kilometerSystem.coordinateSystem = + axleCountingModel.kilometerSystem.coordinateSystem; + kilometerSystem.kilometer = axleCountingModel.kilometerSystem.kilometer; + } } }); function onUpdate() { const axleCounting = drawStore.selectedGraphic as AxleCounting; + axleCountingModel.kilometerSystem = { + coordinateSystem: kilometerSystem.coordinateSystem, + kilometer: kilometerSystem.kilometer, + }; if (axleCounting) { drawStore .getDrawApp() diff --git a/src/components/draw-app/properties/StationProperty.vue b/src/components/draw-app/properties/StationProperty.vue index 7a7f49b..56663ff 100644 --- a/src/components/draw-app/properties/StationProperty.vue +++ b/src/components/draw-app/properties/StationProperty.vue @@ -10,14 +10,23 @@ lazy-rules autogrow /> + { concentrationStations.value = (showSelectData as never)[ stationModel.concentrationStations + '' ]; + if (stationModel.kilometerSystem) { + kilometerSystem.coordinateSystem = + stationModel.kilometerSystem.coordinateSystem; + kilometerSystem.kilometer = stationModel.kilometerSystem.kilometer; + } } }); @@ -88,6 +114,10 @@ function onUpdate() { stationModel.concentrationStations = JSON.parse( (showSelect as never)[concentrationStations.value] ); + stationModel.kilometerSystem = { + coordinateSystem: kilometerSystem.coordinateSystem, + kilometer: kilometerSystem.kilometer, + }; const station = drawStore.selectedGraphic as Station; if (station) { drawStore.getDrawApp().updateGraphicAndRecord(station, stationModel); diff --git a/src/drawApp/graphics/AxleCountingInteraction.ts b/src/drawApp/graphics/AxleCountingInteraction.ts index 7498c9c..ed80bfd 100644 --- a/src/drawApp/graphics/AxleCountingInteraction.ts +++ b/src/drawApp/graphics/AxleCountingInteraction.ts @@ -5,6 +5,7 @@ import { } from 'src/graphics/axleCounting/AxleCounting'; import { graphicData } from 'src/protos/stationLayoutGraphics'; import { GraphicDataBase } from './GraphicDataBase'; +import { KilometerSystem } from 'src/graphics/signal/Signal'; export class AxleCountingData extends GraphicDataBase @@ -31,17 +32,17 @@ export class AxleCountingData set code(v: string) { this.data.code = v; } - get kilometerCode(): string { - return this.data.kilometerCode; + get kilometerSystem(): KilometerSystem { + return this.data.kilometerSystem; } - set kilometerCode(v: string) { - this.data.kilometerCode = v; + set kilometerSystem(v: KilometerSystem) { + this.data.kilometerSystem = new graphicData.KilometerSystem(v); } get axleCountingRef(): graphicData.RelatedRef[] { return this.data.axleCountingRef; } set axleCountingRef(points: graphicData.RelatedRef[]) { - this.data.axleCountingRef=points + this.data.axleCountingRef = points; } clone(): AxleCountingData { return new AxleCountingData(this.data.cloneMessage()); diff --git a/src/drawApp/graphics/StationInteraction.ts b/src/drawApp/graphics/StationInteraction.ts index df32f2d..398cd24 100644 --- a/src/drawApp/graphics/StationInteraction.ts +++ b/src/drawApp/graphics/StationInteraction.ts @@ -15,6 +15,7 @@ import { JlGraphic, } from 'src/jl-graphic'; import { DisplayObject, FederatedMouseEvent } from 'pixi.js'; +import { KilometerSystem } from 'src/graphics/signal/Signal'; export class StationData extends GraphicDataBase implements IStationData { constructor(data?: graphicData.Station) { @@ -38,11 +39,11 @@ export class StationData extends GraphicDataBase implements IStationData { set code(v: string) { this.data.code = v; } - get kilometerCode(): string { - return this.data.kilometerCode; + get kilometerSystem(): KilometerSystem { + return this.data.kilometerSystem; } - set kilometerCode(v: string) { - this.data.kilometerCode = v; + set kilometerSystem(v: KilometerSystem) { + this.data.kilometerSystem = new graphicData.KilometerSystem(v); } get hasControl(): boolean { return this.data.hasControl; @@ -164,12 +165,10 @@ export class StationOperateInteraction extends GraphicInteractionPlugin powerUnlockConfig.handler = () => { station.states.ipRtuStusInLocalCtrl = true; station.doRepaint(); - console.log(2222); }; chainConfig.handler = () => { station.states.ipRtuStusDown = true; station.doRepaint(); - console.log(2222); }; removeChainConfig.handler = () => { console.log(2222); diff --git a/src/graphics/axleCounting/AxleCounting.ts b/src/graphics/axleCounting/AxleCounting.ts index 75876c7..d6fa539 100644 --- a/src/graphics/axleCounting/AxleCounting.ts +++ b/src/graphics/axleCounting/AxleCounting.ts @@ -7,12 +7,13 @@ import { VectorText, } from 'src/jl-graphic'; import { IRelatedRefData, protoPort2Data } from '../CommonGraphics'; +import { KilometerSystem } from '../signal/Signal'; export interface IAxleCountingData extends GraphicData { get code(): string; // 编号 set code(v: string); - get kilometerCode(): string; // 公里标 - set kilometerCode(v: string); + get kilometerSystem(): KilometerSystem; + set kilometerSystem(v: KilometerSystem); get axleCountingRef(): IRelatedRefData[]; //关联的设备 set axleCountingRef(ref: IRelatedRefData[]); clone(): IAxleCountingData; diff --git a/src/graphics/station/Station.ts b/src/graphics/station/Station.ts index d9ffe72..1956a58 100644 --- a/src/graphics/station/Station.ts +++ b/src/graphics/station/Station.ts @@ -6,12 +6,13 @@ import { JlGraphicTemplate, VectorText, } from 'src/jl-graphic'; +import { KilometerSystem } from '../signal/Signal'; export interface IStationData extends GraphicData { get code(): string; // 编号 set code(v: string); - get kilometerCode(): string; // 公里标 - set kilometerCode(v: string); + get kilometerSystem(): KilometerSystem; + set kilometerSystem(v: KilometerSystem); get hasControl(): boolean; /// 是否有控制 set hasControl(v: boolean); get concentrationStations(): boolean; ////是否集中站 @@ -174,16 +175,18 @@ export class Station extends JlGraphic { codeGraph.style.fill = stationConsts.codeColor; codeGraph.setVectorFontSize(stationConsts.codeFontSize); codeGraph.anchor.set(0.5); - const kilometerCode = this.datas?.kilometerCode || 12345.67; - if (Math.floor(Number(kilometerCode)).toString().length > 3) { - const kiloBit = Math.floor(Number(kilometerCode) / 1000).toString(); + const kilometerCode = this.datas.kilometerSystem?.kilometer || 12345678; + if (Math.floor(kilometerCode * 1000).toString().length > 3) { + const kiloBit = Math.floor(Number(kilometerCode) / 1000000).toString(); kilometerGraph.text = 'K' + kiloBit + '+' + - kilometerCode.toString().substring(kiloBit.length); + ( + Number(kilometerCode.toString().substring(kiloBit.length)) / 1000 + ).toFixed(3); } else { - kilometerGraph.text = kilometerCode; + kilometerGraph.text = (kilometerCode * 1000).toFixed(3); } kilometerGraph.style.fill = stationConsts.kilometerCodeColor; kilometerGraph.setVectorFontSize(stationConsts.kilometerCodeFontSize); diff --git a/src/protos/stationLayoutGraphics.ts b/src/protos/stationLayoutGraphics.ts index da66860..7f078f6 100644 --- a/src/protos/stationLayoutGraphics.ts +++ b/src/protos/stationLayoutGraphics.ts @@ -1822,7 +1822,7 @@ export namespace graphicData { code?: string; hasControl?: boolean; concentrationStations?: boolean; - kilometerCode?: string; + kilometerSystem?: KilometerSystem; }) { super(); pb_1.Message.initialize(this, Array.isArray(data) ? data : [], 0, -1, [], this.#one_of_decls); @@ -1839,8 +1839,8 @@ export namespace graphicData { if ("concentrationStations" in data && data.concentrationStations != undefined) { this.concentrationStations = data.concentrationStations; } - if ("kilometerCode" in data && data.kilometerCode != undefined) { - this.kilometerCode = data.kilometerCode; + if ("kilometerSystem" in data && data.kilometerSystem != undefined) { + this.kilometerSystem = data.kilometerSystem; } } } @@ -1871,18 +1871,21 @@ export namespace graphicData { set concentrationStations(value: boolean) { pb_1.Message.setField(this, 4, value); } - get kilometerCode() { - return pb_1.Message.getFieldWithDefault(this, 5, "") as string; + get kilometerSystem() { + return pb_1.Message.getWrapperField(this, KilometerSystem, 6) as KilometerSystem; } - set kilometerCode(value: string) { - pb_1.Message.setField(this, 5, value); + set kilometerSystem(value: KilometerSystem) { + pb_1.Message.setWrapperField(this, 6, value); + } + get has_kilometerSystem() { + return pb_1.Message.getField(this, 6) != null; } static fromObject(data: { common?: ReturnType; code?: string; hasControl?: boolean; concentrationStations?: boolean; - kilometerCode?: string; + kilometerSystem?: ReturnType; }): Station { const message = new Station({}); if (data.common != null) { @@ -1897,8 +1900,8 @@ export namespace graphicData { if (data.concentrationStations != null) { message.concentrationStations = data.concentrationStations; } - if (data.kilometerCode != null) { - message.kilometerCode = data.kilometerCode; + if (data.kilometerSystem != null) { + message.kilometerSystem = KilometerSystem.fromObject(data.kilometerSystem); } return message; } @@ -1908,7 +1911,7 @@ export namespace graphicData { code?: string; hasControl?: boolean; concentrationStations?: boolean; - kilometerCode?: string; + kilometerSystem?: ReturnType; } = {}; if (this.common != null) { data.common = this.common.toObject(); @@ -1922,8 +1925,8 @@ export namespace graphicData { if (this.concentrationStations != null) { data.concentrationStations = this.concentrationStations; } - if (this.kilometerCode != null) { - data.kilometerCode = this.kilometerCode; + if (this.kilometerSystem != null) { + data.kilometerSystem = this.kilometerSystem.toObject(); } return data; } @@ -1939,8 +1942,8 @@ export namespace graphicData { writer.writeBool(3, this.hasControl); if (this.concentrationStations != false) writer.writeBool(4, this.concentrationStations); - if (this.kilometerCode.length) - writer.writeString(5, this.kilometerCode); + if (this.has_kilometerSystem) + writer.writeMessage(6, this.kilometerSystem, () => this.kilometerSystem.serialize(writer)); if (!w) return writer.getResultBuffer(); } @@ -1962,8 +1965,8 @@ export namespace graphicData { case 4: message.concentrationStations = reader.readBool(); break; - case 5: - message.kilometerCode = reader.readString(); + case 6: + reader.readMessage(message.kilometerSystem, () => message.kilometerSystem = KilometerSystem.deserialize(reader)); break; default: reader.skipField(); } @@ -2237,7 +2240,7 @@ export namespace graphicData { constructor(data?: any[] | { common?: CommonInfo; code?: string; - kilometerCode?: string; + kilometerSystem?: KilometerSystem; axleCountingRef?: RelatedRef[]; }) { super(); @@ -2249,8 +2252,8 @@ export namespace graphicData { if ("code" in data && data.code != undefined) { this.code = data.code; } - if ("kilometerCode" in data && data.kilometerCode != undefined) { - this.kilometerCode = data.kilometerCode; + if ("kilometerSystem" in data && data.kilometerSystem != undefined) { + this.kilometerSystem = data.kilometerSystem; } if ("axleCountingRef" in data && data.axleCountingRef != undefined) { this.axleCountingRef = data.axleCountingRef; @@ -2272,11 +2275,14 @@ export namespace graphicData { set code(value: string) { pb_1.Message.setField(this, 2, value); } - get kilometerCode() { - return pb_1.Message.getFieldWithDefault(this, 3, "") as string; + get kilometerSystem() { + return pb_1.Message.getWrapperField(this, KilometerSystem, 3) as KilometerSystem; } - set kilometerCode(value: string) { - pb_1.Message.setField(this, 3, value); + set kilometerSystem(value: KilometerSystem) { + pb_1.Message.setWrapperField(this, 3, value); + } + get has_kilometerSystem() { + return pb_1.Message.getField(this, 3) != null; } get axleCountingRef() { return pb_1.Message.getRepeatedWrapperField(this, RelatedRef, 4) as RelatedRef[]; @@ -2287,7 +2293,7 @@ export namespace graphicData { static fromObject(data: { common?: ReturnType; code?: string; - kilometerCode?: string; + kilometerSystem?: ReturnType; axleCountingRef?: ReturnType[]; }): AxleCounting { const message = new AxleCounting({}); @@ -2297,8 +2303,8 @@ export namespace graphicData { if (data.code != null) { message.code = data.code; } - if (data.kilometerCode != null) { - message.kilometerCode = data.kilometerCode; + if (data.kilometerSystem != null) { + message.kilometerSystem = KilometerSystem.fromObject(data.kilometerSystem); } if (data.axleCountingRef != null) { message.axleCountingRef = data.axleCountingRef.map(item => RelatedRef.fromObject(item)); @@ -2309,7 +2315,7 @@ export namespace graphicData { const data: { common?: ReturnType; code?: string; - kilometerCode?: string; + kilometerSystem?: ReturnType; axleCountingRef?: ReturnType[]; } = {}; if (this.common != null) { @@ -2318,8 +2324,8 @@ export namespace graphicData { if (this.code != null) { data.code = this.code; } - if (this.kilometerCode != null) { - data.kilometerCode = this.kilometerCode; + if (this.kilometerSystem != null) { + data.kilometerSystem = this.kilometerSystem.toObject(); } if (this.axleCountingRef != null) { data.axleCountingRef = this.axleCountingRef.map((item: RelatedRef) => item.toObject()); @@ -2334,8 +2340,8 @@ export namespace graphicData { writer.writeMessage(1, this.common, () => this.common.serialize(writer)); if (this.code.length) writer.writeString(2, this.code); - if (this.kilometerCode.length) - writer.writeString(3, this.kilometerCode); + if (this.has_kilometerSystem) + writer.writeMessage(3, this.kilometerSystem, () => this.kilometerSystem.serialize(writer)); if (this.axleCountingRef.length) writer.writeRepeatedMessage(4, this.axleCountingRef, (item: RelatedRef) => item.serialize(writer)); if (!w) @@ -2354,7 +2360,7 @@ export namespace graphicData { message.code = reader.readString(); break; case 3: - message.kilometerCode = reader.readString(); + reader.readMessage(message.kilometerSystem, () => message.kilometerSystem = KilometerSystem.deserialize(reader)); break; case 4: reader.readMessage(message.axleCountingRef, () => pb_1.Message.addToRepeatedWrapperField(message, 4, RelatedRef.deserialize(reader), RelatedRef)); From 4121dde0d2d75785b7c85c85257219fe5d694d1b Mon Sep 17 00:00:00 2001 From: dong <58670809@qq.com> Date: Thu, 29 Jun 2023 17:10:53 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E5=88=86=E9=9A=94=E7=AC=A6=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../draw-app/properties/SeparatorProperty.vue | 10 ++++++- .../separator/SeparatorDrawAssistant.ts | 27 ++++++++++++++----- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/src/components/draw-app/properties/SeparatorProperty.vue b/src/components/draw-app/properties/SeparatorProperty.vue index 5785cc1..81003d2 100644 --- a/src/components/draw-app/properties/SeparatorProperty.vue +++ b/src/components/draw-app/properties/SeparatorProperty.vue @@ -3,6 +3,7 @@ { + const find = typeOptions.find((item) => { + return item.value == separatorModel.separatorType; + }); + return !!find; +}); + drawStore.$subscribe; watch( () => drawStore.selectedGraphic, diff --git a/src/graphics/separator/SeparatorDrawAssistant.ts b/src/graphics/separator/SeparatorDrawAssistant.ts index af4d9ee..799b1c7 100644 --- a/src/graphics/separator/SeparatorDrawAssistant.ts +++ b/src/graphics/separator/SeparatorDrawAssistant.ts @@ -101,16 +101,24 @@ export class SeparatorDraw extends GraphicDrawAssistant< const r = relation.getRelationParam(turnout); port.push(r.param); const other = relation.getOtherRelationParam(turnout); - if (!rMap.has(setKey(r)) && r.param == 'C') { + if (!rMap.has(setKey(r))) { + let t = separatorTypeEnum.section; + if (r.param == 'C' && other.param == 'C') { + t = separatorTypeEnum.turnout; + } rMap.set(setKey(r), { ...r, - separatorType: separatorTypeEnum.turnout, + separatorType: t, }); } - if (!rMap.has(setKey(other)) && other.param == 'C') { + if (!rMap.has(setKey(other))) { + let t = separatorTypeEnum.section; + if (r.param == 'C' && other.param == 'C') { + t = separatorTypeEnum.turnout; + } rMap.set(setKey(other), { ...other, - separatorType: separatorTypeEnum.turnout, + separatorType: t, repetition: true, }); } @@ -172,9 +180,17 @@ export class SeparatorGraphicHitArea implements IHitArea { } contains(x: number, y: number): boolean { let contains = false; + const p = new Point(x, y); + const typeArr = ['section', 'turnout']; const endTypeArr = ['endA', 'endB']; let d = SeparatorConsts.radius; - if (endTypeArr.includes(this.separator.datas.separatorType)) { + if (typeArr.includes(this.separator.datas.separatorType)) { + const tolerance = SeparatorConsts.lineWidth; + const p1 = new Point(0, -SeparatorConsts.height / 2); + const p2 = new Point(0, SeparatorConsts.height / 2); + contains = contains || linePoint(p1, p2, p, tolerance); + return contains; + } else if (endTypeArr.includes(this.separator.datas.separatorType)) { if (this.separator.datas.separatorType == 'endB') { d = -d; } @@ -185,7 +201,6 @@ export class SeparatorGraphicHitArea implements IHitArea { const p4 = new Point(-d * 3, -d); const p5 = new Point(-d, d); const p6 = new Point(-d * 3, d); - const p = new Point(x, y); contains = contains || linePoint(p1, p2, p, tolerance); contains = contains || linePoint(p2, p3, p, tolerance); contains = contains || linePoint(p3, p4, p, tolerance); From 2f1dafe83bc7663da251a4db827802688be7daa6 Mon Sep 17 00:00:00 2001 From: joylink_zhaoerwei Date: Thu, 29 Jun 2023 17:18:16 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E8=AE=A1=E8=BD=B4=E5=90=8D=E7=A7=B0?= =?UTF-8?q?=E5=8A=A0=E9=BB=98=E8=AE=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/graphics/axleCounting/AxleCountingDrawAssistant.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/graphics/axleCounting/AxleCountingDrawAssistant.ts b/src/graphics/axleCounting/AxleCountingDrawAssistant.ts index 241c463..9071f8e 100644 --- a/src/graphics/axleCounting/AxleCountingDrawAssistant.ts +++ b/src/graphics/axleCounting/AxleCountingDrawAssistant.ts @@ -109,7 +109,7 @@ export class AxleCountingDraw extends GraphicDrawAssistant< } axleCounting.id = GraphicIdGenerator.next(); axleCounting.datas.axleCountingRef = [refData2, refData1]; - axleCounting.code = `${graphic.code}-${port}+${refGraphic.code}-${refPort}`; + axleCounting.datas.code = `${graphic.datas.code}-${port}+${refGraphic.datas.code}-${refPort}`; this.storeGraphic(axleCounting); axleCounting.loadRelations(); } @@ -136,7 +136,7 @@ export class AxleCountingDraw extends GraphicDrawAssistant< } axleCounting.id = GraphicIdGenerator.next(); axleCounting.datas.axleCountingRef = [refData]; - axleCounting.code = `${graphic.code}-${port}`; + axleCounting.datas.code = `${graphic.datas.code}-${port}`; this.storeGraphic(axleCounting); axleCounting.loadRelations(); } From 6726da6a39cc42c6ad8439de4306d8f831ab0047 Mon Sep 17 00:00:00 2001 From: fan Date: Thu, 29 Jun 2023 17:21:55 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E7=BA=BF=E8=B7=AF=E7=BA=BF=E7=BD=91?= =?UTF-8?q?=E8=B7=B3=E8=BD=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/PublishApi.ts | 13 ++++ src/drawApp/graphics/RunLineInteraction.ts | 28 +++++++++ src/drawApp/lineApp.ts | 11 ++-- src/drawApp/lineNetApp.ts | 16 ++++- src/layouts/LineLayout.vue | 2 - src/pages/LineMonitorPage.vue | 69 ++++++++++++++++++++++ src/pages/MonitorPage.vue | 39 +++++++++++- src/pages/PublishManage.vue | 2 +- src/protos/device_info.ts | 14 ++--- src/protos/ws_message.ts | 16 ++--- src/router/routes.ts | 5 ++ src/stores/line-net-store.ts | 8 +++ 12 files changed, 196 insertions(+), 27 deletions(-) create mode 100644 src/pages/LineMonitorPage.vue diff --git a/src/api/PublishApi.ts b/src/api/PublishApi.ts index 42ce8ef..db1f1c3 100644 --- a/src/api/PublishApi.ts +++ b/src/api/PublishApi.ts @@ -74,3 +74,16 @@ export async function getPublishLineNet(): Promise { const response = await api.get(`${PublishUriBase}/publish/lineNetwork/info`); return response.data; } + +/** + * 获取发布地图详细信息 + * @param id 发布地图线路ID + * @param type 发布地图线路类型 + */ +export async function getPublishMapInfoByLineId( + lineId: number, + type: string +): Promise { + const response = await api.get(`${PublishUriBase}/${type}/${lineId}`); + return response.data; +} diff --git a/src/drawApp/graphics/RunLineInteraction.ts b/src/drawApp/graphics/RunLineInteraction.ts index 2961acc..71fbb46 100644 --- a/src/drawApp/graphics/RunLineInteraction.ts +++ b/src/drawApp/graphics/RunLineInteraction.ts @@ -21,6 +21,7 @@ import { PolylineEditPlugin, removeLineWayPoint, } from 'src/jl-graphic/plugins/GraphicEditPlugin'; +import { RunLineGraphicHitArea } from 'src/graphics/runLine/RunLineDrawAssistant'; export class RunLineData extends GraphicDataBase implements IRunLineData { constructor(data?: graphicData.RunLine) { @@ -184,3 +185,30 @@ export class DrawRunLinePlugin extends GraphicInteractionPlugin { RunLineEditMenu.open(e.global); } } + +export class RunLineOperateInteraction extends GraphicInteractionPlugin { + static Name = 'runLine_operate_menu'; + constructor(app: GraphicApp) { + super(RunLineOperateInteraction.Name, app); + app.registerMenu(EpEditMenu); + } + static init(app: GraphicApp) { + return new RunLineOperateInteraction(app); + } + filter(...grahpics: JlGraphic[]): RunLine[] | undefined { + return grahpics + .filter((g) => g.type === RunLine.Type) + .map((g) => g as RunLine); + } + bind(g: RunLine): void { + g.eventMode = 'static'; + g.cursor = 'pointer'; + g.lineBody.hitArea = new RunLineGraphicHitArea(g); + g.selectable = true; + } + + unbind(g: RunLine): void { + g.selectable = false; + g.eventMode = 'none'; + } +} diff --git a/src/drawApp/lineApp.ts b/src/drawApp/lineApp.ts index afad7d5..8909938 100644 --- a/src/drawApp/lineApp.ts +++ b/src/drawApp/lineApp.ts @@ -19,7 +19,7 @@ import { TurnoutData } from './graphics/TurnoutInteraction'; import { TurnoutTemplate } from 'src/graphics/turnout/Turnout'; import { SectionData } from './graphics/SectionInteraction'; import { SectionTemplate } from 'src/graphics/section/Section'; -import { getPublishMapInfoById } from 'src/api/PublishApi'; +import { getPublishMapInfoByLineId } from 'src/api/PublishApi'; import { graphicData } from 'src/protos/stationLayoutGraphics'; import { useLineStore } from 'src/stores/line-store'; import { toUint8Array } from 'js-base64'; @@ -65,11 +65,14 @@ export function initLineApp(dom: HTMLElement): GraphicApp { export async function loadLineDatas(app: GraphicApp) { const lineStore = useLineStore(); - const id = lineStore.lineId; - if (!id) { + const lineId = lineStore.lineId; + if (!lineId) { return; } - const { proto: base64, name: lineName } = await getPublishMapInfoById(id); + const { proto: base64, name: lineName } = await getPublishMapInfoByLineId( + lineId, + 'line' + ); lineStore.setLineName(lineName); if (base64) { const storage = graphicData.RtssGraphicStorage.deserialize( diff --git a/src/drawApp/lineNetApp.ts b/src/drawApp/lineNetApp.ts index 9f829bb..47b1cc8 100644 --- a/src/drawApp/lineNetApp.ts +++ b/src/drawApp/lineNetApp.ts @@ -2,11 +2,17 @@ import { GraphicApp, GraphicData } from 'src/jl-graphic'; import { getPublishLineNet } from 'src/api/PublishApi'; import { graphicData } from 'src/protos/stationLayoutGraphics'; -import { RunLineTemplate } from 'src/graphics/runLine/RunLine'; -import { RunLineData } from './graphics/RunLineInteraction'; +import { RunLine, RunLineTemplate } from 'src/graphics/runLine/RunLine'; +import { + RunLineData, + RunLineOperateInteraction, +} from './graphics/RunLineInteraction'; import { PathLineTemplate, PathLine } from 'src/graphics/pathLine/PathLine'; import { PathLineData } from './graphics/PathLineInteraction'; -import { StationLineTemplate } from 'src/graphics/stationLine/StationLine'; +import { + StationLineTemplate, + StationLine, +} from 'src/graphics/stationLine/StationLine'; import { StationLineData } from './graphics/StationLineInteraction'; import { ItrainLineTemplate } from 'src/graphics/trainLine/TrainLine'; import { TrainLineData } from './graphics/TrainLineInteraction'; @@ -45,7 +51,11 @@ export function initLineNetApp(dom: HTMLElement): GraphicApp { viewportDrag: true, wheelZoom: true, }, + interactiveTypeOptions: { + interactiveGraphicTypeIncludes: [RunLine.Type, StationLine.Type], + }, }); + RunLineOperateInteraction.init(lineNetApp); return lineNetApp; } diff --git a/src/layouts/LineLayout.vue b/src/layouts/LineLayout.vue index 46ae264..404f66b 100644 --- a/src/layouts/LineLayout.vue +++ b/src/layouts/LineLayout.vue @@ -70,14 +70,12 @@ onMounted(() => { const lineApp = lineStore.initLineApp(dom); loadLineDatas(lineApp); } else if (mapType.value === 'LineNetwork') { - lineNetStore.setLineNetId(+route.params.id as number); const lineApp = lineNetStore.initLineNetApp(dom); loadLineNetDatas(lineApp); } onResize(); } else { lineStore.setLineId(null); - lineNetStore.setLineNetId(null); } }); diff --git a/src/pages/LineMonitorPage.vue b/src/pages/LineMonitorPage.vue new file mode 100644 index 0000000..abd5510 --- /dev/null +++ b/src/pages/LineMonitorPage.vue @@ -0,0 +1,69 @@ + + + diff --git a/src/pages/MonitorPage.vue b/src/pages/MonitorPage.vue index 0489beb..38ec6b1 100644 --- a/src/pages/MonitorPage.vue +++ b/src/pages/MonitorPage.vue @@ -9,6 +9,9 @@ import { onMounted, watch } from 'vue'; import { useLineNetStore } from 'src/stores/line-net-store'; import { loadLineNetDatas, getLineNetApp } from 'src/drawApp/lineNetApp'; +import { RunLine } from 'src/graphics/runLine/RunLine'; +import { getLineList } from 'src/api/LineInfoApi'; +import { useRouter } from 'vue-router'; const props = withDefaults( defineProps<{ @@ -17,6 +20,17 @@ const props = withDefaults( }>(), { sizeHeight: 500, sizeWidth: 500 } ); +const router = useRouter(); +const lineNetStore = useLineNetStore(); + +interface LineInfo { + get name(): string; + set name(v: string); + get lineId(): number; + set lineId(v: number); +} + +let lineList: LineInfo[] = []; watch( () => props.sizeHeight, @@ -30,8 +44,19 @@ watch( onResize(); } ); - -const lineNetStore = useLineNetStore(); +watch( + () => lineNetStore.selectedGraphic, + (val) => { + if (val && lineNetStore.selectedGraphicType == RunLine.Type) { + const line = lineList.find( + (line) => line.name === (val as RunLine)?.datas.code + ); + if (line) { + router.replace(`/line/monitor/${line.lineId}`); + } + } + } +); function onResize() { const dom = document.getElementById('line-app-container'); @@ -47,6 +72,16 @@ function onResize() { onMounted(() => { const dom = document.getElementById('line-app-container'); + lineList = []; + getLineList() + .then((res) => { + res.forEach((item) => { + lineList.push({ lineId: item.lineId, name: item.name }); + }); + }) + .catch((err) => { + console.error('获取线路列表失败:' + err.message); + }); if (dom) { const lineApp = lineNetStore.initLineNetApp(dom); loadLineNetDatas(lineApp); diff --git a/src/pages/PublishManage.vue b/src/pages/PublishManage.vue index 394e6eb..4faa6d5 100644 --- a/src/pages/PublishManage.vue +++ b/src/pages/PublishManage.vue @@ -31,7 +31,7 @@ color="primary" :disable="operateDisabled" label="预览" - :to="`/linemap/${props.row.id}/${props.row.type}`" + :to="`/linemap/${props.row.lineId}/${props.row.type}`" /> []; }): Section { const message = new Section({}); @@ -95,7 +95,7 @@ export namespace state { id?: string; code?: string; type?: dependency_1.graphicData.Section.SectionType; - kilometerCode?: string[]; + kilometerCode?: number[]; children?: ReturnType[]; } = {}; if (this.id != null) { @@ -126,7 +126,7 @@ export namespace state { if (this.type != dependency_1.graphicData.Section.SectionType.Physical) writer.writeEnum(3, this.type); if (this.kilometerCode.length) - writer.writeRepeatedString(4, this.kilometerCode); + writer.writePackedInt64(4, this.kilometerCode); if (this.children.length) writer.writeRepeatedMessage(5, this.children, (item: Section) => item.serialize(writer)); if (!w) @@ -148,7 +148,7 @@ export namespace state { message.type = reader.readEnum(); break; case 4: - pb_1.Message.addToRepeatedField(message, 4, reader.readString()); + message.kilometerCode = reader.readPackedInt64(); break; case 5: reader.readMessage(message.children, () => pb_1.Message.addToRepeatedWrapperField(message, 5, Section.deserialize(reader), Section)); diff --git a/src/protos/ws_message.ts b/src/protos/ws_message.ts index 99d400c..e23b80d 100644 --- a/src/protos/ws_message.ts +++ b/src/protos/ws_message.ts @@ -469,7 +469,7 @@ export namespace state { groupId?: string; destinationId?: number; show?: boolean; - kilometerCode?: string; + kilometerCode?: number; dir?: number; }) { super(); @@ -529,9 +529,9 @@ export namespace state { pb_1.Message.setField(this, 5, value); } get kilometerCode() { - return pb_1.Message.getFieldWithDefault(this, 6, "") as string; + return pb_1.Message.getFieldWithDefault(this, 6, 0) as number; } - set kilometerCode(value: string) { + set kilometerCode(value: number) { pb_1.Message.setField(this, 6, value); } get dir() { @@ -546,7 +546,7 @@ export namespace state { groupId?: string; destinationId?: number; show?: boolean; - kilometerCode?: string; + kilometerCode?: number; dir?: number; }): WsLineNetTrainOffsetMessage { const message = new WsLineNetTrainOffsetMessage({}); @@ -580,7 +580,7 @@ export namespace state { groupId?: string; destinationId?: number; show?: boolean; - kilometerCode?: string; + kilometerCode?: number; dir?: number; } = {}; if (this.lineId != null) { @@ -620,8 +620,8 @@ export namespace state { writer.writeInt32(4, this.destinationId); if (this.show != false) writer.writeBool(5, this.show); - if (this.kilometerCode.length) - writer.writeString(6, this.kilometerCode); + if (this.kilometerCode != 0) + writer.writeInt64(6, this.kilometerCode); if (this.dir != 0) writer.writeInt32(7, this.dir); if (!w) @@ -649,7 +649,7 @@ export namespace state { message.show = reader.readBool(); break; case 6: - message.kilometerCode = reader.readString(); + message.kilometerCode = reader.readInt64(); break; case 7: message.dir = reader.readInt32(); diff --git a/src/router/routes.ts b/src/router/routes.ts index 88f7f02..b553b77 100644 --- a/src/router/routes.ts +++ b/src/router/routes.ts @@ -67,6 +67,11 @@ const routes: RouteRecordRaw[] = [ name: 'linemap', component: () => import('layouts/LineLayout.vue'), }, + { + path: '/line/monitor/:lineId', + name: 'linemonitor', + component: () => import('pages/LineMonitorPage.vue'), + }, { path: '/monitor', name: 'monitor', diff --git a/src/stores/line-net-store.ts b/src/stores/line-net-store.ts index 9a14e5c..c8fdad6 100644 --- a/src/stores/line-net-store.ts +++ b/src/stores/line-net-store.ts @@ -19,6 +19,14 @@ export const useLineNetStore = defineStore('lineNet', { } } }, + selectedGraphic: (state) => { + if (state.selectedGraphics) { + if (state.selectedGraphics.length === 1) { + return state.selectedGraphics[0]; + } + } + return null; + }, }, actions: { getLineNetApp(): GraphicApp {