/ src / surface / sf_solidifyT.scad
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  }