XML合并模块 职责: 1. 收集各模块生成的XML片段 2. 按层级排序(layer_level升序,小的在底层) 3. 同层级内按面积降序排列(大的在下,避免遮挡) 4. 重新分配mxCell的id,避免冲突 5. 生成完整的DrawIO XML文件 不负责: - 生成元素的样式(由各子模块负责) - 决定元素的颜色、描边等属性(由各子模块负责) 层级规则(从底到顶): 0. BACKGROUND
| 47 | |
| 48 | |
| 49 | class XMLMerger(BaseProcessor): |
| 50 | """ |
| 51 | XML合并模块 |
| 52 | |
| 53 | 职责: |
| 54 | 1. 收集各模块生成的XML片段 |
| 55 | 2. 按层级排序(layer_level升序,小的在底层) |
| 56 | 3. 同层级内按面积降序排列(大的在下,避免遮挡) |
| 57 | 4. 重新分配mxCell的id,避免冲突 |
| 58 | 5. 生成完整的DrawIO XML文件 |
| 59 | |
| 60 | 不负责: |
| 61 | - 生成元素的样式(由各子模块负责) |
| 62 | - 决定元素的颜色、描边等属性(由各子模块负责) |
| 63 | |
| 64 | 层级规则(从底到顶): |
| 65 | 0. BACKGROUND - section_panel, title_bar等大面积容器 |
| 66 | 1. BASIC_SHAPE - rectangle, ellipse等基本图形 |
| 67 | 2. IMAGE - icon, picture等图片 |
| 68 | 3. ARROW - 箭头/连接线 |
| 69 | 4. TEXT - 文字(最上层) |
| 70 | 5. OTHER - 其他 |
| 71 | """ |
| 72 | |
| 73 | def __init__(self, config=None): |
| 74 | super().__init__(config) |
| 75 | |
| 76 | def process(self, context: ProcessingContext) -> ProcessingResult: |
| 77 | """ |
| 78 | 处理入口 - 合并所有XML片段 |
| 79 | |
| 80 | Args: |
| 81 | context: 处理上下文,需要包含: |
| 82 | - canvas_width, canvas_height: 画布尺寸 |
| 83 | - xml_fragments: List[XMLFragment] 或 |
| 84 | - elements: List[ElementInfo](每个元素需要有xml_fragment) |
| 85 | |
| 86 | Returns: |
| 87 | ProcessingResult: 包含生成的XML路径 |
| 88 | """ |
| 89 | # 获取 upscale_factor,用于将画布尺寸缩放回原始尺寸 |
| 90 | upscale_factor = 1.0 |
| 91 | if hasattr(context, 'intermediate_results') and context.intermediate_results: |
| 92 | upscale_factor = context.intermediate_results.get('upscale_factor', 1.0) |
| 93 | |
| 94 | # 计算原始画布尺寸 |
| 95 | canvas_width = context.canvas_width |
| 96 | canvas_height = context.canvas_height |
| 97 | if upscale_factor != 1.0: |
| 98 | canvas_width = int(context.canvas_width / upscale_factor) |
| 99 | canvas_height = int(context.canvas_height / upscale_factor) |
| 100 | self._log(f"画布尺寸缩放: {context.canvas_width}x{context.canvas_height} → {canvas_width}x{canvas_height}") |
| 101 | |
| 102 | # 收集所有XML片段 |
| 103 | fragments = self._collect_fragments(context) |
| 104 | |
| 105 | self._log(f"开始合并XML: 共{len(fragments)}个片段") |
| 106 |
no outgoing calls
no test coverage detected