sf_solidifyT.scad
1 /** 2 * sf_solidifyT.scad 3 * 4 * @copyright Justin Lin, 2021 5 * @license https://opensource.org/licenses/lgpl-3.0.html 6 * 7 * @see https://openhome.cc/eGossip/OpenSCAD/lib3x-sf_solidifyT.html 8 * 9 **/ 10 11 module sf_solidifyT(points1, points2, triangles, convexity = 1) { 12 // triangles : counter-clockwise 13 leng = len(points1); 14 assert(leng == len(points2), "The length of points1 must equal to the length of points2"); 15 16 tris = [for(tri = triangles) [tri[2], tri[1], tri[0]]]; 17 18 function de_pairs(tri_edges) = 19 let( 20 leng = len(tri_edges), 21 edges = [tri_edges[0], tri_edges[1], tri_edges[2]] 22 ) 23 _de_pairs(tri_edges, leng, edges); 24 25 function _de_pairs(tri_edges, leng, edges, i = 3) = 26 i == leng ? edges : 27 let( 28 edge = tri_edges[i], 29 pair = [edge[1], edge[0]], 30 indices = search([pair], edges, , num_returns_per_match=0)[0] 31 32 ) 33 _de_pairs( 34 tri_edges, 35 leng, 36 indices == [] ? 37 [each edges, edge] : 38 [for(j = [0:len(edges) - 1]) if(search(j, indices) == []) edges[j]], 39 i + 1 40 ); 41 42 tri_edges = [ 43 for(tri = tris) 44 each [ 45 [tri[0], tri[1]], 46 [tri[1], tri[2]], 47 [tri[2], tri[0]] 48 ] 49 ]; 50 51 side_faces = [ 52 for(edge = de_pairs(tri_edges)) 53 each [ 54 [edge[1] + leng, edge[1], edge[0]], 55 [edge[0] + leng, edge[1] + leng, edge[0]] 56 ] 57 ]; 58 59 off = [leng, leng, leng]; 60 polyhedron( 61 points = concat(points1, points2), 62 faces = concat( 63 tris, 64 [for(tri = triangles) tri + off], 65 side_faces 66 ), 67 convexity = convexity 68 ); 69 }