Skip to content

Commit 69eeee7

Browse files
final commands
1 parent d179f1b commit 69eeee7

File tree

8 files changed

+246
-64
lines changed

8 files changed

+246
-64
lines changed

src/ansys/geometry/core/_grpc/_services/_service.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
from .base.assembly_controls import GRPCAssemblyControlsService
2828
from .base.beams import GRPCBeamsService
2929
from .base.bodies import GRPCBodyService
30+
from .base.commands import GRPCCommandsService
3031
from .base.coordinate_systems import GRPCCoordinateSystemService
3132
from .base.dbuapplication import GRPCDbuApplicationService
3233
from .base.designs import GRPCDesignsService
@@ -85,6 +86,7 @@ def __init__(self, channel: grpc.Channel, version: GeometryApiProtos | str | Non
8586
self._assembly_controls = None
8687
self._beams = None
8788
self._bodies = None
89+
self._commands = None
8890
self._coordinate_systems = None
8991
self._dbu_application = None
9092
self._designs = None
@@ -204,6 +206,32 @@ def bodies(self) -> GRPCBodyService:
204206

205207
return self._bodies
206208

209+
@property
210+
def commands(self) -> GRPCCommandsService:
211+
"""
212+
Get the commands service for the specified version.
213+
214+
Returns
215+
-------
216+
GRPCCommandsService
217+
The commands service for the specified version.
218+
"""
219+
if not self._commands:
220+
# Import the appropriate commands service based on the version
221+
from .v0.commands import GRPCCommandsServiceV0
222+
from .v1.commands import GRPCCommandsServiceV1
223+
224+
if self.version == GeometryApiProtos.V0:
225+
self._commands = GRPCCommandsServiceV0(self.channel)
226+
elif self.version == GeometryApiProtos.V1: # pragma: no cover
227+
# V1 is not implemented yet
228+
self._commands = GRPCCommandsServiceV1(self.channel)
229+
else: # pragma: no cover
230+
# This should never happen as the version is set in the constructor
231+
raise ValueError(f"Unsupported version: {self.version}")
232+
233+
return self._commands
234+
207235
@property
208236
def coordinate_systems(self) -> GRPCCoordinateSystemService:
209237
"""

src/ansys/geometry/core/_grpc/_services/base/bodies.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,3 +218,8 @@ def get_tesellation_with_options(self, **kwargs) -> dict:
218218
def boolean(self, **kwargs) -> dict:
219219
"""Boolean operation."""
220220
pass
221+
222+
@abstractmethod
223+
def split_body(self, **kwargs) -> dict:
224+
"""Split a body."""
225+
pass
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# Copyright (C) 2023 - 2025 ANSYS, Inc. and/or its affiliates.
2+
# SPDX-License-Identifier: MIT
3+
#
4+
#
5+
# Permission is hereby granted, free of charge, to any person obtaining a copy
6+
# of this software and associated documentation files (the "Software"), to deal
7+
# in the Software without restriction, including without limitation the rights
8+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
# copies of the Software, and to permit persons to whom the Software is
10+
# furnished to do so, subject to the following conditions:
11+
#
12+
# The above copyright notice and this permission notice shall be included in all
13+
# copies or substantial portions of the Software.
14+
#
15+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
# SOFTWARE.
22+
"""Module containing the commands service implementation (abstraction layer)."""
23+
24+
from abc import ABC, abstractmethod
25+
26+
import grpc
27+
28+
29+
class GRPCCommandsService(ABC): # pragma: no cover
30+
"""Commands service for gRPC communication with the Geometry server.
31+
32+
Parameters
33+
----------
34+
channel : grpc.Channel
35+
The gRPC channel to the server.
36+
"""
37+
38+
def __init__(self, channel: grpc.Channel):
39+
"""Initialize the GRPCCommandsService class."""
40+
pass
41+
42+
@abstractmethod
43+
def set_name(self, **kwargs) -> dict:
44+
"""Set the name of an object."""
45+
pass

src/ansys/geometry/core/_grpc/_services/v0/bodies.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,10 @@ class GRPCBodyServiceV0(GRPCBodyService):
6262
@protect_grpc
6363
def __init__(self, channel: grpc.Channel): # noqa: D102
6464
from ansys.api.geometry.v0.bodies_pb2_grpc import BodiesStub
65+
from ansys.api.geometry.v0.commands_pb2_grpc import CommandsStub
6566

6667
self.stub = BodiesStub(channel)
68+
self.command_stub = CommandsStub(channel)
6769

6870
@protect_grpc
6971
def create_sphere_body(self, **kwargs) -> dict: # noqa: D102
@@ -759,3 +761,25 @@ def boolean(self, **kwargs) -> dict: # noqa: D102
759761

760762
# Return the response - formatted as a dictionary
761763
return {}
764+
765+
@protect_grpc
766+
def split_body(self, **kwargs): # noqa: D102
767+
from ansys.api.dbu.v0.dbumodels_pb2 import EntityIdentifier
768+
from ansys.api.geometry.v0.commands_pb2 import SplitBodyRequest
769+
770+
# Create the request - assumes all inputs are valid and of the proper type
771+
request = SplitBodyRequest(
772+
selection=[EntityIdentifier(id=id) for id in kwargs["body_ids"]],
773+
split_by_plane=from_plane_to_grpc_plane(kwargs["plane"]) if kwargs["plane"] else None,
774+
split_by_slicer=[EntityIdentifier(id=id) for id in kwargs["slicer_ids"]],
775+
split_by_faces=[EntityIdentifier(id=id) for id in kwargs["face_ids"]],
776+
extend_surfaces=kwargs["extend_surfaces"],
777+
)
778+
779+
# Call the gRPC service
780+
resp = self.command_stub.SplitBody(request=request)
781+
782+
# Return the response - formatted as a dictionary
783+
return {
784+
"success": resp.success,
785+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# Copyright (C) 2023 - 2025 ANSYS, Inc. and/or its affiliates.
2+
# SPDX-License-Identifier: MIT
3+
#
4+
#
5+
# Permission is hereby granted, free of charge, to any person obtaining a copy
6+
# of this software and associated documentation files (the "Software"), to deal
7+
# in the Software without restriction, including without limitation the rights
8+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
# copies of the Software, and to permit persons to whom the Software is
10+
# furnished to do so, subject to the following conditions:
11+
#
12+
# The above copyright notice and this permission notice shall be included in all
13+
# copies or substantial portions of the Software.
14+
#
15+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
# SOFTWARE.
22+
"""Module containing the commands service implementation for v0."""
23+
24+
import grpc
25+
26+
from ansys.geometry.core.errors import protect_grpc
27+
28+
from ..base.commands import GRPCCommandsService
29+
30+
31+
class GRPCCommandsServiceV0(GRPCCommandsService):
32+
"""Commands service for gRPC communication with the Geometry server.
33+
34+
This class provides methods to call commands in the
35+
Geometry server using gRPC. It is specifically designed for the v0
36+
version of the Geometry API.
37+
38+
Parameters
39+
----------
40+
channel : grpc.Channel
41+
The gRPC channel to the server.
42+
"""
43+
44+
@protect_grpc
45+
def __init__(self, channel: grpc.Channel): # noqa: D102
46+
from ansys.api.geometry.v0.commands_pb2_grpc import CommandsStub
47+
48+
self.stub = CommandsStub(channel)
49+
50+
@protect_grpc
51+
def set_name(self, **kwargs): # noqa: D102
52+
from ansys.api.dbu.v0.dbumodels_pb2 import EntityIdentifier
53+
from ansys.api.geometry.v0.commands_pb2 import RenameObjectRequest
54+
55+
# Create the request - assumes all inputs are valid and of the proper type
56+
request = RenameObjectRequest(
57+
selection=[EntityIdentifier(id=id) for id in kwargs["selection_ids"]],
58+
name=kwargs["name"],
59+
)
60+
61+
# Call the gRPC service
62+
result = self.stub.RenameObject(request)
63+
64+
# Return the result - formatted as a dictionary
65+
return {
66+
"success": result.success,
67+
}

src/ansys/geometry/core/_grpc/_services/v1/bodies.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,3 +191,7 @@ def get_tesellation_with_options(self, **kwargs) -> dict: # noqa: D102
191191
@protect_grpc
192192
def boolean(self, **kwargs) -> dict: # noqa: D102
193193
raise NotImplementedError
194+
195+
@protect_grpc
196+
def split_body(self, **kwargs): # noqa: D102
197+
raise NotImplementedError
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
# Copyright (C) 2023 - 2025 ANSYS, Inc. and/or its affiliates.
2+
# SPDX-License-Identifier: MIT
3+
#
4+
#
5+
# Permission is hereby granted, free of charge, to any person obtaining a copy
6+
# of this software and associated documentation files (the "Software"), to deal
7+
# in the Software without restriction, including without limitation the rights
8+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
# copies of the Software, and to permit persons to whom the Software is
10+
# furnished to do so, subject to the following conditions:
11+
#
12+
# The above copyright notice and this permission notice shall be included in all
13+
# copies or substantial portions of the Software.
14+
#
15+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
# SOFTWARE.
22+
"""Module containing the commands service implementation for v1."""
23+
24+
import grpc
25+
26+
from ansys.geometry.core.errors import protect_grpc
27+
28+
from ..base.commands import GRPCCommandsService
29+
30+
31+
class GRPCCommandsServiceV1(GRPCCommandsService):
32+
"""Commands service for gRPC communication with the Geometry server.
33+
34+
This class provides methods to call commands in the
35+
Geometry server using gRPC. It is specifically designed for the v1
36+
version of the Geometry API.
37+
38+
Parameters
39+
----------
40+
channel : grpc.Channel
41+
The gRPC channel to the server.
42+
"""
43+
44+
@protect_grpc
45+
def __init__(self, channel: grpc.Channel): # noqa: D102
46+
from ansys.api.geometry.v1.commands_pb2_grpc import CommandsStub
47+
48+
self.stub = CommandsStub(channel)
49+
50+
@protect_grpc
51+
def set_name(self, **kwargs): # noqa: D102
52+
raise NotImplementedError

0 commit comments

Comments
 (0)