mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-06 22:47:29 -06:00
Style: Use "" for strings not ''
This commit is contained in:
parent
7cc493ad91
commit
0a6562a8f1
24 changed files with 242 additions and 240 deletions
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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"))
|
||||||
|
|
|
@ -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]
|
||||||
|
|
|
@ -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")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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()):
|
||||||
|
|
|
@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
|
@ -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");
|
||||||
|
|
56
setup.py
56
setup.py
|
@ -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")
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue