From f74e55b7821a330849a29b99fbe1eac58d81576b Mon Sep 17 00:00:00 2001 From: Zhaowenlong Date: Sat, 30 May 2026 16:34:48 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=BC=BAFreeCAD=E5=B8=83?= =?UTF-8?q?=E7=BA=BF=E8=B7=AF=E5=BE=84=E7=BD=91=E7=BB=9C=E6=A3=80=E6=9F=A5?= =?UTF-8?q?=E6=8A=A5=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Mod/FreeCADExchange/AutoRouting.py | 70 +++++++++++++++++++ src/Mod/FreeCADExchange/AutoRoutingPanel.py | 21 +----- .../freecad_exchange_auto_routing_test.py | 20 ++++++ 3 files changed, 93 insertions(+), 18 deletions(-) diff --git a/src/Mod/FreeCADExchange/AutoRouting.py b/src/Mod/FreeCADExchange/AutoRouting.py index 9d23d76..bbc1eed 100644 --- a/src/Mod/FreeCADExchange/AutoRouting.py +++ b/src/Mod/FreeCADExchange/AutoRouting.py @@ -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( diff --git a/src/Mod/FreeCADExchange/AutoRoutingPanel.py b/src/Mod/FreeCADExchange/AutoRoutingPanel.py index fb969cc..e5e3906 100644 --- a/src/Mod/FreeCADExchange/AutoRoutingPanel.py +++ b/src/Mod/FreeCADExchange/AutoRoutingPanel.py @@ -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: diff --git a/tests/python/freecad_exchange_auto_routing_test.py b/tests/python/freecad_exchange_auto_routing_test.py index 82baa0a..c4ae723 100644 --- a/tests/python/freecad_exchange_auto_routing_test.py +++ b/tests/python/freecad_exchange_auto_routing_test.py @@ -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()