From e689d4edf19f5924bf87c86015cdd5061b355b02 Mon Sep 17 00:00:00 2001 From: Zhaowenlong Date: Mon, 1 Jun 2026 16:45:29 +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=E7=BD=91=E7=BB=9C=E8=B0=83=E5=8F=82=E6=95=88?= =?UTF-8?q?=E6=9E=9C?= 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 | 24 +++++++++++++++++++ .../freecad_exchange_auto_routing_test.py | 21 ++++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/docs/FreeCAD 3D自动布线设计方案.md b/docs/FreeCAD 3D自动布线设计方案.md index 93acab2..00bebf7 100644 --- a/docs/FreeCAD 3D自动布线设计方案.md +++ b/docs/FreeCAD 3D自动布线设计方案.md @@ -370,6 +370,8 @@ QetWiringCutOutBridgeExtensionMm = 20.0 批量生成布线连接后,面板/控制台报告会从第一条可追踪路径中提取一条“路径示例”,显示导线经过的源对象标签,便于快速确认线路是否进入了预期线槽、过线孔和支撑面。 +批量布线报告还会汇总本批次路线中使用到的路径网络特征:如果路线依赖相邻线槽自动桥接,报告会显示自动桥接段数;如果主动避障时屏蔽了穿过障碍包围盒的网络边,报告会显示避障屏蔽段数。这里采用路线中的最大值展示,避免多条导线共用同一网络时重复累加。 + ### 5.3 布线连接功能 已完成: @@ -450,6 +452,7 @@ tests/python/freecad_exchange_auto_routing_test.py 30. `3D 布线连接` 面板提供“线槽桥接容差 mm”设置,面板生成/检查/布线流程会使用该值;网络检查报告会显示自动桥接段数。 31. `3D 布线连接` 面板提供“端子接入最大距离 mm”和“端子出线长度 mm”设置,用于适配真实机柜里端子离线槽远近不同、设备端子方向不同的情况。 32. 布线路径网络检查会在端子未接入诊断中记录当前端子接入最大距离和端子出线长度,并在中文报告里显示最大接入距离。 +33. 批量布线报告会显示路径网络自动桥接段数和主动避障屏蔽段数,方便核对调参和避障是否实际参与求路。 已完成 FreeCAD smoke: diff --git a/src/Mod/FreeCADExchange/AutoRouting.py b/src/Mod/FreeCADExchange/AutoRouting.py index 26fdf9a..f63cf93 100644 --- a/src/Mod/FreeCADExchange/AutoRouting.py +++ b/src/Mod/FreeCADExchange/AutoRouting.py @@ -1734,6 +1734,21 @@ def _route_source_sample_text(report): return "" +def _route_network_metric_max(report, key): + maximum = 0 + for route in report.get("routes", []) or []: + if not isinstance(route, dict): + continue + network = route.get("network", {}) + if not isinstance(network, dict): + continue + try: + maximum = max(maximum, int(network.get(key, 0) or 0)) + except Exception: + continue + return maximum + + def format_eplan_connection_route_report(report): message = "批量生成布线连接完成:routed={0}, collision_warnings={1}, missing_terminals={2}".format( report.get("routed", 0), @@ -1776,6 +1791,15 @@ def format_eplan_connection_route_report(report): total_length_mm = float(report.get("total_length_mm", 0.0) or 0.0) if total_length_mm > 0.0: message += "\n布线连接总长度:{0:.1f} mm。".format(total_length_mm) + bridged_segments = _route_network_metric_max(report, "bridged_segments") + blocked_segments = _route_network_metric_max(report, "blocked_segments") + network_parts = [] + if bridged_segments > 0: + network_parts.append("自动桥接 {0} 段相邻线槽".format(bridged_segments)) + if blocked_segments > 0: + network_parts.append("避障屏蔽 {0} 段".format(blocked_segments)) + if network_parts: + message += "\n路径网络:{0}。".format(",".join(network_parts)) 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 f56c227..21a0b2b 100644 --- a/tests/python/freecad_exchange_auto_routing_test.py +++ b/tests/python/freecad_exchange_auto_routing_test.py @@ -2188,6 +2188,27 @@ class AutoRoutingTest(unittest.TestCase): self.assertIn("路径示例:导线 N4111 经过 QF1:A1、线槽A、过线孔A。", message) + def test_route_report_includes_network_bridge_and_blocked_segment_counts(self): + _install_fake_freecad() + _terminal_objects, _wiring_objects, _routing_network, auto_routing = _reload_modules() + report = { + "routed": 1, + "collision_warnings": 0, + "skipped_missing_terminal": 0, + "routes": [ + { + "network": { + "bridged_segments": 1, + "blocked_segments": 2, + }, + } + ], + } + + message = auto_routing.format_eplan_connection_route_report(report) + + self.assertIn("路径网络:自动桥接 1 段相邻线槽,避障屏蔽 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()