feat: 布线报告提示容量压力

dev
Zhaowenlong 3 weeks ago
parent 1f63e1d72d
commit ae0ecad520

@ -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

@ -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)

@ -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()

Loading…
Cancel
Save