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 01/16] 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 f80402bee3ac09435a694c71ca13e92ae1ac2c14 Mon Sep 17 00:00:00 2001 From: smereu Date: Tue, 2 Dec 2025 21:59:05 -0600 Subject: [PATCH 02/16] v1 implementation of repair tools V1 implementation of repair tools. Notes 1) The return argument from the tracker were inconsistent between calls and were bringing outside in the service layer historical names (tracker_response vs complete_command_response) that is better to keep into v0. Some small changes were made to the v0 to eliminate the problem 2) The return argument of functions (repair and others) that modify data in an unknown way needs to be made consistent but we can tackle that topic separately from v1 creation 3) More stuff was put into conversions.py. Definitely needs a clean-up... --- .../core/_grpc/_services/v0/repair_tools.py | 57 +- .../core/_grpc/_services/v1/conversions.py | 132 +++++ .../core/_grpc/_services/v1/repair_tools.py | 492 ++++++++++++++++-- .../geometry/core/tools/problem_areas.py | 25 +- .../core/tools/repair_tool_message.py | 23 + src/ansys/geometry/core/tools/repair_tools.py | 49 +- 6 files changed, 676 insertions(+), 102 deletions(-) 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 e60a3fc05c..0c20b0272c 100644 --- a/src/ansys/geometry/core/_grpc/_services/v0/repair_tools.py +++ b/src/ansys/geometry/core/_grpc/_services/v0/repair_tools.py @@ -393,7 +393,7 @@ def find_and_fix_short_edges(self, **kwargs): # noqa: D102 "repaired": response.repaired, "created_bodies_monikers": [], "modified_bodies_monikers": [], - "complete_command_response": serialized_tracker_response, + "tracker_response": serialized_tracker_response, } @protect_grpc @@ -420,7 +420,7 @@ def find_and_fix_extra_edges(self, **kwargs) -> dict: # noqa: D102 "repaired": response.repaired, "created_bodies_monikers": response.created_bodies_monikers, "modified_bodies_monikers": response.modified_bodies_monikers, - "complete_command_response": serialized_tracker_response, + "tracker_response": serialized_tracker_response, } @protect_grpc @@ -449,7 +449,7 @@ def find_and_fix_split_edges(self, **kwargs) -> dict: # noqa: D102 "repaired": response.repaired, "created_bodies_monikers": [], "modified_bodies_monikers": [], - "complete_command_response": serialized_tracker_response, + "tracker_response": serialized_tracker_response, } @protect_grpc @@ -476,7 +476,7 @@ def find_and_fix_simplify(self, **kwargs) -> dict: # noqa: D102 "repaired": response.repaired, "created_bodies_monikers": [], "modified_bodies_monikers": [], - "complete_command_response": serialized_tracker_response, + "tracker_response": serialized_tracker_response, } @protect_grpc @@ -514,7 +514,7 @@ def find_and_fix_stitch_faces(self, **kwargs) -> dict: # noqa: D102 "modified_bodies_monikers": response.modified_bodies_monikers, "found": response.found, "repaired": response.repaired, - "complete_command_response": serialized_tracker_response, + "tracker_response": serialized_tracker_response, } @protect_grpc @@ -566,7 +566,9 @@ def fix_duplicate_faces(self, **kwargs) -> dict: # noqa: D102 # Return the response - formatted as a dictionary return { "tracker_response": serialized_tracker_response, - "repair_tracker_response": self.__serialize_message_response(response), + "success": response.result.success, + "created_bodies_monikers": response.result.created_bodies_monikers, + "modified_bodies_monikers": response.result.modified_bodies_monikers, } @protect_grpc @@ -590,7 +592,9 @@ def fix_missing_faces(self, **kwargs) -> dict: # noqa: D102 # Return the response - formatted as a dictionary return { "tracker_response": serialized_tracker_response, - "repair_tracker_response": self.__serialize_message_response(response), + "success": response.result.success, + "created_bodies_monikers": response.result.created_bodies_monikers, + "modified_bodies_monikers": response.result.modified_bodies_monikers, } @protect_grpc @@ -614,7 +618,9 @@ def fix_inexact_edges(self, **kwargs) -> dict: # noqa: D102 # Return the response - formatted as a dictionary return { "tracker_response": serialized_tracker_response, - "repair_tracker_response": self.__serialize_message_response(response), + "success": response.result.success, + "created_bodies_monikers": response.result.created_bodies_monikers, + "modified_bodies_monikers": response.result.modified_bodies_monikers, } @protect_grpc @@ -636,7 +642,9 @@ def fix_extra_edges(self, **kwargs) -> dict: # noqa: D102 # Return the response - formatted as a dictionary return { "tracker_response": serialized_tracker_response, - "repair_tracker_response": self.__serialize_message_response(response), + "success": response.result.success, + "created_bodies_monikers": response.result.created_bodies_monikers, + "modified_bodies_monikers": response.result.modified_bodies_monikers, } @protect_grpc @@ -658,7 +666,9 @@ def fix_short_edges(self, **kwargs) -> dict: # noqa: D102 # Return the response - formatted as a dictionary return { "tracker_response": serialized_tracker_response, - "repair_tracker_response": self.__serialize_message_response(response), + "success": response.result.success, + "created_bodies_monikers": response.result.created_bodies_monikers, + "modified_bodies_monikers": response.result.modified_bodies_monikers, } @protect_grpc @@ -680,7 +690,9 @@ def fix_small_faces(self, **kwargs) -> dict: # noqa: D102 # Return the response - formatted as a dictionary return { "tracker_response": serialized_tracker_response, - "repair_tracker_response": self.__serialize_message_response(response), + "success": response.result.success, + "created_bodies_monikers": response.result.created_bodies_monikers, + "modified_bodies_monikers": response.result.modified_bodies_monikers, } @protect_grpc @@ -702,7 +714,9 @@ def fix_split_edges(self, **kwargs) -> dict: # noqa: D102 # Return the response - formatted as a dictionary return { "tracker_response": serialized_tracker_response, - "repair_tracker_response": self.__serialize_message_response(response), + "success": response.result.success, + "created_bodies_monikers": response.result.created_bodies_monikers, + "modified_bodies_monikers": response.result.modified_bodies_monikers, } @protect_grpc @@ -726,7 +740,9 @@ def fix_stitch_faces(self, **kwargs) -> dict: # noqa: D102 # Return the response - formatted as a dictionary return { "tracker_response": serialized_tracker_response, - "repair_tracker_response": self.__serialize_message_response(response), + "success": response.result.success, + "created_bodies_monikers": response.result.created_bodies_monikers, + "modified_bodies_monikers": response.result.modified_bodies_monikers, } @protect_grpc @@ -750,7 +766,9 @@ def fix_unsimplified_faces(self, **kwargs) -> dict: # noqa: D102 # Return the response - formatted as a dictionary return { "tracker_response": serialized_tracker_response, - "repair_tracker_response": self.__serialize_message_response(response), + "success": response.result.success, + "created_bodies_monikers": response.result.created_bodies_monikers, + "modified_bodies_monikers": response.result.modified_bodies_monikers, } @protect_grpc @@ -774,7 +792,9 @@ def fix_interference(self, **kwargs) -> dict: # noqa: D102 # Return the response - formatted as a dictionary return { "tracker_response": serialized_tracker_response, - "repair_tracker_response": self.__serialize_message_response(response), + "success": response.result.success, + "created_bodies_monikers": response.result.created_bodies_monikers, + "modified_bodies_monikers": response.result.modified_bodies_monikers, } def __serialize_inspect_result_response(self, response) -> dict: # noqa: D102 @@ -830,10 +850,3 @@ def serialize_issue(issue): for body_issues in response.issues_by_body ] } - - def __serialize_message_response(self, response): - return { - "success": response.result.success, - "created_bodies_monikers": response.result.created_bodies_monikers, - "modified_bodies_monikers": response.result.modified_bodies_monikers, - } diff --git a/src/ansys/geometry/core/_grpc/_services/v1/conversions.py b/src/ansys/geometry/core/_grpc/_services/v1/conversions.py index d1fc9aab69..40ab410d6e 100644 --- a/src/ansys/geometry/core/_grpc/_services/v1/conversions.py +++ b/src/ansys/geometry/core/_grpc/_services/v1/conversions.py @@ -44,6 +44,7 @@ CurveGeometry as GRPCCurveGeometry, DrivingDimensionEntity as GRPCDrivingDimension, EdgeTessellation as GRPCEdgeTessellation, + EnhancedRepairToolMessage as GRPCEnhancedRepairToolResponse, Geometries as GRPCGeometries, Knot as GRPCKnot, MaterialEntity as GRPCMaterial, @@ -1349,6 +1350,38 @@ def from_angle_to_grpc_quantity(input: "Measurement") -> GRPCQuantity: return GRPCQuantity(value_in_geometry_units=input.value.m_as(DEFAULT_UNITS.SERVER_ANGLE)) +def from_area_to_grpc_quantity(input: "Measurement") -> GRPCQuantity: + """Convert a ``Measurement`` containing an area to a gRPC quantity. + + Parameters + ---------- + input : Measurement + Source measurement data. + + Returns + ------- + GRPCQuantity + Converted gRPC quantity. + """ + return GRPCQuantity(value_in_geometry_units=input.value.m_as(DEFAULT_UNITS.SERVER_AREA)) + + +def from_volume_to_grpc_quantity(input: "Measurement") -> GRPCQuantity: + """Convert a ``Measurement`` containing a volume to a gRPC quantity. + + Parameters + ---------- + input : Measurement + Source measurement data. + + Returns + ------- + GRPCQuantity + Converted gRPC quantity. + """ + return GRPCQuantity(value_in_geometry_units=input.value.m_as(DEFAULT_UNITS.SERVER_VOLUME)) + + def _nurbs_curves_compatibility(backend_version: "semver.Version", grpc_geometries: GRPCGeometries): """Check if the backend version is compatible with NURBS curves in sketches. @@ -1568,3 +1601,102 @@ def get_tracker_response_with_created_bodies(response) -> dict: "created_bodies", [] ) return serialized_response + + +def serialize_repair_command_response(response: GRPCEnhancedRepairToolResponse) -> dict: + """Serialize a EnhancedRepairToolResponse object into a dictionary. + + Parameters + ---------- + response : GRPCEnhancedRepairToolResponse + The gRPC EnhancedRepairToolResponse object to serialize. + A dictionary representation of the EnhancedRepairToolResponse object. + """ + return { + "success": response.tracked_changes.command_response.success, + "found": response.found, + "repaired": response.repaired, + "complete_command_response": serialize_tracked_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", []) + ], + "deleted_bodies_monikers": [ + deleted_body.id for deleted_body in response.tracked_changes.get("deleted_bodies", []) + ], + } + + +def response_problem_area_for_body(response) -> dict: + """Get a dictionary response from problem areas for a body. + + Parameters + ---------- + response + The response to convert. + + Returns + ------- + dict + A dictionary representation of the ProblemAreaForBody object. + """ + return { + "problems": [ + { + "id": res.id, + "bodies": res.body_monikers, + } + for res in response.result + ] + } + + +def response_problem_area_for_face(response) -> dict: + """Get a dictionary response from problem areas for a face. + + Parameters + ---------- + response + The response to convert. + + Returns + ------- + dict + A dictionary representation of the ProblemAreaForFace object. + """ + return { + "problems": [ + { + "id": res.id, + "faces": res.face_monikers, + } + for res in response.result + ] + } + + +def response_problem_area_for_edge(response) -> dict: + """Get a dictionary response from problem areas for an edge. + + Parameters + ---------- + response + The response to convert. + + Returns + ------- + dict + A dictionary representation of the ProblemAreaForEdge object. + """ + return { + "problems": [ + { + "id": res.id, + "edges": res.edge_monikers, + } + for res in response.result + ] + } diff --git a/src/ansys/geometry/core/_grpc/_services/v1/repair_tools.py b/src/ansys/geometry/core/_grpc/_services/v1/repair_tools.py index 4c95a9a041..3a57133c51 100644 --- a/src/ansys/geometry/core/_grpc/_services/v1/repair_tools.py +++ b/src/ansys/geometry/core/_grpc/_services/v1/repair_tools.py @@ -19,18 +19,36 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -"""Module containing the repair tools service implementation for v1.""" +"""Module containing the repair tools service implementation for v1. + +This module defines an abstract base class for a gRPC-based repair tools service. +The class provides a set of abstract methods for identifying and repairing various +geometry issues, such as split edges, extra edges, duplicate faces etc. +""" import grpc from ansys.geometry.core.errors import protect_grpc from ..base.repair_tools import GRPCRepairToolsService - - -class GRPCRepairToolsServiceV1(GRPCRepairToolsService): # pragma: no cover +from .conversions import ( + from_angle_to_grpc_quantity, + from_area_to_grpc_quantity, + from_length_to_grpc_quantity, + response_problem_area_for_body, + response_problem_area_for_edge, + response_problem_area_for_face, + serialize_repair_command_response, +) + + +class GRPCRepairToolsServiceV1(GRPCRepairToolsService): # noqa: D102 """Repair tools service for gRPC communication with the Geometry server. + This class provides methods to interact with the Geometry server's + Repair Tools service. It is specifically designed for the v1 version + of the Geometry API. + Parameters ---------- channel : grpc.Channel @@ -38,115 +56,519 @@ class GRPCRepairToolsServiceV1(GRPCRepairToolsService): # pragma: no cover """ @protect_grpc - def __init__(self, channel: grpc.Channel): # noqa: D102 - from ansys.api.geometry.v1.repairtools_pb2_grpc import RepairToolsStub + def __init__(self, channel: grpc.Channel): + from ansys.api.discovery.v1.operations.repair_pb2_grpc import RepairStub - self.stub = RepairToolsStub(channel) + self.stub = RepairStub(channel) @protect_grpc def find_split_edges(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.repair_pb2 import FindSplitEdgesRequest + + # Create the request - assumes all inputs are valid and of the proper type + request = FindSplitEdgesRequest( + bodies_or_faces_ids=kwargs["bodies_or_faces"], + angle=( + from_angle_to_grpc_quantity(kwargs["angle"]) + if kwargs["angle"] is not None + else None + ), + distance=( + from_length_to_grpc_quantity, + (kwargs["distance"]) if kwargs["distance"] is not None else None, + ), + ) + + # Call the gRPC service + response = self.stub.FindSplitEdges(request) + + # Format and return the response as a dictionary + return response_problem_area_for_edge(response) @protect_grpc def find_extra_edges(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.repair_pb2 import FindExtraEdgesRequest + + # Create the request - assumes all inputs are valid and of the proper type + request = FindExtraEdgesRequest(selection_id=kwargs["selection"]) + + # Return the response - formatted as a dictionary + response = self.stub.FindExtraEdges(request) + + # Return the response - formatted as a dictionary + return response_problem_area_for_edge(response) @protect_grpc def find_inexact_edges(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.repair_pb2 import FindInexactEdgesRequest + + # Create the request - assumes all inputs are valid and of the proper type + request = FindInexactEdgesRequest(selection_id=kwargs["selection"]) + + # Call the gRPC service + response = self.stub.FindInexactEdges(request) + + # Return the response - formatted as a dictionary + return response_problem_area_for_edge(response) @protect_grpc def find_short_edges(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.repair_pb2 import FindShortEdgesRequest + + # Create the request - assumes all inputs are valid and of the proper type + request = FindShortEdgesRequest( + selection_id=kwargs["selection"], + max_edge_length=from_length_to_grpc_quantity(kwargs["length"]), + ) + + # Call the gRPC service + response = self.stub.FindShortEdges(request) + + return response_problem_area_for_edge(response) @protect_grpc def find_duplicate_faces(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.repair_pb2 import FindDuplicateFacesRequest + + # Create the request - assumes all inputs are valid and of the proper type + request = FindDuplicateFacesRequest(face_ids=kwargs["faces"]) + + # Call the gRPC service + response = self.stub.FindDuplicateFaces(request) + + # Return the response - formatted as a dictionary + return response_problem_area_for_face(response) @protect_grpc def find_missing_faces(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.repair_pb2 import FindMissingFacesRequest + + from ansys.geometry.core.logger import LOG + + # Check the backend version to set optional parameters + if kwargs["angle"] is not None or kwargs["distance"] is not None: + # If the backend version is less than 26.1.0, set angle and distance to None + kwargs["angle"] = None + kwargs["distance"] = None + + # Log a warning + LOG.warning( + "The backend version is less than 26.1.0, so angle and distance parameters will be" + "ignored. Please update the backend to use these parameters." + ) + + # Create the request - assumes all inputs are valid and of the proper type + request = FindMissingFacesRequest( + face_ids=kwargs["faces"], + angle=from_angle_to_grpc_quantity(kwargs["angle"]) + if kwargs["angle"] is not None + else None, + distance=from_length_to_grpc_quantity(kwargs["distance"]) + if kwargs["distance"] is not None + else None, + ) + + # Call the gRPC service + response = self.stub.FindMissingFaces(request) + + # Return the response - formatted as a dictionary + return response_problem_area_for_face(response) @protect_grpc def find_small_faces(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.repair_pb2 import FindSmallFacesRequest + + from ansys.geometry.core.logger import LOG + + # Check the backend version to set optional parameters + if kwargs["area"] is not None or kwargs["width"] is not None: + # If the backend version is less than 26.1.0, set area and width to None + kwargs["area"] = None + kwargs["width"] = None + + # Log a warning + LOG.warning( + "The backend version is less than 26.1.0, so area and width parameters will be" + "ignored. Please update the backend to use these parameters." + ) + + # Create the request - assumes all inputs are valid and of the proper type + request = FindSmallFacesRequest( + selection_id=kwargs["selection"], + area=from_area_to_grpc_quantity(kwargs["area"]) if kwargs["area"] is not None else None, + width=from_length_to_grpc_quantity(kwargs["width"]) + if kwargs["width"] is not None + else None, + ) + + # Call the gRPC service + response = self.stub.FindSmallFaces(request) + + # Return the response - formatted as a dictionary + return response_problem_area_for_face(response) @protect_grpc def find_stitch_faces(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.repair_pb2 import FindStitchFacesRequest + + if kwargs["distance"] is not None: + # If the backend version is less than 26.1.0, set distance to None and log warning + kwargs["distance"] = None + + # Create the request - assumes all inputs are valid and of the proper type + request = FindStitchFacesRequest( + face_ids=kwargs["faces"], + maximum_distance=from_length_to_grpc_quantity(kwargs["distance"]) + if kwargs["distance"] is not None + else None, + ) + + # Call the gRPC service + response = self.stub.FindStitchFaces(request) + + # Return the response - formatted as a dictionary + return response_problem_area_for_body(response) @protect_grpc def find_simplify(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.repair_pb2 import FindAdjustSimplifyRequest + + # Create the request - assumes all inputs are valid and of the proper type + request = FindAdjustSimplifyRequest(selection_id=kwargs["selection"]) + + # Call the gRPC service + response = self.stub.FindAdjustSimplify(request) + + # Return the response - formatted as a dictionary + return response_problem_area_for_body(response) @protect_grpc def find_interferences(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.repair_pb2 import FindInterferenceRequest + from google.protobuf.wrappers_pb2 import BoolValue + + # Create the request - assumes all inputs are valid and of the proper type + request = FindInterferenceRequest( + bodY_ids=kwargs["bodies"], + cut_smaller_body=BoolValue(value=kwargs["cut_smaller_body"]), + ) + + # Call the gRPC service + response = self.stub.FindInterference(request) + + # Return the response - formatted as a dictionary + return response_problem_area_for_body(response) @protect_grpc - def find_and_fix_short_edges(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + def find_and_fix_short_edges(self, **kwargs): # noqa: D102 + from ansys.api.discovery.v1.operations.repair_pb2 import FindShortEdgesRequest + + # Create the request - assumes all inputs are valid and of the proper type + request = FindShortEdgesRequest( + selection_id=kwargs["selection"], + max_edge_length=from_length_to_grpc_quantity(kwargs["length"]), + comprehensive=kwargs["comprehensive_result"], + ) + + # Call the gRPC service + response = self.stub.FindAndFixShortEdges(request) + + return serialize_repair_command_response(response) @protect_grpc def find_and_fix_extra_edges(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.repair_pb2 import FindExtraEdgesRequest + + # Create the request - assumes all inputs are valid and of the proper type + request = FindExtraEdgesRequest( + selection_id=kwargs["selection"], + comprehensive=kwargs["comprehensive_result"], + ) + + # Call the gRPC service + response = self.stub.FindAndFixExtraEdges(request) + + return serialize_repair_command_response(response) @protect_grpc def find_and_fix_split_edges(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.repair_pb2 import FindSplitEdgesRequest + + # Create the request - assumes all inputs are valid and of the proper type + request = FindSplitEdgesRequest( + body_or_face_ids=kwargs["bodies_or_faces"], + distance=from_length_to_grpc_quantity(kwargs["length"]), + comprehensive=kwargs["comprehensive_result"], + ) + + # Call the gRPC service + response = self.stub.FindAndFixSplitEdges(request) + + return serialize_repair_command_response(response) @protect_grpc def find_and_fix_simplify(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.repair_pb2 import FindAdjustSimplifyRequest + + # Create the request - assumes all inputs are valid and of the proper type + request = FindAdjustSimplifyRequest( + selection_id=kwargs["selection"], + comprehensive=kwargs["comprehensive_result"], + ) + + # Call the gRPC service + response = self.stub.FindAndSimplify(request) + + return serialize_repair_command_response(response) @protect_grpc def find_and_fix_stitch_faces(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.repair_pb2 import FindStitchFacesRequest + from google.protobuf.wrappers_pb2 import BoolValue + + # Create the request - assumes all inputs are valid and of the proper type + request = FindStitchFacesRequest( + face_ids=kwargs["body_ids"], + maximum_distance=from_length_to_grpc_quantity(kwargs["max_distance"]) + if kwargs["max_distance"] is not None + else None, + allow_multiple_bodies=BoolValue(value=kwargs["allow_multiple_bodies"]), + maintain_components=BoolValue(value=kwargs["maintain_components"]), + check_for_coincidence=BoolValue(value=kwargs["check_for_coincidence"]), + comprehensive=kwargs["comprehensive_result"], + ) + + # Call the gRPC service + response = self.stub.FindAndFixStitchFaces(request) + + return serialize_repair_command_response(response) @protect_grpc def inspect_geometry(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.repair_pb2 import InspectGeometryRequest + + # Create the request - assumes all inputs are valid and of the proper type + request = InspectGeometryRequest(body_ids=kwargs.get("bodies", [])) + + # Call the gRPC service + inspect_result_response = self.stub.InspectGeometry(request) + + # Serialize and return the response + return self.__serialize_inspect_result_response(inspect_result_response) @protect_grpc def repair_geometry(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.repair_pb2 import RepairGeometryRequest + + # Create the request - assumes all inputs are valid and of the proper type + request = RepairGeometryRequest(body_ids=kwargs.get("bodies", [])) + + # Call the gRPC service + response = self.stub.RepairGeometry(request) + + # Return the response - formatted as a dictionary + return serialize_repair_command_response(response) @protect_grpc def fix_duplicate_faces(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.repair_pb2 import FixDuplicateFacesRequest + + # Create the request - assumes all inputs are valid and of the proper type + request = FixDuplicateFacesRequest( + duplicate_face_problem_area_id=int(kwargs["duplicate_face_problem_area_id"]), + ) + + # Call the gRPC service + response = self.stub.FixDuplicateFaces(request) + + # Return the response - formatted as a dictionary + return serialize_repair_command_response(response) @protect_grpc def fix_missing_faces(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.repair_pb2 import FixMissingFacesRequest + + # Create the request - assumes all inputs are valid and of the proper type + request = FixMissingFacesRequest( + missing_face_problem_area_id=int(kwargs["missing_face_problem_area_id"]), + ) + + # Call the gRPC service + response = self.stub.FixMissingFaces(request) + + # Return the response - formatted as a dictionary + return serialize_repair_command_response(response) @protect_grpc def fix_inexact_edges(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.repair_pb2 import FixInexactEdgesRequest + + # Create the request - assumes all inputs are valid and of the proper type + request = FixInexactEdgesRequest( + inexact_edge_problem_area_id=int(kwargs["inexact_edge_problem_area_id"]), + ) + + # Call the gRPC service + response = self.stub.FixInexactEdges(request) + + # Return the response - formatted as a dictionary + return serialize_repair_command_response(response) @protect_grpc def fix_extra_edges(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.repair_pb2 import FixExtraEdgesRequest + + # Create the request - assumes all inputs are valid and of the proper type + request = FixExtraEdgesRequest( + extra_edge_problem_area_id=int(kwargs["extra_edge_problem_area_id"]), + ) + + # Call the gRPC service + response = self.stub.FixExtraEdges(request) + + # Return the response - formatted as a dictionary + return serialize_repair_command_response(response) @protect_grpc def fix_short_edges(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.repair_pb2 import FixShortEdgesRequest + + # Create the request - assumes all inputs are valid and of the proper type + request = FixShortEdgesRequest( + short_edge_problem_area_id=int(kwargs["short_edge_problem_area_id"]), + ) + + # Call the gRPC service + response = self.stub.FixShortEdges(request) + + # Return the response - formatted as a dictionary + return serialize_repair_command_response(response) @protect_grpc def fix_small_faces(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.repair_pb2 import FixSmallFacesRequest + + # Create the request - assumes all inputs are valid and of the proper type + request = FixSmallFacesRequest( + small_face_problem_area_id=int(kwargs["small_face_problem_area_id"]), + ) + + # Call the gRPC service + response = self.stub.FixSmallFaces(request) + + # Return the response - formatted as a dictionary + return serialize_repair_command_response(response) @protect_grpc def fix_split_edges(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.repair_pb2 import FixSplitEdgesRequest + + # Create the request - assumes all inputs are valid and of the proper type + request = FixSplitEdgesRequest( + split_edge_problem_area_id=int(kwargs["split_edge_problem_area_id"]), + ) + + # Call the gRPC service + response = self.stub.FixSplitEdges(request) + + # Return the response - formatted as a dictionary + return serialize_repair_command_response(response) @protect_grpc def fix_stitch_faces(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.repair_pb2 import FixStitchFacesRequest + + # Create the request - assumes all inputs are valid and of the proper type + request = FixStitchFacesRequest( + stitch_face_problem_area_id=int(kwargs["stitch_face_problem_area_id"]), + ) + + # Call the gRPC service + response = self.stub.FixStitchFaces(request) + + # Return the response - formatted as a dictionary + return serialize_repair_command_response(response) @protect_grpc def fix_unsimplified_faces(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.repair_pb2 import FixAdjustSimplifyRequest + + # Create the request - assumes all inputs are valid and of the proper type + request = FixAdjustSimplifyRequest( + adjust_simplify_problem_area_id=int(kwargs["adjust_simplify_problem_area_id"]), + ) + + # Call the gRPC service + response = self.stub.FixAdjustSimplify(request) + + # Return the response - formatted as a dictionary + return serialize_repair_command_response(response) @protect_grpc def fix_interference(self, **kwargs) -> dict: # noqa: D102 - raise NotImplementedError + from ansys.api.discovery.v1.operations.repair_pb2 import FixInterferenceRequest + + # Create the request - assumes all inputs are valid and of the proper type + request = FixInterferenceRequest( + interference_problem_area_id=int(kwargs["interference_problem_area_id"]), + ) + + # Call the gRPC service + response = self.stub.FixInterference(request) + + # Return the response - formatted as a dictionary + return serialize_repair_command_response(response) + + def __serialize_inspect_result_response(self, response) -> dict: # noqa: D102 + 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_face(face): + return { + "id": face.id, + "surface_type": face.surface_type, + "export_id": face.export_id, + "is_reversed": getattr(face, "is_reversed", False), + "parent_id": face.parent_id.id, + } + + def serialize_edge(edge): + return { + "id": edge.id, + "curve_type": edge.curve_type, + "export_id": edge.export_id, + "length": edge.length, + "owner_id": edge.owner_id, + "parent": serialize_body(edge.parent) if hasattr(edge, "parent") else None, + } + + def serialize_issue(issue): + return { + "message_type": issue.message_type, + "message_id": issue.message_id, + "message": issue.message, + "faces": [serialize_face(f) for f in issue.faces], + "edges": [serialize_edge(e) for e in issue.edges], + } + + return { + "issues_by_body": [ + { + "body": serialize_body(body_issues.body), + "issues": [serialize_issue(i) for i in body_issues.issues], + } + for body_issues in response.issues_by_body + ] + } diff --git a/src/ansys/geometry/core/tools/problem_areas.py b/src/ansys/geometry/core/tools/problem_areas.py index cf1b1a7a8d..253c0ac63f 100644 --- a/src/ansys/geometry/core/tools/problem_areas.py +++ b/src/ansys/geometry/core/tools/problem_areas.py @@ -32,7 +32,10 @@ get_design_from_face, ) from ansys.geometry.core.misc.checks import check_type_all_elements_in_iterable -from ansys.geometry.core.tools.repair_tool_message import RepairToolMessage +from ansys.geometry.core.tools.repair_tool_message import ( + RepairToolMessage, + create_repair_message_from_response, +) if TYPE_CHECKING: # pragma: no cover from ansys.geometry.core.designer.body import Body @@ -141,7 +144,7 @@ def fix(self) -> RepairToolMessage: else: parent_design._update_from_tracker(response.get("tracker_response")) - message = self.build_repair_tool_message(response.get("repair_tracker_response")) + message = create_repair_message_from_response(response) return message @@ -195,7 +198,7 @@ def fix(self) -> RepairToolMessage: else: parent_design._update_from_tracker(response.get("tracker_response")) - message = self.build_repair_tool_message(response.get("repair_tracker_response")) + message = create_repair_message_from_response(response) return message @@ -250,7 +253,7 @@ def fix(self) -> RepairToolMessage: else: parent_design._update_from_tracker(response.get("tracker_response")) - message = self.build_repair_tool_message(response.get("repair_tracker_response")) + message = create_repair_message_from_response(response) return message @@ -304,7 +307,7 @@ def fix(self) -> RepairToolMessage: else: parent_design._update_from_tracker(response.get("tracker_response")) - message = self.build_repair_tool_message(response.get("repair_tracker_response")) + message = create_repair_message_from_response(response) return message @@ -358,7 +361,7 @@ def fix(self) -> RepairToolMessage: else: parent_design._update_from_tracker(response.get("tracker_response")) - message = self.build_repair_tool_message(response.get("repair_tracker_response")) + message = create_repair_message_from_response(response) return message @@ -412,7 +415,7 @@ def fix(self) -> RepairToolMessage: else: parent_design._update_from_tracker(response.get("tracker_response")) - message = self.build_repair_tool_message(response.get("repair_tracker_response")) + message = create_repair_message_from_response(response) return message @@ -466,7 +469,7 @@ def fix(self) -> RepairToolMessage: else: parent_design._update_from_tracker(response.get("tracker_response")) - message = self.build_repair_tool_message(response.get("repair_tracker_response")) + message = create_repair_message_from_response(response) return message @@ -520,7 +523,7 @@ def fix(self) -> RepairToolMessage: else: parent_design._update_from_tracker(response.get("tracker_response")) - message = self.build_repair_tool_message(response.get("repair_tracker_response")) + message = create_repair_message_from_response(response) return message @@ -569,7 +572,7 @@ def fix(self) -> RepairToolMessage: else: parent_design._update_from_tracker(response.get("tracker_response")) - message = self.build_repair_tool_message(response.get("repair_tracker_response")) + message = create_repair_message_from_response(response) return message @@ -625,7 +628,7 @@ def fix(self) -> RepairToolMessage: ## The tool does not return the created or modified objects. ## https://github.com/ansys/pyansys-geometry/issues/1319 - message = RepairToolMessage(response.get("repair_tracker_response").get("success"), [], []) + message = RepairToolMessage(response.get("success"), [], []) return message diff --git a/src/ansys/geometry/core/tools/repair_tool_message.py b/src/ansys/geometry/core/tools/repair_tool_message.py index ea1725a2bb..ca52e6cd90 100644 --- a/src/ansys/geometry/core/tools/repair_tool_message.py +++ b/src/ansys/geometry/core/tools/repair_tool_message.py @@ -92,3 +92,26 @@ def found(self) -> int: def repaired(self) -> int: """Number of problem areas repaired during the repair operation.""" return self._repaired + + +def create_repair_message_from_response(response) -> "RepairToolMessage": + """Create a RepairToolMessage from a serialized response. + + Parameters + ---------- + response : serialized response + The serialized response object containing repair tool information. + + Returns + ------- + RepairToolMessage + An instance of RepairToolMessage populated with data from the response. + """ + return RepairToolMessage( + success=response.get("success"), + created_bodies=response.get("created_bodies_monikers", []), + modified_bodies=response.get("modified_bodies_monikers", []), + deleted_bodies=response.get("deleted_bodies_monikers", []), + found=response.get("found", -1), + repaired=response.get("repaired", -1), + ) diff --git a/src/ansys/geometry/core/tools/repair_tools.py b/src/ansys/geometry/core/tools/repair_tools.py index 92a4daee65..2a76abd612 100644 --- a/src/ansys/geometry/core/tools/repair_tools.py +++ b/src/ansys/geometry/core/tools/repair_tools.py @@ -53,7 +53,10 @@ StitchFaceProblemAreas, UnsimplifiedFaceProblemAreas, ) -from ansys.geometry.core.tools.repair_tool_message import RepairToolMessage +from ansys.geometry.core.tools.repair_tool_message import ( + RepairToolMessage, + create_repair_message_from_response, +) from ansys.geometry.core.typing import Real if TYPE_CHECKING: # pragma: no cover @@ -586,10 +589,10 @@ def find_and_fix_short_edges( if not pyansys_geometry.USE_TRACKER_TO_UPDATE_DESIGN: parent_design._update_design_inplace() else: - parent_design._update_from_tracker(response["complete_command_response"]) + parent_design._update_from_tracker(response["tracker_response"]) # Build the response message - return self.__build_repair_tool_message(response) + return create_repair_message_from_response(response) @min_backend_version(25, 2, 0) def find_and_fix_extra_edges( @@ -638,10 +641,10 @@ def find_and_fix_extra_edges( if not pyansys_geometry.USE_TRACKER_TO_UPDATE_DESIGN: parent_design._update_design_inplace() else: - parent_design._update_from_tracker(response["complete_command_response"]) + parent_design._update_from_tracker(response["tracker_response"]) # Build the response message - return self.__build_repair_tool_message(response) + return create_repair_message_from_response(response) @min_backend_version(25, 2, 0) def find_and_fix_split_edges( @@ -707,10 +710,10 @@ def find_and_fix_split_edges( if not pyansys_geometry.USE_TRACKER_TO_UPDATE_DESIGN: parent_design._update_design_inplace() else: - parent_design._update_from_tracker(response["complete_command_response"]) + parent_design._update_from_tracker(response["tracker_response"]) # Build the response message - return self.__build_repair_tool_message(response) + return create_repair_message_from_response(response) @min_backend_version(25, 2, 0) def find_and_fix_simplify( @@ -760,10 +763,10 @@ def find_and_fix_simplify( if not pyansys_geometry.USE_TRACKER_TO_UPDATE_DESIGN: parent_design._update_design_inplace() else: - parent_design._update_from_tracker(response["complete_command_response"]) + parent_design._update_from_tracker(response["tracker_response"]) # Build the response message - return self.__build_repair_tool_message(response) + return create_repair_message_from_response(response) @min_backend_version(25, 2, 0) def find_and_fix_stitch_faces( @@ -834,10 +837,10 @@ def find_and_fix_stitch_faces( if not pyansys_geometry.USE_TRACKER_TO_UPDATE_DESIGN: parent_design._update_design_inplace() else: - parent_design._update_from_tracker(response["complete_command_response"]) + parent_design._update_from_tracker(response["tracker_response"]) # Build the response message - return self.__build_repair_tool_message(response) + return create_repair_message_from_response(response) @min_backend_version(25, 2, 0) def inspect_geometry(self, bodies: list["Body"] = None) -> list[InspectResult]: @@ -929,26 +932,4 @@ def repair_geometry(self, bodies: list["Body"] = None) -> RepairToolMessage: body_ids=[] if bodies is None else [b.id for b in bodies], ) - return self.__build_repair_tool_message(response) - - def __build_repair_tool_message(self, response: dict) -> RepairToolMessage: - """Build a repair tool message from the service response. - - Parameters - ---------- - response : dict - The response from the service containing information about the repair operation. - - Returns - ------- - RepairToolMessage - A message containing the success status, created bodies, modified bodies, - number of found problem areas, and number of repaired problem areas. - """ - return RepairToolMessage( - success=response.get("success"), - created_bodies=response.get("created_bodies_monikers", []), - modified_bodies=response.get("modified_bodies_monikers", []), - found=response.get("found", -1), - repaired=response.get("repaired", -1), - ) + return create_repair_message_from_response(response) From 5b3aaa5120cd885ed2dfe734bcd47dd8ea713b0b Mon Sep 17 00:00:00 2001 From: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> Date: Wed, 3 Dec 2025 04:03:21 +0000 Subject: [PATCH 03/16] chore: adding changelog file 2441.maintenance.md [dependabot-skip] --- doc/changelog.d/2441.maintenance.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/changelog.d/2441.maintenance.md diff --git a/doc/changelog.d/2441.maintenance.md b/doc/changelog.d/2441.maintenance.md new file mode 100644 index 0000000000..c20029f40a --- /dev/null +++ b/doc/changelog.d/2441.maintenance.md @@ -0,0 +1 @@ +V1 implementation of repair stubs From 68dacd870a1252328f16902917eb38bf447a5a69 Mon Sep 17 00:00:00 2001 From: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> Date: Wed, 3 Dec 2025 19:40:27 +0000 Subject: [PATCH 04/16] chore: adding changelog file 2441.maintenance.md [dependabot-skip] --- doc/changelog.d/2441.maintenance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/changelog.d/2441.maintenance.md b/doc/changelog.d/2441.maintenance.md index c20029f40a..5358bcfe36 100644 --- a/doc/changelog.d/2441.maintenance.md +++ b/doc/changelog.d/2441.maintenance.md @@ -1 +1 @@ -V1 implementation of repair stubs +Chore: v1 implementation of repair stubs From 659dc431abda1f72dff321152125a90894ce92f8 Mon Sep 17 00:00:00 2001 From: smereu Date: Wed, 3 Dec 2025 15:11:16 -0600 Subject: [PATCH 05/16] code review --- .../core/_grpc/_services/v0/repair_tools.py | 48 +------------------ .../core/_grpc/_services/v1/conversions.py | 12 ++--- .../core/_grpc/_services/v1/repair_tools.py | 41 +++++++--------- 3 files changed, 25 insertions(+), 76 deletions(-) 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 0c20b0272c..77447d675e 100644 --- a/src/ansys/geometry/core/_grpc/_services/v0/repair_tools.py +++ b/src/ansys/geometry/core/_grpc/_services/v0/repair_tools.py @@ -19,12 +19,7 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -"""Module containing the repair tools service implementation for v0. - -This module defines an abstract base class for a gRPC-based repair tools service. -The class provides a set of abstract methods for identifying and repairing various -geometry issues, such as split edges, extra edges, duplicate faces etc. -""" +"""Module containing the repair tools service implementation for v0.""" from google.protobuf.wrappers_pb2 import Int32Value import grpc @@ -184,27 +179,11 @@ def find_missing_faces(self, **kwargs) -> dict: # noqa: D102 from ansys.api.geometry.v0.repairtools_pb2 import FindMissingFacesRequest from google.protobuf.wrappers_pb2 import DoubleValue - from ansys.geometry.core.logger import LOG - from ..base.conversions import ( from_measurement_to_server_angle, from_measurement_to_server_length, ) - # Check the backend version to set optional parameters - if kwargs["backend_version"] < (26, 1, 0) and ( - kwargs["angle"] is not None or kwargs["distance"] is not None - ): - # If the backend version is less than 26.1.0, set angle and distance to None - kwargs["angle"] = None - kwargs["distance"] = None - - # Log a warning - LOG.warning( - "The backend version is less than 26.1.0, so angle and distance parameters will be" - "ignored. Please update the backend to use these parameters." - ) - # Create the request - assumes all inputs are valid and of the proper type request = FindMissingFacesRequest( faces=kwargs["faces"], @@ -235,27 +214,11 @@ def find_small_faces(self, **kwargs) -> dict: # noqa: D102 from ansys.api.geometry.v0.repairtools_pb2 import FindSmallFacesRequest from google.protobuf.wrappers_pb2 import DoubleValue - from ansys.geometry.core.logger import LOG - from ..base.conversions import ( from_measurement_to_server_area, from_measurement_to_server_length, ) - # Check the backend version to set optional parameters - if kwargs["backend_version"] < (26, 1, 0) and ( - kwargs["area"] is not None or kwargs["width"] is not None - ): - # If the backend version is less than 26.1.0, set area and width to None - kwargs["area"] = None - kwargs["width"] = None - - # Log a warning - LOG.warning( - "The backend version is less than 26.1.0, so area and width parameters will be" - "ignored. Please update the backend to use these parameters." - ) - # Create the request - assumes all inputs are valid and of the proper type request = FindSmallFacesRequest( selection=kwargs["selection"], @@ -286,17 +249,8 @@ def find_stitch_faces(self, **kwargs) -> dict: # noqa: D102 from ansys.api.geometry.v0.repairtools_pb2 import FindStitchFacesRequest from google.protobuf.wrappers_pb2 import DoubleValue - from ansys.geometry.core.logger import LOG - from ..base.conversions import from_measurement_to_server_length - if kwargs["backend_version"] < (26, 1, 0) and kwargs["distance"] is not None: - # If the backend version is less than 26.1.0, set distance to None and log warning - kwargs["distance"] = None - LOG.warning( - "The backend version is less than 26.1.0, so distance parameter will be ignored. " - ) - # Create the request - assumes all inputs are valid and of the proper type request = FindStitchFacesRequest( faces=kwargs["faces"], diff --git a/src/ansys/geometry/core/_grpc/_services/v1/conversions.py b/src/ansys/geometry/core/_grpc/_services/v1/conversions.py index 40ab410d6e..34ad302d36 100644 --- a/src/ansys/geometry/core/_grpc/_services/v1/conversions.py +++ b/src/ansys/geometry/core/_grpc/_services/v1/conversions.py @@ -1646,8 +1646,8 @@ def response_problem_area_for_body(response) -> dict: return { "problems": [ { - "id": res.id, - "bodies": res.body_monikers, + "id": res.problem_area_id, + "bodies": res.body_ids.id, } for res in response.result ] @@ -1670,8 +1670,8 @@ def response_problem_area_for_face(response) -> dict: return { "problems": [ { - "id": res.id, - "faces": res.face_monikers, + "id": res.problem_area_id, + "faces": res.face_ids.id, } for res in response.result ] @@ -1694,8 +1694,8 @@ def response_problem_area_for_edge(response) -> dict: return { "problems": [ { - "id": res.id, - "edges": res.edge_monikers, + "id": res.problem_area_id, + "edges": res.edge_ids.id, } for res in response.result ] diff --git a/src/ansys/geometry/core/_grpc/_services/v1/repair_tools.py b/src/ansys/geometry/core/_grpc/_services/v1/repair_tools.py index 3a57133c51..1e88aee205 100644 --- a/src/ansys/geometry/core/_grpc/_services/v1/repair_tools.py +++ b/src/ansys/geometry/core/_grpc/_services/v1/repair_tools.py @@ -19,15 +19,11 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -"""Module containing the repair tools service implementation for v1. - -This module defines an abstract base class for a gRPC-based repair tools service. -The class provides a set of abstract methods for identifying and repairing various -geometry issues, such as split edges, extra edges, duplicate faces etc. -""" +"""Module containing the repair tools service implementation for v1.""" import grpc +from ansys.geometry.core._grpc._services.v0.conversions import build_grpc_id from ansys.geometry.core.errors import protect_grpc from ..base.repair_tools import GRPCRepairToolsService @@ -67,7 +63,7 @@ def find_split_edges(self, **kwargs) -> dict: # noqa: D102 # Create the request - assumes all inputs are valid and of the proper type request = FindSplitEdgesRequest( - bodies_or_faces_ids=kwargs["bodies_or_faces"], + bodies_or_faces_ids=build_grpc_id(kwargs["bodies_or_faces"]), angle=( from_angle_to_grpc_quantity(kwargs["angle"]) if kwargs["angle"] is not None @@ -90,7 +86,7 @@ def find_extra_edges(self, **kwargs) -> dict: # noqa: D102 from ansys.api.discovery.v1.operations.repair_pb2 import FindExtraEdgesRequest # Create the request - assumes all inputs are valid and of the proper type - request = FindExtraEdgesRequest(selection_id=kwargs["selection"]) + request = FindExtraEdgesRequest(selection_id=build_grpc_id(kwargs["selection"])) # Return the response - formatted as a dictionary response = self.stub.FindExtraEdges(request) @@ -103,7 +99,7 @@ def find_inexact_edges(self, **kwargs) -> dict: # noqa: D102 from ansys.api.discovery.v1.operations.repair_pb2 import FindInexactEdgesRequest # Create the request - assumes all inputs are valid and of the proper type - request = FindInexactEdgesRequest(selection_id=kwargs["selection"]) + request = FindInexactEdgesRequest(selection_id=build_grpc_id(kwargs["selection"])) # Call the gRPC service response = self.stub.FindInexactEdges(request) @@ -131,7 +127,7 @@ def find_duplicate_faces(self, **kwargs) -> dict: # noqa: D102 from ansys.api.discovery.v1.operations.repair_pb2 import FindDuplicateFacesRequest # Create the request - assumes all inputs are valid and of the proper type - request = FindDuplicateFacesRequest(face_ids=kwargs["faces"]) + request = FindDuplicateFacesRequest(face_ids=build_grpc_id(kwargs["faces"])) # Call the gRPC service response = self.stub.FindDuplicateFaces(request) @@ -147,7 +143,6 @@ def find_missing_faces(self, **kwargs) -> dict: # noqa: D102 # Check the backend version to set optional parameters if kwargs["angle"] is not None or kwargs["distance"] is not None: - # If the backend version is less than 26.1.0, set angle and distance to None kwargs["angle"] = None kwargs["distance"] = None @@ -159,7 +154,7 @@ def find_missing_faces(self, **kwargs) -> dict: # noqa: D102 # Create the request - assumes all inputs are valid and of the proper type request = FindMissingFacesRequest( - face_ids=kwargs["faces"], + face_ids=build_grpc_id(kwargs["faces"]), angle=from_angle_to_grpc_quantity(kwargs["angle"]) if kwargs["angle"] is not None else None, @@ -194,7 +189,7 @@ def find_small_faces(self, **kwargs) -> dict: # noqa: D102 # Create the request - assumes all inputs are valid and of the proper type request = FindSmallFacesRequest( - selection_id=kwargs["selection"], + selection_id=build_grpc_id(kwargs["selection"]), area=from_area_to_grpc_quantity(kwargs["area"]) if kwargs["area"] is not None else None, width=from_length_to_grpc_quantity(kwargs["width"]) if kwargs["width"] is not None @@ -217,7 +212,7 @@ def find_stitch_faces(self, **kwargs) -> dict: # noqa: D102 # Create the request - assumes all inputs are valid and of the proper type request = FindStitchFacesRequest( - face_ids=kwargs["faces"], + face_ids=build_grpc_id(kwargs["faces"]), maximum_distance=from_length_to_grpc_quantity(kwargs["distance"]) if kwargs["distance"] is not None else None, @@ -234,7 +229,7 @@ def find_simplify(self, **kwargs) -> dict: # noqa: D102 from ansys.api.discovery.v1.operations.repair_pb2 import FindAdjustSimplifyRequest # Create the request - assumes all inputs are valid and of the proper type - request = FindAdjustSimplifyRequest(selection_id=kwargs["selection"]) + request = FindAdjustSimplifyRequest(selection_id=build_grpc_id(kwargs["selection"])) # Call the gRPC service response = self.stub.FindAdjustSimplify(request) @@ -249,7 +244,7 @@ def find_interferences(self, **kwargs) -> dict: # noqa: D102 # Create the request - assumes all inputs are valid and of the proper type request = FindInterferenceRequest( - bodY_ids=kwargs["bodies"], + bodY_ids=build_grpc_id(kwargs["bodies"]), cut_smaller_body=BoolValue(value=kwargs["cut_smaller_body"]), ) @@ -265,7 +260,7 @@ def find_and_fix_short_edges(self, **kwargs): # noqa: D102 # Create the request - assumes all inputs are valid and of the proper type request = FindShortEdgesRequest( - selection_id=kwargs["selection"], + selection_id=build_grpc_id(kwargs["selection"]), max_edge_length=from_length_to_grpc_quantity(kwargs["length"]), comprehensive=kwargs["comprehensive_result"], ) @@ -281,7 +276,7 @@ def find_and_fix_extra_edges(self, **kwargs) -> dict: # noqa: D102 # Create the request - assumes all inputs are valid and of the proper type request = FindExtraEdgesRequest( - selection_id=kwargs["selection"], + selection_id=build_grpc_id(kwargs["selection"]), comprehensive=kwargs["comprehensive_result"], ) @@ -296,7 +291,7 @@ def find_and_fix_split_edges(self, **kwargs) -> dict: # noqa: D102 # Create the request - assumes all inputs are valid and of the proper type request = FindSplitEdgesRequest( - body_or_face_ids=kwargs["bodies_or_faces"], + body_or_face_ids=build_grpc_id(kwargs["bodies_or_faces"]), distance=from_length_to_grpc_quantity(kwargs["length"]), comprehensive=kwargs["comprehensive_result"], ) @@ -312,7 +307,7 @@ def find_and_fix_simplify(self, **kwargs) -> dict: # noqa: D102 # Create the request - assumes all inputs are valid and of the proper type request = FindAdjustSimplifyRequest( - selection_id=kwargs["selection"], + selection_id=build_grpc_id(kwargs["selection"]), comprehensive=kwargs["comprehensive_result"], ) @@ -328,7 +323,7 @@ def find_and_fix_stitch_faces(self, **kwargs) -> dict: # noqa: D102 # Create the request - assumes all inputs are valid and of the proper type request = FindStitchFacesRequest( - face_ids=kwargs["body_ids"], + face_ids=build_grpc_id(kwargs["body_ids"]), maximum_distance=from_length_to_grpc_quantity(kwargs["max_distance"]) if kwargs["max_distance"] is not None else None, @@ -348,7 +343,7 @@ def inspect_geometry(self, **kwargs) -> dict: # noqa: D102 from ansys.api.discovery.v1.operations.repair_pb2 import InspectGeometryRequest # Create the request - assumes all inputs are valid and of the proper type - request = InspectGeometryRequest(body_ids=kwargs.get("bodies", [])) + request = InspectGeometryRequest(body_ids=build_grpc_id(kwargs.get("bodies"))) # Call the gRPC service inspect_result_response = self.stub.InspectGeometry(request) @@ -361,7 +356,7 @@ def repair_geometry(self, **kwargs) -> dict: # noqa: D102 from ansys.api.discovery.v1.operations.repair_pb2 import RepairGeometryRequest # Create the request - assumes all inputs are valid and of the proper type - request = RepairGeometryRequest(body_ids=kwargs.get("bodies", [])) + request = RepairGeometryRequest(body_ids=build_grpc_id(kwargs.get("bodies"))) # Call the gRPC service response = self.stub.RepairGeometry(request) From 3f13da17099b1467aef8b52952d92bdda4588e78 Mon Sep 17 00:00:00 2001 From: smereu Date: Wed, 3 Dec 2025 16:01:56 -0600 Subject: [PATCH 06/16] clean_up from copilot --- .../core/_grpc/_services/v1/repair_tools.py | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/ansys/geometry/core/_grpc/_services/v1/repair_tools.py b/src/ansys/geometry/core/_grpc/_services/v1/repair_tools.py index 1e88aee205..d4ecfbe927 100644 --- a/src/ansys/geometry/core/_grpc/_services/v1/repair_tools.py +++ b/src/ansys/geometry/core/_grpc/_services/v1/repair_tools.py @@ -23,11 +23,11 @@ import grpc -from ansys.geometry.core._grpc._services.v0.conversions import build_grpc_id from ansys.geometry.core.errors import protect_grpc from ..base.repair_tools import GRPCRepairToolsService from .conversions import ( + build_grpc_id, from_angle_to_grpc_quantity, from_area_to_grpc_quantity, from_length_to_grpc_quantity, @@ -63,7 +63,7 @@ def find_split_edges(self, **kwargs) -> dict: # noqa: D102 # Create the request - assumes all inputs are valid and of the proper type request = FindSplitEdgesRequest( - bodies_or_faces_ids=build_grpc_id(kwargs["bodies_or_faces"]), + bodies_or_faces_ids=[build_grpc_id(item) for item in kwargs["bodies_or_faces"]], angle=( from_angle_to_grpc_quantity(kwargs["angle"]) if kwargs["angle"] is not None @@ -86,7 +86,7 @@ def find_extra_edges(self, **kwargs) -> dict: # noqa: D102 from ansys.api.discovery.v1.operations.repair_pb2 import FindExtraEdgesRequest # Create the request - assumes all inputs are valid and of the proper type - request = FindExtraEdgesRequest(selection_id=build_grpc_id(kwargs["selection"])) + request = FindExtraEdgesRequest(selection_id=[build_grpc_id(item) for item in kwargs["selection"]]) # Return the response - formatted as a dictionary response = self.stub.FindExtraEdges(request) @@ -99,7 +99,7 @@ def find_inexact_edges(self, **kwargs) -> dict: # noqa: D102 from ansys.api.discovery.v1.operations.repair_pb2 import FindInexactEdgesRequest # Create the request - assumes all inputs are valid and of the proper type - request = FindInexactEdgesRequest(selection_id=build_grpc_id(kwargs["selection"])) + request = FindInexactEdgesRequest(selection_id=[build_grpc_id(item) for item in kwargs["selection"]]) # Call the gRPC service response = self.stub.FindInexactEdges(request) @@ -113,7 +113,7 @@ def find_short_edges(self, **kwargs) -> dict: # noqa: D102 # Create the request - assumes all inputs are valid and of the proper type request = FindShortEdgesRequest( - selection_id=kwargs["selection"], + selection_id=[build_grpc_id(item) for item in kwargs["selection"]], max_edge_length=from_length_to_grpc_quantity(kwargs["length"]), ) @@ -127,7 +127,7 @@ def find_duplicate_faces(self, **kwargs) -> dict: # noqa: D102 from ansys.api.discovery.v1.operations.repair_pb2 import FindDuplicateFacesRequest # Create the request - assumes all inputs are valid and of the proper type - request = FindDuplicateFacesRequest(face_ids=build_grpc_id(kwargs["faces"])) + request = FindDuplicateFacesRequest(face_ids=[build_grpc_id(face) for face in kwargs["faces"]]) # Call the gRPC service response = self.stub.FindDuplicateFaces(request) @@ -154,7 +154,7 @@ def find_missing_faces(self, **kwargs) -> dict: # noqa: D102 # Create the request - assumes all inputs are valid and of the proper type request = FindMissingFacesRequest( - face_ids=build_grpc_id(kwargs["faces"]), + face_ids=[build_grpc_id(face) for face in kwargs["faces"]], angle=from_angle_to_grpc_quantity(kwargs["angle"]) if kwargs["angle"] is not None else None, @@ -189,7 +189,7 @@ def find_small_faces(self, **kwargs) -> dict: # noqa: D102 # Create the request - assumes all inputs are valid and of the proper type request = FindSmallFacesRequest( - selection_id=build_grpc_id(kwargs["selection"]), + selection_id=[build_grpc_id(item) for item in kwargs["selection"]], area=from_area_to_grpc_quantity(kwargs["area"]) if kwargs["area"] is not None else None, width=from_length_to_grpc_quantity(kwargs["width"]) if kwargs["width"] is not None @@ -212,7 +212,7 @@ def find_stitch_faces(self, **kwargs) -> dict: # noqa: D102 # Create the request - assumes all inputs are valid and of the proper type request = FindStitchFacesRequest( - face_ids=build_grpc_id(kwargs["faces"]), + face_ids=[build_grpc_id(face) for face in kwargs["faces"]], maximum_distance=from_length_to_grpc_quantity(kwargs["distance"]) if kwargs["distance"] is not None else None, @@ -229,7 +229,7 @@ def find_simplify(self, **kwargs) -> dict: # noqa: D102 from ansys.api.discovery.v1.operations.repair_pb2 import FindAdjustSimplifyRequest # Create the request - assumes all inputs are valid and of the proper type - request = FindAdjustSimplifyRequest(selection_id=build_grpc_id(kwargs["selection"])) + request = FindAdjustSimplifyRequest(selection_id=[build_grpc_id(item) for item in kwargs["selection"]]) # Call the gRPC service response = self.stub.FindAdjustSimplify(request) @@ -244,7 +244,7 @@ def find_interferences(self, **kwargs) -> dict: # noqa: D102 # Create the request - assumes all inputs are valid and of the proper type request = FindInterferenceRequest( - bodY_ids=build_grpc_id(kwargs["bodies"]), + bodY_ids=[build_grpc_id(body) for body in kwargs["bodies"]], cut_smaller_body=BoolValue(value=kwargs["cut_smaller_body"]), ) @@ -260,7 +260,7 @@ def find_and_fix_short_edges(self, **kwargs): # noqa: D102 # Create the request - assumes all inputs are valid and of the proper type request = FindShortEdgesRequest( - selection_id=build_grpc_id(kwargs["selection"]), + selection_id=[build_grpc_id(item) for item in kwargs["selection"]], max_edge_length=from_length_to_grpc_quantity(kwargs["length"]), comprehensive=kwargs["comprehensive_result"], ) @@ -276,7 +276,7 @@ def find_and_fix_extra_edges(self, **kwargs) -> dict: # noqa: D102 # Create the request - assumes all inputs are valid and of the proper type request = FindExtraEdgesRequest( - selection_id=build_grpc_id(kwargs["selection"]), + selection_id=[build_grpc_id(item) for item in kwargs["selection"]], comprehensive=kwargs["comprehensive_result"], ) @@ -291,7 +291,7 @@ def find_and_fix_split_edges(self, **kwargs) -> dict: # noqa: D102 # Create the request - assumes all inputs are valid and of the proper type request = FindSplitEdgesRequest( - body_or_face_ids=build_grpc_id(kwargs["bodies_or_faces"]), + body_or_face_ids=[build_grpc_id(item) for item in kwargs["bodies_or_faces"]], distance=from_length_to_grpc_quantity(kwargs["length"]), comprehensive=kwargs["comprehensive_result"], ) @@ -307,7 +307,7 @@ def find_and_fix_simplify(self, **kwargs) -> dict: # noqa: D102 # Create the request - assumes all inputs are valid and of the proper type request = FindAdjustSimplifyRequest( - selection_id=build_grpc_id(kwargs["selection"]), + selection_id=[build_grpc_id(item) for item in kwargs["selection"]], comprehensive=kwargs["comprehensive_result"], ) @@ -323,7 +323,7 @@ def find_and_fix_stitch_faces(self, **kwargs) -> dict: # noqa: D102 # Create the request - assumes all inputs are valid and of the proper type request = FindStitchFacesRequest( - face_ids=build_grpc_id(kwargs["body_ids"]), + face_ids=[build_grpc_id(item) for item in kwargs["body_ids"]], maximum_distance=from_length_to_grpc_quantity(kwargs["max_distance"]) if kwargs["max_distance"] is not None else None, @@ -343,7 +343,7 @@ def inspect_geometry(self, **kwargs) -> dict: # noqa: D102 from ansys.api.discovery.v1.operations.repair_pb2 import InspectGeometryRequest # Create the request - assumes all inputs are valid and of the proper type - request = InspectGeometryRequest(body_ids=build_grpc_id(kwargs.get("bodies"))) + request = InspectGeometryRequest(body_ids=[build_grpc_id(body) for body in kwargs.get("bodies")]) # Call the gRPC service inspect_result_response = self.stub.InspectGeometry(request) @@ -356,7 +356,7 @@ def repair_geometry(self, **kwargs) -> dict: # noqa: D102 from ansys.api.discovery.v1.operations.repair_pb2 import RepairGeometryRequest # Create the request - assumes all inputs are valid and of the proper type - request = RepairGeometryRequest(body_ids=build_grpc_id(kwargs.get("bodies"))) + request = RepairGeometryRequest(body_ids=[build_grpc_id(body) for body in kwargs.get("bodies")]) # Call the gRPC service response = self.stub.RepairGeometry(request) From 7082ad7c098f6dd1b0f0229e3b4c6f8abc242762 Mon Sep 17 00:00:00 2001 From: smereu Date: Wed, 3 Dec 2025 21:19:17 -0600 Subject: [PATCH 07/16] fix error --- src/ansys/geometry/core/_grpc/_services/v1/conversions.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ansys/geometry/core/_grpc/_services/v1/conversions.py b/src/ansys/geometry/core/_grpc/_services/v1/conversions.py index 34ad302d36..46a8e4b450 100644 --- a/src/ansys/geometry/core/_grpc/_services/v1/conversions.py +++ b/src/ansys/geometry/core/_grpc/_services/v1/conversions.py @@ -1647,7 +1647,7 @@ def response_problem_area_for_body(response) -> dict: "problems": [ { "id": res.problem_area_id, - "bodies": res.body_ids.id, + "bodies": res.body_ids } for res in response.result ] @@ -1671,7 +1671,7 @@ def response_problem_area_for_face(response) -> dict: "problems": [ { "id": res.problem_area_id, - "faces": res.face_ids.id, + "faces": res.face_ids } for res in response.result ] @@ -1695,7 +1695,7 @@ def response_problem_area_for_edge(response) -> dict: "problems": [ { "id": res.problem_area_id, - "edges": res.edge_ids.id, + "edges": res.edge_ids } for res in response.result ] From c596a699474ca3c18ff88bc411b0aba12f1637a9 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 4 Dec 2025 03:20:17 +0000 Subject: [PATCH 08/16] chore: auto fixes from pre-commit hooks --- .../core/_grpc/_services/v1/conversions.py | 24 +++---------------- .../core/_grpc/_services/v1/repair_tools.py | 24 ++++++++++++++----- 2 files changed, 21 insertions(+), 27 deletions(-) diff --git a/src/ansys/geometry/core/_grpc/_services/v1/conversions.py b/src/ansys/geometry/core/_grpc/_services/v1/conversions.py index 46a8e4b450..619788a402 100644 --- a/src/ansys/geometry/core/_grpc/_services/v1/conversions.py +++ b/src/ansys/geometry/core/_grpc/_services/v1/conversions.py @@ -1644,13 +1644,7 @@ def response_problem_area_for_body(response) -> dict: A dictionary representation of the ProblemAreaForBody object. """ return { - "problems": [ - { - "id": res.problem_area_id, - "bodies": res.body_ids - } - for res in response.result - ] + "problems": [{"id": res.problem_area_id, "bodies": res.body_ids} for res in response.result] } @@ -1668,13 +1662,7 @@ def response_problem_area_for_face(response) -> dict: A dictionary representation of the ProblemAreaForFace object. """ return { - "problems": [ - { - "id": res.problem_area_id, - "faces": res.face_ids - } - for res in response.result - ] + "problems": [{"id": res.problem_area_id, "faces": res.face_ids} for res in response.result] } @@ -1692,11 +1680,5 @@ def response_problem_area_for_edge(response) -> dict: A dictionary representation of the ProblemAreaForEdge object. """ return { - "problems": [ - { - "id": res.problem_area_id, - "edges": res.edge_ids - } - for res in response.result - ] + "problems": [{"id": res.problem_area_id, "edges": res.edge_ids} for res in response.result] } diff --git a/src/ansys/geometry/core/_grpc/_services/v1/repair_tools.py b/src/ansys/geometry/core/_grpc/_services/v1/repair_tools.py index d4ecfbe927..d3b048b0f5 100644 --- a/src/ansys/geometry/core/_grpc/_services/v1/repair_tools.py +++ b/src/ansys/geometry/core/_grpc/_services/v1/repair_tools.py @@ -86,7 +86,9 @@ def find_extra_edges(self, **kwargs) -> dict: # noqa: D102 from ansys.api.discovery.v1.operations.repair_pb2 import FindExtraEdgesRequest # Create the request - assumes all inputs are valid and of the proper type - request = FindExtraEdgesRequest(selection_id=[build_grpc_id(item) for item in kwargs["selection"]]) + request = FindExtraEdgesRequest( + selection_id=[build_grpc_id(item) for item in kwargs["selection"]] + ) # Return the response - formatted as a dictionary response = self.stub.FindExtraEdges(request) @@ -99,7 +101,9 @@ def find_inexact_edges(self, **kwargs) -> dict: # noqa: D102 from ansys.api.discovery.v1.operations.repair_pb2 import FindInexactEdgesRequest # Create the request - assumes all inputs are valid and of the proper type - request = FindInexactEdgesRequest(selection_id=[build_grpc_id(item) for item in kwargs["selection"]]) + request = FindInexactEdgesRequest( + selection_id=[build_grpc_id(item) for item in kwargs["selection"]] + ) # Call the gRPC service response = self.stub.FindInexactEdges(request) @@ -127,7 +131,9 @@ def find_duplicate_faces(self, **kwargs) -> dict: # noqa: D102 from ansys.api.discovery.v1.operations.repair_pb2 import FindDuplicateFacesRequest # Create the request - assumes all inputs are valid and of the proper type - request = FindDuplicateFacesRequest(face_ids=[build_grpc_id(face) for face in kwargs["faces"]]) + request = FindDuplicateFacesRequest( + face_ids=[build_grpc_id(face) for face in kwargs["faces"]] + ) # Call the gRPC service response = self.stub.FindDuplicateFaces(request) @@ -229,7 +235,9 @@ def find_simplify(self, **kwargs) -> dict: # noqa: D102 from ansys.api.discovery.v1.operations.repair_pb2 import FindAdjustSimplifyRequest # Create the request - assumes all inputs are valid and of the proper type - request = FindAdjustSimplifyRequest(selection_id=[build_grpc_id(item) for item in kwargs["selection"]]) + request = FindAdjustSimplifyRequest( + selection_id=[build_grpc_id(item) for item in kwargs["selection"]] + ) # Call the gRPC service response = self.stub.FindAdjustSimplify(request) @@ -343,7 +351,9 @@ def inspect_geometry(self, **kwargs) -> dict: # noqa: D102 from ansys.api.discovery.v1.operations.repair_pb2 import InspectGeometryRequest # Create the request - assumes all inputs are valid and of the proper type - request = InspectGeometryRequest(body_ids=[build_grpc_id(body) for body in kwargs.get("bodies")]) + request = InspectGeometryRequest( + body_ids=[build_grpc_id(body) for body in kwargs.get("bodies")] + ) # Call the gRPC service inspect_result_response = self.stub.InspectGeometry(request) @@ -356,7 +366,9 @@ def repair_geometry(self, **kwargs) -> dict: # noqa: D102 from ansys.api.discovery.v1.operations.repair_pb2 import RepairGeometryRequest # Create the request - assumes all inputs are valid and of the proper type - request = RepairGeometryRequest(body_ids=[build_grpc_id(body) for body in kwargs.get("bodies")]) + request = RepairGeometryRequest( + body_ids=[build_grpc_id(body) for body in kwargs.get("bodies")] + ) # Call the gRPC service response = self.stub.RepairGeometry(request) From bc61363595d5155905c406cb3c5e7c8b4b3ff520 Mon Sep 17 00:00:00 2001 From: smereu Date: Thu, 4 Dec 2025 13:38:14 -0600 Subject: [PATCH 09/16] fix typos --- .../core/_grpc/_services/v1/repair_tools.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/ansys/geometry/core/_grpc/_services/v1/repair_tools.py b/src/ansys/geometry/core/_grpc/_services/v1/repair_tools.py index d4ecfbe927..c8c7c8a55a 100644 --- a/src/ansys/geometry/core/_grpc/_services/v1/repair_tools.py +++ b/src/ansys/geometry/core/_grpc/_services/v1/repair_tools.py @@ -63,16 +63,15 @@ def find_split_edges(self, **kwargs) -> dict: # noqa: D102 # Create the request - assumes all inputs are valid and of the proper type request = FindSplitEdgesRequest( - bodies_or_faces_ids=[build_grpc_id(item) for item in kwargs["bodies_or_faces"]], - angle=( + body_or_face_ids=[build_grpc_id(item) for item in kwargs["bodies_or_faces"]], + angle= from_angle_to_grpc_quantity(kwargs["angle"]) if kwargs["angle"] is not None - else None - ), - distance=( - from_length_to_grpc_quantity, - (kwargs["distance"]) if kwargs["distance"] is not None else None, - ), + else None, + distance= + from_length_to_grpc_quantity(kwargs["distance"]) + if kwargs["distance"] is not None + else None, ) # Call the gRPC service From dcc902c5f5543ded6a16a8b876ee5ecd5b4837e9 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 4 Dec 2025 19:55:29 +0000 Subject: [PATCH 10/16] chore: auto fixes from pre-commit hooks --- .../core/_grpc/_services/v1/repair_tools.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/ansys/geometry/core/_grpc/_services/v1/repair_tools.py b/src/ansys/geometry/core/_grpc/_services/v1/repair_tools.py index f125f5adaf..9a16cd72fe 100644 --- a/src/ansys/geometry/core/_grpc/_services/v1/repair_tools.py +++ b/src/ansys/geometry/core/_grpc/_services/v1/repair_tools.py @@ -64,14 +64,12 @@ def find_split_edges(self, **kwargs) -> dict: # noqa: D102 # Create the request - assumes all inputs are valid and of the proper type request = FindSplitEdgesRequest( body_or_face_ids=[build_grpc_id(item) for item in kwargs["bodies_or_faces"]], - angle= - from_angle_to_grpc_quantity(kwargs["angle"]) - if kwargs["angle"] is not None - else None, - distance= - from_length_to_grpc_quantity(kwargs["distance"]) - if kwargs["distance"] is not None - else None, + angle=from_angle_to_grpc_quantity(kwargs["angle"]) + if kwargs["angle"] is not None + else None, + distance=from_length_to_grpc_quantity(kwargs["distance"]) + if kwargs["distance"] is not None + else None, ) # Call the gRPC service From 441d85f227d86ad4855dbbf052623875825b7399 Mon Sep 17 00:00:00 2001 From: smereu Date: Thu, 4 Dec 2025 18:09:01 -0600 Subject: [PATCH 11/16] Update conversions.py fix some responses --- src/ansys/geometry/core/_grpc/_services/v1/conversions.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ansys/geometry/core/_grpc/_services/v1/conversions.py b/src/ansys/geometry/core/_grpc/_services/v1/conversions.py index 619788a402..648912ddbb 100644 --- a/src/ansys/geometry/core/_grpc/_services/v1/conversions.py +++ b/src/ansys/geometry/core/_grpc/_services/v1/conversions.py @@ -1613,7 +1613,7 @@ def serialize_repair_command_response(response: GRPCEnhancedRepairToolResponse) A dictionary representation of the EnhancedRepairToolResponse object. """ return { - "success": response.tracked_changes.command_response.success, + "success": response.tracked_command_response.command_response.success, "found": response.found, "repaired": response.repaired, "complete_command_response": serialize_tracked_command_response(response.tracked_changes), @@ -1644,7 +1644,7 @@ def response_problem_area_for_body(response) -> dict: A dictionary representation of the ProblemAreaForBody object. """ return { - "problems": [{"id": res.problem_area_id, "bodies": res.body_ids} for res in response.result] + "problems": [{"id": res.problem_area_id, "bodies": [body.id for body in res.body_ids]} for res in response.result] } @@ -1662,7 +1662,7 @@ def response_problem_area_for_face(response) -> dict: A dictionary representation of the ProblemAreaForFace object. """ return { - "problems": [{"id": res.problem_area_id, "faces": res.face_ids} for res in response.result] + "problems": [{"id": res.problem_area_id, "faces": [face.id for face in res.face_ids]} for res in response.result] } @@ -1680,5 +1680,5 @@ def response_problem_area_for_edge(response) -> dict: A dictionary representation of the ProblemAreaForEdge object. """ return { - "problems": [{"id": res.problem_area_id, "edges": res.edge_ids} for res in response.result] + "problems": [{"id": res.problem_area_id, "edges": [edge.id for edge in res.edge_ids]} for res in response.result] } From d44153ab5ae4a1b01816d5215743c18cd905d1d4 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 5 Dec 2025 00:10:53 +0000 Subject: [PATCH 12/16] chore: auto fixes from pre-commit hooks --- .../core/_grpc/_services/v1/conversions.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/ansys/geometry/core/_grpc/_services/v1/conversions.py b/src/ansys/geometry/core/_grpc/_services/v1/conversions.py index 648912ddbb..58658dce8b 100644 --- a/src/ansys/geometry/core/_grpc/_services/v1/conversions.py +++ b/src/ansys/geometry/core/_grpc/_services/v1/conversions.py @@ -1644,7 +1644,10 @@ def response_problem_area_for_body(response) -> dict: A dictionary representation of the ProblemAreaForBody object. """ return { - "problems": [{"id": res.problem_area_id, "bodies": [body.id for body in res.body_ids]} for res in response.result] + "problems": [ + {"id": res.problem_area_id, "bodies": [body.id for body in res.body_ids]} + for res in response.result + ] } @@ -1662,7 +1665,10 @@ def response_problem_area_for_face(response) -> dict: A dictionary representation of the ProblemAreaForFace object. """ return { - "problems": [{"id": res.problem_area_id, "faces": [face.id for face in res.face_ids]} for res in response.result] + "problems": [ + {"id": res.problem_area_id, "faces": [face.id for face in res.face_ids]} + for res in response.result + ] } @@ -1680,5 +1686,8 @@ def response_problem_area_for_edge(response) -> dict: A dictionary representation of the ProblemAreaForEdge object. """ return { - "problems": [{"id": res.problem_area_id, "edges": [edge.id for edge in res.edge_ids]} for res in response.result] + "problems": [ + {"id": res.problem_area_id, "edges": [edge.id for edge in res.edge_ids]} + for res in response.result + ] } From b3156ed7b8a370add6f31d8deb83db2c618cf0f5 Mon Sep 17 00:00:00 2001 From: smereu Date: Thu, 4 Dec 2025 18:44:47 -0600 Subject: [PATCH 13/16] misc clean-up --- .../core/_grpc/_services/v0/repair_tools.py | 43 ++++++++++++++++++- .../core/_grpc/_services/v1/conversions.py | 15 +++++-- .../core/_grpc/_services/v1/repair_tools.py | 31 ------------- 3 files changed, 53 insertions(+), 36 deletions(-) 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 77447d675e..f2c0bc9d2c 100644 --- a/src/ansys/geometry/core/_grpc/_services/v0/repair_tools.py +++ b/src/ansys/geometry/core/_grpc/_services/v0/repair_tools.py @@ -25,6 +25,7 @@ import grpc from ansys.geometry.core.errors import protect_grpc +from ansys.geometry.core.logger import LOG from ..base.conversions import from_measurement_to_server_angle, from_measurement_to_server_length from ..base.repair_tools import GRPCRepairToolsService @@ -178,12 +179,27 @@ def find_duplicate_faces(self, **kwargs) -> dict: # noqa: D102 def find_missing_faces(self, **kwargs) -> dict: # noqa: D102 from ansys.api.geometry.v0.repairtools_pb2 import FindMissingFacesRequest from google.protobuf.wrappers_pb2 import DoubleValue + from ansys.geometry.core.logger import LOG from ..base.conversions import ( from_measurement_to_server_angle, from_measurement_to_server_length, ) + # Check the backend version to set optional parameters + if kwargs["backend_version"] < (26, 1, 0) and ( + kwargs["angle"] is not None or kwargs["distance"] is not None + ): + # If the backend version is less than 26.1.0, set angle and distance to None + kwargs["angle"] = None + kwargs["distance"] = None + + # Log a warning + LOG.warning( + "The backend version is less than 26.1.0, so angle and distance parameters will be" + "ignored. Please update the backend to use these parameters." + ) + # Create the request - assumes all inputs are valid and of the proper type request = FindMissingFacesRequest( faces=kwargs["faces"], @@ -213,12 +229,27 @@ def find_missing_faces(self, **kwargs) -> dict: # noqa: D102 def find_small_faces(self, **kwargs) -> dict: # noqa: D102 from ansys.api.geometry.v0.repairtools_pb2 import FindSmallFacesRequest from google.protobuf.wrappers_pb2 import DoubleValue + from ansys.geometry.core.logger import LOG from ..base.conversions import ( from_measurement_to_server_area, from_measurement_to_server_length, ) + # Check the backend version to set optional parameters + if kwargs["backend_version"] < (26, 1, 0) and ( + kwargs["area"] is not None or kwargs["width"] is not None + ): + # If the backend version is less than 26.1.0, set area and width to None + kwargs["area"] = None + kwargs["width"] = None + + # Log a warning + LOG.warning( + "The backend version is less than 26.1.0, so area and width parameters will be" + "ignored. Please update the backend to use these parameters." + ) + # Create the request - assumes all inputs are valid and of the proper type request = FindSmallFacesRequest( selection=kwargs["selection"], @@ -248,9 +279,17 @@ def find_small_faces(self, **kwargs) -> dict: # noqa: D102 def find_stitch_faces(self, **kwargs) -> dict: # noqa: D102 from ansys.api.geometry.v0.repairtools_pb2 import FindStitchFacesRequest from google.protobuf.wrappers_pb2 import DoubleValue + from ansys.geometry.core.logger import LOG from ..base.conversions import from_measurement_to_server_length + if kwargs["backend_version"] < (26, 1, 0) and kwargs["distance"] is not None: + # If the backend version is less than 26.1.0, set distance to None and log warning + kwargs["distance"] = None + LOG.warning( + "The backend version is less than 26.1.0, so distance parameter will be ignored. " + ) + # Create the request - assumes all inputs are valid and of the proper type request = FindStitchFacesRequest( faces=kwargs["faces"], @@ -476,7 +515,7 @@ def inspect_geometry(self, **kwargs) -> dict: # noqa: D102 from ansys.api.geometry.v0.repairtools_pb2 import InspectGeometryRequest # Create the request - assumes all inputs are valid and of the proper type - request = InspectGeometryRequest(bodies=kwargs.get("bodies", [])) + request = InspectGeometryRequest(bodies=kwargs.get("bodies")) # Call the gRPC service inspect_result_response = self.stub.InspectGeometry(request) @@ -489,7 +528,7 @@ def repair_geometry(self, **kwargs) -> dict: # noqa: D102 from ansys.api.geometry.v0.repairtools_pb2 import RepairGeometryRequest # Create the request - assumes all inputs are valid and of the proper type - request = RepairGeometryRequest(bodies=kwargs.get("bodies", [])) + request = RepairGeometryRequest(bodies=kwargs.get("bodies")) # Call the gRPC service response = self.stub.RepairGeometry(request) diff --git a/src/ansys/geometry/core/_grpc/_services/v1/conversions.py b/src/ansys/geometry/core/_grpc/_services/v1/conversions.py index 648912ddbb..58658dce8b 100644 --- a/src/ansys/geometry/core/_grpc/_services/v1/conversions.py +++ b/src/ansys/geometry/core/_grpc/_services/v1/conversions.py @@ -1644,7 +1644,10 @@ def response_problem_area_for_body(response) -> dict: A dictionary representation of the ProblemAreaForBody object. """ return { - "problems": [{"id": res.problem_area_id, "bodies": [body.id for body in res.body_ids]} for res in response.result] + "problems": [ + {"id": res.problem_area_id, "bodies": [body.id for body in res.body_ids]} + for res in response.result + ] } @@ -1662,7 +1665,10 @@ def response_problem_area_for_face(response) -> dict: A dictionary representation of the ProblemAreaForFace object. """ return { - "problems": [{"id": res.problem_area_id, "faces": [face.id for face in res.face_ids]} for res in response.result] + "problems": [ + {"id": res.problem_area_id, "faces": [face.id for face in res.face_ids]} + for res in response.result + ] } @@ -1680,5 +1686,8 @@ def response_problem_area_for_edge(response) -> dict: A dictionary representation of the ProblemAreaForEdge object. """ return { - "problems": [{"id": res.problem_area_id, "edges": [edge.id for edge in res.edge_ids]} for res in response.result] + "problems": [ + {"id": res.problem_area_id, "edges": [edge.id for edge in res.edge_ids]} + for res in response.result + ] } diff --git a/src/ansys/geometry/core/_grpc/_services/v1/repair_tools.py b/src/ansys/geometry/core/_grpc/_services/v1/repair_tools.py index 9a16cd72fe..c2f784ba2b 100644 --- a/src/ansys/geometry/core/_grpc/_services/v1/repair_tools.py +++ b/src/ansys/geometry/core/_grpc/_services/v1/repair_tools.py @@ -142,19 +142,6 @@ def find_duplicate_faces(self, **kwargs) -> dict: # noqa: D102 def find_missing_faces(self, **kwargs) -> dict: # noqa: D102 from ansys.api.discovery.v1.operations.repair_pb2 import FindMissingFacesRequest - from ansys.geometry.core.logger import LOG - - # Check the backend version to set optional parameters - if kwargs["angle"] is not None or kwargs["distance"] is not None: - kwargs["angle"] = None - kwargs["distance"] = None - - # Log a warning - LOG.warning( - "The backend version is less than 26.1.0, so angle and distance parameters will be" - "ignored. Please update the backend to use these parameters." - ) - # Create the request - assumes all inputs are valid and of the proper type request = FindMissingFacesRequest( face_ids=[build_grpc_id(face) for face in kwargs["faces"]], @@ -176,20 +163,6 @@ def find_missing_faces(self, **kwargs) -> dict: # noqa: D102 def find_small_faces(self, **kwargs) -> dict: # noqa: D102 from ansys.api.discovery.v1.operations.repair_pb2 import FindSmallFacesRequest - from ansys.geometry.core.logger import LOG - - # Check the backend version to set optional parameters - if kwargs["area"] is not None or kwargs["width"] is not None: - # If the backend version is less than 26.1.0, set area and width to None - kwargs["area"] = None - kwargs["width"] = None - - # Log a warning - LOG.warning( - "The backend version is less than 26.1.0, so area and width parameters will be" - "ignored. Please update the backend to use these parameters." - ) - # Create the request - assumes all inputs are valid and of the proper type request = FindSmallFacesRequest( selection_id=[build_grpc_id(item) for item in kwargs["selection"]], @@ -209,10 +182,6 @@ def find_small_faces(self, **kwargs) -> dict: # noqa: D102 def find_stitch_faces(self, **kwargs) -> dict: # noqa: D102 from ansys.api.discovery.v1.operations.repair_pb2 import FindStitchFacesRequest - if kwargs["distance"] is not None: - # If the backend version is less than 26.1.0, set distance to None and log warning - kwargs["distance"] = None - # Create the request - assumes all inputs are valid and of the proper type request = FindStitchFacesRequest( face_ids=[build_grpc_id(face) for face in kwargs["faces"]], From 6add48c299e15be14cb0554d06b7add3a63407ca Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 5 Dec 2025 00:45:21 +0000 Subject: [PATCH 14/16] chore: auto fixes from pre-commit hooks --- src/ansys/geometry/core/_grpc/_services/v0/repair_tools.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) 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 f2c0bc9d2c..476267f541 100644 --- a/src/ansys/geometry/core/_grpc/_services/v0/repair_tools.py +++ b/src/ansys/geometry/core/_grpc/_services/v0/repair_tools.py @@ -179,7 +179,6 @@ def find_duplicate_faces(self, **kwargs) -> dict: # noqa: D102 def find_missing_faces(self, **kwargs) -> dict: # noqa: D102 from ansys.api.geometry.v0.repairtools_pb2 import FindMissingFacesRequest from google.protobuf.wrappers_pb2 import DoubleValue - from ansys.geometry.core.logger import LOG from ..base.conversions import ( from_measurement_to_server_angle, @@ -199,7 +198,7 @@ def find_missing_faces(self, **kwargs) -> dict: # noqa: D102 "The backend version is less than 26.1.0, so angle and distance parameters will be" "ignored. Please update the backend to use these parameters." ) - + # Create the request - assumes all inputs are valid and of the proper type request = FindMissingFacesRequest( faces=kwargs["faces"], @@ -229,7 +228,6 @@ def find_missing_faces(self, **kwargs) -> dict: # noqa: D102 def find_small_faces(self, **kwargs) -> dict: # noqa: D102 from ansys.api.geometry.v0.repairtools_pb2 import FindSmallFacesRequest from google.protobuf.wrappers_pb2 import DoubleValue - from ansys.geometry.core.logger import LOG from ..base.conversions import ( from_measurement_to_server_area, @@ -279,7 +277,6 @@ def find_small_faces(self, **kwargs) -> dict: # noqa: D102 def find_stitch_faces(self, **kwargs) -> dict: # noqa: D102 from ansys.api.geometry.v0.repairtools_pb2 import FindStitchFacesRequest from google.protobuf.wrappers_pb2 import DoubleValue - from ansys.geometry.core.logger import LOG from ..base.conversions import from_measurement_to_server_length From 432c223fea1b5c0d8fb7560268ffb10519ce3eb7 Mon Sep 17 00:00:00 2001 From: smereu Date: Thu, 4 Dec 2025 18:46:51 -0600 Subject: [PATCH 15/16] misc clean-up --- src/ansys/geometry/core/_grpc/_services/v0/repair_tools.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 f2c0bc9d2c..7cf553da3f 100644 --- a/src/ansys/geometry/core/_grpc/_services/v0/repair_tools.py +++ b/src/ansys/geometry/core/_grpc/_services/v0/repair_tools.py @@ -25,7 +25,6 @@ import grpc from ansys.geometry.core.errors import protect_grpc -from ansys.geometry.core.logger import LOG from ..base.conversions import from_measurement_to_server_angle, from_measurement_to_server_length from ..base.repair_tools import GRPCRepairToolsService @@ -179,6 +178,7 @@ def find_duplicate_faces(self, **kwargs) -> dict: # noqa: D102 def find_missing_faces(self, **kwargs) -> dict: # noqa: D102 from ansys.api.geometry.v0.repairtools_pb2 import FindMissingFacesRequest from google.protobuf.wrappers_pb2 import DoubleValue + from ansys.geometry.core.logger import LOG from ..base.conversions import ( @@ -229,6 +229,7 @@ def find_missing_faces(self, **kwargs) -> dict: # noqa: D102 def find_small_faces(self, **kwargs) -> dict: # noqa: D102 from ansys.api.geometry.v0.repairtools_pb2 import FindSmallFacesRequest from google.protobuf.wrappers_pb2 import DoubleValue + from ansys.geometry.core.logger import LOG from ..base.conversions import ( @@ -279,6 +280,7 @@ def find_small_faces(self, **kwargs) -> dict: # noqa: D102 def find_stitch_faces(self, **kwargs) -> dict: # noqa: D102 from ansys.api.geometry.v0.repairtools_pb2 import FindStitchFacesRequest from google.protobuf.wrappers_pb2 import DoubleValue + from ansys.geometry.core.logger import LOG from ..base.conversions import from_measurement_to_server_length From 00633fc7e7c0a3bfea3dff04ae6ece51c3b978c0 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 5 Dec 2025 00:49:13 +0000 Subject: [PATCH 16/16] chore: auto fixes from pre-commit hooks --- src/ansys/geometry/core/_grpc/_services/v0/repair_tools.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 66e94670b5..5ab137fc0f 100644 --- a/src/ansys/geometry/core/_grpc/_services/v0/repair_tools.py +++ b/src/ansys/geometry/core/_grpc/_services/v0/repair_tools.py @@ -178,7 +178,7 @@ def find_duplicate_faces(self, **kwargs) -> dict: # noqa: D102 def find_missing_faces(self, **kwargs) -> dict: # noqa: D102 from ansys.api.geometry.v0.repairtools_pb2 import FindMissingFacesRequest from google.protobuf.wrappers_pb2 import DoubleValue - + from ansys.geometry.core.logger import LOG from ..base.conversions import ( @@ -229,7 +229,7 @@ def find_missing_faces(self, **kwargs) -> dict: # noqa: D102 def find_small_faces(self, **kwargs) -> dict: # noqa: D102 from ansys.api.geometry.v0.repairtools_pb2 import FindSmallFacesRequest from google.protobuf.wrappers_pb2 import DoubleValue - + from ansys.geometry.core.logger import LOG from ..base.conversions import ( @@ -280,7 +280,7 @@ def find_small_faces(self, **kwargs) -> dict: # noqa: D102 def find_stitch_faces(self, **kwargs) -> dict: # noqa: D102 from ansys.api.geometry.v0.repairtools_pb2 import FindStitchFacesRequest from google.protobuf.wrappers_pb2 import DoubleValue - + from ansys.geometry.core.logger import LOG from ..base.conversions import from_measurement_to_server_length