39 lines
1.2 KiB
Python
39 lines
1.2 KiB
Python
"""阶段 1:全局规划。
|
|||
|
|
|
||
|
|
收集图纸概览 + 识别图框,按阅读顺序排序,产出审查计划。
|
||
|
|
"""
|
||
|
|
|
||
|
|
from ..mcp_client import result_json
|
||
|
|
|
||
|
|
|
||
|
|
def _sort_frames(frames):
|
||
|
|
"""按阅读顺序排序:先上后下(max_y 降序)、再左后右(min_x 升序)。"""
|
||
|
|
|
||
|
|
def key(frame):
|
||
|
|
bbox = frame.get("bbox") or [0, 0, 0, 0]
|
||
|
|
return (-round(float(bbox[3]), 3), round(float(bbox[0]), 3))
|
||
|
|
|
||
|
|
return sorted(frames, key=key)
|
||
|
|
|
||
|
|
|
||
|
|
def plan(ctx):
|
||
|
|
"""返回 {drawing_info, layers, layouts, frames}。"""
|
||
|
|
drawing_info = result_json(ctx.tools.call("get_drawing_info", {}), {})
|
||
|
|
layers = result_json(ctx.tools.call("get_layers", {"count_entities": True}), {})
|
||
|
|
layouts = result_json(ctx.tools.call("get_layouts", {}), {})
|
||
|
|
|
||
|
|
frames_data = result_json(
|
||
|
|
ctx.tools.call("detect_drawing_frames", {"min_confidence": 0.3}), {}
|
||
|
|
)
|
||
|
|
frames = frames_data.get("items", []) if isinstance(frames_data, dict) else []
|
||
|
|
|
||
|
|
frames = _sort_frames(frames)
|
||
|
|
if ctx.max_frames > 0:
|
||
|
|
frames = frames[: ctx.max_frames]
|
||
|
|
|
||
|
|
return {
|
||
|
|
"drawing_info": drawing_info,
|
||
|
|
"layers": layers,
|
||
|
|
"layouts": layouts,
|
||
|
|
"frames": frames,
|
||
|
|
}
|