From a3b675d49002dc7522e800de4e753680abc3081a Mon Sep 17 00:00:00 2001 From: ChenX Date: Thu, 20 Jun 2019 15:47:16 +0800 Subject: [PATCH] =?UTF-8?q?(api)=20=E6=A8=A1=E7=89=88=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E7=BB=A7=E6=89=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + .../Template/TemplateRecord.ts | 112 ++++++++++++++++-- 2 files changed, 102 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 837dfd51d..dfd801379 100644 --- a/package.json +++ b/package.json @@ -78,6 +78,7 @@ "dxf-parser": "^1.0.0-alpha.1", "expr-eval": "^1.2.2", "golden-layout": "^1.5.9", + "meriyah": "^0.4.1", "mobx": "^5.10.0", "mobx-react": "^6.0.3", "react": "^16.8.2", diff --git a/src/DatabaseServices/Template/TemplateRecord.ts b/src/DatabaseServices/Template/TemplateRecord.ts index 4874bf383..ae17cde3b 100644 --- a/src/DatabaseServices/Template/TemplateRecord.ts +++ b/src/DatabaseServices/Template/TemplateRecord.ts @@ -19,7 +19,7 @@ export class TemplateRecord extends SymbolTableRecord { @AutoRecord Type: TemplateType; @AutoRecord Parent: ObjectId; - @AutoRecord Children: ObjectId[] = []; + @AutoRecord Children: ObjectId[]; @AutoRecord Params: TemplateParam[]; @AutoRecord Objects: ObjectId[]; private positioning: Positioning; @@ -67,6 +67,29 @@ export class TemplateRecord extends SymbolTableRecord return Reflect.get(target, key, receiver); } }); + + this.Children = new Proxy([], { + set: (target, key, value, receiver) => + { + if (Reflect.get(target, key, receiver) !== value) + { + this.WriteAllObjectRecord(); + if (value instanceof ObjectId && value.Object instanceof TemplateRecord) + { + if (!this.Id) + console.warn("请先加模版添加到Database后在进行操作!"); + value.Object.Parent = this.Id; + } + } + return Reflect.set(target, key, value, receiver); + }, + get: (target, key, receiver) => + { + if (key === ISPROXYKEY) + return true; + return Reflect.get(target, key, receiver); + } + }); } /** @@ -112,6 +135,20 @@ export class TemplateRecord extends SymbolTableRecord } return this; } + + get LParam() + { + return this.GetParam("L"); + } + get WParam() + { + return this.GetParam("W"); + } + get HParam() + { + return this.GetParam("H"); + } + UpdateAllTemplate(newParams: []) { for (let i = 0; i < this.Params.length; i++) @@ -138,8 +175,26 @@ export class TemplateRecord extends SymbolTableRecord } } - async UpdateTemplate(params?: any, recursion = false) + /** + * + */ + async UpdateTemplate(params?: {}, recursion = false) { + if (!params) + params = this.GetParentParams(); + else + { + let newParams = {}; + for (let key in params) + { + if (key[0] !== "@") + newParams["_" + key] = params[key]; + else + newParams[key] = params[key]; + } + params = newParams; + } + let objs = this.Objects.filter(id => !id.IsErase).map(id => id.Object as Board); if (this.positioning) { @@ -158,14 +213,9 @@ export class TemplateRecord extends SymbolTableRecord if (this.positioning.SpaceSize) { - let l = this.GetParam("L"); - l.UpdateParam(this.positioning.SpaceSize.x); - - let w = this.GetParam("W"); - w.UpdateParam(this.positioning.SpaceSize.y); - - let h = this.GetParam("H"); - h.UpdateParam(this.positioning.SpaceSize.z); + this.LParam.UpdateParam(this.positioning.SpaceSize.x); + this.WParam.UpdateParam(this.positioning.SpaceSize.y); + this.HParam.UpdateParam(this.positioning.SpaceSize.z); } //保持SpaceCS @@ -179,16 +229,56 @@ export class TemplateRecord extends SymbolTableRecord { //广度优先 let updateStack = [...this.Children]; + let childrenCount = this.Children.length; + let index = 0; while (updateStack.length > 0) { + if (index < childrenCount) + { + params["index"] = index; + params["childrenCount"] = childrenCount; + } + else + { + delete params["index"]; + delete params["childrenCount"]; + } + let id = updateStack.shift(); let template = id.Object as TemplateRecord; - await template.UpdateTemplate(); + await template.UpdateTemplate(params); updateStack.push(...template.Children); + + index++; } } } + private GetParentParams() + { + let params = {}; + let parent = this.Parent; + let index = 1; + while (parent) + { + let parentTemplate = parent.Object as TemplateRecord; + let frontStr = new Array(index).fill("_").join(); + for (let param of parentTemplate.Params) + params[frontStr + param.name] = param.value; + if (index === 1) + { + let recordIndex = parentTemplate.Children.indexOf(this.Id); + } + parent = parentTemplate.Parent; + if (!parent) + { + for (let param of parentTemplate.Params) + params["@" + param.name] = param.value; + } + index++; + } + return params; + } //#region -------------------------File------------------------- //对象应该实现dataIn和DataOut的方法,为了对象的序列化和反序列化