Slicing a 3D object to SVG

Uit MakerSpace Leiden
Versie door DirkWillem (overleg | bijdragen) op 3 mrt 2018 om 21:34 (Example of a CSG object)
Ga naar: navigatie, zoeken

One can use OpenSCAD to slice a 3D STL or an object made in OpenSCAD into SVG usable with the Lasersaur.

Or in other words, turning Sphere-on-box-example.png into Sphere-on-box-as-slices-Flat.png.

Needed: http://www.openscad.org/ - OpenScad (free).

The typical workflow is

  1. create an OpenSCAD object; or import an STL of an object into OpenScad.
  2. Add the Slicing code below.
  3. Adjust the sizes
  4. Render the object
  5. Save the resulting SVG
  6. Open this in Inktscape to check and perhaps make a bit more efficient by moving things around/nesting things.
  7. Export/upload the SVG from Inktscape to the Lasersaur.

Example of a CSG object

Below is an example of a hollow sphere on top of a hollow cube (thing() in below code) which is sliced; and each slice is then laid out flat.

 module thing() {
   difference() {
       union() {
           translate([-5,-5,0]) 
               cube([10,10,10]);
           translate([0,0,12])
               sphere(r=10);
           };
       union() {
           translate([-5,-5,0]) 
               translate([1,1,1]) cube([8,8,8]);
           translate([0,0,12])
               sphere(r=9);
           };
       };
 }
 
 z_min = 0;
 z_max = 23;
 slice = 1;
 n = 5; // floor(sqrt((z_max - z_min)/slice+10));
 for(z = [-z_max:slice:z_min]) { 
   i = (z + z_max) / slice;
   x = 40 * (i % n);
   y = 40 * floor(i / n);
   translate([x,y,0]) {
       projection(cut=true) 
           translate([0,0,z]) thing();
   };
 };

Example with an STL

An example of an STL that is loaded from a file and then sliced. You will have to manually adjust the Z range & slice distance.

 // 30x150x20 bbx
 import("dino.stl", convexity=3); 
 
 z_min = 0;
 z_max = 30;
 x_max = 20
 y_max = 150;
 slice = 0.5;
 
 n = floor(sqrt((z_max - z_min)/slice)+1);
 for(z = [-z_max:slice:z_min]) { 
   i = (z + z_max) / slice;
   x = x_max * (i % n);
   y = Y_max * floor(i / n);
   translate([x,y,0]) {
       projection(cut=true) 
           translate([0,0,z]) thing();
   };
 };