Style: Use "" for strings not ''

This commit is contained in:
Arjen Hiemstra 2015-05-06 18:32:54 +02:00
parent 7cc493ad91
commit 0a6562a8f1
24 changed files with 242 additions and 240 deletions

View file

@ -23,13 +23,13 @@ class CuraEngineBackend(Backend):
super().__init__() super().__init__()
# Find out where the engine is located, and how it is called. This depends on how Cura is packaged and which OS we are running on. # Find out where the engine is located, and how it is called. This depends on how Cura is packaged and which OS we are running on.
default_engine_location = '../PinkUnicornEngine/CuraEngine' default_engine_location = "../PinkUnicornEngine/CuraEngine"
if hasattr(sys, 'frozen'): if hasattr(sys, "frozen"):
default_engine_location = os.path.join(os.path.dirname(os.path.abspath(sys.executable)), 'CuraEngine') default_engine_location = os.path.join(os.path.dirname(os.path.abspath(sys.executable)), "CuraEngine")
if sys.platform == 'win32': if sys.platform == "win32":
default_engine_location += '.exe' default_engine_location += ".exe"
default_engine_location = os.path.abspath(default_engine_location) default_engine_location = os.path.abspath(default_engine_location)
Preferences.getInstance().addPreference('backend/location', default_engine_location) Preferences.getInstance().addPreference("backend/location", default_engine_location)
self._scene = Application.getInstance().getController().getScene() self._scene = Application.getInstance().getController().getScene()
self._scene.sceneChanged.connect(self._onSceneChanged) self._scene.sceneChanged.connect(self._onSceneChanged)
@ -59,7 +59,7 @@ class CuraEngineBackend(Backend):
self.backendConnected.connect(self._onBackendConnected) self.backendConnected.connect(self._onBackendConnected)
def getEngineCommand(self): def getEngineCommand(self):
return [Preferences.getInstance().getValue("backend/location"), '-j', Resources.getPath(Resources.SettingsLocation, 'fdmprinter.json'), '-vv', '--connect', "127.0.0.1:{0}".format(self._port)] return [Preferences.getInstance().getValue("backend/location"), "-j", Resources.getPath(Resources.SettingsLocation, "fdmprinter.json"), "-vv", "--connect", "127.0.0.1:{0}".format(self._port)]
## Emitted when we get a message containing print duration and material amount. This also implies the slicing has finished. ## Emitted when we get a message containing print duration and material amount. This also implies the slicing has finished.
# \param time The amount of time the print will take. # \param time The amount of time the print will take.
@ -84,13 +84,13 @@ class CuraEngineBackend(Backend):
# - report_progress: True if the slicing progress should be reported, False if not. Default is True. # - report_progress: True if the slicing progress should be reported, False if not. Default is True.
def slice(self, **kwargs): def slice(self, **kwargs):
if self._slicing: if self._slicing:
if not kwargs.get('force_restart', True): if not kwargs.get("force_restart", True):
return return
self._slicing = False self._slicing = False
self._restart = True self._restart = True
if self._process is not None: if self._process is not None:
Logger.log('d', "Killing engine process") Logger.log("d", "Killing engine process")
try: try:
self._process.terminate() self._process.terminate()
except: # terminating a process that is already terminating causes an exception, silently ignore this. except: # terminating a process that is already terminating causes an exception, silently ignore this.
@ -101,7 +101,7 @@ class CuraEngineBackend(Backend):
objects = [] objects = []
for node in DepthFirstIterator(self._scene.getRoot()): for node in DepthFirstIterator(self._scene.getRoot()):
if type(node) is SceneNode and node.getMeshData() and node.getMeshData().getVertices() is not None: if type(node) is SceneNode and node.getMeshData() and node.getMeshData().getVertices() is not None:
if not getattr(node, '_outside_buildarea', False): if not getattr(node, "_outside_buildarea", False):
objects.append(node) objects.append(node)
if not objects: if not objects:
@ -110,22 +110,22 @@ class CuraEngineBackend(Backend):
self._slicing = True self._slicing = True
self.slicingStarted.emit() self.slicingStarted.emit()
self._report_progress = kwargs.get('report_progress', True) self._report_progress = kwargs.get("report_progress", True)
if self._report_progress: if self._report_progress:
self.processingProgress.emit(0.0) self.processingProgress.emit(0.0)
self._sendSettings(kwargs.get('settings', self._settings)) self._sendSettings(kwargs.get("settings", self._settings))
self._scene.acquireLock() self._scene.acquireLock()
# Set the gcode as an empty list. This will be filled with strings by GCodeLayer messages. # Set the gcode as an empty list. This will be filled with strings by GCodeLayer messages.
# This is done so the gcode can be fragmented in memory and does not need a continues memory space. # This is done so the gcode can be fragmented in memory and does not need a continues memory space.
# (AKA. This prevents MemoryErrors) # (AKA. This prevents MemoryErrors)
self._save_gcode = kwargs.get('save_gcode', True) self._save_gcode = kwargs.get("save_gcode", True)
if self._save_gcode: if self._save_gcode:
setattr(self._scene, 'gcode_list', []) setattr(self._scene, "gcode_list", [])
self._save_polygons = kwargs.get('save_polygons', True) self._save_polygons = kwargs.get("save_polygons", True)
msg = Cura_pb2.ObjectList() msg = Cura_pb2.ObjectList()
@ -194,7 +194,7 @@ class CuraEngineBackend(Backend):
def _onGCodePrefixMessage(self, message): def _onGCodePrefixMessage(self, message):
if self._save_gcode: if self._save_gcode:
self._scene.gcode_list.insert(0, message.data.decode('utf-8', 'replace')) self._scene.gcode_list.insert(0, message.data.decode("utf-8", "replace"))
def _onObjectPrintTimeMessage(self, message): def _onObjectPrintTimeMessage(self, message):
self.printDurationMessage.emit(message.time, message.material_amount) self.printDurationMessage.emit(message.time, message.material_amount)
@ -221,7 +221,7 @@ class CuraEngineBackend(Backend):
for setting in settings.getAllSettings(include_machine=True): for setting in settings.getAllSettings(include_machine=True):
s = msg.settings.add() s = msg.settings.add()
s.name = setting.getKey() s.name = setting.getKey()
s.value = str(setting.getValue()).encode('utf-8') s.value = str(setting.getValue()).encode("utf-8")
self._socket.sendMessage(msg) self._socket.sendMessage(msg)

View file

@ -10,4 +10,4 @@ class ProcessGCodeLayerJob(Job):
self._message = message self._message = message
def run(self): def run(self):
self._scene.gcode_list.append(self._message.data.decode('utf-8', 'replace')) self._scene.gcode_list.append(self._message.data.decode("utf-8", "replace"))

View file

@ -11,7 +11,7 @@ import struct
class ProcessSlicedObjectListJob(Job): class ProcessSlicedObjectListJob(Job):
def __init__(self, message): def __init__(self, message):
super().__init__(description = 'Processing sliced object') super().__init__()
self._message = message self._message = message
self._scene = Application.getInstance().getController().getScene() self._scene = Application.getInstance().getController().getScene()
@ -27,7 +27,7 @@ class ProcessSlicedObjectListJob(Job):
objectIdMap[id(node)] = node objectIdMap[id(node)] = node
settings = Application.getInstance().getActiveMachine() settings = Application.getInstance().getActiveMachine()
layerHeight = settings.getSettingValueByKey('layer_height') layerHeight = settings.getSettingValueByKey("layer_height")
for object in self._message.objects: for object in self._message.objects:
try: try:
@ -40,7 +40,7 @@ class ProcessSlicedObjectListJob(Job):
layerData = LayerData.LayerData() layerData = LayerData.LayerData()
for layer in object.layers: for layer in object.layers:
for polygon in layer.polygons: for polygon in layer.polygons:
points = numpy.fromstring(polygon.points, dtype='i8') # Convert bytearray to numpy array points = numpy.fromstring(polygon.points, dtype="i8") # Convert bytearray to numpy array
points = points.reshape((-1,2)) # We get a linear list of pairs that make up the points, so make numpy interpret them correctly. points = points.reshape((-1,2)) # We get a linear list of pairs that make up the points, so make numpy interpret them correctly.
points = numpy.asarray(points, dtype=numpy.float32) points = numpy.asarray(points, dtype=numpy.float32)
points /= 1000 points /= 1000
@ -48,11 +48,11 @@ class ProcessSlicedObjectListJob(Job):
points[:,2] *= -1 points[:,2] *= -1
if not settings.getSettingValueByKey('machine_center_is_zero'): if not settings.getSettingValueByKey("machine_center_is_zero"):
center = [settings.getSettingValueByKey('machine_width') / 2, 0.0, -settings.getSettingValueByKey('machine_depth') / 2] center = [settings.getSettingValueByKey("machine_width") / 2, 0.0, -settings.getSettingValueByKey("machine_depth") / 2]
points -= numpy.array(center) points -= numpy.array(center)
#points = numpy.pad(points, ((0,0), (0,1)), 'constant', constant_values=(0.0, 1.0)) #points = numpy.pad(points, ((0,0), (0,1)), "constant", constant_values=(0.0, 1.0))
#inverse = node.getWorldTransformation().getInverse().getData() #inverse = node.getWorldTransformation().getInverse().getData()
#points = points.dot(inverse) #points = points.dot(inverse)
#points = points[:,0:3] #points = points[:,0:3]

View file

@ -2,15 +2,15 @@
from . import CuraEngineBackend from . import CuraEngineBackend
from UM.i18n import i18nCatalog from UM.i18n import i18nCatalog
catalog = i18nCatalog('cura') catalog = i18nCatalog("cura")
def getMetaData(): def getMetaData():
return { return {
'type': 'backend', "type": "backend",
'plugin': { "plugin": {
'name': "CuraEngine Backend", "name": "CuraEngine Backend",
'author': 'Arjen Hiemstra', "author": "Arjen Hiemstra",
'description': catalog.i18nc('CuraEngine backend plugin description', 'Provides the link to the CuraEngine slicing backend') "description": catalog.i18nc("CuraEngine backend plugin description", "Provides the link to the CuraEngine slicing backend")
} }
} }

View file

@ -10,12 +10,12 @@ class GCodeWriter(MeshWriter):
self._gcode = None self._gcode = None
def write(self, file_name, storage_device, mesh_data): def write(self, file_name, storage_device, mesh_data):
if 'gcode' in file_name: if "gcode" in file_name:
scene = Application.getInstance().getController().getScene() scene = Application.getInstance().getController().getScene()
gcode_list = getattr(scene, 'gcode_list') gcode_list = getattr(scene, "gcode_list")
if gcode_list: if gcode_list:
f = storage_device.openFile(file_name, 'wt') f = storage_device.openFile(file_name, "wt")
Logger.log('d', "Writing GCode to file %s", file_name) Logger.log("d", "Writing GCode to file %s", file_name)
for gcode in gcode_list: for gcode in gcode_list:
f.write(gcode) f.write(gcode)
storage_device.closeFile(f) storage_device.closeFile(f)

View file

@ -2,21 +2,21 @@ from . import GCodeWriter
from UM.i18n import i18nCatalog from UM.i18n import i18nCatalog
catalog = i18nCatalog('cura') catalog = i18nCatalog("cura")
def getMetaData(): def getMetaData():
return { return {
'type': 'mesh_writer', "type": "mesh_writer",
'plugin': { "plugin": {
'name': 'GCode Writer', "name": "GCode Writer",
'author': 'Arjen Hiemstra', "author": "Arjen Hiemstra",
'version': '1.0', "version": "1.0",
'description': catalog.i18nc('GCode Writer Plugin Description', 'Writes GCode to a file') "description": catalog.i18nc("GCode Writer Plugin Description", "Writes GCode to a file")
}, },
'mesh_writer': { "mesh_writer": {
'extension': 'gcode', "extension": "gcode",
'description': catalog.i18nc('GCode Writer File Description', 'GCode File') "description": catalog.i18nc("GCode Writer File Description", "GCode File")
} }
} }

View file

@ -17,7 +17,7 @@ class LayerView(View):
renderer.setRenderSelection(False) renderer.setRenderSelection(False)
if not self._material: if not self._material:
self._material = renderer.createMaterial(Resources.getPath(Resources.ShadersLocation, 'basic.vert'), Resources.getPath(Resources.ShadersLocation, 'vertexcolor.frag')) self._material = renderer.createMaterial(Resources.getPath(Resources.ShadersLocation, "basic.vert"), Resources.getPath(Resources.ShadersLocation, "vertexcolor.frag"))
self._material.setUniformValue("u_color", [1.0, 0.0, 0.0, 1.0]) self._material.setUniformValue("u_color", [1.0, 0.0, 0.0, 1.0])
for node in DepthFirstIterator(scene.getRoot()): for node in DepthFirstIterator(scene.getRoot()):

View file

@ -1,17 +1,17 @@
from . import LayerView from . import LayerView
from UM.i18n import i18nCatalog from UM.i18n import i18nCatalog
catalog = i18nCatalog('cura') catalog = i18nCatalog("cura")
def getMetaData(): def getMetaData():
return { return {
'type': 'view', "type": "view",
'plugin': { "plugin": {
"name": "Layer View" "name": "Layer View"
}, },
'view': { "view": {
'name': catalog.i18nc('Layers View mode', 'Layers'), "name": catalog.i18nc("Layers View mode", "Layers"),
'view_panel': 'LayerView.qml' "view_panel": "LayerView.qml"
} }
} }

View file

@ -129,7 +129,7 @@ class PrinterConnection(SignalEmitter):
hex_file = intelHex.readHex(self._firmware_file_name) hex_file = intelHex.readHex(self._firmware_file_name)
if len(hex_file) == 0: if len(hex_file) == 0:
Logger.log('e', "Unable to read provided hex file. Could not update firmware") Logger.log("e", "Unable to read provided hex file. Could not update firmware")
return return
programmer = stk500v2.Stk500v2() programmer = stk500v2.Stk500v2()
@ -139,7 +139,7 @@ class PrinterConnection(SignalEmitter):
time.sleep(1) # Give programmer some time to connect. Might need more in some cases, but this worked in all tested cases. time.sleep(1) # Give programmer some time to connect. Might need more in some cases, but this worked in all tested cases.
if not programmer.isConnected(): if not programmer.isConnected():
Logger.log('e', "Unable to connect with serial. Could not update firmware") Logger.log("e", "Unable to connect with serial. Could not update firmware")
return return
self._updating_firmware = True self._updating_firmware = True
@ -164,12 +164,12 @@ class PrinterConnection(SignalEmitter):
self._is_connecting = True self._is_connecting = True
programmer = stk500v2.Stk500v2() programmer = stk500v2.Stk500v2()
try: try:
programmer.connect(self._serial_port) # Connect with the serial, if this succeeds, it's an arduino based usb device. programmer.connect(self._serial_port) # Connect with the serial, if this succeeds, it"s an arduino based usb device.
self._serial = programmer.leaveISP() self._serial = programmer.leaveISP()
except ispBase.IspError as e: except ispBase.IspError as e:
Logger.log('i', "Could not establish connection on %s: %s. Device is not arduino based." %(self._serial_port,str(e))) Logger.log("i", "Could not establish connection on %s: %s. Device is not arduino based." %(self._serial_port,str(e)))
except Exception as e: except Exception as e:
Logger.log('i', "Could not establish connection on %s, unknown reasons. Device is not arduino based." % self._serial_port) Logger.log("i", "Could not establish connection on %s, unknown reasons. Device is not arduino based." % self._serial_port)
# If the programmer connected, we know its an atmega based version. Not all that usefull, but it does give some debugging information. # If the programmer connected, we know its an atmega based version. Not all that usefull, but it does give some debugging information.
for baud_rate in self._getBaudrateList(): # Cycle all baud rates (auto detect) for baud_rate in self._getBaudrateList(): # Cycle all baud rates (auto detect)
@ -178,7 +178,7 @@ class PrinterConnection(SignalEmitter):
try: try:
self._serial = serial.Serial(str(self._serial_port), baud_rate, timeout=3, writeTimeout=10000) self._serial = serial.Serial(str(self._serial_port), baud_rate, timeout=3, writeTimeout=10000)
except serial.SerialException: except serial.SerialException:
Logger.log('i', "Could not open port %s" % self._serial_port) Logger.log("i", "Could not open port %s" % self._serial_port)
return return
else: else:
if not self.setBaudRate(baud_rate): if not self.setBaudRate(baud_rate):
@ -187,7 +187,7 @@ class PrinterConnection(SignalEmitter):
sucesfull_responses = 0 sucesfull_responses = 0
timeout_time = time.time() + 5 timeout_time = time.time() + 5
self._serial.write(b"\n") self._serial.write(b"\n")
self._sendCommand("M105") # Request temperature, as this should (if baudrate is correct) result in a command with 'T:' in it self._sendCommand("M105") # Request temperature, as this should (if baudrate is correct) result in a command with "T:" in it
while timeout_time > time.time(): while timeout_time > time.time():
line = self._readline() line = self._readline()
if line is None: if line is None:
@ -202,7 +202,7 @@ class PrinterConnection(SignalEmitter):
if sucesfull_responses >= self._required_responses_auto_baud: if sucesfull_responses >= self._required_responses_auto_baud:
self._serial.timeout = 2 #Reset serial timeout self._serial.timeout = 2 #Reset serial timeout
self.setIsConnected(True) self.setIsConnected(True)
Logger.log('i', "Established printer connection on port %s" % self._serial_port) Logger.log("i", "Established printer connection on port %s" % self._serial_port)
return return
self.close() # Unable to connect, wrap up. self.close() # Unable to connect, wrap up.
self.setIsConnected(False) self.setIsConnected(False)
@ -223,15 +223,15 @@ class PrinterConnection(SignalEmitter):
if self._is_connected: if self._is_connected:
self._listen_thread.start() #Start listening self._listen_thread.start() #Start listening
'''Application.getInstance().addOutputDevice(self._serial_port, { '''Application.getInstance().addOutputDevice(self._serial_port, {
'id': self._serial_port, "id": self._serial_port,
'function': self.printGCode, "function": self.printGCode,
'description': 'Print with USB {0}'.format(self._serial_port), "description": "Print with USB {0}".format(self._serial_port),
'icon': 'print_usb', "icon": "print_usb",
'priority': 1 "priority": 1
})''' })'''
else: else:
Logger.log('w', "Printer connection state was not changed") Logger.log("w", "Printer connection state was not changed")
connectionStateChanged = Signal() connectionStateChanged = Signal()
@ -254,37 +254,37 @@ class PrinterConnection(SignalEmitter):
def _sendCommand(self, cmd): def _sendCommand(self, cmd):
if self._serial is None: if self._serial is None:
return return
if 'M109' in cmd or 'M190' in cmd: if "M109" in cmd or "M190" in cmd:
self._heatup_wait_start_time = time.time() self._heatup_wait_start_time = time.time()
if 'M104' in cmd or 'M109' in cmd: if "M104" in cmd or "M109" in cmd:
try: try:
t = 0 t = 0
if 'T' in cmd: if "T" in cmd:
t = int(re.search('T([0-9]+)', cmd).group(1)) t = int(re.search("T([0-9]+)", cmd).group(1))
self._target_extruder_temperatures[t] = float(re.search('S([0-9]+)', cmd).group(1)) self._target_extruder_temperatures[t] = float(re.search("S([0-9]+)", cmd).group(1))
except: except:
pass pass
if 'M140' in cmd or 'M190' in cmd: if "M140" in cmd or "M190" in cmd:
try: try:
self._target_bed_temperature = float(re.search('S([0-9]+)', cmd).group(1)) self._target_bed_temperature = float(re.search("S([0-9]+)", cmd).group(1))
except: except:
pass pass
#Logger.log('i','Sending: %s' % (cmd)) #Logger.log("i","Sending: %s" % (cmd))
try: try:
command = (cmd + '\n').encode() command = (cmd + "\n").encode()
#self._serial.write(b'\n') #self._serial.write(b"\n")
self._serial.write(command) self._serial.write(command)
except serial.SerialTimeoutException: except serial.SerialTimeoutException:
Logger.log("w","Serial timeout while writing to serial port, trying again.") Logger.log("w","Serial timeout while writing to serial port, trying again.")
try: try:
time.sleep(0.5) time.sleep(0.5)
self._serial.write((cmd + '\n').encode()) self._serial.write((cmd + "\n").encode())
except Exception as e: except Exception as e:
Logger.log("e","Unexpected error while writing serial port %s " % e) Logger.log("e","Unexpected error while writing serial port %s " % e)
self._setErrorState("Unexpected error while writing serial port %s " % e) self._setErrorState("Unexpected error while writing serial port %s " % e)
self.close() self.close()
except Exception as e: except Exception as e:
Logger.log('e',"Unexpected error while writing serial port %s" % e) Logger.log("e","Unexpected error while writing serial port %s" % e)
self._setErrorState("Unexpected error while writing serial port %s " % e) self._setErrorState("Unexpected error while writing serial port %s " % e)
self.close() self.close()
@ -332,7 +332,7 @@ class PrinterConnection(SignalEmitter):
## Listen thread function. ## Listen thread function.
def _listen(self): def _listen(self):
Logger.log('i', "Printer connection listen thread started for %s" % self._serial_port) Logger.log("i", "Printer connection listen thread started for %s" % self._serial_port)
temperature_request_timeout = time.time() temperature_request_timeout = time.time()
ok_timeout = time.time() ok_timeout = time.time()
while self._is_connected: while self._is_connected:
@ -341,24 +341,24 @@ class PrinterConnection(SignalEmitter):
if line is None: if line is None:
break # None is only returned when something went wrong. Stop listening break # None is only returned when something went wrong. Stop listening
if line.startswith(b'Error:'): if line.startswith(b"Error:"):
# Oh YEAH, consistency. # Oh YEAH, consistency.
# Marlin reports an MIN/MAX temp error as "Error:x\n: Extruder switched off. MAXTEMP triggered !\n" # Marlin reports an MIN/MAX temp error as "Error:x\n: Extruder switched off. MAXTEMP triggered !\n"
# But a bed temp error is reported as "Error: Temperature heated bed switched off. MAXTEMP triggered !!" # But a bed temp error is reported as "Error: Temperature heated bed switched off. MAXTEMP triggered !!"
# So we can have an extra newline in the most common case. Awesome work people. # So we can have an extra newline in the most common case. Awesome work people.
if re.match(b'Error:[0-9]\n', line): if re.match(b"Error:[0-9]\n", line):
line = line.rstrip() + self._readline() line = line.rstrip() + self._readline()
# Skip the communication errors, as those get corrected. # Skip the communication errors, as those get corrected.
if b'Extruder switched off' in line or b'Temperature heated bed switched off' in line or b'Something is wrong, please turn off the printer.' in line: if b"Extruder switched off" in line or b"Temperature heated bed switched off" in line or b"Something is wrong, please turn off the printer." in line:
if not self.hasError(): if not self.hasError():
self._setErrorState(line[6:]) self._setErrorState(line[6:])
elif b' T:' in line or line.startswith(b'T:'): #Temperature message elif b" T:" in line or line.startswith(b"T:"): #Temperature message
try: try:
self._setExtruderTemperature(self._temperature_requested_extruder_index,float(re.search(b"T: *([0-9\.]*)", line).group(1))) self._setExtruderTemperature(self._temperature_requested_extruder_index,float(re.search(b"T: *([0-9\.]*)", line).group(1)))
except: except:
pass pass
if b'B:' in line: # Check if it's a bed temperature if b"B:" in line: # Check if it"s a bed temperature
try: try:
self._setBedTemperature(float(re.search(b"B: *([0-9\.]*)", line).group(1))) self._setBedTemperature(float(re.search(b"B: *([0-9\.]*)", line).group(1)))
except Exception as e: except Exception as e:
@ -374,16 +374,16 @@ class PrinterConnection(SignalEmitter):
self.sendCommand("M105") self.sendCommand("M105")
temperature_request_timeout = time.time() + 5 temperature_request_timeout = time.time() + 5
if line == b'' and time.time() > ok_timeout: if line == b"" and time.time() > ok_timeout:
line = b'ok' # Force a timeout (basicly, send next command) line = b"ok" # Force a timeout (basicly, send next command)
if b'ok' in line: if b"ok" in line:
ok_timeout = time.time() + 5 ok_timeout = time.time() + 5
if not self._command_queue.empty(): if not self._command_queue.empty():
self._sendCommand(self._command_queue.get()) self._sendCommand(self._command_queue.get())
else: else:
self._sendNextGcodeLine() self._sendNextGcodeLine()
elif b"resend" in line.lower() or b"rs" in line: # Because a resend can be asked with 'resend' and 'rs' elif b"resend" in line.lower() or b"rs" in line: # Because a resend can be asked with "resend" and "rs"
try: try:
self._gcode_position = int(line.replace(b"N:",b" ").replace(b"N",b" ").replace(b":",b" ").split()[-1]) self._gcode_position = int(line.replace(b"N:",b" ").replace(b"N",b" ").replace(b":",b" ").split()[-1])
except: except:
@ -391,13 +391,13 @@ class PrinterConnection(SignalEmitter):
self._gcode_position = int(line.split()[1]) self._gcode_position = int(line.split()[1])
else: # Request the temperature on comm timeout (every 2 seconds) when we are not printing.) else: # Request the temperature on comm timeout (every 2 seconds) when we are not printing.)
if line == b'': if line == b"":
if self._extruder_count > 0: if self._extruder_count > 0:
self._temperature_requested_extruder_index = (self._temperature_requested_extruder_index + 1) % self._extruder_count self._temperature_requested_extruder_index = (self._temperature_requested_extruder_index + 1) % self._extruder_count
self.sendCommand("M105 T%d" % self._temperature_requested_extruder_index) self.sendCommand("M105 T%d" % self._temperature_requested_extruder_index)
else: else:
self.sendCommand("M105") self.sendCommand("M105")
Logger.log('i', "Printer connection listen thread stopped for %s" % self._serial_port) Logger.log("i", "Printer connection listen thread stopped for %s" % self._serial_port)
## Send next Gcode in the gcode list ## Send next Gcode in the gcode list
def _sendNextGcodeLine(self): def _sendNextGcodeLine(self):
@ -407,20 +407,20 @@ class PrinterConnection(SignalEmitter):
self._print_start_time_100 = time.time() self._print_start_time_100 = time.time()
line = self._gcode[self._gcode_position] line = self._gcode[self._gcode_position]
if ';' in line: if ";" in line:
line = line[:line.find(';')] line = line[:line.find(";")]
line = line.strip() line = line.strip()
try: try:
if line == 'M0' or line == 'M1': if line == "M0" or line == "M1":
line = 'M105' #Don't send the M0 or M1 to the machine, as M0 and M1 are handled as an LCD menu pause. line = "M105" #Don"t send the M0 or M1 to the machine, as M0 and M1 are handled as an LCD menu pause.
if ('G0' in line or 'G1' in line) and 'Z' in line: if ("G0" in line or "G1" in line) and "Z" in line:
z = float(re.search('Z([0-9\.]*)', line).group(1)) z = float(re.search("Z([0-9\.]*)", line).group(1))
if self._current_z != z: if self._current_z != z:
self._current_z = z self._current_z = z
except Exception as e: except Exception as e:
Logger.log('e', "Unexpected error with printer connection: %s" % e) Logger.log("e", "Unexpected error with printer connection: %s" % e)
self._setErrorState("Unexpected error: %s" %e) self._setErrorState("Unexpected error: %s" %e)
checksum = functools.reduce(lambda x,y: x^y, map(ord, 'N%d%s' % (self._gcode_position, line))) checksum = functools.reduce(lambda x,y: x^y, map(ord, "N%d%s" % (self._gcode_position, line)))
self._sendCommand("N%d%s*%d" % (self._gcode_position, line, checksum)) self._sendCommand("N%d%s*%d" % (self._gcode_position, line, checksum))
self._gcode_position += 1 self._gcode_position += 1
@ -457,7 +457,7 @@ class PrinterConnection(SignalEmitter):
try: try:
ret = self._serial.readline() ret = self._serial.readline()
except Exception as e: except Exception as e:
Logger.log('e',"Unexpected error while reading serial port. %s" %e) Logger.log("e","Unexpected error while reading serial port. %s" %e)
self._setErrorState("Printer has been disconnected") self._setErrorState("Printer has been disconnected")
self.close() self.close()
return None return None

View file

@ -17,7 +17,7 @@ from PyQt5.QtCore import QUrl, QObject, pyqtSlot, pyqtProperty, pyqtSignal
from UM.i18n import i18nCatalog from UM.i18n import i18nCatalog
i18n_catalog = i18nCatalog('plugins') i18n_catalog = i18nCatalog("plugins")
class USBPrinterManager(QObject, SignalEmitter, Extension): class USBPrinterManager(QObject, SignalEmitter, Extension):
@ -40,17 +40,17 @@ class USBPrinterManager(QObject, SignalEmitter, Extension):
## Add menu item to top menu of the application. ## Add menu item to top menu of the application.
self.addMenuItem(i18n_catalog.i18n("Update firmware"), self.updateAllFirmware) self.addMenuItem(i18n_catalog.i18n("Update firmware"), self.updateAllFirmware)
pyqtError = pyqtSignal(str, arguments = ['amount']) pyqtError = pyqtSignal(str, arguments = ["amount"])
processingProgress = pyqtSignal(float, arguments = ['amount']) processingProgress = pyqtSignal(float, arguments = ["amount"])
pyqtExtruderTemperature = pyqtSignal(float, arguments = ['amount']) pyqtExtruderTemperature = pyqtSignal(float, arguments = ["amount"])
pyqtBedTemperature = pyqtSignal(float, arguments = ['amount']) pyqtBedTemperature = pyqtSignal(float, arguments = ["amount"])
## Show firmware interface. ## Show firmware interface.
# This will create the view if its not already created. # This will create the view if its not already created.
def spawnFirmwareInterface(self, serial_port): def spawnFirmwareInterface(self, serial_port):
if self._firmware_view is None: if self._firmware_view is None:
self._firmware_view = QQuickView() self._firmware_view = QQuickView()
self._firmware_view.engine().rootContext().setContextProperty('manager',self) self._firmware_view.engine().rootContext().setContextProperty("manager",self)
self._firmware_view.setSource(QUrl("plugins/USBPrinting/FirmwareUpdateWindow.qml")) self._firmware_view.setSource(QUrl("plugins/USBPrinting/FirmwareUpdateWindow.qml"))
self._firmware_view.show() self._firmware_view.show()
@ -59,7 +59,7 @@ class USBPrinterManager(QObject, SignalEmitter, Extension):
def spawnControlInterface(self,serial_port): def spawnControlInterface(self,serial_port):
if self._control_view is None: if self._control_view is None:
self._control_view = QQuickView() self._control_view = QQuickView()
self._control_view.engine().rootContext().setContextProperty('manager',self) self._control_view.engine().rootContext().setContextProperty("manager",self)
self._control_view.setSource(QUrl("plugins/USBPrinting/ControlWindow.qml")) self._control_view.setSource(QUrl("plugins/USBPrinting/ControlWindow.qml"))
self._control_view.show() self._control_view.show()
@ -105,7 +105,7 @@ class USBPrinterManager(QObject, SignalEmitter, Extension):
if connection != None: if connection != None:
self._printer_connections.remove(connection) self._printer_connections.remove(connection)
connection.close() connection.close()
time.sleep(5) # Throttle, as we don't need this information to be updated every single second. time.sleep(5) # Throttle, as we don"t need this information to be updated every single second.
def updateAllFirmware(self): def updateAllFirmware(self):
self.spawnFirmwareInterface("") self.spawnFirmwareInterface("")
@ -122,13 +122,13 @@ class USBPrinterManager(QObject, SignalEmitter, Extension):
machine_type = Application.getInstance().getActiveMachine().getTypeID() machine_type = Application.getInstance().getActiveMachine().getTypeID()
firmware_name = "" firmware_name = ""
baudrate = 250000 baudrate = 250000
if sys.platform.startswith('linux'): if sys.platform.startswith("linux"):
baudrate = 115200 baudrate = 115200
if machine_type == "ultimaker_original": if machine_type == "ultimaker_original":
firmware_name = 'MarlinUltimaker' firmware_name = "MarlinUltimaker"
firmware_name += '-%d' % (baudrate) firmware_name += "-%d" % (baudrate)
elif machine_type == "ultimaker_original_plus": elif machine_type == "ultimaker_original_plus":
firmware_name = 'MarlinUltimaker-UMOP-%d' % (baudrate) firmware_name = "MarlinUltimaker-UMOP-%d" % (baudrate)
elif machine_type == "Witbox": elif machine_type == "Witbox":
return "MarlinWitbox.hex" return "MarlinWitbox.hex"
elif machine_type == "ultimaker2go": elif machine_type == "ultimaker2go":
@ -220,22 +220,22 @@ class USBPrinterManager(QObject, SignalEmitter, Extension):
connection = self.getConnectionByPort(serial_port) connection = self.getConnectionByPort(serial_port)
if connection.isConnected(): if connection.isConnected():
Application.getInstance().addOutputDevice(serial_port, { Application.getInstance().addOutputDevice(serial_port, {
'id': serial_port, "id": serial_port,
'function': self.spawnControlInterface, "function": self.spawnControlInterface,
'description': 'Write to USB {0}'.format(serial_port), "description": "Write to USB {0}".format(serial_port),
'icon': 'print_usb', "icon": "print_usb",
'priority': 1 "priority": 1
}) })
else: else:
Application.getInstance().removeOutputDevice(serial_port) Application.getInstance().removeOutputDevice(serial_port)
@pyqtSlot() @pyqtSlot()
def startPrint(self): def startPrint(self):
gcode_list = getattr(Application.getInstance().getController().getScene(), 'gcode_list', None) gcode_list = getattr(Application.getInstance().getController().getScene(), "gcode_list", None)
if gcode_list: if gcode_list:
final_list = [] final_list = []
for gcode in gcode_list: for gcode in gcode_list:
final_list += gcode.split('\n') final_list += gcode.split("\n")
self.sendGCodeToAllActive(gcode_list) self.sendGCodeToAllActive(gcode_list)
## Get a list of printer connection objects that are connected. ## Get a list of printer connection objects that are connected.
@ -260,15 +260,15 @@ class USBPrinterManager(QObject, SignalEmitter, Extension):
i = 0 i = 0
while True: while True:
values = winreg.EnumValue(key, i) values = winreg.EnumValue(key, i)
if not base_list or 'USBSER' in values[0]: if not base_list or "USBSER" in values[0]:
base_list += [values[1]] base_list += [values[1]]
i += 1 i += 1
except Exception as e: except Exception as e:
pass pass
if base_list: if base_list:
base_list = base_list + glob.glob('/dev/ttyUSB*') + glob.glob('/dev/ttyACM*') + glob.glob("/dev/cu.usb*") base_list = base_list + glob.glob("/dev/ttyUSB*") + glob.glob("/dev/ttyACM*") + glob.glob("/dev/cu.usb*")
base_list = filter(lambda s: 'Bluetooth' not in s, base_list) # Filter because mac sometimes puts them in the list base_list = filter(lambda s: "Bluetooth" not in s, base_list) # Filter because mac sometimes puts them in the list
else: else:
base_list = base_list + glob.glob('/dev/ttyUSB*') + glob.glob('/dev/ttyACM*') + glob.glob("/dev/cu.*") + glob.glob("/dev/tty.usb*") + glob.glob("/dev/rfcomm*") + glob.glob('/dev/serial/by-id/*') base_list = base_list + glob.glob("/dev/ttyUSB*") + glob.glob("/dev/ttyACM*") + glob.glob("/dev/cu.*") + glob.glob("/dev/tty.usb*") + glob.glob("/dev/rfcomm*") + glob.glob("/dev/serial/by-id/*")
return base_list return base_list

View file

@ -2,16 +2,16 @@ from . import USBPrinterManager
from UM.i18n import i18nCatalog from UM.i18n import i18nCatalog
i18n_catalog = i18nCatalog('cura') i18n_catalog = i18nCatalog("cura")
def getMetaData(): def getMetaData():
return { return {
'type': 'extension', "type": "extension",
'plugin': { "plugin": {
'name': 'USB printing', "name": "USB printing",
'author': 'Jaime van Kessel', "author": "Jaime van Kessel",
'version': '1.0', "version": "1.0",
'description': i18n_catalog.i18nc('usb printing description','Accepts G-Code and sends them to a printer. Plugin can also update firmware') "description": i18n_catalog.i18nc("usb printing description","Accepts G-Code and sends them to a printer. Plugin can also update firmware")
} }
} }

View file

@ -268,7 +268,7 @@ UM.MainWindow {
id: preferences id: preferences
Component.onCompleted: { Component.onCompleted: {
insertPage(1, qsTr('View'), 'view-preview', Qt.resolvedUrl('./ViewPage.qml')); insertPage(1, qsTr("View"), "view-preview", Qt.resolvedUrl("./ViewPage.qml"));
} }
} }

View file

@ -32,7 +32,7 @@ Item {
checkable: true; checkable: true;
checked: model.active; checked: model.active;
//Workaround since using ToolButton's onClicked would break the binding of the checked property, instead //Workaround since using ToolButton"s onClicked would break the binding of the checked property, instead
//just catch the click so we do not trigger that behaviour. //just catch the click so we do not trigger that behaviour.
MouseArea { MouseArea {
anchors.fill: parent; anchors.fill: parent;

View file

@ -15,7 +15,7 @@ Button {
enabled: progress >= 0.95; enabled: progress >= 0.95;
property string currentDevice: 'local_file' property string currentDevice: "local_file"
property bool defaultOverride: false; property bool defaultOverride: false;
property bool defaultAmbiguous: false; property bool defaultAmbiguous: false;

View file

@ -50,13 +50,13 @@ UM.AngledCornerRectangle {
modesModel: modesListModel; modesModel: modesListModel;
currentModeIndex: { currentModeIndex: {
var index = parseInt(UM.Preferences.getValue('cura/active_mode')) var index = parseInt(UM.Preferences.getValue("cura/active_mode"))
if(index) { if(index) {
return index; return index;
} }
return 0; return 0;
} }
onCurrentModeIndexChanged: UM.Preferences.setValue('cura/active_mode', currentModeIndex); onCurrentModeIndexChanged: UM.Preferences.setValue("cura/active_mode", currentModeIndex);
} }
Loader { Loader {

View file

@ -102,8 +102,8 @@ Item {
style: UM.Theme.styles.checkbox; style: UM.Theme.styles.checkbox;
checked: Printer.getSettingValue('support_enable'); checked: Printer.getSettingValue("support_enable");
onCheckedChanged: Printer.setSettingValue('support_enable', checked); onCheckedChanged: Printer.setSettingValue("support_enable", checked);
} }
Item { Layout.fillWidth: true; Layout.fillHeight: true; } Item { Layout.fillWidth: true; Layout.fillHeight: true; }

View file

@ -10,15 +10,15 @@ UM.PreferencesPage {
function reset() function reset()
{ {
UM.Preferences.resetPreference('view/show_overhang'); UM.Preferences.resetPreference("view/show_overhang");
} }
GridLayout { GridLayout {
columns: 2; columns: 2;
CheckBox { CheckBox {
checked: UM.Preferences.getValue('view/show_overhang'); checked: UM.Preferences.getValue("view/show_overhang");
onCheckedChanged: UM.Preferences.setValue('view/show_overhang', checked) onCheckedChanged: UM.Preferences.setValue("view/show_overhang", checked)
//: Display Overhang preference checkbox //: Display Overhang preference checkbox
text: qsTr("Display Overhang"); text: qsTr("Display Overhang");

View file

@ -7,23 +7,23 @@ import re
import shutil import shutil
import site import site
includes = ['sip', 'ctypes', 'UM', 'PyQt5.QtNetwork', 'PyQt5._QOpenGLFunctions_2_0', 'serial', 'Arcus', 'google', 'google.protobuf', 'google.protobuf.descriptor', 'xml.etree', 'xml.etree.ElementTree', 'src'] includes = ["sip", "ctypes", "UM", "PyQt5.QtNetwork", "PyQt5._QOpenGLFunctions_2_0", "serial", "Arcus", "google", "google.protobuf", "google.protobuf.descriptor", "xml.etree", "xml.etree.ElementTree", "src"]
# Include all the UM modules in the includes. As py2exe fails to properly find all the dependencies due to the plugin architecture. # Include all the UM modules in the includes. As py2exe fails to properly find all the dependencies due to the plugin architecture.
for dirpath, dirnames, filenames in os.walk(os.path.dirname(UM.__file__)): for dirpath, dirnames, filenames in os.walk(os.path.dirname(UM.__file__)):
if '__' in dirpath: if "__" in dirpath:
continue continue
module_path = dirpath.replace(os.path.dirname(UM.__file__), 'UM') module_path = dirpath.replace(os.path.dirname(UM.__file__), "UM")
module_path = module_path.split(os.path.sep) module_path = module_path.split(os.path.sep)
module_name = '.'.join(module_path) module_name = ".".join(module_path)
if os.path.isfile(dirpath + '/__init__.py'): if os.path.isfile(dirpath + "/__init__.py"):
includes += [module_name] includes += [module_name]
for filename in filenames: for filename in filenames:
if '__' in filename or not filename.endswith('.py'): if "__" in filename or not filename.endswith(".py"):
continue continue
includes += [module_name + '.' + os.path.splitext(filename)[0]] includes += [module_name + "." + os.path.splitext(filename)[0]]
print('Removing previous distribution package') print("Removing previous distribution package")
shutil.rmtree('dist', True) shutil.rmtree("dist", True)
setup(name="Cura", setup(name="Cura",
version="2.0", version="2.0",
@ -36,24 +36,24 @@ setup(name="Cura",
console=[{"script": "printer.py"}], console=[{"script": "printer.py"}],
options={"py2exe": {"skip_archive": False, "includes": includes}}) options={"py2exe": {"skip_archive": False, "includes": includes}})
print('Coping Cura plugins.') print("Coping Cura plugins.")
shutil.copytree(os.path.dirname(UM.__file__) + '/../plugins', 'dist/plugins') shutil.copytree(os.path.dirname(UM.__file__) + "/../plugins", "dist/plugins")
for path in os.listdir('plugins'): for path in os.listdir("plugins"):
shutil.copytree('plugins/' + path, 'dist/plugins/' + path) shutil.copytree("plugins/" + path, "dist/plugins/" + path)
print('Coping resources.') print("Coping resources.")
shutil.copytree(os.path.dirname(UM.__file__) + '/../resources', 'dist/resources') shutil.copytree(os.path.dirname(UM.__file__) + "/../resources", "dist/resources")
shutil.copytree('resources/qml', 'dist/resources/qml') shutil.copytree("resources/qml", "dist/resources/qml")
shutil.copytree('resources/themes', 'dist/resources/themes') shutil.copytree("resources/themes", "dist/resources/themes")
print('Coping Uranium QML.') print("Coping Uranium QML.")
shutil.copytree(os.path.dirname(UM.__file__) + '/Qt/qml/UM', 'dist/qml/UM') shutil.copytree(os.path.dirname(UM.__file__) + "/Qt/qml/UM", "dist/qml/UM")
for site_package in site.getsitepackages(): for site_package in site.getsitepackages():
qt_origin_path = os.path.join(site_package, 'PyQt5') qt_origin_path = os.path.join(site_package, "PyQt5")
if os.path.isdir(qt_origin_path): if os.path.isdir(qt_origin_path):
print('Coping PyQt5 plugins from: %s' % qt_origin_path) print("Coping PyQt5 plugins from: %s" % qt_origin_path)
shutil.copytree(os.path.join(qt_origin_path, 'plugins'), 'dist/PyQt5/plugins') shutil.copytree(os.path.join(qt_origin_path, "plugins"), "dist/PyQt5/plugins")
print('Coping PyQt5 QtQuick from: %s' % qt_origin_path) print("Coping PyQt5 QtQuick from: %s" % qt_origin_path)
shutil.copytree(os.path.join(qt_origin_path, 'qml/QtQuick'), 'dist/qml/QtQuick') shutil.copytree(os.path.join(qt_origin_path, "qml/QtQuick"), "dist/qml/QtQuick")
shutil.copytree(os.path.join(qt_origin_path, 'qml/QtQuick.2'), 'dist/qml/QtQuick.2') shutil.copytree(os.path.join(qt_origin_path, "qml/QtQuick.2"), "dist/qml/QtQuick.2")
print('Coping PyQt5 svg library from: %s' % qt_origin_path) print("Coping PyQt5 svg library from: %s" % qt_origin_path)
shutil.copy(os.path.join(qt_origin_path, 'Qt5Svg.dll'), 'dist/Qt5Svg.dll') shutil.copy(os.path.join(qt_origin_path, "Qt5Svg.dll"), "dist/Qt5Svg.dll")
os.rename('dist/printer.exe', 'dist/Cura.exe') os.rename("dist/printer.exe", "dist/Cura.exe")

View file

@ -48,15 +48,15 @@ class BuildVolume(SceneNode):
if not self._material: if not self._material:
self._material = renderer.createMaterial( self._material = renderer.createMaterial(
Resources.getPath(Resources.ShadersLocation, 'basic.vert'), Resources.getPath(Resources.ShadersLocation, "basic.vert"),
Resources.getPath(Resources.ShadersLocation, 'vertexcolor.frag') Resources.getPath(Resources.ShadersLocation, "vertexcolor.frag")
) )
self._grid_material = renderer.createMaterial( self._grid_material = renderer.createMaterial(
Resources.getPath(Resources.ShadersLocation, 'basic.vert'), Resources.getPath(Resources.ShadersLocation, "basic.vert"),
Resources.getPath(Resources.ShadersLocation, 'grid.frag') Resources.getPath(Resources.ShadersLocation, "grid.frag")
) )
self._grid_material.setUniformValue('u_gridColor0', Color(245, 245, 245, 255)) self._grid_material.setUniformValue("u_gridColor0", Color(245, 245, 245, 255))
self._grid_material.setUniformValue('u_gridColor1', Color(205, 202, 201, 255)) self._grid_material.setUniformValue("u_gridColor1", Color(205, 202, 201, 255))
renderer.queueNode(self, material = self._material, mode = Renderer.RenderLines) renderer.queueNode(self, material = self._material, mode = Renderer.RenderLines)
renderer.queueNode(self, mesh = self._grid_mesh, material = self._grid_material) renderer.queueNode(self, mesh = self._grid_mesh, material = self._grid_material)

View file

@ -47,9 +47,9 @@ class ConvexHullNode(SceneNode):
def render(self, renderer): def render(self, renderer):
if not self._material: if not self._material:
self._material = renderer.createMaterial(Resources.getPath(Resources.ShadersLocation, 'basic.vert'), Resources.getPath(Resources.ShadersLocation, 'color.frag')) self._material = renderer.createMaterial(Resources.getPath(Resources.ShadersLocation, "basic.vert"), Resources.getPath(Resources.ShadersLocation, "color.frag"))
self._material.setUniformValue('u_color', Color(35, 35, 35, 128)) self._material.setUniformValue("u_color", Color(35, 35, 35, 128))
renderer.queueNode(self, material = self._material, transparent = True) renderer.queueNode(self, material = self._material, transparent = True)

View file

@ -52,8 +52,8 @@ class PlatformPhysics:
move_vector.setY(-bbox.bottom) move_vector.setY(-bbox.bottom)
# If there is no convex hull for the node, start calculating it and continue. # If there is no convex hull for the node, start calculating it and continue.
if not hasattr(node, '_convex_hull'): if not hasattr(node, "_convex_hull"):
if not hasattr(node, '_convex_hull_job'): if not hasattr(node, "_convex_hull_job"):
job = ConvexHullJob.ConvexHullJob(node) job = ConvexHullJob.ConvexHullJob(node)
job.start() job.start()
node._convex_hull_job = job node._convex_hull_job = job
@ -65,7 +65,7 @@ class PlatformPhysics:
continue continue
# Ignore nodes that do not have the right properties set. # Ignore nodes that do not have the right properties set.
if not hasattr(other_node, '_convex_hull') or not other_node.getBoundingBox(): if not hasattr(other_node, "_convex_hull") or not other_node.getBoundingBox():
continue continue
# Check to see if the bounding boxes intersect. If not, we can ignore the node as there is no way the hull intersects. # Check to see if the bounding boxes intersect. If not, we can ignore the node as there is no way the hull intersects.

View file

@ -27,4 +27,4 @@ class PlatformPhysicsOperation(Operation):
return group return group
def __repr__(self): def __repr__(self):
return 'PlatformPhysicsOperation(t = {0})'.format(self._position) return "PlatformPhysicsOperation(t = {0})".format(self._position)

View file

@ -168,27 +168,27 @@ class PrintInformation(QObject):
if not self._low_quality_settings: if not self._low_quality_settings:
self._low_quality_settings = MachineSettings() self._low_quality_settings = MachineSettings()
self._low_quality_settings.loadSettingsFromFile(Resources.getPath(Resources.SettingsLocation, self._current_settings.getTypeID() + '.json')) self._low_quality_settings.loadSettingsFromFile(Resources.getPath(Resources.SettingsLocation, self._current_settings.getTypeID() + ".json"))
self._low_quality_settings.loadValuesFromFile(Resources.getPath(Resources.SettingsLocation, 'profiles', 'low_quality.conf')) self._low_quality_settings.loadValuesFromFile(Resources.getPath(Resources.SettingsLocation, "profiles", "low_quality.conf"))
if not self._high_quality_settings: if not self._high_quality_settings:
self._high_quality_settings = MachineSettings() self._high_quality_settings = MachineSettings()
self._high_quality_settings.loadSettingsFromFile(Resources.getPath(Resources.SettingsLocation, self._current_settings.getTypeID() + '.json')) self._high_quality_settings.loadSettingsFromFile(Resources.getPath(Resources.SettingsLocation, self._current_settings.getTypeID() + ".json"))
self._high_quality_settings.loadValuesFromFile(Resources.getPath(Resources.SettingsLocation, 'profiles', 'high_quality.conf')) self._high_quality_settings.loadValuesFromFile(Resources.getPath(Resources.SettingsLocation, "profiles", "high_quality.conf"))
for key, options in self._interpolation_settings.items(): for key, options in self._interpolation_settings.items():
minimum_value = None minimum_value = None
if options['minimum'] == 'low': if options["minimum"] == "low":
minimum_value = self._low_quality_settings.getSettingValueByKey(key) minimum_value = self._low_quality_settings.getSettingValueByKey(key)
elif options['minimum'] == 'high': elif options["minimum"] == "high":
minimum_value = self._high_quality_settings.getSettingValueByKey(key) minimum_value = self._high_quality_settings.getSettingValueByKey(key)
else: else:
continue continue
maximum_value = None maximum_value = None
if options['maximum'] == 'low': if options["maximum"] == "low":
maximum_value = self._low_quality_settings.getSettingValueByKey(key) maximum_value = self._low_quality_settings.getSettingValueByKey(key)
elif options['maximum'] == 'high': elif options["maximum"] == "high":
maximum_value = self._high_quality_settings.getSettingValueByKey(key) maximum_value = self._high_quality_settings.getSettingValueByKey(key)
else: else:
continue continue

View file

@ -35,41 +35,42 @@ from PyQt5.QtGui import QColor
import sys import sys
import os.path import os.path
import numpy import numpy
numpy.seterr(all='ignore') numpy.seterr(all="ignore")
class PrinterApplication(QtApplication): class PrinterApplication(QtApplication):
def __init__(self): def __init__(self):
if not hasattr(sys, 'frozen'): if not hasattr(sys, "frozen"):
Resources.addResourcePath(os.path.join(os.path.abspath(os.path.dirname(__file__)), '..')) Resources.addResourcePath(os.path.join(os.path.abspath(os.path.dirname(__file__)), ".."))
super().__init__(name = 'cura', version = "master") super().__init__(name = "cura", version = "master")
self.setRequiredPlugins([ self.setRequiredPlugins([
'CuraEngineBackend', "CuraEngineBackend",
'MeshView', "MeshView",
'LayerView', "LayerView",
'STLReader', "STLReader",
'SelectionTool', "SelectionTool",
'CameraTool', "CameraTool",
'GCodeWriter', "GCodeWriter",
'LocalFileStorage' "LocalFileStorage"
]) ])
self._physics = None self._physics = None
self._volume = None self._volume = None
self._platform = None self._platform = None
self._output_devices = {} self._output_devices = {}
self._print_information = None self._print_information = None
self._i18n_catalog = None
self.activeMachineChanged.connect(self._onActiveMachineChanged) self.activeMachineChanged.connect(self._onActiveMachineChanged)
Preferences.getInstance().addPreference('cura/active_machine', '') Preferences.getInstance().addPreference("cura/active_machine", "")
Preferences.getInstance().addPreference('cura/active_mode', 'simple') Preferences.getInstance().addPreference("cura/active_mode", "simple")
## Handle loading of all plugin types (and the backend explicitly) ## Handle loading of all plugin types (and the backend explicitly)
# \sa PluginRegistery # \sa PluginRegistery
def _loadPlugins(self): def _loadPlugins(self):
if not hasattr(sys, 'frozen'): if not hasattr(sys, "frozen"):
self._plugin_registry.addPluginLocation(os.path.join(os.path.abspath(os.path.dirname(__file__)), '..', 'plugins')) self._plugin_registry.addPluginLocation(os.path.join(os.path.abspath(os.path.dirname(__file__)), "..", "plugins"))
self._plugin_registry.loadPlugins({ "type": "logger"}) self._plugin_registry.loadPlugins({ "type": "logger"})
self._plugin_registry.loadPlugins({ "type": "storage_device" }) self._plugin_registry.loadPlugins({ "type": "storage_device" })
@ -79,20 +80,20 @@ class PrinterApplication(QtApplication):
self._plugin_registry.loadPlugins({ "type": "tool" }) self._plugin_registry.loadPlugins({ "type": "tool" })
self._plugin_registry.loadPlugins({ "type": "extension" }) self._plugin_registry.loadPlugins({ "type": "extension" })
self._plugin_registry.loadPlugin('CuraEngineBackend') self._plugin_registry.loadPlugin("CuraEngineBackend")
def run(self): def run(self):
i18n_catalog = i18nCatalog("cura"); self._i18n_catalog = i18nCatalog("cura");
self.addOutputDevice("local_file", { self.addOutputDevice("local_file", {
"id": "local_file", "id": "local_file",
"function": self._writeToLocalFile, "function": self._writeToLocalFile,
"description": i18n_catalog.i18nc("Save button tooltip", "Save to Disk"), "description": self._i18n_catalog.i18nc("Save button tooltip", "Save to Disk"),
"icon": "save", "icon": "save",
"priority": 0 "priority": 0
}) })
self.showSplashMessage(i18n_catalog.i18nc("Splash screen message", "Setting up scene...")) self.showSplashMessage(self._i18n_catalog.i18nc("Splash screen message", "Setting up scene..."))
controller = self.getController() controller = self.getController()
@ -100,7 +101,7 @@ class PrinterApplication(QtApplication):
controller.setCameraTool("CameraTool") controller.setCameraTool("CameraTool")
controller.setSelectionTool("SelectionTool") controller.setSelectionTool("SelectionTool")
t = controller.getTool('TranslateTool') t = controller.getTool("TranslateTool")
if t: if t:
t.setEnabledAxis([ToolHandle.XAxis, ToolHandle.ZAxis]) t.setEnabledAxis([ToolHandle.XAxis, ToolHandle.ZAxis])
@ -116,25 +117,25 @@ class PrinterApplication(QtApplication):
self._physics = PlatformPhysics.PlatformPhysics(controller, self._volume) self._physics = PlatformPhysics.PlatformPhysics(controller, self._volume)
camera = Camera('3d', root) camera = Camera("3d", root)
camera.setPosition(Vector(-150, 150, 300)) camera.setPosition(Vector(-150, 150, 300))
camera.setPerspective(True) camera.setPerspective(True)
camera.lookAt(Vector(0, 0, 0)) camera.lookAt(Vector(0, 0, 0))
self._camera_animation = CameraAnimation.CameraAnimation() self._camera_animation = CameraAnimation.CameraAnimation()
self._camera_animation.setCameraTool(self.getController().getTool('CameraTool')) self._camera_animation.setCameraTool(self.getController().getTool("CameraTool"))
controller.getScene().setActiveCamera('3d') controller.getScene().setActiveCamera("3d")
self.showSplashMessage(i18n_catalog.i18nc("Splash screen message", "Loading interface...")) self.showSplashMessage(self._i18n_catalog.i18nc("Splash screen message", "Loading interface..."))
self.setMainQml(Resources.getPath(Resources.QmlFilesLocation, "Printer.qml")) self.setMainQml(Resources.getPath(Resources.QmlFilesLocation, "Printer.qml"))
self.initializeEngine() self.initializeEngine()
self.getStorageDevice('LocalFileStorage').removableDrivesChanged.connect(self._removableDrivesChanged) self.getStorageDevice("LocalFileStorage").removableDrivesChanged.connect(self._removableDrivesChanged)
if self.getMachines(): if self.getMachines():
active_machine_pref = Preferences.getInstance().getValue('cura/active_machine') active_machine_pref = Preferences.getInstance().getValue("cura/active_machine")
if active_machine_pref: if active_machine_pref:
for machine in self.getMachines(): for machine in self.getMachines():
if machine.getName() == active_machine_pref: if machine.getName() == active_machine_pref:
@ -152,16 +153,16 @@ class PrinterApplication(QtApplication):
self.exec_() self.exec_()
def registerObjects(self, engine): def registerObjects(self, engine):
engine.rootContext().setContextProperty('Printer', self) engine.rootContext().setContextProperty("Printer", self)
self._print_information = PrintInformation.PrintInformation() self._print_information = PrintInformation.PrintInformation()
engine.rootContext().setContextProperty('PrintInformation', self._print_information) engine.rootContext().setContextProperty("PrintInformation", self._print_information)
def onSelectionChanged(self): def onSelectionChanged(self):
if Selection.hasSelection(): if Selection.hasSelection():
if not self.getController().getActiveTool(): if not self.getController().getActiveTool():
self.getController().setActiveTool('TranslateTool') self.getController().setActiveTool("TranslateTool")
self._camera_animation.setStart(self.getController().getTool('CameraTool').getOrigin()) self._camera_animation.setStart(self.getController().getTool("CameraTool").getOrigin())
self._camera_animation.setTarget(Selection.getSelectedObject(0).getWorldPosition()) self._camera_animation.setTarget(Selection.getSelectedObject(0).getWorldPosition())
self._camera_animation.start() self._camera_animation.start()
else: else:
@ -171,7 +172,7 @@ class PrinterApplication(QtApplication):
requestAddPrinter = pyqtSignal() requestAddPrinter = pyqtSignal()
## Remove an object from the scene ## Remove an object from the scene
@pyqtSlot('quint64') @pyqtSlot("quint64")
def deleteObject(self, object_id): def deleteObject(self, object_id):
object = self.getController().getScene().findObject(object_id) object = self.getController().getScene().findObject(object_id)
@ -180,7 +181,7 @@ class PrinterApplication(QtApplication):
op.push() op.push()
## Create a number of copies of existing object. ## Create a number of copies of existing object.
@pyqtSlot('quint64', int) @pyqtSlot("quint64", int)
def multiplyObject(self, object_id, count): def multiplyObject(self, object_id, count):
node = self.getController().getScene().findObject(object_id) node = self.getController().getScene().findObject(object_id)
@ -196,7 +197,7 @@ class PrinterApplication(QtApplication):
op.push() op.push()
## Center object on platform. ## Center object on platform.
@pyqtSlot('quint64') @pyqtSlot("quint64")
def centerObject(self, object_id): def centerObject(self, object_id):
node = self.getController().getScene().findObject(object_id) node = self.getController().getScene().findObject(object_id)
@ -290,15 +291,15 @@ class PrinterApplication(QtApplication):
outputDevicesChanged = pyqtSignal() outputDevicesChanged = pyqtSignal()
@pyqtProperty('QVariantMap', notify = outputDevicesChanged) @pyqtProperty("QVariantMap", notify = outputDevicesChanged)
def outputDevices(self): def outputDevices(self):
return self._output_devices return self._output_devices
@pyqtProperty('QStringList', notify = outputDevicesChanged) @pyqtProperty("QStringList", notify = outputDevicesChanged)
def outputDeviceNames(self): def outputDeviceNames(self):
return self._output_devices.keys() return self._output_devices.keys()
@pyqtSlot(str, result = 'QVariant') @pyqtSlot(str, result = "QVariant")
def getSettingValue(self, key): def getSettingValue(self, key):
if not self.getActiveMachine(): if not self.getActiveMachine():
return None return None
@ -306,7 +307,7 @@ class PrinterApplication(QtApplication):
return self.getActiveMachine().getSettingValueByKey(key) return self.getActiveMachine().getSettingValueByKey(key)
## Change setting by key value pair ## Change setting by key value pair
@pyqtSlot(str, 'QVariant') @pyqtSlot(str, "QVariant")
def setSettingValue(self, key, value): def setSettingValue(self, key, value):
if not self.getActiveMachine(): if not self.getActiveMachine():
return return
@ -336,7 +337,7 @@ class PrinterApplication(QtApplication):
@pyqtSlot(str) @pyqtSlot(str)
def writeToOutputDevice(self, device): def writeToOutputDevice(self, device):
self._output_devices[device]['function'](device) self._output_devices[device]["function"](device)
writeToLocalFileRequested = pyqtSignal() writeToLocalFileRequested = pyqtSignal()
@ -349,12 +350,12 @@ class PrinterApplication(QtApplication):
continue continue
try: try:
path = self.getStorageDevice('LocalFileStorage').getRemovableDrives()[device] path = self.getStorageDevice("LocalFileStorage").getRemovableDrives()[device]
except KeyError: except KeyError:
Logger.log('e', 'Tried to write to unknown SD card %s', device) Logger.log("e", "Tried to write to unknown SD card %s", device)
return return
filename = os.path.join(path, node.getName()[0:node.getName().rfind('.')] + '.gcode') filename = os.path.join(path, node.getName()[0:node.getName().rfind(".")] + ".gcode")
job = WriteMeshJob(filename, node.getMeshData()) job = WriteMeshJob(filename, node.getMeshData())
job._sdcard = device job._sdcard = device
@ -363,7 +364,7 @@ class PrinterApplication(QtApplication):
return return
def _removableDrivesChanged(self): def _removableDrivesChanged(self):
drives = self.getStorageDevice('LocalFileStorage').getRemovableDrives() drives = self.getStorageDevice("LocalFileStorage").getRemovableDrives()
for drive in drives: for drive in drives:
if drive not in self._output_devices: if drive not in self._output_devices:
self.addOutputDevice(drive, { self.addOutputDevice(drive, {
@ -377,7 +378,7 @@ class PrinterApplication(QtApplication):
drives_to_remove = [] drives_to_remove = []
for device in self._output_devices: for device in self._output_devices:
if device not in drives: if device not in drives:
if self._output_devices[device]['function'] == self._writeToSD: if self._output_devices[device]["function"] == self._writeToSD:
drives_to_remove.append(device) drives_to_remove.append(device)
for drive in drives_to_remove: for drive in drives_to_remove:
@ -386,13 +387,13 @@ class PrinterApplication(QtApplication):
def _onActiveMachineChanged(self): def _onActiveMachineChanged(self):
machine = self.getActiveMachine() machine = self.getActiveMachine()
if machine: if machine:
Preferences.getInstance().setValue('cura/active_machine', machine.getName()) Preferences.getInstance().setValue("cura/active_machine", machine.getName())
self._volume.setWidth(machine.getSettingValueByKey('machine_width')) self._volume.setWidth(machine.getSettingValueByKey("machine_width"))
self._volume.setHeight(machine.getSettingValueByKey('machine_height')) self._volume.setHeight(machine.getSettingValueByKey("machine_height"))
self._volume.setDepth(machine.getSettingValueByKey('machine_depth')) self._volume.setDepth(machine.getSettingValueByKey("machine_depth"))
disallowed_areas = machine.getSettingValueByKey('machine_disallowed_areas') disallowed_areas = machine.getSettingValueByKey("machine_disallowed_areas")
areas = [] areas = []
if disallowed_areas: if disallowed_areas:
@ -407,10 +408,10 @@ class PrinterApplication(QtApplication):
self._volume.rebuild() self._volume.rebuild()
if self.getController().getTool('ScaleTool'): if self.getController().getTool("ScaleTool"):
self.getController().getTool('ScaleTool').setMaximumBounds(self._volume.getBoundingBox()) self.getController().getTool("ScaleTool").setMaximumBounds(self._volume.getBoundingBox())
offset = machine.getSettingValueByKey('machine_platform_offset') offset = machine.getSettingValueByKey("machine_platform_offset")
if offset: if offset:
self._platform.setPosition(Vector(offset[0], offset[1], offset[2])) self._platform.setPosition(Vector(offset[0], offset[1], offset[2]))
else: else:
@ -423,10 +424,11 @@ class PrinterApplication(QtApplication):
self._i18n_catalog.i18nc("Message action", "Eject"), self._i18n_catalog.i18nc("Message action", "Eject"),
"eject", "eject",
self._i18n_catalog.i18nc("Message action tooltip, {0} is sdcard", "Eject SD Card {0}".format(job._sdcard)) self._i18n_catalog.i18nc("Message action tooltip, {0} is sdcard", "Eject SD Card {0}".format(job._sdcard))
)
message._sdcard = job._sdcard message._sdcard = job._sdcard
message.actionTriggered.connect(self._onMessageActionTriggered) message.actionTriggered.connect(self._onMessageActionTriggered)
message.show() message.show()
def _onMessageActionTriggered(self, message, action): def _onMessageActionTriggered(self, message, action):
if action == "Eject": if action == "eject":
self.getStorageDevice("LocalFileStorage").ejectRemovableDrive(message._sdcard) self.getStorageDevice("LocalFileStorage").ejectRemovableDrive(message._sdcard)