def getGeometryOutput(xmlElement): "Get vector3 vertices from attribute dictionary." radius = complex(1.0, 1.0) radius = lineation.getComplexByPrefixes(['demisize', 'radius'], radius, xmlElement) radius = lineation.getComplexByMultiplierPrefixes(2.0, ['diameter', 'size'], radius, xmlElement) sides = evaluate.getSidesMinimumThree(max(radius.real, radius.imag), xmlElement) sides = evaluate.getEvaluatedFloatDefault(sides, 'sides', xmlElement) loop = [] start = evaluate.getEvaluatedFloatZero('start', xmlElement) start = getWrappedFloat(start, 360.0) extent = evaluate.getEvaluatedFloatDefault(360.0 - start, 'extent', xmlElement) end = evaluate.getEvaluatedFloatDefault(start + extent, 'end', xmlElement) end = getWrappedFloat(end, 360.0) revolutions = evaluate.getEvaluatedFloatOne('revolutions', xmlElement) if revolutions > 1: end += 360.0 * (revolutions - 1) sidesCeiling = int(math.ceil(abs(sides) * extent / 360.0)) sideAngle = math.radians(extent) / sidesCeiling startAngle = math.radians(start) for side in xrange(sidesCeiling + (extent != 360.0)): angle = float(side) * sideAngle + startAngle point = euclidean.getWiddershinsUnitPolar(angle) vertex = Vector3(point.real * radius.real, point.imag * radius.imag) loop.append(vertex) sideLength = sideAngle * lineation.getAverageRadius(radius) return lineation.getGeometryOutputByLoop(lineation.SideLoop(loop, sideAngle, sideLength), xmlElement)
def getManipulatedPaths(close, loop, prefix, sideLength, xmlElement): "Get round loop." if len(loop) < 3: return [loop] radius = lineation.getRadiusByPrefix(prefix, sideLength, xmlElement) if radius == 0.0: return loop roundLoop = [] sidesPerRadian = 0.5 / math.pi * evaluate.getSidesMinimumThree(sideLength, xmlElement) for pointIndex in xrange(len(loop)): begin = loop[(pointIndex + len(loop) - 1) % len(loop)] center = loop[pointIndex] end = loop[(pointIndex + 1) % len(loop)] roundLoop += getRoundPath(begin, center, close, end, radius, sidesPerRadian) return [euclidean.getLoopWithoutCloseSequentialPoints(close, roundLoop)]
def createShape( self ): "Create the shape." polygonBottom = [] polygonTop = [] sides = evaluate.getSidesMinimumThree(max(self.inradius.x, self.inradius.y), self.xmlElement ) sideAngle = 2.0 * math.pi / sides for side in xrange(int(sides)): angle = float(side) * sideAngle unitComplex = euclidean.getWiddershinsUnitPolar(angle) pointBottom = complex(unitComplex.real * self.inradius.x, unitComplex.imag * self.inradius.y) polygonBottom.append(pointBottom) if self.topOverBottom > 0.0: polygonTop.append(pointBottom * self.topOverBottom) if self.topOverBottom <= 0.0: polygonTop.append(complex()) bottomTopPolygon = [ trianglemesh.getAddIndexedLoop(polygonBottom, self.vertices, - self.inradius.z), trianglemesh.getAddIndexedLoop(polygonTop, self.vertices, self.inradius.z)] trianglemesh.addPillarFromConvexLoops(self.faces, bottomTopPolygon)