diff --git a/source/Component/CommandBar/CommandBar.tsx b/source/Component/CommandBar/CommandBar.tsx index 151892e..b6faf75 100644 --- a/source/Component/CommandBar/CommandBar.tsx +++ b/source/Component/CommandBar/CommandBar.tsx @@ -33,7 +33,13 @@ class CommandBar extends Component
- {this.getRenderButton({ iconName: "Save", i18NKey: "Command.Bar.Save.Info" })} + {this.getRenderButton({ + iconName: "Save", + i18NKey: "Command.Bar.Save.Info", + click: () => { + this.props.status?.archive.save(this.props.status.model); + } + })} {this.getRenderButton({ iconName: this.props.status?.actuator.start() ? "Pause" : "Play", i18NKey: "Command.Bar.Play.Info", diff --git a/source/Model/Archive.ts b/source/Model/Archive.ts index b229182..8f9e2d6 100644 --- a/source/Model/Archive.ts +++ b/source/Model/Archive.ts @@ -1,10 +1,18 @@ import { Emitter, EventType } from "@Model/Emitter"; -import { Model } from "./Model"; +import { IArchiveCtrlObject } from "@Model/CtrlObject"; +import { Model } from "@Model/Model"; +import { IArchiveLabel } from "@Model/Label"; interface IArchiveEvent { fileChange: Archive; } +interface IArchiveObject { + nextIndividualId: number; + objectPool: IArchiveCtrlObject[]; + labelPool: IArchiveLabel[]; +} + class Archive< M extends any = any, E extends Record = {} @@ -35,17 +43,32 @@ class Archive< * 模型转换为文件 */ public save(model: Model): string { - let fileData: Record = {}; - - // 保存对象 - fileData.objects = []; - - // 记录 - model.objectPool.map((object) => { + // 存贮 CtrlObject + const objectPool: IArchiveCtrlObject[] = []; + model.objectPool.forEach(obj => { + objectPool.push(obj.toArchive()); }) - return JSON.stringify(model); + // 存储 Label + const labelPool: IArchiveLabel[] = []; + model.labelPool.forEach(obj => { + labelPool.push(obj.toArchive()); + }) + + const fileData: IArchiveObject = { + nextIndividualId: model.nextIndividualId, + objectPool: objectPool, + labelPool: labelPool + }; + + console.log(fileData); + console.log({value: JSON.stringify(fileData)}); + + this.isSaved = true; + this.emit( ...["fileChange", this] as any ); + + return ""; } /** diff --git a/source/Model/CtrlObject.ts b/source/Model/CtrlObject.ts index 53afb9c..21a6f31 100644 --- a/source/Model/CtrlObject.ts +++ b/source/Model/CtrlObject.ts @@ -1,8 +1,11 @@ import { LabelObject } from "@Model/Label" import { v4 as uuid } from "uuid"; -import { parameter2ArchiveObject, archiveObject2Parameter, IArchiveParseFn } from "@Model/Parameter"; import type { IAnyObject, Model } from "@Model/Model"; import type { ObjectID } from "@Model/Model"; +import { + parameter2ArchiveObject, archiveObject2Parameter, + IArchiveParseFn, IObjectParamArchiveType, object2ArchiveObject +} from "@Model/Parameter"; interface IArchiveCtrlObject { displayName: CtrlObject["displayName"]; @@ -12,6 +15,7 @@ interface IArchiveCtrlObject { id: string; renderParameter: any; deleteFlag: CtrlObject["deleteFlag"]; + labels: IObjectParamArchiveType[]; } /** @@ -117,20 +121,26 @@ class CtrlObject extends LabelObject { update: !!this.update, id: this.id, renderParameter: parameter2ArchiveObject(this.renderParameter), - deleteFlag: !!this.deleteFlag + deleteFlag: !!this.deleteFlag, + labels: this.labels.map((label) => { + return object2ArchiveObject(label); + }) } as any; } - public fromArchive(archive: IArchiveCtrlObject & A, paster?: IArchiveParseFn): void { + public fromArchive(archive: IArchiveCtrlObject & A, paster: IArchiveParseFn): void { this.displayName = archive.displayName; this.color = archive.color.concat([]); this.display = !!archive.display; this.update = !!archive.update; this.id = archive.id; - this.renderParameter = archiveObject2Parameter( - archive.renderParameter, paster ?? (() => undefined) - ); this.deleteFlag = !!archive.deleteFlag; + this.renderParameter = archiveObject2Parameter( + archive.renderParameter, paster + ); + this.labels = archive.labels.map((obj) => { + return paster(obj) as any; + }).filter((c) => !!c); } } diff --git a/source/Model/Group.ts b/source/Model/Group.ts index 8048bf3..bb3a970 100644 --- a/source/Model/Group.ts +++ b/source/Model/Group.ts @@ -443,7 +443,7 @@ class Group extends CtrlObject { this.killCount = archive.killCount, this.behaviors = archive.behaviors.map((item) => { return item ? paster(item) as any : undefined; - }); + }).filter(c => !!c); } public constructor(model: Model) { diff --git a/source/Model/Label.ts b/source/Model/Label.ts index f7ffb39..48502a5 100644 --- a/source/Model/Label.ts +++ b/source/Model/Label.ts @@ -1,6 +1,14 @@ import type { Model, ObjectID } from "@Model/Model"; import { v4 as uuid } from "uuid"; +interface IArchiveLabel { + isBuildIn: boolean; + id: string; + name: string; + color: number[]; + deleteFlag: boolean; +} + /** * 数据标签 */ @@ -83,6 +91,24 @@ class Label { this.isBuildIn = true; return this; } + + public toArchive(): IArchiveLabel { + return { + isBuildIn: this.isBuildIn, + id: this.id, + name: this.name, + color: this.color.concat([]), + deleteFlag: this.deleteFlag + } as any; + } + + public fromArchive(archive: IArchiveLabel): void { + this.isBuildIn = archive.isBuildIn, + this.id = archive.id, + this.name = archive.name, + this.color = archive.color.concat([]), + this.deleteFlag = archive.deleteFlag + } } /** @@ -93,7 +119,7 @@ class LabelObject { /** * 标签集合 */ - private labels: Label[] = []; + public labels: Label[] = []; /** * 获取全部 Label @@ -133,4 +159,4 @@ class LabelObject { } } -export { Label, LabelObject }; \ No newline at end of file +export { Label, LabelObject, IArchiveLabel }; \ No newline at end of file diff --git a/source/Model/Range.ts b/source/Model/Range.ts index 7b4a507..7c0b39b 100644 --- a/source/Model/Range.ts +++ b/source/Model/Range.ts @@ -39,7 +39,7 @@ class Range extends CtrlObject { }; } - public override fromArchive(archive: IArchiveCtrlObject & IArchiveRange, paster?: IArchiveParseFn): void { + public override fromArchive(archive: IArchiveCtrlObject & IArchiveRange, paster: IArchiveParseFn): void { super.fromArchive(archive, paster); this.position = archive.position.concat([]), this.radius = archive.radius.concat([])