From 97eb31adfd9dde4f1ecfa364d7408b09d17bfafd Mon Sep 17 00:00:00 2001 From: PyAnsys CI Bot <92810346+pyansys-ci-bot@users.noreply.github.com> Date: Mon, 17 Feb 2025 15:31:37 +0100 Subject: [PATCH 1/6] chore: update CHANGELOG for v0.9.0 (#1753) --- doc/changelog.d/1258.test.md | 1 - doc/changelog.d/1706.maintenance.md | 1 - doc/changelog.d/1707.added.md | 1 - doc/changelog.d/1708.added.md | 1 - doc/changelog.d/1709.dependencies.md | 1 - doc/changelog.d/1711.fixed.md | 1 - doc/changelog.d/1712.added.md | 1 - doc/changelog.d/1713.test.md | 1 - doc/changelog.d/1714.fixed.md | 1 - doc/changelog.d/1715.fixed.md | 1 - doc/changelog.d/1716.added.md | 1 - doc/changelog.d/1717.maintenance.md | 1 - doc/changelog.d/1719.dependencies.md | 1 - doc/changelog.d/1720.dependencies.md | 1 - doc/changelog.d/1722.maintenance.md | 1 - doc/changelog.d/1723.added.md | 1 - doc/changelog.d/1725.fixed.md | 1 - doc/changelog.d/1726.dependencies.md | 1 - doc/changelog.d/1727.test.md | 1 - doc/changelog.d/1728.dependencies.md | 1 - doc/changelog.d/1729.dependencies.md | 1 - doc/changelog.d/1730.documentation.md | 1 - doc/changelog.d/1732.added.md | 1 - doc/changelog.d/1736.dependencies.md | 1 - doc/changelog.d/1737.maintenance.md | 1 - doc/changelog.d/1739.maintenance.md | 1 - doc/changelog.d/1740.added.md | 1 - doc/changelog.d/1741.added.md | 1 - doc/changelog.d/1742.dependencies.md | 1 - doc/changelog.d/1743.dependencies.md | 1 - doc/changelog.d/1744.dependencies.md | 1 - doc/changelog.d/1745.test.md | 1 - doc/changelog.d/1746.dependencies.md | 1 - doc/changelog.d/1747.dependencies.md | 1 - doc/changelog.d/1749.dependencies.md | 1 - doc/changelog.d/1750.maintenance.md | 1 - doc/changelog.d/1753.maintenance.md | 1 + doc/source/changelog.rst | 67 +++++++++++++++++++++++++++ 38 files changed, 68 insertions(+), 36 deletions(-) delete mode 100644 doc/changelog.d/1258.test.md delete mode 100644 doc/changelog.d/1706.maintenance.md delete mode 100644 doc/changelog.d/1707.added.md delete mode 100644 doc/changelog.d/1708.added.md delete mode 100644 doc/changelog.d/1709.dependencies.md delete mode 100644 doc/changelog.d/1711.fixed.md delete mode 100644 doc/changelog.d/1712.added.md delete mode 100644 doc/changelog.d/1713.test.md delete mode 100644 doc/changelog.d/1714.fixed.md delete mode 100644 doc/changelog.d/1715.fixed.md delete mode 100644 doc/changelog.d/1716.added.md delete mode 100644 doc/changelog.d/1717.maintenance.md delete mode 100644 doc/changelog.d/1719.dependencies.md delete mode 100644 doc/changelog.d/1720.dependencies.md delete mode 100644 doc/changelog.d/1722.maintenance.md delete mode 100644 doc/changelog.d/1723.added.md delete mode 100644 doc/changelog.d/1725.fixed.md delete mode 100644 doc/changelog.d/1726.dependencies.md delete mode 100644 doc/changelog.d/1727.test.md delete mode 100644 doc/changelog.d/1728.dependencies.md delete mode 100644 doc/changelog.d/1729.dependencies.md delete mode 100644 doc/changelog.d/1730.documentation.md delete mode 100644 doc/changelog.d/1732.added.md delete mode 100644 doc/changelog.d/1736.dependencies.md delete mode 100644 doc/changelog.d/1737.maintenance.md delete mode 100644 doc/changelog.d/1739.maintenance.md delete mode 100644 doc/changelog.d/1740.added.md delete mode 100644 doc/changelog.d/1741.added.md delete mode 100644 doc/changelog.d/1742.dependencies.md delete mode 100644 doc/changelog.d/1743.dependencies.md delete mode 100644 doc/changelog.d/1744.dependencies.md delete mode 100644 doc/changelog.d/1745.test.md delete mode 100644 doc/changelog.d/1746.dependencies.md delete mode 100644 doc/changelog.d/1747.dependencies.md delete mode 100644 doc/changelog.d/1749.dependencies.md delete mode 100644 doc/changelog.d/1750.maintenance.md create mode 100644 doc/changelog.d/1753.maintenance.md diff --git a/doc/changelog.d/1258.test.md b/doc/changelog.d/1258.test.md deleted file mode 100644 index 7cde69eb55..0000000000 --- a/doc/changelog.d/1258.test.md +++ /dev/null @@ -1 +0,0 @@ -verifying issue with empty intersect and temporal body creation \ No newline at end of file diff --git a/doc/changelog.d/1706.maintenance.md b/doc/changelog.d/1706.maintenance.md deleted file mode 100644 index 6f4c1c0089..0000000000 --- a/doc/changelog.d/1706.maintenance.md +++ /dev/null @@ -1 +0,0 @@ -update CHANGELOG for v0.8.2 \ No newline at end of file diff --git a/doc/changelog.d/1707.added.md b/doc/changelog.d/1707.added.md deleted file mode 100644 index 2602f1720f..0000000000 --- a/doc/changelog.d/1707.added.md +++ /dev/null @@ -1 +0,0 @@ -design activation changes \ No newline at end of file diff --git a/doc/changelog.d/1708.added.md b/doc/changelog.d/1708.added.md deleted file mode 100644 index 52cde5ead5..0000000000 --- a/doc/changelog.d/1708.added.md +++ /dev/null @@ -1 +0,0 @@ -add contributors \ No newline at end of file diff --git a/doc/changelog.d/1709.dependencies.md b/doc/changelog.d/1709.dependencies.md deleted file mode 100644 index 3c05c97bf8..0000000000 --- a/doc/changelog.d/1709.dependencies.md +++ /dev/null @@ -1 +0,0 @@ -bump ansys-api-geometry from 0.4.33 to 0.4.34 \ No newline at end of file diff --git a/doc/changelog.d/1711.fixed.md b/doc/changelog.d/1711.fixed.md deleted file mode 100644 index 277af98686..0000000000 --- a/doc/changelog.d/1711.fixed.md +++ /dev/null @@ -1 +0,0 @@ -re enable fmd tests \ No newline at end of file diff --git a/doc/changelog.d/1712.added.md b/doc/changelog.d/1712.added.md deleted file mode 100644 index 0d2f01063a..0000000000 --- a/doc/changelog.d/1712.added.md +++ /dev/null @@ -1 +0,0 @@ -Implementation of inspect & repair geometry \ No newline at end of file diff --git a/doc/changelog.d/1713.test.md b/doc/changelog.d/1713.test.md deleted file mode 100644 index 4c10d27211..0000000000 --- a/doc/changelog.d/1713.test.md +++ /dev/null @@ -1 +0,0 @@ -Expand pattern tests \ No newline at end of file diff --git a/doc/changelog.d/1714.fixed.md b/doc/changelog.d/1714.fixed.md deleted file mode 100644 index e58c41f4d9..0000000000 --- a/doc/changelog.d/1714.fixed.md +++ /dev/null @@ -1 +0,0 @@ -support body mirror on linux \ No newline at end of file diff --git a/doc/changelog.d/1715.fixed.md b/doc/changelog.d/1715.fixed.md deleted file mode 100644 index 9af9372ee1..0000000000 --- a/doc/changelog.d/1715.fixed.md +++ /dev/null @@ -1 +0,0 @@ -use sketch plane for imprint/project curves \ No newline at end of file diff --git a/doc/changelog.d/1716.added.md b/doc/changelog.d/1716.added.md deleted file mode 100644 index e90bde071a..0000000000 --- a/doc/changelog.d/1716.added.md +++ /dev/null @@ -1 +0,0 @@ -launch core service from envar \ No newline at end of file diff --git a/doc/changelog.d/1717.maintenance.md b/doc/changelog.d/1717.maintenance.md deleted file mode 100644 index c655a0905a..0000000000 --- a/doc/changelog.d/1717.maintenance.md +++ /dev/null @@ -1 +0,0 @@ -pre-commit automatic update \ No newline at end of file diff --git a/doc/changelog.d/1719.dependencies.md b/doc/changelog.d/1719.dependencies.md deleted file mode 100644 index 883bfafc7c..0000000000 --- a/doc/changelog.d/1719.dependencies.md +++ /dev/null @@ -1 +0,0 @@ -bump ansys-sphinx-theme[autoapi] from 1.2.6 to 1.2.7 in the docs-deps group \ No newline at end of file diff --git a/doc/changelog.d/1720.dependencies.md b/doc/changelog.d/1720.dependencies.md deleted file mode 100644 index 0f3ca21a1e..0000000000 --- a/doc/changelog.d/1720.dependencies.md +++ /dev/null @@ -1 +0,0 @@ -bump ansys-api-geometry from 0.4.34 to 0.4.35 \ No newline at end of file diff --git a/doc/changelog.d/1722.maintenance.md b/doc/changelog.d/1722.maintenance.md deleted file mode 100644 index 61a75a0ef5..0000000000 --- a/doc/changelog.d/1722.maintenance.md +++ /dev/null @@ -1 +0,0 @@ -update SECURITY.md versions supported \ No newline at end of file diff --git a/doc/changelog.d/1723.added.md b/doc/changelog.d/1723.added.md deleted file mode 100644 index 27a925f003..0000000000 --- a/doc/changelog.d/1723.added.md +++ /dev/null @@ -1 +0,0 @@ -workflow enhancements for better tool results \ No newline at end of file diff --git a/doc/changelog.d/1725.fixed.md b/doc/changelog.d/1725.fixed.md deleted file mode 100644 index 5bec5d4ba9..0000000000 --- a/doc/changelog.d/1725.fixed.md +++ /dev/null @@ -1 +0,0 @@ -revert boolean ops logic and hold-off on commands-based implementation (temporarily) \ No newline at end of file diff --git a/doc/changelog.d/1726.dependencies.md b/doc/changelog.d/1726.dependencies.md deleted file mode 100644 index aae2364dc8..0000000000 --- a/doc/changelog.d/1726.dependencies.md +++ /dev/null @@ -1 +0,0 @@ -bump ansys-sphinx-theme[autoapi] from 1.2.7 to 1.3.0 in the docs-deps group \ No newline at end of file diff --git a/doc/changelog.d/1727.test.md b/doc/changelog.d/1727.test.md deleted file mode 100644 index d4caa81efc..0000000000 --- a/doc/changelog.d/1727.test.md +++ /dev/null @@ -1 +0,0 @@ -set body name \ No newline at end of file diff --git a/doc/changelog.d/1728.dependencies.md b/doc/changelog.d/1728.dependencies.md deleted file mode 100644 index 16cad54f2c..0000000000 --- a/doc/changelog.d/1728.dependencies.md +++ /dev/null @@ -1 +0,0 @@ -bump ansys-sphinx-theme[autoapi] from 1.3.0 to 1.3.1 in the docs-deps group \ No newline at end of file diff --git a/doc/changelog.d/1729.dependencies.md b/doc/changelog.d/1729.dependencies.md deleted file mode 100644 index 7cfa83a813..0000000000 --- a/doc/changelog.d/1729.dependencies.md +++ /dev/null @@ -1 +0,0 @@ -bump ansys-api-geometry from 0.4.35 to 0.4.36 \ No newline at end of file diff --git a/doc/changelog.d/1730.documentation.md b/doc/changelog.d/1730.documentation.md deleted file mode 100644 index deb88451eb..0000000000 --- a/doc/changelog.d/1730.documentation.md +++ /dev/null @@ -1 +0,0 @@ -update CONTRIBUTING.md \ No newline at end of file diff --git a/doc/changelog.d/1732.added.md b/doc/changelog.d/1732.added.md deleted file mode 100644 index 07b49458c3..0000000000 --- a/doc/changelog.d/1732.added.md +++ /dev/null @@ -1 +0,0 @@ -add face color, round info, bring measure tools to linux \ No newline at end of file diff --git a/doc/changelog.d/1736.dependencies.md b/doc/changelog.d/1736.dependencies.md deleted file mode 100644 index 5c12517a19..0000000000 --- a/doc/changelog.d/1736.dependencies.md +++ /dev/null @@ -1 +0,0 @@ -bump trame-vtk from 2.8.14 to 2.8.15 \ No newline at end of file diff --git a/doc/changelog.d/1737.maintenance.md b/doc/changelog.d/1737.maintenance.md deleted file mode 100644 index c655a0905a..0000000000 --- a/doc/changelog.d/1737.maintenance.md +++ /dev/null @@ -1 +0,0 @@ -pre-commit automatic update \ No newline at end of file diff --git a/doc/changelog.d/1739.maintenance.md b/doc/changelog.d/1739.maintenance.md deleted file mode 100644 index 9e32bd93f9..0000000000 --- a/doc/changelog.d/1739.maintenance.md +++ /dev/null @@ -1 +0,0 @@ -keep simba-plugin-geometry tag \ No newline at end of file diff --git a/doc/changelog.d/1740.added.md b/doc/changelog.d/1740.added.md deleted file mode 100644 index c7191a660d..0000000000 --- a/doc/changelog.d/1740.added.md +++ /dev/null @@ -1 +0,0 @@ -conservative approach to single design per modeler \ No newline at end of file diff --git a/doc/changelog.d/1741.added.md b/doc/changelog.d/1741.added.md deleted file mode 100644 index bdcedd10cd..0000000000 --- a/doc/changelog.d/1741.added.md +++ /dev/null @@ -1 +0,0 @@ -export glb \ No newline at end of file diff --git a/doc/changelog.d/1742.dependencies.md b/doc/changelog.d/1742.dependencies.md deleted file mode 100644 index 14c7ab84ee..0000000000 --- a/doc/changelog.d/1742.dependencies.md +++ /dev/null @@ -1 +0,0 @@ -bump jupytext from 1.16.6 to 1.16.7 in the docs-deps group \ No newline at end of file diff --git a/doc/changelog.d/1743.dependencies.md b/doc/changelog.d/1743.dependencies.md deleted file mode 100644 index d499e54ae5..0000000000 --- a/doc/changelog.d/1743.dependencies.md +++ /dev/null @@ -1 +0,0 @@ -bump ansys-api-geometry from 0.4.36 to 0.4.37 \ No newline at end of file diff --git a/doc/changelog.d/1744.dependencies.md b/doc/changelog.d/1744.dependencies.md deleted file mode 100644 index 184bfb5bf9..0000000000 --- a/doc/changelog.d/1744.dependencies.md +++ /dev/null @@ -1 +0,0 @@ -bump myst-parser from 4.0.0 to 4.0.1 in the docs-deps group \ No newline at end of file diff --git a/doc/changelog.d/1745.test.md b/doc/changelog.d/1745.test.md deleted file mode 100644 index 5a737e92ac..0000000000 --- a/doc/changelog.d/1745.test.md +++ /dev/null @@ -1 +0,0 @@ -activate 8 linux tests \ No newline at end of file diff --git a/doc/changelog.d/1746.dependencies.md b/doc/changelog.d/1746.dependencies.md deleted file mode 100644 index d9c564d265..0000000000 --- a/doc/changelog.d/1746.dependencies.md +++ /dev/null @@ -1 +0,0 @@ -bump ansys-api-geometry from 0.4.37 to 0.4.38 \ No newline at end of file diff --git a/doc/changelog.d/1747.dependencies.md b/doc/changelog.d/1747.dependencies.md deleted file mode 100644 index 186365ae6f..0000000000 --- a/doc/changelog.d/1747.dependencies.md +++ /dev/null @@ -1 +0,0 @@ -bump numpy from 2.2.2 to 2.2.3 \ No newline at end of file diff --git a/doc/changelog.d/1749.dependencies.md b/doc/changelog.d/1749.dependencies.md deleted file mode 100644 index daaa01a760..0000000000 --- a/doc/changelog.d/1749.dependencies.md +++ /dev/null @@ -1 +0,0 @@ -bump panel from 1.6.0 to 1.6.1 \ No newline at end of file diff --git a/doc/changelog.d/1750.maintenance.md b/doc/changelog.d/1750.maintenance.md deleted file mode 100644 index ed0a9ae502..0000000000 --- a/doc/changelog.d/1750.maintenance.md +++ /dev/null @@ -1 +0,0 @@ -enhancements to GLB export and object ``plot()`` methods \ No newline at end of file diff --git a/doc/changelog.d/1753.maintenance.md b/doc/changelog.d/1753.maintenance.md new file mode 100644 index 0000000000..97e5671828 --- /dev/null +++ b/doc/changelog.d/1753.maintenance.md @@ -0,0 +1 @@ +update CHANGELOG for v0.9.0 \ No newline at end of file diff --git a/doc/source/changelog.rst b/doc/source/changelog.rst index 3583da64d4..cabf5ee6b2 100644 --- a/doc/source/changelog.rst +++ b/doc/source/changelog.rst @@ -9,6 +9,73 @@ This document contains the release notes for the PyAnsys Geometry project. .. towncrier release notes start +`0.9.0 `_ - 2025-02-17 +===================================================================================== + +Added +^^^^^ + +- design activation changes `#1707 `_ +- add contributors `#1708 `_ +- Implementation of inspect & repair geometry `#1712 `_ +- launch core service from envar `#1716 `_ +- workflow enhancements for better tool results `#1723 `_ +- add face color, round info, bring measure tools to linux `#1732 `_ +- conservative approach to single design per modeler `#1740 `_ +- export glb `#1741 `_ + + +Dependencies +^^^^^^^^^^^^ + +- bump ansys-api-geometry from 0.4.33 to 0.4.34 `#1709 `_ +- bump ansys-sphinx-theme[autoapi] from 1.2.6 to 1.2.7 in the docs-deps group `#1719 `_ +- bump ansys-api-geometry from 0.4.34 to 0.4.35 `#1720 `_ +- bump ansys-sphinx-theme[autoapi] from 1.2.7 to 1.3.0 in the docs-deps group `#1726 `_ +- bump ansys-sphinx-theme[autoapi] from 1.3.0 to 1.3.1 in the docs-deps group `#1728 `_ +- bump ansys-api-geometry from 0.4.35 to 0.4.36 `#1729 `_ +- bump trame-vtk from 2.8.14 to 2.8.15 `#1736 `_ +- bump jupytext from 1.16.6 to 1.16.7 in the docs-deps group `#1742 `_ +- bump ansys-api-geometry from 0.4.36 to 0.4.37 `#1743 `_ +- bump myst-parser from 4.0.0 to 4.0.1 in the docs-deps group `#1744 `_ +- bump ansys-api-geometry from 0.4.37 to 0.4.38 `#1746 `_ +- bump numpy from 2.2.2 to 2.2.3 `#1747 `_ +- bump panel from 1.6.0 to 1.6.1 `#1749 `_ + + +Documentation +^^^^^^^^^^^^^ + +- update CONTRIBUTING.md `#1730 `_ + + +Fixed +^^^^^ + +- re enable fmd tests `#1711 `_ +- support body mirror on linux `#1714 `_ +- use sketch plane for imprint/project curves `#1715 `_ +- revert boolean ops logic and hold-off on commands-based implementation (temporarily) `#1725 `_ + + +Maintenance +^^^^^^^^^^^ + +- update CHANGELOG for v0.8.2 `#1706 `_ +- pre-commit automatic update `#1717 `_, `#1737 `_ +- update SECURITY.md versions supported `#1722 `_ +- keep simba-plugin-geometry tag `#1739 `_ +- enhancements to GLB export and object ``plot()`` methods `#1750 `_ + + +Test +^^^^ + +- verifying issue with empty intersect and temporal body creation `#1258 `_ +- Expand pattern tests `#1713 `_ +- set body name `#1727 `_ +- activate 8 linux tests `#1745 `_ + `0.8.2 `_ - 2025-01-29 ===================================================================================== From 37d91fa9531034d2f8a2a17be1d73a7944587501 Mon Sep 17 00:00:00 2001 From: smereu Date: Tue, 25 Nov 2025 17:15:45 -0600 Subject: [PATCH 2/6] prepare_tools v1 implementation First draft of prepare_tools to v1 implementation --- .../core/_grpc/_services/v1/prepare_tools.py | 321 +++++++++++++++++- .../geometry/core/tools/prepare_tools.py | 39 ++- 2 files changed, 340 insertions(+), 20 deletions(-) diff --git a/src/ansys/geometry/core/_grpc/_services/v1/prepare_tools.py b/src/ansys/geometry/core/_grpc/_services/v1/prepare_tools.py index 3ad0170b45..92ab773cf4 100644 --- a/src/ansys/geometry/core/_grpc/_services/v1/prepare_tools.py +++ b/src/ansys/geometry/core/_grpc/_services/v1/prepare_tools.py @@ -25,7 +25,13 @@ from ansys.geometry.core.errors import protect_grpc +from ..base.conversions import from_measurement_to_server_length from ..base.prepare_tools import GRPCPrepareToolsService +from .conversions import ( + build_grpc_id, + from_enclosure_options_to_grpc_enclosure_options, + serialize_tracker_command_response, +) class GRPCPrepareToolsServiceV1(GRPCPrepareToolsService): # pragma: no cover @@ -43,54 +49,339 @@ class GRPCPrepareToolsServiceV1(GRPCPrepareToolsService): # pragma: no cover @protect_grpc def __init__(self, channel: grpc.Channel): # noqa: D102 - from ansys.api.geometry.v1.preparetools_pb2_grpc import PrepareToolsStub + from ansys.api.discovery.v1.operations.prepare_pb2_grpc import PrepareStub - self.stub = PrepareToolsStub(channel) + self.stub = PrepareStub(channel) @protect_grpc def extract_volume_from_faces(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.prepare_pb2 import ExtractVolumeFromFacesRequest + + # Create the request - assumes all inputs are valid and of the proper type + request = ExtractVolumeFromFacesRequest( + sealing_face_ids=[build_grpc_id(face) for face in kwargs["sealing_faces"]], + inside_face_ids=[build_grpc_id(face) for face in kwargs["inside_faces"]], + ) + + # Call the gRPC service + response = self.stub.ExtractVolumeFromFaces(request) + + # Return the response - formatted as a dictionary + return { + "success": response.command_response.success, + "created_bodies": [body.id for body in response.created_bodies], + "tracker_response": serialize_tracker_command_response(response.tracked_changes), + } @protect_grpc def extract_volume_from_edge_loops(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.prepare_pb2 import ExtractVolumeFromEdgeLoopsRequest + + # Create the request - assumes all inputs are valid and of the proper type + request = ExtractVolumeFromEdgeLoopsRequest( + sealing_edge_ids=[build_grpc_id(edge) for edge in kwargs["sealing_edges"]], + inside_face_ids=[build_grpc_id(face) for face in kwargs["inside_faces"]], + ) + + # Call the gRPC service + response = self.stub.ExtractVolumeFromEdgeLoops(request) + + # Return the response - formatted as a dictionary + return { + "success": response.command_response.success, + "created_bodies": [body.id for body in response.created_bodies], + "tracker_response": serialize_tracker_command_response(response.tracked_changes), + } @protect_grpc def remove_rounds(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.prepare_pb2 import RemoveRoundsRequest + from google.protobuf.wrappers_pb2 import BoolValue + + # Create the request - assumes all inputs are valid and of the proper type + request = RemoveRoundsRequest( + selection_ids=[build_grpc_id(round) for round in kwargs["rounds"]], + auto_shrink=BoolValue(value=kwargs["auto_shrink"]), + ) + + # Call the gRPC service + response = self.stub.RemoveRounds(request) + + # Return the response - formatted as a dictionary + return { + "success": response.command_response.success, + "tracker_response": serialize_tracker_command_response(response.tracked_changes), + } @protect_grpc def share_topology(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.prepare_pb2 import ShareTopologyRequest + from google.protobuf.wrappers_pb2 import BoolValue, DoubleValue + + # Create the request - assumes all inputs are valid and of the proper type + request = ShareTopologyRequest( + selection_ids=[build_grpc_id(body) for body in kwargs["bodies"]], + tolerance=DoubleValue(value=from_measurement_to_server_length(kwargs["tolerance"])), + preserve_instances=BoolValue(value=kwargs["preserve_instances"]), + ) + + # Call the gRPC service + response = self.stub.ShareTopology(request) + + # Return the response - formatted as a dictionary + return { + "success": response.command_response.success, + "tracker_response": serialize_tracker_command_response(response.tracked_changes), + } @protect_grpc def enhanced_share_topology(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.prepare_pb2 import ShareTopologyRequest + from google.protobuf.wrappers_pb2 import BoolValue, DoubleValue + + # Create the request - assumes all inputs are valid and of the proper type + request = ShareTopologyRequest( + selection_ids=[build_grpc_id(body) for body in kwargs["bodies"]], + tolerance=DoubleValue(value=from_measurement_to_server_length(kwargs["tolerance"])), + preserve_instances=BoolValue(value=kwargs["preserve_instances"]), + ) + + # Call the gRPC service + response = self.stub.EnhancedShareTopology(request) + + # Return the response - formatted as a dictionary + return { + "success": response.success, + "found": response.found, + "repaired": response.repaired, + "tracker_response": serialize_tracker_command_response(response.tracked_changes), + } @protect_grpc def find_logos(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.prepare_pb2 import FindLogoOptions, FindLogosRequest + + # Check height objects + min_height = ( + from_measurement_to_server_length(kwargs["min_height"]) + if kwargs["min_height"] is not None + else None + ) + max_height = ( + from_measurement_to_server_length(kwargs["max_height"]) + if kwargs["max_height"] is not None + else None + ) + + # Create the request - assumes all inputs are valid and of the proper type + request = FindLogosRequest( + body_ids=[build_grpc_id(body) for body in kwargs["bodies"]], + options=FindLogoOptions( + min_height=min_height, + max_height=max_height, + ), + ) + + # Call the gRPC service + response = self.stub.FindLogos(request) + + # Return the response - formatted as a dictionary + return { + "id": response.id, + "face_ids": [face.id for face in response.logo_faces], + } @protect_grpc def find_and_remove_logos(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.prepare_pb2 import FindLogoOptions, FindLogosRequest + + # Check height objects + min_height = ( + from_measurement_to_server_length(kwargs["min_height"]) + if kwargs["min_height"] is not None + else None + ) + max_height = ( + from_measurement_to_server_length(kwargs["max_height"]) + if kwargs["max_height"] is not None + else None + ) + + # Create the request - assumes all inputs are valid and of the proper type + request = FindLogosRequest( + body_ids=[build_grpc_id(body) for body in kwargs["bodies"]], + options=FindLogoOptions( + min_height=min_height, + max_height=max_height, + ), + ) + + # Call the gRPC service + response = self.stub.FindAndRemoveLogos(request) + + # Return the response - formatted as a dictionary + return { + "success": response.command_response.success, + "tracker_response": serialize_tracker_command_response(response.tracked_changes), + } @protect_grpc - def remove_logo(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + def remove_logo(self, **kwargs): # noqa: D102 + from ansys.api.discovery.v1.operations.prepare_pb2 import RemoveLogoRequest + + # Create the request - assumes all inputs are valid and of the proper type + request = RemoveLogoRequest( + face_ids=[build_grpc_id(id) for id in kwargs["face_ids"]], + ) + + # Call the gRPC service + response = self.stub.RemoveLogo(request) + + # Return the response - formatted as a dictionary + return { + "success": response.command_response.success, + "tracker_response": serialize_tracker_command_response(response.tracked_changes), + } @protect_grpc def detect_helixes(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.prepare_pb2 import ( + FindHelixesOptions, + ) + + from ansys.geometry.core.shapes.parameterization import Interval + + from ..base.conversions import ( + from_measurement_to_server_length, + to_distance, + ) + from .conversions import ( + from_grpc_curve_to_curve, + from_grpc_point_to_point3d, + ) + + # Create the request - assumes all inputs are valid and of the proper type + request = FindHelixesOptions( + body_ids=[build_grpc_id(body) for body in kwargs["bodies"]], + options=FindHelixesOptions( + min_radius=from_measurement_to_server_length(kwargs["min_radius"]), + max_radius=from_measurement_to_server_length(kwargs["max_radius"]), + fit_radius_error=from_measurement_to_server_length(kwargs["fit_radius_error"]), + ), + ) + + # Call the gRPC service + response = self.stub.FindHelixes(request) + + # If no helixes, return empty dictionary + if len(response.helixes) == 0: + return {"helixes": []} + + # Return the response - formatted as a dictionary + return { + "helixes": [ + { + "trimmed_curve": { + "geometry": from_grpc_curve_to_curve(helix.trimmed_curve.curve), + "start": from_grpc_point_to_point3d(helix.trimmed_curve.start), + "end": from_grpc_point_to_point3d(helix.trimmed_curve.end), + "interval": Interval( + helix.trimmed_curve.interval_start, helix.trimmed_curve.interval_end + ), + "length": to_distance(helix.trimmed_curve.length).value, + }, + "edges": [ + { + "id": edge.id, + "parent_id": edge.parent.id, + "curve_type": edge.curve_type, + "is_reversed": edge.is_reversed, + } + for edge in helix.edges + ], + } + for helix in response.helixes + ] + } @protect_grpc def create_box_enclosure(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.prepare_pb2 import CreateEnclosureBoxRequest + + grpc_enclosure_options = from_enclosure_options_to_grpc_enclosure_options( + kwargs["enclosure_options"] + ) + + # Create the request - assumes all inputs are valid and of the proper type + request = CreateEnclosureBoxRequest( + body_ids=[build_grpc_id(body.id) for body in kwargs["bodies"]], + x_low=from_measurement_to_server_length(kwargs["x_low"]), + x_high=from_measurement_to_server_length(kwargs["x_high"]), + y_low=from_measurement_to_server_length(kwargs["y_low"]), + y_high=from_measurement_to_server_length(kwargs["y_high"]), + z_low=from_measurement_to_server_length(kwargs["z_low"]), + z_high=from_measurement_to_server_length(kwargs["z_high"]), + enclosure_options=grpc_enclosure_options, + ) + + # Call the gRPC service + response = self.stub.CreateEnclosureBox(request) + + # Return the response - formatted as a dictionary + return { + "success": response.command_response.success, + "created_bodies": [body.id for body in response.created_bodies], + "tracker_response": serialize_tracker_command_response(response.tracked_changes), + } @protect_grpc def create_cylinder_enclosure(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.prepare_pb2 import CreateEnclosureCylinderRequest + + grpc_enclosure_options = from_enclosure_options_to_grpc_enclosure_options( + kwargs["enclosure_options"] + ) + + # Create the request - assumes all inputs are valid and of the proper type + request = CreateEnclosureCylinderRequest( + body_ids=[build_grpc_id(body.id) for body in kwargs["bodies"]], + axial_distance_low=from_measurement_to_server_length(kwargs["axial_distance_low"]), + axial_distance_high=from_measurement_to_server_length(kwargs["axial_distance_high"]), + radial_distance=from_measurement_to_server_length(kwargs["radial_distance"]), + enclosure_options=grpc_enclosure_options, + ) + + # Call the gRPC service + response = self.stub.CreateEnclosureCylinder(request) + + # Return the response - formatted as a dictionary + return { + "success": response.command_response.success, + "created_bodies": [body.id for body in response.created_bodies], + "tracker_response": serialize_tracker_command_response(response.tracked_changes), + } @protect_grpc def create_sphere_enclosure(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.prepare_pb2 import CreateEnclosureSphereRequest + + grpc_enclosure_options = from_enclosure_options_to_grpc_enclosure_options( + kwargs["enclosure_options"] + ) + + # Create the request - assumes all inputs are valid and of the proper type + request = CreateEnclosureSphereRequest( + body_ids=[build_grpc_id(body.id) for body in kwargs["bodies"]], + radial_distance=from_measurement_to_server_length(kwargs["radial_distance"]), + enclosure_options=grpc_enclosure_options, + ) + + # Call the gRPC service + response = self.stub.CreateEnclosureSphere(request) + + # Return the response - formatted as a dictionary + return { + "success": response.command_response.success, + "created_bodies": [body.id for body in response.created_bodies], + "tracker_response": serialize_tracker_command_response(response.tracked_changes), + } diff --git a/src/ansys/geometry/core/tools/prepare_tools.py b/src/ansys/geometry/core/tools/prepare_tools.py index 2b712205e1..1f708ab6fb 100644 --- a/src/ansys/geometry/core/tools/prepare_tools.py +++ b/src/ansys/geometry/core/tools/prepare_tools.py @@ -154,7 +154,10 @@ def extract_volume_from_faces( if response.get("success"): bodies_ids = response.get("created_bodies") if len(bodies_ids) > 0: - parent_design._update_design_inplace() + if not pyansys_geom.USE_TRACKER_TO_UPDATE_DESIGN: + parent_design._update_design_inplace() + else: + parent_design._update_from_tracker(response.get("tracker_response")) return get_bodies_from_ids(parent_design, bodies_ids) else: self._grpc_client.log.info("Failed to extract volume from faces...") @@ -209,7 +212,10 @@ def extract_volume_from_edge_loops( if response.get("success"): bodies_ids = response.get("created_bodies") if len(bodies_ids) > 0: - parent_design._update_design_inplace() + if not pyansys_geom.USE_TRACKER_TO_UPDATE_DESIGN: + parent_design._update_design_inplace() + else: + parent_design._update_from_tracker(response.get("tracker_response")) return get_bodies_from_ids(parent_design, bodies_ids) else: self._grpc_client.log.info("Failed to extract volume from edge loops...") @@ -249,7 +255,10 @@ def remove_rounds(self, faces: list["Face"], auto_shrink: bool = False) -> bool: ) if response.get("success"): - parent_design._update_design_inplace() + if not pyansys_geom.USE_TRACKER_TO_UPDATE_DESIGN: + parent_design._update_design_inplace() + else: + parent_design._update_from_tracker(response.get("tracker_response")) else: self._grpc_client.log.info("Failed to remove rounds...") @@ -297,6 +306,12 @@ def share_topology( preserve_instances=preserve_instances, ) + parent_design = get_design_from_body(bodies[0]) + if not pyansys_geom.USE_TRACKER_TO_UPDATE_DESIGN: + parent_design._update_design_inplace() + else: + parent_design._update_from_tracker(response.get("tracker_response")) + return response.get("success") @min_backend_version(25, 2, 0) @@ -343,15 +358,23 @@ def enhanced_share_topology( preserve_instances=preserve_instances, ) + parent_design = get_design_from_body(bodies[0]) + tracker_response = response.get("tracker_response") + if not pyansys_geom.USE_TRACKER_TO_UPDATE_DESIGN: + parent_design._update_design_inplace() + else: + parent_design._update_from_tracker(tracker_response) + message = RepairToolMessage( success=response.get("success"), - created_bodies=response.get("created_bodies_monikers"), - modified_bodies=response.get("modified_bodies_monikers"), found=response.get("found"), repaired=response.get("repaired"), + created_bodies=[created_body.id for created_body in tracker_response.get("created_bodies")] + modified_bodies=[modified_body.id for modified_body in tracker_response.get("modified_bodies")] ) return message + @check_input_types @min_backend_version(25, 2, 0) def find_logos( @@ -472,6 +495,12 @@ def find_and_remove_logos( max_height=max_height, ) + parent_design = get_design_from_body(bodies[0]) + if not pyansys_geom.USE_TRACKER_TO_UPDATE_DESIGN: + parent_design._update_design_inplace() + else: + parent_design._update_from_tracker(response.get("tracker_response")) + return response.get("success") @min_backend_version(26, 1, 0) From c81fdae452ffdd187a2368dcfb3b7b0670068769 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 25 Nov 2025 23:19:07 +0000 Subject: [PATCH 3/6] chore: auto fixes from pre-commit hooks --- src/ansys/geometry/core/tools/prepare_tools.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ansys/geometry/core/tools/prepare_tools.py b/src/ansys/geometry/core/tools/prepare_tools.py index 1f708ab6fb..e3e839d542 100644 --- a/src/ansys/geometry/core/tools/prepare_tools.py +++ b/src/ansys/geometry/core/tools/prepare_tools.py @@ -359,7 +359,7 @@ def enhanced_share_topology( ) parent_design = get_design_from_body(bodies[0]) - tracker_response = response.get("tracker_response") + tracker_response = response.get("tracker_response") if not pyansys_geom.USE_TRACKER_TO_UPDATE_DESIGN: parent_design._update_design_inplace() else: From c076097de971cc23237fb79c2ed8f1c91de8ecc9 Mon Sep 17 00:00:00 2001 From: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> Date: Tue, 25 Nov 2025 23:20:13 +0000 Subject: [PATCH 4/6] chore: adding changelog file 2417.maintenance.md [dependabot-skip] --- doc/changelog.d/2417.maintenance.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/changelog.d/2417.maintenance.md diff --git a/doc/changelog.d/2417.maintenance.md b/doc/changelog.d/2417.maintenance.md new file mode 100644 index 0000000000..a9be41aff4 --- /dev/null +++ b/doc/changelog.d/2417.maintenance.md @@ -0,0 +1 @@ +Prepare tools to v1 From 2dfec801106b3a19cd1fe91e17fb67f65470976d Mon Sep 17 00:00:00 2001 From: smereu Date: Tue, 25 Nov 2025 22:58:41 -0600 Subject: [PATCH 5/6] clean-up of response clean-up of response to use a common method. Restore compatibility with previous version --- .../core/_grpc/_services/v1/conversions.py | 39 ++++++++++++ .../core/_grpc/_services/v1/prepare_tools.py | 60 ++++++------------- .../geometry/core/tools/prepare_tools.py | 14 +---- 3 files changed, 61 insertions(+), 52 deletions(-) diff --git a/src/ansys/geometry/core/_grpc/_services/v1/conversions.py b/src/ansys/geometry/core/_grpc/_services/v1/conversions.py index fa81a6c545..74ce3d903a 100644 --- a/src/ansys/geometry/core/_grpc/_services/v1/conversions.py +++ b/src/ansys/geometry/core/_grpc/_services/v1/conversions.py @@ -1401,3 +1401,42 @@ def serialize_entity_identifier(entity): for entity in getattr(response, "deleted_bodies", []) ], } + + +def get_standard_tracker_response(response) -> dict: + """Get a standard dictionary response from a TrackerCommandResponse gRPC object. + + Parameters + ---------- + response : TrackerCommandResponse + The gRPC TrackerCommandResponse object. + + Returns + ------- + dict + A dictionary representing the standard tracker response + """ + return { + "success": response.command_response.success, + "tracker_response": serialize_tracker_command_response(response.tracked_changes), + } + + +def get_tracker_response_with_created_bodies(response) -> dict: + """Get a dictionary response from a TrackerCommandResponse gRPC object including created bodies. + + Parameters + ---------- + response : TrackerCommandResponse + The gRPC TrackerCommandResponse object. + + Returns + ------- + dict + A dictionary representing the tracker response with created bodies. + """ + serialized_response = get_standard_tracker_response(response) + serialized_response["created_bodies"] = serialized_response["tracker_response"].get( + "created_bodies", [] + ) + return serialized_response diff --git a/src/ansys/geometry/core/_grpc/_services/v1/prepare_tools.py b/src/ansys/geometry/core/_grpc/_services/v1/prepare_tools.py index 92ab773cf4..5d22caf230 100644 --- a/src/ansys/geometry/core/_grpc/_services/v1/prepare_tools.py +++ b/src/ansys/geometry/core/_grpc/_services/v1/prepare_tools.py @@ -30,6 +30,8 @@ from .conversions import ( build_grpc_id, from_enclosure_options_to_grpc_enclosure_options, + get_standard_tracker_response, + get_tracker_response_with_created_bodies, serialize_tracker_command_response, ) @@ -67,11 +69,7 @@ def extract_volume_from_faces(self, **kwargs) -> dict: # noqa: D102 response = self.stub.ExtractVolumeFromFaces(request) # Return the response - formatted as a dictionary - return { - "success": response.command_response.success, - "created_bodies": [body.id for body in response.created_bodies], - "tracker_response": serialize_tracker_command_response(response.tracked_changes), - } + return get_tracker_response_with_created_bodies(response) @protect_grpc def extract_volume_from_edge_loops(self, **kwargs) -> dict: # noqa: D102 @@ -87,11 +85,7 @@ def extract_volume_from_edge_loops(self, **kwargs) -> dict: # noqa: D102 response = self.stub.ExtractVolumeFromEdgeLoops(request) # Return the response - formatted as a dictionary - return { - "success": response.command_response.success, - "created_bodies": [body.id for body in response.created_bodies], - "tracker_response": serialize_tracker_command_response(response.tracked_changes), - } + return get_tracker_response_with_created_bodies(response) @protect_grpc def remove_rounds(self, **kwargs) -> dict: # noqa: D102 @@ -108,10 +102,7 @@ def remove_rounds(self, **kwargs) -> dict: # noqa: D102 response = self.stub.RemoveRounds(request) # Return the response - formatted as a dictionary - return { - "success": response.command_response.success, - "tracker_response": serialize_tracker_command_response(response.tracked_changes), - } + return get_standard_tracker_response(response) @protect_grpc def share_topology(self, **kwargs) -> dict: # noqa: D102 @@ -129,10 +120,7 @@ def share_topology(self, **kwargs) -> dict: # noqa: D102 response = self.stub.ShareTopology(request) # Return the response - formatted as a dictionary - return { - "success": response.command_response.success, - "tracker_response": serialize_tracker_command_response(response.tracked_changes), - } + return get_standard_tracker_response(response) @protect_grpc def enhanced_share_topology(self, **kwargs) -> dict: # noqa: D102 @@ -155,6 +143,14 @@ def enhanced_share_topology(self, **kwargs) -> dict: # noqa: D102 "found": response.found, "repaired": response.repaired, "tracker_response": serialize_tracker_command_response(response.tracked_changes), + "created_bodies_monikers": [ + created_body.id + for created_body in response.tracked_changes.get("created_bodies", []) + ], + "modified_bodies_monikers": [ + modified_body.id + for modified_body in response.tracked_changes.get("modified_bodies", []) + ], } @protect_grpc @@ -220,10 +216,7 @@ def find_and_remove_logos(self, **kwargs) -> dict: # noqa: D102 response = self.stub.FindAndRemoveLogos(request) # Return the response - formatted as a dictionary - return { - "success": response.command_response.success, - "tracker_response": serialize_tracker_command_response(response.tracked_changes), - } + return get_standard_tracker_response(response) @protect_grpc def remove_logo(self, **kwargs): # noqa: D102 @@ -238,10 +231,7 @@ def remove_logo(self, **kwargs): # noqa: D102 response = self.stub.RemoveLogo(request) # Return the response - formatted as a dictionary - return { - "success": response.command_response.success, - "tracker_response": serialize_tracker_command_response(response.tracked_changes), - } + return get_standard_tracker_response(response) @protect_grpc def detect_helixes(self, **kwargs) -> dict: # noqa: D102 @@ -328,11 +318,7 @@ def create_box_enclosure(self, **kwargs) -> dict: # noqa: D102 response = self.stub.CreateEnclosureBox(request) # Return the response - formatted as a dictionary - return { - "success": response.command_response.success, - "created_bodies": [body.id for body in response.created_bodies], - "tracker_response": serialize_tracker_command_response(response.tracked_changes), - } + return get_tracker_response_with_created_bodies(response) @protect_grpc def create_cylinder_enclosure(self, **kwargs) -> dict: # noqa: D102 @@ -355,11 +341,7 @@ def create_cylinder_enclosure(self, **kwargs) -> dict: # noqa: D102 response = self.stub.CreateEnclosureCylinder(request) # Return the response - formatted as a dictionary - return { - "success": response.command_response.success, - "created_bodies": [body.id for body in response.created_bodies], - "tracker_response": serialize_tracker_command_response(response.tracked_changes), - } + return get_tracker_response_with_created_bodies(response) @protect_grpc def create_sphere_enclosure(self, **kwargs) -> dict: # noqa: D102 @@ -380,8 +362,4 @@ def create_sphere_enclosure(self, **kwargs) -> dict: # noqa: D102 response = self.stub.CreateEnclosureSphere(request) # Return the response - formatted as a dictionary - return { - "success": response.command_response.success, - "created_bodies": [body.id for body in response.created_bodies], - "tracker_response": serialize_tracker_command_response(response.tracked_changes), - } + return get_tracker_response_with_created_bodies(response) diff --git a/src/ansys/geometry/core/tools/prepare_tools.py b/src/ansys/geometry/core/tools/prepare_tools.py index 1f708ab6fb..9f5284e799 100644 --- a/src/ansys/geometry/core/tools/prepare_tools.py +++ b/src/ansys/geometry/core/tools/prepare_tools.py @@ -359,22 +359,20 @@ def enhanced_share_topology( ) parent_design = get_design_from_body(bodies[0]) - tracker_response = response.get("tracker_response") if not pyansys_geom.USE_TRACKER_TO_UPDATE_DESIGN: parent_design._update_design_inplace() else: - parent_design._update_from_tracker(tracker_response) + parent_design._update_from_tracker(response.get("tracker_response")) message = RepairToolMessage( success=response.get("success"), found=response.get("found"), repaired=response.get("repaired"), - created_bodies=[created_body.id for created_body in tracker_response.get("created_bodies")] - modified_bodies=[modified_body.id for modified_body in tracker_response.get("modified_bodies")] + created_bodies=response.get("created_bodies_monikers"), + modified_bodies=response.get("modified_bodies_monikers"), ) return message - @check_input_types @min_backend_version(25, 2, 0) def find_logos( @@ -495,12 +493,6 @@ def find_and_remove_logos( max_height=max_height, ) - parent_design = get_design_from_body(bodies[0]) - if not pyansys_geom.USE_TRACKER_TO_UPDATE_DESIGN: - parent_design._update_design_inplace() - else: - parent_design._update_from_tracker(response.get("tracker_response")) - return response.get("success") @min_backend_version(26, 1, 0) From 336d1b95e613510e9495459bd58e3c427df349ed Mon Sep 17 00:00:00 2001 From: Roberto Pastor Muela <37798125+RobPasMue@users.noreply.github.com> Date: Wed, 26 Nov 2025 10:18:58 +0100 Subject: [PATCH 6/6] Delete doc/changelog.d/1753.maintenance.md --- doc/changelog.d/1753.maintenance.md | 1 - 1 file changed, 1 deletion(-) delete mode 100644 doc/changelog.d/1753.maintenance.md diff --git a/doc/changelog.d/1753.maintenance.md b/doc/changelog.d/1753.maintenance.md deleted file mode 100644 index 97e5671828..0000000000 --- a/doc/changelog.d/1753.maintenance.md +++ /dev/null @@ -1 +0,0 @@ -update CHANGELOG for v0.9.0 \ No newline at end of file