From 63eff006b0a0e5ab36231d1c23c78e17c3175be8 Mon Sep 17 00:00:00 2001 From: joylink_zhaoerwei Date: Thu, 10 Oct 2024 17:19:36 +0800 Subject: [PATCH 1/9] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=9F=A9=E5=BD=A2?= =?UTF-8?q?=E7=A2=B0=E6=92=9E=E6=A3=80=E6=B5=8B+=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E7=BB=98=E5=88=B6=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../draw-app/properties/RectProperty.vue | 3 +- src/drawApp/iscsApp.ts | 21 +++++--- src/graphics/rect/RectDrawAssistant.ts | 26 ++++++++- src/layouts/IscsDrawLayout.vue | 53 +++++++++++-------- 4 files changed, 73 insertions(+), 30 deletions(-) diff --git a/src/components/draw-app/properties/RectProperty.vue b/src/components/draw-app/properties/RectProperty.vue index 1c19de2..bde2876 100644 --- a/src/components/draw-app/properties/RectProperty.vue +++ b/src/components/draw-app/properties/RectProperty.vue @@ -61,6 +61,7 @@ diff --git a/src/drawApp/iscsApp.ts b/src/drawApp/iscsApp.ts index 0fd32d0..dd6bf69 100644 --- a/src/drawApp/iscsApp.ts +++ b/src/drawApp/iscsApp.ts @@ -18,7 +18,10 @@ import { } from './commonApp'; import { CCTVButtonData } from './graphics/CCTV/CCTVButtonInteraction'; import { CCTVButtonDraw } from 'src/graphics/CCTV/cctvButton/CCTVButtonDrawAssistant'; -import { CCTVButtonTemplate } from 'src/graphics/CCTV/cctvButton/CCTVButton'; +import { + CCTVButton, + CCTVButtonTemplate, +} from 'src/graphics/CCTV/cctvButton/CCTVButton'; import { useDrawStore } from 'src/stores/draw-store'; import { iscsGraphicData } from 'src/protos/iscs_graphic_data'; import { getDraft } from 'src/api/DraftApi'; @@ -273,6 +276,7 @@ export function saveDrawDatas(app: IDrawApp) { ) ); } + const graphics = app.queryStore.getAllGraphics(); switch (drawStore.selectSubmenuAndStation.submenu) { case '火灾报警平面图': for (let i = 0; i < storage.fasOfPlatformAlarmStorages.length; i++) { @@ -310,6 +314,15 @@ export function saveDrawDatas(app: IDrawApp) { app, cctvOfStationControl ) as iscsGraphicData.CCTVOfStationControlStorage; + + graphics.forEach((g) => { + if (g instanceof CCTVButton) { + const cctvButtonData = g.saveData(); + cctvStorage.cctvButtons.push( + (cctvButtonData as CCTVButtonData).data + ); + } + }); storage.cctvOfStationControlStorages[i] = cctvStorage; break; } @@ -319,12 +332,6 @@ export function saveDrawDatas(app: IDrawApp) { default: break; } - const graphics = app.queryStore.getAllGraphics(); - /* graphics.forEach((g) => { - if (TrackSection.Type === g.type) { - const trackSectionData = (g as TrackSection).saveData(); - storage.trackSections.push((trackSectionData as TrackSectionData).data); - } }) */ console.log(storage, '保存数据', graphics); const base64 = fromUint8Array(storage.serialize()); return base64; diff --git a/src/graphics/rect/RectDrawAssistant.ts b/src/graphics/rect/RectDrawAssistant.ts index 4faf128..987f0a0 100644 --- a/src/graphics/rect/RectDrawAssistant.ts +++ b/src/graphics/rect/RectDrawAssistant.ts @@ -1,9 +1,10 @@ -import { FederatedPointerEvent, Graphics, Point } from 'pixi.js'; +import { FederatedPointerEvent, Graphics, IHitArea, Point } from 'pixi.js'; import { GraphicDrawAssistant, GraphicInteractionPlugin, IDrawApp, JlGraphic, + linePoint, } from 'jl-graphic'; import { IRectData, Rect, RectTemplate } from './Rect'; @@ -72,6 +73,28 @@ export class RectDraw extends GraphicDrawAssistant { } } +//碰撞检测 +export class RectGraphicHitArea implements IHitArea { + rect: Rect; + constructor(rect: Rect) { + this.rect = rect; + } + contains(x: number, y: number): boolean { + let contains = false; + const datas = this.rect.datas; + const tolerance = datas.lineWidth; + const p1 = new Point(0, 0); + const p2 = new Point(p1.x + datas.width, p1.y); + const p3 = new Point(p1.x + datas.width, p1.y + datas.height); + const p4 = new Point(p1.x, p1.y + datas.height); + 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(p4, p1, p, tolerance); + return contains; + } +} export class rectInteraction extends GraphicInteractionPlugin { static Name = 'platform_transform'; constructor(app: IDrawApp) { @@ -88,6 +111,7 @@ export class rectInteraction extends GraphicInteractionPlugin { g.cursor = 'pointer'; g.scalable = true; g.rotatable = true; + g.rectGraphic.hitArea = new RectGraphicHitArea(g); } unbind(g: Rect): void { g.eventMode = 'none'; diff --git a/src/layouts/IscsDrawLayout.vue b/src/layouts/IscsDrawLayout.vue index e56578e..3967bc9 100644 --- a/src/layouts/IscsDrawLayout.vue +++ b/src/layouts/IscsDrawLayout.vue @@ -305,7 +305,7 @@ function toggleRightDrawer() { //工具栏所用 const selectUtil = ref(); -const utilsOption: ControlItem[] = reactive([]); +let utilsOption: ControlItem[] = reactive([]); function drawSelect(item: string) { drawStore.getDrawApp().interactionPlugin(item).resume(); @@ -327,6 +327,34 @@ class ControlItem { } } } + +function handleUtilsOption() { + utilsOption = []; + const drawAssistantsTypes = [ + Arrow.Type, + TextContent.Type, + Rect.Type, + Line.Type, + ]; + switch (drawStore.selectSubmenuAndStation.submenu) { + case '监控布局图': + drawAssistantsTypes.push(CCTVButton.Type); + break; + } + drawAssistantsTypes.forEach((type) => { + const drawAssistant = drawStore.getDrawApp().getDrawAssistant(type); + if (drawAssistant) { + utilsOption.push( + new ControlItem( + drawAssistant.name, + drawAssistant.icon, + drawAssistant.description || drawAssistant.name + ) + ); + } + }); + drawDialogHeight.value = 44 * Math.ceil(utilsOption.length / 2); +} //左侧功能按钮 const leftMenuConfig = [ { label: '保存', click: saveAllDrawDatas }, @@ -364,26 +392,7 @@ onMounted(() => { } else { drawStore.setDraftId(null); } - const drawAssistantsTypes = [ - Arrow.Type, - TextContent.Type, - Rect.Type, - Line.Type, - CCTVButton.Type, - ]; - drawAssistantsTypes.forEach((type) => { - const drawAssistant = drawStore.getDrawApp().getDrawAssistant(type); - if (drawAssistant) { - utilsOption.push( - new ControlItem( - drawAssistant.name, - drawAssistant.icon, - drawAssistant.description || drawAssistant.name - ) - ); - } - }); - drawDialogHeight.value = 44 * Math.ceil(utilsOption.length / 2); + handleUtilsOption(); }); const canvasWidth = ref(0); @@ -473,6 +482,7 @@ function selectedMenu(menuName: string) { break; } } + handleUtilsOption(); } const selectSubMenuName = ref(''); @@ -480,6 +490,7 @@ const subMenuOption = ref([]); function selectedSubMenu(subName: string) { drawStore.selectSubmenuAndStation.submenu = subName; forceReloadDate(); + handleUtilsOption(); } let iscsTypeConfig: { From fd0bfb0ab2a7509687346e119841ea3afa5451ce Mon Sep 17 00:00:00 2001 From: joylink_fanyuhong <18706759286@163.com> Date: Fri, 11 Oct 2024 09:52:46 +0800 Subject: [PATCH 2/9] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/drawApp/iscsApp.ts | 6 ++ src/layouts/IscsDrawLayout.vue | 138 ++++++++++++++++++++++++++------- 2 files changed, 117 insertions(+), 27 deletions(-) diff --git a/src/drawApp/iscsApp.ts b/src/drawApp/iscsApp.ts index 0fd32d0..8c6519f 100644 --- a/src/drawApp/iscsApp.ts +++ b/src/drawApp/iscsApp.ts @@ -27,6 +27,7 @@ import { fromUint8Array, toUint8Array } from 'js-base64'; import { getWebsocketUrl } from 'src/configs/UrlManage'; import { sync_data_message } from 'src/protos/sync_data_message'; import { useAuthStore } from 'src/stores/auth-store'; +import { common } from 'src/protos/common'; // import { getOnlyToken } from 'src/configs/TokenManage'; let drawApp: IDrawApp | null = null; @@ -119,6 +120,11 @@ function handleSubscribe(app: IDrawApp) { graphics.push(g); }); app.deleteGraphics(...graphics); + } else if (syncData.operationType === 'update-canvas') { + // console.log(common.Canvas.deserialize(syncData.datas[0].data)); + // common.Canvas.deserialize(syncData.datas[0].data); + // app.updateCanvasAndRecord() + app.canvas.update(common.Canvas.deserialize(syncData.datas[0].data)); } } else { if (syncData.submenu === '火灾报警平面图') { diff --git a/src/layouts/IscsDrawLayout.vue b/src/layouts/IscsDrawLayout.vue index e56578e..ea0ec81 100644 --- a/src/layouts/IscsDrawLayout.vue +++ b/src/layouts/IscsDrawLayout.vue @@ -259,6 +259,9 @@ import { saveDrawToServer } from 'src/drawApp/commonApp'; import { sync_data_message } from 'src/protos/sync_data_message'; import { useAuthStore } from 'src/stores/auth-store'; import { Line } from 'src/graphics/line/Line'; +import { JlOperation } from 'jl-graphic'; +import { common } from 'src/protos/common'; +import { toStorageTransform } from 'src/drawApp/graphics/GraphicDataBase'; const $q = useQuasar(); const route = useRoute(); @@ -346,24 +349,129 @@ onMounted(() => { if (route.query.isShared == '1') { const _record = drawApp.opRecord.record; drawApp.opRecord.record = function (op) { - handleRecordData(op); _record.call(drawApp.opRecord, op); + handleRecordData(op); + saveAllDrawDatas(); }; const _undo = drawApp.opRecord.undo; drawApp.opRecord.undo = function () { + const op = + drawApp.opRecord.undoStack[drawApp.opRecord.undoStack.length - 1]; _undo.call(drawApp.opRecord); - console.log('undo'); + console.log(op, 'undo'); + handleUnDoData(op); + saveAllDrawDatas(); + console.log('undo', drawApp); }; const _redo = drawApp.opRecord.redo; drawApp.opRecord.redo = function () { + const op = + drawApp.opRecord.redoStack[drawApp.opRecord.redoStack.length - 1]; _redo.call(drawApp.opRecord); - console.log('redo'); + console.log(op, 'redo'); + handleRecordData(op); + saveAllDrawDatas(); + console.log('redo', drawApp); }; } onResize(); } else { drawStore.setDraftId(null); } + + function handleUnDoData(op: JlOperation) { + const drawApp = drawStore.getDrawApp(); + let operationType = op.type; + if (operationType == 'graphic-create') { + operationType = 'graphic-delete'; + } else if (operationType == 'graphic-delete') { + operationType = 'graphic-create'; + } + const syncData = { + operationType: operationType, + datas: [], + submenu: drawStore.selectSubmenuAndStation.submenu, + station: drawStore.selectSubmenuAndStation.station, + userId: useAuthStore().userId, + }; + if (op.type === 'update-canvas') { + const canvasData = op.obj.saveData(); + syncData.datas.push( + new sync_data_message.UpdataData({ + id: 0, + type: op.obj.type, + data: new common.Canvas({ + width: canvasData.width, + height: canvasData.height, + backgroundColor: canvasData.backgroundColor, + viewportTransform: toStorageTransform(canvasData.viewportTransform), + }).serialize(), + }) + ); + } else { + op.obj.forEach((g) => { + const gData = g.saveData(); + syncData.datas.push( + new sync_data_message.UpdataData({ + id: g.id, + type: g.type, + data: gData.data.serialize(), + }) + ); + }); + } + drawApp.publishMessage( + `/rtss_simulation/draft/iscs/${drawStore.draftId}`, + new sync_data_message.SyncData({ ...syncData }).serialize() + ); + } + + function handleRecordData(op: JlOperation) { + const drawApp = drawStore.getDrawApp(); + const syncData = { + operationType: op.type, + datas: [], + submenu: drawStore.selectSubmenuAndStation.submenu, + station: drawStore.selectSubmenuAndStation.station, + userId: useAuthStore().userId, + }; + if (op.type === 'update-canvas') { + const canvasData = op.obj.saveData(); + console.log(canvasData, 'canvasData'); + syncData.datas.push( + new sync_data_message.UpdataData({ + id: 0, + type: op.obj.type, + data: new common.Canvas({ + width: canvasData.width, + height: canvasData.height, + backgroundColor: canvasData.backgroundColor, + viewportTransform: toStorageTransform(canvasData.viewportTransform), + }).serialize(), + }) + ); + } else { + op.obj.forEach((g) => { + const gData = g.saveData(); + syncData.datas.push( + new sync_data_message.UpdataData({ + id: g.id, + type: g.type, + data: gData.data.serialize(), + }) + ); + }); + } + + drawApp.publishMessage( + `/rtss_simulation/draft/iscs/${drawStore.draftId}`, + new sync_data_message.SyncData({ ...syncData }).serialize() + ); + } + // function handleReDoData(op: JlOperation) { + // console.log('redoData', op); + // } + const drawAssistantsTypes = [ Arrow.Type, TextContent.Type, @@ -531,30 +639,6 @@ function selectedStation(name: string) { forceReloadDate(); } -function handleRecordData(op) { - const drawApp = drawStore.getDrawApp(); - const syncData = { - operationType: op.type, - datas: [], - submenu: drawStore.selectSubmenuAndStation.submenu, - station: drawStore.selectSubmenuAndStation.station, - userId: useAuthStore().userId, - }; - op.obj.forEach((g) => { - const gData = g.saveData(); - syncData.datas.push( - new sync_data_message.UpdataData({ - id: g.id, - type: g.type, - data: gData.data.serialize(), - }) - ); - }); - drawApp.publishMessage( - `/rtss_simulation/draft/iscs/${drawStore.draftId}`, - new sync_data_message.SyncData({ ...syncData }).serialize() - ); -} function forceReloadDate() { const drawApp = drawStore.getDrawApp(); const graphics = drawApp.queryStore.getAllGraphics(); From 8dc7214ceb562f4513f0092238f29c2ecdc6dd22 Mon Sep 17 00:00:00 2001 From: joylink_zhaoerwei Date: Fri, 11 Oct 2024 15:16:31 +0800 Subject: [PATCH 3/9] =?UTF-8?q?=E5=85=AC=E5=85=B1=E7=9A=84=E5=9B=BE?= =?UTF-8?q?=E5=BD=A2=E2=80=94=E2=80=94=E5=9C=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rtss-proto-msg | 2 +- .../draw-app/IscsDrawProperties.vue | 7 +- ...CTVProperty.vue => CanvasIscsProperty.vue} | 0 .../draw-app/properties/CircleProperty.vue | 94 +++++++ .../draw-app/properties/RectProperty.vue | 2 +- src/drawApp/commonApp.ts | 29 +- src/drawApp/graphics/CircleInteraction.ts | 76 +++++ src/graphics/circle/Circle.ts | 86 ++++++ src/graphics/circle/CircleDrawAssistant.ts | 117 ++++++++ src/graphics/line/LineDrawAssistant.ts | 8 - src/graphics/rect/RectDrawAssistant.ts | 6 +- src/layouts/IscsDrawLayout.vue | 3 + src/protos/iscs_graphic_data.ts | 259 +++++++++++++++++- 13 files changed, 669 insertions(+), 20 deletions(-) rename src/components/draw-app/properties/{CCTV/CanvasCCTVProperty.vue => CanvasIscsProperty.vue} (100%) create mode 100644 src/components/draw-app/properties/CircleProperty.vue create mode 100644 src/drawApp/graphics/CircleInteraction.ts create mode 100644 src/graphics/circle/Circle.ts create mode 100644 src/graphics/circle/CircleDrawAssistant.ts diff --git a/rtss-proto-msg b/rtss-proto-msg index ea8b911..87726ae 160000 --- a/rtss-proto-msg +++ b/rtss-proto-msg @@ -1 +1 @@ -Subproject commit ea8b911846b63f649a254250ba81c7a804da332a +Subproject commit 87726ae0917aedf814210d9725ee354aa15bb1f9 diff --git a/src/components/draw-app/IscsDrawProperties.vue b/src/components/draw-app/IscsDrawProperties.vue index 94d894a..d1747db 100644 --- a/src/components/draw-app/IscsDrawProperties.vue +++ b/src/components/draw-app/IscsDrawProperties.vue @@ -36,6 +36,9 @@ + @@ -50,7 +53,7 @@ diff --git a/src/components/draw-app/properties/CCTV/CanvasCCTVProperty.vue b/src/components/draw-app/properties/CanvasIscsProperty.vue similarity index 100% rename from src/components/draw-app/properties/CCTV/CanvasCCTVProperty.vue rename to src/components/draw-app/properties/CanvasIscsProperty.vue diff --git a/src/components/draw-app/properties/CircleProperty.vue b/src/components/draw-app/properties/CircleProperty.vue new file mode 100644 index 0000000..1353307 --- /dev/null +++ b/src/components/draw-app/properties/CircleProperty.vue @@ -0,0 +1,94 @@ + + + diff --git a/src/components/draw-app/properties/RectProperty.vue b/src/components/draw-app/properties/RectProperty.vue index bde2876..7c0833c 100644 --- a/src/components/draw-app/properties/RectProperty.vue +++ b/src/components/draw-app/properties/RectProperty.vue @@ -37,7 +37,7 @@ { datas.push(new LineData(line)); }); + storage.commonGraphicStorage.circles.forEach((circle) => { + datas.push(new CircleData(circle)); + }); return datas; } @@ -118,13 +126,20 @@ export function saveCommonDrawDatas(app: IDrawApp, storage: ICommonStorage) { storage.commonGraphicStorage.arrows.push((arrowData as ArrowData).data); } else if (g instanceof TextContent) { const textContentData = g.saveData(); - storage.commonGraphicStorage.texts.push((textContentData as IscsTextData).data); + storage.commonGraphicStorage.texts.push( + (textContentData as IscsTextData).data + ); } else if (g instanceof Rect) { const rectData = g.saveData(); storage.commonGraphicStorage.rects.push((rectData as RectData).data); } else if (g instanceof Line) { const lineData = g.saveData(); storage.commonGraphicStorage.lines.push((lineData as LineData).data); + } else if (g instanceof Circle) { + const circleData = g.saveData(); + storage.commonGraphicStorage.circles.push( + (circleData as CircleData).data + ); } }); @@ -194,11 +209,19 @@ export function handlerNoEditCommonData( break; case Arrow.Type: const arrowData = iscsGraphicData.Arrow.deserialize(data.data); - syncNoEditData(operationType, arrowData, storage.commonGraphicStorage.arrows); + syncNoEditData( + operationType, + arrowData, + storage.commonGraphicStorage.arrows + ); break; case TextContent.Type: const iscsTextData = iscsGraphicData.Text.deserialize(data.data); - syncNoEditData(operationType, iscsTextData, storage.commonGraphicStorage.texts); + syncNoEditData( + operationType, + iscsTextData, + storage.commonGraphicStorage.texts + ); break; } } diff --git a/src/drawApp/graphics/CircleInteraction.ts b/src/drawApp/graphics/CircleInteraction.ts new file mode 100644 index 0000000..db4e426 --- /dev/null +++ b/src/drawApp/graphics/CircleInteraction.ts @@ -0,0 +1,76 @@ +import * as pb_1 from 'google-protobuf'; +import { IPointData } from 'pixi.js'; +import { ICircleData, Circle } from 'src/graphics/circle/Circle'; +import { iscsGraphicData } from 'src/protos/iscs_graphic_data'; +import { GraphicDataBase } from './GraphicDataBase'; +import { common } from 'src/protos/common'; + +export class CircleData extends GraphicDataBase implements ICircleData { + constructor(data?: iscsGraphicData.Circle) { + let circle; + if (!data) { + circle = new iscsGraphicData.Circle({ + common: GraphicDataBase.defaultCommonInfo(Circle.Type), + }); + } else { + circle = data; + } + super(circle); + } + + public get data(): iscsGraphicData.Circle { + return this.getData(); + } + + get code(): string { + return this.data.code; + } + set code(v: string) { + this.data.code = v; + } + get lineWidth(): number { + return this.data.lineWidth; + } + set lineWidth(v: number) { + this.data.lineWidth = v; + } + get lineColor(): string { + return this.data.lineColor; + } + set lineColor(v: string) { + this.data.lineColor = v; + } + get position(): IPointData { + return this.data.position; + } + set position(point: IPointData) { + this.data.position = new common.Point({ x: point.x, y: point.y }); + } + get radius(): number { + return this.data.radius; + } + set radius(v: number) { + this.data.radius = v; + } + get fillColor(): string { + return this.data.fillColor; + } + set fillColor(v: string) { + this.data.fillColor = v; + } + get alpha(): number { + return this.data.alpha; + } + set alpha(v: number) { + this.data.alpha = v; + } + clone(): CircleData { + return new CircleData(this.data.cloneMessage()); + } + copyFrom(data: CircleData): void { + pb_1.Message.copyInto(data.data, this.data); + } + eq(other: CircleData): boolean { + return pb_1.Message.equals(this.data, other.data); + } +} diff --git a/src/graphics/circle/Circle.ts b/src/graphics/circle/Circle.ts new file mode 100644 index 0000000..0fe040f --- /dev/null +++ b/src/graphics/circle/Circle.ts @@ -0,0 +1,86 @@ +import { Color, Graphics, IPointData } from 'pixi.js'; +import { GraphicData, JlGraphic, JlGraphicTemplate } from 'jl-graphic'; + +export interface ICircleData extends GraphicData { + get code(): string; // 编号 + set code(v: string); + get position(): IPointData; // 位置坐标 + set position(point: IPointData); + get radius(): number; // 圆的半径 + set radius(v: number); + get lineWidth(): number; // 线宽 + set lineWidth(v: number); + get lineColor(): string; // 线色 + set lineColor(v: string); + get fillColor(): string; // 填充色 + set fillColor(v: string); + get alpha(): number; // 透明度 + set alpha(v: number); + clone(): ICircleData; + copyFrom(data: ICircleData): void; + eq(other: ICircleData): boolean; +} + +const circleConsts = { + lineWidth: 2, + lineColor: '0xff0000', + fillColor: '0xff0000', + alpha: 0.001, +}; + +export class Circle extends JlGraphic { + static Type = 'Circle'; + circleGraphic: Graphics = new Graphics(); + constructor() { + super(Circle.Type); + this.addChild(this.circleGraphic); + } + + get datas(): ICircleData { + return this.getDatas(); + } + doRepaint(): void { + const circleGraphic = this.circleGraphic; + circleGraphic.clear(); + circleGraphic.lineStyle( + this.datas.lineWidth, + new Color(this.datas.lineColor) + ); + circleGraphic.beginFill(this.datas.fillColor, this.datas.alpha); + circleGraphic.drawCircle( + this.datas.position.x, + this.datas.position.y, + this.datas.radius + ); + circleGraphic.endFill; + circleGraphic.pivot = this.datas.position; + const transformPos = this.datas.transform.position; + if (transformPos.x == 0 && transformPos.y == 0) { + this.position.set(this.datas.position.x, this.datas.position.y); + } else { + this.position.set( + this.datas.transform.position.x, + this.datas.transform.position.y + ); + } + } +} + +export class CircleTemplate extends JlGraphicTemplate { + lineWidth: number; + lineColor: string; + fillColor: string; + alpha: number; + constructor(dataTemplate: ICircleData) { + super(Circle.Type, { + dataTemplate, + }); + this.lineWidth = circleConsts.lineWidth; + this.lineColor = circleConsts.lineColor; + this.fillColor = circleConsts.fillColor; + this.alpha = circleConsts.alpha; + } + new(): Circle { + return new Circle(); + } +} diff --git a/src/graphics/circle/CircleDrawAssistant.ts b/src/graphics/circle/CircleDrawAssistant.ts new file mode 100644 index 0000000..902c0ed --- /dev/null +++ b/src/graphics/circle/CircleDrawAssistant.ts @@ -0,0 +1,117 @@ +import { FederatedPointerEvent, Graphics, IHitArea, Point } from 'pixi.js'; +import { + circlePoint2, + GraphicDrawAssistant, + GraphicInteractionPlugin, + IDrawApp, + JlGraphic, +} from 'jl-graphic'; + +import { ICircleData, Circle, CircleTemplate } from './Circle'; + +export class CircleDraw extends GraphicDrawAssistant< + CircleTemplate, + ICircleData +> { + point1: Point | null = null; + point2: Point | null = null; + circleGraphic: Graphics = new Graphics(); + + constructor(app: IDrawApp, template: CircleTemplate) { + super(app, template, 'sym_o_circle', '圆Circle'); + this.container.addChild(this.circleGraphic); + circleInteraction.init(app); + } + + clearCache(): void { + this.circleGraphic.clear(); + } + onLeftDown(e: FederatedPointerEvent): void { + const { x, y } = this.toCanvasCoordinates(e.global); + const p = new Point(x, y); + if (this.point1 === null) { + this.point1 = p; + } else { + this.point2 = p; + this.createAndStore(true); + this.point1 = null; + this.point2 = null; + } + } + + redraw(p: Point): void { + const template = this.graphicTemplate; + if (this.point1 === null) return; + const circleGraphic = this.circleGraphic; + circleGraphic.clear(); + circleGraphic.lineStyle(template.lineWidth, template.lineColor); + circleGraphic.drawCircle(...this.normalize(this.point1, p)); + } + private normalize(p1: Point, p2: Point): [number, number, number] { + const { abs } = Math; + const x = p1.x < p2.x ? p1.x : p2.x; + const y = p1.y < p2.y ? p1.y : p2.y; + const r = abs(p1.x - p2.x); + return [x, y, r]; + } + prepareData(data: ICircleData): boolean { + const p1 = this.point1 as Point; + const p2 = this.point2 as Point; + const [x, y, radius] = this.normalize(p1, p2); + const template = this.graphicTemplate; + data.position = new Point(x, y); + data.lineWidth = template.lineWidth; + data.lineColor = template.lineColor; + data.fillColor = template.fillColor; + data.alpha = template.alpha; + data.radius = radius; + return true; + } +} + +//碰撞检测 +export class CircleGraphicHitArea implements IHitArea { + circle: Circle; + constructor(circle: Circle) { + this.circle = circle; + } + contains(x: number, y: number): boolean { + const datas = this.circle.datas; + const tolerance = datas.lineWidth; + return circlePoint2( + datas.position.x, + datas.position.y, + Math.abs(datas.radius), + x, + y, + tolerance + ); + } +} + +export class circleInteraction extends GraphicInteractionPlugin { + static Name = 'circle_transform'; + constructor(app: IDrawApp) { + super(circleInteraction.Name, app); + } + static init(app: IDrawApp) { + return new circleInteraction(app); + } + filter(...grahpics: JlGraphic[]): Circle[] | undefined { + return grahpics + .filter((g) => g.type === Circle.Type) + .map((g) => g as Circle); + } + bind(g: Circle): void { + g.eventMode = 'static'; + g.cursor = 'pointer'; + g.scalable = true; + g.rotatable = true; + g.circleGraphic.hitArea = new CircleGraphicHitArea(g); + } + unbind(g: Circle): void { + g.eventMode = 'none'; + g.scalable = false; + g.rotatable = false; + } +} diff --git a/src/graphics/line/LineDrawAssistant.ts b/src/graphics/line/LineDrawAssistant.ts index e6384e9..2fa48bb 100644 --- a/src/graphics/line/LineDrawAssistant.ts +++ b/src/graphics/line/LineDrawAssistant.ts @@ -110,14 +110,6 @@ export class LineDraw extends GraphicDrawAssistant { } } - onRightClick(): void { - if (this.points.length < 2) { - this.finish(); - return; - } - this.createAndStore(true); - } - onEsc(): void { if (this.points.length < 2) { this.finish(); diff --git a/src/graphics/rect/RectDrawAssistant.ts b/src/graphics/rect/RectDrawAssistant.ts index 987f0a0..ec179f0 100644 --- a/src/graphics/rect/RectDrawAssistant.ts +++ b/src/graphics/rect/RectDrawAssistant.ts @@ -9,10 +9,6 @@ import { import { IRectData, Rect, RectTemplate } from './Rect'; -export interface IRectDrawOptions { - newData: () => IRectData; -} - export class RectDraw extends GraphicDrawAssistant { point1: Point | null = null; point2: Point | null = null; @@ -96,7 +92,7 @@ export class RectGraphicHitArea implements IHitArea { } } export class rectInteraction extends GraphicInteractionPlugin { - static Name = 'platform_transform'; + static Name = 'rect_transform'; constructor(app: IDrawApp) { super(rectInteraction.Name, app); } diff --git a/src/layouts/IscsDrawLayout.vue b/src/layouts/IscsDrawLayout.vue index 9521940..0075626 100644 --- a/src/layouts/IscsDrawLayout.vue +++ b/src/layouts/IscsDrawLayout.vue @@ -262,6 +262,7 @@ import { Line } from 'src/graphics/line/Line'; import { JlOperation } from 'jl-graphic'; import { common } from 'src/protos/common'; import { toStorageTransform } from 'src/drawApp/graphics/GraphicDataBase'; +import { Circle } from 'src/graphics/circle/Circle'; const $q = useQuasar(); const route = useRoute(); @@ -336,6 +337,7 @@ function handleUtilsOption() { const drawAssistantsTypes = [ Arrow.Type, TextContent.Type, + Circle.Type, Rect.Type, Line.Type, ]; @@ -356,6 +358,7 @@ function handleUtilsOption() { ); } }); + drawDialogHeight.value = 0; drawDialogHeight.value = 44 * Math.ceil(utilsOption.length / 2); } //左侧功能按钮 diff --git a/src/protos/iscs_graphic_data.ts b/src/protos/iscs_graphic_data.ts index cd45fc6..3faa48c 100644 --- a/src/protos/iscs_graphic_data.ts +++ b/src/protos/iscs_graphic_data.ts @@ -216,9 +216,10 @@ export namespace iscsGraphicData { texts?: Text[]; rects?: Rect[]; lines?: Line[]; + circles?: Circle[]; }) { super(); - pb_1.Message.initialize(this, Array.isArray(data) ? data : [], 0, -1, [1, 2, 3, 4], this.#one_of_decls); + pb_1.Message.initialize(this, Array.isArray(data) ? data : [], 0, -1, [1, 2, 3, 4, 5], this.#one_of_decls); if (!Array.isArray(data) && typeof data == "object") { if ("arrows" in data && data.arrows != undefined) { this.arrows = data.arrows; @@ -232,6 +233,9 @@ export namespace iscsGraphicData { if ("lines" in data && data.lines != undefined) { this.lines = data.lines; } + if ("circles" in data && data.circles != undefined) { + this.circles = data.circles; + } } } get arrows() { @@ -258,11 +262,18 @@ export namespace iscsGraphicData { set lines(value: Line[]) { pb_1.Message.setRepeatedWrapperField(this, 4, value); } + get circles() { + return pb_1.Message.getRepeatedWrapperField(this, Circle, 5) as Circle[]; + } + set circles(value: Circle[]) { + pb_1.Message.setRepeatedWrapperField(this, 5, value); + } static fromObject(data: { arrows?: ReturnType[]; texts?: ReturnType[]; rects?: ReturnType[]; lines?: ReturnType[]; + circles?: ReturnType[]; }): CommonGraphicStorage { const message = new CommonGraphicStorage({}); if (data.arrows != null) { @@ -277,6 +288,9 @@ export namespace iscsGraphicData { if (data.lines != null) { message.lines = data.lines.map(item => Line.fromObject(item)); } + if (data.circles != null) { + message.circles = data.circles.map(item => Circle.fromObject(item)); + } return message; } toObject() { @@ -285,6 +299,7 @@ export namespace iscsGraphicData { texts?: ReturnType[]; rects?: ReturnType[]; lines?: ReturnType[]; + circles?: ReturnType[]; } = {}; if (this.arrows != null) { data.arrows = this.arrows.map((item: Arrow) => item.toObject()); @@ -298,6 +313,9 @@ export namespace iscsGraphicData { if (this.lines != null) { data.lines = this.lines.map((item: Line) => item.toObject()); } + if (this.circles != null) { + data.circles = this.circles.map((item: Circle) => item.toObject()); + } return data; } serialize(): Uint8Array; @@ -312,6 +330,8 @@ export namespace iscsGraphicData { writer.writeRepeatedMessage(3, this.rects, (item: Rect) => item.serialize(writer)); if (this.lines.length) writer.writeRepeatedMessage(4, this.lines, (item: Line) => item.serialize(writer)); + if (this.circles.length) + writer.writeRepeatedMessage(5, this.circles, (item: Circle) => item.serialize(writer)); if (!w) return writer.getResultBuffer(); } @@ -333,6 +353,9 @@ export namespace iscsGraphicData { case 4: reader.readMessage(message.lines, () => pb_1.Message.addToRepeatedWrapperField(message, 4, Line.deserialize(reader), Line)); break; + case 5: + reader.readMessage(message.circles, () => pb_1.Message.addToRepeatedWrapperField(message, 5, Circle.deserialize(reader), Circle)); + break; default: reader.skipField(); } } @@ -1111,6 +1134,240 @@ export namespace iscsGraphicData { return Line.deserialize(bytes); } } + export class Circle extends pb_1.Message { + #one_of_decls: number[][] = []; + constructor(data?: any[] | { + common?: dependency_1.common.CommonInfo; + code?: string; + position?: dependency_1.common.Point; + radius?: number; + lineWidth?: number; + lineColor?: string; + fillColor?: string; + alpha?: number; + }) { + 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 ("position" in data && data.position != undefined) { + this.position = data.position; + } + if ("radius" in data && data.radius != undefined) { + this.radius = data.radius; + } + if ("lineWidth" in data && data.lineWidth != undefined) { + this.lineWidth = data.lineWidth; + } + if ("lineColor" in data && data.lineColor != undefined) { + this.lineColor = data.lineColor; + } + if ("fillColor" in data && data.fillColor != undefined) { + this.fillColor = data.fillColor; + } + if ("alpha" in data && data.alpha != undefined) { + this.alpha = data.alpha; + } + } + } + get common() { + return pb_1.Message.getWrapperField(this, dependency_1.common.CommonInfo, 1) as dependency_1.common.CommonInfo; + } + set common(value: dependency_1.common.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 position() { + return pb_1.Message.getWrapperField(this, dependency_1.common.Point, 3) as dependency_1.common.Point; + } + set position(value: dependency_1.common.Point) { + pb_1.Message.setWrapperField(this, 3, value); + } + get has_position() { + return pb_1.Message.getField(this, 3) != null; + } + get radius() { + return pb_1.Message.getFieldWithDefault(this, 4, 0) as number; + } + set radius(value: number) { + pb_1.Message.setField(this, 4, value); + } + get lineWidth() { + return pb_1.Message.getFieldWithDefault(this, 5, 0) as number; + } + set lineWidth(value: number) { + pb_1.Message.setField(this, 5, value); + } + get lineColor() { + return pb_1.Message.getFieldWithDefault(this, 6, "") as string; + } + set lineColor(value: string) { + pb_1.Message.setField(this, 6, value); + } + get fillColor() { + return pb_1.Message.getFieldWithDefault(this, 7, "") as string; + } + set fillColor(value: string) { + pb_1.Message.setField(this, 7, value); + } + get alpha() { + return pb_1.Message.getFieldWithDefault(this, 8, 0) as number; + } + set alpha(value: number) { + pb_1.Message.setField(this, 8, value); + } + static fromObject(data: { + common?: ReturnType; + code?: string; + position?: ReturnType; + radius?: number; + lineWidth?: number; + lineColor?: string; + fillColor?: string; + alpha?: number; + }): Circle { + const message = new Circle({}); + if (data.common != null) { + message.common = dependency_1.common.CommonInfo.fromObject(data.common); + } + if (data.code != null) { + message.code = data.code; + } + if (data.position != null) { + message.position = dependency_1.common.Point.fromObject(data.position); + } + if (data.radius != null) { + message.radius = data.radius; + } + if (data.lineWidth != null) { + message.lineWidth = data.lineWidth; + } + if (data.lineColor != null) { + message.lineColor = data.lineColor; + } + if (data.fillColor != null) { + message.fillColor = data.fillColor; + } + if (data.alpha != null) { + message.alpha = data.alpha; + } + return message; + } + toObject() { + const data: { + common?: ReturnType; + code?: string; + position?: ReturnType; + radius?: number; + lineWidth?: number; + lineColor?: string; + fillColor?: string; + alpha?: number; + } = {}; + if (this.common != null) { + data.common = this.common.toObject(); + } + if (this.code != null) { + data.code = this.code; + } + if (this.position != null) { + data.position = this.position.toObject(); + } + if (this.radius != null) { + data.radius = this.radius; + } + if (this.lineWidth != null) { + data.lineWidth = this.lineWidth; + } + if (this.lineColor != null) { + data.lineColor = this.lineColor; + } + if (this.fillColor != null) { + data.fillColor = this.fillColor; + } + if (this.alpha != null) { + data.alpha = this.alpha; + } + 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.has_position) + writer.writeMessage(3, this.position, () => this.position.serialize(writer)); + if (this.radius != 0) + writer.writeFloat(4, this.radius); + if (this.lineWidth != 0) + writer.writeInt32(5, this.lineWidth); + if (this.lineColor.length) + writer.writeString(6, this.lineColor); + if (this.fillColor.length) + writer.writeString(7, this.fillColor); + if (this.alpha != 0) + writer.writeFloat(8, this.alpha); + if (!w) + return writer.getResultBuffer(); + } + static deserialize(bytes: Uint8Array | pb_1.BinaryReader): Circle { + const reader = bytes instanceof pb_1.BinaryReader ? bytes : new pb_1.BinaryReader(bytes), message = new Circle(); + while (reader.nextField()) { + if (reader.isEndGroup()) + break; + switch (reader.getFieldNumber()) { + case 1: + reader.readMessage(message.common, () => message.common = dependency_1.common.CommonInfo.deserialize(reader)); + break; + case 2: + message.code = reader.readString(); + break; + case 3: + reader.readMessage(message.position, () => message.position = dependency_1.common.Point.deserialize(reader)); + break; + case 4: + message.radius = reader.readFloat(); + break; + case 5: + message.lineWidth = reader.readInt32(); + break; + case 6: + message.lineColor = reader.readString(); + break; + case 7: + message.fillColor = reader.readString(); + break; + case 8: + message.alpha = reader.readFloat(); + break; + default: reader.skipField(); + } + } + return message; + } + serializeBinary(): Uint8Array { + return this.serialize(); + } + static deserializeBinary(bytes: Uint8Array): Circle { + return Circle.deserialize(bytes); + } + } export class CCTVButton extends pb_1.Message { #one_of_decls: number[][] = []; constructor(data?: any[] | { From 38bc44f2f95c2e47923936072a94c9b04a395100 Mon Sep 17 00:00:00 2001 From: joylink_zhaoerwei Date: Fri, 11 Oct 2024 17:07:53 +0800 Subject: [PATCH 4/9] =?UTF-8?q?=E7=BB=98=E5=88=B6=E9=80=89=E6=8B=A9bug?= =?UTF-8?q?=E8=B5=9E=E6=8F=90=EF=BC=88=E7=B2=97=E5=A4=84=E7=90=86=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/draw-app/IscsDrawProperties.vue | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/components/draw-app/IscsDrawProperties.vue b/src/components/draw-app/IscsDrawProperties.vue index d1747db..fd95662 100644 --- a/src/components/draw-app/IscsDrawProperties.vue +++ b/src/components/draw-app/IscsDrawProperties.vue @@ -65,6 +65,11 @@ import LineProperty from './properties/LineProperty.vue'; import { Line } from 'src/graphics/line/Line'; import CircleProperty from './properties/CircleProperty.vue'; import { Circle } from 'src/graphics/circle/Circle'; +import { watch } from 'vue'; const drawStore = useDrawStore(); +watch( + () => drawStore.selectedGraphics, + () => {} +); From 37c56e296230059a913dc18b1f522afed0798f87 Mon Sep 17 00:00:00 2001 From: joylink_fanyuhong <18706759286@163.com> Date: Fri, 11 Oct 2024 17:14:08 +0800 Subject: [PATCH 5/9] =?UTF-8?q?=E5=88=A0=E9=99=A4fas=E9=81=97=E7=95=99?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../draw-app/FireAlarmDrawProperties.vue | 50 -- src/drawApp/fasApp.ts | 89 --- src/layouts/FASDrawLayout.vue | 260 ------- src/protos/fas_graphic_data.ts | 682 ------------------ 4 files changed, 1081 deletions(-) delete mode 100644 src/components/draw-app/FireAlarmDrawProperties.vue delete mode 100644 src/drawApp/fasApp.ts delete mode 100644 src/layouts/FASDrawLayout.vue delete mode 100644 src/protos/fas_graphic_data.ts diff --git a/src/components/draw-app/FireAlarmDrawProperties.vue b/src/components/draw-app/FireAlarmDrawProperties.vue deleted file mode 100644 index 9ca8103..0000000 --- a/src/components/draw-app/FireAlarmDrawProperties.vue +++ /dev/null @@ -1,50 +0,0 @@ - - - diff --git a/src/drawApp/fasApp.ts b/src/drawApp/fasApp.ts deleted file mode 100644 index 4bbd13a..0000000 --- a/src/drawApp/fasApp.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { - CombinationKey, - IDrawApp, - IGraphicStorage, - JlGraphic, - KeyListener, - newDrawApp, -} from 'jl-graphic'; -import { FASGraphicData } from 'src/protos/fas_graphic_data'; -import { fromUint8Array } from 'js-base64'; -import { - initCommonDrawApp, - saveCommonDrawDatas, - saveDrawToServer, -} from './commonApp'; -import { useDrawStore } from 'src/stores/draw-store'; - -let drawApp: IDrawApp | null = null; - -export function getFASDrawApp(): IDrawApp | null { - return drawApp; -} - -export function destroyFASDrawApp(): void { - if (drawApp) { - drawApp.destroy(); - drawApp = null; - } -} - -export function initFASDrawApp(): IDrawApp { - const isSupportDeletion = (g: JlGraphic) => { - console.log(g); - return true; - }; - drawApp = newDrawApp({ - dataLoader: loadDrawDatas, - isSupportDeletion: isSupportDeletion, - }); - const app = drawApp; - initCommonDrawApp(app); - // new CCTVButtonDraw(app, new CCTVButtonTemplate(new CCTVButtonData())); - - app.addKeyboardListener( - new KeyListener({ - value: 'KeyS', - global: true, - combinations: [CombinationKey.Ctrl], - onPress: () => { - saveDrawToServer(saveDrawDatas(app)); - }, - }) - ); - return drawApp; -} - -export async function loadDrawDatas(): Promise { - const drawStore = useDrawStore(); - const id = drawStore.draftId; - if (!id) { - throw new Error('获取数据异常:为获取到草稿地图ID'); - } - /* const { proto: base64 } = await getDraft(id); - if (base64) { - const storage = iscsGraphicData.IscsGraphicStorage.deserialize( - toUint8Array(base64) - ); - const datas = loadCommonDrawDatas(storage);} */ - return Promise.resolve({ - datas: [], - }); -} - -export function saveDrawDatas(app: IDrawApp) { - let storage = new FASGraphicData.FASGraphicStorage(); - storage = saveCommonDrawDatas( - app, - storage - ) as FASGraphicData.FASGraphicStorage; - const graphics = app.queryStore.getAllGraphics(); - /* graphics.forEach((g) => { - if (TrackSection.Type === g.type) { - const trackSectionData = (g as TrackSection).saveData(); - storage.trackSections.push((trackSectionData as TrackSectionData).data); - } }) */ - console.log(storage, '保存数据', graphics); - const base64 = fromUint8Array(storage.serialize()); - return base64; -} diff --git a/src/layouts/FASDrawLayout.vue b/src/layouts/FASDrawLayout.vue deleted file mode 100644 index 2f6907e..0000000 --- a/src/layouts/FASDrawLayout.vue +++ /dev/null @@ -1,260 +0,0 @@ - - - diff --git a/src/protos/fas_graphic_data.ts b/src/protos/fas_graphic_data.ts deleted file mode 100644 index a1c4181..0000000 --- a/src/protos/fas_graphic_data.ts +++ /dev/null @@ -1,682 +0,0 @@ -/** - * Generated by the protoc-gen-ts. DO NOT EDIT! - * compiler version: 5.27.4 - * source: fas_graphic_data.proto - * git: https://github.com/thesayyn/protoc-gen-ts */ -import * as dependency_1 from "./iscs_graphic_data"; -import * as pb_1 from "google-protobuf"; -export namespace FASGraphicData { - export class FASGraphicStorage extends pb_1.Message { - #one_of_decls: number[][] = []; - constructor(data?: any[] | { - canvas?: dependency_1.iscsGraphicData.Canvas; - arrows?: dependency_1.iscsGraphicData.Arrow[]; - iscsTexts?: dependency_1.iscsGraphicData.IscsText[]; - rects?: dependency_1.iscsGraphicData.Rect[]; - manualAlarmButtons?: ManualAlarmButton[]; - hydrantAlarmButtons?: HydrantAlarmButton[]; - gasExtinguishings?: GasExtinguishing[]; - }) { - super(); - pb_1.Message.initialize(this, Array.isArray(data) ? data : [], 0, -1, [2, 3, 4, 5, 6, 7], this.#one_of_decls); - if (!Array.isArray(data) && typeof data == "object") { - if ("canvas" in data && data.canvas != undefined) { - this.canvas = data.canvas; - } - if ("arrows" in data && data.arrows != undefined) { - this.arrows = data.arrows; - } - if ("iscsTexts" in data && data.iscsTexts != undefined) { - this.iscsTexts = data.iscsTexts; - } - if ("rects" in data && data.rects != undefined) { - this.rects = data.rects; - } - if ("manualAlarmButtons" in data && data.manualAlarmButtons != undefined) { - this.manualAlarmButtons = data.manualAlarmButtons; - } - if ("hydrantAlarmButtons" in data && data.hydrantAlarmButtons != undefined) { - this.hydrantAlarmButtons = data.hydrantAlarmButtons; - } - if ("gasExtinguishings" in data && data.gasExtinguishings != undefined) { - this.gasExtinguishings = data.gasExtinguishings; - } - } - } - get canvas() { - return pb_1.Message.getWrapperField(this, dependency_1.iscsGraphicData.Canvas, 1) as dependency_1.iscsGraphicData.Canvas; - } - set canvas(value: dependency_1.iscsGraphicData.Canvas) { - pb_1.Message.setWrapperField(this, 1, value); - } - get has_canvas() { - return pb_1.Message.getField(this, 1) != null; - } - get arrows() { - return pb_1.Message.getRepeatedWrapperField(this, dependency_1.iscsGraphicData.Arrow, 2) as dependency_1.iscsGraphicData.Arrow[]; - } - set arrows(value: dependency_1.iscsGraphicData.Arrow[]) { - pb_1.Message.setRepeatedWrapperField(this, 2, value); - } - get iscsTexts() { - return pb_1.Message.getRepeatedWrapperField(this, dependency_1.iscsGraphicData.IscsText, 3) as dependency_1.iscsGraphicData.IscsText[]; - } - set iscsTexts(value: dependency_1.iscsGraphicData.IscsText[]) { - pb_1.Message.setRepeatedWrapperField(this, 3, value); - } - get rects() { - return pb_1.Message.getRepeatedWrapperField(this, dependency_1.iscsGraphicData.Rect, 4) as dependency_1.iscsGraphicData.Rect[]; - } - set rects(value: dependency_1.iscsGraphicData.Rect[]) { - pb_1.Message.setRepeatedWrapperField(this, 4, value); - } - get manualAlarmButtons() { - return pb_1.Message.getRepeatedWrapperField(this, ManualAlarmButton, 5) as ManualAlarmButton[]; - } - set manualAlarmButtons(value: ManualAlarmButton[]) { - pb_1.Message.setRepeatedWrapperField(this, 5, value); - } - get hydrantAlarmButtons() { - return pb_1.Message.getRepeatedWrapperField(this, HydrantAlarmButton, 6) as HydrantAlarmButton[]; - } - set hydrantAlarmButtons(value: HydrantAlarmButton[]) { - pb_1.Message.setRepeatedWrapperField(this, 6, value); - } - get gasExtinguishings() { - return pb_1.Message.getRepeatedWrapperField(this, GasExtinguishing, 7) as GasExtinguishing[]; - } - set gasExtinguishings(value: GasExtinguishing[]) { - pb_1.Message.setRepeatedWrapperField(this, 7, value); - } - static fromObject(data: { - canvas?: ReturnType; - arrows?: ReturnType[]; - iscsTexts?: ReturnType[]; - rects?: ReturnType[]; - manualAlarmButtons?: ReturnType[]; - hydrantAlarmButtons?: ReturnType[]; - gasExtinguishings?: ReturnType[]; - }): FASGraphicStorage { - const message = new FASGraphicStorage({}); - if (data.canvas != null) { - message.canvas = dependency_1.iscsGraphicData.Canvas.fromObject(data.canvas); - } - if (data.arrows != null) { - message.arrows = data.arrows.map(item => dependency_1.iscsGraphicData.Arrow.fromObject(item)); - } - if (data.iscsTexts != null) { - message.iscsTexts = data.iscsTexts.map(item => dependency_1.iscsGraphicData.IscsText.fromObject(item)); - } - if (data.rects != null) { - message.rects = data.rects.map(item => dependency_1.iscsGraphicData.Rect.fromObject(item)); - } - if (data.manualAlarmButtons != null) { - message.manualAlarmButtons = data.manualAlarmButtons.map(item => ManualAlarmButton.fromObject(item)); - } - if (data.hydrantAlarmButtons != null) { - message.hydrantAlarmButtons = data.hydrantAlarmButtons.map(item => HydrantAlarmButton.fromObject(item)); - } - if (data.gasExtinguishings != null) { - message.gasExtinguishings = data.gasExtinguishings.map(item => GasExtinguishing.fromObject(item)); - } - return message; - } - toObject() { - const data: { - canvas?: ReturnType; - arrows?: ReturnType[]; - iscsTexts?: ReturnType[]; - rects?: ReturnType[]; - manualAlarmButtons?: ReturnType[]; - hydrantAlarmButtons?: ReturnType[]; - gasExtinguishings?: ReturnType[]; - } = {}; - if (this.canvas != null) { - data.canvas = this.canvas.toObject(); - } - if (this.arrows != null) { - data.arrows = this.arrows.map((item: dependency_1.iscsGraphicData.Arrow) => item.toObject()); - } - if (this.iscsTexts != null) { - data.iscsTexts = this.iscsTexts.map((item: dependency_1.iscsGraphicData.IscsText) => item.toObject()); - } - if (this.rects != null) { - data.rects = this.rects.map((item: dependency_1.iscsGraphicData.Rect) => item.toObject()); - } - if (this.manualAlarmButtons != null) { - data.manualAlarmButtons = this.manualAlarmButtons.map((item: ManualAlarmButton) => item.toObject()); - } - if (this.hydrantAlarmButtons != null) { - data.hydrantAlarmButtons = this.hydrantAlarmButtons.map((item: HydrantAlarmButton) => item.toObject()); - } - if (this.gasExtinguishings != null) { - data.gasExtinguishings = this.gasExtinguishings.map((item: GasExtinguishing) => item.toObject()); - } - 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_canvas) - writer.writeMessage(1, this.canvas, () => this.canvas.serialize(writer)); - if (this.arrows.length) - writer.writeRepeatedMessage(2, this.arrows, (item: dependency_1.iscsGraphicData.Arrow) => item.serialize(writer)); - if (this.iscsTexts.length) - writer.writeRepeatedMessage(3, this.iscsTexts, (item: dependency_1.iscsGraphicData.IscsText) => item.serialize(writer)); - if (this.rects.length) - writer.writeRepeatedMessage(4, this.rects, (item: dependency_1.iscsGraphicData.Rect) => item.serialize(writer)); - if (this.manualAlarmButtons.length) - writer.writeRepeatedMessage(5, this.manualAlarmButtons, (item: ManualAlarmButton) => item.serialize(writer)); - if (this.hydrantAlarmButtons.length) - writer.writeRepeatedMessage(6, this.hydrantAlarmButtons, (item: HydrantAlarmButton) => item.serialize(writer)); - if (this.gasExtinguishings.length) - writer.writeRepeatedMessage(7, this.gasExtinguishings, (item: GasExtinguishing) => item.serialize(writer)); - if (!w) - return writer.getResultBuffer(); - } - static deserialize(bytes: Uint8Array | pb_1.BinaryReader): FASGraphicStorage { - const reader = bytes instanceof pb_1.BinaryReader ? bytes : new pb_1.BinaryReader(bytes), message = new FASGraphicStorage(); - while (reader.nextField()) { - if (reader.isEndGroup()) - break; - switch (reader.getFieldNumber()) { - case 1: - reader.readMessage(message.canvas, () => message.canvas = dependency_1.iscsGraphicData.Canvas.deserialize(reader)); - break; - case 2: - reader.readMessage(message.arrows, () => pb_1.Message.addToRepeatedWrapperField(message, 2, dependency_1.iscsGraphicData.Arrow.deserialize(reader), dependency_1.iscsGraphicData.Arrow)); - break; - case 3: - reader.readMessage(message.iscsTexts, () => pb_1.Message.addToRepeatedWrapperField(message, 3, dependency_1.iscsGraphicData.IscsText.deserialize(reader), dependency_1.iscsGraphicData.IscsText)); - break; - case 4: - reader.readMessage(message.rects, () => pb_1.Message.addToRepeatedWrapperField(message, 4, dependency_1.iscsGraphicData.Rect.deserialize(reader), dependency_1.iscsGraphicData.Rect)); - break; - case 5: - reader.readMessage(message.manualAlarmButtons, () => pb_1.Message.addToRepeatedWrapperField(message, 5, ManualAlarmButton.deserialize(reader), ManualAlarmButton)); - break; - case 6: - reader.readMessage(message.hydrantAlarmButtons, () => pb_1.Message.addToRepeatedWrapperField(message, 6, HydrantAlarmButton.deserialize(reader), HydrantAlarmButton)); - break; - case 7: - reader.readMessage(message.gasExtinguishings, () => pb_1.Message.addToRepeatedWrapperField(message, 7, GasExtinguishing.deserialize(reader), GasExtinguishing)); - break; - default: reader.skipField(); - } - } - return message; - } - serializeBinary(): Uint8Array { - return this.serialize(); - } - static deserializeBinary(bytes: Uint8Array): FASGraphicStorage { - return FASGraphicStorage.deserialize(bytes); - } - } - export class ManualAlarmButton extends pb_1.Message { - #one_of_decls: number[][] = []; - constructor(data?: any[] | { - common?: dependency_1.iscsGraphicData.CommonInfo; - code?: 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; - } - } - } - get common() { - return pb_1.Message.getWrapperField(this, dependency_1.iscsGraphicData.CommonInfo, 1) as dependency_1.iscsGraphicData.CommonInfo; - } - set common(value: dependency_1.iscsGraphicData.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); - } - static fromObject(data: { - common?: ReturnType; - code?: string; - }): ManualAlarmButton { - const message = new ManualAlarmButton({}); - if (data.common != null) { - message.common = dependency_1.iscsGraphicData.CommonInfo.fromObject(data.common); - } - if (data.code != null) { - message.code = data.code; - } - return message; - } - toObject() { - const data: { - common?: ReturnType; - code?: string; - } = {}; - if (this.common != null) { - data.common = this.common.toObject(); - } - if (this.code != null) { - data.code = this.code; - } - 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 (!w) - return writer.getResultBuffer(); - } - static deserialize(bytes: Uint8Array | pb_1.BinaryReader): ManualAlarmButton { - const reader = bytes instanceof pb_1.BinaryReader ? bytes : new pb_1.BinaryReader(bytes), message = new ManualAlarmButton(); - while (reader.nextField()) { - if (reader.isEndGroup()) - break; - switch (reader.getFieldNumber()) { - case 1: - reader.readMessage(message.common, () => message.common = dependency_1.iscsGraphicData.CommonInfo.deserialize(reader)); - break; - case 2: - message.code = reader.readString(); - break; - default: reader.skipField(); - } - } - return message; - } - serializeBinary(): Uint8Array { - return this.serialize(); - } - static deserializeBinary(bytes: Uint8Array): ManualAlarmButton { - return ManualAlarmButton.deserialize(bytes); - } - } - export class HydrantAlarmButton extends pb_1.Message { - #one_of_decls: number[][] = []; - constructor(data?: any[] | { - common?: dependency_1.iscsGraphicData.CommonInfo; - code?: 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; - } - } - } - get common() { - return pb_1.Message.getWrapperField(this, dependency_1.iscsGraphicData.CommonInfo, 1) as dependency_1.iscsGraphicData.CommonInfo; - } - set common(value: dependency_1.iscsGraphicData.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); - } - static fromObject(data: { - common?: ReturnType; - code?: string; - }): HydrantAlarmButton { - const message = new HydrantAlarmButton({}); - if (data.common != null) { - message.common = dependency_1.iscsGraphicData.CommonInfo.fromObject(data.common); - } - if (data.code != null) { - message.code = data.code; - } - return message; - } - toObject() { - const data: { - common?: ReturnType; - code?: string; - } = {}; - if (this.common != null) { - data.common = this.common.toObject(); - } - if (this.code != null) { - data.code = this.code; - } - 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 (!w) - return writer.getResultBuffer(); - } - static deserialize(bytes: Uint8Array | pb_1.BinaryReader): HydrantAlarmButton { - const reader = bytes instanceof pb_1.BinaryReader ? bytes : new pb_1.BinaryReader(bytes), message = new HydrantAlarmButton(); - while (reader.nextField()) { - if (reader.isEndGroup()) - break; - switch (reader.getFieldNumber()) { - case 1: - reader.readMessage(message.common, () => message.common = dependency_1.iscsGraphicData.CommonInfo.deserialize(reader)); - break; - case 2: - message.code = reader.readString(); - break; - default: reader.skipField(); - } - } - return message; - } - serializeBinary(): Uint8Array { - return this.serialize(); - } - static deserializeBinary(bytes: Uint8Array): HydrantAlarmButton { - return HydrantAlarmButton.deserialize(bytes); - } - } - export class GasExtinguishing extends pb_1.Message { - #one_of_decls: number[][] = []; - constructor(data?: any[] | { - common?: dependency_1.iscsGraphicData.CommonInfo; - code?: 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; - } - } - } - get common() { - return pb_1.Message.getWrapperField(this, dependency_1.iscsGraphicData.CommonInfo, 1) as dependency_1.iscsGraphicData.CommonInfo; - } - set common(value: dependency_1.iscsGraphicData.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); - } - static fromObject(data: { - common?: ReturnType; - code?: string; - }): GasExtinguishing { - const message = new GasExtinguishing({}); - if (data.common != null) { - message.common = dependency_1.iscsGraphicData.CommonInfo.fromObject(data.common); - } - if (data.code != null) { - message.code = data.code; - } - return message; - } - toObject() { - const data: { - common?: ReturnType; - code?: string; - } = {}; - if (this.common != null) { - data.common = this.common.toObject(); - } - if (this.code != null) { - data.code = this.code; - } - 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 (!w) - return writer.getResultBuffer(); - } - static deserialize(bytes: Uint8Array | pb_1.BinaryReader): GasExtinguishing { - const reader = bytes instanceof pb_1.BinaryReader ? bytes : new pb_1.BinaryReader(bytes), message = new GasExtinguishing(); - while (reader.nextField()) { - if (reader.isEndGroup()) - break; - switch (reader.getFieldNumber()) { - case 1: - reader.readMessage(message.common, () => message.common = dependency_1.iscsGraphicData.CommonInfo.deserialize(reader)); - break; - case 2: - message.code = reader.readString(); - break; - default: reader.skipField(); - } - } - return message; - } - serializeBinary(): Uint8Array { - return this.serialize(); - } - static deserializeBinary(bytes: Uint8Array): GasExtinguishing { - return GasExtinguishing.deserialize(bytes); - } - } - export class SmokeDetector extends pb_1.Message { - #one_of_decls: number[][] = []; - constructor(data?: any[] | { - common?: dependency_1.iscsGraphicData.CommonInfo; - code?: 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; - } - } - } - get common() { - return pb_1.Message.getWrapperField(this, dependency_1.iscsGraphicData.CommonInfo, 1) as dependency_1.iscsGraphicData.CommonInfo; - } - set common(value: dependency_1.iscsGraphicData.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); - } - static fromObject(data: { - common?: ReturnType; - code?: string; - }): SmokeDetector { - const message = new SmokeDetector({}); - if (data.common != null) { - message.common = dependency_1.iscsGraphicData.CommonInfo.fromObject(data.common); - } - if (data.code != null) { - message.code = data.code; - } - return message; - } - toObject() { - const data: { - common?: ReturnType; - code?: string; - } = {}; - if (this.common != null) { - data.common = this.common.toObject(); - } - if (this.code != null) { - data.code = this.code; - } - 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 (!w) - return writer.getResultBuffer(); - } - static deserialize(bytes: Uint8Array | pb_1.BinaryReader): SmokeDetector { - const reader = bytes instanceof pb_1.BinaryReader ? bytes : new pb_1.BinaryReader(bytes), message = new SmokeDetector(); - while (reader.nextField()) { - if (reader.isEndGroup()) - break; - switch (reader.getFieldNumber()) { - case 1: - reader.readMessage(message.common, () => message.common = dependency_1.iscsGraphicData.CommonInfo.deserialize(reader)); - break; - case 2: - message.code = reader.readString(); - break; - default: reader.skipField(); - } - } - return message; - } - serializeBinary(): Uint8Array { - return this.serialize(); - } - static deserializeBinary(bytes: Uint8Array): SmokeDetector { - return SmokeDetector.deserialize(bytes); - } - } - export class TemperatureDetector extends pb_1.Message { - #one_of_decls: number[][] = []; - constructor(data?: any[] | { - common?: dependency_1.iscsGraphicData.CommonInfo; - code?: 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; - } - } - } - get common() { - return pb_1.Message.getWrapperField(this, dependency_1.iscsGraphicData.CommonInfo, 1) as dependency_1.iscsGraphicData.CommonInfo; - } - set common(value: dependency_1.iscsGraphicData.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); - } - static fromObject(data: { - common?: ReturnType; - code?: string; - }): TemperatureDetector { - const message = new TemperatureDetector({}); - if (data.common != null) { - message.common = dependency_1.iscsGraphicData.CommonInfo.fromObject(data.common); - } - if (data.code != null) { - message.code = data.code; - } - return message; - } - toObject() { - const data: { - common?: ReturnType; - code?: string; - } = {}; - if (this.common != null) { - data.common = this.common.toObject(); - } - if (this.code != null) { - data.code = this.code; - } - 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 (!w) - return writer.getResultBuffer(); - } - static deserialize(bytes: Uint8Array | pb_1.BinaryReader): TemperatureDetector { - const reader = bytes instanceof pb_1.BinaryReader ? bytes : new pb_1.BinaryReader(bytes), message = new TemperatureDetector(); - while (reader.nextField()) { - if (reader.isEndGroup()) - break; - switch (reader.getFieldNumber()) { - case 1: - reader.readMessage(message.common, () => message.common = dependency_1.iscsGraphicData.CommonInfo.deserialize(reader)); - break; - case 2: - message.code = reader.readString(); - break; - default: reader.skipField(); - } - } - return message; - } - serializeBinary(): Uint8Array { - return this.serialize(); - } - static deserializeBinary(bytes: Uint8Array): TemperatureDetector { - return TemperatureDetector.deserialize(bytes); - } - } -} From aacfdf8b2d5d14190865b22a8b735f4a9b212319 Mon Sep 17 00:00:00 2001 From: joylink_zhaoerwei Date: Sat, 12 Oct 2024 17:02:24 +0800 Subject: [PATCH 6/9] =?UTF-8?q?=E5=AE=8C=E5=96=84=E7=BB=98=E5=88=B6?= =?UTF-8?q?=E9=A3=8E=E6=A0=BC=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Iscs/IscsBottomAlarm.vue | 3 + src/configs/iscsStyleConfig.ts | 106 +++++++++++++++++----- src/graphics/line/LineDrawAssistant.ts | 8 ++ src/layouts/IscsDrawLayout.vue | 111 +++++++++++++++++------- 4 files changed, 175 insertions(+), 53 deletions(-) create mode 100644 src/components/Iscs/IscsBottomAlarm.vue diff --git a/src/components/Iscs/IscsBottomAlarm.vue b/src/components/Iscs/IscsBottomAlarm.vue new file mode 100644 index 0000000..4257433 --- /dev/null +++ b/src/components/Iscs/IscsBottomAlarm.vue @@ -0,0 +1,3 @@ + diff --git a/src/configs/iscsStyleConfig.ts b/src/configs/iscsStyleConfig.ts index 1ea6482..34b1d67 100644 --- a/src/configs/iscsStyleConfig.ts +++ b/src/configs/iscsStyleConfig.ts @@ -1,118 +1,182 @@ import { IscsStyle } from 'src/api/DraftApi'; +export interface I_DA_SHI_ZHI_NENG { + menuName: string; + icon: string; + activeIcon: string; + sunMenu: { + sunMenuName: string; + displayForm: DisplayForm; + heightPercent?: number; //绘制占的百分比 + }[]; +} + +export enum DisplayForm { + draw, + component, + drawAndComponent, +} + //达实智能(福州一号线) -const DA_SHI_ZHI_NENG = [ +const DA_SHI_ZHI_NENG: I_DA_SHI_ZHI_NENG[] = [ { menuName: 'Plan', icon: 'svguse:../iscsMenuIcon.svg#icon-Plan', activeIcon: 'svguse:../iscsMenuIcon.svg#icon-Plan-active', - sunMenu: [{ sunMenuName: '子目录' }], + sunMenu: [ + { sunMenuName: '设备运行图', displayForm: DisplayForm.draw }, + { sunMenuName: '站厅布局图', displayForm: DisplayForm.draw }, + { sunMenuName: '站台布局图', displayForm: DisplayForm.draw }, + { sunMenuName: '出入口布局图', displayForm: DisplayForm.draw }, + ], }, { menuName: 'PSCADA', icon: 'svguse:../iscsMenuIcon.svg#icon-PSCADA', activeIcon: 'svguse:../iscsMenuIcon.svg#icon-PSCADA-active', - sunMenu: [{ sunMenuName: '子目录' }], + sunMenu: [ + { sunMenuName: '一次图', displayForm: DisplayForm.draw }, + { sunMenuName: '自动化系统图', displayForm: DisplayForm.draw }, + { sunMenuName: '定值召唤', displayForm: DisplayForm.draw }, + { sunMenuName: '实时SOE', displayForm: DisplayForm.draw }, + { sunMenuName: '历史SOE', displayForm: DisplayForm.draw }, + { sunMenuName: '光字幕', displayForm: DisplayForm.draw }, + { sunMenuName: '交流直屏', displayForm: DisplayForm.draw }, + ], }, { menuName: 'BAS', icon: 'svguse:../iscsMenuIcon.svg#icon-BAS', activeIcon: 'svguse:../iscsMenuIcon.svg#icon-BAS-active', - sunMenu: [{ sunMenuName: '子目录' }], + sunMenu: [ + { sunMenuName: '大系统', displayForm: DisplayForm.draw }, + { sunMenuName: '小系统', displayForm: DisplayForm.draw }, + { sunMenuName: '隧道通风系统', displayForm: DisplayForm.draw }, + { sunMenuName: '水系统', displayForm: DisplayForm.draw }, + { sunMenuName: '给排水', displayForm: DisplayForm.draw }, + { sunMenuName: '电扶梯', displayForm: DisplayForm.draw }, + { sunMenuName: '照明系统', displayForm: DisplayForm.draw }, + { sunMenuName: '传感器', displayForm: DisplayForm.draw }, + { sunMenuName: '导向标识/广告', displayForm: DisplayForm.draw }, + { sunMenuName: '人防门', displayForm: DisplayForm.draw }, + { sunMenuName: 'BAS系统', displayForm: DisplayForm.draw }, + { sunMenuName: '模式控制', displayForm: DisplayForm.draw }, + { sunMenuName: '时间表', displayForm: DisplayForm.draw }, + { sunMenuName: '操作场所切换', displayForm: DisplayForm.draw }, + ], }, { menuName: 'FAS', icon: 'svguse:../iscsMenuIcon.svg#icon-FAS', activeIcon: 'svguse:../iscsMenuIcon.svg#icon-FAS-active', sunMenu: [ - { sunMenuName: '设备分区图' }, - { sunMenuName: '火灾报警平面图' }, - { sunMenuName: 'FAS气灭系统图' }, + { sunMenuName: '设备分区图', displayForm: DisplayForm.draw }, + { sunMenuName: '火灾报警平面图', displayForm: DisplayForm.draw }, + { sunMenuName: 'FAS气灭系统图', displayForm: DisplayForm.draw }, ], }, { menuName: 'TFDS', icon: 'svguse:../iscsMenuIcon.svg#icon-TFDS', activeIcon: 'svguse:../iscsMenuIcon.svg#icon-TFDS-active', - sunMenu: [{ sunMenuName: '子目录' }], + sunMenu: [ + { sunMenuName: '感温光纤状态监视图', displayForm: DisplayForm.draw }, + ], }, { menuName: 'AFC', icon: 'svguse:../iscsMenuIcon.svg#icon-AFC', activeIcon: 'svguse:../iscsMenuIcon.svg#icon-AFC-active', - sunMenu: [{ sunMenuName: '屏蔽门' }], + sunMenu: [ + { sunMenuName: '自动售检票系统监视图', displayForm: DisplayForm.draw }, + ], }, { menuName: 'CCTV', icon: 'svguse:../iscsMenuIcon.svg#icon-CCTV', activeIcon: 'svguse:../iscsMenuIcon.svg#icon-CCTV-active', - sunMenu: [{ sunMenuName: '监控布局图' }, { sunMenuName: 'CCTV设备布局图' }], + sunMenu: [ + { sunMenuName: '监控布局图', displayForm: DisplayForm.draw }, + { sunMenuName: 'CCTV设备布局图', displayForm: DisplayForm.draw }, + ], }, { menuName: 'PIS', icon: 'svguse:../iscsMenuIcon.svg#icon-PIS', activeIcon: 'svguse:../iscsMenuIcon.svg#icon-PIS-active', - sunMenu: [{ sunMenuName: '子目录' }], + sunMenu: [{ sunMenuName: 'PIS监控', displayForm: DisplayForm.draw }], }, { menuName: 'PA', icon: 'svguse:../iscsMenuIcon.svg#icon-PA', activeIcon: 'svguse:../iscsMenuIcon.svg#icon-PA-active', - sunMenu: [{ sunMenuName: '子目录' }], + sunMenu: [{ sunMenuName: 'PA监控', displayForm: DisplayForm.draw }], }, { menuName: 'SIG/RAD', icon: 'svguse:../iscsMenuIcon.svg#icon-SIG/RAD', activeIcon: 'svguse:../iscsMenuIcon.svg#icon-SIG/RAD-active', - sunMenu: [{ sunMenuName: '子目录' }], + sunMenu: [{ sunMenuName: '子目录', displayForm: DisplayForm.component }], }, { menuName: 'ACS', icon: 'svguse:../iscsMenuIcon.svg#icon-ACS', activeIcon: 'svguse:../iscsMenuIcon.svg#icon-ACS-active', - sunMenu: [{ sunMenuName: '子目录' }], + sunMenu: [ + { sunMenuName: '门禁总览图', displayForm: DisplayForm.draw }, + { sunMenuName: '门禁监视布局图-站厅', displayForm: DisplayForm.draw }, + { sunMenuName: '门禁监视布局图-站台', displayForm: DisplayForm.draw }, + ], }, { menuName: 'PSD', icon: 'svguse:../iscsMenuIcon.svg#icon-PSD', activeIcon: 'svguse:../iscsMenuIcon.svg#icon-PSD-active', - sunMenu: [{ sunMenuName: '子目录' }], + sunMenu: [{ sunMenuName: '屏蔽门系统图', displayForm: DisplayForm.draw }], }, { menuName: 'FG', icon: 'svguse:../iscsMenuIcon.svg#icon-FG', activeIcon: 'svguse:../iscsMenuIcon.svg#icon-FG-active', - sunMenu: [{ sunMenuName: '子目录' }], + sunMenu: [ + { sunMenuName: '防淹门状态监视图', displayForm: DisplayForm.draw }, + ], }, { menuName: 'ALM', icon: 'svguse:../iscsMenuIcon.svg#icon-ALM', activeIcon: 'svguse:../iscsMenuIcon.svg#icon-ALM-active', - sunMenu: [{ sunMenuName: '子目录' }], + sunMenu: [{ sunMenuName: '子目录', displayForm: DisplayForm.component }], }, { menuName: 'NMS', icon: 'svguse:../iscsMenuIcon.svg#icon-NMS', activeIcon: 'svguse:../iscsMenuIcon.svg#icon-NMS-active', - sunMenu: [{ sunMenuName: '子目录' }], + sunMenu: [{ sunMenuName: '网络状态监视图', displayForm: DisplayForm.draw }], }, { menuName: 'OPS', icon: 'svguse:../iscsMenuIcon.svg#icon-OPS', activeIcon: 'svguse:../iscsMenuIcon.svg#icon-OPS-active', - sunMenu: [{ sunMenuName: '子目录' }], + sunMenu: [{ sunMenuName: '子目录', displayForm: DisplayForm.component }], }, { menuName: '数据', icon: 'svguse:../iscsMenuIcon.svg#icon-Data', activeIcon: 'svguse:../iscsMenuIcon.svg#icon-Data-active', - sunMenu: [{ sunMenuName: '子目录' }], + sunMenu: [{ sunMenuName: '子目录', displayForm: DisplayForm.component }], }, { menuName: '联动', icon: 'svguse:../iscsMenuIcon.svg#icon-Linkage', activeIcon: 'svguse:../iscsMenuIcon.svg#icon-Linkage-active', - sunMenu: [{ sunMenuName: '子目录' }], + sunMenu: [ + { + sunMenuName: '子目录', + displayForm: DisplayForm.drawAndComponent, + heightPercent: 50, + }, + ], }, ]; diff --git a/src/graphics/line/LineDrawAssistant.ts b/src/graphics/line/LineDrawAssistant.ts index 2fa48bb..e6384e9 100644 --- a/src/graphics/line/LineDrawAssistant.ts +++ b/src/graphics/line/LineDrawAssistant.ts @@ -110,6 +110,14 @@ export class LineDraw extends GraphicDrawAssistant { } } + onRightClick(): void { + if (this.points.length < 2) { + this.finish(); + return; + } + this.createAndStore(true); + } + onEsc(): void { if (this.points.length < 2) { this.finish(); diff --git a/src/layouts/IscsDrawLayout.vue b/src/layouts/IscsDrawLayout.vue index 0075626..ee90b38 100644 --- a/src/layouts/IscsDrawLayout.vue +++ b/src/layouts/IscsDrawLayout.vue @@ -8,6 +8,14 @@ {{ currentTime }}
+ @@ -167,13 +175,26 @@ -
+
+ +
+ 组件展示 +
- - 状态栏 - + @@ -210,16 +231,8 @@ :height="drawDialogHeight" v-model="showDrawTool" canNotClose + position="left" > -
- - - @@ -250,7 +260,11 @@ import { CCTVButton } from 'src/graphics/CCTV/cctvButton/CCTVButton'; import { Arrow } from 'src/graphics/arrow/Arrow'; import { TextContent } from 'src/graphics/textContent/TextContent'; import { Rect } from 'src/graphics/rect/Rect'; -import { getIscsStyleConfig } from 'src/configs/iscsStyleConfig'; +import { + DisplayForm, + getIscsStyleConfig, + I_DA_SHI_ZHI_NENG, +} from 'src/configs/iscsStyleConfig'; import { IscsStyle, saveAsDraft } from 'src/api/DraftApi'; import DraggableDialog from 'src/components/common/DraggableDialog.vue'; import { successNotify } from 'src/utils/CommonNotify'; @@ -263,6 +277,7 @@ import { JlOperation } from 'jl-graphic'; import { common } from 'src/protos/common'; import { toStorageTransform } from 'src/drawApp/graphics/GraphicDataBase'; import { Circle } from 'src/graphics/circle/Circle'; +import IscsBottomAlarm from 'src/components/Iscs/IscsBottomAlarm.vue'; const $q = useQuasar(); const route = useRoute(); @@ -531,8 +546,16 @@ function onResize() { canvasHeight.value = clientHeight - headerHeight.value - footerHeight.value; const dom = document.getElementById('draw-app-container'); if (dom) { - dom.style.width = canvasWidth.value + 'px'; - dom.style.height = canvasHeight.value + 'px'; + if (subMenuDisplayForm.value == DisplayForm.draw) { + dom.style.width = canvasWidth.value + 'px'; + dom.style.height = canvasHeight.value + 'px'; + } else if (subMenuDisplayForm.value == DisplayForm.drawAndComponent) { + const heightPercent = subMenuOption.value.find( + (subMenu) => subMenu.value == selectSubMenuName.value + ).heightPercent; + dom.style.width = canvasWidth.value + 'px'; + dom.style.height = (heightPercent / 100) * canvasHeight.value + 'px'; + } } } @@ -575,6 +598,7 @@ const updateTime = () => { }; //目录车站切换 +const subMenuDisplayForm = ref(DisplayForm.draw); const selectMenuName = ref(''); let menuOption = []; function selectedMenu(menuName: string) { @@ -582,30 +606,45 @@ function selectedMenu(menuName: string) { for (let i = 0; i < iscsTypeConfig.length; i++) { if (iscsTypeConfig[i].menuName == menuName) { subMenuOption.value = iscsTypeConfig[i].sunMenu.map((sunMenu) => { - return { label: sunMenu.sunMenuName, value: sunMenu.sunMenuName }; + return { + label: sunMenu.sunMenuName, + value: sunMenu.sunMenuName, + displayForm: sunMenu.displayForm, + heightPercent: sunMenu?.heightPercent || 0, + }; }); selectSubMenuName.value = subMenuOption.value[0].value; selectedSubMenu(selectSubMenuName.value); break; } } - handleUtilsOption(); } const selectSubMenuName = ref(''); -const subMenuOption = ref([]); +const subMenuOption = ref< + { + label: string; + value: string; + displayForm: DisplayForm; + heightPercent?: number; + }[] +>([]); function selectedSubMenu(subName: string) { drawStore.selectSubmenuAndStation.submenu = subName; - forceReloadDate(); - handleUtilsOption(); + subMenuDisplayForm.value = subMenuOption.value.find( + (subMenu) => subMenu.value == subName + ).displayForm; + if (subMenuDisplayForm.value !== DisplayForm.component) { + showDrawTool.value = true; + forceReloadDate(); + handleUtilsOption(); + } else { + showDrawTool.value = false; + } + onResize(); } -let iscsTypeConfig: { - menuName: string; - icon: string; - activeIcon: string; - sunMenu: { sunMenuName: string }[]; -}[] = []; +let iscsTypeConfig: I_DA_SHI_ZHI_NENG[] = []; function initMunuOption() { iscsTypeConfig = getIscsStyleConfig(route.query.iscsStyle as IscsStyle); menuOption = iscsTypeConfig.map((menu) => { @@ -618,9 +657,17 @@ function initMunuOption() { }); selectMenuName.value = menuOption[0].value; subMenuOption.value = iscsTypeConfig[0].sunMenu.map((sunMenu) => { - return { label: sunMenu.sunMenuName, value: sunMenu.sunMenuName }; + return { + label: sunMenu.sunMenuName, + value: sunMenu.sunMenuName, + displayForm: sunMenu.displayForm, + heightPercent: sunMenu?.heightPercent || 0, + }; }); selectSubMenuName.value = subMenuOption.value[0].value; + subMenuDisplayForm.value = subMenuOption.value[0].displayForm; + showDrawTool.value = + subMenuOption.value[0].displayForm !== DisplayForm.component; drawStore.selectSubmenuAndStation.submenu = selectSubMenuName.value; drawStore.selectSubmenuAndStation.station = stationOption[0].value; } @@ -733,7 +780,7 @@ onUnmounted(() => { top: 10px; } .menu-nav-text { - width: 90px; + width: 4.8vw; margin-top: 28px; text-align: center; color: white; From 0787c7419ed6444e7c44c4128706bf80472c0295 Mon Sep 17 00:00:00 2001 From: joylink_fanyuhong <18706759286@163.com> Date: Mon, 14 Oct 2024 15:36:57 +0800 Subject: [PATCH 7/9] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- src/drawApp/iscsApp.ts | 5 +++++ yarn.lock | 6 +++--- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index e89c56b..d5711f4 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "@quasar/extras": "^1.16.4", "axios": "^1.2.1", "google-protobuf": "^3.21.4", - "jl-graphic": "git+https://gitea.joylink.club/joylink/graphic-pixi.git#v0.1.18", + "jl-graphic": "git+https://gitea.joylink.club/joylink/graphic-pixi.git#v0.1.19", "js-base64": "^3.7.5", "pinia": "^2.0.11", "quasar": "^2.16.0", diff --git a/src/drawApp/iscsApp.ts b/src/drawApp/iscsApp.ts index 73c3063..11ff46e 100644 --- a/src/drawApp/iscsApp.ts +++ b/src/drawApp/iscsApp.ts @@ -6,6 +6,7 @@ import { KeyListener, newDrawApp, ClientEngine, + GraphicIdGenerator, } from 'jl-graphic'; import { @@ -107,6 +108,10 @@ function handleSubscribe(app: IDrawApp) { const proto = handlerTypeData(data); const template = app.getGraphicTemplatesByType(proto.graphicType); const g = template.new(); + if (app.queryStore.checkIdExist(proto.id)) { + const newId = GraphicIdGenerator.next(); + proto.id = newId; + } g.loadData(proto); app.addGraphics(g); }); diff --git a/yarn.lock b/yarn.lock index 0444ae5..8e0a362 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2528,9 +2528,9 @@ isobject@^3.0.1: resolved "https://mirrors.huaweicloud.com/repository/npm/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== -"jl-graphic@git+https://gitea.joylink.club/joylink/graphic-pixi.git#v0.1.18": - version "0.1.16" - resolved "git+https://gitea.joylink.club/joylink/graphic-pixi.git#38045a10271f81b65820db402051fefc62b0a2cd" +"jl-graphic@git+https://gitea.joylink.club/joylink/graphic-pixi.git#v0.1.19": + version "0.1.18" + resolved "git+https://gitea.joylink.club/joylink/graphic-pixi.git#1c803d096585e258be3f60d3d95d1bd0c318d316" dependencies: "@pixi/graphics-extras" "^7.3.2" "@pixi/utils" "^7.3.2" From 16230d77e44151e176a3c555c7d4a13b50461bb5 Mon Sep 17 00:00:00 2001 From: joylink_zhaoerwei Date: Mon, 14 Oct 2024 17:12:22 +0800 Subject: [PATCH 8/9] =?UTF-8?q?ISCS=E5=BA=95=E9=83=A8=E6=8A=A5=E8=AD=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Iscs/IscsBottomAlarm.vue | 245 +++++++++++++++++++++++- 1 file changed, 244 insertions(+), 1 deletion(-) diff --git a/src/components/Iscs/IscsBottomAlarm.vue b/src/components/Iscs/IscsBottomAlarm.vue index 4257433..878be6a 100644 --- a/src/components/Iscs/IscsBottomAlarm.vue +++ b/src/components/Iscs/IscsBottomAlarm.vue @@ -1,3 +1,246 @@ + + + + From 391863ee21f381b662695efe88a5258783ffb0b1 Mon Sep 17 00:00:00 2001 From: joylink_fanyuhong <18706759286@163.com> Date: Tue, 15 Oct 2024 09:55:43 +0800 Subject: [PATCH 9/9] =?UTF-8?q?=E4=BF=AE=E6=94=B9icon=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 43 ++++++++++++++++++++++++------- public/icons/favicon-128x128.png | Bin 12324 -> 10457 bytes public/icons/favicon-16x16.png | Bin 859 -> 671 bytes public/icons/favicon-32x32.png | Bin 2039 -> 1885 bytes public/icons/favicon-96x96.png | Bin 9643 -> 7675 bytes public/logo_changan.png | Bin 0 -> 52245 bytes 6 files changed, 33 insertions(+), 10 deletions(-) create mode 100644 public/logo_changan.png diff --git a/index.html b/index.html index 3c8c78f..e84ac37 100644 --- a/index.html +++ b/index.html @@ -3,17 +3,40 @@ <%= productName %> - - - - - + + + + + - - - - - + + + + + diff --git a/public/icons/favicon-128x128.png b/public/icons/favicon-128x128.png index 14011761929f4ffbef81be318a347c0032eb6f42..19f39dae208f5ef170d0a35970e1bd120b4b2fb0 100644 GIT binary patch literal 10457 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 P00000NkvXXu0mjf$?xV8 literal 12324 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 diff --git a/public/icons/favicon-96x96.png b/public/icons/favicon-96x96.png index e93b80a09c82e1c1a0be4dfd7fdd032e76f77096..1f56598bca88088fa76efddee48db9f1254eab6a 100644 GIT binary patch literal 7675 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 qvIu)bithDJokjmJUZmLF{|rCMcQj&xurv+