feat: 布线报告显示并行错位

dev
Zhaowenlong 3 weeks ago
parent e689d4edf1
commit d570c75506

@ -372,6 +372,8 @@ QetWiringCutOutBridgeExtensionMm = 20.0
批量布线报告还会汇总本批次路线中使用到的路径网络特征:如果路线依赖相邻线槽自动桥接,报告会显示自动桥接段数;如果主动避障时屏蔽了穿过障碍包围盒的网络边,报告会显示避障屏蔽段数。这里采用路线中的最大值展示,避免多条导线共用同一网络时重复累加。 批量布线报告还会汇总本批次路线中使用到的路径网络特征:如果路线依赖相邻线槽自动桥接,报告会显示自动桥接段数;如果主动避障时屏蔽了穿过障碍包围盒的网络边,报告会显示避障屏蔽段数。这里采用路线中的最大值展示,避免多条导线共用同一网络时重复累加。
如果多条导线共用同一路径并触发 lane 偏移,批量报告会显示最大 lane 编号和 lane 间距。这个值用于确认当前结果是否只是完全重叠的导线,还是已经按共路情况做了可视错位;它仍然是显示层偏移,不等于真实线槽截面排布或填充率计算。
### 5.3 布线连接功能 ### 5.3 布线连接功能
已完成: 已完成:
@ -453,6 +455,7 @@ tests/python/freecad_exchange_auto_routing_test.py
31. `3D 布线连接` 面板提供“端子接入最大距离 mm”和“端子出线长度 mm”设置用于适配真实机柜里端子离线槽远近不同、设备端子方向不同的情况。 31. `3D 布线连接` 面板提供“端子接入最大距离 mm”和“端子出线长度 mm”设置用于适配真实机柜里端子离线槽远近不同、设备端子方向不同的情况。
32. 布线路径网络检查会在端子未接入诊断中记录当前端子接入最大距离和端子出线长度,并在中文报告里显示最大接入距离。 32. 布线路径网络检查会在端子未接入诊断中记录当前端子接入最大距离和端子出线长度,并在中文报告里显示最大接入距离。
33. 批量布线报告会显示路径网络自动桥接段数和主动避障屏蔽段数,方便核对调参和避障是否实际参与求路。 33. 批量布线报告会显示路径网络自动桥接段数和主动避障屏蔽段数,方便核对调参和避障是否实际参与求路。
34. 批量布线报告会显示最大 lane 编号和 lane 间距,方便确认多根线共路时是否发生了可视错位。
已完成 FreeCAD smoke 已完成 FreeCAD smoke

@ -1749,6 +1749,34 @@ def _route_network_metric_max(report, key):
return maximum 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): def format_eplan_connection_route_report(report):
message = "批量生成布线连接完成routed={0}, collision_warnings={1}, missing_terminals={2}".format( message = "批量生成布线连接完成routed={0}, collision_warnings={1}, missing_terminals={2}".format(
report.get("routed", 0), report.get("routed", 0),
@ -1800,6 +1828,12 @@ def format_eplan_connection_route_report(report):
network_parts.append("避障屏蔽 {0}".format(blocked_segments)) network_parts.append("避障屏蔽 {0}".format(blocked_segments))
if network_parts: if network_parts:
message += "\n路径网络:{0}".format("".join(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) route_source_sample = _route_source_sample_text(report)
if route_source_sample: if route_source_sample:
message += "\n{0}".format(route_source_sample) message += "\n{0}".format(route_source_sample)

@ -2209,6 +2209,23 @@ class AutoRoutingTest(unittest.TestCase):
self.assertIn("路径网络:自动桥接 1 段相邻线槽,避障屏蔽 2 段。", message) 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): def test_route_eplan_connections_report_keeps_route_identity_and_diagnostics(self):
_install_fake_freecad() _install_fake_freecad()
terminal_objects, _wiring_objects, routing_network, auto_routing = _reload_modules() terminal_objects, _wiring_objects, routing_network, auto_routing = _reload_modules()

Loading…
Cancel
Save