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 8c6519f..73c3063 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'; @@ -279,6 +282,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++) { @@ -316,6 +320,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; } @@ -325,12 +338,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 ea0ec81..9521940 100644 --- a/src/layouts/IscsDrawLayout.vue +++ b/src/layouts/IscsDrawLayout.vue @@ -308,7 +308,7 @@ function toggleRightDrawer() { //工具栏所用 const selectUtil = ref(); -const utilsOption: ControlItem[] = reactive([]); +let utilsOption: ControlItem[] = reactive([]); function drawSelect(item: string) { drawStore.getDrawApp().interactionPlugin(item).resume(); @@ -330,6 +330,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 }, @@ -378,122 +406,99 @@ onMounted(() => { } 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, - 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(); }); +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() + ); +} + const canvasWidth = ref(0); const canvasHeight = ref(0); const headerHeight = ref(0); @@ -581,6 +586,7 @@ function selectedMenu(menuName: string) { break; } } + handleUtilsOption(); } const selectSubMenuName = ref(''); @@ -588,6 +594,7 @@ const subMenuOption = ref([]); function selectedSubMenu(subName: string) { drawStore.selectSubmenuAndStation.submenu = subName; forceReloadDate(); + handleUtilsOption(); } let iscsTypeConfig: {