From 57fd53dec101c4fef49de813059d2bd4aa174e62 Mon Sep 17 00:00:00 2001 From: Zhaowenlong Date: Mon, 1 Jun 2026 11:39:32 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=90=8C=E6=AD=A5=E6=94=AF=E6=92=91?= =?UTF-8?q?=E9=9D=A2=E5=B8=83=E7=BA=BF=E7=BD=91=E6=A0=BC=E6=95=B0=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Mod/FreeCADExchange/RoutingNetwork.py | 24 +++++- .../freecad_exchange_auto_routing_test.py | 76 +++++++++++++++++++ 2 files changed, 99 insertions(+), 1 deletion(-) diff --git a/src/Mod/FreeCADExchange/RoutingNetwork.py b/src/Mod/FreeCADExchange/RoutingNetwork.py index d38ef67..832da9f 100644 --- a/src/Mod/FreeCADExchange/RoutingNetwork.py +++ b/src/Mod/FreeCADExchange/RoutingNetwork.py @@ -1831,8 +1831,30 @@ def create_surface_carriers_from_document( kind=ROUTE_CARRIER_KIND_ROUTING_RANGE, ): updated.append(carrier) + source_created = [] + label = getattr(source, "Label", "") or getattr(source, "Name", "") or "Support Surface" + for index, points in enumerate(grids[len(live_carriers):], start=len(live_carriers) + 1): + if len(points) < 2: + continue + carrier = create_route_carrier( + doc, + points, + label="QET Auto Support Surface Route {0} {1}".format(label, index), + project_uuid=project_uuid, + kind=ROUTE_CARRIER_KIND_ROUTING_RANGE, + ) + source_created.append(carrier) + created.append(carrier) + for stale_carrier in live_carriers[len(grids):]: + _detach_from_groups(doc, stale_carrier) + try: + if doc.getObject(getattr(stale_carrier, "Name", "")) is not None: + doc.removeObject(stale_carrier.Name) + except Exception: + pass + current_carriers = updated + source_created if updated: - _mark_support_surface_source(source, updated) + _mark_support_surface_source(source, current_carriers) try: doc.recompute() except Exception: diff --git a/tests/python/freecad_exchange_auto_routing_test.py b/tests/python/freecad_exchange_auto_routing_test.py index 927880a..2960a64 100644 --- a/tests/python/freecad_exchange_auto_routing_test.py +++ b/tests/python/freecad_exchange_auto_routing_test.py @@ -889,6 +889,82 @@ class AutoRoutingTest(unittest.TestCase): self.assertEqual(20.0, min(x_values)) self.assertEqual(140.0, max(x_values)) + def test_auto_detect_support_surface_adds_missing_routing_range_lanes_after_resize(self): + _install_fake_freecad() + terminal_objects, _wiring_objects, routing_network, _auto_routing = _reload_modules() + doc = FakeDocument() + terminal_objects.ensure_root_group(doc, "project-1") + panel = doc.addObject("Part::Feature", "MountingPlateA") + panel.Label = "安装板A" + panel.Shape = FakeShape(FakeBoundBox(0, 120, 0, 5, 0, 100)) + + created = routing_network.create_surface_carriers_from_document( + doc, + project_uuid="project-1", + spacing=60.0, + offset=5.0, + margin=0.0, + ) + panel.Shape = FakeShape(FakeBoundBox(0, 180, 0, 5, 0, 120)) + created_again = routing_network.create_surface_carriers_from_document( + doc, + project_uuid="project-1", + spacing=60.0, + offset=5.0, + margin=0.0, + ) + carriers = [ + carrier + for carrier in routing_network.collect_route_carriers(doc) + if getattr(carrier, "QetRouteCarrierKind", "") == "RoutingRange" + ] + x_values = [point.x for carrier in carriers for point in carrier.Points] + z_values = [point.z for carrier in carriers for point in carrier.Points] + + self.assertEqual(6, len(created)) + self.assertEqual(1, len(created_again)) + self.assertEqual(7, len(carriers)) + self.assertEqual(180.0, max(x_values)) + self.assertEqual(120.0, max(z_values)) + + def test_auto_detect_support_surface_removes_stale_routing_range_lanes_after_resize(self): + _install_fake_freecad() + terminal_objects, _wiring_objects, routing_network, _auto_routing = _reload_modules() + doc = FakeDocument() + terminal_objects.ensure_root_group(doc, "project-1") + panel = doc.addObject("Part::Feature", "MountingPlateA") + panel.Label = "安装板A" + panel.Shape = FakeShape(FakeBoundBox(0, 120, 0, 5, 0, 100)) + + created = routing_network.create_surface_carriers_from_document( + doc, + project_uuid="project-1", + spacing=60.0, + offset=5.0, + margin=0.0, + ) + panel.Shape = FakeShape(FakeBoundBox(0, 60, 0, 5, 0, 60)) + created_again = routing_network.create_surface_carriers_from_document( + doc, + project_uuid="project-1", + spacing=60.0, + offset=5.0, + margin=0.0, + ) + carriers = [ + carrier + for carrier in routing_network.collect_route_carriers(doc) + if getattr(carrier, "QetRouteCarrierKind", "") == "RoutingRange" + ] + x_values = [point.x for carrier in carriers for point in carrier.Points] + z_values = [point.z for carrier in carriers for point in carrier.Points] + + self.assertEqual(6, len(created)) + self.assertEqual(0, len(created_again)) + self.assertEqual(4, len(carriers)) + self.assertEqual(60.0, max(x_values)) + self.assertEqual(60.0, max(z_values)) + def test_eplan_connection_route_can_use_auto_detected_support_surface(self): _install_fake_freecad() terminal_objects, _wiring_objects, routing_network, auto_routing = _reload_modules()