Files
LNXSDK/leenkx/Sources/leenkx/logicnode/MathTermNode.hx
2025-01-22 16:18:30 +01:00

128 lines
2.9 KiB
Haxe

package leenkx.logicnode;
import haxe.io.Bytes;
import haxe.io.BytesInput;
import haxe.io.BytesOutput;
import leenkx.logicnode.MathExpressionNode.Formula;
import leenkx.logicnode.MathExpressionNode.FormulaException;
class MathTermNode extends LogicNode {
public var property0:Bool; // bind param values
public function new(tree: LogicTree) {
super(tree);
}
var simplifyError:String = null;
var derivateError:String = null;
var resultError:String = null;
override function get(from: Int): Dynamic {
var error:String = null;
var errorPos:Int = -1;
var formula:Formula = null;
try {
formula = new Formula(inputs[0].get());
}
catch(e:FormulaException) {
error = e.msg;
errorPos = e.pos;
}
// bind input values to formula parameters
if ((error == null) && (property0 || from == 3)) {
try {
bindValuesToFormulaParams(formula);
}
catch(e:FormulaException) {
error = e.msg;
errorPos = e.pos;
}
}
if (from == 0) { // -------- Formula ----------
return (error == null) ? formula : null;
}
else if (from == 1) { // -------- Simplifyed ----------
var f:Formula = null;
simplifyError = null;
if (error == null) {
try {
f = formula.simplify();
}
catch(e:FormulaException) {
simplifyError = e.msg;
}
}
return f;
}
else if (from == 2) { // -------- Derivate ----------
var f:Formula = null;
derivateError = null;
if (error == null) {
try {
f = formula.derivate( inputs[1].get() );
}
catch(e:FormulaException) {
derivateError = e.msg;
}
}
return f;
}
else if (from == 3) { // -------- Result ----------
var result:Float = 0.0;
resultError = null;
if (error == null) {
try {
result = formula.result;
}
catch(e:FormulaException) {
resultError = e.msg;
}
}
return result;
}
else if (from == 4) { // -------- Error ----------
if (error != null) return error;
else {
var errorMessage:String = "";
if (simplifyError != null) errorMessage += "Simplifyed:" + simplifyError + " ";
if (derivateError != null) errorMessage += "Derivate:" + derivateError + " ";
if (resultError != null) errorMessage += "Result:" + resultError + " ";
return errorMessage;
}
}
else { // -------- Error Position ----------
return errorPos;
}
}
public inline function bindValuesToFormulaParams(formula:Formula) {
var i = 1;
while (i < inputs.length)
{
if (inputs[i+1].get() != null)
{
if (Std.isOfType(inputs[i+1].get(), Float)) {
// trace ("Float param")
formula.bind( (inputs[i+1].get():Float), inputs[i].get() );
}
else if (Std.isOfType(inputs[i+1].get(), String)) {
// trace ("String param")
formula.bind( (inputs[i+1].get():String), inputs[i].get() );
}
else {
// trace ("Formula param")
formula.bind( (inputs[i+1].get():Formula), inputs[i].get() );
}
}
i+=2;
}
}
}