(api) 模版参数继承

pull/351/head
ChenX 5 years ago
parent 51f588fe25
commit a3b675d490

@ -78,6 +78,7 @@
"dxf-parser": "^1.0.0-alpha.1", "dxf-parser": "^1.0.0-alpha.1",
"expr-eval": "^1.2.2", "expr-eval": "^1.2.2",
"golden-layout": "^1.5.9", "golden-layout": "^1.5.9",
"meriyah": "^0.4.1",
"mobx": "^5.10.0", "mobx": "^5.10.0",
"mobx-react": "^6.0.3", "mobx-react": "^6.0.3",
"react": "^16.8.2", "react": "^16.8.2",

@ -19,7 +19,7 @@ export class TemplateRecord extends SymbolTableRecord
{ {
@AutoRecord Type: TemplateType; @AutoRecord Type: TemplateType;
@AutoRecord Parent: ObjectId; @AutoRecord Parent: ObjectId;
@AutoRecord Children: ObjectId[] = []; @AutoRecord Children: ObjectId[];
@AutoRecord Params: TemplateParam[]; @AutoRecord Params: TemplateParam[];
@AutoRecord Objects: ObjectId[]; @AutoRecord Objects: ObjectId[];
private positioning: Positioning; private positioning: Positioning;
@ -67,6 +67,29 @@ export class TemplateRecord extends SymbolTableRecord
return Reflect.get(target, key, receiver); 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; return this;
} }
get LParam()
{
return this.GetParam("L");
}
get WParam()
{
return this.GetParam("W");
}
get HParam()
{
return this.GetParam("H");
}
UpdateAllTemplate(newParams: []) UpdateAllTemplate(newParams: [])
{ {
for (let i = 0; i < this.Params.length; i++) 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); let objs = this.Objects.filter(id => !id.IsErase).map(id => id.Object as Board);
if (this.positioning) if (this.positioning)
{ {
@ -158,14 +213,9 @@ export class TemplateRecord extends SymbolTableRecord
if (this.positioning.SpaceSize) if (this.positioning.SpaceSize)
{ {
let l = this.GetParam("L"); this.LParam.UpdateParam(this.positioning.SpaceSize.x);
l.UpdateParam(this.positioning.SpaceSize.x); this.WParam.UpdateParam(this.positioning.SpaceSize.y);
this.HParam.UpdateParam(this.positioning.SpaceSize.z);
let w = this.GetParam("W");
w.UpdateParam(this.positioning.SpaceSize.y);
let h = this.GetParam("H");
h.UpdateParam(this.positioning.SpaceSize.z);
} }
//保持SpaceCS //保持SpaceCS
@ -179,16 +229,56 @@ export class TemplateRecord extends SymbolTableRecord
{ {
//广度优先 //广度优先
let updateStack = [...this.Children]; let updateStack = [...this.Children];
let childrenCount = this.Children.length;
let index = 0;
while (updateStack.length > 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 id = updateStack.shift();
let template = id.Object as TemplateRecord; let template = id.Object as TemplateRecord;
await template.UpdateTemplate(); await template.UpdateTemplate(params);
updateStack.push(...template.Children); 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------------------------- //#region -------------------------File-------------------------
//对象应该实现dataIn和DataOut的方法,为了对象的序列化和反序列化 //对象应该实现dataIn和DataOut的方法,为了对象的序列化和反序列化

Loading…
Cancel
Save