From ae0ecad520fce12b140276b6d1a6a20013302418 Mon Sep 17 00:00:00 2001 From: Zhaowenlong Date: Mon, 1 Jun 2026 17:00:42 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=B8=83=E7=BA=BF=E6=8A=A5=E5=91=8A?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E5=AE=B9=E9=87=8F=E5=8E=8B=E5=8A=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/FreeCAD 3D自动布线设计方案.md | 3 ++ src/Mod/FreeCADExchange/AutoRouting.py | 45 +++++++++++++++++++ .../freecad_exchange_auto_routing_test.py | 24 ++++++++++ 3 files changed, 72 insertions(+) diff --git a/docs/FreeCAD 3D自动布线设计方案.md b/docs/FreeCAD 3D自动布线设计方案.md index 72b55d8..10e1b22 100644 --- a/docs/FreeCAD 3D自动布线设计方案.md +++ b/docs/FreeCAD 3D自动布线设计方案.md @@ -374,6 +374,8 @@ QetWiringCutOutBridgeExtensionMm = 20.0 如果多条导线共用同一路径并触发 lane 偏移,批量报告会显示最大 lane 编号和 lane 间距。这个值用于确认当前结果是否只是完全重叠的导线,还是已经按共路情况做了可视错位;它仍然是显示层偏移,不等于真实线槽截面排布或填充率计算。 +当最大并行线数超过 route track 中记录的路径最小容量时,批量报告会给出容量提示。这个提示只基于 `QetRouteCarrierCapacity` 和当前 lane 情况,用于暴露“可能容量不足”的调试线索,不等同于按线径、截面积和线槽填充率计算的工程容量校核。 + ### 5.3 布线连接功能 已完成: @@ -457,6 +459,7 @@ tests/python/freecad_exchange_auto_routing_test.py 33. 批量布线报告会显示路径网络自动桥接段数和主动避障屏蔽段数,方便核对调参和避障是否实际参与求路。 34. 批量布线报告会显示最大 lane 编号和 lane 间距,方便确认多根线共路时是否发生了可视错位。 35. `QetRouteTrackJson` 的 carrier payload 会记录 `capacity`,方便后续分析线槽容量偏好和共路绕行。 +36. 批量布线报告会在最大并行线数超过路径最小容量时显示容量提示,但当前仍不做真实填充率计算。 已完成 FreeCAD smoke: diff --git a/src/Mod/FreeCADExchange/AutoRouting.py b/src/Mod/FreeCADExchange/AutoRouting.py index 41c55af..114586e 100644 --- a/src/Mod/FreeCADExchange/AutoRouting.py +++ b/src/Mod/FreeCADExchange/AutoRouting.py @@ -1777,6 +1777,45 @@ def _route_lane_summary(report): } +def _route_track_min_capacity(route_track): + if not isinstance(route_track, dict): + return None + capacities = [] + for segment in route_track.get("segments", []) or []: + carrier = segment.get("carrier", {}) if isinstance(segment, dict) else {} + if not isinstance(carrier, dict): + continue + try: + capacity = int(float(carrier.get("capacity", 0) or 0)) + except Exception: + capacity = 0 + if capacity > 0: + capacities.append(capacity) + if not capacities: + return None + return min(capacities) + + +def _route_capacity_pressure_summary(report, lane_summary): + if not lane_summary: + return {} + max_parallel_wires = int(lane_summary.get("max_lane_index", 0) or 0) + 1 + min_capacity = None + for route in report.get("routes", []) or []: + if not isinstance(route, dict): + continue + route_capacity = _route_track_min_capacity(route.get("route_track", {})) + if route_capacity is None: + continue + min_capacity = route_capacity if min_capacity is None else min(min_capacity, route_capacity) + if min_capacity is None or max_parallel_wires <= min_capacity: + return {} + return { + "max_parallel_wires": max_parallel_wires, + "min_capacity": min_capacity, + } + + def format_eplan_connection_route_report(report): message = "批量生成布线连接完成:routed={0}, collision_warnings={1}, missing_terminals={2}".format( report.get("routed", 0), @@ -1834,6 +1873,12 @@ def format_eplan_connection_route_report(report): lane_summary.get("max_lane_index", 0), float(lane_summary.get("spacing_mm", 0.0) or 0.0), ) + capacity_pressure = _route_capacity_pressure_summary(report, lane_summary) + if capacity_pressure: + message += "\n容量提示:最大并行线数 {0},路径最小容量 {1}。".format( + capacity_pressure.get("max_parallel_wires", 0), + capacity_pressure.get("min_capacity", 0), + ) route_source_sample = _route_source_sample_text(report) if route_source_sample: message += "\n{0}".format(route_source_sample) diff --git a/tests/python/freecad_exchange_auto_routing_test.py b/tests/python/freecad_exchange_auto_routing_test.py index cc66ed3..6a1757b 100644 --- a/tests/python/freecad_exchange_auto_routing_test.py +++ b/tests/python/freecad_exchange_auto_routing_test.py @@ -2247,6 +2247,30 @@ class AutoRoutingTest(unittest.TestCase): self.assertIn("并行错位:最大 lane 2,间距 10.0 mm。", message) + def test_route_report_warns_when_parallel_lanes_exceed_track_capacity(self): + _install_fake_freecad() + _terminal_objects, _wiring_objects, _routing_network, auto_routing = _reload_modules() + report = { + "routed": 3, + "collision_warnings": 0, + "skipped_missing_terminal": 0, + "routes": [ + { + "lane": {"index": 2, "spacing_mm": 10.0}, + "route_track": { + "segments": [ + {"carrier": {"kind": "WireDuct", "capacity": 2}}, + {"carrier": {"kind": "WireDuct", "capacity": 4}}, + ] + }, + } + ], + } + + message = auto_routing.format_eplan_connection_route_report(report) + + self.assertIn("容量提示:最大并行线数 3,路径最小容量 2。", message) + def test_route_eplan_connections_report_keeps_route_identity_and_diagnostics(self): _install_fake_freecad() terminal_objects, _wiring_objects, routing_network, auto_routing = _reload_modules()