chiark / gitweb /
Move SF into its own directory, to seperate SF and Cura. Rename newui to gui.
[cura.git] / Cura / cura_sf / fabmetheus_utilities / geometry / solids / cube.py
1 """
2 Boolean geometry cube.
3
4 """
5
6
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.
9 import __init__
10
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
15
16
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'
21
22
23 def addCube(elementNode, faces, inradius, vertexes):
24         'Add cube by inradius.'
25         square = [
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)
32
33 def getGeometryOutput(elementNode, inradius):
34         'Get cube triangle mesh by inradius.'
35         faces = []
36         vertexes = []
37         addCube(elementNode, faces, inradius, vertexes)
38         return {'trianglemesh' : {'vertex' : vertexes, 'face' : faces}}
39
40 def getNewDerivation(elementNode):
41         'Get new derivation.'
42         return CubeDerivation(elementNode)
43
44 def processElementNode(elementNode):
45         'Process the xml element.'
46         evaluate.processArchivable(Cube, elementNode)
47
48
49 class Cube(triangle_mesh.TriangleMesh):
50         'A cube object.'
51         def addXMLSection(self, depth, output):
52                 'Add the xml section for this object.'
53                 pass
54
55         def createShape(self):
56                 'Create the shape.'
57                 addCube(self.elementNode, self.faces, self.inradius, self.vertexes)
58
59         def setToElementNode(self, elementNode):
60                 'Set to 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']
69                 self.createShape()
70                 solid.processArchiveRemoveSolid(elementNode, self.getGeometryOutput())
71
72
73 class CubeDerivation:
74         "Class to hold cube variables."
75         def __init__(self, elementNode):
76                 'Set defaults.'
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)