支持后端解析参数表达式并保留工程JSON

This commit is contained in:
ljz committed 2026-09-03 18:18:47 +08:00
1 parent 48da6be21c
commit a87d462e94
7 files changed
+640 -3

No files matched your search

+46 -3
View File
@@ -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):