From 1fa571f77762d165e7168f7156111e2aa1501bac Mon Sep 17 00:00:00 2001 From: joylink_zhaoerwei Date: Fri, 15 Mar 2024 16:41:38 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=97=E8=BD=A6=E6=8E=A7=E5=88=B6=E5=AE=A4?= =?UTF-8?q?=E7=9B=B8=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/draw-app/TccDrawProperties.vue | 14 +- .../draw-app/properties/TccButtonProperty.vue | 15 - .../draw-app/properties/TccHandleProperty.vue | 24 ++ .../draw-app/properties/TccKeyProperty.vue | 44 +++ src/drawApp/graphics/TccButtonInteraction.ts | 6 - src/drawApp/graphics/TccHandleInteraction.ts | 132 ++++++++ src/drawApp/graphics/TccKeyInteraction.ts | 108 +++++++ src/drawApp/tccApp.ts | 39 ++- src/drawApp/tccScene.ts | 35 ++- src/graphics/tccButton/TccButton.ts | 20 +- src/graphics/tccHandle/TccHandle.ts | 87 +++++ .../tccHandle/TccHandleDrawAssistant.ts | 116 +++++++ src/graphics/tccHandle/tcc-handle-data.json | 28 ++ .../tccHandle/tcc-handle-spritesheet.png | Bin 0 -> 10285 bytes src/graphics/tccKey/TccKey.ts | 101 ++++++ src/graphics/tccKey/TccKeyDrawAssistant.ts | 114 +++++++ src/graphics/tccKey/tcc-key-data.json | 39 +++ src/graphics/tccKey/tcc-key-spritesheet.png | Bin 0 -> 79247 bytes src/layouts/TrainControlCabDrawLayout.vue | 9 +- src/protos/tccGraphics.ts | 296 ++++++++++++++++-- 20 files changed, 1147 insertions(+), 80 deletions(-) create mode 100644 src/components/draw-app/properties/TccHandleProperty.vue create mode 100644 src/components/draw-app/properties/TccKeyProperty.vue create mode 100644 src/drawApp/graphics/TccHandleInteraction.ts create mode 100644 src/drawApp/graphics/TccKeyInteraction.ts create mode 100644 src/graphics/tccHandle/TccHandle.ts create mode 100644 src/graphics/tccHandle/TccHandleDrawAssistant.ts create mode 100644 src/graphics/tccHandle/tcc-handle-data.json create mode 100644 src/graphics/tccHandle/tcc-handle-spritesheet.png create mode 100644 src/graphics/tccKey/TccKey.ts create mode 100644 src/graphics/tccKey/TccKeyDrawAssistant.ts create mode 100644 src/graphics/tccKey/tcc-key-data.json create mode 100644 src/graphics/tccKey/tcc-key-spritesheet.png diff --git a/src/components/draw-app/TccDrawProperties.vue b/src/components/draw-app/TccDrawProperties.vue index 5a7eb45..d9d601d 100644 --- a/src/components/draw-app/TccDrawProperties.vue +++ b/src/components/draw-app/TccDrawProperties.vue @@ -17,10 +17,16 @@ + /> + /> + + @@ -34,6 +40,10 @@ import { TccButton } from 'src/graphics/tccButton/TccButton'; import TccButtonProperty from './properties/TccButtonProperty.vue'; import { TextContent } from 'src/graphics/textContent/TextContent'; import TccTextProperty from './properties/TccTextProperty.vue'; +import { TccKey } from 'src/graphics/tccKey/TccKey'; +import TccKeyProperty from './properties/TccKeyProperty.vue'; +import { TccHandle } from 'src/graphics/tccHandle/TccHandle'; +import TccHandleProperty from './properties/TccHandleProperty.vue'; const tccDrawStore = useTccDrawStore(); diff --git a/src/components/draw-app/properties/TccButtonProperty.vue b/src/components/draw-app/properties/TccButtonProperty.vue index 1d2a699..742074f 100644 --- a/src/components/draw-app/properties/TccButtonProperty.vue +++ b/src/components/draw-app/properties/TccButtonProperty.vue @@ -8,15 +8,6 @@ label="紧急制动按钮" lazy-rules /> - import { TccButtonData } from 'src/drawApp/graphics/TccButtonInteraction'; -import { tccGraphicData } from 'src/protos/tccGraphics'; import { useFormData } from 'src/components/DrawAppFormUtils'; import { useTccDrawStore } from 'src/stores/tcc-draw-store'; @@ -35,9 +25,4 @@ const { data: tccButtonModel, onUpdate } = useFormData( new TccButtonData(), useTccDrawStore().getDrawApp() ); - -const optionsButtonColor = [ - { label: '绿色', value: tccGraphicData.TccElementColor.green }, - { label: '红色', value: tccGraphicData.TccElementColor.red }, -]; diff --git a/src/components/draw-app/properties/TccHandleProperty.vue b/src/components/draw-app/properties/TccHandleProperty.vue new file mode 100644 index 0000000..00c6320 --- /dev/null +++ b/src/components/draw-app/properties/TccHandleProperty.vue @@ -0,0 +1,24 @@ + + + diff --git a/src/components/draw-app/properties/TccKeyProperty.vue b/src/components/draw-app/properties/TccKeyProperty.vue new file mode 100644 index 0000000..476a3e0 --- /dev/null +++ b/src/components/draw-app/properties/TccKeyProperty.vue @@ -0,0 +1,44 @@ + + + diff --git a/src/drawApp/graphics/TccButtonInteraction.ts b/src/drawApp/graphics/TccButtonInteraction.ts index 1dc75b6..5c74744 100644 --- a/src/drawApp/graphics/TccButtonInteraction.ts +++ b/src/drawApp/graphics/TccButtonInteraction.ts @@ -31,12 +31,6 @@ export class TccButtonData extends GraphicDataBase implements ITccButtonData { set code(v: string) { this.data.code = v; } - get buttonColor(): tccGraphicData.TccElementColor { - return this.data.buttonColor; - } - set buttonColor(v: tccGraphicData.TccElementColor) { - this.data.buttonColor = v; - } get isSelfReset(): boolean { return this.data.isSelfReset; } diff --git a/src/drawApp/graphics/TccHandleInteraction.ts b/src/drawApp/graphics/TccHandleInteraction.ts new file mode 100644 index 0000000..ef4e8e6 --- /dev/null +++ b/src/drawApp/graphics/TccHandleInteraction.ts @@ -0,0 +1,132 @@ +import * as pb_1 from 'google-protobuf'; +import { + ITccHandleData, + ITccHandleState, + TccHandle, +} from 'src/graphics/tccHandle/TccHandle'; +import { tccGraphicData } from 'src/protos/tccGraphics'; +import { GraphicDataBase, GraphicStateBase } from './GraphicDataBase'; +import { state } from 'src/protos/device_state'; +import { GraphicInteractionPlugin, IGraphicScene, JlGraphic } from 'jl-graphic'; +import { type FederatedMouseEvent } from 'pixi.js'; +import { useTccStore } from 'src/stores/tcc-store'; + +export class TccHandleData extends GraphicDataBase implements ITccHandleData { + constructor(data?: tccGraphicData.TccHandle) { + let tccHandle; + if (data) { + tccHandle = data; + } else { + tccHandle = new tccGraphicData.TccHandle({ + common: GraphicDataBase.defaultCommonInfo(TccHandle.Type), + }); + } + super(tccHandle); + } + + public get data(): tccGraphicData.TccHandle { + return this.getData(); + } + + get code(): string { + return this.data.code; + } + set code(v: string) { + this.data.code = v; + } + clone(): TccHandleData { + return new TccHandleData(this.data.cloneMessage()); + } + copyFrom(data: TccHandleData): void { + pb_1.Message.copyInto(data.data, this.data); + } + eq(other: TccHandleData): boolean { + return pb_1.Message.equals(this.data, other.data); + } +} + +export class TccHandleState + extends GraphicStateBase + implements ITccHandleState +{ + constructor(data?: state.KeyState) { + let tccHandleState; + if (data) { + tccHandleState = data; + } else { + tccHandleState = new state.KeyState(); + } + super(tccHandleState, TccHandle.Type); + } + get code(): string { + return this.states.id + ''; + } + get states(): state.KeyState { + return this.getState(); + } + get gear(): number { + return this.states.gear; + } + set gear(v: number) { + this.states.gear = v; + } + clone(): TccHandleState { + return new TccHandleState(this.states.cloneMessage()); + } + copyFrom(data: GraphicStateBase): void { + pb_1.Message.copyInto(data._state, this._state); + } + eq(data: GraphicStateBase): boolean { + return pb_1.Message.equals(this._state, data._state); + } +} + +export class TccHandleInteraction extends GraphicInteractionPlugin { + static Name = 'TccHandleInteraction'; + isMouseDown = false; + mouseDownBeginPos = 0; + mouseDownTccHandleBeginPos = 0; + constructor(app: IGraphicScene) { + super(TccHandleInteraction.Name, app); + } + static init(app: IGraphicScene) { + return new TccHandleInteraction(app); + } + filter(...grahpics: JlGraphic[]): TccHandle[] | undefined { + return grahpics.filter((g): g is TccHandle => g instanceof TccHandle); + } + bind(g: TccHandle): void { + g.eventMode = 'static'; + g.cursor = 'pointer'; + g._tccHandle.eventMode = 'static'; + g._tccHandle.cursor = 'pointer'; + g._tccHandle.on('mousedown', this.onMouseDown); + g._tccHandle.on('mouseup', this.onMouseUp); + g.onmousemove = (e) => { + this.onMouseOver(e); + }; + } + unbind(g: TccHandle): void { + g.eventMode = 'none'; + g._tccHandle.eventMode = 'none'; + g._tccHandle.off('mousedown', this.onMouseDown); + g._tccHandle.off('mouseup', this.onMouseUp); + g.onmousemove = null; + } + onMouseDown(e: FederatedMouseEvent) { + const tccHandle = e.target as TccHandle; + this.isMouseDown = true; + this.mouseDownBeginPos = e.clientY; + this.mouseDownTccHandleBeginPos = tccHandle._tccHandle.y; + } + onMouseUp() { + this.isMouseDown = false; + } + onMouseOver(e: FederatedMouseEvent) { + const tccHandle = e.target as TccHandle; + if (this.isMouseDown) { + tccHandle._tccHandle.y = + this.mouseDownTccHandleBeginPos + e.clientY - this.mouseDownBeginPos; + } + } +} diff --git a/src/drawApp/graphics/TccKeyInteraction.ts b/src/drawApp/graphics/TccKeyInteraction.ts new file mode 100644 index 0000000..0b45ffb --- /dev/null +++ b/src/drawApp/graphics/TccKeyInteraction.ts @@ -0,0 +1,108 @@ +import * as pb_1 from 'google-protobuf'; +import { ITccKeyData, ITccKeyState, TccKey } from 'src/graphics/tccKey/TccKey'; +import { tccGraphicData } from 'src/protos/tccGraphics'; +import { GraphicDataBase, GraphicStateBase } from './GraphicDataBase'; +import { state } from 'src/protos/device_state'; +import { GraphicInteractionPlugin, IGraphicScene, JlGraphic } from 'jl-graphic'; +import { type FederatedMouseEvent } from 'pixi.js'; +import { useTccStore } from 'src/stores/tcc-store'; + +export class TccKeyData extends GraphicDataBase implements ITccKeyData { + constructor(data?: tccGraphicData.TccKey) { + let tccKey; + if (data) { + tccKey = data; + } else { + tccKey = new tccGraphicData.TccKey({ + common: GraphicDataBase.defaultCommonInfo(TccKey.Type), + }); + } + super(tccKey); + } + + public get data(): tccGraphicData.TccKey { + return this.getData(); + } + + get code(): string { + return this.data.code; + } + set code(v: string) { + this.data.code = v; + } + get type(): tccGraphicData.TccKey.TccKeyType { + return this.data.type; + } + set type(v: tccGraphicData.TccKey.TccKeyType) { + this.data.type = v; + } + clone(): TccKeyData { + return new TccKeyData(this.data.cloneMessage()); + } + copyFrom(data: TccKeyData): void { + pb_1.Message.copyInto(data.data, this.data); + } + eq(other: TccKeyData): boolean { + return pb_1.Message.equals(this.data, other.data); + } +} + +export class TccKeyState extends GraphicStateBase implements ITccKeyState { + constructor(data?: state.KeyState) { + let tccKeyState; + if (data) { + tccKeyState = data; + } else { + tccKeyState = new state.KeyState(); + } + super(tccKeyState, TccKey.Type); + } + get code(): string { + return this.states.id + ''; + } + get states(): state.KeyState { + return this.getState(); + } + get gear(): number { + return this.states.gear; + } + set gear(v: number) { + this.states.gear = v; + } + clone(): TccKeyState { + return new TccKeyState(this.states.cloneMessage()); + } + copyFrom(data: GraphicStateBase): void { + pb_1.Message.copyInto(data._state, this._state); + } + eq(data: GraphicStateBase): boolean { + return pb_1.Message.equals(this._state, data._state); + } +} + +export class TccKeyInteraction extends GraphicInteractionPlugin { + static Name = 'TccKeyInteraction'; + constructor(app: IGraphicScene) { + super(TccKeyInteraction.Name, app); + } + static init(app: IGraphicScene) { + return new TccKeyInteraction(app); + } + filter(...grahpics: JlGraphic[]): TccKey[] | undefined { + return grahpics.filter((g): g is TccKey => g instanceof TccKey); + } + bind(g: TccKey): void { + g.eventMode = 'static'; + g.cursor = 'pointer'; + g.on('_leftclick', this.onClick); + } + unbind(g: TccKey): void { + g.eventMode = 'none'; + g.off('_leftclick', this.onClick); + } + onClick(e: FederatedMouseEvent): void { + const g = e.target as TccKey; + /* const changeState = useTccStore().tccKeyOperation; + changeState(g.datas.id, g.state.gear === 0 ? 1 : 0); */ + } +} diff --git a/src/drawApp/tccApp.ts b/src/drawApp/tccApp.ts index 42876bb..f3be4a0 100644 --- a/src/drawApp/tccApp.ts +++ b/src/drawApp/tccApp.ts @@ -26,6 +26,16 @@ import { } from 'src/graphics/textContent/TextContent'; import { TccTextData } from './graphics/TccTextContentInteraction'; import { TextContentDraw } from 'src/graphics/textContent/TextContentDrawAssistant'; +import { TccKeyDraw } from 'src/graphics/tccKey/TccKeyDrawAssistant'; +import { TccKey, TccKeyTemplate } from 'src/graphics/tccKey/TccKey'; +import { TccKeyData, TccKeyState } from './graphics/TccKeyInteraction'; +import { TccHandleDraw } from 'src/graphics/tccHandle/TccHandleDrawAssistant'; +import { TccHandle, TccHandleTemplate } from 'src/graphics/tccHandle/TccHandle'; +import { + TccHandleData, + TccHandleInteraction, + TccHandleState, +} from './graphics/TccHandleInteraction'; const UndoOptions: MenuItemOptions = { name: '撤销', @@ -73,6 +83,15 @@ export function initTccDrawApp(): IDrawApp { new TccButtonTemplate(new TccButtonData(), new TccButtonState()) ); new TextContentDraw(app, new TextContentTemplate(new TccTextData())); + new TccKeyDraw( + drawApp, + new TccKeyTemplate(new TccKeyData(), new TccKeyState()) + ); + new TccHandleDraw( + drawApp, + new TccHandleTemplate(new TccHandleData(), new TccHandleState()) + ); + TccHandleInteraction.init(app); // 画布右键菜单 app.registerMenu(DefaultCanvasMenu); @@ -159,12 +178,14 @@ export function saveTccDrawDatas(app: IDrawApp) { }); const graphics = app.queryStore.getAllGraphics(); graphics.forEach((g) => { - if (TccButton.Type === g.type) { - const tccButtonData = (g as TccButton).saveData(); - storage.tccButtons.push((tccButtonData as TccButtonData).data); - } else if (TextContent.Type === g.type) { - const tccTextData = (g as TextContent).saveData(); - storage.tccTexts.push((tccTextData as TccTextData).data); + if (g instanceof TccButton) { + storage.tccButtons.push(g.saveData().data); + } else if (g instanceof TextContent) { + storage.tccTexts.push(g.saveData().data); + } else if (g instanceof TccKey) { + storage.tccKeys.push(g.saveData().data); + } else if (g instanceof TccHandle) { + storage.tccHandles.push(g.saveData().data); } }); const base64 = fromUint8Array(storage.serialize()); @@ -189,6 +210,12 @@ export async function loadTccDrawDatas(): Promise { storage.tccButtons.forEach((tccButton) => { datas.push(new TccButtonData(tccButton)); }); + storage.tccKeys.forEach((tccKey) => { + datas.push(new TccKeyData(tccKey)); + }); + storage.tccHandles.forEach((tccHandle) => { + datas.push(new TccHandleData(tccHandle)); + }); storage.tccTexts.forEach((tccText) => { datas.push(new TccTextData(tccText)); }); diff --git a/src/drawApp/tccScene.ts b/src/drawApp/tccScene.ts index 7a7b3f1..0b41a4e 100644 --- a/src/drawApp/tccScene.ts +++ b/src/drawApp/tccScene.ts @@ -10,10 +10,27 @@ import { useTccStore } from 'src/stores/tcc-store'; import { toUint8Array } from 'js-base64'; import { useLineStore } from 'src/stores/line-store'; import { state } from 'src/protos/device_state'; -import { TccButtonData, TccButtonOperateInteraction, TccButtonState } from './graphics/TccButtonInteraction'; +import { + TccButtonData, + TccButtonOperateInteraction, + TccButtonState, +} from './graphics/TccButtonInteraction'; import { tccGraphicData } from 'src/protos/tccGraphics'; import { TccButtonTemplate } from 'src/graphics/tccButton/TccButton'; - +import { TextContentTemplate } from 'src/graphics/textContent/TextContent'; +import { TccTextData } from './graphics/TccTextContentInteraction'; +import { TccKeyTemplate } from 'src/graphics/tccKey/TccKey'; +import { + TccKeyData, + TccKeyInteraction, + TccKeyState, +} from './graphics/TccKeyInteraction'; +import { TccHandleTemplate } from 'src/graphics/tccHandle/TccHandle'; +import { + TccHandleData, + TccHandleInteraction, + TccHandleState, +} from './graphics/TccHandleInteraction'; export function initTccScene(lineApp: IGraphicApp, sceneName: string) { const tccScene = lineApp.initScene(sceneName, { @@ -26,8 +43,13 @@ export function initTccScene(lineApp: IGraphicApp, sceneName: string) { }); const graphicTemplate = [ new TccButtonTemplate(new TccButtonData(), new TccButtonState()), + new TextContentTemplate(new TccTextData()), + new TccKeyTemplate(new TccKeyData(), new TccKeyState()), + new TccHandleTemplate(new TccHandleData(), new TccHandleState()), ]; TccButtonOperateInteraction.init(tccScene); + TccKeyInteraction.init(tccScene); + TccHandleInteraction.init(tccScene); tccScene.registerGraphicTemplates(...graphicTemplate); tccScene.on('postdataloaded', () => { handleSubscribe(tccScene); @@ -82,6 +104,15 @@ async function loadTccDatas(): Promise { storage.tccButtons.forEach((tccButton) => { datas.push(new TccButtonData(tccButton)); }); + storage.tccKeys.forEach((tccKey) => { + datas.push(new TccKeyData(tccKey)); + }); + storage.tccHandles.forEach((tccHandle) => { + datas.push(new TccHandleData(tccHandle)); + }); + storage.tccTexts.forEach((tccText) => { + datas.push(new TccTextData(tccText)); + }); return Promise.resolve({ canvasProperty: storage.canvas, datas: datas, diff --git a/src/graphics/tccButton/TccButton.ts b/src/graphics/tccButton/TccButton.ts index 6c5d93b..9bb23c0 100644 --- a/src/graphics/tccButton/TccButton.ts +++ b/src/graphics/tccButton/TccButton.ts @@ -13,15 +13,11 @@ import { tccGraphicData } from 'src/protos/tccGraphics'; interface TccButtonTextures { redBtn: Texture; greenBtn: Texture; - redBtnPress: Texture; - greenBtnPress: Texture; } export interface ITccButtonData extends GraphicData { get code(): string; set code(v: string); - get buttonColor(): tccGraphicData.TccElementColor; - set buttonColor(v: tccGraphicData.TccElementColor); get isSelfReset(): boolean; set isSelfReset(v: boolean); } @@ -58,18 +54,10 @@ export class TccButton extends JlGraphic { } doRepaint(): void { this._tccButton.rotation = 0; - if (this.datas.buttonColor === tccGraphicData.TccElementColor.green) { - if (this.states.down) { - this._tccButton.texture = this.tccButtonTextures.greenBtnPress; - } else { - this._tccButton.texture = this.tccButtonTextures.greenBtn; - } + if (this.states.down) { + this._tccButton.texture = this.tccButtonTextures.redBtn; } else { - if (this.states.down) { - this._tccButton.texture = this.tccButtonTextures.redBtnPress; - } else { - this._tccButton.texture = this.tccButtonTextures.redBtn; - } + this._tccButton.texture = this.tccButtonTextures.greenBtn; } } } @@ -96,8 +84,6 @@ export class TccButtonTemplate extends JlGraphicTemplate { this.tccButtonTextures = { redBtn: result['red-btn.png'], greenBtn: result['green-btn.png'], - redBtnPress: result['red-btn-press.png'], - greenBtnPress: result['green-btn-press.png'], }; return this.tccButtonTextures as TccButtonTextures; } diff --git a/src/graphics/tccHandle/TccHandle.ts b/src/graphics/tccHandle/TccHandle.ts new file mode 100644 index 0000000..258d0fc --- /dev/null +++ b/src/graphics/tccHandle/TccHandle.ts @@ -0,0 +1,87 @@ +import { + GraphicData, + GraphicState, + JlGraphic, + JlGraphicTemplate, +} from 'jl-graphic'; +import Tcc_Handle_Assets from './tcc-handle-spritesheet.png'; +import Tcc_Handle_JSON from './tcc-handle-data.json'; + +import { Assets, Sprite, Spritesheet, Texture } from 'pixi.js'; + +interface TccHandleTextures { + tccHandle: Texture; + handleBackground: Texture; +} + +export interface ITccHandleData extends GraphicData { + get code(): string; + set code(v: string); +} + +export interface ITccHandleState extends GraphicState { + get gear(): number; + set gear(v: number); +} + +export class TccHandle extends JlGraphic { + static Type = 'TccHandle'; + _tccHandle: Sprite; + _tccHandleBackground: Sprite; + tccHandleTextures: TccHandleTextures; + __state = 0; + + constructor(tccHandleTextures: TccHandleTextures) { + super(TccHandle.Type); + this.tccHandleTextures = tccHandleTextures; + this._tccHandle = new Sprite(); + this._tccHandle.texture = this.tccHandleTextures.tccHandle; + this._tccHandle.anchor.set(0.5); + this._tccHandleBackground = new Sprite(); + this._tccHandleBackground.texture = this.tccHandleTextures.handleBackground; + this._tccHandleBackground.anchor.set(0.5); + this._tccHandleBackground.position.x = -20; + this.addChild(this._tccHandleBackground); + this.addChild(this._tccHandle); + } + get code(): string { + return this.datas.code; + } + get datas() { + return this.getDatas(); + } + get state() { + return this.getStates(); + } + doRepaint(): void { + this._tccHandle.rotation = (-Math.PI / 2) * this.state.gear; + this._tccHandle.texture = this.tccHandleTextures.tccHandle; + } +} + +export class TccHandleTemplate extends JlGraphicTemplate { + tccHandleTextures?: TccHandleTextures; + constructor(dataTemplate: ITccHandleData, stateTemplate?: ITccHandleState) { + super(TccHandle.Type, { dataTemplate, stateTemplate }); + this.loadAssets(); + } + new(): TccHandle { + if (this.tccHandleTextures) { + const g = new TccHandle(this.tccHandleTextures); + g.loadData(this.datas); + g.loadState(this.states); + return g; + } + throw new Error('资源未加载/加载失败'); + } + async loadAssets(): Promise { + const texture = await Assets.load(Tcc_Handle_Assets); + const tccHandleSheet = new Spritesheet(texture, Tcc_Handle_JSON); + const result = await tccHandleSheet.parse(); + this.tccHandleTextures = { + tccHandle: result['handle.png'], + handleBackground: result['handleBackground.png'], + }; + return this.tccHandleTextures as TccHandleTextures; + } +} diff --git a/src/graphics/tccHandle/TccHandleDrawAssistant.ts b/src/graphics/tccHandle/TccHandleDrawAssistant.ts new file mode 100644 index 0000000..519a467 --- /dev/null +++ b/src/graphics/tccHandle/TccHandleDrawAssistant.ts @@ -0,0 +1,116 @@ +import { DisplayObject, FederatedMouseEvent, Point } from 'pixi.js'; +import { + AbsorbableLine, + AbsorbablePosition, + GraphicDrawAssistant, + GraphicInteractionPlugin, + GraphicTransformEvent, + IDrawApp, + JlGraphic, +} from 'jl-graphic'; +import { ITccHandleData, TccHandle, TccHandleTemplate } from './TccHandle'; + +export class TccHandleDraw extends GraphicDrawAssistant< + TccHandleTemplate, + ITccHandleData +> { + _tccHandle: TccHandle | null = null; + constructor(app: IDrawApp, template: TccHandleTemplate) { + super(app, template, 'drag_handle', 'Tcc手柄'); + TccHandleInteraction.init(app); + } + + bind(): void { + super.bind(); + if (!this._tccHandle) { + this._tccHandle = this.graphicTemplate.new(); + this.container.addChild(this._tccHandle); + } + } + + public get tccHandle(): TccHandle { + if (!this._tccHandle) { + this._tccHandle = this.graphicTemplate.new(); + this.container.addChild(this._tccHandle); + } + return this._tccHandle; + } + + redraw(cp: Point): void { + this.tccHandle.position.copyFrom(cp); + } + onLeftUp(e: FederatedMouseEvent): void { + this.tccHandle.position.copyFrom(this.toCanvasCoordinates(e.global)); + this.createAndStore(true); + } + prepareData(data: ITccHandleData): boolean { + data.transform = this.tccHandle.saveTransform(); + return true; + } + onEsc(): void { + this.finish(); + } +} + +/** + * 构建吸附线 + * @param tccHandle + */ +function buildAbsorbablePositions(tccHandle: TccHandle): AbsorbablePosition[] { + const aps: AbsorbablePosition[] = []; + const tccHandles = tccHandle.queryStore.queryByType( + TccHandle.Type + ); + const canvas = tccHandle.getCanvas(); + tccHandles.forEach((item) => { + if (item.id === tccHandle.id) { + return; + } + const ala = new AbsorbableLine( + new Point(item.x, 0), + new Point(item.x, canvas.height) + ); + const alb = new AbsorbableLine( + new Point(0, item.y), + new Point(canvas.width, item.y) + ); + aps.push(ala); + aps.push(alb); + }); + return aps; +} + +export class TccHandleInteraction extends GraphicInteractionPlugin { + static Name = 'tcc_handle_transform'; + constructor(app: IDrawApp) { + super(TccHandleInteraction.Name, app); + } + static init(app: IDrawApp) { + return new TccHandleInteraction(app); + } + filter(...grahpics: JlGraphic[]): TccHandle[] | undefined { + return grahpics + .filter((g) => g.type === TccHandle.Type) + .map((g) => g as TccHandle); + } + bind(g: TccHandle): void { + g.eventMode = 'static'; + g.cursor = 'pointer'; + g.scalable = true; + g.rotatable = true; + g.on('transformstart', this.transformstart, this); + } + unbind(g: TccHandle): void { + g.eventMode = 'none'; + g.scalable = false; + g.rotatable = false; + g.off('transformstart', this.transformstart, this); + } + transformstart(e: GraphicTransformEvent) { + const target = e.target as DisplayObject; + const tccHandle = target.getGraphic() as TccHandle; + tccHandle.getGraphicApp().setOptions({ + absorbablePositions: buildAbsorbablePositions(tccHandle), + }); + } +} diff --git a/src/graphics/tccHandle/tcc-handle-data.json b/src/graphics/tccHandle/tcc-handle-data.json new file mode 100644 index 0000000..2d74d98 --- /dev/null +++ b/src/graphics/tccHandle/tcc-handle-data.json @@ -0,0 +1,28 @@ +{"frames": { + +"handle.png": +{ + "frame": {"x":0,"y":0,"w":64,"h":14}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":64,"h":14}, + "sourceSize": {"w":64,"h":14} +}, +"handleBackground.png": +{ + "frame": {"x":0,"y":14,"w":120,"h":300}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":120,"h":300}, + "sourceSize": {"w":120,"h":300} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "tcc-handle-data.png", + "format": "RGBA8888", + "size": {"w":120,"h":314}, + "scale": "1", + "smartupdate": "$TexturePacker:SmartUpdate:35ec8faa530fc86d3b0740464eb2648e:0a63968fd7e862029434ae414b4e8d7b:5c8a7a2b19e5dc1773dcba416f4dca6e$" +} +} diff --git a/src/graphics/tccHandle/tcc-handle-spritesheet.png b/src/graphics/tccHandle/tcc-handle-spritesheet.png new file mode 100644 index 0000000000000000000000000000000000000000..62c1ca4ced2a8f1f4fd2c493fccd10572a3fd662 GIT binary patch literal 10285 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

^{0)}b{+0eFV?o?l4SYCRZZ0)^y!9nNC#Jf;q zz4kSHFy;38r}+SsupG) zX~8LQy_OLd?kagIW5cmn-I~wrXZa)UICAN=)$oxa(UL@IFUX17T7?H zDO+?`DA)OcoOqJsw*a%=O3}Z1|>+mjziD-d-;kLNeTZTql=WZ=upo7~pfbSFzfsH>52Sa)##&(N0Q<)ck zMCBge$fFVr5e9hTTmyCo+o1Ef#oE&N*&~ufTK&J%6cV{cakzLY*8_7OnN#`h4p|v) z?F3SHu?n(79w^30L^$WEj(vfj@As!XOBx@=}x%ODtO zP*odyQ%)K{j&#BDuSbkEk>#_1TrYw{TYTB~-@uD{3J zwAQH(n$HgsCy(22`ux+2tFcYOY!S)DA_zBqtC79atKC_ciQAt=N7B{RX$rAaT5-(z zw)VITXn0Ub{~&G3(7=&hla+M++IOby&N;88qaMfVaY6KreYuVZ7-NgFK)gA7vXfk| zgMa3(CM&U%n9d}fv>>9^{wj`M@6hQEBBjb^Orrv62hu;SU$ZNg|54Rw)5Ny4!KHRv$)D(S` zCAt`{81mjk?<*70ohl}#>g4#9X}6Bdyl9i?*DH0^w4OYd5kCxUE8D&wK8o$W8@P2W z?mq^$SFdGdvEHpMPgW4Xi-Y*m1+NGwX~oSUUKtD-SU=Y~wcGYDGaW?e{M`5(d(pxf zbcfYKDyoYY#q;DYH4eY`xjU5O9>5LT9Aj_lo5!vwO00v`pR1Ly2qSVf!bvOaJ_=&5 zHu!98A={WkeVdd1+v+!FfGw1qM@6#GWZLIjO{OrZueT=f_}Tlpb)-*gowcrap5DHT zB^7&i!hREb-QC-I*`mzCFGiG4QiHYVKnJC>xy09xDy?0NJ9`TQ{WWlU3IcdDQA z6?;RYok?Nmw$1lP(Xil*<<&6qtv>R-Mtd?zqSE;tk3U4Nx(O4bK|Ide zxJ$XAMR{}E>Su9?4*#9N+9In8;%P2q*M3VpDQl_dpStMdnmX&6{=6@6OGJ4iMkei-Lgj}Hf;%CO8j^z23vt_q070qY9hh}*6g z0{5%XDCBqVyT=D_uTCql9DRD&l^KTZf@N{Cy?>3%10p%OpJ(LevaCN;%F&9x=02W) ze}<|NT>~-$3L#z3q(); + } + get state() { + return this.getStates(); + } + doRepaint(): void { + //this._tccKey.rotation = (-Math.PI / 2) * this.state.gear; + if ( + this.datas.type == + tccGraphicData.TccKey.TccKeyType.driverControllerActivationClint + ) { + this._tccKey.texture = this.tccKeyTextures.tccKey; + this._tccKey.rotation = Math.PI / 4; + } else { + this._tccKey.texture = this.tccKeyTextures.tccKnob; + this._tccKey.scale.set(0.6); + } + } +} + +export class TccKeyTemplate extends JlGraphicTemplate { + tccKeyTextures?: TccKeyTextures; + constructor(dataTemplate: ITccKeyData, stateTemplate?: ITccKeyState) { + super(TccKey.Type, { dataTemplate, stateTemplate }); + this.loadAssets(); + } + new(): TccKey { + if (this.tccKeyTextures) { + const g = new TccKey(this.tccKeyTextures); + g.loadData(this.datas); + g.loadState(this.states); + return g; + } + throw new Error('资源未加载/加载失败'); + } + async loadAssets(): Promise { + const texture = await Assets.load(Tcc_Key_Assets); + const tccKeySheet = new Spritesheet(texture, Tcc_Key_JSON); + const result = await tccKeySheet.parse(); + this.tccKeyTextures = { + tccKey: result['key.png'], + tccKeyBackground: result['background.png'], + tccKnob: result['knob.png'], + }; + return this.tccKeyTextures as TccKeyTextures; + } +} diff --git a/src/graphics/tccKey/TccKeyDrawAssistant.ts b/src/graphics/tccKey/TccKeyDrawAssistant.ts new file mode 100644 index 0000000..b05f1ab --- /dev/null +++ b/src/graphics/tccKey/TccKeyDrawAssistant.ts @@ -0,0 +1,114 @@ +import { DisplayObject, FederatedMouseEvent, Point } from 'pixi.js'; +import { + AbsorbableLine, + AbsorbablePosition, + GraphicDrawAssistant, + GraphicInteractionPlugin, + GraphicTransformEvent, + IDrawApp, + JlGraphic, +} from 'jl-graphic'; +import { ITccKeyData, TccKey, TccKeyTemplate } from './TccKey'; + +export class TccKeyDraw extends GraphicDrawAssistant< + TccKeyTemplate, + ITccKeyData +> { + _tccKey: TccKey | null = null; + constructor(app: IDrawApp, template: TccKeyTemplate) { + super(app, template, 'svguse:../drawIcon.svg#icon-psl-key', 'Tcc钥匙'); + TccKeyInteraction.init(app); + } + + bind(): void { + super.bind(); + if (!this._tccKey) { + this._tccKey = this.graphicTemplate.new(); + this.container.addChild(this._tccKey); + } + } + + public get tccKey(): TccKey { + if (!this._tccKey) { + this._tccKey = this.graphicTemplate.new(); + this.container.addChild(this._tccKey); + } + return this._tccKey; + } + + redraw(cp: Point): void { + this.tccKey.position.copyFrom(cp); + } + onLeftUp(e: FederatedMouseEvent): void { + this.tccKey.position.copyFrom(this.toCanvasCoordinates(e.global)); + this.createAndStore(true); + } + prepareData(data: ITccKeyData): boolean { + data.transform = this.tccKey.saveTransform(); + return true; + } + onEsc(): void { + this.finish(); + } +} + +/** + * 构建吸附线 + * @param tccKey + */ +function buildAbsorbablePositions(tccKey: TccKey): AbsorbablePosition[] { + const aps: AbsorbablePosition[] = []; + const tccKeys = tccKey.queryStore.queryByType(TccKey.Type); + const canvas = tccKey.getCanvas(); + tccKeys.forEach((item) => { + if (item.id === tccKey.id) { + return; + } + const ala = new AbsorbableLine( + new Point(item.x, 0), + new Point(item.x, canvas.height) + ); + const alb = new AbsorbableLine( + new Point(0, item.y), + new Point(canvas.width, item.y) + ); + aps.push(ala); + aps.push(alb); + }); + return aps; +} + +export class TccKeyInteraction extends GraphicInteractionPlugin { + static Name = 'tcc_key_transform'; + constructor(app: IDrawApp) { + super(TccKeyInteraction.Name, app); + } + static init(app: IDrawApp) { + return new TccKeyInteraction(app); + } + filter(...grahpics: JlGraphic[]): TccKey[] | undefined { + return grahpics + .filter((g) => g.type === TccKey.Type) + .map((g) => g as TccKey); + } + bind(g: TccKey): void { + g.eventMode = 'static'; + g.cursor = 'pointer'; + g.scalable = true; + g.rotatable = true; + g.on('transformstart', this.transformstart, this); + } + unbind(g: TccKey): void { + g.eventMode = 'none'; + g.scalable = false; + g.rotatable = false; + g.off('transformstart', this.transformstart, this); + } + transformstart(e: GraphicTransformEvent) { + const target = e.target as DisplayObject; + const tccKey = target.getGraphic() as TccKey; + tccKey.getGraphicApp().setOptions({ + absorbablePositions: buildAbsorbablePositions(tccKey), + }); + } +} diff --git a/src/graphics/tccKey/tcc-key-data.json b/src/graphics/tccKey/tcc-key-data.json new file mode 100644 index 0000000..ce29fd4 --- /dev/null +++ b/src/graphics/tccKey/tcc-key-data.json @@ -0,0 +1,39 @@ +{"frames": { + +"background.png": +{ + "frame": {"x":0,"y":0,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128}, + "anchor": {"x":0.5,"y":0.5} +}, +"key.png": +{ + "frame": {"x":0,"y":128,"w":378,"h":393}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":378,"h":393}, + "sourceSize": {"w":378,"h":393}, + "anchor": {"x":0.5,"y":0.5} +}, +"knob.png": +{ + "frame": {"x":128,"y":0,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128}, + "anchor": {"x":0.5,"y":0.5} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "tcc-key-data.png", + "format": "RGBA8888", + "size": {"w":378,"h":521}, + "scale": "1", + "smartupdate": "$TexturePacker:SmartUpdate:323ae655a9099ea9ee5548018c8bb2dc:86d9df42807e3cd9d3abb5eaf5f7db62:90c3bb9fceb7f742c704ab999fd08093$" +} +} diff --git a/src/graphics/tccKey/tcc-key-spritesheet.png b/src/graphics/tccKey/tcc-key-spritesheet.png new file mode 100644 index 0000000000000000000000000000000000000000..a4af9c4955a8cf2f04a3de428fc7eea51166a877 GIT binary patch literal 79247 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 z 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�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 literal 0 HcmV?d00001 diff --git a/src/layouts/TrainControlCabDrawLayout.vue b/src/layouts/TrainControlCabDrawLayout.vue index c74cdd7..95e7225 100644 --- a/src/layouts/TrainControlCabDrawLayout.vue +++ b/src/layouts/TrainControlCabDrawLayout.vue @@ -123,6 +123,8 @@ import { ApiError } from 'src/boot/axios'; import { useQuasar } from 'quasar'; import { TccButton } from 'src/graphics/tccButton/TccButton'; import { TextContent } from 'src/graphics/textContent/TextContent'; +import { TccKey } from 'src/graphics/tccKey/TccKey'; +import { TccHandle } from 'src/graphics/tccHandle/TccHandle'; const $q = useQuasar(); const route = useRoute(); @@ -203,7 +205,12 @@ onMounted(() => { tccDrawStore.setDraftId(null); } - const drawAssistantsTypes = [TccButton.Type, TextContent.Type]; + const drawAssistantsTypes = [ + TccButton.Type, + TextContent.Type, + TccKey.Type, + TccHandle.Type, + ]; drawAssistantsTypes.forEach((type) => { const drawAssistant = getTccDrawApp()?.getDrawAssistant(type); if (drawAssistant) { diff --git a/src/protos/tccGraphics.ts b/src/protos/tccGraphics.ts index ba656d6..db13d88 100644 --- a/src/protos/tccGraphics.ts +++ b/src/protos/tccGraphics.ts @@ -6,19 +6,17 @@ import * as dependency_1 from "./stationLayoutGraphics"; import * as pb_1 from "google-protobuf"; export namespace tccGraphicData { - export enum TccElementColor { - green = 0, - red = 1 - } export class TccGraphicStorage extends pb_1.Message { #one_of_decls: number[][] = []; constructor(data?: any[] | { canvas?: dependency_1.graphicData.Canvas; tccButtons?: TccButton[]; tccTexts?: TccText[]; + tccKeys?: TccKey[]; + tccHandles?: TccHandle[]; }) { super(); - pb_1.Message.initialize(this, Array.isArray(data) ? data : [], 0, -1, [2, 3], this.#one_of_decls); + pb_1.Message.initialize(this, Array.isArray(data) ? data : [], 0, -1, [2, 3, 4, 5], this.#one_of_decls); if (!Array.isArray(data) && typeof data == "object") { if ("canvas" in data && data.canvas != undefined) { this.canvas = data.canvas; @@ -29,6 +27,12 @@ export namespace tccGraphicData { if ("tccTexts" in data && data.tccTexts != undefined) { this.tccTexts = data.tccTexts; } + if ("tccKeys" in data && data.tccKeys != undefined) { + this.tccKeys = data.tccKeys; + } + if ("tccHandles" in data && data.tccHandles != undefined) { + this.tccHandles = data.tccHandles; + } } } get canvas() { @@ -52,10 +56,24 @@ export namespace tccGraphicData { set tccTexts(value: TccText[]) { pb_1.Message.setRepeatedWrapperField(this, 3, value); } + get tccKeys() { + return pb_1.Message.getRepeatedWrapperField(this, TccKey, 4) as TccKey[]; + } + set tccKeys(value: TccKey[]) { + pb_1.Message.setRepeatedWrapperField(this, 4, value); + } + get tccHandles() { + return pb_1.Message.getRepeatedWrapperField(this, TccHandle, 5) as TccHandle[]; + } + set tccHandles(value: TccHandle[]) { + pb_1.Message.setRepeatedWrapperField(this, 5, value); + } static fromObject(data: { canvas?: ReturnType; tccButtons?: ReturnType[]; tccTexts?: ReturnType[]; + tccKeys?: ReturnType[]; + tccHandles?: ReturnType[]; }): TccGraphicStorage { const message = new TccGraphicStorage({}); if (data.canvas != null) { @@ -67,6 +85,12 @@ export namespace tccGraphicData { if (data.tccTexts != null) { message.tccTexts = data.tccTexts.map(item => TccText.fromObject(item)); } + if (data.tccKeys != null) { + message.tccKeys = data.tccKeys.map(item => TccKey.fromObject(item)); + } + if (data.tccHandles != null) { + message.tccHandles = data.tccHandles.map(item => TccHandle.fromObject(item)); + } return message; } toObject() { @@ -74,6 +98,8 @@ export namespace tccGraphicData { canvas?: ReturnType; tccButtons?: ReturnType[]; tccTexts?: ReturnType[]; + tccKeys?: ReturnType[]; + tccHandles?: ReturnType[]; } = {}; if (this.canvas != null) { data.canvas = this.canvas.toObject(); @@ -84,6 +110,12 @@ export namespace tccGraphicData { if (this.tccTexts != null) { data.tccTexts = this.tccTexts.map((item: TccText) => item.toObject()); } + if (this.tccKeys != null) { + data.tccKeys = this.tccKeys.map((item: TccKey) => item.toObject()); + } + if (this.tccHandles != null) { + data.tccHandles = this.tccHandles.map((item: TccHandle) => item.toObject()); + } return data; } serialize(): Uint8Array; @@ -96,6 +128,10 @@ export namespace tccGraphicData { writer.writeRepeatedMessage(2, this.tccButtons, (item: TccButton) => item.serialize(writer)); if (this.tccTexts.length) writer.writeRepeatedMessage(3, this.tccTexts, (item: TccText) => item.serialize(writer)); + if (this.tccKeys.length) + writer.writeRepeatedMessage(4, this.tccKeys, (item: TccKey) => item.serialize(writer)); + if (this.tccHandles.length) + writer.writeRepeatedMessage(5, this.tccHandles, (item: TccHandle) => item.serialize(writer)); if (!w) return writer.getResultBuffer(); } @@ -114,6 +150,12 @@ export namespace tccGraphicData { case 3: reader.readMessage(message.tccTexts, () => pb_1.Message.addToRepeatedWrapperField(message, 3, TccText.deserialize(reader), TccText)); break; + case 4: + reader.readMessage(message.tccKeys, () => pb_1.Message.addToRepeatedWrapperField(message, 4, TccKey.deserialize(reader), TccKey)); + break; + case 5: + reader.readMessage(message.tccHandles, () => pb_1.Message.addToRepeatedWrapperField(message, 5, TccHandle.deserialize(reader), TccHandle)); + break; default: reader.skipField(); } } @@ -131,7 +173,6 @@ export namespace tccGraphicData { constructor(data?: any[] | { common?: dependency_1.graphicData.CommonInfo; code?: string; - buttonColor?: TccElementColor; isSelfReset?: boolean; }) { super(); @@ -143,9 +184,6 @@ export namespace tccGraphicData { if ("code" in data && data.code != undefined) { this.code = data.code; } - if ("buttonColor" in data && data.buttonColor != undefined) { - this.buttonColor = data.buttonColor; - } if ("isSelfReset" in data && data.isSelfReset != undefined) { this.isSelfReset = data.isSelfReset; } @@ -166,22 +204,15 @@ export namespace tccGraphicData { set code(value: string) { pb_1.Message.setField(this, 2, value); } - get buttonColor() { - return pb_1.Message.getFieldWithDefault(this, 3, TccElementColor.green) as TccElementColor; - } - set buttonColor(value: TccElementColor) { - pb_1.Message.setField(this, 3, value); - } get isSelfReset() { - return pb_1.Message.getFieldWithDefault(this, 4, false) as boolean; + return pb_1.Message.getFieldWithDefault(this, 3, false) as boolean; } set isSelfReset(value: boolean) { - pb_1.Message.setField(this, 4, value); + pb_1.Message.setField(this, 3, value); } static fromObject(data: { common?: ReturnType; code?: string; - buttonColor?: TccElementColor; isSelfReset?: boolean; }): TccButton { const message = new TccButton({}); @@ -191,9 +222,6 @@ export namespace tccGraphicData { if (data.code != null) { message.code = data.code; } - if (data.buttonColor != null) { - message.buttonColor = data.buttonColor; - } if (data.isSelfReset != null) { message.isSelfReset = data.isSelfReset; } @@ -203,7 +231,6 @@ export namespace tccGraphicData { const data: { common?: ReturnType; code?: string; - buttonColor?: TccElementColor; isSelfReset?: boolean; } = {}; if (this.common != null) { @@ -212,9 +239,6 @@ export namespace tccGraphicData { if (this.code != null) { data.code = this.code; } - if (this.buttonColor != null) { - data.buttonColor = this.buttonColor; - } if (this.isSelfReset != null) { data.isSelfReset = this.isSelfReset; } @@ -228,10 +252,8 @@ export namespace tccGraphicData { writer.writeMessage(1, this.common, () => this.common.serialize(writer)); if (this.code.length) writer.writeString(2, this.code); - if (this.buttonColor != TccElementColor.green) - writer.writeEnum(3, this.buttonColor); if (this.isSelfReset != false) - writer.writeBool(4, this.isSelfReset); + writer.writeBool(3, this.isSelfReset); if (!w) return writer.getResultBuffer(); } @@ -248,9 +270,6 @@ export namespace tccGraphicData { message.code = reader.readString(); break; case 3: - message.buttonColor = reader.readEnum(); - break; - case 4: message.isSelfReset = reader.readBool(); break; default: reader.skipField(); @@ -427,4 +446,219 @@ export namespace tccGraphicData { return TccText.deserialize(bytes); } } + export class TccKey extends pb_1.Message { + #one_of_decls: number[][] = []; + constructor(data?: any[] | { + common?: dependency_1.graphicData.CommonInfo; + code?: string; + type?: TccKey.TccKeyType; + }) { + 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 ("type" in data && data.type != undefined) { + this.type = data.type; + } + } + } + get common() { + return pb_1.Message.getWrapperField(this, dependency_1.graphicData.CommonInfo, 1) as dependency_1.graphicData.CommonInfo; + } + set common(value: dependency_1.graphicData.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 type() { + return pb_1.Message.getFieldWithDefault(this, 3, TccKey.TccKeyType.driverControllerActivationClint) as TccKey.TccKeyType; + } + set type(value: TccKey.TccKeyType) { + pb_1.Message.setField(this, 3, value); + } + static fromObject(data: { + common?: ReturnType; + code?: string; + type?: TccKey.TccKeyType; + }): TccKey { + const message = new TccKey({}); + if (data.common != null) { + message.common = dependency_1.graphicData.CommonInfo.fromObject(data.common); + } + if (data.code != null) { + message.code = data.code; + } + if (data.type != null) { + message.type = data.type; + } + return message; + } + toObject() { + const data: { + common?: ReturnType; + code?: string; + type?: TccKey.TccKeyType; + } = {}; + if (this.common != null) { + data.common = this.common.toObject(); + } + if (this.code != null) { + data.code = this.code; + } + if (this.type != null) { + data.type = this.type; + } + 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.type != TccKey.TccKeyType.driverControllerActivationClint) + writer.writeEnum(3, this.type); + if (!w) + return writer.getResultBuffer(); + } + static deserialize(bytes: Uint8Array | pb_1.BinaryReader): TccKey { + const reader = bytes instanceof pb_1.BinaryReader ? bytes : new pb_1.BinaryReader(bytes), message = new TccKey(); + while (reader.nextField()) { + if (reader.isEndGroup()) + break; + switch (reader.getFieldNumber()) { + case 1: + reader.readMessage(message.common, () => message.common = dependency_1.graphicData.CommonInfo.deserialize(reader)); + break; + case 2: + message.code = reader.readString(); + break; + case 3: + message.type = reader.readEnum(); + break; + default: reader.skipField(); + } + } + return message; + } + serializeBinary(): Uint8Array { + return this.serialize(); + } + static deserializeBinary(bytes: Uint8Array): TccKey { + return TccKey.deserialize(bytes); + } + } + export namespace TccKey { + export enum TccKeyType { + driverControllerActivationClint = 0, + frontAndRearDirectionalControl = 1 + } + } + export class TccHandle extends pb_1.Message { + #one_of_decls: number[][] = []; + constructor(data?: any[] | { + common?: dependency_1.graphicData.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.graphicData.CommonInfo, 1) as dependency_1.graphicData.CommonInfo; + } + set common(value: dependency_1.graphicData.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; + }): TccHandle { + const message = new TccHandle({}); + if (data.common != null) { + message.common = dependency_1.graphicData.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): TccHandle { + const reader = bytes instanceof pb_1.BinaryReader ? bytes : new pb_1.BinaryReader(bytes), message = new TccHandle(); + while (reader.nextField()) { + if (reader.isEndGroup()) + break; + switch (reader.getFieldNumber()) { + case 1: + reader.readMessage(message.common, () => message.common = dependency_1.graphicData.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): TccHandle { + return TccHandle.deserialize(bytes); + } + } }