3D part design with Inkscape and OpenSCAD #74: adding fillet and chamfer to the SVG import modules.

An example of how to add fillet and chamfer capabilities to an SVG layer that was imported into OpenSCAD.

5 min read
By Bob
3D part design with Inkscape and OpenSCAD #74: adding fillet and chamfer to the SVG import modules.

After a small mount of trial and error I was able to add fillet and chamfer capabilities to the SVG import modules. Now I can just check a box and tidy up the edges.

Here is the modified code:


/*[SVG] */ 
Path_to_SVG_File="/home/none3/Desktop/drawing.svg";

/* [SVG_Layer 1] */ 
Layer1_name="layer1";
ShowLayer1 = true;
Difference1=false;
Fillet_Chamfer1=false;
Fillet_Chamfer_Shape1=4;//[4:4:40]
Linear_Extrude_Layer1 = 0.1; //[0.1:0.01:400]
Layer1_twist = 0; //[-360:0.01:360]
Layer1_slices = 1; //[0:1:400]
Layer1_transparency = 1;//[0:.01:1]
Layer1_red = 255;//[0:255]
Layer1_green = 255;//[0:255]
Layer1_blue = 0;//[0:255]
Rotate_Layer1_X = 0; //[-360:.01:360]
Rotate_Layer1_Y = 0; //[-360:.01:360]
Rotate_Layer1_Z = 0; //[-360:.01:360]
Move_Layer1_X = 0; //[-400:0.01:400] 
Move_Layer1_Y = 0; //[-400:0.01:400]
Move_Layer1_Z = 0; //[-400:0.01:400]
Scale_Layer1_X = 1; //[-100:0.01:100]
Scale_Layer1_Y = 1; //[-100:0.01:100]
Scale_Layer1_Z = 1; //[-100:0.01:100]

/*[SVG_Layer 2]*/
Layer2_name="layer2";
ShowLayer2=true;
Difference2=false;
Fillet_Chamfer2=false;
Fillet_Chamfer_Shape2=4;//[4:4:40]
Linear_Extrude_Layer2=0.1;//[0.1:0.01:400]
Layer2_twist=0;//[-360:0.01:360]
Layer2_slices=1;//[0:1:400]
Layer2_transparency = 1;//[0:.01:1]
Layer2_red = 255;//[0:255]
Layer2_green = 255;//[0:255]
Layer2_blue = 0;//[0:255]
Rotate_Layer2_X = 0; //[-360:.01:360]
Rotate_Layer2_Y = 0; //[-360:.01:360]
Rotate_Layer2_Z = 0; //[-360:.01:360]
Move_Layer2_X = 0; //[-400:0.01:400] 
Move_Layer2_Y = 0; //[-400:0.01:400]
Move_Layer2_Z = 0; //[-400:0.01:400]
Scale_Layer2_X = 1; //[-100:0.01:100]
Scale_Layer2_Y = 1; //[-100:0.01:100]
Scale_Layer2_Z = 1; //[-100:0.01:100]

/* [SVG_Layer 3] */ 
Layer3_name="layer3";
ShowLayer3 = true;
Difference3=false;
Fillet_Chamfer3=false;
Fillet_Chamfer_Shape3=4;//[4:4:40]
Linear_Extrude_Layer3 = 0.1; //[0.1:0.01:400]
Layer3_twist = 0; //[-360:0.01:360]
Layer3_slices = 1; //[0:1:400]
Layer3_transparency = 1;//[0:.01:1]
Layer3_red = 255;//[0:255]
Layer3_green = 255;//[0:255]
Layer3_blue = 0;//[0:255]
Rotate_Layer3_X = 0; //[-360:.01:360]
Rotate_Layer3_Y = 0; //[-360:.01:360]
Rotate_Layer3_Z = 0; //[-360:.01:360]
Move_Layer3_X = 0; //[-400:0.01:400] 
Move_Layer3_Y = 0; //[-400:0.01:400]
Move_Layer3_Z = 0; //[-400:0.01:400]
Scale_Layer3_X = 1; //[-100:0.01:100]
Scale_Layer3_Y = 1; //[-100:0.01:100]
Scale_Layer3_Z = 1; //[-100:0.01:100]

/* [SVG_Layer 4] */ 
Layer4_name="layer4";
ShowLayer4 = true;
Difference4=false;
Fillet_Chamfer4=false;
Fillet_Chamfer_Shape4=4;//[4:4:40]
Linear_Extrude_Layer4 = 0.1; //[0.1:0.01:400]
Layer4_twist = 0; //[-360:0.01:360]
Layer4_slices = 1; //[0:1:400]
Layer4_transparency = 1;//[0:.01:1]
Layer4_red = 255;//[0:255]
Layer4_green = 255;//[0:255]
Layer4_blue = 0;//[0:255]
Rotate_Layer4_X = 0; //[360:.01:360]
Rotate_Layer4_Y = 0; //[360:.01:360]
Rotate_Layer4_Z = 0; //[360:.01:360]
Move_Layer4_X = 0; //[-400:0.01:400] 
Move_Layer4_Y = 0; //[-400:0.01:400]
Move_Layer4_Z = 0; //[-400:0.01:400]
Scale_Layer4_X = 1; //[-100:0.01:100]
Scale_Layer4_Y = 1; //[-100:0.01:100]
Scale_Layer4_Z = 1; //[-100:0.01:100]

/* [SVG_Layer 5] */ 
Layer5_name="layer5";
ShowLayer5 = true;
Difference5=false;
Fillet_Chamfer5=false;
Fillet_Chamfer_Shape5=4;//[4:4:40]
Linear_Extrude_Layer5 = 0.1; //[0.1:0.01:400]
Layer5_twist = 0; //[-360:0.01:360]
Layer5_slices = 1; //[0:1:400]
Layer5_transparency = 1;//[0:.01:1]
Layer5_red = 255;//[0:255]
Layer5_green = 255;//[0:255]
Layer5_blue = 0;//[0:255]
Rotate_Layer5_X = 0; //[-360:.01:360]
Rotate_Layer5_Y = 0; //[-360:.01:360]
Rotate_Layer5_Z = 0; //[-360:.01:360]
Move_Layer5_X = 0; //[-400:0.01:400] 
Move_Layer5_Y = 0; //[-400:0.01:400]
Move_Layer5_Z = 0; //[-400:0.01:400]
Scale_Layer5_X = 1; //[-100:0.01:100]
Scale_Layer5_Y = 1; //[-100:0.01:100]
Scale_Layer5_Z = 1; //[-100:0.01:100]

/* [Rotate Extrude SVG] */
ShowExtrudeLayer = false;
Rotate_Extrude_Layer_Name = "";
Rotate_Extrude_Degrees = 0.1; //[0.1:.01:360]
Rotate_Extrude_Facets = 3; //[3:1:400]
Extrude_Layer_transparency = 1;//[0:.01:1]
Extrude_Layer_red = 255;//[0:255]
Extrude_Layer_green = 255;//[0:255]
Extrude_Layer_blue = 0;//[0:255]
RotateX_Extrude_Layer = 0; //[-360:0.01:360]
RotateY_Extrude_Layer = 0; //[-360:0.01:360]
RotateZ_Extrude_Layer = 0; //[-360:0.01:360]
MoveX_ExtrudeLayer = 0; //[-400:0.01:400] 
MoveY_ExtrudeLayer = 0; //[-400:0.01:400]
MoveZ_ExtrudeLayer = 0; //[-400:0.01:400]
ScaleX_Extrude_Layer = 1; //[-100:0.01:100]
ScaleY_Extrude_Layer = 1; //[-100:0.01:100]
ScaleZ_Extrude_Layer = 1; //[-100:0.01:100] 

module Layer1(){
if(ShowLayer1)
color([Layer1_red/255,Layer1_green/255,Layer1_blue/255],Layer1_transparency)
minkowski(convexity=3){
rotate(a=[Rotate_Layer1_X,Rotate_Layer1_Y,Rotate_Layer1_Z])
translate([Move_Layer1_X,Move_Layer1_Y,Move_Layer1_Z])
scale([Scale_Layer1_X,Scale_Layer1_Y,Scale_Layer1_Z])
linear_extrude(height=Linear_Extrude_Layer1,twist=Layer1_twist,slices=Layer1_slices,convexity=3)
import(Path_to_SVG_File,layer=Layer1_name);
if(Fillet_Chamfer1)
sphere(.5,$fn=Fillet_Chamfer_Shape1);
}}

module Layer2(){
if(ShowLayer2)
color([Layer2_red/255,Layer2_green/255,Layer2_blue/255],Layer2_transparency)
minkowski(convexity=3){
rotate(a=[Rotate_Layer2_X,Rotate_Layer2_Y,Rotate_Layer2_Z])
translate([Move_Layer2_X,Move_Layer2_Y,Move_Layer2_Z])
scale([Scale_Layer2_X,Scale_Layer2_Y,Scale_Layer2_Z])
linear_extrude(height = Linear_Extrude_Layer2,twist=Layer2_twist,slices=Layer2_slices,convexity=3)
import(Path_to_SVG_File,layer=Layer2_name);
if(Fillet_Chamfer2)
sphere(.5,$fn=Fillet_Chamfer_Shape2);
}}
 
module Layer3(){
if(ShowLayer3)
color([Layer3_red/255,Layer3_green/255,Layer3_blue/255],Layer3_transparency)
minkowski(convexity=3){
rotate(a=[Rotate_Layer3_X,Rotate_Layer3_Y,Rotate_Layer3_Z])
translate([Move_Layer3_X,Move_Layer3_Y,Move_Layer3_Z])
scale([Scale_Layer3_X,Scale_Layer3_Y,Scale_Layer3_Z])
linear_extrude(height=Linear_Extrude_Layer3,twist=Layer3_twist,slices=Layer3_slices,convexity=3)
import(Path_to_SVG_File,layer=Layer3_name);
if(Fillet_Chamfer3)
sphere(.5,$fn=Fillet_Chamfer_Shape3);
}}

module Layer4(){
if(ShowLayer4)
color([Layer4_red/255,Layer4_green/255,Layer4_blue/255],Layer4_transparency)
minkowski(convexity=3){
rotate(a=[Rotate_Layer4_X,Rotate_Layer4_Y,Rotate_Layer4_Z])
translate([Move_Layer4_X,Move_Layer4_Y,Move_Layer4_Z])
scale([Scale_Layer4_X,Scale_Layer4_Y,Scale_Layer4_Z])
linear_extrude(height = Linear_Extrude_Layer4,twist=Layer4_twist,slices=Layer4_slices,convexity=3)
import(Path_to_SVG_File,layer=Layer4_name);
if(Fillet_Chamfer4)
sphere(.5,$fn=Fillet_Chamfer_Shape4);
}}

module Layer5(){
if(ShowLayer5)
color([Layer5_red/255,Layer5_green/255,Layer5_blue/255],Layer5_transparency)
minkowski(convexity=3){
rotate(a=[Rotate_Layer5_X,Rotate_Layer5_Y,Rotate_Layer5_Z])
translate([Move_Layer5_X,Move_Layer5_Y,Move_Layer5_Z])
scale([Scale_Layer5_X,Scale_Layer5_Y,Scale_Layer5_Z])
linear_extrude(height = Linear_Extrude_Layer5,twist=Layer5_twist,slices=Layer5_slices,convexity=3)
import(Path_to_SVG_File,layer=Layer5_name);
if(Fillet_Chamfer5)
sphere(.5,$fn=Fillet_Chamfer_Shape5);
}} 

module RotateExtrude(){
if(ShowExtrudeLayer)
color([Extrude_Layer_red/255,Extrude_Layer_green/255,Extrude_Layer_blue/255],Extrude_Layer_transparency)
rotate_extrude(angle=Rotate_Extrude_Degrees,convexity=10,$fn=Rotate_Extrude_Facets)
rotate(a = [RotateX_Extrude_Layer,RotateY_Extrude_Layer,RotateZ_Extrude_Layer])
translate([MoveX_ExtrudeLayer,MoveY_ExtrudeLayer,MoveZ_ExtrudeLayer])
scale([ScaleX_Extrude_Layer,ScaleY_Extrude_Layer,ScaleZ_Extrude_Layer])
 import(Path_to_SVG_File,layer=Rotate_Extrude_Layer_Name);
}

module Difference(){
if(Difference5!=true){
difference(){
Layer5();
Layer4();
Layer3();
Layer2();
Layer1();
}}
if(Difference4!=true){
difference(){
Layer4();
Layer1();
Layer2();
Layer3();
//Layer5();
}}
if(Difference3!=true){
difference(){
Layer3();
Layer1();
Layer2();
Layer4();
Layer5();
}}
if(Difference2!=true){
difference(){
Layer2();
Layer1();
Layer3();
Layer4();
Layer5();
}}
if(Difference1!=true){
difference(){
Layer1();
Layer2();
Layer3();
Layer4();
Layer5();
}
}}



Difference();
RotateExtrude();

Here is a before screenshot with square edges:

with square edges

And  after with a fillet applied:

and with a chamfer applied:

Each layer can have it turned off or on and since the minkowski() function adds some size to the objects the scaling can be adjusted to compensate for it:

I made the slider have several steps so the edge can be more customizable but probably isn't needed, I could also add a way to change the size of the sphere used with minkowski but it is also probably not necessary.

Of course there is still some work to be done to make this work where the two objects meet. I have an idea of how to implement it and I will be adding an update in a future post: