feat: 增强FreeCAD布线路径网络检查报告

dev
Zhaowenlong 3 weeks ago
parent 0e42c7db0a
commit f74e55b782

@ -1580,6 +1580,76 @@ def check_eplan_routing_path_network(doc, project_uuid="", options=None):
}
def _format_distance_mm(value):
try:
return "{0:.1f} mm".format(float(value))
except Exception:
return "未知距离"
def _diagnostic_terminal_text(item):
if not isinstance(item, dict):
return "未知端子"
return (
item.get("terminal_uuid")
or item.get("label")
or item.get("name")
or "未知端子"
)
def _dict_items(value):
if not isinstance(value, list):
return []
return [item for item in value if isinstance(item, dict)]
def format_routing_path_network_report(diagnostic):
"""Return an actionable Chinese summary for routing path network diagnostics."""
if not isinstance(diagnostic, dict):
return "布线路径网络检查失败:诊断结果无效。"
summary = diagnostic.get("summary", {}) if isinstance(diagnostic.get("summary", {}), dict) else {}
issues = _dict_items(diagnostic.get("issues", []) or [])
if not issues:
return "布线路径网络检查通过:{0} 条 carrier / {1} 段 / {2} 个节点。".format(
summary.get("carriers", 0),
summary.get("segments", 0),
summary.get("nodes", 0),
)
message = "布线路径网络检查发现 {0} 类问题。".format(len(issues))
unconnected = _dict_items(diagnostic.get("unconnected_terminals", []) or [])
if unconnected:
sample = unconnected[0]
message += "\n端子未接入:{0},距离最近网络 {1}。请重新生成布线路径网络,或补一段线槽/辅助路径到该端子。".format(
_diagnostic_terminal_text(sample),
_format_distance_mm(sample.get("nearest_network_distance_mm")),
)
possible_breaks = _dict_items(diagnostic.get("possible_breaks", []) or [])
if possible_breaks:
sample = possible_breaks[0]
carrier = sample.get("carrier", {}) if isinstance(sample.get("carrier", {}), dict) else {}
carrier_text = carrier.get("label") or carrier.get("name") or "未知线槽"
message += "\n线槽端点疑似断开:{0}。请补齐相邻线槽、开口或辅助路径。".format(carrier_text)
isolated = _dict_items(diagnostic.get("isolated_components", []) or [])
if isolated:
sample = isolated[0]
carriers = sample.get("carrier_labels") or sample.get("carrier_names") or []
carrier_text = "".join([str(item) for item in carriers[:3]]) if carriers else "未知 carrier"
message += "\n存在孤立路径网络:{0}。请用线槽/辅助路径把孤立网络接入主网络。".format(carrier_text)
if not (unconnected or possible_breaks or isolated):
first_issue = issues[0]
message += "\n首个问题:{0} ({1})。".format(
first_issue.get("code", "unknown"),
first_issue.get("count", 0),
)
return message
def update_eplan_routing_path_network(doc, project_uuid="", options=None, selection_ex=None):
"""Update the routing path network before EPLAN-style Route."""
return generate_eplan_routing_path_network(

@ -276,25 +276,10 @@ class AutoRoutingTaskPanel:
try:
result = self.controller.check_routing_path_network()
diagnostic = result.get("diagnostic", {}) if isinstance(result.get("diagnostic", {}), dict) else {}
issues = diagnostic.get("issues", []) or []
summary = diagnostic.get("summary", {}) if isinstance(diagnostic.get("summary", {}), dict) else {}
if not issues:
self._set_status(
"布线路径网络检查通过:{0} 条 carrier / {1} 段 / {2} 个节点。{3}".format(
summary.get("carriers", 0),
summary.get("segments", 0),
summary.get("nodes", 0),
self.controller.summary(),
)
)
return
first_issue = issues[0]
self._set_status(
"布线路径网络检查发现 {0} 类问题:{1} ({2})。{3}".format(
len(issues),
first_issue.get("code", ""),
first_issue.get("count", 0),
self.controller.summary(),
"{0}{1}".format(
AutoRouting.format_routing_path_network_report(diagnostic),
"\n" + self.controller.summary(),
)
)
except Exception as exc:

@ -765,6 +765,26 @@ class AutoRoutingTest(unittest.TestCase):
self.assertEqual("RoutingPathNetwork", diagnostic_group.Group[0].QetDiagnosticKind)
self.assertEqual(1, len(payload["unconnected_terminals"]))
self.assertEqual("terminal-far", payload["unconnected_terminals"][0]["terminal_uuid"])
message = auto_routing.format_routing_path_network_report(result["diagnostic"])
self.assertIn("端子未接入", message)
self.assertIn("terminal-far", message)
self.assertIn("4900.0 mm", message)
self.assertIn("补一段线槽/辅助路径", message)
def test_format_routing_path_network_report_tolerates_malformed_samples(self):
_install_fake_freecad()
_terminal_objects, _wiring_objects, _routing_network, auto_routing = _reload_modules()
diagnostic = {
"issues": [{"code": "external_issue", "count": 1}],
"unconnected_terminals": ["bad-terminal-sample"],
"possible_breaks": ["bad-break-sample"],
"isolated_components": ["bad-component-sample"],
}
message = auto_routing.format_routing_path_network_report(diagnostic)
self.assertIn("布线路径网络检查发现", message)
self.assertIn("首个问题external_issue", message)
def test_generate_routing_path_network_skips_far_terminal_access_to_protect_view_bbox(self):
_install_fake_freecad()

Loading…
Cancel
Save