Browse Source

Prevent degenerate triangles in pad.

tamasmeszaros 5 years ago
parent
commit
c03a202e20
2 changed files with 44 additions and 25 deletions
  1. 29 19
      sandboxes/slabasebed/slabasebed.cpp
  2. 15 6
      src/libslic3r/SLA/SLABasePool.cpp

+ 29 - 19
sandboxes/slabasebed/slabasebed.cpp

@@ -4,6 +4,7 @@
 
 #include <libslic3r/libslic3r.h>
 #include <libslic3r/TriangleMesh.hpp>
+#include <libslic3r/Tesselate.hpp>
 #include <libslic3r/SLA/SLABasePool.hpp>
 #include <libslic3r/SLA/SLABoilerPlate.hpp>
 #include <libnest2d/tools/benchmark.h>
@@ -14,7 +15,9 @@ const std::string USAGE_STR = {
 
 namespace Slic3r { namespace sla {
 
-Contour3D convert(const Polygons& triangles, coord_t z, bool dir);
+Contour3D create_base_pool(const ExPolygons &ground_layer, 
+                           const PoolConfig& cfg = PoolConfig());
+
 Contour3D walls(const Polygon& floor_plate, const Polygon& ceiling,
                 double floor_z_mm, double ceiling_z_mm,
                 double offset_difference_mm, ThrowOnCancel thr);
@@ -47,31 +50,38 @@ int main(const int argc, const char *argv[]) {
 
     if(ground_slice.empty()) return EXIT_FAILURE;
 
-    ExPolygon bottom_plate = ground_slice.front();
-    ExPolygon top_plate = bottom_plate;
-    sla::offset(top_plate, coord_t(3.0/SCALING_FACTOR));
-    sla::offset(bottom_plate, coord_t(1.0/SCALING_FACTOR));
+//    ExPolygon bottom_plate = ground_slice.front();
+//    ExPolygon top_plate = bottom_plate;
+//    sla::offset(top_plate, coord_t(3.0/SCALING_FACTOR));
+//    sla::offset(bottom_plate, coord_t(1.0/SCALING_FACTOR));
 
     bench.start();
 
-    Polygons top_plate_triangles, bottom_plate_triangles;
-    top_plate.triangulate_p2t(&top_plate_triangles);
-    bottom_plate.triangulate_p2t(&bottom_plate_triangles);
-
-    auto top_plate_mesh = sla::convert(top_plate_triangles, coord_t(3.0/SCALING_FACTOR), false);
-    auto bottom_plate_mesh = sla::convert(bottom_plate_triangles, 0, true);
-
-    mesh.merge(bottom_plate_mesh);
-    mesh.merge(top_plate_mesh);
-
-    sla::Contour3D w = sla::walls(bottom_plate.contour, top_plate.contour, 0, 3, 2.0, [](){});
-
-    mesh.merge(w);
-//    sla::create_base_pool(ground_slice, basepool);
+//    TriangleMesh pool;
+    sla::PoolConfig cfg;
+    cfg.min_wall_height_mm = 0;
+    cfg.edge_radius_mm = 0.2;
+    mesh = sla::create_base_pool(ground_slice, cfg);
+    
+//    mesh.merge(triangulate_expolygon_3d(top_plate, 3.0, false));
+//    mesh.merge(triangulate_expolygon_3d(bottom_plate, 0.0, true));
+//    mesh = sla::walls(bottom_plate.contour, top_plate.contour, 0, 3, 2.0, [](){});
+    
     bench.stop();
 
     cout << "Base pool creation time: " << std::setprecision(10)
          << bench.getElapsedSec() << " seconds." << endl;
+    
+//    auto point = []()
+    for(auto& trind : mesh.indices) {
+        Vec3d p0 = mesh.points[size_t(trind[0])];
+        Vec3d p1 = mesh.points[size_t(trind[1])];
+        Vec3d p2 = mesh.points[size_t(trind[2])];
+        Vec3d p01 = p1 - p0;
+        Vec3d p02 = p2 - p0;
+        auto a = p01.cross(p02).norm() / 2.0;
+        if(std::abs(a) < 1e-6) std::cout << "degenerate triangle" << std::endl;
+    }
 
 //    basepool.write_ascii("out.stl");
 

+ 15 - 6
src/libslic3r/SLA/SLABasePool.cpp

@@ -582,8 +582,8 @@ void base_plate(const TriangleMesh &mesh, ExPolygons &output, float h,
     }
 }
 
-void create_base_pool(const ExPolygons &ground_layer, TriangleMesh& out,
-                      const PoolConfig& cfg)
+Contour3D create_base_pool(const ExPolygons &ground_layer, 
+                           const PoolConfig& cfg = PoolConfig()) 
 {
     // for debugging:
     // Benchmark bench;
@@ -618,7 +618,7 @@ void create_base_pool(const ExPolygons &ground_layer, TriangleMesh& out,
     Contour3D pool;
 
     for(ExPolygon& concaveh : concavehs) {
-        if(concaveh.contour.points.empty()) return;
+        if(concaveh.contour.points.empty()) return pool;
 
         // Get rid of any holes in the concave hull output.
         concaveh.holes.clear();
@@ -683,7 +683,7 @@ void create_base_pool(const ExPolygons &ground_layer, TriangleMesh& out,
 
 
         // Generate the smoothed edge geometry
-        pool.merge(round_edges(ob,
+        if(s_eradius > 0) pool.merge(round_edges(ob,
                                r,
                                phi,
                                0,    // z position of the input plane
@@ -698,7 +698,8 @@ void create_base_pool(const ExPolygons &ground_layer, TriangleMesh& out,
 
         if(wingheight > 0) {
             // Generate the smoothed edge geometry
-            pool.merge(round_edges(middle_base,
+            wh = 0;
+            if(s_eradius) pool.merge(round_edges(middle_base,
                                    r,
                                    phi - 90, // from tangent lines
                                    0,  // z position of the input plane
@@ -722,6 +723,14 @@ void create_base_pool(const ExPolygons &ground_layer, TriangleMesh& out,
             pool.merge(triangulate_expolygon_3d(inner_base, -wingheight));
 
     }
+    
+    return pool;
+}
+
+void create_base_pool(const ExPolygons &ground_layer, TriangleMesh& out,
+                      const PoolConfig& cfg)
+{
+    
 
     // For debugging:
     // bench.stop();
@@ -729,7 +738,7 @@ void create_base_pool(const ExPolygons &ground_layer, TriangleMesh& out,
     // std::fstream fout("pad_debug.obj", std::fstream::out);
     // if(fout.good()) pool.to_obj(fout);
 
-    out.merge(mesh(pool));
+    out.merge(mesh(create_base_pool(ground_layer, cfg)));
 }
 
 }