Add parameter component

This commit is contained in:
2022-04-08 14:00:32 +08:00
parent d7e15793b9
commit 7556ea983e
10 changed files with 321 additions and 224 deletions
+12 -63
View File
@@ -3,17 +3,17 @@ import type { Individual } from "./Individual";
import type { Group } from "./Group";
import type { Model } from "./Model";
import {
IParamValue, isObjectType, isVectorType,
IBehaviorParameterOptionItem, IBehaviorParameter, IBehaviorParameterOption, IBehaviorParameterValue
IParamValue, isObjectType, isVectorType, getDefaultValue,
IParameterOptionItem, IParameter, IParameterOption, IParameterValue
} from "./Parameter";
/**
* 行为构造函数类型
*/
type IBehaviorConstructor<
P extends IBehaviorParameter = {},
P extends IParameter = {},
E extends Record<EventType, any> = {}
> = new (id: string, parameter: IBehaviorParameterValue<P>) => Behavior<P, E>;
> = new (id: string, parameter: IParameterValue<P>) => Behavior<P, E>;
type IAnyBehavior = Behavior<any, any>;
type IAnyBehaviorRecorder = BehaviorRecorder<any, any>;
@@ -75,7 +75,7 @@ class BehaviorInfo<E extends Record<EventType, any> = {}> extends Emitter<E> {
}
class BehaviorRecorder<
P extends IBehaviorParameter = {},
P extends IParameter = {},
E extends Record<EventType, any> = {}
> extends BehaviorInfo<{}> {
@@ -104,62 +104,13 @@ class BehaviorRecorder<
/**
* 对象参数列表
*/
public parameterOption: IBehaviorParameterOption<P>;
/**
* 获取参数列表的默认值
*/
public getDefaultValue(): IBehaviorParameterValue<P> {
let defaultObj = {} as IBehaviorParameterValue<P>;
for (let key in this.parameterOption) {
let defaultVal = this.parameterOption[key].defaultValue;
defaultObj[key] = defaultVal as any;
if (defaultObj[key] === undefined) {
switch (this.parameterOption[key].type) {
case "string":
defaultObj[key] = "" as any;
break;
case "number":
defaultObj[key] = 0 as any;
break;
case "boolean":
defaultObj[key] = false as any;
break;
case "vec":
defaultObj[key] = [0, 0, 0] as any;
break;
case "G":
case "R":
defaultObj[key] = {
picker: undefined,
objects: undefined
} as any;
break;
case "LR":
case "LG":
defaultObj[key] = {
picker: undefined,
objects: []
} as any;
break;
}
}
}
return defaultObj;
}
public parameterOption: IParameterOption<P>;
/**
* 创建一个新的行为实例
*/
public new(): Behavior<P, E> {
return new this.behavior(this.getNextId(), this.getDefaultValue());
return new this.behavior(this.getNextId(), getDefaultValue(this.parameterOption));
}
public constructor(behavior: IBehaviorConstructor<P, E>) {
@@ -180,7 +131,7 @@ class BehaviorRecorder<
* 群体的某种行为
*/
class Behavior<
P extends IBehaviorParameter = {},
P extends IParameter = {},
E extends Record<EventType, any> = {}
> extends BehaviorInfo<E> {
@@ -208,14 +159,14 @@ class Behavior<
/**
* 行为参数
*/
public parameter: IBehaviorParameterValue<P>;
public parameter: IParameterValue<P>;
/**
* 对象参数列表
*/
public parameterOption: IBehaviorParameterOption<P> = {} as any;
public parameterOption: IParameterOption<P> = {} as any;
public constructor(id: string, parameter: IBehaviorParameterValue<P>) {
public constructor(id: string, parameter: IParameterValue<P>) {
super();
this.id = id;
this.parameter = parameter;
@@ -299,8 +250,6 @@ class Behavior<
type IRenderBehavior = BehaviorInfo | Behavior;
export {
Behavior, BehaviorRecorder, IBehaviorParameterOption, IBehaviorParameterOptionItem, IParamValue,
IAnyBehavior, IAnyBehaviorRecorder, BehaviorInfo, IRenderBehavior, IBehaviorParameter,
isObjectType, isVectorType
Behavior, BehaviorRecorder, IAnyBehavior, IAnyBehaviorRecorder, BehaviorInfo, IRenderBehavior
};
export default { Behavior };
+2 -1
View File
@@ -5,7 +5,8 @@ import { Emitter, EventType, EventMixin } from "./Emitter";
import { CtrlObject } from "./CtrlObject";
import { ObjectID, AbstractRenderer } from "./Renderer";
import { Label } from "./Label";
import { Behavior, IAnyBehavior, IAnyBehaviorRecorder, IParamValue } from "./Behavior";
import { Behavior, IAnyBehavior, IAnyBehaviorRecorder } from "./Behavior";
import { IParamValue } from "@Model/Parameter";
type ModelEvent = {
labelChange: Label[];
+57 -10
View File
@@ -39,26 +39,26 @@ type IParamValue<K extends IParamType> = AllMapType[K];
/**
* 特殊对象类型判定
*/
const objectTypeListEnumSet = new Set<IParamType>(["R", "G", "LR", "LG"]);
const objectTypeListEnumSet = new Set<string>(["R", "G", "LR", "LG"]);
/**
* 对象断言表达式
*/
function isObjectType(key: IParamType): key is IVectorType {
function isObjectType(key: string): key is IVectorType {
return objectTypeListEnumSet.has(key);
}
/**
* 向量断言表达式
*/
function isVectorType(key: IParamType): key is IObjectType {
function isVectorType(key: string): key is IObjectType {
return key === "vec";
}
/**
* 模型参数类型
*/
interface IBehaviorParameterOptionItem<T extends IParamType = IParamType> {
interface IParameterOptionItem<T extends IParamType = IParamType> {
/**
* 参数类型
@@ -102,25 +102,72 @@ interface IBehaviorParameterOptionItem<T extends IParamType = IParamType> {
iconName?: string;
}
interface IBehaviorParameter {
interface IParameter {
[x: string]: IParamType;
}
/**
* 参数类型列表
*/
type IBehaviorParameterOption<P extends IBehaviorParameter> = {
[X in keyof P]: IBehaviorParameterOptionItem<P[X]>;
type IParameterOption<P extends IParameter> = {
[X in keyof P]: IParameterOptionItem<P[X]>;
}
/**
* 参数类型列表映射到参数对象
*/
type IBehaviorParameterValue<P extends IBehaviorParameter> = {
type IParameterValue<P extends IParameter> = {
[X in keyof P]: IParamValue<P[X]>
}
function getDefaultValue<P extends IParameter> (option: IParameterOption<P>): IParameterValue<P> {
let defaultObj = {} as IParameterValue<P>;
for (let key in option) {
let defaultVal = option[key].defaultValue;
if (defaultVal !== undefined) {
defaultObj[key] = defaultVal;
} else {
switch (option[key].type) {
case "string":
defaultObj[key] = "" as any;
break;
case "number":
defaultObj[key] = 0 as any;
break;
case "boolean":
defaultObj[key] = false as any;
break;
case "vec":
defaultObj[key] = [0, 0, 0] as any;
break;
case "G":
case "R":
defaultObj[key] = {
picker: undefined,
objects: undefined
} as any;
break;
case "LR":
case "LG":
defaultObj[key] = {
picker: undefined,
objects: []
} as any;
break;
}
}
}
return defaultObj;
}
export {
IParamType, IParamValue, isObjectType, isVectorType,
IBehaviorParameterOptionItem, IBehaviorParameter, IBehaviorParameterOption, IBehaviorParameterValue
IParamType, IParamValue, isObjectType, isVectorType, getDefaultValue,
IParameterOptionItem, IParameter, IParameterOption, IParameterValue
}