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

github.com/prusa3d/PrusaSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLukas Matena <lukasmatena@seznam.cz>2020-04-21 14:50:47 +0300
committerLukas Matena <lukasmatena@seznam.cz>2020-04-21 14:50:47 +0300
commit7fc4a71715c834e7016caceba67dafa67f8ef141 (patch)
tree16490a7160b327438cf8653fc0061827936a11cd /src
parent79ef456d7c12a91925ca3343c20f0d5d99bbcc5e (diff)
Moved the projection function into PrintObject.cpp
Diffstat (limited to 'src')
-rw-r--r--src/libslic3r/Print.hpp5
-rw-r--r--src/libslic3r/PrintObject.cpp103
-rw-r--r--src/libslic3r/SupportMaterial.cpp112
3 files changed, 111 insertions, 109 deletions
diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp
index 7180bae17..af32478d6 100644
--- a/src/libslic3r/Print.hpp
+++ b/src/libslic3r/Print.hpp
@@ -192,6 +192,11 @@ public:
std::vector<ExPolygons> slice_support_blockers() const { return this->slice_support_volumes(ModelVolumeType::SUPPORT_BLOCKER); }
std::vector<ExPolygons> slice_support_enforcers() const { return this->slice_support_volumes(ModelVolumeType::SUPPORT_ENFORCER); }
+ // Helpers to project custom supports on slices
+ void project_and_append_custom_supports(FacetSupportType type, std::vector<ExPolygons>& expolys) const;
+ void project_and_append_custom_enforcers(std::vector<ExPolygons>& enforcers) const { project_and_append_custom_supports(FacetSupportType::ENFORCER, enforcers); }
+ void project_and_append_custom_blockers(std::vector<ExPolygons>& blockers) const { project_and_append_custom_supports(FacetSupportType::BLOCKER, blockers); }
+
private:
// to be called from Print only.
friend class Print;
diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp
index 5573f4ac3..bff9198c0 100644
--- a/src/libslic3r/PrintObject.cpp
+++ b/src/libslic3r/PrintObject.cpp
@@ -2645,4 +2645,107 @@ void PrintObject::_generate_support_material()
support_material.generate(*this);
}
+
+void PrintObject::project_and_append_custom_supports(
+ FacetSupportType type, std::vector<ExPolygons>& expolys) const
+{
+ for (const ModelVolume* mv : this->model_object()->volumes) {
+ const auto& custom_facets = mv->m_supported_facets.get_facets(type);
+ const TriangleMesh& mesh = mv->mesh();
+ const Transform3f& tr1 = mv->get_matrix().cast<float>();
+ const Transform3f& tr2 = this->trafo().cast<float>();
+
+ // List of all layers.
+ const LayerPtrs& layers = this->layers();
+
+ // Make sure that enforcers vector can be used.
+ if (! custom_facets.empty())
+ expolys.resize(layers.size());
+
+ // Iterate over all triangles.
+ for (int facet_idx : custom_facets) {
+ std::array<Vec3f, 3> facet;
+ std::array<float, 3> z_heights;
+
+ // Transform the triangle into worlds coords.
+ for (int i=0; i<3; ++i)
+ facet[i] = tr2 * tr1 * mesh.its.vertices[mesh.its.indices[facet_idx](i)];
+
+ // Sort the three vertices according to z-coordinate.
+ std::sort(facet.begin(), facet.end(),
+ [](const Vec3f& pt1, const Vec3f&pt2) {
+ return pt1.z() < pt2.z();
+ });
+
+ Polygon triangle;
+ for (int i=0; i<3; ++i) {
+ z_heights[i] = facet[i].z();
+ triangle.append(Point::new_scale(facet[i].x(), facet[i].y()));
+ triangle.translate(this->center_offset());
+ }
+
+ // Find lowest slice not below the triangle.
+ auto it = std::lower_bound(layers.begin(), layers.end(), z_heights[0],
+ [](const Layer* l1, float z) {
+ return l1->slice_z < z;
+ });
+
+
+ // Calculate how to move points on triangle sides per unit z increment.
+ Point ta(triangle.points[1] - triangle.points[0]);
+ Point tb(triangle.points[2] - triangle.points[0]);
+
+ ta *= 1./(z_heights[1] - z_heights[0]);
+ tb *= 1./(z_heights[2] - z_heights[0]);
+
+ Points proj;
+ proj.emplace_back(triangle.points[0]);
+
+ Point a(proj.back());
+ Point b(proj.back());
+ float last_z = facet[0].z();
+ bool passed_first = false;
+ bool stop = false;
+
+ // Project a sub-triangle on all slices intersecting the triangle.
+ while (it != layers.end()) {
+ const float z = (*it)->slice_z;
+
+ if (z > z_heights[1] && ! passed_first) {
+ a = triangle.points[1];
+ ta = triangle.points[2]-triangle.points[1];
+ ta *= 1./(z_heights[2] - z_heights[1]);
+ proj.push_back(a);
+ passed_first = true;
+ }
+ a += ta * (z-last_z);
+
+ if (z > z_heights[2] || it+1 == layers.end()) {
+ b = triangle.points[2];
+ proj.push_back(b);
+ stop = true;
+ }
+ else {
+ b += tb * (z-last_z);
+ proj.push_back(a+ta);
+ proj.push_back(b+tb);
+ }
+
+ if (it != layers.begin())
+ expolys[it-layers.begin()-1].emplace_back(proj);
+
+ if (stop)
+ break;
+
+ proj.clear();
+ proj.push_back(b);
+ proj.push_back(a);
+
+ ++it;
+ last_z = z;
+ }
+ }
+ }
+}
+
} // namespace Slic3r
diff --git a/src/libslic3r/SupportMaterial.cpp b/src/libslic3r/SupportMaterial.cpp
index 65835fe9c..647c00ec2 100644
--- a/src/libslic3r/SupportMaterial.cpp
+++ b/src/libslic3r/SupportMaterial.cpp
@@ -971,115 +971,9 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::top_contact_
std::vector<ExPolygons> enforcers = object.slice_support_enforcers();
std::vector<ExPolygons> blockers = object.slice_support_blockers();
-
-
-
-
-
- ///////////////////////////////////////////////////////////////////////////
- /// TEMPORARY INLINE DRAFT PROJECTING CUSTOM SUPPORTS ON SLICES ///
- /// ///////////////////////////////////////////////////////////////////////
- const auto& data = object.model_object()->volumes.front()->m_supported_facets;
- const auto& custom_enf = data.get_facets(FacetSupportType::ENFORCER);
- const TriangleMesh& mesh = object.model_object()->volumes.front()->mesh();
- const Transform3f& tr1 = object.model_object()->volumes.front()->get_matrix().cast<float>();
- const Transform3f& tr2 = object.trafo().cast<float>();
-
- // Make a list of all layers.
- const LayerPtrs& layers = object.layers();
-
- // Make sure that enforcers vector can be used.
- if (! custom_enf.empty())
- enforcers.resize(layers.size());
-
- // Iterate over all triangles.
- for (int facet_idx : custom_enf) {
- std::array<Vec3f, 3> facet;
- std::array<float, 3> z_heights;
-
- // Transform the triangle into worlds coords.
- for (int i=0; i<3; ++i)
- facet[i] = tr2 * tr1 * mesh.its.vertices[mesh.its.indices[facet_idx](i)];
-
- // Sort the three vertices according to z-coordinate.
- std::sort(facet.begin(), facet.end(),
- [](const Vec3f& pt1, const Vec3f&pt2) {
- return pt1.z() < pt2.z();
- });
-
- Polygon triangle;
- for (int i=0; i<3; ++i) {
- z_heights[i] = facet[i].z();
- triangle.append(Point::new_scale(facet[i].x(), facet[i].y()));
- triangle.translate(object.center_offset());
- }
-
- // Find lowest slice not below the triangle.
- auto it = std::lower_bound(layers.begin(), layers.end(), z_heights[0],
- [](const Layer* l1, float z) {
- return l1->slice_z < z;
- });
-
-
- // Calculate how to move points on triangle sides per unit z increment.
- Point ta(triangle.points[1] - triangle.points[0]);
- Point tb(triangle.points[2] - triangle.points[0]);
-
- ta *= 1./(z_heights[1] - z_heights[0]);
- tb *= 1./(z_heights[2] - z_heights[0]);
-
- Points proj;
- proj.emplace_back(triangle.points[0]);
-
- Point a(proj.back());
- Point b(proj.back());
- float last_z = facet[0].z();
- bool passed_first = false;
- bool stop = false;
-
- // Project a sub-triangle on all slices intersecting the triangle.
- while (it != layers.end()) {
- const float z = (*it)->slice_z;
-
- if (z > z_heights[1] && ! passed_first) {
- a = triangle.points[1];
- ta = triangle.points[2]-triangle.points[1];
- ta *= 1./(z_heights[2] - z_heights[1]);
- proj.push_back(a);
- passed_first = true;
- }
- a += ta * (z-last_z);
-
- if (z > z_heights[2] || it+1 == layers.end()) {
- b = triangle.points[2];
- proj.push_back(b);
- stop = true;
- }
- else {
- b += tb * (z-last_z);
- proj.push_back(a+ta);
- proj.push_back(b+tb);
- }
-
- if (it != layers.begin())
- enforcers[it-layers.begin()-1].emplace_back(proj);
-
- if (stop)
- break;
-
- proj.clear();
- proj.push_back(b);
- proj.push_back(a);
-
- ++it;
- last_z = z;
- }
- }
-
- ///////////////////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////
-
+ // Append custom supports.
+ object.project_and_append_custom_enforcers(enforcers);
+ object.project_and_append_custom_blockers(blockers);
// Output layers, sorted by top Z.
MyLayersPtr contact_out;