chiark / gitweb /
f58116879ea290f9ab683d42c6bb090a651317d1
[cura.git] / Cura / fabmetheus_utilities / geometry / manipulation_meta / write.py
1 """
2 Boolean geometry write.
3
4 """
5
6 from __future__ import absolute_import
7 #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.
8 import __init__
9
10 from fabmetheus_utilities.geometry.geometry_utilities import evaluate
11 from fabmetheus_utilities.geometry.geometry_utilities import matrix
12 from fabmetheus_utilities import archive
13 from fabmetheus_utilities import euclidean
14 from fabmetheus_utilities import gcodec
15 import os
16
17 __author__ = 'Enrique Perez (perez_enrique@yahoo.com)'
18 __credits__ = 'Art of Illusion <http://www.artofillusion.org/>'
19 __date__ = '$Date: 2008/02/05 $'
20 __license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html'
21
22
23 def getNewDerivation(elementNode):
24         'Get new derivation.'
25         return WriteDerivation(elementNode)
26
27 def processElementNode(elementNode):
28         "Process the xml element."
29         processElementNodeByDerivation(None, elementNode)
30
31 def processElementNodeByDerivation(derivation, elementNode):
32         'Process the xml element by derivation.'
33         if derivation == None:
34                 derivation = WriteDerivation(elementNode)
35         if len(derivation.targets) < 1:
36                 print('Warning, processElementNode in write could not get targets for:')
37                 print(elementNode)
38                 return
39         fileNames = []
40         for target in derivation.targets:
41                 writeElementNode(derivation, fileNames, target)
42
43 def writeElementNode(derivation, fileNames, target):
44         "Write a quantity of the target."
45         xmlObject = target.xmlObject
46         if xmlObject == None:
47                 print('Warning, writeTarget in write could not get xmlObject for:')
48                 print(target)
49                 print(derivation.elementNode)
50                 return
51         parserDirectory = os.path.dirname(derivation.elementNode.getOwnerDocument().fileName)
52         absoluteFolderDirectory = os.path.abspath(os.path.join(parserDirectory, derivation.folderName))
53         if '/models' not in absoluteFolderDirectory:
54                 print('Warning, models/ was not in the absolute file path, so for security nothing will be done for:')
55                 print(derivation.elementNode)
56                 print('For which the absolute folder path is:')
57                 print(absoluteFolderDirectory)
58                 print('The write tool can only write a file which has models/ in the file path.')
59                 print('To write the file, move the file into a folder called model/ or a subfolder which is inside the model folder tree.')
60                 return
61         quantity = evaluate.getEvaluatedInt(1, target, 'quantity')
62         for itemIndex in xrange(quantity):
63                 writeXMLObject(absoluteFolderDirectory, derivation, fileNames, target, xmlObject)
64
65 def writeXMLObject(absoluteFolderDirectory, derivation, fileNames, target, xmlObject):
66         "Write one instance of the xmlObject."
67         extension = evaluate.getEvaluatedString(xmlObject.getFabricationExtension(), derivation.elementNode, 'extension')
68         fileNameRoot = derivation.fileName
69         if fileNameRoot == '':
70                 fileNameRoot = evaluate.getEvaluatedString('', target, 'name')
71                 fileNameRoot = evaluate.getEvaluatedString(fileNameRoot, target, 'id')
72                 fileNameRoot += derivation.suffix
73         fileName = '%s.%s' % (fileNameRoot, extension)
74         suffixIndex = 2
75         while fileName in fileNames:
76                 fileName = '%s_%s.%s' % (fileNameRoot, suffixIndex, extension)
77                 suffixIndex += 1
78         absoluteFileName = os.path.join(absoluteFolderDirectory, fileName)
79         fileNames.append(fileName)
80         archive.makeDirectory(absoluteFolderDirectory)
81         if not derivation.writeMatrix:
82                 xmlObject.matrix4X4 = matrix.Matrix()
83         print('The write tool generated the file:')
84         print(absoluteFileName)
85         archive.writeFileText(absoluteFileName, xmlObject.getFabricationText(derivation.addLayerTemplate))
86
87
88 class WriteDerivation:
89         "Class to hold write variables."
90         def __init__(self, elementNode):
91                 'Set defaults.'
92                 self.addLayerTemplate = evaluate.getEvaluatedBoolean(False, elementNode, 'addLayerTemplate')
93                 self.elementNode = elementNode
94                 self.fileName = evaluate.getEvaluatedString('', elementNode, 'file')
95                 self.folderName = evaluate.getEvaluatedString('', elementNode, 'folder')
96                 self.suffix = evaluate.getEvaluatedString('', elementNode, 'suffix')
97                 self.targets = evaluate.getElementNodesByKey(elementNode, 'target')
98                 self.writeMatrix = evaluate.getEvaluatedBoolean(True, elementNode, 'writeMatrix')