diff --git a/CMakeLists.txt b/CMakeLists.txt index 92dcb8c88d..bb6a72bd1d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -47,25 +47,41 @@ if(NOT ${URANIUM_SCRIPTS_DIR} STREQUAL "") add_custom_command(TARGET translations POST_BUILD COMMAND mkdir ARGS -p ${CMAKE_BINARY_DIR}/resources/i18n/${lang}/LC_MESSAGES/ COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} ARGS ${po_file} -o ${mo_file} -f) endforeach() endforeach() - install(DIRECTORY ${CMAKE_BINARY_DIR}/resources DESTINATION ${CMAKE_INSTALL_DATADIR}/cura) + install(DIRECTORY ${CMAKE_BINARY_DIR}/resources + DESTINATION ${CMAKE_INSTALL_DATADIR}/cura) endif() endif() find_package(PythonInterp 3.4.0 REQUIRED) -install(DIRECTORY resources DESTINATION ${CMAKE_INSTALL_DATADIR}/cura) -install(DIRECTORY plugins DESTINATION lib/cura) -install(FILES cura_app.py DESTINATION ${CMAKE_INSTALL_BINDIR} PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) +install(DIRECTORY resources + DESTINATION ${CMAKE_INSTALL_DATADIR}/cura) +install(DIRECTORY plugins + DESTINATION lib/cura) if(NOT APPLE AND NOT WIN32) - install(DIRECTORY cura DESTINATION lib/python${PYTHON_VERSION_MAJOR}/dist-packages FILES_MATCHING PATTERN *.py) - install(FILES ${CMAKE_BINARY_DIR}/CuraVersion.py DESTINATION lib/python${PYTHON_VERSION_MAJOR}/dist-packages/cura) - install(FILES cura.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications) + install(FILES cura_app.py + DESTINATION ${CMAKE_INSTALL_BINDIR} + PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE + RENAME cura) + install(DIRECTORY cura + DESTINATION lib/python${PYTHON_VERSION_MAJOR}/dist-packages + FILES_MATCHING PATTERN *.py) + install(FILES ${CMAKE_BINARY_DIR}/CuraVersion.py + DESTINATION lib/python${PYTHON_VERSION_MAJOR}/dist-packages/cura) + install(FILES cura.desktop + DESTINATION ${CMAKE_INSTALL_DATADIR}/applications) install(FILES cura.sharedmimeinfo DESTINATION ${CMAKE_INSTALL_DATADIR}/mime/packages/ RENAME cura.xml ) else() - install(DIRECTORY cura DESTINATION lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages FILES_MATCHING PATTERN *.py) - install(FILES ${CMAKE_BINARY_DIR}/CuraVersion.py DESTINATION lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages/cura) + install(FILES cura_app.py + DESTINATION ${CMAKE_INSTALL_BINDIR} + PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) + install(DIRECTORY cura + DESTINATION lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages + FILES_MATCHING PATTERN *.py) + install(FILES ${CMAKE_BINARY_DIR}/CuraVersion.py + DESTINATION lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages/cura) endif() include(CPackConfig.cmake) diff --git a/cura.desktop b/cura.desktop index 4ac14e4651..8e02fe6d52 100644 --- a/cura.desktop +++ b/cura.desktop @@ -1,12 +1,12 @@ [Desktop Entry] -Version=15.06.01 +Version=1 Name=Cura Name[de]=Cura GenericName=3D Printing Software GenericName[de]=3D-Druck-Software -Comment= -Exec=/usr/bin/cura_app.py %f -TryExec=/usr/bin/cura_app.py %f +Comment=Cura converts 3D models into paths for a 3D printer. It prepares your print for maximum accuracy, minimum printing time and good reliability with many extra features that make your print come out great. +Exec=/usr/bin/cura %F +TryExec=/usr/bin/cura Icon=/usr/share/cura/resources/images/cura-icon.png Terminal=false Type=Application diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py index b8934b8796..4433354fdd 100644 --- a/cura/PlatformPhysics.py +++ b/cura/PlatformPhysics.py @@ -88,9 +88,7 @@ class PlatformPhysics: job = ConvexHullJob.ConvexHullJob(node) job.start() node.callDecoration("setConvexHullJob", job) - - elif Selection.isSelected(node): - pass + elif Preferences.getInstance().getValue("physics/automatic_push_free"): # Check for collisions between convex hulls for other_node in BreadthFirstIterator(root): diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 70feba9974..e67c969953 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -157,6 +157,7 @@ class CuraEngineBackend(Backend): self._process = None except: # terminating a process that is already terminating causes an exception, silently ignore this. pass + Logger.log("d", "Engine process is killed") def _onStartSliceCompleted(self, job): if job.getError() or job.getResult() != True: diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 098808dbfe..ccd5d32eb3 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -105,7 +105,7 @@ class StartSliceJob(Job): Logger.log("d", "Sending data to engine for slicing.") self._socket.sendMessage(slice_message) - + Logger.log("d", "Sending data to engine is completed") self.setResult(True) def _expandGcodeTokens(self, key, value, settings): diff --git a/plugins/LegacyProfileReader/DictionaryOfDoom.json b/plugins/LegacyProfileReader/DictionaryOfDoom.json index 06c06aa497..e30460f103 100644 --- a/plugins/LegacyProfileReader/DictionaryOfDoom.json +++ b/plugins/LegacyProfileReader/DictionaryOfDoom.json @@ -8,7 +8,6 @@ "layer_height": "layer_height", "layer_height_0": "bottom_thickness", "wall_thickness": "wall_thickness", - "top_bottom_thickness": "solid_layer_thickness", "top_thickness": "0 if (solid_top == \"False\") else solid_layer_thickness", "bottom_thickness": "0 if (solid_bottom == \"False\") else solid_layer_thickness", "infill_sparse_density": "fill_density", diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index 85d631b82f..c664aeaeef 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -237,7 +237,7 @@ Item { delegate: ToolButton { id: button; - x: model.depth * UM.Theme.getSize("default_margin").width; + x: model.visible_depth * UM.Theme.getSize("default_margin").width; text: model.name; tooltip: model.description; visible: !model.global_only diff --git a/plugins/RemovableDriveOutputDevice/OSXRemovableDrivePlugin.py b/plugins/RemovableDriveOutputDevice/OSXRemovableDrivePlugin.py index cee4f40430..deca9875af 100644 --- a/plugins/RemovableDriveOutputDevice/OSXRemovableDrivePlugin.py +++ b/plugins/RemovableDriveOutputDevice/OSXRemovableDrivePlugin.py @@ -43,7 +43,7 @@ class OSXRemovableDrivePlugin(RemovableDrivePlugin.RemovableDrivePlugin): return drives def performEjectDevice(self, device): - p = subprocess.Popen(["diskutil", "eject", device.getId()], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + p = subprocess.Popen(["diskutil", "eject", device.getId()], stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE) output = p.communicate() Logger.log("d", "umount returned: %s.", repr(output)) diff --git a/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py b/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py index 3644ae54ca..125e1225f0 100644 --- a/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py +++ b/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py @@ -25,6 +25,7 @@ class RemovableDriveOutputDevice(OutputDevice): self._writing = False def requestWrite(self, node, file_name = None, filter_by_machine = False): + filter_by_machine = True # This plugin is indended to be used by machine (regardless of what it was told to do) if self._writing: raise OutputDeviceError.DeviceBusyError() diff --git a/plugins/RemovableDriveOutputDevice/RemovableDrivePlugin.py b/plugins/RemovableDriveOutputDevice/RemovableDrivePlugin.py index 6ab095f338..4e748230e9 100644 --- a/plugins/RemovableDriveOutputDevice/RemovableDrivePlugin.py +++ b/plugins/RemovableDriveOutputDevice/RemovableDrivePlugin.py @@ -6,9 +6,10 @@ import time from UM.Message import Message from UM.OutputDevice.OutputDevicePlugin import OutputDevicePlugin +from UM.Logger import Logger from . import RemovableDriveOutputDevice - +from UM.Logger import Logger from UM.i18n import i18nCatalog catalog = i18nCatalog("cura") @@ -37,11 +38,14 @@ class RemovableDrivePlugin(OutputDevicePlugin): def ejectDevice(self, device): try: + Logger.log("i", "Attempting to eject the device") result = self.performEjectDevice(device) except Exception as e: + Logger.log("e", "Ejection failed due to: %s" % str(e)) result = False if result: + Logger.log("i", "Succesfully ejected the device") message = Message(catalog.i18nc("@info:status", "Ejected {0}. You can now safely remove the drive.").format(device.getName())) message.show() else: diff --git a/plugins/RemovableDriveOutputDevice/WindowsRemovableDrivePlugin.py b/plugins/RemovableDriveOutputDevice/WindowsRemovableDrivePlugin.py index 0df38dbf74..0ee8b67d08 100644 --- a/plugins/RemovableDriveOutputDevice/WindowsRemovableDrivePlugin.py +++ b/plugins/RemovableDriveOutputDevice/WindowsRemovableDrivePlugin.py @@ -10,6 +10,9 @@ from . import RemovableDrivePlugin import string import ctypes +from UM.i18n import i18nCatalog +catalog = i18nCatalog("cura") + # WinAPI Constants that we need # Hardcoded here due to stupid WinDLL stuff that does not give us access to these values. DRIVE_REMOVABLE = 2 # [CodeStyle: Windows Enum value] @@ -24,6 +27,21 @@ IOCTL_STORAGE_EJECT_MEDIA = 2967560 # [CodeStyle: Windows Enum value] OPEN_EXISTING = 3 # [CodeStyle: Windows Enum value] +# Setup the DeviceIoControl function arguments and return type. +# See ctypes documentation for details on how to call C functions from python, and why this is important. +windll.kernel32.DeviceIoControl.argtypes = [ + wintypes.HANDLE, # _In_ HANDLE hDevice + wintypes.DWORD, # _In_ DWORD dwIoControlCode + wintypes.LPVOID, # _In_opt_ LPVOID lpInBuffer + wintypes.DWORD, # _In_ DWORD nInBufferSize + wintypes.LPVOID, # _Out_opt_ LPVOID lpOutBuffer + wintypes.DWORD, # _In_ DWORD nOutBufferSize + ctypes.POINTER(wintypes.DWORD), # _Out_opt_ LPDWORD lpBytesReturned + wintypes.LPVOID # _Inout_opt_ LPOVERLAPPED lpOverlapped +] +windll.kernel32.DeviceIoControl.restype = wintypes.BOOL + + ## Removable drive support for windows class WindowsRemovableDrivePlugin(RemovableDrivePlugin.RemovableDrivePlugin): def checkRemovableDrives(self): @@ -75,16 +93,31 @@ class WindowsRemovableDrivePlugin(RemovableDrivePlugin.RemovableDrivePlugin): handle = ctypes.windll.kernel32.CreateFileA("\\\\.\\{0}".format(device.getId()[:-1]).encode("ascii"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, None, OPEN_EXISTING, 0, None ) if handle == -1: - print(ctypes.windll.kernel32.GetLastError()) - return + # ctypes.WinError sets up an GetLastError API call for windows as an Python OSError exception. + # So we use this to raise the error to our caller. + raise ctypes.WinError() + + # The DeviceIoControl requires a bytes_returned pointer to be a valid pointer. + # So create a ctypes DWORD to reference. (Without this pointer the DeviceIoControl function will crash with an access violation after doing its job. + bytes_returned = wintypes.DWORD(0) + + error = None - result = None # Then, try and tell it to eject - if not ctypes.windll.kernel32.DeviceIoControl(handle, IOCTL_STORAGE_EJECT_MEDIA, None, None, None, None, None, None): - result = False - else: - result = True + return_code = windll.kernel32.DeviceIoControl(handle, IOCTL_STORAGE_EJECT_MEDIA, None, 0, None, 0, ctypes.pointer(bytes_returned), None) + # DeviceIoControl with IOCTL_STORAGE_EJECT_MEDIA return 0 on error. + if return_code == 0: + # ctypes.WinError sets up an GetLastError API call for windows as an Python OSError exception. + # So we use this to raise the error to our caller. + error = ctypes.WinError() + # Do not raise an error here yet, so we can properly close the handle. # Finally, close the handle - ctypes.windll.kernel32.CloseHandle(handle) - return result + windll.kernel32.CloseHandle(handle) + + # If an error happened in the DeviceIoControl, raise it now. + if error: + raise error + + # Return success + return True \ No newline at end of file diff --git a/plugins/USBPrinting/PrinterConnection.py b/plugins/USBPrinting/PrinterConnection.py index 1e5aa89b42..8834e9f6f5 100644 --- a/plugins/USBPrinting/PrinterConnection.py +++ b/plugins/USBPrinting/PrinterConnection.py @@ -366,15 +366,33 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter): Logger.log("d", "Setting bed temperature to %s", temperature) self._sendCommand("M140 S%s" % temperature) + @pyqtSlot() + def setMoveToRelative(self): + self._sendCommand("G91") + + @pyqtSlot() + def setMoveToAbsolute(self): + self._sendCommand("G90") + @pyqtSlot("long", "long","long") def moveHead(self, x, y, z): Logger.log("d","Moving head to %s, %s , %s", x, y, z) - self._sendCommand("G0 X%s Y%s Z%s"%(x,y,z)) + self._sendCommand("G0 X%s Y%s Z%s F3000" % (x, y, z)) + + @pyqtSlot("long", "long","long") + def moveHeadRelative(self, x, y, z): + self.setMoveToRelative() + self.moveHead(x,y,z) + self.setMoveToAbsolute() @pyqtSlot() def homeHead(self): self._sendCommand("G28") + @pyqtSlot() + def homeBed(self): + self._sendCommand("G28 Z") + ## Directly send the command, withouth checking connection state (eg; printing). # \param cmd string with g-code def _sendCommand(self, cmd): @@ -466,7 +484,7 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter): self._bed_temperature = temperature self.bedTemperatureChanged.emit() - def requestWrite(self, node, file_name = None): + def requestWrite(self, node, file_name = None, filter_by_machine = False): self.showControlInterface() def _setEndstopState(self, endstop_key, value): diff --git a/resources/i18n/de/cura.po b/resources/i18n/de/cura.po index 054d2e44b0..35e5569831 100644 --- a/resources/i18n/de/cura.po +++ b/resources/i18n/de/cura.po @@ -8,14 +8,14 @@ msgstr "" "Project-Id-Version: Cura 2.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-01-18 11:54+0100\n" -"PO-Revision-Date: 2016-02-07 16:01+0100\n" +"PO-Revision-Date: 2016-03-09 15:28+0100\n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Last-Translator: Thomas Karl Pietrowski \n" "Language-Team: \n" -"X-Generator: Poedit 1.8.4\n" +"X-Generator: Poedit 1.8.7.1\n" #: /home/tamara/2.1/Cura/cura/CrashHandler.py:26 msgctxt "@title:window" @@ -249,7 +249,7 @@ msgstr "Über USB drucken" #: /home/tamara/2.1/Cura/plugins/USBPrinting/PrinterConnection.py:37 msgctxt "@info:tooltip" msgid "Print with USB" -msgstr "Über USB drucken" +msgstr "Drucken über USB" #: /home/tamara/2.1/Cura/plugins/USBPrinting/__init__.py:13 msgctxt "@label" diff --git a/resources/machines/fdmprinter.json b/resources/machines/fdmprinter.json index d31051a2ef..60aa505a01 100644 --- a/resources/machines/fdmprinter.json +++ b/resources/machines/fdmprinter.json @@ -350,6 +350,7 @@ "min_value_warning": "0.2", "max_value_warning": "5", "visible": false, + "enabled": "False", "children": { "wall_thickness": { "label": "Wall Thickness", @@ -357,8 +358,8 @@ "unit": "mm", "default": 0.8, "min_value": "0", - "min_value_warning": "0.2", - "max_value_warning": "5", + "min_value_warning": "line_width", + "max_value_warning": "5 * line_width", "type": "float", "visible": true, "children": { @@ -449,12 +450,22 @@ } } }, + + "alternate_extra_perimeter": { + "label": "Alternate Extra Wall", + "description": "Make an extra wall at every second layer, so that infill will be caught between an extra wall above and one below. This results in a better cohesion between infill and walls, but might have an impact on the surface quality.", + "type": "boolean", + "default": false, + "visible": false, + "inherit": false + }, "remove_overlapping_walls_enabled": { "label": "Remove Overlapping Wall Parts", "description": "Remove parts of a wall which share an overlap which would result in overextrusion in some places. These overlaps occur in thin pieces in a model and sharp corners.", "type": "boolean", "default": false, "visible": false, + "enabled": "False", "children": { "remove_overlapping_walls_0_enabled": { "label": "Remove Overlapping Outer Wall Parts", @@ -462,7 +473,8 @@ "type": "boolean", "default": false, "visible": false, - "inherit": true + "inherit": true, + "enabled": "False" }, "remove_overlapping_walls_x_enabled": { "label": "Remove Overlapping Other Wall Parts", @@ -666,7 +678,7 @@ "type": "string", "default": "[[3.5,200],[7.0,240]]", "enabled": "material_flow_dependent_temperature", - "global_only": true + "global_only": true }, "material_standby_temperature": { "label": "Standby Temperature", @@ -676,6 +688,8 @@ "default": 150, "min_value": "0", "max_value_warning": "260", + "enabled": "False", + "enabled_before_removal": "material_flow_dependent_temperature", "global_only": true }, "material_extrusion_cool_down_speed": { @@ -687,7 +701,8 @@ "min_value": "0", "max_value_warning": "10.0", "global_only": "True", - "enabled": "material_flow_dependent_temperature or machine_extruder_count > 1", + "enabled": "False", + "enabled_before_removal": "material_flow_dependent_temperature or machine_extruder_count > 1", "visible": false }, "material_bed_temperature": { @@ -1015,22 +1030,20 @@ "default": true, "visible": false, "enabled": "retraction_combing", - "global_only": "True", - "children": { - "travel_avoid_distance": { - "label": "Avoid Distance", - "description": "The distance to stay clear of parts which are avoided during travel.", - "unit": "mm", - "type": "float", - "default": 1.5, - "min_value": "0", - "max_value_warning": "machine_nozzle_tip_outer_diameter * 5", - "visible": false, - "inherit": false, - "enabled": "retraction_combing", - "global_only": "True" - } - } + "global_only": "True" + }, + "travel_avoid_distance": { + "label": "Avoid Distance", + "description": "The distance to stay clear of parts which are avoided during travel.", + "unit": "mm", + "type": "float", + "default": 1.5, + "min_value": "0", + "max_value_warning": "machine_nozzle_tip_outer_diameter * 5", + "visible": false, + "inherit": false, + "enabled": "retraction_combing and travel_avoid_other_parts", + "global_only": "True" }, "coasting_enable": { "label": "Enable Coasting", @@ -1090,45 +1103,44 @@ "description": "Enable the cooling fan during the print. The extra cooling from the cooling fan helps parts with small cross sections that print each layer quickly.", "type": "boolean", "default": true, + "global_only": "True" + }, + "cool_fan_speed": { + "label": "Fan Speed", + "description": "Fan speed used for the print cooling fan on the printer head.", + "unit": "%", + "type": "float", + "min_value": "0", + "max_value": "100", + "default": 100, + "visible": false, + "inherit_function": "100.0 if cool_fan_enabled else 0.0", + "enabled": "cool_fan_enabled", "global_only": "True", "children": { - "cool_fan_speed": { - "label": "Fan Speed", - "description": "Fan speed used for the print cooling fan on the printer head.", + "cool_fan_speed_min": { + "label": "Minimum Fan Speed", + "description": "Normally the fan runs at the minimum fan speed. If the layer is slowed down due to minimum layer time, the fan speed adjusts between minimum and maximum fan speed.", "unit": "%", "type": "float", "min_value": "0", "max_value": "100", "default": 100, "visible": false, - "inherit_function": "100.0 if parent_value else 0.0", - "global_only": "True", - "children": { - "cool_fan_speed_min": { - "label": "Minimum Fan Speed", - "description": "Normally the fan runs at the minimum fan speed. If the layer is slowed down due to minimum layer time, the fan speed adjusts between minimum and maximum fan speed.", - "unit": "%", - "type": "float", - "min_value": "0", - "max_value": "min(100, cool_fan_speed_max)", - "inherit_function": "parent_value", - "default": 100, - "visible": false, - "global_only": "True" - }, - "cool_fan_speed_max": { - "label": "Maximum Fan Speed", - "description": "Normally the fan runs at the minimum fan speed. If the layer is slowed down due to minimum layer time, the fan speed adjusts between minimum and maximum fan speed.", - "unit": "%", - "type": "float", - "min_value": "max(0, cool_fan_speed_min)", - "max_value": "100", - "inherit": false, - "default": 100, - "visible": false, - "global_only": "True" - } - } + "enabled": "cool_fan_enabled", + "global_only": "True" + }, + "cool_fan_speed_max": { + "label": "Maximum Fan Speed", + "description": "Normally the fan runs at the minimum fan speed. If the layer is slowed down due to minimum layer time, the fan speed adjusts between minimum and maximum fan speed.", + "unit": "%", + "type": "float", + "min_value": "0", + "max_value": "100", + "default": 100, + "visible": false, + "enabled": "cool_fan_enabled", + "global_only": "True" } } }, @@ -1480,22 +1492,20 @@ "min_value_warning": "support_minimal_diameter", "max_value_warning": "10", "visible": false, - "enabled": "support_enable and support_use_towers", - "children": { - "support_minimal_diameter": { - "label": "Minimum Diameter", - "description": "Minimum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower.", - "unit": "mm", - "type": "float", - "default": 3.0, - "min_value": "0", - "max_value_warning": "10", - "max_value": "support_tower_diameter", - "inherit": true, - "visible": false, - "enabled": "support_enable and support_use_towers" - } - } + "enabled": "support_enable and support_use_towers" + }, + "support_minimal_diameter": { + "label": "Minimum Diameter", + "description": "Minimum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower.", + "unit": "mm", + "type": "float", + "default": 3.0, + "min_value": "0", + "max_value_warning": "10", + "max_value": "support_tower_diameter", + "inherit": true, + "visible": false, + "enabled": "support_enable and support_use_towers" }, "support_tower_roof_angle": { "label": "Tower Roof Angle", @@ -1576,6 +1586,7 @@ "raft": "Raft" }, "default": "skirt", + "inherit_function": "\"skirt\" if machine_heated_bed else \"brim\"", "global_only": "True" }, "skirt_line_count": { diff --git a/resources/machines/ultimaker2.json b/resources/machines/ultimaker2.json index 16867145cb..fed01312de 100644 --- a/resources/machines/ultimaker2.json +++ b/resources/machines/ultimaker2.json @@ -40,8 +40,8 @@ "machine_settings": { "machine_start_gcode" : { "default": "" }, "machine_end_gcode" : { "default": "" }, - "machine_width": { "default": 230 }, - "machine_depth": { "default": 225 }, + "machine_width": { "default": 223 }, + "machine_depth": { "default": 223 }, "machine_height": { "default": 205 }, "machine_heated_bed": { "default": true }, diff --git a/resources/profiles/materials/pla.cfg b/resources/profiles/materials/pla.cfg index 99a06e5e1b..86fc696741 100644 --- a/resources/profiles/materials/pla.cfg +++ b/resources/profiles/materials/pla.cfg @@ -5,8 +5,5 @@ name = PLA [settings] material_bed_temperature = 60 -platform_adhesion = skirt material_flow = 100 -material_print_temperature = 210 -cool_fan_speed = 100 -cool_fan_speed_max = 100 \ No newline at end of file +material_print_temperature = 210 \ No newline at end of file diff --git a/resources/profiles/ultimaker2+/abs_0.25_normal.curaprofile b/resources/profiles/ultimaker2+/abs_0.25_normal.curaprofile index fb88afba46..f866a78955 100644 --- a/resources/profiles/ultimaker2+/abs_0.25_normal.curaprofile +++ b/resources/profiles/ultimaker2+/abs_0.25_normal.curaprofile @@ -19,7 +19,6 @@ speed_print = 20 cool_min_speed = 25 line_width = 0.22 infill_sparse_density = 22 -machine_nozzle_size = 0.22 speed_wall_0 = 20 cool_min_layer_time = 2 cool_lift_head = True diff --git a/resources/profiles/ultimaker2+/abs_0.4_fast.curaprofile b/resources/profiles/ultimaker2+/abs_0.4_fast.curaprofile index 92385c9a57..770f0ee3f4 100644 --- a/resources/profiles/ultimaker2+/abs_0.4_fast.curaprofile +++ b/resources/profiles/ultimaker2+/abs_0.4_fast.curaprofile @@ -19,7 +19,6 @@ cool_min_layer_time = 3 cool_min_speed = 20 line_width = 0.35 infill_sparse_density = 18 -machine_nozzle_size = 0.35 speed_travel = 150 speed_wall_0 = 30 adhesion_type = brim diff --git a/resources/profiles/ultimaker2+/abs_0.4_high.curaprofile b/resources/profiles/ultimaker2+/abs_0.4_high.curaprofile index a83c61928c..1702f31bae 100644 --- a/resources/profiles/ultimaker2+/abs_0.4_high.curaprofile +++ b/resources/profiles/ultimaker2+/abs_0.4_high.curaprofile @@ -19,7 +19,6 @@ adhesion_type = brim cool_min_speed = 20 line_width = 0.35 infill_sparse_density = 22 -machine_nozzle_size = 0.35 speed_wall_0 = 20 cool_min_layer_time = 3 cool_lift_head = True diff --git a/resources/profiles/ultimaker2+/abs_0.4_normal.curaprofile b/resources/profiles/ultimaker2+/abs_0.4_normal.curaprofile index e77daeb6da..fbe21d3d03 100644 --- a/resources/profiles/ultimaker2+/abs_0.4_normal.curaprofile +++ b/resources/profiles/ultimaker2+/abs_0.4_normal.curaprofile @@ -16,7 +16,6 @@ speed_topbottom = 20 cool_min_layer_time = 3 cool_min_speed = 20 line_width = 0.35 -machine_nozzle_size = 0.35 speed_wall_0 = 20 adhesion_type = brim cool_lift_head = True diff --git a/resources/profiles/ultimaker2+/abs_0.6_normal.curaprofile b/resources/profiles/ultimaker2+/abs_0.6_normal.curaprofile index 4bbfb50bf7..577c9fa2cd 100644 --- a/resources/profiles/ultimaker2+/abs_0.6_normal.curaprofile +++ b/resources/profiles/ultimaker2+/abs_0.6_normal.curaprofile @@ -18,7 +18,6 @@ speed_topbottom = 20 adhesion_type = brim cool_min_speed = 20 line_width = 0.53 -machine_nozzle_size = 0.53 speed_wall_0 = 20 cool_min_layer_time = 3 cool_lift_head = True diff --git a/resources/profiles/ultimaker2+/abs_0.8_normal.curaprofile b/resources/profiles/ultimaker2+/abs_0.8_normal.curaprofile index 96d4079462..c080959bac 100644 --- a/resources/profiles/ultimaker2+/abs_0.8_normal.curaprofile +++ b/resources/profiles/ultimaker2+/abs_0.8_normal.curaprofile @@ -18,7 +18,6 @@ speed_topbottom = 20 adhesion_type = brim cool_min_speed = 15 line_width = 0.7 -machine_nozzle_size = 0.7 speed_wall_0 = 20 cool_min_layer_time = 3 cool_lift_head = True diff --git a/resources/profiles/ultimaker2+/cpe_0.25_normal.curaprofile b/resources/profiles/ultimaker2+/cpe_0.25_normal.curaprofile index 14c29ae70c..caa93fd12d 100644 --- a/resources/profiles/ultimaker2+/cpe_0.25_normal.curaprofile +++ b/resources/profiles/ultimaker2+/cpe_0.25_normal.curaprofile @@ -19,7 +19,6 @@ cool_min_layer_time = 2 speed_print = 20 line_width = 0.22 infill_sparse_density = 22 -machine_nozzle_size = 0.22 speed_wall_0 = 20 adhesion_type = brim cool_lift_head = True diff --git a/resources/profiles/ultimaker2+/cpe_0.4_fast.curaprofile b/resources/profiles/ultimaker2+/cpe_0.4_fast.curaprofile index 53243a7e4f..3888f94f2d 100644 --- a/resources/profiles/ultimaker2+/cpe_0.4_fast.curaprofile +++ b/resources/profiles/ultimaker2+/cpe_0.4_fast.curaprofile @@ -20,7 +20,6 @@ speed_topbottom = 20 speed_travel = 150 line_width = 0.35 infill_sparse_density = 18 -machine_nozzle_size = 0.35 speed_wall_0 = 30 adhesion_type = brim cool_lift_head = True diff --git a/resources/profiles/ultimaker2+/cpe_0.4_high.curaprofile b/resources/profiles/ultimaker2+/cpe_0.4_high.curaprofile index a809c4d81e..b198012a62 100644 --- a/resources/profiles/ultimaker2+/cpe_0.4_high.curaprofile +++ b/resources/profiles/ultimaker2+/cpe_0.4_high.curaprofile @@ -18,7 +18,6 @@ speed_topbottom = 20 adhesion_type = brim line_width = 0.35 infill_sparse_density = 22 -machine_nozzle_size = 0.35 speed_wall_0 = 20 cool_min_layer_time = 3 cool_lift_head = True diff --git a/resources/profiles/ultimaker2+/cpe_0.4_normal.curaprofile b/resources/profiles/ultimaker2+/cpe_0.4_normal.curaprofile index ed51c2cb38..d220adde83 100644 --- a/resources/profiles/ultimaker2+/cpe_0.4_normal.curaprofile +++ b/resources/profiles/ultimaker2+/cpe_0.4_normal.curaprofile @@ -15,7 +15,6 @@ speed_infill = 45 speed_topbottom = 20 cool_min_layer_time = 3 line_width = 0.35 -machine_nozzle_size = 0.35 speed_wall_0 = 20 adhesion_type = brim cool_lift_head = True diff --git a/resources/profiles/ultimaker2+/cpe_0.6_normal.curaprofile b/resources/profiles/ultimaker2+/cpe_0.6_normal.curaprofile index 54114888e8..bb395b3715 100644 --- a/resources/profiles/ultimaker2+/cpe_0.6_normal.curaprofile +++ b/resources/profiles/ultimaker2+/cpe_0.6_normal.curaprofile @@ -18,7 +18,6 @@ speed_topbottom = 20 cool_min_layer_time = 3 speed_print = 20 line_width = 0.53 -machine_nozzle_size = 0.53 speed_wall_0 = 20 adhesion_type = brim cool_lift_head = True diff --git a/resources/profiles/ultimaker2+/cpe_0.8_normal.curaprofile b/resources/profiles/ultimaker2+/cpe_0.8_normal.curaprofile index d04620e834..583b2a65b9 100644 --- a/resources/profiles/ultimaker2+/cpe_0.8_normal.curaprofile +++ b/resources/profiles/ultimaker2+/cpe_0.8_normal.curaprofile @@ -18,7 +18,6 @@ speed_topbottom = 20 cool_min_layer_time = 3 speed_print = 20 line_width = 0.7 -machine_nozzle_size = 0.7 speed_wall_0 = 20 adhesion_type = brim cool_lift_head = True diff --git a/resources/profiles/ultimaker2+/pla_0.25_normal.curaprofile b/resources/profiles/ultimaker2+/pla_0.25_normal.curaprofile index 25973e4549..ae42cea8d9 100644 --- a/resources/profiles/ultimaker2+/pla_0.25_normal.curaprofile +++ b/resources/profiles/ultimaker2+/pla_0.25_normal.curaprofile @@ -7,7 +7,7 @@ material = PLA weight = -2 [settings] -machine_nozzle_size = 0.22 +line_width = 0.22 layer_height = 0.06 layer_height_0 = 0.15 shell_thickness = 0.88 @@ -18,7 +18,6 @@ infill_wipe_dist = 0.1 retraction_amount = 6 retraction_min_travel = 0.5 retraction_count_max = 30 -retraction_extrusion_window = 6 speed_infill = 30 speed_wall_0 = 20 speed_wall_x = 25 diff --git a/resources/profiles/ultimaker2+/pla_0.4_fast.curaprofile b/resources/profiles/ultimaker2+/pla_0.4_fast.curaprofile index 0c47c7cafc..53882bc066 100644 --- a/resources/profiles/ultimaker2+/pla_0.4_fast.curaprofile +++ b/resources/profiles/ultimaker2+/pla_0.4_fast.curaprofile @@ -7,7 +7,7 @@ material = PLA weight = -1 [settings] -machine_nozzle_size = 0.35 +line_width = 0.35 layer_height = 0.15 layer_height_0 = 0.26 shell_thickness = 0.7 @@ -18,7 +18,6 @@ infill_wipe_dist = 0.2 retraction_amount = 5.5 retraction_min_travel = 0.5 retraction_count_max = 30 -retraction_extrusion_window = 6 speed_infill = 60 speed_wall_0 = 40 speed_wall_x = 50 diff --git a/resources/profiles/ultimaker2+/pla_0.4_high.curaprofile b/resources/profiles/ultimaker2+/pla_0.4_high.curaprofile index 7e3d7564eb..134eb8a3bd 100644 --- a/resources/profiles/ultimaker2+/pla_0.4_high.curaprofile +++ b/resources/profiles/ultimaker2+/pla_0.4_high.curaprofile @@ -7,7 +7,7 @@ material = PLA weight = -3 [settings] -machine_nozzle_size = 0.35 +line_width = 0.35 layer_height = 0.06 layer_height_0 = 0.26 shell_thickness = 1.05 @@ -18,7 +18,6 @@ infill_wipe_dist = 0.18 retraction_amount = 5.5 retraction_min_travel = 0.5 retraction_count_max = 30 -retraction_extrusion_window = 6 speed_infill = 50 speed_wall_0 = 30 speed_wall_x = 40 diff --git a/resources/profiles/ultimaker2+/pla_0.4_normal.curaprofile b/resources/profiles/ultimaker2+/pla_0.4_normal.curaprofile index 4fb58e0a59..40dd7f734e 100644 --- a/resources/profiles/ultimaker2+/pla_0.4_normal.curaprofile +++ b/resources/profiles/ultimaker2+/pla_0.4_normal.curaprofile @@ -7,7 +7,7 @@ material = PLA weight = -2 [settings] -machine_nozzle_size = 0.35 +line_width = 0.35 layer_height = 0.1 layer_height_0 = 0.26 shell_thickness = 1.05 @@ -18,7 +18,6 @@ infill_wipe_dist = 0.2 retraction_amount = 5.5 retraction_min_travel = 0.5 retraction_count_max = 30 -retraction_extrusion_window = 6 speed_infill = 50 speed_wall_0 = 30 speed_wall_x = 40 diff --git a/resources/profiles/ultimaker2+/pla_0.4_ulti.curaprofile b/resources/profiles/ultimaker2+/pla_0.4_ulti.curaprofile index 4f7971700f..74b4bc0194 100644 --- a/resources/profiles/ultimaker2+/pla_0.4_ulti.curaprofile +++ b/resources/profiles/ultimaker2+/pla_0.4_ulti.curaprofile @@ -7,7 +7,7 @@ material = PLA weight = -4 [settings] -machine_nozzle_size = 0.35 +line_width = 0.35 layer_height = 0.04 layer_height_0 = 0.26 shell_thickness = 1.4 diff --git a/resources/profiles/ultimaker2+/pla_0.6_normal.curaprofile b/resources/profiles/ultimaker2+/pla_0.6_normal.curaprofile index 30f9b16f64..2ad0960d5f 100644 --- a/resources/profiles/ultimaker2+/pla_0.6_normal.curaprofile +++ b/resources/profiles/ultimaker2+/pla_0.6_normal.curaprofile @@ -7,7 +7,7 @@ material = PLA weight = -2 [settings] -machine_nozzle_size = 0.53 +line_width = 0.53 layer_height = 0.15 layer_height_0 = 0.4 shell_thickness = 1.59 @@ -18,7 +18,6 @@ infill_wipe_dist = 0.3 retraction_amount = 6 retraction_min_travel = 0.5 retraction_count_max = 30 -retraction_extrusion_window = 6 speed_infill = 55 speed_wall_0 = 25 speed_wall_x = 40 diff --git a/resources/profiles/ultimaker2+/pla_0.8_normal.curaprofile b/resources/profiles/ultimaker2+/pla_0.8_normal.curaprofile index e19e59f131..7ea019917d 100644 --- a/resources/profiles/ultimaker2+/pla_0.8_normal.curaprofile +++ b/resources/profiles/ultimaker2+/pla_0.8_normal.curaprofile @@ -7,7 +7,7 @@ material = PLA weight = -2 [settings] -machine_nozzle_size = 0.7 +line_width = 0.7 layer_height = 0.2 layer_height_0 = 0.5 shell_thickness = 2.1 @@ -18,7 +18,6 @@ infill_wipe_dist = 0.4 retraction_amount = 6 retraction_min_travel = 0.5 retraction_count_max = 30 -retraction_extrusion_window = 6 speed_infill = 40 speed_wall_0 = 20 speed_wall_x = 30 diff --git a/resources/profiles/ultimaker2_olsson/0.25_normal.curaprofile b/resources/profiles/ultimaker2_olsson/0.25_normal.curaprofile index 3c19b261b7..a26b2b8ff1 100644 --- a/resources/profiles/ultimaker2_olsson/0.25_normal.curaprofile +++ b/resources/profiles/ultimaker2_olsson/0.25_normal.curaprofile @@ -6,7 +6,7 @@ machine_variant = 0.25 mm weight = -2 [settings] -machine_nozzle_size = 0.22 +line_width = 0.22 layer_height = 0.06 layer_height_0 = 0.15 shell_thickness = 0.88 diff --git a/resources/profiles/ultimaker2_olsson/0.4_fast.curaprofile b/resources/profiles/ultimaker2_olsson/0.4_fast.curaprofile index ec614d4d3b..10cbcfd81c 100644 --- a/resources/profiles/ultimaker2_olsson/0.4_fast.curaprofile +++ b/resources/profiles/ultimaker2_olsson/0.4_fast.curaprofile @@ -6,7 +6,7 @@ machine_variant = 0.4 mm weight = -1 [settings] -machine_nozzle_size = 0.35 +line_width = 0.35 layer_height = 0.15 layer_height_0 = 0.26 shell_thickness = 0.7 diff --git a/resources/profiles/ultimaker2_olsson/0.4_high.curaprofile b/resources/profiles/ultimaker2_olsson/0.4_high.curaprofile index de9266774c..cf9bead793 100644 --- a/resources/profiles/ultimaker2_olsson/0.4_high.curaprofile +++ b/resources/profiles/ultimaker2_olsson/0.4_high.curaprofile @@ -6,7 +6,7 @@ machine_variant = 0.4 mm weight = -3 [settings] -machine_nozzle_size = 0.35 +line_width = 0.35 layer_height = 0.06 layer_height_0 = 0.26 shell_thickness = 1.05 diff --git a/resources/profiles/ultimaker2_olsson/0.4_normal.curaprofile b/resources/profiles/ultimaker2_olsson/0.4_normal.curaprofile index f7420409f8..8e0d93fb6a 100644 --- a/resources/profiles/ultimaker2_olsson/0.4_normal.curaprofile +++ b/resources/profiles/ultimaker2_olsson/0.4_normal.curaprofile @@ -6,7 +6,7 @@ machine_variant = 0.4 mm weight = -2 [settings] -machine_nozzle_size = 0.35 +line_width = 0.35 layer_height = 0.1 layer_height_0 = 0.26 shell_thickness = 1.05 diff --git a/resources/profiles/ultimaker2_olsson/0.4_ulti.curaprofile b/resources/profiles/ultimaker2_olsson/0.4_ulti.curaprofile index 8ea28cc303..4f30644b3b 100644 --- a/resources/profiles/ultimaker2_olsson/0.4_ulti.curaprofile +++ b/resources/profiles/ultimaker2_olsson/0.4_ulti.curaprofile @@ -6,7 +6,7 @@ machine_variant = 0.4 mm weight = -4 [settings] -machine_nozzle_size = 0.35 +line_width = 0.35 layer_height = 0.04 layer_height_0 = 0.26 shell_thickness = 1.4 diff --git a/resources/profiles/ultimaker2_olsson/0.6_normal.curaprofile b/resources/profiles/ultimaker2_olsson/0.6_normal.curaprofile index b9331438ea..b07dcf0847 100644 --- a/resources/profiles/ultimaker2_olsson/0.6_normal.curaprofile +++ b/resources/profiles/ultimaker2_olsson/0.6_normal.curaprofile @@ -6,7 +6,7 @@ machine_variant = 0.6 mm weight = -2 [settings] -machine_nozzle_size = 0.53 +line_width = 0.53 layer_height = 0.15 layer_height_0 = 0.4 shell_thickness = 1.59 diff --git a/resources/profiles/ultimaker2_olsson/0.8_normal.curaprofile b/resources/profiles/ultimaker2_olsson/0.8_normal.curaprofile index 0fe5296135..54f7c960b5 100644 --- a/resources/profiles/ultimaker2_olsson/0.8_normal.curaprofile +++ b/resources/profiles/ultimaker2_olsson/0.8_normal.curaprofile @@ -6,7 +6,7 @@ machine_variant = 0.8 mm weight = -2 [settings] -machine_nozzle_size = 0.7 +line_width = 0.7 layer_height = 0.2 layer_height_0 = 0.5 shell_thickness = 2.1 diff --git a/resources/qml/JobSpecs.qml b/resources/qml/JobSpecs.qml index 041ad160e2..f27b046355 100644 --- a/resources/qml/JobSpecs.qml +++ b/resources/qml/JobSpecs.qml @@ -124,16 +124,13 @@ Rectangle { anchors.right: printJobPencilIcon.left anchors.rightMargin: UM.Theme.getSize("default_margin").width/2 height: UM.Theme.getSize("jobspecs_line").height - width: __contentWidth + UM.Theme.getSize("default_margin").width + width: Math.max(__contentWidth + UM.Theme.getSize("default_margin").width, 50) maximumLength: 120 property int unremovableSpacing: 5 text: '' horizontalAlignment: TextInput.AlignRight onTextChanged: { - if(text != ''){ - //Prevent that jobname is set to an empty string - Printer.setJobName(text) - } + Printer.setJobName(text) } onEditingFinished: { if (printJobTextfield.text != ''){ @@ -161,7 +158,7 @@ Rectangle { anchors.right: parent.right height: UM.Theme.getSize("jobspecs_line").height verticalAlignment: Text.AlignVCenter - font: UM.Theme.getFont("small") + font: UM.Theme.getFont("small_bold") color: UM.Theme.getColor("text_subtext") text: Printer.getSceneBoundingBoxString } @@ -193,7 +190,7 @@ Rectangle { anchors.right: lengthIcon.left anchors.rightMargin: UM.Theme.getSize("default_margin").width anchors.verticalCenter: parent.verticalCenter - font: UM.Theme.getFont("small") + font: UM.Theme.getFont("small_bold") color: UM.Theme.getColor("text_subtext") text: (!base.printDuration || !base.printDuration.valid) ? catalog.i18nc("@label", "00h 00min") : base.printDuration.getDisplayString(UM.DurationFormat.Short) } @@ -213,7 +210,7 @@ Rectangle { id: lengthSpec anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - font: UM.Theme.getFont("small") + font: UM.Theme.getFont("small_bold") color: UM.Theme.getColor("text_subtext") text: base.printMaterialAmount <= 0 ? catalog.i18nc("@label", "0.0 m") : catalog.i18nc("@label", "%1 m").arg(base.printMaterialAmount) } diff --git a/resources/qml/WizardPages/Bedleveling.qml b/resources/qml/WizardPages/Bedleveling.qml index 105ee81f75..1721f0fd4a 100644 --- a/resources/qml/WizardPages/Bedleveling.qml +++ b/resources/qml/WizardPages/Bedleveling.qml @@ -19,7 +19,12 @@ Item property int platform_height: UM.MachineManager.getSettingValue("machine_depth") anchors.fill: parent; property variant printer_connection: UM.USBPrinterManager.connectedPrinterList.getItem(0).printer - Component.onCompleted: printer_connection.homeHead() + Component.onCompleted: + { + printer_connection.homeBed() + printer_connection.moveHeadRelative(0, 0, 3) + printer_connection.homeHead() + } UM.I18nCatalog { id: catalog; name:"cura"} property variant wizard: null; @@ -79,15 +84,23 @@ Item { if(wizardPage.leveling_state == 0) { - printer_connection.moveHead(platform_width, 0 ,0) + printer_connection.moveHeadRelative(0, 0, 3) + printer_connection.homeHead() + printer_connection.moveHeadRelative(0, 0, 3) + printer_connection.moveHeadRelative(platform_width - 10, 0, 0) + printer_connection.moveHeadRelative(0, 0, -3) } if(wizardPage.leveling_state == 1) { - printer_connection.moveHead(platform_width/2, platform_height, 0) + printer_connection.moveHeadRelative(0, 0, 3) + printer_connection.moveHeadRelative(-platform_width/2, platform_height - 10, 0) + printer_connection.moveHeadRelative(0, 0, -3) } if(wizardPage.leveling_state == 2) { - printer_connection.moveHead(0, 0, 0) + printer_connection.moveHeadRelative(0, 0, 3) + printer_connection.moveHeadRelative(-platform_width/2 + 10, -(platform_height + 10), 0) + printer_connection.moveHeadRelative(0, 0, -3) } wizardPage.leveling_state++ if (wizardPage.leveling_state >= 3){ diff --git a/resources/themes/cura/icons/notice.svg b/resources/themes/cura/icons/notice.svg new file mode 100644 index 0000000000..92790ad8ac --- /dev/null +++ b/resources/themes/cura/icons/notice.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/resources/themes/cura/icons/warning.svg b/resources/themes/cura/icons/warning.svg new file mode 100644 index 0000000000..42836e9f1c --- /dev/null +++ b/resources/themes/cura/icons/warning.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/themes/cura/theme.json b/resources/themes/cura/theme.json index 1c745237fd..e1dc40c2d6 100644 --- a/resources/themes/cura/theme.json +++ b/resources/themes/cura/theme.json @@ -18,6 +18,12 @@ "size": 1.0, "family": "Open Sans" }, + "small_bold": + { + "size": 1.0, + "family": "Open Sans", + "bold": true + }, "very_small": { "size": 0.75, "family": "Open Sans" @@ -68,7 +74,7 @@ "text_hover": [70, 84, 113, 255], "text_pressed": [12, 169, 227, 255], "text_white": [255, 255, 255, 255], - "text_subtext": [127, 127, 127, 255], + "text_subtext": [100, 100, 100, 255], "error": [255, 140, 0, 255], "sidebar_header_bar": [24, 41, 77, 255],