7 from __future__ import absolute_import
8 #Init has to be imported first because it has code to workaround the python bug where relative imports don't work if the module is imported as a main module.
11 from fabmetheus_utilities.geometry.creation import solid
12 from fabmetheus_utilities.geometry.geometry_utilities import evaluate
13 from fabmetheus_utilities.geometry.solids import triangle_mesh
14 from fabmetheus_utilities.vector3 import Vector3
17 __author__ = 'Enrique Perez (perez_enrique@yahoo.com)'
18 __credits__ = 'Nophead <http://hydraraptor.blogspot.com/>\nArt of Illusion <http://www.artofillusion.org/>'
19 __date__ = '$Date: 2008/21/04 $'
20 __license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html'
23 def addCube(elementNode, faces, inradius, vertexes):
24 'Add cube by inradius.'
26 complex(-inradius.x, -inradius.y),
27 complex(inradius.x, -inradius.y),
28 complex(inradius.x, inradius.y),
29 complex(-inradius.x, inradius.y)]
30 bottomTopSquare = triangle_mesh.getAddIndexedLoops(square, vertexes, [-inradius.z, inradius.z])
31 triangle_mesh.addPillarByLoops(faces, bottomTopSquare)
33 def getGeometryOutput(elementNode, inradius):
34 'Get cube triangle mesh by inradius.'
37 addCube(elementNode, faces, inradius, vertexes)
38 return {'trianglemesh' : {'vertex' : vertexes, 'face' : faces}}
40 def getNewDerivation(elementNode):
42 return CubeDerivation(elementNode)
44 def processElementNode(elementNode):
45 'Process the xml element.'
46 evaluate.processArchivable(Cube, elementNode)
49 class Cube(triangle_mesh.TriangleMesh):
51 def addXMLSection(self, depth, output):
52 'Add the xml section for this object.'
55 def createShape(self):
57 addCube(self.elementNode, self.faces, self.inradius, self.vertexes)
59 def setToElementNode(self, elementNode):
61 attributes = elementNode.attributes
62 self.elementNode = elementNode
63 self.inradius = CubeDerivation(elementNode).inradius
64 attributes['inradius.x'] = self.inradius.x
65 attributes['inradius.y'] = self.inradius.y
66 attributes['inradius.z'] = self.inradius.z
67 if 'inradius' in attributes:
68 del attributes['inradius']
70 solid.processArchiveRemoveSolid(elementNode, self.getGeometryOutput())
74 "Class to hold cube variables."
75 def __init__(self, elementNode):
77 self.inradius = evaluate.getVector3ByPrefixes(elementNode, ['demisize', 'inradius'], Vector3(1.0, 1.0, 1.0))
78 self.inradius = evaluate.getVector3ByMultiplierPrefix(elementNode, 2.0, 'size', self.inradius)