diff --git a/src/nodes/Eval.ts b/src/nodes/Eval.ts new file mode 100644 index 0000000..97cfd24 --- /dev/null +++ b/src/nodes/Eval.ts @@ -0,0 +1,80 @@ +import Node from './Node'; +import { + NumberVar, + StringVar, +} from './io/AbstractIOSet'; +import get from 'lodash/get'; + +const inputs = { + i0: { + type: 'Number', + default: 0, + } as NumberVar, + i1: { + type: 'Number', + default: 0, + } as NumberVar, + i2: { + type: 'Number', + default: 0, + } as NumberVar, + i3: { + type: 'Number', + default: 0, + } as NumberVar, + i4: { + type: 'Number', + default: 0, + } as NumberVar, + i5: { + type: 'Number', + default: 0, + } as NumberVar, + i6: { + type: 'Number', + default: 0, + } as NumberVar, + i7: { + type: 'Number', + default: 0, + } as NumberVar, + formula: { + type: 'String', + default: '', + } as StringVar +}; + +const outputs = { + result: { + type: 'Number' + } as NumberVar, +} + +export default class NumberBinaryOperation extends Node { + constructor() { + super('Eval', inputs, outputs); + } + + interpolate() { + return this.in.formula.value.replace(/\{(\w+)\}/g, (_, paramName) => { + const value = get(this.in, [paramName, 'value']); + if (value) { + return value; + } + return ''; + }) + } + + evaluate() { + try { + this.out.result.value = eval(this.interpolate()); + } catch (e) { + console.error(e); + } + } + + async _update() { + return this.evaluate(); + } + +} \ No newline at end of file diff --git a/src/nodes/index.ts b/src/nodes/index.ts index 2f3e273..1a23102 100644 --- a/src/nodes/index.ts +++ b/src/nodes/index.ts @@ -29,3 +29,4 @@ export {default as Disable} from './Disable'; export {default as Api} from './Api'; export {default as BodySegmentation} from './AI/BodySegmentation'; export {default as FaceFeaturePosition} from './AI/FaceFeaturePosition'; +export {default as Eval} from './Eval';