mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-08-12 19:49:00 +08:00
Merge branch 'master' of https://github.com/Ultimaker/Cura
This commit is contained in:
commit
f074760c7b
133
CHANGES
Normal file
133
CHANGES
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
Cura 15.06 Beta
|
||||||
|
===============
|
||||||
|
|
||||||
|
This is the *Beta* version of Cura 15.06.
|
||||||
|
|
||||||
|
Cura 15.06 is a new release built from the ground up on a completely new
|
||||||
|
framework called Uranium. This framework has been designed to make it easier to
|
||||||
|
extend Cura with additional functionality as well as provide a cleaner UI.
|
||||||
|
|
||||||
|
Changes since 15.05.91
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
* There is now a working MacOSX version. Currently it supports OSX 10.7 and
|
||||||
|
higher.
|
||||||
|
* Fixed: Need to deselect before selecting a different object.
|
||||||
|
* Fixed: Object can be moved on Z axis.
|
||||||
|
* Fixed: Error values should be considered invalid values and will not trigger a
|
||||||
|
slice.
|
||||||
|
* Fixed: Text fields used a locale-aware validator while the underlying code did
|
||||||
|
not.
|
||||||
|
* Fixed: Text fields will trigger a slice on text change, not only after focus
|
||||||
|
change/enter press.
|
||||||
|
* Fixed: Rotate Tool snaps to incorrect value.
|
||||||
|
* Fixed: Object Collision would only moved objects to the right.
|
||||||
|
* Fixed: Object Collision would move the selected object when it should not.
|
||||||
|
* Fixed: Camera panning now works correctly instead of doing nothing.
|
||||||
|
* Fixed: Camera would flip around center point at maximum rotation.
|
||||||
|
* Fixed: Build platform grid blocked view from below objects.
|
||||||
|
* Fixed: Viewport on MacOSX with high-DPI screens was only taking 1/4th of the window
|
||||||
|
|
||||||
|
Changes since 15.05.90
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
* Fixed: Additional UI elements for tools and views not loading.
|
||||||
|
* Fixed: Double click needed to change setting dialog page.
|
||||||
|
* Fixed: Context menu entries (reload, center object, etc.) not working.
|
||||||
|
* Fixed: "Open With" or passing files from command line not working.
|
||||||
|
* Fixed: "Reload All" would not reload files.
|
||||||
|
|
||||||
|
In addition, a lot of work has gone into getting a usable Mac OSX version.
|
||||||
|
|
||||||
|
New Features
|
||||||
|
------------
|
||||||
|
|
||||||
|
* Plugin based system
|
||||||
|
The Uranium framework provides us with a plugin-based system
|
||||||
|
that provides additional flexibility when extending Cura. Think
|
||||||
|
of new views, tools, file formats, etc. This is probably the
|
||||||
|
biggest new feature.
|
||||||
|
* Improved UI
|
||||||
|
The UI has received a complete overhaul.
|
||||||
|
* Time-Quality Slider
|
||||||
|
The 4 static quick print profiles have been replaced with
|
||||||
|
a slider that should make it easier to find the right spot
|
||||||
|
between print time and print quality.
|
||||||
|
* More Settings
|
||||||
|
The Advanced mode is now configurable and can show many
|
||||||
|
additional settings that were previously not available, while at
|
||||||
|
the same time not overwhelming new users with too many settings.
|
||||||
|
Custom set of visible settings can be created by the user.
|
||||||
|
* Support for high-DPI screens
|
||||||
|
The refreshed UI has been designed with high-DPI screens in
|
||||||
|
mind which should improve the experience of Cura on such
|
||||||
|
devices.
|
||||||
|
* Improved language support
|
||||||
|
(Not yet available for the Beta release.)
|
||||||
|
* Improved support structure generation
|
||||||
|
The new version of the CuraEngine now features improved
|
||||||
|
support generation algorithms and additional options for support
|
||||||
|
structure generation.
|
||||||
|
* Experimental Feature: Wire Printing
|
||||||
|
Wire Printing has been added as an experimental new feature. It
|
||||||
|
will print objects as a structure of lines. It can be enabled by
|
||||||
|
from Advanced Mode -> Fixes -> Wire Printing.
|
||||||
|
* Undo/Redo
|
||||||
|
It is now possible to undo and redo most scene operations, like
|
||||||
|
moving or rotating objects.
|
||||||
|
|
||||||
|
Features from earlier versions not (yet) in this release
|
||||||
|
--------------------------------------------------------
|
||||||
|
|
||||||
|
* The All-at-once/One-at-a-time toggle is not available.
|
||||||
|
We are working on an improved implementation of this mechanism
|
||||||
|
but it will not be available for this release.
|
||||||
|
* No dual extrusion features are available yet.
|
||||||
|
We are working on a completely new workflow for this but this
|
||||||
|
needs additional time.
|
||||||
|
* “Lay Flat” has been removed.
|
||||||
|
The existing implementation was unfortunately not salvageable.
|
||||||
|
We will be looking into an improved implementation for this
|
||||||
|
feature.
|
||||||
|
* "Split Object Into Parts" has been removed.
|
||||||
|
Due to the same reason as Lay Flat.
|
||||||
|
* Support for AMF and DAE file formats has been removed.
|
||||||
|
Both of these will be implemented as plugins in the future.
|
||||||
|
* Support for directly loading a GCode file is not yet available.
|
||||||
|
This will be implemented as a plugin in the future.
|
||||||
|
* Support for PNG, JPG and other image formats has been removed.
|
||||||
|
These can be supported by a plugin with an improved UI.
|
||||||
|
* Support for loading Minecraft levels has been removed.
|
||||||
|
This can be implemented as a plugin.
|
||||||
|
* Windows XP support has been dropped.
|
||||||
|
Microsoft is no longer supporting xp, so they no longer back
|
||||||
|
port certain features that we require.
|
||||||
|
* X-Ray view is missing.
|
||||||
|
Will be implemented as a (you might have guessed it) plugin.
|
||||||
|
* Infill display in the layer view is missing.
|
||||||
|
Like several other features, the existing implementation of this
|
||||||
|
functionality is not salvageable and will need to be reimplemented.
|
||||||
|
|
||||||
|
|
||||||
|
Known Issues
|
||||||
|
------------
|
||||||
|
|
||||||
|
For an up to date list of all known issues, please see
|
||||||
|
https://github.com/Ultimaker/Cura/issues and
|
||||||
|
https://github.com/Ultimaker/Uranium/issues .
|
||||||
|
|
||||||
|
* The application has no application icon yet.
|
||||||
|
* The Windows version starts a console before starting the
|
||||||
|
application. This is intentional for the beta and it will be
|
||||||
|
removed for the final version.
|
||||||
|
* Opening the machine preferences page will switch to the first
|
||||||
|
available machine instead of keeping the current machine
|
||||||
|
selected.
|
||||||
|
* Some OBJ files are rendered as black objects due to missing
|
||||||
|
normals.
|
||||||
|
* The developer documentation for Uranium (available at
|
||||||
|
http://software.ultimaker.com/uranium/index.html) is not yet
|
||||||
|
complete.
|
||||||
|
* Disabling plugins does not work correctly yet.
|
||||||
|
* Unicorn occasionally still requires feeding. Do not feed it
|
||||||
|
after midnight.
|
@ -62,7 +62,7 @@ class BuildVolume(SceneNode):
|
|||||||
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, force_single_sided = True)
|
||||||
if self._disallowed_area_mesh:
|
if self._disallowed_area_mesh:
|
||||||
renderer.queueNode(self, mesh = self._disallowed_area_mesh, material = self._material)
|
renderer.queueNode(self, mesh = self._disallowed_area_mesh, material = self._material)
|
||||||
return True
|
return True
|
||||||
@ -99,10 +99,10 @@ class BuildVolume(SceneNode):
|
|||||||
|
|
||||||
mb = MeshBuilder()
|
mb = MeshBuilder()
|
||||||
mb.addQuad(
|
mb.addQuad(
|
||||||
Vector(minW, minH, maxD),
|
Vector(minW, minH, minD),
|
||||||
Vector(maxW, minH, maxD),
|
|
||||||
Vector(maxW, minH, minD),
|
Vector(maxW, minH, minD),
|
||||||
Vector(minW, minH, minD)
|
Vector(maxW, minH, maxD),
|
||||||
|
Vector(minW, minH, maxD)
|
||||||
)
|
)
|
||||||
self._grid_mesh = mb.getData()
|
self._grid_mesh = mb.getData()
|
||||||
for n in range(0, 6):
|
for n in range(0, 6):
|
||||||
|
@ -11,6 +11,7 @@ from UM.Math.Float import Float
|
|||||||
from UM.Math.Vector import Vector
|
from UM.Math.Vector import Vector
|
||||||
from UM.Math.AxisAlignedBox import AxisAlignedBox
|
from UM.Math.AxisAlignedBox import AxisAlignedBox
|
||||||
from UM.Application import Application
|
from UM.Application import Application
|
||||||
|
from UM.Scene.Selection import Selection
|
||||||
|
|
||||||
from . import PlatformPhysicsOperation
|
from . import PlatformPhysicsOperation
|
||||||
from . import ConvexHullJob
|
from . import ConvexHullJob
|
||||||
@ -60,6 +61,8 @@ class PlatformPhysics:
|
|||||||
job = ConvexHullJob.ConvexHullJob(node)
|
job = ConvexHullJob.ConvexHullJob(node)
|
||||||
job.start()
|
job.start()
|
||||||
node._convex_hull_job = job
|
node._convex_hull_job = job
|
||||||
|
elif Selection.isSelected(node):
|
||||||
|
pass
|
||||||
else:
|
else:
|
||||||
# Check for collisions between convex hulls
|
# Check for collisions between convex hulls
|
||||||
for other_node in BreadthFirstIterator(root):
|
for other_node in BreadthFirstIterator(root):
|
||||||
@ -80,8 +83,8 @@ class PlatformPhysics:
|
|||||||
if overlap is None:
|
if overlap is None:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
move_vector.setX(-overlap[0])
|
move_vector.setX(overlap[0] * 1.1)
|
||||||
move_vector.setZ(-overlap[1])
|
move_vector.setZ(overlap[1] * 1.1)
|
||||||
|
|
||||||
if move_vector != Vector():
|
if move_vector != Vector():
|
||||||
op = PlatformPhysicsOperation.PlatformPhysicsOperation(node, move_vector)
|
op = PlatformPhysicsOperation.PlatformPhysicsOperation(node, move_vector)
|
||||||
|
0
cura_app.py
Normal file → Executable file
0
cura_app.py
Normal file → Executable file
@ -110,6 +110,9 @@ class CuraEngineBackend(Backend):
|
|||||||
if not objects:
|
if not objects:
|
||||||
return #No point in slicing an empty build plate
|
return #No point in slicing an empty build plate
|
||||||
|
|
||||||
|
if kwargs.get("settings", self._settings).hasErrorValue():
|
||||||
|
return #No slicing if we have error values since those are by definition illegal values.
|
||||||
|
|
||||||
self._slicing = True
|
self._slicing = True
|
||||||
self.slicingStarted.emit()
|
self.slicingStarted.emit()
|
||||||
|
|
||||||
|
@ -5,6 +5,8 @@ from UM.View.View import View
|
|||||||
from UM.View.Renderer import Renderer
|
from UM.View.Renderer import Renderer
|
||||||
from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
|
from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
|
||||||
from UM.Resources import Resources
|
from UM.Resources import Resources
|
||||||
|
from UM.Scene.Selection import Selection
|
||||||
|
from UM.Math.Color import Color
|
||||||
|
|
||||||
## View used to display g-code paths.
|
## View used to display g-code paths.
|
||||||
class LayerView(View):
|
class LayerView(View):
|
||||||
@ -23,9 +25,15 @@ class LayerView(View):
|
|||||||
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])
|
||||||
|
|
||||||
|
self._selection_material = renderer.createMaterial(Resources.getPath(Resources.ShadersLocation, "basic.vert"), Resources.getPath(Resources.ShadersLocation, "color.frag"))
|
||||||
|
self._selection_material.setUniformValue("u_color", Color(35, 35, 35, 128))
|
||||||
|
|
||||||
for node in DepthFirstIterator(scene.getRoot()):
|
for node in DepthFirstIterator(scene.getRoot()):
|
||||||
if not node.render(renderer):
|
if not node.render(renderer):
|
||||||
if node.getMeshData() and node.isVisible():
|
if node.getMeshData() and node.isVisible():
|
||||||
|
if Selection.isSelected(node):
|
||||||
|
renderer.queueNode(node, material = self._selection_material, transparent = True)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
layer_data = node.getMeshData().layerData
|
layer_data = node.getMeshData().layerData
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
@ -43,9 +51,9 @@ class LayerView(View):
|
|||||||
if layer >= end_layer:
|
if layer >= end_layer:
|
||||||
break
|
break
|
||||||
|
|
||||||
renderer.queueNode(node, mesh = layer_data, material = self._material, mode = Renderer.RenderLines, start = start, end = end)
|
renderer.queueNode(node, mesh = layer_data, material = self._material, mode = Renderer.RenderLines, start = start, end = end, overlay = True)
|
||||||
else:
|
else:
|
||||||
renderer.queueNode(node, mesh = layer_data, material = self._material, mode = Renderer.RenderLines)
|
renderer.queueNode(node, mesh = layer_data, material = self._material, mode = Renderer.RenderLines, overlay = True)
|
||||||
|
|
||||||
def setLayer(self, value):
|
def setLayer(self, value):
|
||||||
self._layer_percentage = value
|
self._layer_percentage = value
|
||||||
|
@ -248,7 +248,10 @@ class PrinterConnection(SignalEmitter):
|
|||||||
|
|
||||||
if self._serial is not None:
|
if self._serial is not None:
|
||||||
self.setIsConnected(False)
|
self.setIsConnected(False)
|
||||||
self._listen_thread.join()
|
try:
|
||||||
|
self._listen_thread.join()
|
||||||
|
except:
|
||||||
|
pass
|
||||||
self._serial.close()
|
self._serial.close()
|
||||||
|
|
||||||
self._serial = None
|
self._serial = None
|
||||||
|
@ -40,7 +40,8 @@ class USBPrinterManager(QObject, SignalEmitter, Extension):
|
|||||||
self._error_message = ""
|
self._error_message = ""
|
||||||
|
|
||||||
## 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.setMenuName("Firmware")
|
||||||
|
self.addMenuItem(i18n_catalog.i18n("Update"), self.updateAllFirmware)
|
||||||
|
|
||||||
pyqtError = pyqtSignal(str, arguments = ["amount"])
|
pyqtError = pyqtSignal(str, arguments = ["amount"])
|
||||||
processingProgress = pyqtSignal(float, arguments = ["amount"])
|
processingProgress = pyqtSignal(float, arguments = ["amount"])
|
||||||
|
@ -144,23 +144,6 @@ UM.MainWindow {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Sidebar {
|
|
||||||
id: sidebar;
|
|
||||||
|
|
||||||
anchors {
|
|
||||||
top: parent.top;
|
|
||||||
bottom: parent.bottom;
|
|
||||||
right: parent.right;
|
|
||||||
rightMargin: UM.Theme.sizes.window_margin.width;
|
|
||||||
}
|
|
||||||
|
|
||||||
width: UM.Theme.sizes.panel.width;
|
|
||||||
|
|
||||||
addMachineAction: actions.addMachine;
|
|
||||||
configureMachinesAction: actions.configureMachines;
|
|
||||||
saveAction: actions.save;
|
|
||||||
}
|
|
||||||
|
|
||||||
UM.MessageStack {
|
UM.MessageStack {
|
||||||
anchors {
|
anchors {
|
||||||
left: toolbar.right;
|
left: toolbar.right;
|
||||||
@ -265,6 +248,23 @@ UM.MainWindow {
|
|||||||
bottomMargin: UM.Theme.sizes.window_margin.height;
|
bottomMargin: UM.Theme.sizes.window_margin.height;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Sidebar {
|
||||||
|
id: sidebar;
|
||||||
|
|
||||||
|
anchors {
|
||||||
|
top: parent.top;
|
||||||
|
bottom: parent.bottom;
|
||||||
|
right: parent.right;
|
||||||
|
rightMargin: UM.Theme.sizes.window_margin.width;
|
||||||
|
}
|
||||||
|
|
||||||
|
width: UM.Theme.sizes.panel.width;
|
||||||
|
|
||||||
|
addMachineAction: actions.addMachine;
|
||||||
|
configureMachinesAction: actions.configureMachines;
|
||||||
|
saveAction: actions.save;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,9 +17,11 @@ UM.AngledCornerRectangle {
|
|||||||
|
|
||||||
cornerSize: UM.Theme.sizes.default_margin.width;
|
cornerSize: UM.Theme.sizes.default_margin.width;
|
||||||
|
|
||||||
|
color: UM.Theme.colors.sidebar;
|
||||||
|
|
||||||
function showTooltip(item, position, text) {
|
function showTooltip(item, position, text) {
|
||||||
tooltip.text = text;
|
tooltip.text = text;
|
||||||
position = item.mapToItem(base, position.x, position.y);
|
position = item.mapToItem(base, position.x, position.y / 2);
|
||||||
tooltip.show(position);
|
tooltip.show(position);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,10 +22,10 @@ Rectangle {
|
|||||||
|
|
||||||
function show(position) {
|
function show(position) {
|
||||||
if(position.y + base.height > parent.height) {
|
if(position.y + base.height > parent.height) {
|
||||||
x = position.x;
|
x = position.x - base.width;
|
||||||
y = parent.height - base.height;
|
y = parent.height - base.height;
|
||||||
} else {
|
} else {
|
||||||
x = position.x;
|
x = position.x - base.width;
|
||||||
y = position.y;
|
y = position.y;
|
||||||
}
|
}
|
||||||
base.opacity = 1;
|
base.opacity = 1;
|
||||||
|
@ -41,8 +41,9 @@
|
|||||||
"unit": "mm",
|
"unit": "mm",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default": 0.1,
|
"default": 0.1,
|
||||||
"min_value": 0.06,
|
"min_value": 0.00001,
|
||||||
"max_value": 2.0,
|
"min_value_warning": 0.04,
|
||||||
|
"max_value_warning": 2.0,
|
||||||
"always_visible": true,
|
"always_visible": true,
|
||||||
"children": {
|
"children": {
|
||||||
"layer_height_0": {
|
"layer_height_0": {
|
||||||
@ -51,8 +52,9 @@
|
|||||||
"unit": "mm",
|
"unit": "mm",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default": 0.3,
|
"default": 0.3,
|
||||||
"min_value": 0.06,
|
"min_value": 0.0,
|
||||||
"max_value": 2.0,
|
"min_value_warning": 0.04,
|
||||||
|
"max_value_warning": 2.0,
|
||||||
"visible": false
|
"visible": false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -73,6 +73,7 @@ QtObject {
|
|||||||
anchors.horizontalCenter: parent.horizontalCenter;
|
anchors.horizontalCenter: parent.horizontalCenter;
|
||||||
text: control.text;
|
text: control.text;
|
||||||
font: UM.Theme.fonts.button_tooltip;
|
font: UM.Theme.fonts.button_tooltip;
|
||||||
|
color: UM.Theme.colors.button_tooltip_text;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -121,6 +122,8 @@ QtObject {
|
|||||||
Image {
|
Image {
|
||||||
anchors.verticalCenter: parent.verticalCenter;
|
anchors.verticalCenter: parent.verticalCenter;
|
||||||
source: control.iconSource;
|
source: control.iconSource;
|
||||||
|
width: UM.Theme.sizes.section_icon.width;
|
||||||
|
height: UM.Theme.sizes.section_icon.height;
|
||||||
}
|
}
|
||||||
|
|
||||||
Label {
|
Label {
|
||||||
|
@ -44,6 +44,8 @@
|
|||||||
},
|
},
|
||||||
|
|
||||||
"colors": {
|
"colors": {
|
||||||
|
"sidebar": [255, 255, 255, 255],
|
||||||
|
|
||||||
"primary": [12, 169, 227, 255],
|
"primary": [12, 169, 227, 255],
|
||||||
"primary_hover": [34, 150, 190, 255],
|
"primary_hover": [34, 150, 190, 255],
|
||||||
"primary_text": [255, 255, 255, 255],
|
"primary_text": [255, 255, 255, 255],
|
||||||
@ -61,6 +63,7 @@
|
|||||||
"button_active_hover": [34, 150, 190, 255],
|
"button_active_hover": [34, 150, 190, 255],
|
||||||
"button_text": [255, 255, 255, 255],
|
"button_text": [255, 255, 255, 255],
|
||||||
"button_disabled": [245, 245, 245, 255],
|
"button_disabled": [245, 245, 245, 255],
|
||||||
|
"button_tooltip_text": [35, 35, 35, 255],
|
||||||
|
|
||||||
"scrollbar_background": [245, 245, 245, 255],
|
"scrollbar_background": [245, 245, 245, 255],
|
||||||
"scrollbar_handle": [205, 202, 201, 255],
|
"scrollbar_handle": [205, 202, 201, 255],
|
||||||
|
Loading…
x
Reference in New Issue
Block a user