Skip to content

Commit 1e20fa2

Browse files
jacobrkerstetterpre-commit-ci[bot]pyansys-ci-botRobPasMue
authored
fix: add axis for circular pattern (#2367)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: pyansys-ci-bot <[email protected]> Co-authored-by: Roberto Pastor Muela <[email protected]>
1 parent 1ef2779 commit 1e20fa2

File tree

7 files changed

+50
-5
lines changed

7 files changed

+50
-5
lines changed

doc/changelog.d/2367.fixed.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add axis for circular pattern

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ classifiers = [
2626
]
2727

2828
dependencies = [
29-
"ansys-api-discovery==1.0.3",
29+
"ansys-api-discovery==1.0.5",
3030
"ansys-tools-path>=0.3,<1",
3131
"beartype>=0.11.0,<0.23",
3232
"geomdl>=5,<6",

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
from_measurement_to_server_length,
3131
)
3232
from ..base.patterns import GRPCPatternsService
33-
from .conversions import build_grpc_id, from_unit_vector_to_grpc_direction
33+
from .conversions import build_grpc_id, from_line_to_grpc_line, from_unit_vector_to_grpc_direction
3434

3535

3636
class GRPCPatternsServiceV0(GRPCPatternsService): # pragma: no cover
@@ -104,6 +104,8 @@ def modify_linear_pattern(self, **kwargs) -> dict: # noqa: D102
104104
def create_circular_pattern(self, **kwargs) -> dict: # noqa: D102
105105
from ansys.api.geometry.v0.commands_pb2 import CreateCircularPatternRequest
106106

107+
from ansys.geometry.core.shapes.curves.line import Line
108+
107109
# Create direction if not None
108110
radial_direction = (
109111
from_unit_vector_to_grpc_direction(kwargs["radial_direction"])
@@ -118,16 +120,24 @@ def create_circular_pattern(self, **kwargs) -> dict: # noqa: D102
118120
else None
119121
)
120122

123+
# Create line if axis is a line object
124+
circular_axis, axis = None, None
125+
if isinstance(kwargs["circular_axis"], Line):
126+
axis = from_line_to_grpc_line(kwargs["circular_axis"])
127+
else:
128+
circular_axis = build_grpc_id(kwargs["circular_axis"])
129+
121130
# Create the request - assumes all inputs are valid and of the proper type
122131
request = CreateCircularPatternRequest(
123132
selection=[build_grpc_id(id) for id in kwargs["selection_ids"]],
124-
circular_axis=build_grpc_id(kwargs["circular_axis_id"]),
125133
circular_count=kwargs["circular_count"],
134+
circular_axis=circular_axis,
126135
circular_angle=from_measurement_to_server_angle(kwargs["circular_angle"]),
127136
two_dimensional=kwargs["two_dimensional"],
128137
linear_count=kwargs["linear_count"],
129138
linear_pitch=linear_pitch,
130139
radial_direction=radial_direction,
140+
axis=axis,
131141
)
132142

133143
# Call the gRPC service

src/ansys/geometry/core/designer/geometry_commands.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -716,7 +716,7 @@ def modify_linear_pattern(
716716
def create_circular_pattern(
717717
self,
718718
selection: Union["Face", list["Face"]],
719-
circular_axis: "Edge",
719+
circular_axis: Union["Edge", Line],
720720
circular_count: int,
721721
circular_angle: Angle | Quantity | Real,
722722
two_dimensional: bool = False,
@@ -755,6 +755,7 @@ def create_circular_pattern(
755755
--------
756756
This method is only available starting on Ansys release 25R2.
757757
"""
758+
from ansys.geometry.core.designer.edge import Edge
758759
from ansys.geometry.core.designer.face import Face
759760

760761
selection: list[Face] = selection if isinstance(selection, list) else [selection]
@@ -778,16 +779,25 @@ def create_circular_pattern(
778779
"a two-dimensional pattern is desired."
779780
)
780781
)
782+
if self._grpc_client.backend_version < (26, 1, 0) and isinstance(circular_axis, Line):
783+
raise ValueError(
784+
(
785+
"Using a Line as the circular axis is only supported "
786+
"starting in Ansys release 26R1."
787+
)
788+
)
781789

782790
# Convert angle and pitch to appropriate objects
783791
if not isinstance(circular_angle, Angle):
784792
circular_angle = Angle(circular_angle)
785793
if linear_pitch is not None and not isinstance(linear_pitch, Distance):
786794
linear_pitch = Distance(linear_pitch)
795+
if isinstance(circular_axis, Edge):
796+
circular_axis = circular_axis.id
787797

788798
result = self._grpc_client.services.patterns.create_circular_pattern(
789799
selection_ids=[object.id for object in selection],
790-
circular_axis_id=circular_axis.id,
800+
circular_axis=circular_axis,
791801
circular_count=circular_count,
792802
circular_angle=circular_angle,
793803
two_dimensional=two_dimensional,

tests/_incompatible_tests.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ backends:
115115
- tests/integration/test_design_import.py::test_named_selections_after_file_insert
116116
- tests/integration/test_design_import.py::test_named_selections_after_file_open
117117
- tests/integration/test_design_import.py::test_file_insert_import_named_selections_post_import
118+
- tests/integration/test_geometry_commands.py::test_circular_pattern_about_line
118119
# Export body facets added in 26.1
119120
- tests/integration/test_design.py::test_write_body_facets_on_save[scdocx-None]
120121
- tests/integration/test_design.py::test_write_body_facets_on_save[dsco-DISCO]
@@ -229,6 +230,7 @@ backends:
229230
- tests/integration/test_design_import.py::test_named_selections_after_file_insert
230231
- tests/integration/test_design_import.py::test_named_selections_after_file_open
231232
- tests/integration/test_design_import.py::test_file_insert_import_named_selections_post_import
233+
- tests/integration/test_geometry_commands.py::test_circular_pattern_about_line
232234
# Export body facets add in 26.1
233235
- tests/integration/test_design.py::test_write_body_facets_on_save[scdocx-None]
234236
- tests/integration/test_design.py::test_write_body_facets_on_save[dsco-DISCO]
@@ -312,6 +314,7 @@ backends:
312314
- tests/integration/test_design_import.py::test_named_selections_after_file_insert
313315
- tests/integration/test_design_import.py::test_named_selections_after_file_open
314316
- tests/integration/test_design_import.py::test_file_insert_import_named_selections_post_import
317+
- tests/integration/test_geometry_commands.py::test_circular_pattern_about_line
315318
# Export body facets add in 26.1
316319
- tests/integration/test_design.py::test_write_body_facets_on_save[scdocx-None]
317320
- tests/integration/test_design.py::test_write_body_facets_on_save[dsco-DISCO]
@@ -352,6 +355,7 @@ backends:
352355
- tests/integration/test_design_import.py::test_named_selections_after_file_insert
353356
- tests/integration/test_design_import.py::test_named_selections_after_file_open
354357
- tests/integration/test_design_import.py::test_file_insert_import_named_selections_post_import
358+
- tests/integration/test_geometry_commands.py::test_circular_pattern_about_line
355359
# Export body facets add in 26.1
356360
- tests/integration/test_design.py::test_write_body_facets_on_save[scdocx-None]
357361
- tests/integration/test_design.py::test_write_body_facets_on_save[dsco-DISCO]
37.9 KB
Loading

tests/integration/test_geometry_commands.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,26 @@ def test_circular_pattern(modeler: Modeler):
450450
)
451451

452452

453+
def test_circular_pattern_about_line(modeler: Modeler):
454+
"""Test circular pattern about line."""
455+
design = modeler.create_design("d1")
456+
base = design.extrude_sketch("box", Sketch().box(Point2D([0, 0]), 20, 20), 20)
457+
458+
cutout = design.extrude_sketch("cylinder", Sketch().circle(Point2D([-5, -5]), 1), 20)
459+
base.subtract(cutout)
460+
461+
assert base.volume.m == pytest.approx(Quantity(7937.1681, UNITS.m**3).m, rel=1e-6, abs=1e-8)
462+
assert len(base.faces) == 7
463+
464+
# full two-dimensional test - creates 3 rings around the center
465+
axis = Line(Point3D([0, 0, 0]), UNITVECTOR3D_Z)
466+
success = modeler.geometry_commands.create_circular_pattern(base.faces[-1], axis, 8, np.pi * 2)
467+
468+
assert success
469+
assert base.volume.m == pytest.approx(Quantity(7497.3452, UNITS.m**3).m, rel=1e-6, abs=1e-8)
470+
assert len(base.faces) == 14
471+
472+
453473
def test_fill_pattern(modeler: Modeler):
454474
"""Test fill pattern."""
455475
design = modeler.create_design("d1")

0 commit comments

Comments
 (0)