"""阶段 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, }