def __sortVertices(self): """sort input vertices.""" groups = {} for p in self.__rawvertices: if p[2] not in groups: groups[p[2]] = [] groups[p[2]].append((p[0], p[1])) zValues = groups.keys() zValues.sort() pointGroups = groups.values() assert len(zValues) == 2, \ 'Number of Z values must be 2 not {}: {}.'.format(len(zValues), zValues) for g in pointGroups: assert len(g) == 4 # the points in both height are identical so I just take the first group # and sort them xAxisReversed = (-self.xAxis[0], -self.xAxis[1]) centerPt = self.center[:2] sortedPoints2d = \ sorted(pointGroups[0], key=lambda x: vectormath.angleAnitclockwise( xAxisReversed, tuple(c1 - c2 for c1, c2 in zip(x, centerPt)))) sortedPoints = [(pt[0], pt[1], z) for z in zValues for pt in sortedPoints2d] return sortedPoints
def __sortVertices(self): """sort input vertices.""" groups = {} for p in self.__rawvertices: if p[2] not in groups: groups[p[2]] = [] groups[p[2]].append((p[0], p[1])) zValues = groups.keys() zValues.sort() pointGroups = groups.values() assert len(zValues) == 2, \ 'Number of Z values must be 2 not {}: {}.'.format(len(zValues), zValues) for g in pointGroups: assert len(g) == 4 # the points in both height are identical so I just take the first group # and sort them xAxisReversed = (-self.xAxis[0], -self.xAxis[1]) centerPt = self.center[:2] sortedPoints2d = \ sorted(pointGroups[0], key=lambda x: vectormath.angleAnitclockwise( xAxisReversed, tuple(c1 - c2 for c1, c2 in zip(x, centerPt)))) sortedPoints = tuple((pt[0], pt[1], z) for z in zValues for pt in sortedPoints2d) return sortedPoints
def fromMinMax(cls, minPt, maxPt, convertToMeters=1, nDivXYZ=None, grading=None, xAxis=None): """Create BlockMeshDict from minimum and maximum point. Args: minPt: Minimum point of bounding box as (x, y, z). maxPt: Maximum point of bounding box as (x, y, z). convertToMeters: Scaling factor for the vertex coordinates. nDivXYZ: Number of divisions in (x, y, z) as a tuple (default: 5, 5, 5). grading: A simpleGrading (default: simpleGrading(1, 1, 1)). xAxis: An optional tuple that indicates the xAxis direction (default: (1, 0)). """ _xAxis = vectormath.normalize((xAxis[0], xAxis[1], 0) if xAxis else (1, 0, 0)) _zAxis = (0, 0, 1) _yAxis = vectormath.crossProduct(_zAxis, _xAxis) diagonal2D = tuple(i - j for i, j in zip(maxPt, minPt))[:2] _angle = radians(vectormath.angleAnitclockwise(_xAxis[:2], diagonal2D)) width = cos(_angle) * vectormath.length(diagonal2D) length = sin(_angle) * vectormath.length(diagonal2D) height = maxPt[2] - minPt[2] vertices = tuple( vectormath.move(minPt, vectormath.sums((vectormath.scale(_xAxis, i * width), vectormath.scale(_yAxis, j * length), vectormath.scale(_zAxis, k * height)) )) for i in range(2) for j in range(2) for k in range(2)) return cls.fromVertices(vertices, convertToMeters, nDivXYZ, grading, xAxis)
def fromMinMax(cls, minPt, maxPt, convertToMeters=1, nDivXYZ=None, grading=None, xAxis=None): """Create BlockMeshDict from minimum and maximum point. Args: minPt: Minimum point of bounding box as (x, y, z). maxPt: Maximum point of bounding box as (x, y, z). convertToMeters: Scaling factor for the vertex coordinates. nDivXYZ: Number of divisions in (x, y, z) as a tuple (default: 5, 5, 5). grading: A simpleGrading (default: simpleGrading(1, 1, 1)). xAxis: An optional tuple that indicates the xAxis direction (default: (1, 0)). """ _xAxis = vectormath.normalize((xAxis[0], xAxis[1], 0) if xAxis else (1, 0, 0)) _zAxis = (0, 0, 1) _yAxis = vectormath.crossProduct(_zAxis, _xAxis) diagonal2D = tuple(i - j for i, j in zip(maxPt, minPt))[:2] _angle = radians(vectormath.angleAnitclockwise(_xAxis[:2], diagonal2D)) width = cos(_angle) * vectormath.length(diagonal2D) length = sin(_angle) * vectormath.length(diagonal2D) height = maxPt[2] - minPt[2] vertices = [ vectormath.move( minPt, vectormath.sums((vectormath.scale(_xAxis, i * width), vectormath.scale(_yAxis, j * length), vectormath.scale(_zAxis, k * height)))) for i in range(2) for j in range(2) for k in range(2) ] return cls.fromVertices(vertices, convertToMeters, nDivXYZ, grading, xAxis)