支持后端解析参数表达式并保留工程JSON
This commit is contained in:
1 parent
48da6be21c
commit
a87d462e94
7 files changed
+640
-3
No files matched your search
+46
-3
@@ -22,6 +22,11 @@ from fastapi import FastAPI, HTTPException, Request, Response
|
||||
from fastapi.responses import FileResponse, HTMLResponse, StreamingResponse
|
||||
from pydantic import BaseModel, ConfigDict, Field, ValidationError
|
||||
|
||||
from app.parameter_expression import (
|
||||
ParameterExpressionError,
|
||||
evaluate_parameter_expression,
|
||||
expression_value_to_base_unit,
|
||||
)
|
||||
from app.simulation.performance import performance_span, profile_phase, profile_run
|
||||
from app.simulation.property_cache import property_cache_run
|
||||
from app.simulation.solvers.solver import SolverActivityTracker
|
||||
@@ -1100,7 +1105,14 @@ def validate_reactflow_component_contract(
|
||||
|
||||
parameter_values: dict[str, float] = {}
|
||||
for parameter in component_spec.parameters:
|
||||
value = parameter_float(node, parameter.name, parameter.default)
|
||||
value = parameter_float(
|
||||
node,
|
||||
parameter.name,
|
||||
parameter.default,
|
||||
quantity=parameter.quantity,
|
||||
base_unit=parameter.unit,
|
||||
expressions_allowed=parameter.editor is None,
|
||||
)
|
||||
validation_message = parameter.validation_message(value)
|
||||
if validation_message is not None:
|
||||
raise ValueError(
|
||||
@@ -1667,14 +1679,45 @@ def parameter_float(
|
||||
node: ReactFlowNodePayload | None,
|
||||
name: str,
|
||||
default: float,
|
||||
*,
|
||||
quantity: str = "dimensionless",
|
||||
base_unit: str = "",
|
||||
expressions_allowed: bool = True,
|
||||
) -> float:
|
||||
if node is None:
|
||||
return default
|
||||
value = node.data.parameters.get(name, default)
|
||||
try:
|
||||
return float(value)
|
||||
numeric_value = float(value)
|
||||
except (TypeError, ValueError):
|
||||
raise ValueError(f"Parameter '{name}' on component '{node.id}' must be numeric.")
|
||||
if not isinstance(value, str):
|
||||
raise ValueError(
|
||||
f"Parameter '{name}' on component '{node.id}' must be numeric."
|
||||
)
|
||||
if not expressions_allowed:
|
||||
raise ValueError(
|
||||
f"PARAMETER_EXPRESSION_FORBIDDEN: Parameter '{name}' on component "
|
||||
f"'{node.id}' is a discrete selection and cannot use an expression."
|
||||
)
|
||||
try:
|
||||
evaluated = evaluate_parameter_expression(value)
|
||||
selected_unit = node.data.parameterUnits.get(name, base_unit)
|
||||
return expression_value_to_base_unit(
|
||||
evaluated,
|
||||
quantity=quantity,
|
||||
selected_unit=selected_unit,
|
||||
)
|
||||
except ParameterExpressionError as exc:
|
||||
raise ValueError(
|
||||
f"PARAMETER_EXPRESSION_INVALID: Parameter '{name}' on component "
|
||||
f"'{node.id}' contains an invalid expression: {exc}."
|
||||
) from exc
|
||||
if not isfinite(numeric_value):
|
||||
raise ValueError(
|
||||
f"Parameter '{name}' on component '{node.id}' must be a finite "
|
||||
"numeric value."
|
||||
)
|
||||
return numeric_value
|
||||
|
||||
|
||||
def pipe_config_from_node(node: ReactFlowNodePayload | None, pipe_config_type):
|
||||
|
||||
Reference in new issue
Block a user