feat:优化执行步骤
This commit is contained in:
+20
-7
@@ -5,10 +5,11 @@
|
||||
|
||||
from copy import deepcopy
|
||||
|
||||
from app.actions.layout import EXPANDERS
|
||||
from app.actions.registry import apply_action
|
||||
from app.actions.update import fit_existing_path
|
||||
from app.resources.material_fields import check_update_field, find_material
|
||||
from app.schemas.actions import Action, AddAction, UpdateAction
|
||||
from app.schemas.actions import Action, AddAction, AgentAction, UpdateAction
|
||||
from app.schemas.capabilities import DATA_BINDING_ERROR, DATA_BINDING_SUPPORTED
|
||||
from app.schemas.component_resource import ComponentCatalog
|
||||
from app.schemas.screen import Screen, ScreenNode
|
||||
@@ -17,12 +18,15 @@ from app.schemas.screen import Screen, ScreenNode
|
||||
class BatchError(ValueError):
|
||||
"""整批中第 index 个动作(从 0 开始)失败,消息里带上序号和目标,模型据此修正"""
|
||||
|
||||
def __init__(self, index: int, action: Action, reason: str):
|
||||
def __init__(self, index: int, action: AgentAction, reason: str):
|
||||
self.index = index
|
||||
self.reason = reason
|
||||
target = getattr(action, "target_id", None)
|
||||
if target is None:
|
||||
target = action.node.id if isinstance(action, AddAction) else "画布"
|
||||
if isinstance(action, AddAction):
|
||||
target = action.node.id
|
||||
elif ids := getattr(action, "target_ids", None):
|
||||
target = "、".join(ids)
|
||||
else:
|
||||
target = getattr(action, "target_id", "画布")
|
||||
super().__init__(f"第 {index + 1} 个动作({action.type} {target}):{reason}")
|
||||
|
||||
|
||||
@@ -57,13 +61,22 @@ def complete_add(action: AddAction, catalog: ComponentCatalog) -> AddAction:
|
||||
|
||||
|
||||
def run_batch(
|
||||
screen: Screen, catalog: ComponentCatalog, actions: list[Action]
|
||||
screen: Screen, catalog: ComponentCatalog, actions: list[AgentAction]
|
||||
) -> tuple[list[Action], Screen]:
|
||||
"""从原始大屏开始按顺序模拟执行,返回前端要执行的动作和执行后的大屏;第一个错误抛 BatchError"""
|
||||
"""从原始大屏开始按顺序模拟执行,返回前端要执行的动作和执行后的大屏;第一个错误抛 BatchError
|
||||
|
||||
布局意图(arrange、align、distribute、set_layout)在这里按当时的大屏展开成 move 和 resize
|
||||
"""
|
||||
current = screen.model_copy(deep=True)
|
||||
completed: list[Action] = []
|
||||
for index, action in enumerate(actions):
|
||||
try:
|
||||
if expander := EXPANDERS.get(action.type):
|
||||
expanded = expander(current, action)
|
||||
for primitive in expanded:
|
||||
current = apply_action(current, primitive)
|
||||
completed.extend(expanded)
|
||||
continue
|
||||
if isinstance(action, AddAction):
|
||||
action = complete_add(action, catalog)
|
||||
elif isinstance(action, UpdateAction):
|
||||
|
||||
Reference in New Issue
Block a user