import type { Group } from "@Model/Group";
import type { Range } from "@Model/Range";
import type { Label } from "@Model/Label";
type IObjectParamCacheType
= {
picker: P;
objects: Q;
}
/**
* 参数类型
*/
type IMapBasicParamTypeKeyToType = {
"number": number;
"string": string;
"boolean": boolean;
"option": string;
}
type IMapObjectParamTypeKeyToType = {
"R": IObjectParamCacheType;
"G": IObjectParamCacheType;
"LR": IObjectParamCacheType;
"LG": IObjectParamCacheType;
"CG": IObjectParamCacheType;
"CLG": IObjectParamCacheType;
}
type IMapVectorParamTypeKeyToType = {
"vec": number[];
"color": number[];
}
/**
* 参数类型映射
*/
type AllMapType = IMapBasicParamTypeKeyToType & IMapObjectParamTypeKeyToType & IMapVectorParamTypeKeyToType;
type IParamType = keyof AllMapType;
type IObjectType = keyof IMapObjectParamTypeKeyToType;
type IVectorType = keyof IMapVectorParamTypeKeyToType;
type IParamValue = AllMapType[K];
/**
* 特殊对象类型判定
*/
const objectTypeListEnumSet = new Set(["R", "G", "LR", "LG", "CG", "CLG"]);
/**
* 对象断言表达式
*/
function isObjectType(key: string): key is IVectorType {
return objectTypeListEnumSet.has(key);
}
/**
* 向量断言表达式
*/
function isVectorType(key: string): key is IObjectType {
return key === "vec";
}
/**
* 模型参数类型
*/
interface IParameterOptionItem {
/**
* 参数类型
*/
type: T | string;
/**
* 参数默认值
*/
defaultValue?: IParamValue;
/**
* 数值变化回调
*/
onChange?: (value: IParamValue) => 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
}
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;
}
export {
IParamType, IParamValue, isObjectType, isVectorType, getDefaultValue,
IParameterOptionItem, IParameter, IParameterOption, IParameterValue
}