"""BoxRegion class definition"""
from typing import Any
import os
if os.environ.get('__USE_CUDA', '0') == '1':
import cupy as np
from cupy import ndarray
else:
import numpy as np
from numpy import ndarray
from g3d.defs import FunctionByPass
from g3d.mesh.geo.region import Region
from g3d.mesh.geo import Coord
[docs]
class BoxRegion(Region):
def __init__(self, *args: Any, **kwargs: Any) -> None:
super().__init__(*args, **kwargs)
self._dx = 1.
self._dy = 1.
self._dz = 1.
def _set_default(self) -> None:
super()._set_default()
self._tag = 'box_region'
def _set_from_args(self, *args: Any, **kwargs: Any) -> ndarray:
bps = self._get_function_evaluate_status(**kwargs)
if bps is FunctionByPass.SELF:
args_stat = np.ones(len(args))
else:
args_stat = super()._set_from_args(*args)
if bps in [FunctionByPass.EVALUATE, FunctionByPass.SELF]:
if np.sum(args_stat) > 0:
r_def = []
for i in range(len(args)):
if args_stat[i] == 1:
arg = args[i]
if type(arg) in [float, np.float64, np.float32, int, np.int64, np.int32]:
args_stat[i] = 0
r_def.append(np.float64(arg))
elif type(arg) is BoxRegion:
# if caught by a super class, the child class instance of copy will be used
args_stat[i] = 0
self.copy(arg)
elif type(arg) is Region:
args_stat[i] = 0
super().copy(arg)
elif type(arg) is list:
args_stat[i] = 0
if len(arg) == 3:
self._dx, self._dy, self._dz = arg
elif len(arg) == 2:
self._dx, self._dy = arg
elif len(arg) == 1:
self._dx = arg
if len(r_def) >= 1:
# will be caught by the for-loop below in a sub call to _set_from_args
self._set_from_args(r_def, bps=FunctionByPass.SELF)
return args_stat
[docs]
def set_from_key_value(self, key: str, value: Any) -> bool:
if super().set_from_key_value(key, value):
return True
elif key == 'dx':
self._dx = value
return True
elif key == 'dy':
self._dy = value
return True
elif key == 'dz':
self._dz = value
return True
return False
@property
def dx(self) -> float:
"""
:return:
"""
return self._dx
@dx.setter
def dx(self, val: float) -> None:
self._dx = val
@property
def dy(self) -> float:
"""
:return:
"""
return self._dy
@dy.setter
def dy(self, val: float) -> None:
self._dy = val
@property
def dz(self) -> float:
"""
:return:
"""
return self._dz
@dz.setter
def dz(self, val: float) -> None:
self._dz = val
[docs]
def copy(self, r: 'BoxRegion') -> None:
super().copy(r)
self._dx = r.dx
self._dy = r.dy
self._dz = r.dz
[docs]
def coord_is_in_region(self, c: Coord) -> bool:
"""
:param c:
:return:
"""
if np.abs(self._center.x - c.x) <= self._dx:
if np.abs(self._center.y - c.y) <= self._dy:
if np.abs(self._center.z - c.z) <= self._dz:
return True
return False