Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/supermerill/SuperSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVojtech Bubnik <bubnikv@gmail.com>2020-12-09 11:27:03 +0300
committerVojtech Bubnik <bubnikv@gmail.com>2020-12-09 11:27:03 +0300
commit562c0bd563ac0af9491a03d634c00e8c0c555e45 (patch)
tree48b237429164a377b6d41c254f203f14c84fcfce /src
parent7353d8c6e96b934550aa0c743c26b5cf3bd8b98e (diff)
parentf0e02ea5d0e3eef49aa8792ccbd5901c5c183b09 (diff)
Merge branch 'master' of https://github.com/Prusa3d/PrusaSlicer
Diffstat (limited to 'src')
-rw-r--r--src/libslic3r/Geometry.cpp2
-rw-r--r--src/libslic3r/PrintConfig.cpp5
-rw-r--r--src/libslic3r/PrintObject.cpp12
-rw-r--r--src/slic3r/GUI/Selection.cpp43
4 files changed, 20 insertions, 42 deletions
diff --git a/src/libslic3r/Geometry.cpp b/src/libslic3r/Geometry.cpp
index b263aecfd..45730dd9f 100644
--- a/src/libslic3r/Geometry.cpp
+++ b/src/libslic3r/Geometry.cpp
@@ -1223,7 +1223,7 @@ Vec3d extract_euler_angles(const Eigen::Matrix<double, 3, 3, Eigen::DontAlign>&
// reference: http://www.gregslabaugh.net/publications/euler.pdf
Vec3d angles1 = Vec3d::Zero();
Vec3d angles2 = Vec3d::Zero();
- if (is_approx(std::abs(rotation_matrix(2, 0)), 1.0))
+ if (std::abs(std::abs(rotation_matrix(2, 0)) - 1.0) < 1e-5)
{
angles1(2) = 0.0;
if (rotation_matrix(2, 0) < 0.0) // == -1.0
diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp
index fcdb3ab04..49e1d416e 100644
--- a/src/libslic3r/PrintConfig.cpp
+++ b/src/libslic3r/PrintConfig.cpp
@@ -3356,8 +3356,11 @@ void DynamicPrintConfig::normalize_fdm()
if (this->has("spiral_vase") && this->opt<ConfigOptionBool>("spiral_vase", true)->value) {
{
// this should be actually done only on the spiral layers instead of all
- ConfigOptionBools* opt = this->opt<ConfigOptionBools>("retract_layer_change", true);
+ auto* opt = this->opt<ConfigOptionBools>("retract_layer_change", true);
opt->values.assign(opt->values.size(), false); // set all values to false
+ // Disable retract on layer change also for filament overrides.
+ auto* opt_n = this->opt<ConfigOptionBoolsNullable>("filament_retract_layer_change", true);
+ opt_n->values.assign(opt_n->values.size(), false); // Set all values to false.
}
{
this->opt<ConfigOptionInt>("perimeters", true)->value = 1;
diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp
index 51b3128ba..a409f12e1 100644
--- a/src/libslic3r/PrintObject.cpp
+++ b/src/libslic3r/PrintObject.cpp
@@ -719,7 +719,7 @@ void PrintObject::detect_surfaces_type()
// should be visible.
bool spiral_vase = this->print()->config().spiral_vase.value;
bool interface_shells = ! spiral_vase && m_config.interface_shells.value;
- size_t num_layers = spiral_vase ? first_printing_region(*this)->config().bottom_solid_layers : m_layers.size();
+ size_t num_layers = spiral_vase ? std::min(size_t(first_printing_region(*this)->config().bottom_solid_layers), m_layers.size()) : m_layers.size();
for (size_t idx_region = 0; idx_region < this->region_volumes.size(); ++ idx_region) {
BOOST_LOG_TRIVIAL(debug) << "Detecting solid surfaces for region " << idx_region << " in parallel - start";
@@ -1007,7 +1007,7 @@ void PrintObject::discover_vertical_shells()
Polygons holes;
};
bool spiral_vase = this->print()->config().spiral_vase.value;
- size_t num_layers = spiral_vase ? first_printing_region(*this)->config().bottom_solid_layers : m_layers.size();
+ size_t num_layers = spiral_vase ? std::min(size_t(first_printing_region(*this)->config().bottom_solid_layers), m_layers.size()) : m_layers.size();
coordf_t min_layer_height = this->slicing_parameters().min_layer_height;
// Does this region possibly produce more than 1 top or bottom layer?
auto has_extra_layers_fn = [min_layer_height](const PrintRegionConfig &config) {
@@ -2014,7 +2014,7 @@ std::vector<ExPolygons> PrintObject::slice_region(size_t region_id, const std::v
return this->slice_volumes(z, mode, volumes);
}
-// Z ranges are not applicable to modifier meshes, therefore a sinle volume will be found in volume_and_range at most once.
+// Z ranges are not applicable to modifier meshes, therefore a single volume will be found in volume_and_range at most once.
std::vector<ExPolygons> PrintObject::slice_modifiers(size_t region_id, const std::vector<float> &slice_zs) const
{
std::vector<ExPolygons> out;
@@ -2080,10 +2080,12 @@ std::vector<ExPolygons> PrintObject::slice_modifiers(size_t region_id, const std
ranges.emplace_back(volumes_and_ranges[j].first);
// slicing in parallel
std::vector<ExPolygons> this_slices = this->slice_volume(slice_zs, ranges, SlicingMode::Regular, *model_volume);
+ // Variable this_slices could be empty if no value of slice_zs is within any of the ranges of this volume.
if (out.empty()) {
out = std::move(this_slices);
merge.assign(out.size(), false);
- } else {
+ } else if (!this_slices.empty()) {
+ assert(out.size() == this_slices.size());
for (size_t i = 0; i < out.size(); ++ i)
if (! this_slices[i].empty()) {
if (! out[i].empty()) {
@@ -2188,7 +2190,7 @@ std::vector<ExPolygons> PrintObject::slice_volume(const std::vector<float> &z, S
return layers;
}
-// Filter the zs not inside the ranges. The ranges are closed at the botton and open at the top, they are sorted lexicographically and non overlapping.
+// Filter the zs not inside the ranges. The ranges are closed at the bottom and open at the top, they are sorted lexicographically and non overlapping.
std::vector<ExPolygons> PrintObject::slice_volume(const std::vector<float> &z, const std::vector<t_layer_height_range> &ranges, SlicingMode mode, const ModelVolume &volume) const
{
std::vector<ExPolygons> out;
diff --git a/src/slic3r/GUI/Selection.cpp b/src/slic3r/GUI/Selection.cpp
index 610881aed..cdd3ebe85 100644
--- a/src/slic3r/GUI/Selection.cpp
+++ b/src/slic3r/GUI/Selection.cpp
@@ -841,41 +841,14 @@ void Selection::flattening_rotate(const Vec3d& normal)
for (unsigned int i : m_list)
{
- Transform3d wst = m_cache.volumes_data[i].get_instance_scale_matrix();
- Vec3d scaling_factor = Vec3d(1. / wst(0, 0), 1. / wst(1, 1), 1. / wst(2, 2));
-
- Transform3d wmt = m_cache.volumes_data[i].get_instance_mirror_matrix();
- Vec3d mirror(wmt(0, 0), wmt(1, 1), wmt(2, 2));
-
- Vec3d rotation = Geometry::extract_euler_angles(m_cache.volumes_data[i].get_instance_rotation_matrix());
- Vec3d tnormal = Geometry::assemble_transform(Vec3d::Zero(), rotation, scaling_factor, mirror) * normal;
- tnormal.normalize();
-
- // Calculate rotation axis. It shall be perpendicular to "down" direction
- // and the normal, so the rotation is the shortest possible and logical.
- Vec3d axis = tnormal.cross(-Vec3d::UnitZ());
-
- // Make sure the axis is not zero and normalize it. "Almost" zero is not interesting.
- // In case the vectors are almost colinear, the rotation axis does not matter much.
- if (axis == Vec3d::Zero())
- axis = Vec3d::UnitX();
- axis.normalize();
-
- // Calculate the angle using the component where we achieve more precision.
- // Cosine of small angles is const in first order. No good.
- double angle = 0.;
- if (std::abs(tnormal.z()) < std::sqrt(2.)/2.)
- angle = std::acos(-tnormal.z());
- else {
- double xy = std::hypot(tnormal.x(), tnormal.y());
- angle = PI/2. + std::acos(xy * (tnormal.z() > 0.));
- }
-
- Transform3d extra_rotation = Transform3d::Identity();
- extra_rotation.rotate(Eigen::AngleAxisd(angle, axis));
-
- Vec3d new_rotation = Geometry::extract_euler_angles(extra_rotation * m_cache.volumes_data[i].get_instance_rotation_matrix());
- (*m_volumes)[i]->set_instance_rotation(new_rotation);
+ // Normal transformed from the object coordinate space to the world coordinate space.
+ const auto &voldata = m_cache.volumes_data[i];
+ Vec3d tnormal = (Geometry::assemble_transform(
+ Vec3d::Zero(), voldata.get_instance_rotation(),
+ voldata.get_instance_scaling_factor().cwiseInverse(), voldata.get_instance_mirror()) * normal).normalized();
+ // Additional rotation to align tnormal with the down vector in the world coordinate space.
+ auto extra_rotation = Eigen::Quaterniond().setFromTwoVectors(tnormal, - Vec3d::UnitZ());
+ (*m_volumes)[i]->set_instance_rotation(Geometry::extract_euler_angles(extra_rotation.toRotationMatrix() * m_cache.volumes_data[i].get_instance_rotation_matrix()));
}
#if !DISABLE_INSTANCES_SYNCH