) => any;
/**
* 名字
*/
name: string;
/**
* 字符长度
*/
maxLength?: number;
/**
* 数字步长
*/
numberStep?: number;
/**
* 最大值最小值
*/
numberMax?: number;
numberMin?: number;
/**
* 图标名字
*/
iconName?: string;
/**
* 图标是否显示为红色
*/
iconRed?: boolean;
/**
* 颜色是否进行归一化
*/
colorNormal?: boolean;
/**
* 显示条件
*/
condition?: {key: string, value: any};
/**
* 全部选项
*/
allOption?: Array<{key: string, name: string}>;
}
interface IParameter {
[x: string]: IParamType;
}
/**
* 参数类型列表
*/
type IParameterOption = {
[X in keyof P]: IParameterOptionItem
;
}
/**
* 参数类型列表映射到参数对象
*/
type IParameterValue
= {
[X in keyof P]: IParamValue
}
type IArchiveParameterValue
= {
[X in keyof P]: IArchiveParamValue
}
function getDefaultValue
(option: IParameterOption
): IParameterValue
{
let defaultObj = {} as IParameterValue
;
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 "CG":
case "G":
case "R":
defaultObj[key] = {
picker: undefined,
objects: undefined
} as any;
break;
case "CLG":
case "LR":
case "LG":
defaultObj[key] = {
picker: undefined,
objects: []
} as any;
break;
}
}
}
return defaultObj;
}
type IRealObjectType = Range | Group | Label | Behavior;
type IArchiveParseFn = (archive: IObjectParamArchiveType) => IRealObjectType | undefined;
function object2ArchiveObject(object: IRealObjectType | IRealObjectType[] | any, testArray: boolean = true):
IObjectParamArchiveType | IObjectParamArchiveType[] | undefined {
if (object instanceof Range) {
return {
__LIVING_TOGETHER_OBJECT_ID: "Range",
__LIVING_TOGETHER_OBJECT_TYPE: object.id
}
} else if (object instanceof Group) {
return {
__LIVING_TOGETHER_OBJECT_ID: "Group",
__LIVING_TOGETHER_OBJECT_TYPE: object.id
}
} else if (object instanceof Label) {
return {
__LIVING_TOGETHER_OBJECT_ID: "Label",
__LIVING_TOGETHER_OBJECT_TYPE: object.id
}
} else if (object instanceof Behavior) {
return {
__LIVING_TOGETHER_OBJECT_ID: "Behavior",
__LIVING_TOGETHER_OBJECT_TYPE: object.id
}
} else if (Array.isArray(object) && testArray) {
const hasValue = (item: any): item is IObjectParamArchiveType => !!item;
return object.map(item => object2ArchiveObject(item, false)).filter(hasValue);
} else {
return undefined;
}
}
function parameter2ArchiveObject
(value: IParameterValue
, option?: IParameterOption
): IArchiveParameterValue
{
let archive = {} as IArchiveParameterValue
;
const handelColl = (key: string, cValue: IParamValue) => {
// 处理对象类型
if (cValue instanceof Object && !Array.isArray(cValue)) {
const picker = (cValue as IObjectParamCacheType).picker;
const objects = (cValue as IObjectParamCacheType).objects;
(archive[key] as any) = {
picker: object2ArchiveObject(picker),
objects: object2ArchiveObject(objects)
}
}
// 处理数组类型
else if (Array.isArray(cValue)) {
(archive[key] as any) = cValue.concat([]);
}
// 处理数值
else {
(archive[key] as any) = cValue;
}
}
// 存在参考设置对象
if (option) {
for (const key in option) {
handelColl(key, value[key]);
}
}
// 不存在设置对象
else {
for (const key in value) {
handelColl(key, value[key]);
}
}
return archive;
}
function archiveObject2Parameter
(value: IArchiveParameterValue
, parse: IArchiveParseFn, option?: IParameterOption
): IParameterValue
{
let parameter = {} as IParameterValue
;
const handelColl = (key: string, cValue: IArchiveParamValue) => {
// 处理对象类型
if (cValue instanceof Object && !Array.isArray(cValue)) {
const picker = (cValue as IObjectParamCacheType).picker;
const objects = (cValue as IObjectParamCacheType).objects;
(parameter[key] as any) = {
picker: picker ? parse(picker) : picker,
objects: objects ? parse(objects) : objects
}
}
// 处理数组类型
else if (Array.isArray(cValue)) {
(parameter[key] as any) = cValue.concat([]);
}
// 处理数值
else {
(parameter[key] as any) = cValue;
}
}
// 存在参考设置对象
if (option) {
for (const key in option) {
handelColl(key, value[key]);
}
}
// 不存在设置对象
else {
for (const key in value) {
handelColl(key, value[key]);
}
}
return parameter;
}
export {
IParamType, IParamValue, isObjectType, isVectorType, getDefaultValue,
IParameterOptionItem, IParameter, IParameterOption, IParameterValue,
object2ArchiveObject, parameter2ArchiveObject
}