Slicing a 3D object to SVG: verschil tussen versies
(→Example with an STL) |
|||
(18 tussenliggende versies door 5 gebruikers niet weergegeven) | |||
Regel 1: | Regel 1: | ||
+ | [[Category:Tutorials]][[Category:3D printing tools]] | ||
One can use OpenSCAD to slice a 3D STL or an object made in OpenSCAD into SVG usable with the Lasersaur. | 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 | ||
+ | [[Bestand:Sphere-on-box-example.png|220px]] into [[Bestand:Sphere-on-box-as-slices-Flat.png]]. | ||
+ | |||
+ | Needed: http://www.openscad.org/ - OpenScad (free). | ||
+ | |||
+ | The typical workflow is | ||
+ | |||
+ | # Create an OpenSCAD object, or import an STL of an object into OpenScad | ||
+ | # Add the slicing code below | ||
+ | # Adjust the parameters | ||
+ | # Render the object | ||
+ | # Save the resulting object as SVG | ||
+ | # Open the SVG in Inkscape to check and perhaps make it a bit more efficient by moving things around and/or nesting things | ||
+ | # Export/upload the SVG from Inkscape to the Lasersaur | ||
== Example of a CSG object == | == 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. | |
− | + | <pre> | |
− | + | $fn = 30; // setting the resolution to high values can seriously increase rendering time! | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | module thing() // a random object, in this case a hollow sphere on top of a hollow cube. | |
− | + | { | |
− | + | difference() | |
− | + | { | |
− | + | union() | |
− | + | { | |
− | x = | + | translate([0, 0, 5 ]) cube(10,true); |
− | y = | + | translate([0, 0, 12]) sphere(d=20); |
− | translate([x,y,0]) | + | } |
− | projection(cut=true) | + | union() |
− | translate([ | + | { |
− | + | translate([0, 0, 5 ]) cube(8,true); | |
− | + | translate([0, 0, 12]) sphere(d=18); | |
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // change these (measurements all in mm) ------------------------------------------------------------- | ||
+ | x_dist = 21; // desired horizontal distance between centre lines of projected cuts | ||
+ | y_dist = 20; // desired vertical distance between centre lines of projected cuts | ||
+ | |||
+ | z_min = 0; // smallest z-coordinate object | ||
+ | z_max = 23; // biggest z-coordinate object (add 1 to be safe) | ||
+ | slice = 1; // desired distance between cuts | ||
+ | |||
+ | explode = false; // not in mm. false does nothing, x_dist and y_dist don't matter if this is true | ||
+ | // stop changing here -------------------------------------------------------------------------------- | ||
+ | |||
+ | // some useful numbers | ||
+ | slicecount = (z_max - z_min)/slice; // this be the number of slices you get | ||
+ | rowlength = floor(sqrt(slicecount)) + 1; // make rows and columns of projected cuts of equal length | ||
+ | |||
+ | // business end | ||
+ | for(s = [0:slicecount]) | ||
+ | { | ||
+ | x = x_dist * (s % rowlength); // calculate coordinates per cut | ||
+ | y = y_dist * floor(s / rowlength); | ||
+ | z = z_min + s * slice; // calculate height at which the cut should be made | ||
+ | |||
+ | translate(explode ? [-x, -y, z * 2] : [0, 0, 0]) // translation if explode==true | ||
+ | projection(cut = true) // actual cut | ||
+ | translate([x, y, -z]) // -z gets the correct layer, x and y do the grid move | ||
+ | thing(); | ||
+ | } | ||
+ | </pre> | ||
== Example with an STL == | == Example with an STL == | ||
Regel 42: | Regel 76: | ||
// 30x150x20 bbx | // 30x150x20 bbx | ||
import("dino.stl", convexity=3); | import("dino.stl", convexity=3); | ||
− | + | ||
z_min = 0; | z_min = 0; | ||
z_max = 30; | z_max = 30; | ||
− | x_max = 20 | + | x_max = 20; |
y_max = 150; | y_max = 150; | ||
slice = 0.5; | slice = 0.5; | ||
− | + | ||
n = floor(sqrt((z_max - z_min)/slice)+1); | n = floor(sqrt((z_max - z_min)/slice)+1); | ||
for(z = [-z_max:slice:z_min]) { | for(z = [-z_max:slice:z_min]) { |
Huidige versie van 16 nov 2024 om 23:52
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 into .
Needed: http://www.openscad.org/ - OpenScad (free).
The typical workflow is
- Create an OpenSCAD object, or import an STL of an object into OpenScad
- Add the slicing code below
- Adjust the parameters
- Render the object
- Save the resulting object as SVG
- Open the SVG in Inkscape to check and perhaps make it a bit more efficient by moving things around and/or nesting things
- Export/upload the SVG from Inkscape 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.
$fn = 30; // setting the resolution to high values can seriously increase rendering time! module thing() // a random object, in this case a hollow sphere on top of a hollow cube. { difference() { union() { translate([0, 0, 5 ]) cube(10,true); translate([0, 0, 12]) sphere(d=20); } union() { translate([0, 0, 5 ]) cube(8,true); translate([0, 0, 12]) sphere(d=18); } } } // change these (measurements all in mm) ------------------------------------------------------------- x_dist = 21; // desired horizontal distance between centre lines of projected cuts y_dist = 20; // desired vertical distance between centre lines of projected cuts z_min = 0; // smallest z-coordinate object z_max = 23; // biggest z-coordinate object (add 1 to be safe) slice = 1; // desired distance between cuts explode = false; // not in mm. false does nothing, x_dist and y_dist don't matter if this is true // stop changing here -------------------------------------------------------------------------------- // some useful numbers slicecount = (z_max - z_min)/slice; // this be the number of slices you get rowlength = floor(sqrt(slicecount)) + 1; // make rows and columns of projected cuts of equal length // business end for(s = [0:slicecount]) { x = x_dist * (s % rowlength); // calculate coordinates per cut y = y_dist * floor(s / rowlength); z = z_min + s * slice; // calculate height at which the cut should be made translate(explode ? [-x, -y, z * 2] : [0, 0, 0]) // translation if explode==true projection(cut = true) // actual cut translate([x, y, -z]) // -z gets the correct layer, x and y do the grid move 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(); }; };