Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion src/ansys/geometry/core/plotting/plotter.py
Original file line number Diff line number Diff line change
Expand Up @@ -377,7 +377,7 @@ def init_plotter(self):
pl = Plotter()
return pl

def show_plotter(self, plotter, screenshot):
def show_plotter(self, plotter: Plotter, screenshot: Optional[str] = None):
"""Shows the plotter or starts Trame service.

Parameters
Expand Down
6 changes: 0 additions & 6 deletions src/ansys/geometry/core/primitives/circle.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,12 +54,6 @@ def origin(self) -> Point3D:
"""Origin of the circle."""
return self._origin

@origin.setter
@check_input_types
def origin(self, origin: Point3D) -> None:
"""Set the origin of the circle."""
self._origin = origin

@property
def radius(self) -> Quantity:
"""Radius of the circle."""
Expand Down
6 changes: 0 additions & 6 deletions src/ansys/geometry/core/primitives/ellipse.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,12 +76,6 @@ def origin(self) -> Point3D:
"""Origin of the ellipse."""
return self._origin

@origin.setter
@check_input_types
def origin(self, origin: Point3D) -> None:
"""Set the origin of the ellipse."""
self._origin = origin

@property
def major_radius(self) -> Quantity:
"""Major radius of the ellipse."""
Expand Down
14 changes: 0 additions & 14 deletions src/ansys/geometry/core/primitives/line.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,25 +40,11 @@ def origin(self) -> Point3D:
"""Origin of the line."""
return self._origin

@origin.setter
@check_input_types
def origin(self, origin: Point3D) -> None:
"""Set the origin of the line."""
self._origin = origin

@property
def direction(self) -> UnitVector3D:
"""Direction of the line."""
return self._direction

@direction.setter
@check_input_types
def direction(self, direction: Union[np.ndarray, RealSequence, UnitVector3D, Vector3D]):
"""Set the direction of the line."""
self._direction = (
UnitVector3D(direction) if not isinstance(direction, UnitVector3D) else direction
)

def __eq__(self, other: object) -> bool:
"""Equals operator for the ``Line`` class."""
if isinstance(other, Line):
Expand Down
6 changes: 0 additions & 6 deletions src/ansys/geometry/core/primitives/sphere.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,12 +55,6 @@ def origin(self) -> Point3D:
"""Origin of the sphere."""
return self._origin

@origin.setter
@check_input_types
def origin(self, origin: Point3D) -> None:
"""Set the origin of the sphere."""
self._origin = origin

@property
def radius(self) -> Quantity:
"""Radius of the sphere."""
Expand Down
69 changes: 20 additions & 49 deletions src/ansys/geometry/core/primitives/torus.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
"""Provides the ``Torus`` class."""

from beartype import beartype as check_input_types
from beartype.typing import Optional, Union
from beartype.typing import Union
import numpy as np
from pint import Unit
from pint import Quantity

from ansys.geometry.core.math import Point3D, UnitVector3D, Vector3D
from ansys.geometry.core.misc import DEFAULT_UNITS, UNITS, check_pint_unit_compatibility
from ansys.geometry.core.misc import Distance
from ansys.geometry.core.typing import Real, RealSequence


Expand All @@ -22,12 +22,10 @@ class Torus:
X-axis direction.
direction_y : Union[~numpy.ndarray, RealSequence, UnitVector3D, Vector3D]
Y-axis direction.
major_radius : Real
major_radius : Union[Quantity, Distance, Real]
Major radius of the torus.
minor_radius : Real
minor_radius : Union[Quantity, Distance, Real]
Minor radius of ``Torus``.
unit : ~pint.Unit, optional
Units for defining the radius and minor radius. By default, ``DEFAULT_UNITS.LENGTH``
"""

@check_input_types
Expand All @@ -36,16 +34,11 @@ def __init__(
origin: Union[np.ndarray, RealSequence, Point3D],
direction_x: Union[np.ndarray, RealSequence, UnitVector3D, Vector3D],
direction_y: Union[np.ndarray, RealSequence, UnitVector3D, Vector3D],
major_radius: Real,
minor_radius: Real,
unit: Optional[Unit] = DEFAULT_UNITS.LENGTH,
major_radius: Union[Quantity, Distance, Real],
minor_radius: Union[Quantity, Distance, Real],
):
"""Constructor method for the ``Torus`` class."""

check_pint_unit_compatibility(unit, DEFAULT_UNITS.LENGTH)
self._unit = unit
_, self._base_unit = UNITS.get_base_units(unit)

self._origin = Point3D(origin) if not isinstance(origin, Point3D) else origin
self._direction_x = (
UnitVector3D(direction_x) if not isinstance(direction_x, UnitVector3D) else direction_x
Expand All @@ -55,57 +48,35 @@ def __init__(
)

# Store values in base unit
self._major_radius = UNITS.convert(major_radius, self._unit, self._base_unit)
self._minor_radius = UNITS.convert(minor_radius, self._unit, self._base_unit)
self._major_radius = (
major_radius if isinstance(major_radius, Distance) else Distance(major_radius)
)
self._minor_radius = (
minor_radius if isinstance(minor_radius, Distance) else Distance(minor_radius)
)

@property
def origin(self) -> Point3D:
"""Origin of the torus."""
return self._origin

@origin.setter
@check_input_types
def origin(self, origin: Point3D) -> None:
self._origin = origin

@property
def major_radius(self) -> Real:
def major_radius(self) -> Quantity:
"""Semi-major radius of the torus."""
return UNITS.convert(self._major_radius, self._base_unit, self._unit)

@major_radius.setter
@check_input_types
def major_radius(self, major_radius: Real) -> None:
self._major_radius = UNITS.convert(major_radius, self._unit, self._base_unit)
return self._major_radius.value

@property
def minor_radius(self) -> Real:
def minor_radius(self) -> Quantity:
"""Semi-minor radius of the torus."""
return UNITS.convert(self._minor_radius, self._base_unit, self._unit)

@minor_radius.setter
@check_input_types
def minor_radius(self, minor_radius: Real) -> None:
self._minor_radius = UNITS.convert(minor_radius, self._unit, self._base_unit)

@property
def unit(self) -> Unit:
"""Unit of the semi-major radius and semi-minor radius."""
return self._unit

@unit.setter
@check_input_types
def unit(self, unit: Unit) -> None:
check_pint_unit_compatibility(unit, DEFAULT_UNITS.LENGTH)
self._unit = unit
return self._minor_radius.value

@check_input_types
def __eq__(self, other: object) -> bool:
"""Equals operator for the ``Torus`` class."""
return (
self._origin == other.origin
and self._major_radius == other.major_radius
and self._minor_radius == other.minor_radius
self._origin == other._origin
and self._major_radius == other._major_radius
and self._minor_radius == other._minor_radius
and self._direction_x == other._direction_x
and self._direction_y == other._direction_y
)
Expand Down
79 changes: 12 additions & 67 deletions tests/test_primitives.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
UnitVector3D,
Vector3D,
)
from ansys.geometry.core.misc import UNITS, Accuracy, Distance
from ansys.geometry.core.misc import DEFAULT_UNITS, UNITS, Accuracy, Distance
from ansys.geometry.core.primitives import (
Circle,
Cone,
Expand Down Expand Up @@ -160,21 +160,9 @@ def test_sphere():
assert Accuracy.length_is_equal(s_1.surface_area.m, 1.25663706e5)
assert Accuracy.length_is_equal(s_1.volume.m, 4.1887902e6)

s_1.origin = new_origin = Point3D([42, 88, 99])

assert s_1.origin.x == new_origin.x
assert s_1.origin.y == new_origin.y
assert s_1.origin.z == new_origin.z

s_2.origin = new_origin
assert s_1 == s_2

with pytest.raises(BeartypeCallHintParamViolation):
Sphere(origin, "A")

with pytest.raises(BeartypeCallHintParamViolation):
s_1.origin = "A"


def test_sphere_units():
"""``Sphere`` units validation."""
Expand Down Expand Up @@ -401,40 +389,15 @@ def test_torus():
assert t_1.origin.x == origin.x
assert t_1.origin.y == origin.y
assert t_1.origin.z == origin.z
assert t_1.major_radius == major_radius
assert t_1.minor_radius == minor_radius

t_1.major_radius = new_major_radius = 2000
t_1.minor_radius = new_minor_radius = 1000

assert t_1.origin.x == origin.x
assert t_1.origin.y == origin.y
assert t_1.origin.z == origin.z
assert t_1.major_radius == new_major_radius
assert t_1.minor_radius == new_minor_radius

t_1.origin = new_origin = Point3D([42, 88, 99])
assert t_1.origin.x == new_origin.x
assert t_1.origin.y == new_origin.y
assert t_1.origin.z == new_origin.z
assert t_1.major_radius == new_major_radius
assert t_1.minor_radius == new_minor_radius
assert t_1.major_radius == major_radius * DEFAULT_UNITS.LENGTH
assert t_1.minor_radius == minor_radius * DEFAULT_UNITS.LENGTH

with pytest.raises(BeartypeCallHintParamViolation):
Torus(origin, UnitVector3D([12, 31, 99]), UnitVector3D([25, 39, 82]), "A", 200)

with pytest.raises(BeartypeCallHintParamViolation):
Torus(origin, UnitVector3D([12, 31, 99]), UnitVector3D([25, 39, 82]), 100, "A")

with pytest.raises(BeartypeCallHintParamViolation):
t_1.major_radius = "A"

with pytest.raises(BeartypeCallHintParamViolation):
t_1.minor_radius = "A"

with pytest.raises(BeartypeCallHintParamViolation):
t_1.origin = "A"

with pytest.raises(BeartypeCallHintParamViolation):
Torus(origin, "A", UnitVector3D([25, 39, 82]), 100, 200)

Expand All @@ -459,43 +422,25 @@ def test_torus_units():
origin,
UnitVector3D([12, 31, 99]),
UnitVector3D([25, 39, 82]),
major_radius,
minor_radius,
UNITS.celsius,
Quantity(major_radius, UNITS.celsius),
Quantity(minor_radius, UNITS.celsius),
)

t_1 = Torus(
origin,
UnitVector3D([12, 31, 99]),
UnitVector3D([25, 39, 82]),
major_radius,
minor_radius,
unit,
Quantity(major_radius, unit),
Quantity(minor_radius, unit),
)

# Verify rejection of invalid base unit type
with pytest.raises(
TypeError,
match=r"The pint.Unit provided as an input should be a \[length\] quantity.",
):
t_1.unit = UNITS.celsius

# Check that the units are correctly in place
assert t_1.unit == unit
assert t_1.major_radius.u == unit
assert t_1.minor_radius.u == unit

# Request for radius/height and ensure they are in mm
assert t_1.major_radius == major_radius
assert t_1.minor_radius == minor_radius

# Check that the actual values are in base units (i.e. DEFAULT_UNITS.LENGTH)
assert t_1._major_radius == (t_1.major_radius * t_1.unit).to_base_units().magnitude
assert t_1._minor_radius == (t_1.minor_radius * t_1.unit).to_base_units().magnitude

# Set unit to cm now... and check if the values changed
t_1.unit = new_unit = UNITS.cm
assert t_1.major_radius == UNITS.convert(major_radius, unit, new_unit)
assert t_1.minor_radius == UNITS.convert(minor_radius, unit, new_unit)
assert t_1.unit == new_unit
# Request for radii and ensure they are in mm
assert t_1.major_radius.m == major_radius
assert t_1.minor_radius.m == minor_radius


def test_circle():
Expand Down