from .base import Base
import numpy as np
__all__ = ["Round", "Rectangular", "Square"]
[docs]class Round(Base):
"""A class representing a round tool for material removal simulations.
This class represents a round tool and calculates the section of the part
surface which the tool is in contact with.
Attributes:
r (float): The tool radius.
area (float): The area of the tool.
Ix (float): The second moment of area of the tool in the X direction.
Iy (float): The second moment of area of the tool in the Y direction.
Note:
The class attributes are set automatically when the class is initialized,
and when the tool radius is set using the ``radius`` property. Setting
these values manually could lead to simulation errors.
"""
def __init__(self, *args, radius=None, **kwargs):
"""
Args:
*args: Arguments to be passed on to superclasses.
radius (float): The radius of the tool. Defaults to ``None``.
**kwargs: Keyword arguments to be passed on to superclasses.
Raises:
ValueError: If ``radius`` is not set.
"""
super().__init__(*args, **kwargs)
if radius is None:
raise ValueError("Tool radius must be set.")
self.radius = radius
@property
def radius(self):
"""float: Tool radius."""
return self.r
@radius.setter
def radius(self, r):
self.r = r
self.area = np.pi * r ** 2
self.Ix = np.pi * r ** 4 / 4
self.Iy = np.pi * r ** 4 / 4
[docs] def shape(self, x, y):
"""This function finds the section of the part the tool is in contact with.
Args:
x (numpy.ndarray): A 2D array of the X coordinates of the part centered
at the current tool location.
y (numpy.ndarray): A 2D array of the Y coordinates of the part centered
at the current tool location.
Returns:
numpy.ndarray: A 2D array where ``True`` indicates the tool is in contact
with that portion of the part surface.
"""
return x ** 2 + y ** 2 <= self.r ** 2
[docs]class Rectangular(Base):
"""A class representing a rectangular tool for material removal simulations.
This class represents a rectangular tool and calculates the section of the
part surface which the tool is in contact with.
Attributes:
width (float): The tool width, in the X direction.
height (float): The tool height, in the Y direction.
area (float): The area of the tool.
Ix (float): The second moment of area of the tool in the X direction.
Iy (float): The second moment of area of the tool in the Y direction.
Note:
The class attributes are set automatically when the class is initialized,
and when the tool size is set using the ``set_size`` method. Setting
these values manually could lead to simulation errors.
"""
def __init__(self, *args, width=None, height=None, **kwargs):
"""
Args:
*args: Arguments to be passed on to superclasses.
width (float): The width of the tool, in the X direction. Defaults to
``None``.
height (float): The height of the tool, in the Y direction. Defaults
to ``None``.
**kwargs: Keyword arguments to be passed on to superclasses.
Raises:
ValueError: If ``width`` or ``height`` is not set.
"""
if width is None:
raise ValueError("Tool width must be set.")
if height is None:
raise ValueError("Tool height must be set.")
super().__init__(*args, **kwargs)
self._set_size(width, height)
def _set_size(self, width, height):
self.width = width
self.height = height
self.area = width * height
self.Ix = width * height ** 3 / 12
self.Iy = width ** 3 * height / 12
[docs] def set_size(self, width, height):
"""Set the size of the tool.
Args:
width (float): The width of the tool, in the X direction.
height (float): The height of the tool, in the Y direction.
"""
self._set_size(width, height)
[docs] def shape(self, x, y):
"""This function finds the section of the part the tool is in contact with.
Args:
x (numpy.ndarray): A 2D array of the X coordinates of the part centered
at the current tool location.
y (numpy.ndarray): A 2D array of the Y coordinates of the part centered
at the current tool location.
Returns:
numpy.ndarray: A 2D array where ``True`` indicates the tool is in contact
with that portion of the part surface.
"""
return (
(-(self.width / 2) <= x)
& ((self.width / 2) >= x)
& (-(self.height / 2) <= y)
& ((self.height / 2) >= y)
)
[docs]class Square(Rectangular):
"""A class representing a square tool for material removal simulations.
This class represents a square tool and calculates the section of the
part surface which the tool is in contact with.
Note:
This class simply inherits :class:`.Rectangular` and sets both ``width``
and ``height`` to the same value.
"""
def __init__(self, *args, width=None, **kwargs):
"""
Args:
*args: Arguments to be passed on to superclasses.
width (float): The width of the tool. Defaults to
``None``.
**kwargs: Keyword arguments to be passed on to superclasses.
Raises:
ValueError: If ``width`` is not set.
"""
super().__init__(*args, width=width, height=width, **kwargs)
[docs] def set_size(self, width):
"""Set the size of the tool.
Args:
width (float): The width of the tool.
"""
self._set_size(width, width)