import numpy as np class Solid(object): def __init__(self, id, mesh, rotation=np.identity(3), displacement=(0,0,0), material1=None, material2=None, surface1=None, surface2=None, color=None): self.id = id self.mesh = mesh if rotation.shape != (3,3): raise ValueError('shape mismatch') self.rotation = rotation displacement = np.asarray(displacement) if displacement.shape != (3,): raise ValueError('shape mismatch') self.displacement = displacement if np.iterable(material1): if len(material1) != len(mesh): raise ValueError('shape mismatch') self.material1 = np.array(material1, dtype=np.object) else: self.material1 = np.tile(material1, len(self.mesh)) if np.iterable(material2): if len(material2) != len(mesh): raise ValueError('shape mismatch') self.material2 = np.array(material2, dtype=np.object) else: self.material2 = np.tile(material2, len(self.mesh)) if np.iterable(surface1): if len(surface1) != len(mesh): raise ValueError('shape mismatch') self.surface1 = np.array(surface1, dtype=np.object) else: self.surface1 = np.tile(surface1, len(self.mesh)) if np.iterable(surface2): if len(surface2) != len(mesh): raise ValueError('shape mismatch') self.surface2 = np.array(surface2, dtype=np.object) else: self.surface2 = np.tile(surface2, len(self.mesh)) if np.iterable(color): if len(color) != len(mesh): raise ValueError('shape mismatch') self.color = np.array(color, dtype=np.uint32) else: self.color = np.tile(color, len(self.mesh)) def build(self): return np.inner(self.mesh.build(), self.rotation) + self.displacement