Merge remote-tracking branch 'origin/master' into refactoring_machine_manager

This commit is contained in:
Lipu Fei 2018-02-21 14:05:19 +01:00
commit 9a354efd19
15 changed files with 197 additions and 30 deletions

View file

@ -14,8 +14,9 @@ import urllib.request
import urllib.error import urllib.error
import shutil import shutil
from PyQt5.QtCore import QT_VERSION_STR, PYQT_VERSION_STR, QFile from PyQt5.QtCore import QT_VERSION_STR, PYQT_VERSION_STR, QUrl
from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QVBoxLayout, QLabel, QTextEdit, QGroupBox, QCheckBox, QPushButton from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QVBoxLayout, QLabel, QTextEdit, QGroupBox, QCheckBox, QPushButton
from PyQt5.QtGui import QDesktopServices
from UM.Application import Application from UM.Application import Application
from UM.Logger import Logger from UM.Logger import Logger
@ -91,7 +92,7 @@ class CrashHandler:
label = QLabel() label = QLabel()
label.setText(catalog.i18nc("@label crash message", """<p><b>A fatal error has occurred.</p></b> label.setText(catalog.i18nc("@label crash message", """<p><b>A fatal error has occurred.</p></b>
<p>Unfortunately, Cura encountered an unrecoverable error during start up. It was possibly caused by some incorrect configuration files. We suggest to backup and reset your configuration.</p> <p>Unfortunately, Cura encountered an unrecoverable error during start up. It was possibly caused by some incorrect configuration files. We suggest to backup and reset your configuration.</p>
<p>Your backup can be found in your Configuration folder.</p> <p>Backups can be found in the configuration folder.</p>
<p>Please send us this Crash Report to fix the problem.</p> <p>Please send us this Crash Report to fix the problem.</p>
""")) """))
label.setWordWrap(True) label.setWordWrap(True)
@ -105,8 +106,13 @@ class CrashHandler:
show_details_button.setMaximumWidth(200) show_details_button.setMaximumWidth(200)
show_details_button.clicked.connect(self._showDetailedReport) show_details_button.clicked.connect(self._showDetailedReport)
show_configuration_folder_button = QPushButton(catalog.i18nc("@action:button", "Show configuration folder"), dialog)
show_configuration_folder_button.setMaximumWidth(200)
show_configuration_folder_button.clicked.connect(self._showConfigurationFolder)
layout.addWidget(self._send_report_checkbox) layout.addWidget(self._send_report_checkbox)
layout.addWidget(show_details_button) layout.addWidget(show_details_button)
layout.addWidget(show_configuration_folder_button)
# "backup and start clean" and "close" buttons # "backup and start clean" and "close" buttons
buttons = QDialogButtonBox() buttons = QDialogButtonBox()
@ -182,6 +188,10 @@ class CrashHandler:
self.early_crash_dialog.close() self.early_crash_dialog.close()
def _showConfigurationFolder(self):
path = Resources.getConfigStoragePath();
QDesktopServices.openUrl(QUrl.fromLocalFile( path ))
def _showDetailedReport(self): def _showDetailedReport(self):
self.dialog.exec_() self.dialog.exec_()

View file

@ -1596,8 +1596,16 @@ class CuraApplication(QtApplication):
for original_node in nodes: for original_node in nodes:
# Create a CuraSceneNode just if the original node is not that type # Create a CuraSceneNode just if the original node is not that type
node = original_node if isinstance(original_node, CuraSceneNode) else CuraSceneNode() if isinstance(original_node, CuraSceneNode):
node.setMeshData(original_node.getMeshData()) node = original_node
else:
node = CuraSceneNode()
node.setMeshData(original_node.getMeshData())
#Setting meshdata does not apply scaling.
if(original_node.getScale() != Vector(1.0, 1.0, 1.0)):
node.scale(original_node.getScale())
node.setSelectable(True) node.setSelectable(True)
node.setName(os.path.basename(filename)) node.setName(os.path.basename(filename))

View file

@ -208,19 +208,12 @@ class CuraContainerRegistry(ContainerRegistry):
Logger.log("e", "Incorrect profile [%s]. Could not find global profile", file_name) Logger.log("e", "Incorrect profile [%s]. Could not find global profile", file_name)
return { "status": "error", return { "status": "error",
"message": catalog.i18nc("@info:status Don't translate the XML tags <filename> or <message>!", "This profile <filename>{0}</filename> contains incorrect data, could not import it.", file_name)} "message": catalog.i18nc("@info:status Don't translate the XML tags <filename> or <message>!", "This profile <filename>{0}</filename> contains incorrect data, could not import it.", file_name)}
profile_definition = global_profile.getMetaDataEntry("definition")
# In a profile we can have the quality_definition metadata, but if not, we get the definition expected_machine_definition = "fdmprinter"
profile_definition = global_profile.getMetaDataEntry("quality_definition")
if not profile_definition:
profile_definition = global_profile.getMetaDataEntry("definition")
# The expected machine definition may be the quality_definition if defined or the current definition id
expected_machine_definition = None
if parseBool(global_container_stack.getMetaDataEntry("has_machine_quality", "False")): if parseBool(global_container_stack.getMetaDataEntry("has_machine_quality", "False")):
expected_machine_definition = global_container_stack.getMetaDataEntry("quality_definition") expected_machine_definition = global_container_stack.getMetaDataEntry("quality_definition")
if not expected_machine_definition: if not expected_machine_definition:
expected_machine_definition = global_container_stack.definition.getId() expected_machine_definition = global_container_stack.definition.getId()
if expected_machine_definition is not None and profile_definition is not None and profile_definition != expected_machine_definition: if expected_machine_definition is not None and profile_definition is not None and profile_definition != expected_machine_definition:
Logger.log("e", "Profile [%s] is for machine [%s] but the current active machine is [%s]. Will not import the profile", file_name, profile_definition, expected_machine_definition) Logger.log("e", "Profile [%s] is for machine [%s] but the current active machine is [%s]. Will not import the profile", file_name, profile_definition, expected_machine_definition)
return { "status": "error", return { "status": "error",

View file

@ -10,7 +10,7 @@ class MaterialSettingsVisibilityHandler(UM.Settings.Models.SettingVisibilityHand
material_settings = { material_settings = {
"default_material_print_temperature", "default_material_print_temperature",
"material_bed_temperature", "default_material_bed_temperature",
"material_standby_temperature", "material_standby_temperature",
#"material_flow_temp_graph", #"material_flow_temp_graph",
"cool_fan_speed", "cool_fan_speed",

View file

@ -191,7 +191,7 @@ class CuraEngineBackend(QObject, Backend):
## Perform a slice of the scene. ## Perform a slice of the scene.
def slice(self): def slice(self):
Logger.log("d", "starting to slice!") Logger.log("d", "Starting to slice...")
self._slice_start_time = time() self._slice_start_time = time()
if not self._build_plates_to_be_sliced: if not self._build_plates_to_be_sliced:
self.processingProgress.emit(1.0) self.processingProgress.emit(1.0)
@ -199,7 +199,7 @@ class CuraEngineBackend(QObject, Backend):
return return
if self._process_layers_job: if self._process_layers_job:
Logger.log("d", " ## Process layers job still busy, trying later") Logger.log("d", "Process layers job still busy, trying later.")
return return
if not hasattr(self._scene, "gcode_dict"): if not hasattr(self._scene, "gcode_dict"):

View file

@ -121,9 +121,13 @@ class GCodeWriter(MeshWriter):
if flat_global_container.getMetaDataEntry("quality_type", None) is None: if flat_global_container.getMetaDataEntry("quality_type", None) is None:
flat_global_container.addMetaDataEntry("quality_type", stack.quality.getMetaDataEntry("quality_type", "normal")) flat_global_container.addMetaDataEntry("quality_type", stack.quality.getMetaDataEntry("quality_type", "normal"))
# Ensure that quality_definition is set. (Can happen if we have empty quality changes). # Change the default defintion
default_machine_definition = "fdmprinter"
if parseBool(stack.getMetaDataEntry("has_machine_quality", "False")): if parseBool(stack.getMetaDataEntry("has_machine_quality", "False")):
flat_global_container.addMetaDataEntry("quality_definition", stack.getMetaDataEntry("quality_definition")) default_machine_definition = stack.getMetaDataEntry("quality_definition")
if not default_machine_definition:
default_machine_definition = stack.definition.getId()
flat_global_container.setMetaDataEntry("definition", default_machine_definition)
serialized = flat_global_container.serialize() serialized = flat_global_container.serialize()
data = {"global_quality": serialized} data = {"global_quality": serialized}
@ -145,6 +149,15 @@ class GCodeWriter(MeshWriter):
# Ensure that quality_type is set. (Can happen if we have empty quality changes). # Ensure that quality_type is set. (Can happen if we have empty quality changes).
if flat_extruder_quality.getMetaDataEntry("quality_type", None) is None: if flat_extruder_quality.getMetaDataEntry("quality_type", None) is None:
flat_extruder_quality.addMetaDataEntry("quality_type", extruder.quality.getMetaDataEntry("quality_type", "normal")) flat_extruder_quality.addMetaDataEntry("quality_type", extruder.quality.getMetaDataEntry("quality_type", "normal"))
# Change the default defintion
default_extruder_definition = "fdmextruder"
if parseBool(stack.getMetaDataEntry("has_machine_quality", "False")):
default_extruder_definition = extruder.getMetaDataEntry("quality_definition")
if not default_extruder_definition:
default_extruder_definition = extruder.definition.getId()
flat_extruder_quality.setMetaDataEntry("definition", default_extruder_definition)
extruder_serialized = flat_extruder_quality.serialize() extruder_serialized = flat_extruder_quality.serialize()
data.setdefault("extruder_quality", []).append(extruder_serialized) data.setdefault("extruder_quality", []).append(extruder_serialized)

View file

@ -419,8 +419,6 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice):
self._authentication_failed_message.show() self._authentication_failed_message.show()
elif status_code == 200: elif status_code == 200:
self.setAuthenticationState(AuthState.Authenticated) self.setAuthenticationState(AuthState.Authenticated)
# Now we know for sure that we are authenticated, send the material profiles to the machine.
self._sendMaterialProfiles()
def _checkAuthentication(self): def _checkAuthentication(self):
Logger.log("d", "Checking if authentication is correct for id %s and key %s", self._authentication_id, self._getSafeAuthKey()) Logger.log("d", "Checking if authentication is correct for id %s and key %s", self._authentication_id, self._getSafeAuthKey())

View file

@ -7,7 +7,6 @@
"author": "Dagoma", "author": "Dagoma",
"manufacturer": "Dagoma", "manufacturer": "Dagoma",
"file_formats": "text/x-gcode", "file_formats": "text/x-gcode",
"icon": "icon_discoeasy200.png",
"platform": "discoeasy200.stl", "platform": "discoeasy200.stl",
"platform_offset": [ 105, -59, 280] "platform_offset": [ 105, -59, 280]
}, },
@ -39,13 +38,25 @@
"default_value": 10 "default_value": 10
}, },
"machine_start_gcode": { "machine_start_gcode": {
"default_value": ";Gcode by Cura\nG90 ;absolute positioning\nM106 S250 ;fan on for the palpeur\nG28 X Y\nG1 X50\nM109 S180\nG28\nM104 S{material_print_temperature_layer_0}\n;Activation palpeur\n;bloc palpeur\nG29 ;Auto level\nM107 ;start with the fan off\nG1 X100 Y20 F3000\nG1 Z0.5\nM109 S{material_print_temperature_layer_0}\nM82 ;set extruder to absolute mode\nG92 E0 ;zero the extruded length\nG1 F200 E10 ;extrude 10mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 Z3\nG1 F6000" "default_value": ";Gcode by Cura\nG90\nM106 S250\nG28 X Y\nG1 X50\nM109 S180\nG28\nM104 S{material_print_temperature_layer_0}\nG29\nM107\nG1 X100 Y20 F3000\nG1 Z0.5\nM109 S{material_print_temperature_layer_0}\nM82\nG92 E0\nG1 F200 E10\nG92 E0\nG1 Z3\nG1 F6000\n"
}, },
"machine_end_gcode": { "machine_end_gcode": {
"default_value": "M104 S0\nM106 S255 ;start fan full power\nM140 S0 ;heated bed heater off (if you have it)\n;Home machine\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+3 F3000 ;move Z up a bit and retract filament even more\nG90\nG28 X Y\n;Ventilation forcee\nM107 ;stop fan\n;Shut down motor\nM84 ;shut down motors" "default_value": "\nM104 S0\nM106 S255\nM140 S0\nG91\nG1 E-1 F300\nG1 Z+3 F3000\nG90\nG28 X Y\nM107\nM84\n"
}, },
"material_diameter": { "material_diameter": {
"default_value": 1.75 "default_value": 1.75
},
"speed_print": {
"default_value": 60
},
"speed_travel": {
"default_value": 100
},
"retraction_amount": {
"default_value": 3.5
},
"retraction_speed": {
"default_value": 50
} }
} }
} }

View file

@ -0,0 +1,69 @@
{
"id": "Dagoma_neva",
"name": "Dagoma NEVA",
"version": 2,
"inherits": "fdmprinter",
"metadata": {
"visible": true,
"author": "Dagoma",
"manufacturer": "Dagoma",
"file_formats": "text/x-gcode",
"platform": "neva.stl",
"platform_offset": [ 0, 0, 0]
},
"overrides": {
"machine_width": {
"default_value": 195.55
},
"machine_height": {
"default_value": 205
},
"machine_depth": {
"default_value": 195.55
},
"machine_center_is_zero": {
"default_value": true
},
"machine_nozzle_size": {
"default_value": 0.4
},
"machine_head_with_fans_polygon": {
"default_value": [
[17, 40],
[17, -70],
[-17, -70],
[17, 40]
]
},
"gantry_height": {
"default_value": 0
},
"machine_shape": {
"default_value": "elliptic"
},
"machine_gcode_flavor": {
"default_value": "RepRap"
},
"machine_start_gcode": {
"default_value": ";Gcode by Cura\nG90\nG28\nM109 S100\nG29\nM104 S{material_print_temperature_layer_0}\nG0 X0 Y-85\nG0 Z0.26\nM109 S{material_print_temperature_layer_0}\nM82\nG92 E0\nG1 F200 E6\nG92 E0\nG1 F200 E-3.5\nG0 Z0.15\nG0 X10\nG0 Z3\nG1 F6000\n"
},
"machine_end_gcode": {
"default_value": "\nM104 S0\nM106 S255\nM140 S0\nG91\nG1 E-1 F300\nG1 Z+3 E-2 F9000\nG90\nG28\n"
},
"material_diameter": {
"default_value": 1.75
},
"speed_print": {
"default_value": 40
},
"speed_travel": {
"default_value": 120
},
"retraction_amount": {
"default_value": 3.8
},
"retraction_speed": {
"default_value": 60
}
}
}

View file

@ -0,0 +1,49 @@
{
"id": "ubuild-3d_mr_bot_280",
"version": 2,
"name": "uBuild-3D Mr Bot 280",
"inherits": "fdmprinter",
"metadata": {
"visible": true,
"author": "uBuild-3D",
"manufacturer": "uBuild-3D",
"category": "Other",
"file_formats": "text/x-gcode",
"icon": "icon_uBuild-3D",
"platform": "mr_bot_280_platform.stl",
"has_materials": true
},
"overrides": {
"machine_name": { "default_value": "Mr Bot 280" },
"machine_heated_bed": { "default_value": true },
"machine_width": { "default_value": 275 },
"machine_height": { "default_value": 275 },
"machine_depth": { "default_value": 275 },
"machine_center_is_zero": { "default_value": false },
"material_diameter": { "default_value": 1.75 },
"material_bed_temperature": { "default_value": 70 },
"machine_nozzle_size": { "default_value": 0.4 },
"layer_height": { "default_value": 0.2 },
"layer_height_0": { "default_value": 0.1 },
"retraction_amount": { "default_value": 2 },
"retraction_speed": { "default_value": 50 },
"retraction_retract_speed": { "default_value": 50 },
"retraction_prime_speed": { "default_value": 30 },
"adhesion_type": { "default_value": "skirt" },
"machine_nozzle_heat_up_speed": { "default_value": 2 },
"machine_nozzle_cool_down_speed": { "default_value": 2 },
"machine_head_with_fans_polygon": { "default_value": [[-20,20],[10,10],[10,10],[10,10]] },
"gantry_height": { "default_value": 275 },
"machine_max_feedrate_z": { "default_value": 15 },
"machine_max_feedrate_e": { "default_value": 60 },
"machine_max_acceleration_z": { "default_value": 1000 },
"machine_acceleration": { "default_value": 2000 },
"machine_max_jerk_xy": { "default_value": 20 },
"machine_max_jerk_z": { "default_value": 0.4 },
"machine_max_jerk_e": { "default_value": 5 },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_start_gcode": { "default_value": "G21 ; set units to millimeters\nG90 ; use absolute positioning\nM82 ; absolute extrusion mode\nM140 S{material_bed_temperature} ; set bed temp\nM104 S{material_print_temperature} ; set extruder temp\nG28 ; home X, Y and Z\nG29 ; probe sequence (for auto-leveling)\nG1 Z15 F600 ; go to Z15 position\nG1 X0 Y-20 F10000 ; go to X0 Y-20 position\nM190 S{material_bed_temperature} ; wait for bed temp\nM109 S{material_print_temperature} ; wait for extruder temp\nG92 E0 ; reset extruder distance position\nG1 E25 F100 ; extrude 25mm of material\nG92 E0 ; reset extruder distance position\nM117 Printing..." },
"machine_end_gcode": { "default_value": "M400 ; wait for moves to finish\nG92 Z0 E0 ; reset Z position\nG1 E-2 F9000 ; retract material\nG1 Z2 ; get extruder out of the way\nM104 S0 ; turn off extruder\nG1 Y285 F3000 ; present finished print\nM140 S0 ; turn off bed\nM84 ; disable motors\nM117 Print complete" }
}
}

View file

@ -3598,6 +3598,11 @@ msgctxt "@label"
msgid "SVG icons" msgid "SVG icons"
msgstr "" msgstr ""
#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:139
msgctxt "@label"
msgid "Linux cross-distribution application deployment"
msgstr ""
#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:41 #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:41
msgctxt "@label" msgctxt "@label"
msgid "Profile:" msgid "Profile:"

View file

@ -3485,6 +3485,11 @@ msgctxt "@label"
msgid "SVG icons" msgid "SVG icons"
msgstr "SVG-Symbole" msgstr "SVG-Symbole"
#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:139
msgctxt "@label"
msgid "Linux cross-distribution application deployment"
msgstr "Distributionsunabhängiges Format für Linux-Anwendungen"
#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:41 #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:41
msgctxt "@label" msgctxt "@label"
msgid "Profile:" msgid "Profile:"

BIN
resources/meshes/neva.stl Normal file

Binary file not shown.

View file

@ -136,6 +136,7 @@ UM.Dialog
projectsModel.append({ name:"Noto Sans", description: catalog.i18nc("@label", "Font"), license: "Apache 2.0", url: "https://www.google.com/get/noto/" }); projectsModel.append({ name:"Noto Sans", description: catalog.i18nc("@label", "Font"), license: "Apache 2.0", url: "https://www.google.com/get/noto/" });
projectsModel.append({ name:"Font-Awesome-SVG-PNG", description: catalog.i18nc("@label", "SVG icons"), license: "SIL OFL 1.1", url: "https://github.com/encharm/Font-Awesome-SVG-PNG" }); projectsModel.append({ name:"Font-Awesome-SVG-PNG", description: catalog.i18nc("@label", "SVG icons"), license: "SIL OFL 1.1", url: "https://github.com/encharm/Font-Awesome-SVG-PNG" });
projectsModel.append({ name:"AppImageKit", description: catalog.i18nc("@label", "Linux cross-distribution application deployment"), license: "MIT", url: "https://github.com/AppImage/AppImageKit" });
} }
} }
} }

View file

@ -6,48 +6,53 @@
"fonts": { "fonts": {
"large": { "large": {
"size": 1.35, "size": 1.35,
"bold": true, "weight": 63,
"family": "Noto Sans" "family": "Noto Sans"
}, },
"large_nonbold": { "large_nonbold": {
"size": 1.35, "size": 1.35,
"weight": 50,
"family": "Noto Sans" "family": "Noto Sans"
}, },
"default": { "default": {
"size": 1.0, "size": 1.0,
"weight": 50,
"family": "Noto Sans" "family": "Noto Sans"
}, },
"default_bold": { "default_bold": {
"size": 1.0, "size": 1.0,
"bold": true, "weight": 63,
"family": "Noto Sans" "family": "Noto Sans"
}, },
"default_italic": { "default_italic": {
"size": 1.15, "size": 1.15,
"weight": 50,
"italic": true, "italic": true,
"family": "Noto Sans" "family": "Noto Sans"
}, },
"small": { "small": {
"size": 1.0, "size": 1.0,
"bold": true, "weight": 63,
"family": "Noto Sans" "family": "Noto Sans"
}, },
"very_small": { "very_small": {
"size": 1.0, "size": 1.0,
"weight": 50,
"family": "Noto Sans" "family": "Noto Sans"
}, },
"button_tooltip": { "button_tooltip": {
"size": 1.0, "size": 1.0,
"weight": 50,
"family": "Noto Sans" "family": "Noto Sans"
}, },
"setting_category": { "setting_category": {
"size": 1.15, "size": 1.15,
"bold": true, "weight": 63,
"family": "Noto Sans" "family": "Noto Sans"
}, },
"action_button": { "action_button": {
"size": 1.15, "size": 1.15,
"bold": true, "weight": 50,
"family": "Noto Sans" "family": "Noto Sans"
} }
}, },