From d570c755069566294ab5f33a5b5651e146e48a2e Mon Sep 17 00:00:00 2001 From: Zhaowenlong Date: Mon, 1 Jun 2026 16:51:02 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=B8=83=E7=BA=BF=E6=8A=A5=E5=91=8A?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E5=B9=B6=E8=A1=8C=E9=94=99=E4=BD=8D?= 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 | 34 +++++++++++++++++++ .../freecad_exchange_auto_routing_test.py | 17 ++++++++++ 3 files changed, 54 insertions(+) diff --git a/docs/FreeCAD 3D自动布线设计方案.md b/docs/FreeCAD 3D自动布线设计方案.md index 00bebf7..27ab1d1 100644 --- a/docs/FreeCAD 3D自动布线设计方案.md +++ b/docs/FreeCAD 3D自动布线设计方案.md @@ -372,6 +372,8 @@ QetWiringCutOutBridgeExtensionMm = 20.0 批量布线报告还会汇总本批次路线中使用到的路径网络特征:如果路线依赖相邻线槽自动桥接,报告会显示自动桥接段数;如果主动避障时屏蔽了穿过障碍包围盒的网络边,报告会显示避障屏蔽段数。这里采用路线中的最大值展示,避免多条导线共用同一网络时重复累加。 +如果多条导线共用同一路径并触发 lane 偏移,批量报告会显示最大 lane 编号和 lane 间距。这个值用于确认当前结果是否只是完全重叠的导线,还是已经按共路情况做了可视错位;它仍然是显示层偏移,不等于真实线槽截面排布或填充率计算。 + ### 5.3 布线连接功能 已完成: @@ -453,6 +455,7 @@ tests/python/freecad_exchange_auto_routing_test.py 31. `3D 布线连接` 面板提供“端子接入最大距离 mm”和“端子出线长度 mm”设置,用于适配真实机柜里端子离线槽远近不同、设备端子方向不同的情况。 32. 布线路径网络检查会在端子未接入诊断中记录当前端子接入最大距离和端子出线长度,并在中文报告里显示最大接入距离。 33. 批量布线报告会显示路径网络自动桥接段数和主动避障屏蔽段数,方便核对调参和避障是否实际参与求路。 +34. 批量布线报告会显示最大 lane 编号和 lane 间距,方便确认多根线共路时是否发生了可视错位。 已完成 FreeCAD smoke: diff --git a/src/Mod/FreeCADExchange/AutoRouting.py b/src/Mod/FreeCADExchange/AutoRouting.py index f63cf93..41c55af 100644 --- a/src/Mod/FreeCADExchange/AutoRouting.py +++ b/src/Mod/FreeCADExchange/AutoRouting.py @@ -1749,6 +1749,34 @@ def _route_network_metric_max(report, key): return maximum +def _route_lane_summary(report): + max_lane_index = 0 + lane_spacing = 0.0 + for route in report.get("routes", []) or []: + if not isinstance(route, dict): + continue + lane = route.get("lane", {}) + if not isinstance(lane, dict): + continue + try: + lane_index = int(lane.get("index", 0) or 0) + except Exception: + lane_index = 0 + if lane_index <= max_lane_index: + continue + max_lane_index = lane_index + try: + lane_spacing = float(lane.get("spacing_mm", 0.0) or 0.0) + except Exception: + lane_spacing = 0.0 + if max_lane_index <= 0: + return {} + return { + "max_lane_index": max_lane_index, + "spacing_mm": lane_spacing, + } + + def format_eplan_connection_route_report(report): message = "批量生成布线连接完成:routed={0}, collision_warnings={1}, missing_terminals={2}".format( report.get("routed", 0), @@ -1800,6 +1828,12 @@ def format_eplan_connection_route_report(report): network_parts.append("避障屏蔽 {0} 段".format(blocked_segments)) if network_parts: message += "\n路径网络:{0}。".format(",".join(network_parts)) + lane_summary = _route_lane_summary(report) + if lane_summary: + message += "\n并行错位:最大 lane {0},间距 {1:.1f} mm。".format( + lane_summary.get("max_lane_index", 0), + float(lane_summary.get("spacing_mm", 0.0) or 0.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 21a0b2b..6ca4c19 100644 --- a/tests/python/freecad_exchange_auto_routing_test.py +++ b/tests/python/freecad_exchange_auto_routing_test.py @@ -2209,6 +2209,23 @@ class AutoRoutingTest(unittest.TestCase): self.assertIn("路径网络:自动桥接 1 段相邻线槽,避障屏蔽 2 段。", message) + def test_route_report_includes_parallel_lane_summary(self): + _install_fake_freecad() + _terminal_objects, _wiring_objects, _routing_network, auto_routing = _reload_modules() + report = { + "routed": 2, + "collision_warnings": 0, + "skipped_missing_terminal": 0, + "routes": [ + {"lane": {"index": 0, "axis": "y", "spacing_mm": 10.0, "offset_mm": 0.0}}, + {"lane": {"index": 2, "axis": "y", "spacing_mm": 10.0, "offset_mm": -10.0}}, + ], + } + + message = auto_routing.format_eplan_connection_route_report(report) + + self.assertIn("并行错位:最大 lane 2,间距 10.0 mm。", 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()