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/4] 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 2952b14adde91b8b33e94d586e0fe361e0dfda3f Mon Sep 17 00:00:00 2001 From: smereu Date: Tue, 5 Aug 2025 12:02:18 -0500 Subject: [PATCH 2/4] finalize tracker changes for boolean and update from response This PR contains the following changes - Client side change for boolean to remove delete on the python side (now done in the SC API) and update from response - Changes to add and delete body logic for proper dealing with @cached_property implementation of the function that get bodies - Small refactoring to avoid multiple definition of the function _serialize_tracker_command_response --- .../core/_grpc/_services/v0/bodies.py | 27 ++++--- .../core/_grpc/_services/v0/repair_tools.py | 10 +-- src/ansys/geometry/core/designer/body.py | 35 +++++--- src/ansys/geometry/core/designer/component.py | 11 ++- src/ansys/geometry/core/designer/design.py | 81 +++++++++++++++++-- .../geometry/core/tools/problem_areas.py | 80 +++++------------- src/ansys/geometry/core/tools/repair_tools.py | 20 ++--- 7 files changed, 156 insertions(+), 108 deletions(-) diff --git a/src/ansys/geometry/core/_grpc/_services/v0/bodies.py b/src/ansys/geometry/core/_grpc/_services/v0/bodies.py index 03b08e8d21..84cb44f7a4 100644 --- a/src/ansys/geometry/core/_grpc/_services/v0/bodies.py +++ b/src/ansys/geometry/core/_grpc/_services/v0/bodies.py @@ -24,7 +24,9 @@ import grpc import pint +from ansys.geometry.core import USE_TRACKER_TO_UPDATE_DESIGN from ansys.geometry.core.errors import protect_grpc +from ansys.geometry.core.misc.auxiliary import get_design_from_body from ansys.geometry.core.misc.measurements import DEFAULT_UNITS from ..base.bodies import GRPCBodyService @@ -658,14 +660,21 @@ def boolean(self, **kwargs) -> dict: # noqa: D102 # Call the gRPC service and build the requests accordingly resp = 0 + serialized_tracker_response = {} try: - resp = self.stub.Boolean( - request=BooleanRequest( - body1=kwargs["target"].id, - tool_bodies=[other.id for other in kwargs["other"]], - method=kwargs["method"], + request = BooleanRequest( + body1=kwargs["target"].id, + tool_bodies=[other.id for other in kwargs["other"]], + method=kwargs["method"], + ) + if USE_TRACKER_TO_UPDATE_DESIGN: + request.keep_other = kwargs["keep_other"] + resp = self.stub.Boolean(request=request) + if USE_TRACKER_TO_UPDATE_DESIGN: + parent_design = get_design_from_body(kwargs["target"]) + serialized_tracker_response = parent_design._serialize_tracker_command_response( + resp.response ) - ).empty_result except grpc.RpcError as err: # pragma: no cover # TODO: to be deleted - old versions did not have "tool_bodies" in the request # This is a temporary fix to support old versions of the server - should be deleted @@ -692,15 +701,15 @@ def boolean(self, **kwargs) -> dict: # noqa: D102 body2=kwargs["other"][0].id, method=kwargs["method"], ) - ).empty_result + ) else: raise err - if resp == 1: + if resp.empty_result == 1: raise ValueError( f"Boolean operation of type '{kwargs['method']}' failed: {kwargs['err_msg']}.\n" f"Involving bodies:{kwargs['target']}, {kwargs['other']}" ) # Return the response - formatted as a dictionary - return {} + return {"complete_command_response": serialized_tracker_response} diff --git a/src/ansys/geometry/core/_grpc/_services/v0/repair_tools.py b/src/ansys/geometry/core/_grpc/_services/v0/repair_tools.py index 8c25d5c7f8..e88684f90f 100644 --- a/src/ansys/geometry/core/_grpc/_services/v0/repair_tools.py +++ b/src/ansys/geometry/core/_grpc/_services/v0/repair_tools.py @@ -344,7 +344,7 @@ def find_and_fix_simplify(self, **kwargs) -> dict: # noqa: D102 # Call the gRPC service response = self.stub.FindAndSimplify(request) - serialized_tracker_response = self._serialize_tracker_command_response( + serialized_tracker_response = kwargs["parent_design"]._serialize_tracker_command_response( response.complete_command_response ) @@ -383,7 +383,7 @@ def find_and_fix_stitch_faces(self, **kwargs) -> dict: # noqa: D102 # Call the gRPC service response = self.stub.FindAndFixStitchFaces(request) - serialized_tracker_response = self._serialize_tracker_command_response( + serialized_tracker_response = kwargs["parent_design"]._serialize_tracker_command_response( response.complete_command_response ) @@ -467,7 +467,7 @@ def find_and_fix_short_edges(self, **kwargs): # noqa: D102 # Call the gRPC service response = self.stub.FindAndFixShortEdges(request) - serialized_tracker_response = self._serialize_tracker_command_response( + serialized_tracker_response = kwargs["parent_design"]._serialize_tracker_command_response( response.complete_command_response ) @@ -494,7 +494,7 @@ def find_and_fix_extra_edges(self, **kwargs) -> dict: # noqa: D102 # Call the gRPC service response = self.stub.FindAndFixExtraEdges(request) - serialized_tracker_response = self._serialize_tracker_command_response( + serialized_tracker_response = kwargs["parent_design"]._serialize_tracker_command_response( response.complete_command_response ) @@ -525,7 +525,7 @@ def find_and_fix_split_edges(self, **kwargs) -> dict: # noqa: D102 # Call the gRPC service response = self.stub.FindAndFixSplitEdges(request) - serialized_tracker_response = self._serialize_tracker_command_response( + serialized_tracker_response = kwargs["parent_design"]._serialize_tracker_command_response( response.complete_command_response ) diff --git a/src/ansys/geometry/core/designer/body.py b/src/ansys/geometry/core/designer/body.py index c40589f5fd..2fb1ffd77c 100644 --- a/src/ansys/geometry/core/designer/body.py +++ b/src/ansys/geometry/core/designer/body.py @@ -43,6 +43,7 @@ ShellRequest, ) from ansys.api.geometry.v0.commands_pb2_grpc import CommandsStub +from ansys.geometry.core import USE_TRACKER_TO_UPDATE_DESIGN from ansys.geometry.core.connection.client import GrpcClient from ansys.geometry.core.connection.conversions import ( plane_to_grpc_plane, @@ -1948,7 +1949,9 @@ def __generic_boolean_command( # If USE_TRACKER_TO_UPDATE_DESIGN is True, we serialize the response # and update the parent design with the serialized response. tracker_response = response.result.complete_command_response - serialized_response = self._serialize_tracker_command_response(tracker_response) + serialized_response = parent_design._serialize_tracker_command_response( + tracker_response + ) parent_design._update_from_tracker(serialized_response) @reset_tessellation_cache @@ -1962,20 +1965,26 @@ def __generic_boolean_op( err_msg: str, ) -> None: grpc_other = other if isinstance(other, Iterable) else [other] - if keep_other: - # Make a copy of the other body to keep it... - # stored temporarily in the parent component - since it will be deleted - grpc_other = [b.copy(self.parent_component, f"BoolOpCopy_{b.name}") for b in grpc_other] - - self._template._grpc_client.services.bodies.boolean( - target=self, - other=grpc_other, - method=method, - err_msg=err_msg, + if not USE_TRACKER_TO_UPDATE_DESIGN: + if keep_other: + # Make a copy of the other body to keep it... + # stored temporarily in the parent component - since it will be deleted + grpc_other = [ + b.copy(self.parent_component, f"BoolOpCopy_{b.name}") for b in grpc_other + ] + + response = self._template._grpc_client.services.bodies.boolean( + target=self, other=grpc_other, method=method, err_msg=err_msg, keep_other=keep_other ) - for b in grpc_other: - b.parent_component.delete_body(b) + if not USE_TRACKER_TO_UPDATE_DESIGN: + for b in grpc_other: + b.parent_component.delete_body(b) + else: + # If USE_TRACKER_TO_UPDATE_DESIGN is True, we serialize the response + # and update the parent design with the serialized response. + parent_design = get_design_from_body(self) + parent_design._update_from_tracker(response["complete_command_response"]) def __repr__(self) -> str: """Represent the ``Body`` as a string.""" diff --git a/src/ansys/geometry/core/designer/component.py b/src/ansys/geometry/core/designer/component.py index 4c7d8d6086..f8e85af216 100644 --- a/src/ansys/geometry/core/designer/component.py +++ b/src/ansys/geometry/core/designer/component.py @@ -216,6 +216,7 @@ def __init__( self._name = new_component.component.name self._instance_name = new_component.component.instance_name else: + new_component = None self._name = name self._id = None self._instance_name = instance_name @@ -248,8 +249,14 @@ def __init__( elif not read_existing_comp: # This is an independent Component - Create new Part and MasterComponent - p = Part(uuid.uuid4(), f"p_{name}", [], []) - master = MasterComponent(uuid.uuid4(), f"master_{name}", p) + p = Part( + uuid.uuid4() if not new_component else new_component.template, f"p_{name}", [], [] + ) + master = MasterComponent( + uuid.uuid4() if not new_component else new_component.component.master_id, + f"master_{name}", + p, + ) self._master_component = master self._master_component.occurrences.append(self) diff --git a/src/ansys/geometry/core/designer/design.py b/src/ansys/geometry/core/designer/design.py index 74f6f59f77..975aeeb9bb 100644 --- a/src/ansys/geometry/core/designer/design.py +++ b/src/ansys/geometry/core/designer/design.py @@ -1000,6 +1000,55 @@ def __repr__(self) -> str: lines.append(f" N Design Points : {len(self.design_points)}") return "\n".join(lines) + def _serialize_tracker_command_response(self, response) -> dict: + """Serialize a TrackerCommandResponse object into a dictionary. + + Parameters + ---------- + response : TrackerCommandResponse + The gRPC TrackerCommandResponse object to serialize. + + Returns + ------- + dict + A dictionary representation of the TrackerCommandResponse object. + """ + + def serialize_body(body): + return { + "id": body.id, + "name": body.name, + "can_suppress": body.can_suppress, + "transform_to_master": { + "m00": body.transform_to_master.m00, + "m11": body.transform_to_master.m11, + "m22": body.transform_to_master.m22, + "m33": body.transform_to_master.m33, + }, + "master_id": body.master_id, + "parent_id": body.parent_id, + } + + def serialize_entity_identifier(entity): + """Serialize an EntityIdentifier object into a dictionary.""" + return { + "id": entity.id, + } + + return { + "success": response.success, + "created_bodies": [ + serialize_body(body) for body in getattr(response, "created_bodies", []) + ], + "modified_bodies": [ + serialize_body(body) for body in getattr(response, "modified_bodies", []) + ], + "deleted_bodies": [ + serialize_entity_identifier(entity) + for entity in getattr(response, "deleted_bodies", []) + ], + } + def __read_existing_design(self) -> None: """Read an existing ``Design`` located on the server.""" # @@ -1298,7 +1347,12 @@ def _handle_deleted_bodies(self, deleted_bodies): for body in self.bodies: if body.id == body_id: body._is_alive = False - self.bodies.remove(body) + # self.bodies.remove(body) + for bd in self._master_component.part.bodies: + if bd.id == body_id: + self._master_component.part.bodies.remove(bd) + break + self._clear_cached_bodies() removed = True self._grpc_client.log.info( f"Deleted body (ID: {body_id}) removed from root level." @@ -1325,10 +1379,12 @@ def _handle_created_bodies(self, created_bodies): ) continue - added = any(self._find_and_add_body(body_info, self.components)) + added = self._find_and_add_body(body_info, self.components) if not added: new_body = MasterBody(body_id, body_name, self._grpc_client, is_surface=is_surface) - self.bodies.append(new_body) + # self.bodies.append(new_body) + self._master_component.part.bodies.append(new_body) + self._clear_cached_bodies() self._grpc_client.log.debug( f"Added new body '{body_name}' (ID: {body_id}) to root level." ) @@ -1343,14 +1399,17 @@ def _update_body(self, existing_body, body_info): def _find_and_add_body(self, body_info, components): for component in components: - if component.id == body_info["parent_id"]: + parent_id_for_body = component._master_component.part.id + if parent_id_for_body == body_info["parent_id"]: new_body = MasterBody( body_info["id"], body_info["name"], self._grpc_client, is_surface=body_info.get("is_surface", False), ) - component.bodies.append(new_body) + # component.bodies.append(new_body) + component._master_component.part.bodies.append(new_body) + component._clear_cached_bodies() self._grpc_client.log.debug( f"Added new body '{new_body.name}' (ID: {new_body.id}) " f"to component '{component.name}' (ID: {component.id})" @@ -1380,11 +1439,17 @@ def _find_and_update_body(self, body_info, component): def _find_and_remove_body(self, body_info, component): for body in component.bodies: - if body.id == body_info["id"]: + body_info_id = body_info["id"] + if body.id == f"{component.id}/{body_info_id}": body._is_alive = False - component.bodies.remove(body) + # component.bodies.remove(body) + for bd in component._master_component.part.bodies: + if bd.id == body_info_id: + component._master_component.part.bodies.remove(bd) + break + component._clear_cached_bodies() self._grpc_client.log.debug( - f"Removed body '{body_info['name']}' (ID: {body_info['id']}) from component " + f"Removed body (ID: {body_info['id']}) from component " f"'{component.name}' (ID: {component.id})" ) return True diff --git a/src/ansys/geometry/core/tools/problem_areas.py b/src/ansys/geometry/core/tools/problem_areas.py index cac2d552c5..11cf85a01d 100644 --- a/src/ansys/geometry/core/tools/problem_areas.py +++ b/src/ansys/geometry/core/tools/problem_areas.py @@ -83,58 +83,6 @@ def fix(self): """Fix problem area.""" raise NotImplementedError("Fix method is not implemented in the base class.") - def _serialize_tracker_command_response(self, response) -> dict: - """Serialize a TrackerCommandResponse object into a dictionary. - - Parameters - ---------- - response : TrackerCommandResponse - The gRPC TrackerCommandResponse object to serialize. - - Returns - ------- - dict - A dictionary representation of the TrackerCommandResponse object. - """ - - def serialize_body(body): - """Serialize a Body object into a dictionary.""" - return { - "id": body.id, - "name": body.name, - "can_suppress": body.can_suppress, - "transform_to_master": { - "m00": body.transform_to_master.m00, - "m11": body.transform_to_master.m11, - "m22": body.transform_to_master.m22, - "m33": body.transform_to_master.m33, - }, - "master_id": body.master_id, - "parent_id": body.parent_id, - "is_surface": body.is_surface, - } - - def serialize_entity_identifier(entity): - """Serialize an EntityIdentifier object into a dictionary.""" - return { - "id": entity.id, - } - - # Safely serialize each field, defaulting to an empty list if the field is missing - return { - "success": response.success, - "created_bodies": [ - serialize_body(body) for body in getattr(response, "created_bodies", []) - ], - "modified_bodies": [ - serialize_body(body) for body in getattr(response, "modified_bodies", []) - ], - "deleted_bodies": [ - serialize_entity_identifier(entity) - for entity in getattr(response, "deleted_bodies", []) - ], - } - class DuplicateFaceProblemAreas(ProblemArea): """Provides duplicate face problem area definition. @@ -189,7 +137,9 @@ def fix(self) -> RepairToolMessage: parent_design._update_design_inplace() else: tracker_response = response.result.complete_command_response - serialized_response = self._serialize_tracker_command_response(tracker_response) + serialized_response = parent_design._serialize_tracker_command_response( + tracker_response + ) parent_design._update_from_tracker(serialized_response) message = RepairToolMessage( @@ -247,7 +197,7 @@ def fix(self) -> RepairToolMessage: FixMissingFacesRequest(missing_face_problem_area_id=self._grpc_id) ) - serialized_response = self._serialize_tracker_command_response( + serialized_response = parent_design._serialize_tracker_command_response( response.result.complete_command_response ) @@ -319,7 +269,9 @@ def fix(self) -> RepairToolMessage: parent_design._update_design_inplace() else: tracker_response = response.result.complete_command_response - serialized_response = self._serialize_tracker_command_response(tracker_response) + serialized_response = parent_design._serialize_tracker_command_response( + tracker_response + ) parent_design._update_from_tracker(serialized_response) message = RepairToolMessage( @@ -381,7 +333,9 @@ def fix(self) -> RepairToolMessage: parent_design._update_design_inplace() else: tracker_response = response.result.complete_command_response - serialized_response = self._serialize_tracker_command_response(tracker_response) + serialized_response = parent_design._serialize_tracker_command_response( + tracker_response + ) parent_design._update_from_tracker(serialized_response) message = RepairToolMessage( @@ -444,7 +398,9 @@ def fix(self) -> RepairToolMessage: parent_design._update_design_inplace() else: tracker_response = response.result.complete_command_response - serialized_response = self._serialize_tracker_command_response(tracker_response) + serialized_response = parent_design._serialize_tracker_command_response( + tracker_response + ) parent_design._update_from_tracker(serialized_response) message = RepairToolMessage( @@ -510,7 +466,9 @@ def fix(self) -> RepairToolMessage: # If USE_TRACKER_TO_UPDATE_DESIGN is True, we serialize the response # and update the parent design with the serialized response. tracker_response = response.result.complete_command_response - serialized_response = self._serialize_tracker_command_response(tracker_response) + serialized_response = parent_design._serialize_tracker_command_response( + tracker_response + ) parent_design._update_from_tracker(serialized_response) message = RepairToolMessage( @@ -572,7 +530,7 @@ def fix(self) -> RepairToolMessage: parent_design._update_design_inplace() else: tracker_respone = response.result.complete_command_response - serialized_response = self._serialize_tracker_command_response(tracker_respone) + serialized_response = parent_design._serialize_tracker_command_response(tracker_respone) parent_design._update_from_tracker(serialized_response) message = RepairToolMessage( @@ -635,7 +593,7 @@ def fix(self) -> RepairToolMessage: parent_design._update_design_inplace() else: tracker_respone = response.result.complete_command_response - serialized_response = self._serialize_tracker_command_response(tracker_respone) + serialized_response = parent_design._serialize_tracker_command_response(tracker_respone) parent_design._update_from_tracker(serialized_response) message = RepairToolMessage( @@ -692,7 +650,7 @@ def fix(self) -> RepairToolMessage: parent_design._update_design_inplace() else: tracker_respone = response.result.complete_command_response - serialized_response = self._serialize_tracker_command_response(tracker_respone) + serialized_response = parent_design._serialize_tracker_command_response(tracker_respone) parent_design._update_from_tracker(serialized_response) message = RepairToolMessage( diff --git a/src/ansys/geometry/core/tools/repair_tools.py b/src/ansys/geometry/core/tools/repair_tools.py index 5742c97754..a5b4206350 100644 --- a/src/ansys/geometry/core/tools/repair_tools.py +++ b/src/ansys/geometry/core/tools/repair_tools.py @@ -523,16 +523,16 @@ def find_and_fix_short_edges( ) body_ids = [body.id for body in bodies] + parent_design = get_design_from_body(bodies[0]) response = self._grpc_client.services.repair_tools.find_and_fix_short_edges( selection=body_ids, + parent_design=parent_design, length=length, comprehensive_result=comprehensive_result, ) # Update existing design - parent_design = get_design_from_body(bodies[0]) - if not pyansys_geometry.USE_TRACKER_TO_UPDATE_DESIGN: parent_design._update_design_inplace() else: @@ -579,14 +579,14 @@ def find_and_fix_extra_edges( ) body_ids = [body.id for body in bodies] + parent_design = get_design_from_body(bodies[0]) response = self._grpc_client.services.repair_tools.find_and_fix_extra_edges( selection=body_ids, + parent_design=parent_design, comprehensive_result=comprehensive_result, ) # Update existing design - parent_design = get_design_from_body(bodies[0]) - if not pyansys_geometry.USE_TRACKER_TO_UPDATE_DESIGN: parent_design._update_design_inplace() else: @@ -641,17 +641,17 @@ def find_and_fix_split_edges( ) body_ids = [body.id for body in bodies] + parent_design = get_design_from_body(bodies[0]) response = self._grpc_client.services.repair_tools.find_and_fix_split_edges( bodies_or_faces=body_ids, + parent_design=parent_design, angle=angle, length=length, comprehensive_result=comprehensive_result, ) # Update existing design - parent_design = get_design_from_body(bodies[0]) - if not pyansys_geometry.USE_TRACKER_TO_UPDATE_DESIGN: parent_design._update_design_inplace() else: @@ -696,15 +696,15 @@ def find_and_fix_simplify( ) body_ids = [body.id for body in bodies] + parent_design = get_design_from_body(bodies[0]) response = self._grpc_client.services.repair_tools.find_and_fix_simplify( selection=body_ids, + parent_design=parent_design, comprehensive_result=comprehensive_result, ) # Update existing design - parent_design = get_design_from_body(bodies[0]) - if not pyansys_geometry.USE_TRACKER_TO_UPDATE_DESIGN: parent_design._update_design_inplace() else: @@ -766,9 +766,11 @@ def find_and_fix_stitch_faces( ) body_ids = [body.id for body in bodies] + parent_design = get_design_from_body(bodies[0]) response = self._grpc_client.services.repair_tools.find_and_fix_stitch_faces( body_ids=body_ids, + parent_design=parent_design, max_distance=max_distance, allow_multiple_bodies=allow_multiple_bodies, maintain_components=maintain_components, @@ -777,8 +779,6 @@ def find_and_fix_stitch_faces( ) # Update existing design - parent_design = get_design_from_body(bodies[0]) - if not pyansys_geometry.USE_TRACKER_TO_UPDATE_DESIGN: parent_design._update_design_inplace() else: From aacd11a8640c9109a25af719f501f0ac77d7c9a5 Mon Sep 17 00:00:00 2001 From: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> Date: Mon, 11 Aug 2025 08:52:17 +0000 Subject: [PATCH 3/4] chore: adding changelog file 2153.added.md [dependabot-skip] --- doc/changelog.d/2153.added.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/changelog.d/2153.added.md diff --git a/doc/changelog.d/2153.added.md b/doc/changelog.d/2153.added.md new file mode 100644 index 0000000000..55e84868f3 --- /dev/null +++ b/doc/changelog.d/2153.added.md @@ -0,0 +1 @@ +Tracking boolean operations \ No newline at end of file From 8344d414f2bcf2f1ad74472b8a2d085862f05712 Mon Sep 17 00:00:00 2001 From: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> Date: Wed, 20 Aug 2025 13:56:06 +0000 Subject: [PATCH 4/4] chore: adding changelog file 2153.added.md [dependabot-skip] --- doc/changelog.d/2153.added.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/changelog.d/2153.added.md b/doc/changelog.d/2153.added.md index 55e84868f3..f4ff49de0c 100644 --- a/doc/changelog.d/2153.added.md +++ b/doc/changelog.d/2153.added.md @@ -1 +1 @@ -Tracking boolean operations \ No newline at end of file +Tracking boolean operations