1 from __future__ import absolute_import
3 from optparse import OptionParser
12 if not hasattr(sys, 'frozen'):
13 cura_sf_path = os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)), "./cura_sf/"))
14 if cura_sf_path not in sys.path:
15 sys.path.append(cura_sf_path)
17 from Cura.util import profile
18 from Cura.slice.cura_sf.skeinforge_application.skeinforge_plugins.craft_plugins import export
21 if input.startswith('#UTF8#'):
22 return input[6:].decode('utf-8')
26 parser = OptionParser(usage="usage: %prog [options] <X,Y> <filename>[, <X,Y> <filename>][, ...]")
27 parser.add_option("-p", "--profile", action="store", type="string", dest="profile",
28 help="Encoded profile to use for the print")
29 parser.add_option("-o", "--output", action="store", type="string", dest="output",
30 help="Output filename")
31 (options, args) = parser.parse_args()
32 if options.output is None:
33 print 'Missing output filename'
35 if options.profile is not None:
36 profile.loadGlobalProfileFromString(options.profile)
37 options.output = fixUTF8(options.output)
40 resultFile = open(options.output, "w")
41 for idx in xrange(0, len(args), 2):
42 position = map(float, args[idx].split(','))
43 if len(position) < 9 + 2:
44 position = position[0:2]
48 filenames = fixUTF8(args[idx + 1]).split('|')
50 profile.setTempOverride('object_center_x', position[0])
51 profile.setTempOverride('object_center_y', position[1])
53 resultFile.write(';TYPE:CUSTOM\n')
54 resultFile.write(profile.getAlterationFileContents('start.gcode').replace('?filename?', ' '.join(filenames).encode('ascii', 'replace')))
56 resultFile.write(';TYPE:CUSTOM\n')
57 n = output[-1].rfind('Z')+1
58 zString = output[-1][n:n+20]
59 zString = zString[0:zString.find(' ')]
60 clearZ = max(clearZ, float(zString) + 10)
61 profile.setTempOverride('clear_z', clearZ)
63 print profile.getAlterationFileContents('nextobject.gcode')
64 resultFile.write(profile.getAlterationFileContents('nextobject.gcode').replace('?filename?', ' '.join(filenames).encode('ascii', 'replace')))
67 for filename in filenames:
68 extruderNr = filenames.index(filename)
69 profile.resetTempOverride()
71 profile.setTempOverride('object_center_x', position[0] - profile.getPreferenceFloat('extruder_offset_x%d' % (extruderNr)))
72 profile.setTempOverride('object_center_y', position[1] - profile.getPreferenceFloat('extruder_offset_y%d' % (extruderNr)))
73 profile.setTempOverride('fan_enabled', 'False')
74 profile.setTempOverride('skirt_line_count', '0')
75 profile.setTempOverride('alternative_center', filenames[0])
77 profile.setTempOverride('object_center_x', position[0])
78 profile.setTempOverride('object_center_y', position[1])
79 profile.setTempOverride('object_matrix', ','.join(map(str, position[2:11])))
80 output.append(export.getOutput(filename))
81 profile.resetTempOverride()
83 resultFile.write(output[0])
85 stitchMultiExtruder(output, resultFile)
86 resultFile.write(';TYPE:CUSTOM\n')
87 resultFile.write(profile.getAlterationFileContents('end.gcode'))
90 print "Running plugins"
91 ret = profile.runPostProcessingPlugins(options.output)
94 print "Finalizing %s" % (os.path.basename(options.output))
95 if profile.getPreference('submit_slice_information') == 'True':
96 filenames = fixUTF8(args[idx + 1]).split('|')
97 for filename in filenames:
99 f = open(filename, "rb")
107 'processor': platform.processor(),
108 'machine': platform.machine(),
109 'platform': platform.platform(),
110 'profile': profile.getGlobalProfileString(),
111 'modelhash': m.hexdigest(),
114 f = urllib2.urlopen("http://software.ultimaker.com/upload_stats.php", data = urllib.urlencode(data), timeout = 5);
121 def stitchMultiExtruder(outputList, resultFile):
122 print "Stitching %i files for multi-extrusion" % (len(outputList))
124 resultFile.write('T%d\n' % (currentExtruder))
127 outputList = map(lambda o: o.split('\n'), outputList)
128 outputOrder = range(0, len(outputList))
131 outputOrder.reverse()
132 for outputIdx in outputOrder:
134 while len(outputList[outputIdx]) > 0:
135 line = outputList[outputIdx].pop(0)
137 if line.startswith(';LAYER:'):
140 lastZ = float(re.search('Z([^\s]+)', line).group(1))
142 nextExtruder = outputIdx
143 resultFile.write(';LAYER:%d\n' % (layerNr))
144 resultFile.write(';EXTRUDER:%d\n' % (nextExtruder))
145 if nextExtruder != currentExtruder:
146 resultFile.write(';TYPE:CUSTOM\n')
147 profile.setTempOverride('extruder', nextExtruder)
148 resultFile.write(profile.getAlterationFileContents('switchExtruder.gcode') + '\n')
149 profile.resetTempOverride()
150 currentExtruder = nextExtruder
152 resultFile.write(line)
153 resultFile.write('\n')
156 if __name__ == '__main__':