from pumapy import Workspace
from pumapy.utilities.timer import Timer
from pumapy.generation.tpms_utils import generate
import numpy as np
[docs]def generate_tpms(size, w, q, equation=0):
""" Generation of triply periodic minimal surface material
:param size: size of 3D domain (x,y,z)
:type size: tuple(int, int, int)
:param w: w parameter for tpms
:type w: float or tuple(float, float)
:param q: q parameter for tpms (float or tuple)
:type q: float or tuple(float, float)
:param equation: equation 0, 1, or 2 for tpms
:type equation: int
:return: TPMS domain
:rtype: Workspace
"""
if isinstance(w, tuple):
_w = w
elif isinstance(w, float):
_w = (w, w)
else:
raise Exception("Invalid w, must be float or tuple")
if isinstance(q, tuple):
_q = q
elif isinstance(q, float):
_q = (q, q)
else:
raise Exception("Invalid w, must be float or tuple")
generator = GeneratorTPMS(size, _w, _q, equation)
generator.error_check()
generator.log_input()
generator.log_output()
return generator.generate()
[docs]class GeneratorTPMS:
def __init__(self, size, w, q, equation=0):
self._workspace = Workspace()
self._size = size
self._wmin = w[0]
self._wmax = w[1]
self._qmin = q[0]
self._qmax = q[1]
self._equation = equation
[docs] def generate(self):
t = Timer()
self._workspace.resize_new_matrix(self._size)
self._workspace.matrix = generate(self._workspace.matrix.astype(float), self._size[0], self._size[1],
self._size[2], self._wmin, self._wmax, self._qmin, self._qmax, self._equation)
self._workspace.matrix = (255. * (self._workspace.matrix - np.min(self._workspace.matrix)) /
np.ptp(self._workspace.matrix)).astype(np.uint16)
print("Generated in: " + str(t.elapsed()) + " seconds")
return self._workspace
[docs] def log_output(self):
self._workspace.log.log_section("Finished TPMS Generation")
self._workspace.log.write_log()
[docs] def error_check(self):
if not isinstance(self._workspace, Workspace):
raise Exception("Error, workspace must be passed")
if not (isinstance(self._size, tuple) and len(self._size) == 3):
raise Exception("Error, invalid size, must be tuple of size 3")
if self._size[0] <= 0:
raise Exception("Error, invalid size, must be >= 0")
if self._size[1] <= 0:
raise Exception("Error, invalid size, must be >= 0")
if self._size[2] <= 0:
raise Exception("Error, invalid size, must be >= 0")
if self._wmin <= 0:
raise Exception("Error, invalid w, must be >= 0")
if self._wmax <= 0:
raise Exception("Error, invalid w, must be >= 0")
if self._wmax < self._wmin:
raise Exception("Error, invalid w, w[1] cannot be < w[0]")
if self._qmin <= 0:
raise Exception("Error, invalid q, must be >= 0")
if self._qmax <= 0:
raise Exception("Error, invalid q, must be >= 0")
if self._qmax < self._wmin:
raise Exception("Error, invalid q, q[1] cannot be < q[0]")
if self._equation != 0 and self._equation != 1 and self._equation != 2:
raise Exception("Error, invalid equation number. Must be 0, 1, or 2")