mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-04-28 23:04:34 +08:00
Merge branch '4.8' of github.com:Ultimaker/Cura
This commit is contained in:
commit
ff10eac372
@ -4,6 +4,7 @@ from typing import List
|
||||
|
||||
from UM.Application import Application
|
||||
from UM.Job import Job
|
||||
from UM.Logger import Logger
|
||||
from UM.Message import Message
|
||||
from UM.Scene.SceneNode import SceneNode
|
||||
from UM.i18n import i18nCatalog
|
||||
@ -27,10 +28,14 @@ class ArrangeObjectsJob(Job):
|
||||
title = i18n_catalog.i18nc("@info:title", "Finding Location"))
|
||||
status_message.show()
|
||||
|
||||
found_solution_for_all = arrange(self._nodes, Application.getInstance().getBuildVolume(), self._fixed_nodes)
|
||||
found_solution_for_all = None
|
||||
try:
|
||||
found_solution_for_all = arrange(self._nodes, Application.getInstance().getBuildVolume(), self._fixed_nodes)
|
||||
except: # If the thread crashes, the message should still close
|
||||
Logger.logException("e", "Unable to arrange the objects on the buildplate. The arrange algorithm has crashed.")
|
||||
|
||||
status_message.hide()
|
||||
if not found_solution_for_all:
|
||||
if found_solution_for_all is not None and not found_solution_for_all:
|
||||
no_full_solution_message = Message(
|
||||
i18n_catalog.i18nc("@info:status",
|
||||
"Unable to find a location within the build volume for all objects"),
|
||||
|
@ -3,6 +3,7 @@ from pynest2d import Point, Box, Item, NfpConfig, nest
|
||||
from typing import List, TYPE_CHECKING, Optional, Tuple
|
||||
|
||||
from UM.Application import Application
|
||||
from UM.Logger import Logger
|
||||
from UM.Math.Matrix import Matrix
|
||||
from UM.Math.Polygon import Polygon
|
||||
from UM.Math.Quaternion import Quaternion
|
||||
@ -44,6 +45,9 @@ def findNodePlacement(nodes_to_arrange: List["SceneNode"], build_volume: "BuildV
|
||||
node_items = []
|
||||
for node in nodes_to_arrange:
|
||||
hull_polygon = node.callDecoration("getConvexHull")
|
||||
if not hull_polygon or hull_polygon.getPoints is None:
|
||||
Logger.log("w", "Object {} cannot be arranged because it has no convex hull.".format(node.getName()))
|
||||
continue
|
||||
converted_points = []
|
||||
for point in hull_polygon.getPoints():
|
||||
converted_points.append(Point(point[0] * factor, point[1] * factor))
|
||||
|
@ -1,11 +1,11 @@
|
||||
# Copyright (c) 2019 Ultimaker B.V.
|
||||
# Copyright (c) 2020 Ultimaker B.V.
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
from datetime import datetime
|
||||
import json
|
||||
import random
|
||||
from hashlib import sha512
|
||||
from base64 import b64encode
|
||||
from typing import Optional
|
||||
from typing import Optional, Any, Dict, Tuple
|
||||
|
||||
import requests
|
||||
|
||||
@ -16,6 +16,7 @@ from cura.OAuth2.Models import AuthenticationResponse, UserProfile, OAuth2Settin
|
||||
catalog = i18nCatalog("cura")
|
||||
TOKEN_TIMESTAMP_FORMAT = "%Y-%m-%d %H:%M:%S"
|
||||
|
||||
|
||||
class AuthorizationHelpers:
|
||||
"""Class containing several helpers to deal with the authorization flow."""
|
||||
|
||||
@ -121,10 +122,13 @@ class AuthorizationHelpers:
|
||||
if not user_data or not isinstance(user_data, dict):
|
||||
Logger.log("w", "Could not parse user data from token: %s", user_data)
|
||||
return None
|
||||
|
||||
return UserProfile(
|
||||
user_id = user_data["user_id"],
|
||||
username = user_data["username"],
|
||||
profile_image_url = user_data.get("profile_image_url", "")
|
||||
profile_image_url = user_data.get("profile_image_url", ""),
|
||||
organization_id = user_data.get("organization", {}).get("organization_id", ""),
|
||||
subscriptions = user_data.get("subscriptions", [])
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
|
@ -1,6 +1,6 @@
|
||||
# Copyright (c) 2019 Ultimaker B.V.
|
||||
# Copyright (c) 2020 Ultimaker B.V.
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
from typing import Optional, Dict, Any
|
||||
from typing import Optional, Dict, Any, List
|
||||
|
||||
|
||||
class BaseModel:
|
||||
@ -27,6 +27,8 @@ class UserProfile(BaseModel):
|
||||
user_id = None # type: Optional[str]
|
||||
username = None # type: Optional[str]
|
||||
profile_image_url = None # type: Optional[str]
|
||||
organization_id = None # type: Optional[str]
|
||||
subscriptions = None # type: Optional[List[Dict[str, Any]]]
|
||||
|
||||
|
||||
class AuthenticationResponse(BaseModel):
|
||||
|
@ -19,6 +19,7 @@ from UM.Scene.SceneNode import SceneNode # For typing.
|
||||
from cura.CuraApplication import CuraApplication
|
||||
from cura.Machines.ContainerTree import ContainerTree
|
||||
from cura.Scene.BuildPlateDecorator import BuildPlateDecorator
|
||||
from cura.Scene.ConvexHullDecorator import ConvexHullDecorator
|
||||
from cura.Scene.CuraSceneNode import CuraSceneNode
|
||||
from cura.Scene.SliceableObjectDecorator import SliceableObjectDecorator
|
||||
from cura.Scene.ZOffsetDecorator import ZOffsetDecorator
|
||||
@ -108,6 +109,7 @@ class ThreeMFReader(MeshReader):
|
||||
|
||||
um_node = CuraSceneNode() # This adds a SettingOverrideDecorator
|
||||
um_node.addDecorator(BuildPlateDecorator(active_build_plate))
|
||||
um_node.addDecorator(ConvexHullDecorator())
|
||||
um_node.setName(node_name)
|
||||
um_node.setId(node_id)
|
||||
transformation = self._createMatrixFromTransformationString(savitar_node.getTransformation())
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Copyright (c) 2018 Ultimaker B.V.
|
||||
# Copyright (c) 2020 Ultimaker B.V.
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
import json
|
||||
@ -116,6 +116,7 @@ class SliceInfo(QObject, Extension):
|
||||
|
||||
machine_manager = self._application.getMachineManager()
|
||||
print_information = self._application.getPrintInformation()
|
||||
user_profile = self._application.getCuraAPI().account.userProfile
|
||||
|
||||
global_stack = machine_manager.activeMachine
|
||||
|
||||
@ -124,6 +125,8 @@ class SliceInfo(QObject, Extension):
|
||||
data["schema_version"] = 0
|
||||
data["cura_version"] = self._application.getVersion()
|
||||
data["cura_build_type"] = ApplicationMetadata.CuraBuildType
|
||||
data["organization_id"] = user_profile.get("organization_id", None) if user_profile else None
|
||||
data["subscriptions"] = user_profile.get("subscriptions", []) if user_profile else []
|
||||
|
||||
active_mode = self._application.getPreferences().getValue("cura/active_mode")
|
||||
if active_mode == 0:
|
||||
|
@ -1,12 +1,17 @@
|
||||
<html>
|
||||
<body>
|
||||
<b>Cura Version:</b> 4.0<br/>
|
||||
<b>Cura Version:</b> 4.8<br/>
|
||||
<b>Operating System:</b> Windows 10<br/>
|
||||
<b>Language:</b> en_US<br/>
|
||||
<b>Machine Type:</b> Ultimaker S5<br/>
|
||||
<b>Intent Profile:</b> Default<br/>
|
||||
<b>Quality Profile:</b> Fast<br/>
|
||||
<b>Using Custom Settings:</b> No
|
||||
<b>Using Custom Settings:</b> No<br/>
|
||||
<b>Organization ID (if any):</b> ABCDefGHIjKlMNOpQrSTUvYxWZ0-1234567890abcDE=<br/>
|
||||
<b>Subscriptions (if any):</b>
|
||||
<ul>
|
||||
<li><b>Level:</b> 10, <b>Type:</b> Enterprise, <b>Plan:</b> Basic</li>
|
||||
</ul>
|
||||
|
||||
<h3>Extruder 1:</h3>
|
||||
<ul>
|
||||
|
@ -1,3 +1,57 @@
|
||||
[4.8.0]
|
||||
|
||||
* (NOTE: Draft release notes for Beta, these may change for final.)
|
||||
|
||||
* New arrange algorithm!
|
||||
Shoutout to Prusa, since they made the libnest2d library for this, and allowed a licence change.
|
||||
|
||||
* When opening a project file, pick any matching printer in addition to just exact match and new definition.
|
||||
Previously, when someone sent you a project, you either had to have the exact same printer under the exact same name, or create an entirely new instance. Now, in the open project dialog, you can specify any printer that has a(n exactly) matching printer-type.
|
||||
|
||||
* Show warning message on profiles that where successfully imported, but not supported by the currently active configuration.
|
||||
People where a bit confused when adding profiles, which then didn't show up. With this new version, when you add a profile that isn't supported by the current instance (but otherwise correctly imported), you get a warning-message.
|
||||
|
||||
* Show parts of the model below the buildplate in a different color.
|
||||
When viewing the buildplate from below, there's now shadow visible anymore. As this helped the user determine what part of the model was below the buildplate, we decided to color that part differently instead.
|
||||
|
||||
* Show the familiar striped pattern for objects outside of the build-volume in Preview mode as well.
|
||||
Models outside of the build-volume can of course not be sliced. In the Prepare mode, this was already visible with solid objects indicated in the familiar grey-yellow striped pattern. Now you can also see the objects that are still in the scene just outside if the build-volume in Preview mode.
|
||||
|
||||
* Iron the top-most bottom layer when spiralizing a solid model, contributed by smartavionics
|
||||
Ironing was only used for top-layers, or every layer. But what is the biggest flat surface in a vase? This helpful pull request made it so that, in this case, the top-most bottom layer is used to iron on.
|
||||
|
||||
* Allow scrolling through setting-tooltips, useful for some plugins.
|
||||
Certain plugins, such as the very useful Settings Guide, occasionally have very large tooltips. This update allows you to scroll through those.
|
||||
|
||||
* Bug Fixes
|
||||
- Fix the simplify algorithm. Again.
|
||||
- Fix percentage text-fields when scaling non-uniformly.
|
||||
- Fix cloud printer stuck in connect/disconnect loop.
|
||||
- Fix rare crash when processing stair stepping in support.
|
||||
- Fix sudden increase in tree support branch diameter.
|
||||
- Fix cases of tree-support resting against vertical wall.
|
||||
- Fix conical support missing on printers with 'origin at center' set.
|
||||
- Fix infill multiplier and connected lines settings not cooperating with each other.
|
||||
- Fixed an issue with skin-edge support, contributed by smartavionics
|
||||
- Fix printer renaming didn't always stick after restart.
|
||||
- Fix move after retraction not changing speed if it's a factor 60 greater.
|
||||
- Fix Windows file alteration detection (reload file popup message appears again).
|
||||
- OBJ-file reader now doesn't get confused by legal negative indices.
|
||||
- Fix off-by-one error that could cause horizontal faces to shift one layer upwards.
|
||||
- Fix out of bounds array and lost checks for segments ended with mesh vertices, contributed bt skarasov
|
||||
- Remove redundant 'successful responses' variable, contributed by aerotog
|
||||
|
||||
* Printer definitions and profiles
|
||||
- Artillery Sidewinder X1, Artillery Sidewinder Genius, contributed by cataclism
|
||||
- AnyCubic Kossel, contributed by FoxExe
|
||||
- BIQU B1, contributed by looxonline
|
||||
- BLV mgn Cube 300, contributed by wolfgangmauer
|
||||
- Cocoon Create, Cocoon Create Touch, contributed by thushan
|
||||
- Creality CR-6 SE, contributed by MatthieuMH
|
||||
- Flying Bear Ghost 5, contributed by oducceu
|
||||
- Fused Form 3D (FF300, FF600, FF600+, FFmini), contributed by FusedForm
|
||||
- Add Acetate profiles for Strateo3D, contributed by KOUBeMT
|
||||
|
||||
[4.7.1]
|
||||
For an overview of the new features in Cura 4.7, please see this video: <a href="https://www.youtube.com/watch?v=vuKuil0dJqE">Change log overview</a>
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user