You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
WebCAD/src/Common/eval.ts

119 lines
2.6 KiB

import { equaln } from "../Geometry/GeUtils";
import { clamp as CLAMP, FixedNotZero } from "./Utils";
let abs = Math.abs;
let acos = Math.acos;
let acosh = Math.acosh;
let asin = Math.asin;
let asinh = Math.asinh;
let atan = Math.atan;
let atanh = Math.atanh;
let atan2 = Math.atan2;
let ceil = Math.ceil;
let cbrt = Math.cbrt;
let expm1 = Math.expm1;
let clz32 = Math.clz32;
let cos = Math.cos;
let cosh = Math.cosh;
let exp = Math.exp;
let floor = Math.floor;
let fround = Math.fround;
let hypot = Math.hypot;
let imul = Math.imul;
let log = Math.log;
let log1p = Math.log1p;
let log2 = Math.log2;
let log10 = Math.log10;
let max = Math.max;
let min = Math.min;
let pow = Math.pow;
let random = Math.random;
let round = Math.round;
let sign = Math.sign;
let sin = Math.sin;
let sinh = Math.sinh;
let sqrt = Math.sqrt;
let tan = Math.tan;
let tanh = Math.tanh;
let trunc = Math.trunc;
let E = Math.E;
let LN10 = Math.LN10;
let LN2 = Math.LN2;
let LOG10E = Math.LOG10E;
let LOG2E = Math.LOG2E;
let PI = Math.PI;
let SQRT1_2 = Math.SQRT1_2;
let SQRT2 = Math.SQRT2;
let clamp = CLAMP;
let eq = equaln;
let OPERATORS = new Set(["+", "-", "*", "/"]);
/**
* eval2("+10", { L: 100 }, "L")
* @param expr
* @param [params]
* @param [defaultParam] 当输入 +10 这样的表达式时,设置默认的操作变量
* @returns 计算结果
*/
export function eval2(expr: string, params?: {}, defaultParam?: string): number
{
let code = "";
if (params)
for (let name in params)
code += `let ${name} = ${params[name]};`;
if (defaultParam)
{
expr = expr.trimLeft();
if (expr[0] && OPERATORS.has(expr[0]))
expr = defaultParam + expr;
}
code += expr;
let result = eval(code);
if (typeof result === "function")
return result();
return Number(result);//防止bigint乱入
}
export function safeEval(expr: string, params?: {}, defaultParam?: string): number
{
try
{
return eval2(expr, params, defaultParam);
}
catch (error)
{
return NaN;
}
}
export function CheckExpr(expr: string, params: any)
{
let resultObj = { res: undefined, error: undefined };
try
{
resultObj.res = eval2(expr, params);
}
catch (error)
{
resultObj.error = error;
}
return resultObj;
}
const Reg_Expr = /\{[^\}]+\}/g;
/**解析大括号内的 */
export function ParseExpr(expr: string, params?: {})
{
let strs = expr.match(Reg_Expr);
if (!strs) return expr;
for (let str of strs)
expr = expr.replace(str, FixedNotZero(safeEval(str.slice(1, -1), params), 2));
return expr;
}