Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
97eb31a
chore: update CHANGELOG for v0.9.0 (#1753)
pyansys-ci-bot Feb 17, 2025
1547839
Merge branch 'main' of https://github.com/ansys/pyansys-geometry
smereu Mar 10, 2025
5a48878
Merge branch 'main' of https://github.com/ansys/pyansys-geometry
smereu Mar 27, 2025
4109456
Merge branch 'main' of https://github.com/ansys/pyansys-geometry
smereu Apr 8, 2025
e00316b
Merge branch 'main' of https://github.com/ansys/pyansys-geometry
smereu May 20, 2025
1afa37a
Merge branch 'main' of https://github.com/ansys/pyansys-geometry
smereu Jun 11, 2025
7c595bb
Merge branch 'main' of https://github.com/ansys/pyansys-geometry
smereu Jun 24, 2025
6a23076
Merge branch 'main' of https://github.com/ansys/pyansys-geometry
smereu Jul 7, 2025
62ca792
Merge branch 'main' of https://github.com/ansys/pyansys-geometry
smereu Jul 9, 2025
40c19c1
Merge branch 'main' of https://github.com/ansys/pyansys-geometry
smereu Jul 28, 2025
2952b14
finalize tracker changes for boolean and update from response
smereu Aug 5, 2025
aacd11a
chore: adding changelog file 2153.added.md [dependabot-skip]
pyansys-ci-bot Aug 11, 2025
b3b82b8
Merge branch 'main' into feat/track_boolean_operations
RobPasMue Aug 20, 2025
8344d41
chore: adding changelog file 2153.added.md [dependabot-skip]
pyansys-ci-bot Aug 20, 2025
12b13c0
Merge branch 'main' into feat/track_boolean_operations
jacobrkerstetter Aug 25, 2025
15176d3
Merge branch 'main' into feat/track_boolean_operations
jacobrkerstetter Sep 3, 2025
e172e45
Delete doc/changelog.d/1753.maintenance.md
RobPasMue Sep 3, 2025
1e711f6
fixing some comments
jacobrkerstetter Sep 3, 2025
40a13e2
Merge branch 'main' of https://github.com/ansys/pyansys-geometry
smereu Sep 3, 2025
ee890ad
Merge branch 'main' into feat/track_boolean_operations
jacobrkerstetter Sep 12, 2025
9260268
address some issues with tracking and steps toward complete clean-up
smereu Sep 13, 2025
99d46df
Merge branch 'main' into feat/track_boolean_operations
RobPasMue Sep 13, 2025
269ec5b
Merge branch 'main' of https://github.com/ansys/pyansys-geometry
smereu Sep 22, 2025
eb8c3ca
Merge branch 'main' into feat/track_boolean_operations
smereu Sep 22, 2025
cbc9562
resolve merge conflict + style changes from pre-commit
smereu Sep 23, 2025
652d21d
misc changes for tracker implementation
smereu Sep 24, 2025
234623c
Merge branch 'feat/track_boolean_operations' of https://github.com/an…
smereu Sep 24, 2025
c562347
fix tracker invocation
smereu Sep 24, 2025
6217f4a
Merge branch 'main' of https://github.com/ansys/pyansys-geometry
smereu Sep 24, 2025
9a7b9a8
Merge branch 'main' into feat/track_boolean_operations
smereu Sep 24, 2025
ba707d8
fix response for older versions with no tracker
smereu Sep 24, 2025
32e5b64
fix response for older version with no tracker
smereu Sep 24, 2025
7847f7f
chore: auto fixes from pre-commit hooks
pre-commit-ci[bot] Sep 24, 2025
b7f27c3
Misc. fixes and clean up for problem area
smereu Sep 25, 2025
8c67972
Merge branch 'feat/track_boolean_operations' of https://github.com/an…
smereu Sep 25, 2025
e1529c0
remove unused variable
smereu Sep 25, 2025
39cfe9b
chore: auto fixes from pre-commit hooks
pre-commit-ci[bot] Sep 25, 2025
ecb7d50
fix test failing in old release
smereu Sep 25, 2025
07555f9
Merge branch 'feat/track_boolean_operations' of https://github.com/an…
smereu Sep 25, 2025
7a728c4
Merge branch 'main' of https://github.com/ansys/pyansys-geometry
smereu Sep 25, 2025
3ade945
Merge branch 'main' into feat/track_boolean_operations
smereu Sep 25, 2025
2e8b1ac
clean-up after conflict
smereu Sep 25, 2025
dcb5cfc
chore: auto fixes from pre-commit hooks
pre-commit-ci[bot] Sep 25, 2025
5b955b7
Merge branch 'main' into feat/track_boolean_operations
smereu Sep 25, 2025
db3f278
chore: auto fixes from pre-commit hooks
pre-commit-ci[bot] Sep 25, 2025
47d7166
Merge branch 'main' into feat/track_boolean_operations
jacobrkerstetter Sep 26, 2025
61fec18
fix undefined variable
smereu Sep 29, 2025
1b6ea87
Update component.py
smereu Sep 29, 2025
3594fc4
chore: auto fixes from pre-commit hooks
pre-commit-ci[bot] Sep 29, 2025
62d90b3
proper fix to account for name changes in the file
smereu Sep 29, 2025
e464f5b
Merge branch 'feat/track_boolean_operations' of https://github.com/an…
smereu Sep 29, 2025
bab5a21
chore: auto fixes from pre-commit hooks
pre-commit-ci[bot] Sep 29, 2025
b1744d3
commit to test older version failure
smereu Sep 29, 2025
84b9f79
Merge branch 'feat/track_boolean_operations' of https://github.com/an…
smereu Sep 29, 2025
b02519e
chore: auto fixes from pre-commit hooks
pre-commit-ci[bot] Sep 29, 2025
bea1a3e
consistent use of response success
smereu Sep 30, 2025
a4e2e3e
Merge branch 'feat/track_boolean_operations' of https://github.com/an…
smereu Sep 30, 2025
c38ad19
chore: auto fixes from pre-commit hooks
pre-commit-ci[bot] Sep 30, 2025
6c462de
Merge branch 'main' of https://github.com/ansys/pyansys-geometry
smereu Sep 30, 2025
8234ee1
Merge branch 'main' into feat/track_boolean_operations
smereu Sep 30, 2025
9a35567
fixes after merge conflict
smereu Sep 30, 2025
251dca0
chore: auto fixes from pre-commit hooks
pre-commit-ci[bot] Sep 30, 2025
394a621
Merge branch 'main' into feat/track_boolean_operations
smereu Sep 30, 2025
b84e23c
Remove last direct usage of stubs in problem_areat.py
smereu Oct 1, 2025
8e83861
Merge branch 'feat/track_boolean_operations' of https://github.com/an…
smereu Oct 1, 2025
687fabe
chore: auto fixes from pre-commit hooks
pre-commit-ci[bot] Oct 1, 2025
d99e24f
Merge branch 'main' into feat/track_boolean_operations
RobPasMue Oct 2, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions doc/changelog.d/2153.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Tracking boolean operations
3 changes: 3 additions & 0 deletions src/ansys/geometry/core/_grpc/_services/base/bodies.py
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,9 @@ def boolean(self, **kwargs) -> dict:
pass

@abstractmethod
def combine(self, **kwargs) -> dict:
"""Boolean operation through command."""

def split_body(self, **kwargs) -> dict:
"""Split a body."""
pass
Expand Down
50 changes: 50 additions & 0 deletions src/ansys/geometry/core/_grpc/_services/base/repair_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,3 +128,53 @@ def inspect_geometry(self, **kwargs) -> dict:
def repair_geometry(self, **kwargs) -> dict:
"""Repair the geometry by addressing identified issues."""
pass

@abstractmethod
def fix_duplicate_faces(self, **kwargs) -> dict: # noqa: D102
"""Fix duplicate faces in the geometry."""
pass

@abstractmethod
def fix_missing_faces(self, **kwargs) -> dict: # noqa: D102
"""Fix missing faces in the geometry."""
pass

@abstractmethod
def fix_inexact_edges(self, **kwargs) -> dict: # noqa: D102
"""Fix inexact edges in the geometry."""
pass

@abstractmethod
def fix_extra_edges(self, **kwargs) -> dict: # noqa: D102
"""Fix extra edges in the geometry."""
pass

@abstractmethod
def fix_short_edges(self, **kwargs) -> dict: # noqa: D102
"""Fix short edges in the geometry."""
pass

@abstractmethod
def fix_small_faces(self, **kwargs) -> dict: # noqa: D102
"""Fix small faces in the geometry."""
pass

@abstractmethod
def fix_split_edges(self, **kwargs) -> dict: # noqa: D102
"""Fix split edges in the geometry."""
pass

@abstractmethod
def fix_stitch_faces(self, **kwargs) -> dict: # noqa: D102
"""Fix stitch faces in the geometry."""
pass

@abstractmethod
def fix_unsimplified_faces(self, **kwargs) -> dict: # noqa: D102
"""Fix areas to simplify in the geometry."""
pass

@abstractmethod
def fix_interference(self, **kwargs) -> dict: # noqa: D102
"""Fix interferences in the geometry."""
pass
87 changes: 76 additions & 11 deletions src/ansys/geometry/core/_grpc/_services/v0/bodies.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import grpc
import pint

import ansys.geometry.core as pyansys_geom
from ansys.geometry.core.errors import protect_grpc
from ansys.geometry.core.misc.measurements import DEFAULT_UNITS

Expand All @@ -43,6 +44,7 @@
from_trimmed_curve_to_grpc_trimmed_curve,
from_trimmed_surface_to_grpc_trimmed_surface,
from_unit_vector_to_grpc_direction,
serialize_tracker_command_response,
)


Expand Down Expand Up @@ -714,15 +716,22 @@ def boolean(self, **kwargs) -> dict: # noqa: D102
from ansys.api.geometry.v0.bodies_pb2 import BooleanRequest

# Call the gRPC service and build the requests accordingly
resp = 0
response_success = 0
serialized_tracker_response = {}
try:
resp = self.stub.Boolean(
request=BooleanRequest(
body1=kwargs["target"].id,
tool_bodies=[other.id for other in kwargs["other"]],
method=kwargs["method"],
request = BooleanRequest(
body1=kwargs["target"].id,
tool_bodies=[other.id for other in kwargs["other"]],
method=kwargs["method"],
)
if pyansys_geom.USE_TRACKER_TO_UPDATE_DESIGN:
request.keep_other = kwargs["keep_other"]
resp = self.stub.Boolean(request=request)
response_success = resp.empty_result
if pyansys_geom.USE_TRACKER_TO_UPDATE_DESIGN:
serialized_tracker_response = serialize_tracker_command_response(
response=resp.response
)
).empty_result
except grpc.RpcError as err: # pragma: no cover
# TODO: to be deleted - old versions did not have "tool_bodies" in the request
# This is a temporary fix to support old versions of the server - should be deleted
Expand All @@ -741,26 +750,82 @@ def boolean(self, **kwargs) -> dict: # noqa: D102
all_resp.append(tmp_resp)

if all_resp.count(1) > 0:
resp = 1
response_success = 1
elif len(kwargs["other"]) == 1:
resp = self.stub.Boolean(
request=BooleanRequest(
body1=kwargs["target"].id,
body2=kwargs["other"][0].id,
method=kwargs["method"],
)
).empty_result
)
response_success = resp.empty_result
else:
raise err

if resp == 1:
if response_success == 1:
raise ValueError(
f"Boolean operation of type '{kwargs['method']}' failed: {kwargs['err_msg']}.\n"
f"Involving bodies:{kwargs['target']}, {kwargs['other']}"
)

# Return the response - formatted as a dictionary
return {}
return {"complete_command_response": serialized_tracker_response}

@protect_grpc
def combine(self, **kwargs) -> dict: # noqa: D102
from ansys.api.geometry.v0.bodies_pb2 import (
CombineIntersectBodiesRequest,
CombineMergeBodiesRequest,
)

other_bodies = kwargs["other"]
type_bool_op = kwargs["type_bool_op"]
keep_other = kwargs["keep_other"]

if type_bool_op == "intersect":
body_ids = [body._grpc_id for body in other_bodies]
target_ids = [self._grpc_id]
request = CombineIntersectBodiesRequest(
target_selection=target_ids,
tool_selection=body_ids,
subtract_from_target=False,
keep_cutter=keep_other,
)
response = self._template._commands_stub.CombineIntersectBodies(request)
elif type_bool_op == "subtract":
body_ids = [body._grpc_id for body in other_bodies]
target_ids = [self._grpc_id]
request = CombineIntersectBodiesRequest(
target_selection=target_ids,
tool_selection=body_ids,
subtract_from_target=True,
keep_cutter=keep_other,
)
response = self._template._commands_stub.CombineIntersectBodies(request)
elif type_bool_op == "unite":
bodies = [self]
bodies.extend(other_bodies)
body_ids = [body._grpc_id for body in bodies]
request = CombineMergeBodiesRequest(target_selection=body_ids)
response = self._template._commands_stub.CombineMergeBodies(request)
else:
raise ValueError("Unknown operation requested")
if not response.success:
raise ValueError(
f"Operation of type '{type_bool_op}' failed: {kwargs['err_msg']}.\n"
f"Involving bodies:{self}, {other_bodies}"
)

if not keep_other:
for b in other_bodies:
b.parent_component.delete_body(b)

tracker_response = response.result.complete_command_response
serialized_tracker_response = serialize_tracker_command_response(response=tracker_response)

# Return the response - formatted as a dictionary
return {"complete_command_response": serialized_tracker_response}

@protect_grpc
def split_body(self, **kwargs) -> dict: # noqa: D102
Expand Down
2 changes: 2 additions & 0 deletions src/ansys/geometry/core/_grpc/_services/v0/components.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@ def create(self, **kwargs) -> dict: # noqa: D102
"id": response.component.id,
"name": response.component.name,
"instance_name": response.component.instance_name,
"template": response.template,
"component": response.component,
}

@protect_grpc
Expand Down
52 changes: 52 additions & 0 deletions src/ansys/geometry/core/_grpc/_services/v0/conversions.py
Original file line number Diff line number Diff line change
Expand Up @@ -1329,3 +1329,55 @@ def _check_write_body_facets_input(backend_version: "semver.Version", write_body
+ "26.1.0, but the current version used is "
+ f"{backend_version}."
)


def serialize_tracker_command_response(**kwargs) -> dict:
"""Serialize a TrackerCommandResponse object into a dictionary.

Parameters
----------
response : TrackerCommandResponse
The gRPC TrackerCommandResponse object to serialize.

Returns
-------
dict
A dictionary representation of the TrackerCommandResponse object.
"""

def serialize_body(body):
return {
"id": body.id,
"name": body.name,
"can_suppress": body.can_suppress,
"transform_to_master": {
"m00": body.transform_to_master.m00,
"m11": body.transform_to_master.m11,
"m22": body.transform_to_master.m22,
"m33": body.transform_to_master.m33,
},
"master_id": body.master_id,
"parent_id": body.parent_id,
"is_surface": body.is_surface,
}

def serialize_entity_identifier(entity):
"""Serialize an EntityIdentifier object into a dictionary."""
return {
"id": entity.id,
}

response = kwargs["response"]
return {
"success": response.success,
"created_bodies": [
serialize_body(body) for body in getattr(response, "created_bodies", [])
],
"modified_bodies": [
serialize_body(body) for body in getattr(response, "modified_bodies", [])
],
"deleted_bodies": [
serialize_entity_identifier(entity)
for entity in getattr(response, "deleted_bodies", [])
],
}
Loading
Loading