Sunday, July 7, 2013

Taylors-Gregs-Wade Extruder mod Openscad

This a mod of Taylors-Gregs-Wade Extruder from thingiverse.http://www.thingiverse.com/thing:6713
Designed for use with m3 lock nuts and 45mm M3 bolts.
Two 16.6mm diameter M8 Bearings.
One 608 22mm M8 Bearing.
Using normal Wades Gears and a standard nema17 stepper motor.
I have included about 20-30 adjustments from the original.
http://www.openscad.org/
OPENSCAD FILE:--------------------------------------------------------------------------------
// Taylor's Greg's Wade Extruder.
// It is licensed under the Creative Commons - GNU GPL license.
// 2010 by GregFrost, modified by Taylor Alexander (tlalexander) 2012
// Extruder based on prusa git repo.
// Greg's thing: http://www.thingiverse.com/thing:6713

//How do you use this file? Download the zip from https://github.com/prusajr/PrusaMendel
// and then place this file in the "source" directory. Now open with OpenSCAD.
//Slice at 0.2mm or change layer_thickness variable accordingly

//include<configuration.scad>

// Define the hotend_mounting style you want by specifying hotend_mount=style1+style2 etc.
malcolm_hotend_mount=1;
groovemount=2;
peek_reprapsource_mount=4;
arcol_mount=8;
mendel_parts_v6_mount=16;
grrf_peek_mount=32;
wildseyed_mount=64;
ultimaker_mount=128;


//Set the hotend_mount to the sum of the hotends that you want the extruder to support:
//e.g. wade(hotend_mount=groovemount+peek_reprapsource_mount);
m3_diameter=3;
m4_diameter=4;
m8_diameter=8;

wade(hotend_mount=4);


//Place for printing
//translate([78,-10,15.25])
//rotate([0,0,14])
//translate([-3,-3,0])
//rotate([0,-90,0])

//Place for assembly.
//wadeidler();

//===================================================
// Parameters defining the wade body:

mirrorpart=1; //set 1 to mirror the whole part (0 otherwise). This is for the Ultimaker.

idler_trap_holes_on_side=1; //set to 1 to put nut trap access holes on the side rather than the "top". useful when mounting the part upside-down, such as on the Ultimaker. set to 0 otherwise

//these are for m4 nuts
idler_screw_diameter=3.0;
idler_nut_flat_width=5.6;
idler_nut_thickness=4.2;


wade_block_height=58;
wade_block_width=22;
wade_block_depth=26;

block_bevel_r=6;

base_thickness=8;
base_length=70;
base_leadout=25;

nema17_hole_spacing=31; //31 on Ultimaker. was something else before (on greg's), so check your stepper if you don't have an Ultimaker
nema17_width=1.7*25.4;
nema17_support_d=nema17_width-nema17_hole_spacing;

screw_head_recess_diameter=7.2;
screw_head_recess_depth=3;

motor_spacing_extra=10.625; //moves the motor back extra distance. used with the large Ultimaker Gear

ultimaker_gear_separation=49.625;
stock_wades_separation=7.4444+32.0111+0.25;
gear_separation=stock_wades_separation;

motor_mount_rotation=63; //63 fits perfectly on Taylors Ultimaker mount. 45 is normal for gregs

motor_mount_translation=[motor_spacing_extra+40.5,34,0];
motor_mount_thickness=12;

m8_clearance_hole=8.5; //*ahem* this isn't actually for an M8 bolt if you're, say, using a MK6 drive gear. but I didn't feel like renaming everything
hole_for_608=17.3; //actually hole for whatever bearings you are using for the hob. 17.6 is for 606 bearings
608_thickness=6; //this is, again, actually the thickness for the bearings you're using for the hob. so the MK6 setup with 606 bearings needs 6 here

608_diameter=22; //keep this 22 if you are using a 608 for the idler

filament_feed_hole_additional_offset=0; //if using a MK6 Drive Gear, make this 2.4. Otherwise, Zero.

block_top_right=[wade_block_width,wade_block_height];

layer_thickness=0.2; //set this to the layer height you're going to slice it. this makes sure the supports work.

layer_height=layer_thickness; //this just fixes a big in greg's code. leave it alone.

filament_feed_hole_d=4;
filament_diameter=3;
filament_feed_hole_offset=filament_diameter+0.5+filament_feed_hole_additional_offset;//added additional offset for MK6 drive gear



function motor_hole(hole)=[
motor_mount_translation[0],
motor_mount_translation[1]]+
rotated(45+motor_mount_rotation+hole*90)*nema17_hole_spacing/sqrt(2);

// Parameters defining the idler.

filament_pinch=[
motor_mount_translation[0]-gear_separation-filament_feed_hole_offset-filament_diameter/2,
motor_mount_translation[1],
wade_block_depth/2];
idler_axis=filament_pinch-[608_diameter/2,0,0];
idler_fulcrum_offset=608_diameter/2+3.5+m3_diameter/2;
idler_fulcrum=idler_axis-[0,idler_fulcrum_offset,0];
idler_corners_radius=4;
idler_height=11.5;
idler_608_diameter=608_diameter+2;
idler_608_height=9;
idler_mounting_hole_across=8;
idler_mounting_hole_up=14;
idler_short_side=wade_block_depth-2;
idler_hinge_r=m3_diameter/2+2.15;
idler_hinge_width=6.5;
idler_end_length=(idler_height-2)+8;
idler_mounting_hole_diameter=m3_diameter+0.25;
idler_mounting_hole_elongation=3;
idler_long_top=idler_mounting_hole_up+idler_mounting_hole_diameter/2+idler_mounting_hole_elongation+2.5;
idler_long_bottom=idler_fulcrum_offset;
idler_long_side=idler_long_top+idler_long_bottom;
idler_nut_trap_depth=7.2;// front to back location of nut trap holes. typically this does not need to be changed






module arc(h,w,r,a)
intersection(){linear_extrude(height = h, center = true)
polygon([[0,0],[-r*sin(a),r],[r*sin(a),r]]);
difference(){
cylinder(h,r,r,center=true);
cylinder(h,r-w,r-w,center=true);
}
}






module wade (hotend_mount=0)
{

mirror([ 0, mirrorpart, 0 ])
{

difference ()
{
union()
{

translate([57,14,6])arc(12,10,49,26);


// The wade block.
translate([0,0,0])cube([wade_block_width,wade_block_height,wade_block_depth]);

// Filler between wade block and motor mount.
translate([10,motor_mount_translation[1]-hole_for_608/2,0])
cube([wade_block_width-8+ motor_spacing_extra*1.1,
wade_block_height-motor_mount_translation[1]+hole_for_608/2,
motor_mount_thickness]);

// Connect block to top of motor mount.
linear_extrude(height=motor_mount_thickness)
barbell(block_top_right-[0,5],motor_hole(0),5,nema17_support_d/2,100,60);

//Connect motor mount to base.
linear_extrude(height=motor_mount_thickness)
barbell([base_length-base_leadout,
base_thickness/2],motor_hole(2),base_thickness/2,
nema17_support_d/2,100,60);

// Round the ends of the base
translate([base_length-base_leadout,base_thickness/2,0])
cylinder(r=base_thickness/2,h=wade_block_depth,$fn=20);

translate([-base_leadout,base_thickness/2,0])
cylinder(r=base_thickness/2,h=wade_block_depth,$fn=20);

//Provide the bevel betweeen the base and the wade block.
render()
difference()
{
translate([-block_bevel_r,0,0])
cube([block_bevel_r*2+wade_block_width,
base_thickness+block_bevel_r,wade_block_depth]);
translate([-block_bevel_r,block_bevel_r+base_thickness])
cylinder(r=block_bevel_r,h=wade_block_depth,$fn=60);
translate([wade_block_width+block_bevel_r,
block_bevel_r+base_thickness])
cylinder(r=block_bevel_r,h=wade_block_depth,$fn=60);
}

// The idler hinge.
translate([2,3,0])
translate(idler_fulcrum)
{
translate([idler_hinge_r,0,0])
cube([idler_hinge_r*2,idler_hinge_r*2,idler_short_side-2*idler_hinge_width-0.5],
center=true);
rotate(-30)
{
cylinder(r=idler_hinge_r,
h=idler_short_side-2*idler_hinge_width-0.5,
center=true,$fn=60);
translate([idler_hinge_r,0,0])
cube([idler_hinge_r*2,idler_hinge_r*2,
idler_short_side-2*idler_hinge_width-0.5],
center=true);
}
}

// The idler hinge support.
translate([0,3,0])
translate(idler_fulcrum)
{
rotate(-15)
translate([-(idler_hinge_r+3),-idler_hinge_r-2,-wade_block_depth/2])
cube([idler_hinge_r+3,
idler_hinge_r*2+4,
wade_block_depth/2-
idler_short_side/2+
idler_hinge_width+0.25+
layer_thickness]);
rotate(-15)
translate([-(idler_hinge_r+3),-idler_hinge_r-2,
-idler_short_side/2+idler_hinge_width+0.25])
cube([idler_hinge_r+3+15,
idler_hinge_r*2+4,
layer_thickness]);
}

//The base.
translate([-base_leadout,0,0])
cube([base_length,base_thickness,wade_block_depth]);

motor_mount ();
}





block_holes();
motor_mount_holes ();




translate([3,34,0])cylinder(60,8,8,center=true);

translate([-4,38,-2])cube([8,24,30]);
translate([-7,28,-2])rotate([0,0,-45])cube([10,10,10]);
translate([-7,28,18.5])rotate([0,0,-45])cube([10,10,10]);
translate([-6,24,-2]){

cube([13,18,30]);
}
translate([motor_mount_translation[0]-gear_separation-filament_feed_hole_offset,
0,wade_block_depth/2])
rotate([-90,0,0])
{
if (in_mask (hotend_mount,malcolm_hotend_mount))
malcolm_hotend_holes ();
if (in_mask (hotend_mount,groovemount))
groovemount_holes ();
if (in_mask (hotend_mount,peek_reprapsource_mount))
peek_reprapsource_holes ();
if (in_mask (hotend_mount,arcol_mount))
arcol_mount_holes ();
if (in_mask (hotend_mount,mendel_parts_v6_mount))
mendel_parts_v6_hotend ();
if (in_mask(hotend_mount,grrf_peek_mount))
grrf_peek_mount_holes();
if (in_mask(hotend_mount,wildseyed_mount))
wildseyed_mount_holes();
if (in_mask(hotend_mount,ultimaker_mount))
ultimaker_mount_holes();

}


translate([57,14,10])arc(8,5,46.35,18);
translate([57,14,6])arc(16,3,45.35,18);
translate([70,55,6])rotate([0,90,0])cylinder(8,1.5,1.5);

}

}
}

function in_mask(mask,value)=(mask%(value*2))>(value-1);

module block_holes()
{
//Round off the top of the block.
translate([0,wade_block_height-block_bevel_r,-1])
render()
difference()
{
translate([-1,0,0])
cube([block_bevel_r+1,block_bevel_r+1,wade_block_depth+2]);
translate([block_bevel_r,0,0])
cylinder(r=block_bevel_r,h=wade_block_depth+2,$fn=40);
}

// Round the top front corner.
translate ([-base_leadout-base_thickness/2,-1,wade_block_depth-block_bevel_r])
render()
difference()
{
translate([-1,0,0])
cube([block_bevel_r+1,base_thickness+2,block_bevel_r+1]);
rotate([-90,0,0])
translate([block_bevel_r,0,-1])
cylinder(r=block_bevel_r,h=base_thickness+4);
}

// Round the top back corner.
translate ([base_length-base_leadout+base_thickness/2-block_bevel_r,
-1,wade_block_depth-block_bevel_r])
render()
difference()
{
translate([0,0,0])
cube([block_bevel_r+1,base_thickness+2,block_bevel_r+1]);
rotate([-90,0,0])
translate([0,0,-1])
cylinder(r=block_bevel_r,h=base_thickness+4);
}

// Round the bottom front corner.
translate ([-base_leadout-base_thickness/2,-1,-2])
render()
difference()
{
translate([-1,0,-1])
cube([block_bevel_r+1,base_thickness+2,block_bevel_r+1]);
rotate([-90,0,0])
translate([block_bevel_r,-block_bevel_r,-1])
cylinder(r=block_bevel_r,h=base_thickness+4);
}

// Idler fulcrum hole.
translate(idler_fulcrum+[2,3,0.4])
cylinder(r=m3_diameter/2,h=idler_short_side-2*idler_hinge_width-0.5,center=true,$fn=16);

translate(idler_fulcrum+[2,3,idler_short_side/2-idler_hinge_width-1])
cylinder(r=m3_nut_diameter/2+0.25,h=1,$fn=40);

//Rounded cutout for idler hinge.
render()
translate(idler_fulcrum)
difference()
{
cylinder(r=idler_hinge_r+0.5,h=idler_short_side+2.5,center=true,$fn=60);
cylinder(r=idler_hinge_r+1,h=idler_short_side-2*idler_hinge_width-0.5,center=true);
}

translate(motor_mount_translation)
{
translate([-gear_separation,0,0])
{
% rotate([0,180,0])
translate([0,0,1])
import_stl("wade-large.stl");

// Open the top to remove overhangs and to provide access to the hobbing.
//translate([-wade_block_width+2,0,9.5])
//cube([wade_block_width,
// wade_block_height-motor_mount_translation[1]+1,
// wade_block_depth]);

translate([0,0,-1])
b608(h=608_thickness+1);

translate([0,0,wade_block_depth-608_thickness])
b608(h=608_thickness+1);

translate([-13,0,9.5])
b608(h=wade_block_depth);

translate([0,0,608_thickness+layer_height])
cylinder(r=m8_clearance_hole/2,h=wade_block_depth-(8+layer_height)+2);

// Filament feed.
translate([-filament_feed_hole_offset,0,wade_block_depth/2])
rotate([90,0,0])
rotate(360/16)
cylinder(r=filament_feed_hole_d/2,h=wade_block_depth*3,center=true,$fn=8);

// Mounting holes on the base.
for (mount=[0:1])
{
translate([-filament_feed_hole_offset+25*((mount<1)?1:-1),
-motor_mount_translation[1]-1,wade_block_depth/2])
rotate([-90,0,0])
rotate(360/16)
cylinder(r=m4_diameter/2,h=base_thickness+2,$fn=8);

translate([-filament_feed_hole_offset+25*((mount<1)?1:-1),
-motor_mount_translation[1]+base_thickness/2,
wade_block_depth/2])
rotate([-90,0,0])
cylinder(r=m4_nut_diameter/2,h=base_thickness,$fn=6);
}

}
% translate([0,0,-8])
import_stl("wade-small.stl");
}

// Idler mounting holes and nut traps.
for (idle=[-1,1])
{
translate([-8,
idler_mounting_hole_up+motor_mount_translation[1]+5,
wade_block_depth/2+idler_mounting_hole_across*idle])
rotate([0,90,0])
{
rotate([0,0,(90*idle*idler_trap_holes_on_side)])
{
rotate([0,0,30])
{
translate([0,0,-1])
cylinder(r=(idler_screw_diameter/cos(30))/2,h=wade_block_depth+6,$fn=6);
translate([0,0,wade_block_width-idler_nut_trap_depth])
cylinder(r=(idler_nut_flat_width/cos(30))/2,h=idler_nut_thickness,$fn=6);
}
translate([0,10/2,(wade_block_width-idler_nut_trap_depth+idler_nut_thickness/2)])
cube([idler_nut_flat_width,10,idler_nut_thickness],center=true);
}

}
}
}

module motor_mount()
{
linear_extrude(height=motor_mount_thickness)
{
barbell (motor_hole(0),motor_hole(1),nema17_support_d/2,
nema17_support_d/2,20,160);
barbell (motor_hole(1),motor_hole(2),nema17_support_d/2,
nema17_support_d/2,20,160);
}
}

module motor_mount_holes()
{
radius=4/2;
slot_left=1;
slot_right=2;

{

hole=2;
translate([0,0,-layer_height])
{
translate([motor_hole(hole)[0]-slot_left,motor_hole(hole)[1],0])
cylinder(h=motor_mount_thickness+1,r=radius,$fn=16);



}


}
}

module wadeidler()
{
difference()
{
union()
{
//The idler block.
translate(idler_axis+[-idler_height/2+2,+idler_long_side/2-idler_long_bottom,0])
cube([idler_height,idler_long_side,idler_short_side],center=true);

// The fulcrum Hinge
translate([2,0,0])
translate(idler_fulcrum)
rotate([0,0,-30])
{
cylinder(h=idler_short_side,r=idler_hinge_r,center=true,$fn=60);
translate([-idler_end_length/2,0,0])
cube([idler_end_length,idler_hinge_r*2,idler_short_side],center=true);
}
}

//Back of idler.
translate(idler_axis+[-idler_height/2+2-idler_height,
idler_long_side/2-idler_long_bottom-10,0])
cube([idler_height,idler_long_side,idler_short_side],center=true);

//Slot for idler fulcrum mount.
translate(idler_fulcrum)
{
cylinder(h=idler_short_side-2*idler_hinge_width,
r=idler_hinge_r+2.5,center=true,$fn=60);
rotate(-30)
translate([0,-idler_hinge_r-0.5,0])
cube([idler_hinge_r*2+1,idler_hinge_r*2+1,
idler_short_side-2*idler_hinge_width],center=true);
}

//Bearing cutout.
translate([-1.5,-2,0])
translate(idler_axis)
{
difference()
{
cylinder(h=idler_608_height,r=idler_608_diameter/2,
center=true,$fn=60);
for (i=[0,1])
rotate([180*i,0,0])
translate([0,0,6.9/2])
cylinder(r1=12/2,r2=16/2,h=2);
}
cylinder(h=idler_short_side+2,r=m8_diameter/2-0.25/*Tight*/,
center=true,$fn=20);
}

//Fulcrum hole.
translate([2,0,0])
translate(idler_fulcrum)
rotate(360/12)
cylinder(h=idler_short_side+2,r=m3_diameter/2-0.1,center=true,$fn=8);

//Nut trap for fulcrum screw.
translate(idler_fulcrum+[0,0,idler_short_side/2-idler_hinge_width-1])
rotate(360/16)
cylinder(h=3,r=m3_nut_diameter/2,$fn=6);

for(idler_screw_hole=[-1,1])
translate(idler_axis+[2-idler_height,0,0])
{
//Screw Holes.
translate([-1,idler_mounting_hole_up,
idler_screw_hole*idler_mounting_hole_across])
rotate([0,90,0])
{
cylinder(r=idler_mounting_hole_diameter/2,h=idler_height+2,$fn=16);
translate([0,idler_mounting_hole_elongation,0])
cylinder(r=idler_mounting_hole_diameter/2,h=idler_height+2,$fn=16);
translate([-idler_mounting_hole_diameter/2,0,0])
cube([idler_mounting_hole_diameter,idler_mounting_hole_elongation,
idler_height+2]);
}

// Rounded corners.
render()
translate([idler_height/2,idler_long_top,
idler_screw_hole*(idler_short_side/2)])
difference()
{
translate([0,-idler_corners_radius/2+0.5,-idler_screw_hole*(idler_corners_radius/2-0.5)])
cube([idler_height+2,idler_corners_radius+1,idler_corners_radius+1],
center=true);
rotate([0,90,0])
translate([idler_screw_hole*idler_corners_radius,-idler_corners_radius,0])
cylinder(h=idler_height+4,r=idler_corners_radius,center=true,$fn=40);
}
}
}
}

module b608(h=8)
{
translate([0,0,h/2]) cylinder(r=hole_for_608/2,h=h,center=true,$fn=60);
}

module barbell (x1,x2,r1,r2,r3,r4)
{
x3=triangulate (x1,x2,r1+r3,r2+r3);
x4=triangulate (x2,x1,r2+r4,r1+r4);
render()
difference ()
{
union()
{
translate(x1)
circle (r=r1);
translate(x2)
circle(r=r2);
polygon (points=[x1,x3,x2,x4]);
}

translate(x3)
circle(r=r3,$fa=5);
translate(x4)
circle(r=r4,$fa=5);
}
}

function triangulate (point1, point2, length1, length2) =
point1 +
length1*rotated(
atan2(point2[1]-point1[1],point2[0]-point1[0])+
angle(distance(point1,point2),length1,length2));

function distance(point1,point2)=
sqrt((point1[0]-point2[0])*(point1[0]-point2[0])+
(point1[1]-point2[1])*(point1[1]-point2[1]));

function angle(a,b,c) = acos((a*a+b*b-c*c)/(2*a*b));

function rotated(a)=[cos(a),sin(a),0];

//========================================================
// Modules for defining holes for hotend mounts:
// These assume the extruder is verical with the bottom filament exit hole at [0,0,0].

//malcolm_hotend_holes ();
module malcolm_hotend_holes ()
{
extruder_recess_d=18;
extruder_recess_h=10;

// Recess in base
translate([0,0,-1])
cylinder(r=extruder_recess_d/2,h=extruder_recess_h+1);
}

//groovemount_holes ();
module groovemount_holes ()
{
extruder_recess_d=16;
extruder_recess_h=5.5;

// Recess in base
translate([0,0,-1])
cylinder(r=extruder_recess_d/2,h=extruder_recess_h+1);
}

//peek_reprapsource_holes ();
module peek_reprapsource_holes ()
{
extruder_recess_d=18.0;
extruder_recess_h=16;

// Recess in base
translate([0,0,-1])
cylinder(r=extruder_recess_d/2,h=extruder_recess_h+1);

// Mounting holes to affix the extruder into the recess.
translate([-6,0,min(extruder_recess_h/2, base_thickness)])
rotate([-90,0,0])
cylinder(r=m4_diameter/2-0.5/* tight */,h=wade_block_depth+2,center=true);

translate([6,0,min(extruder_recess_h/2, base_thickness)])
rotate([-90,0,0])
cylinder(r=m4_diameter/2-0.5/* tight */,h=wade_block_depth+2,center=true);

}

//arcol_mount_holes();
module arcol_mount_holes()
{
hole_axis_rotation=42.5;
hole_separation=30;
hole_slot_height=4;
for(mount=[-1,1])
translate([hole_separation/2*mount,-7,0])
{
translate([0,0,-1])
cylinder(r=m4_diameter/2,h=base_thickness+2,$fn=8);

translate([0,0,base_thickness/2])
//rotate(hole_axis_rotation)
{
cylinder(r=m4_nut_diameter/2,h=base_thickness/2+hole_slot_height,$fn=6);
translate([0,-m4_nut_diameter,hole_slot_height/2+base_thickness/2])
cube([m4_nut_diameter,m4_nut_diameter*2,hole_slot_height],
center=true);
}
}
}

//mendel_parts_v6_hotend ();
module mendel_parts_v6_hotend ()
{
extruder_recess_d=13.4;
extruder_recess_h=10;
hole_axis_rotation=42.5;
hole_separation=30;
hole_slot_height=5;

// Recess in base
translate([0,0,-1])
cylinder(r=extruder_recess_d/2,h=extruder_recess_h+1);

for(mount=[-1,1])
rotate([0,0,hole_axis_rotation+90+90*mount])
translate([hole_separation/2,0,0])
{
translate([0,0,-1])
cylinder(r=m4_diameter/2,h=base_thickness+2,$fn=8);

translate([0,0,base_thickness/2])
rotate(-hole_axis_rotation+180)
{
// rotate(30)
cylinder(r=m4_nut_diameter/2,h=base_thickness/2+hole_slot_height,$fn=6);
translate([0,-m4_nut_diameter,hole_slot_height/2+base_thickness/2])
cube([m4_nut_diameter,m4_nut_diameter*2,hole_slot_height],
center=true);
}
}
}

//grrf_peek_mount_holes();
module grrf_peek_mount_holes()
{
extruder_recess_d=16.5;
extruder_recess_h=10;

// Recess in base
translate([0,0,-1])
cylinder(r=extruder_recess_d/2,h=extruder_recess_h+1);

for (hole=[-1,1])
rotate(90,[1,0,0])
translate([hole*(extruder_recess_d/2-1.5),3+1.5,-wade_block_depth/2-1])
cylinder(r=1.5,h=wade_block_depth+2,$fn=10);
}

//wildseyed_mount_holes();
module wildseyed_mount_holes()
{
extruder_recess_d=13.4;
extruder_recess_h=10;

// Recess in base
translate([0,0,-1])
cylinder(r=extruder_recess_d/2,h=extruder_recess_h+1);

for (hole=[-1,1])
rotate(90,[1,0,0])
translate([hole*(extruder_recess_d/2-1.5),3+1.5,-wade_block_depth/2-1])
cylinder(r=1.5,h=wade_block_depth+2,$fn=10);
}

//ultimaker_mount_holes();
module ultimaker_mount_holes()
{
extruder_recess_d=11;
extruder_recess_h=11;

// Recess in base
translate([0,0,-1])
cylinder(r=extruder_recess_d/2,h=extruder_recess_h+1);

//for (hole=[-1,1])
//rotate(90,[1,0,0])
//translate([hole*(extruder_recess_d/2-1.5),3+1.5,-wade_block_depth/2-1])
//cylinder(r=1.5,h=wade_block_depth+2,$fn=10);

}

No comments:

Post a Comment