6 from __future__ import absolute_import
8 from fabmetheus_utilities.geometry.geometry_tools import dictionary
9 from fabmetheus_utilities.geometry.geometry_tools import vertex
10 from fabmetheus_utilities.geometry.geometry_utilities.evaluate_elements import setting
11 from fabmetheus_utilities.geometry.geometry_utilities import evaluate
12 from fabmetheus_utilities.geometry.geometry_utilities import matrix
13 from fabmetheus_utilities.vector3 import Vector3
14 from fabmetheus_utilities import euclidean
15 from fabmetheus_utilities import svg_writer
16 from fabmetheus_utilities import xml_simple_reader
17 from fabmetheus_utilities import xml_simple_writer
20 __author__ = 'Enrique Perez (perez_enrique@yahoo.com)'
21 __credits__ = 'Art of Illusion <http://www.artofillusion.org/>'
22 __date__ = '$Date: 2008/02/05 $'
23 __license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html'
26 def convertElementNode(elementNode, geometryOutput):
27 'Convert the xml element by geometryOutput.'
28 if geometryOutput == None:
30 if len(geometryOutput) < 1:
32 if len(geometryOutput) == 1:
33 firstLoop = geometryOutput[0]
34 if firstLoop.__class__ == list:
35 geometryOutput = firstLoop
36 firstElement = geometryOutput[0]
37 if firstElement.__class__ == list:
38 if len(firstElement) > 1:
39 convertElementNodeRenameByPaths(elementNode, geometryOutput)
41 convertElementNodeByPath(elementNode, firstElement)
43 convertElementNodeByPath(elementNode, geometryOutput)
45 def convertElementNodeByPath(elementNode, geometryOutput):
46 'Convert the xml element to a path xml element.'
47 createLinkPath(elementNode)
48 elementNode.xmlObject.vertexes = geometryOutput
49 vertex.addGeometryList(elementNode, geometryOutput)
51 def convertElementNodeRenameByPaths(elementNode, geometryOutput):
52 'Convert the xml element to a path xml element and add paths.'
53 createLinkPath(elementNode)
54 for geometryOutputChild in geometryOutput:
55 pathElement = xml_simple_reader.ElementNode()
56 pathElement.setParentAddToChildNodes(elementNode)
57 convertElementNodeByPath(pathElement, geometryOutputChild)
59 def createLinkPath(elementNode):
60 'Create and link a path object.'
61 elementNode.localName = 'path'
62 elementNode.linkObject(Path())
64 def processElementNode(elementNode):
65 'Process the xml element.'
66 evaluate.processArchivable(Path, elementNode)
69 class Path(dictionary.Dictionary):
73 dictionary.Dictionary.__init__(self)
74 self.matrix4X4 = matrix.Matrix()
75 self.oldChainTetragrid = None
76 self.transformedPath = None
79 def addXMLInnerSection(self, depth, output):
80 'Add the xml section for this object.'
81 if self.matrix4X4 != None:
82 self.matrix4X4.addXML(depth, output)
83 xml_simple_writer.addXMLFromVertexes(depth, output, self.vertexes)
85 def getFabricationExtension(self):
86 'Get fabrication extension.'
89 def getFabricationText(self, addLayerTemplate):
90 'Get fabrication text.'
91 carving = SVGFabricationCarving(addLayerTemplate, self.elementNode)
92 carving.setCarveLayerHeight(setting.getSheetThickness(self.elementNode))
93 carving.processSVGElement(self.elementNode.getOwnerDocument().fileName)
96 def getMatrix4X4(self):
100 def getMatrixChainTetragrid(self):
101 'Get the matrix chain tetragrid.'
102 return matrix.getTetragridTimesOther(self.elementNode.parentNode.xmlObject.getMatrixChainTetragrid(), self.matrix4X4.tetragrid)
106 self.transformedPath = None
107 if len(self.vertexes) > 0:
108 return dictionary.getAllPaths([self.vertexes], self)
109 return dictionary.getAllPaths([], self)
111 def getTransformedPaths(self):
112 'Get all transformed paths.'
113 if self.elementNode == None:
114 return dictionary.getAllPaths([self.vertexes], self)
115 chainTetragrid = self.getMatrixChainTetragrid()
116 if self.oldChainTetragrid != chainTetragrid:
117 self.oldChainTetragrid = chainTetragrid
118 self.transformedPath = None
119 if self.transformedPath == None:
120 self.transformedPath = matrix.getTransformedVector3s(chainTetragrid, self.vertexes)
121 if len(self.transformedPath) > 0:
122 return dictionary.getAllTransformedPaths([self.transformedPath], self)
123 return dictionary.getAllTransformedPaths([], self)
126 class SVGFabricationCarving(object):
128 def __init__(self, addLayerTemplate, elementNode):
130 self.addLayerTemplate = addLayerTemplate
131 self.elementNode = elementNode
132 self.layerHeight = 1.0
136 'Get the string representation of this carving.'
137 return self.getCarvedSVG()
139 def addXML(self, depth, output):
140 'Add xml for this object.'
141 xml_simple_writer.addXMLFromObjects(depth, self.loopLayers, output)
143 def getCarveBoundaryLayers(self):
144 'Get the boundary layers.'
145 return self.loopLayers
147 def getCarveCornerMaximum(self):
148 'Get the corner maximum of the vertexes.'
149 return self.cornerMaximum
151 def getCarveCornerMinimum(self):
152 'Get the corner minimum of the vertexes.'
153 return self.cornerMinimum
155 def getCarvedSVG(self):
156 'Get the carved svg text.'
157 return svg_writer.getSVGByLoopLayers(self.addLayerTemplate, self, self.loopLayers)
159 def getCarveLayerHeight(self):
160 'Get the layer height.'
161 return self.layerHeight
163 def getFabmetheusXML(self):
164 'Return the fabmetheus XML.'
165 return self.elementNode.getOwnerDocument().getOriginalRoot()
167 def getInterpretationSuffix(self):
168 'Return the suffix for a carving.'
171 def processSVGElement(self, fileName):
172 'Parse SVG element and store the layers.'
173 self.fileName = fileName
174 paths = self.elementNode.xmlObject.getPaths()
182 loopLayer = euclidean.LoopLayer(z)
183 self.loopLayers.append(loopLayer)
185 loopLayer.loops.append(euclidean.getComplexPath(path))
186 if len(self.loopLayers) < 1:
188 self.cornerMaximum = Vector3(-987654321.0, -987654321.0, -987654321.0)
189 self.cornerMinimum = Vector3(987654321.0, 987654321.0, 987654321.0)
190 svg_writer.setSVGCarvingCorners(self.cornerMaximum, self.cornerMinimum, self.layerHeight, self.loopLayers)
192 def setCarveImportRadius( self, importRadius ):
193 'Set the import radius.'
196 def setCarveIsCorrectMesh( self, isCorrectMesh ):
197 'Set the is correct mesh flag.'
200 def setCarveLayerHeight( self, layerHeight ):
201 'Set the layer height.'
202 self.layerHeight = layerHeight