diff --git a/2Dshapes.scad b/2Dshapes.scad new file mode 100644 index 0000000..2d10577 --- /dev/null +++ b/2Dshapes.scad @@ -0,0 +1,163 @@ +/* + * OpenSCAD 2D Shapes Library (www.openscad.org) + * Copyright (C) 2012 Peter Uithoven + * + * License: LGPL 2.1 or later +*/ + +// 2D Shapes +//ngon(sides, radius, center=false); +//complexRoundSquare(size,rads1=[0,0], rads2=[0,0], rads3=[0,0], rads4=[0,0], center=true) +//roundedSquare(pos=[10,10],r=2) +//ellipsePart(width,height,numQuarters) +//donutSlice(innerSize,outerSize, start_angle, end_angle) +//pieSlice(size, start_angle, end_angle) //size in radius(es) +//ellipse(width, height) { + +// Examples +/*use ; +grid(105,105,true,4) +{ + // ellipse + ellipse(50,75); + + // part of ellipse (a number of quarters) + ellipsePart(50,75,3); + ellipsePart(50,75,2); + ellipsePart(50,75,1); + + // complexRoundSquare examples + complexRoundSquare([75,100],[20,10],[20,10],[20,10],[20,10]); + complexRoundSquare([75,100],[0,0],[0,0],[30,50],[20,10]); + complexRoundSquare([50,50],[10,20],[10,20],[10,20],[10,20],false); + complexRoundSquare([100,100]); + complexRoundSquare([100,100],rads1=[20,20],rads3=[20,20]); + + // pie slice + pieSlice(50,0,10); + pieSlice(50,45,190); + pieSlice([50,20],180,270); + + // donut slice + donutSlice(20,50,0,350); + donutSlice(30,50,190,270); + donutSlice([40,22],[50,30],180,270); + donutSlice([50,20],50,180,270); + donutSlice([20,30],[50,40],0,270); +}*/ +//---------------------- + +// size, top left radius, top right radius, bottom right radius, bottom left radius, center +module complexRoundSquare(size,rads1=[0,0], rads2=[0,0], rads3=[0,0], rads4=[0,0], center=true) +{ + width = size[0]; + height = size[1]; + //%square(size=[width, height],center=true); + x1 = 0-width/2+rads1[0]; + y1 = 0-height/2+rads1[1]; + x2 = width/2-rads2[0]; + y2 = 0-height/2+rads2[1]; + x3 = width/2-rads3[0]; + y3 = height/2-rads3[1]; + x4 = 0-width/2+rads4[0]; + y4 = height/2-rads4[1]; + + scs = 0.1; //straight corner size + + x = (center)? 0: width/2; + y = (center)? 0: height/2; + + translate([x,y,0]) + { + hull() { + // top left + if(rads1[0] > 0 && rads1[1] > 0) + translate([x1,y1]) mirror([1,0]) ellipsePart(rads1[0]*2,rads1[1]*2,1); + else + translate([x1,y1]) square(size=[scs, scs]); + + // top right + if(rads2[0] > 0 && rads2[1] > 0) + translate([x2,y2]) ellipsePart(rads2[0]*2,rads2[1]*2,1); + else + translate([width/2-scs,0-height/2]) square(size=[scs, scs]); + + // bottom right + if(rads3[0] > 0 && rads3[1] > 0) + translate([x3,y3]) mirror([0,1]) ellipsePart(rads3[0]*2,rads3[1]*2,1); + else + translate([width/2-scs,height/2-scs]) square(size=[scs, scs]); + + // bottom left + if(rads4[0] > 0 && rads4[1] > 0) + translate([x4,y4]) rotate([0,0,-180]) ellipsePart(rads4[0]*2,rads4[1]*2,1); + else + #translate([x4,height/2-scs]) square(size=[scs, scs]); + } + } +} +module roundedSquare(pos=[10,10],r=2) { + minkowski() { + square([pos[0]-r*2,pos[1]-r*2],center=true); + circle(r=r); + } +} +// round shapes +// The orientation might change with the implementation of circle... +module ngon(sides, radius, center=false){ + rotate([0, 0, 360/sides/2]) circle(r=radius, $fn=sides, center=center); +} +module ellipsePart(width,height,numQuarters) +{ + o = 1; //slight overlap to fix a bug + difference() + { + ellipse(width,height); + if(numQuarters <= 3) + translate([0-width/2-o,0-height/2-o,0]) square([width/2+o,height/2+o]); + if(numQuarters <= 2) + translate([0-width/2-o,-o,0]) square([width/2+o,height/2+o*2]); + if(numQuarters < 2) + translate([-o,0,0]) square([width/2+o*2,height/2+o]); + } +} +module donutSlice(innerSize,outerSize, start_angle, end_angle) +{ + difference() + { + pieSlice(outerSize, start_angle, end_angle); + if(len(innerSize) > 1) ellipse(innerSize[0]*2,innerSize[1]*2); + else circle(innerSize); + } +} +module pieSlice(size, start_angle, end_angle) //size in radius(es) +{ + rx = ((len(size) > 1)? size[0] : size); + ry = ((len(size) > 1)? size[1] : size); + trx = rx* sqrt(2) + 1; + try = ry* sqrt(2) + 1; + a0 = (4 * start_angle + 0 * end_angle) / 4; + a1 = (3 * start_angle + 1 * end_angle) / 4; + a2 = (2 * start_angle + 2 * end_angle) / 4; + a3 = (1 * start_angle + 3 * end_angle) / 4; + a4 = (0 * start_angle + 4 * end_angle) / 4; + if(end_angle > start_angle) + intersection() { + if(len(size) > 1) + ellipse(rx*2,ry*2); + else + circle(rx); + polygon([ + [0,0], + [trx * cos(a0), try * sin(a0)], + [trx * cos(a1), try * sin(a1)], + [trx * cos(a2), try * sin(a2)], + [trx * cos(a3), try * sin(a3)], + [trx * cos(a4), try * sin(a4)], + [0,0] + ]); + } +} +module ellipse(width, height) { + scale([1, height/width, 1]) circle(r=width/2); +} \ No newline at end of file diff --git a/README.markdown b/README.markdown index 09aefb5..97dde74 100644 --- a/README.markdown +++ b/README.markdown @@ -10,13 +10,15 @@ See http://creativecommons.org/licenses/LGPL/2.1/ or the included file, lgpl-2.1 ## Usage ## -You can import these files in your scripts with `use `, but some -files include useful constants which will be available with `include `, -which should be safe to use on all included files (ie. no top level code should -create geometry). (There is a bug/feature that prevents including constants from -files that "include" other files - see the openscad mailing list archives for more -details. Since the maintainers aren't very responsive, may have to work around this -somehow) +You can import these files in your scripts with `use `, +where 'filename' is one of the files listed below like 'motors' or +'servos'. Some files include useful constants which will be available +with `include `, which should be safe to use on all +included files (ie. no top level code should create geometry). (There is +a bug/feature that prevents including constants from files that +"include" other files - see the openscad mailing list archives for more +details. Since the maintainers aren't very responsive, may have to work +around this somehow) If you host your project in git, you can do `git submodule add URL PATH` in your repo to import this library as a git submodule for easy usage. Then you need to do diff --git a/layouts.scad b/layouts.scad new file mode 100644 index 0000000..bec8de7 --- /dev/null +++ b/layouts.scad @@ -0,0 +1,44 @@ + /* + * OpenSCAD Layout Library (www.openscad.org) + * Copyright (C) 2012 Peter Uithoven + * + * License: LGPL 2.1 or later +*/ + +//list(iHeight); +//grid(iWidth,iHeight,inYDir = true,limit=3) + +// Examples: +/*list(15) +{ + square([25,10]); + square([25,10]); + square([25,10]); + square([25,10]); + square([25,10]); +}*/ +/*grid(30,15,false,2) +{ + square([25,10]); + square([25,10]); + square([25,10]); + square([25,10]); + square([25,10]); +}*/ + +//---------------------- + +module list(iHeight) +{ + for (i = [0 : $children-1]) + translate([0,i*iHeight]) child(i); +} +module grid(iWidth,iHeight,inYDir = true,limit=3) +{ + for (i = [0 : $children-1]) + { + translate([(inYDir)? (iWidth)*(i%limit) : (iWidth)*floor(i/limit), + (inYDir)? (iHeight)*floor(i/limit) : (iHeight)*(i%limit)]) + child(i); + } +} \ No newline at end of file diff --git a/libtriangles.scad b/libtriangles.scad new file mode 100644 index 0000000..d5f207e --- /dev/null +++ b/libtriangles.scad @@ -0,0 +1,60 @@ +//Copyright (C) 2013 Alex Davies +//License: LGPL 2.1 or later +//todo, make library work with negative lengths by adding triangles to the inside of every surface. basicaly copy and paste the current triangles set and reverse the first and last digit of every triangle. In 4 character traingles switcht the middle ones around as well. Not sure if that' actually useful though. + +module rightpyramid(rightpyramidx, rightpyramidy, rightpyramidz) { + polyhedron ( points = [[0,0,0], + [rightpyramidx, 0, 0], + [0, rightpyramidy, 0], + [rightpyramidx, rightpyramidy, 0], + [rightpyramidx/2, rightpyramidy, rightpyramidz]], + + triangles = [[0,1,2],[2,1,3],[4,1,0],[3,1,4],[2,3,4],[0,2,4]]); + +} + +module cornerpyramid(cornerpyramidx, cornerpyramidy, cornerpyramidz) { + polyhedron ( points = [[0,0,0], + [cornerpyramidx, 0, 0], + [0, cornerpyramidy, 0], + [cornerpyramidx, cornerpyramidy, 0], + [0, cornerpyramidy, cornerpyramidz]], + + triangles = [[0,1,2],[2,1,3],[4,1,0],[3,1,4],[2,3,4],[0,2,4]]); + +} + +module eqlpyramid(eqlpyramidx, eqlpyramidy, eqlpyramidz) { + polyhedron ( points = [[0,0,0], + [eqlpyramidx, 0, 0], + [0, eqlpyramidy, 0], + [eqlpyramidx, eqlpyramidy, 0], + [eqlpyramidx/2, eqlpyramidy/2, eqlpyramidz]], + + triangles = [[0,1,2],[2,1,3],[4,1,0],[3,1,4],[2,3,4],[0,2,4]]); + +} + + +module rightprism(rightprismx,rightprismy,rightprismz){ + polyhedron ( points = [[0,0,0], + [rightprismx,0,0], + [rightprismx,rightprismy,0], + [0,rightprismy,0], + [0,rightprismy,rightprismz], + [0,0,rightprismz]], + triangles = [[0,1,2,3],[5,1,0],[5,4,2,1],[4,3,2],[0,3,4,5]]); +} + + + +module eqlprism(rightprismx,rightprismy,rightprismz){ + polyhedron ( points = [[0,0,0], + [rightprismx,0,0], + [rightprismx,rightprismy,0], + [0,rightprismy,0], + [rightprismx/2,rightprismy,rightprismz], + [rightprismx/2,0,rightprismz]], + triangles = [[0,1,2,3],[5,1,0],[5,4,2,1],[4,3,2],[0,3,4,5]]); +} + diff --git a/screw.scad b/screw.scad index cd4ce2b..eb444ec 100644 --- a/screw.scad +++ b/screw.scad @@ -23,15 +23,15 @@ module helix(pitch, length, slices=500){ child(0); } -module auger(pitch, length, outside_diameter, inner_diameter) { +module auger(pitch, length, outside_radius, inner_radius, taper_ratio = 0.25) { union(){ helix(pitch, length) - polygon(points=[[10,10],[100,1],[100,-1],[10,-10]], paths=[[0,1,2,3]]); - cylinder(h=length, r=20); + polygon(points=[[0,inner_radius],[outside_radius,(inner_radius * taper_ratio)],[outside_radius,(inner_radius * -1 * taper_ratio)],[0,(-1 * inner_radius)]], paths=[[0,1,2,3]]); + cylinder(h=length, r=inner_radius); } } -module test_auger(){translate([300, 0, 0]) auger(100, 300);} +module test_auger(){translate([50, 0, 0]) auger(40, 80, 25, 5);} module ball_groove(pitch, length, diameter, ball_radius=10) { diff --git a/shapes.scad b/shapes.scad index a4540bb..84b1810 100644 --- a/shapes.scad +++ b/shapes.scad @@ -80,11 +80,6 @@ module ovalTube(height, rx, ry, wall, center = false) { } } -// The orientation might change with the implementation of circle... -module ngon(sides, radius, center=false){ - rotate([0, 0, 360/sides/2]) circle(r=radius, $fn=sides, center=center); -} - // size is the XY plane size, height in Z module hexagon(size, height) { boxWidth = size/1.75; diff --git a/teardrop.scad b/teardrop.scad index a1a0708..274c162 100644 --- a/teardrop.scad +++ b/teardrop.scad @@ -13,7 +13,8 @@ You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . -*/ +*/ + /* This script generates a teardrop shape at the appropriate angle to prevent overhangs greater than 45 degrees. The angle is in degrees, and is a rotation around the Y axis. You can then rotate around Z to point it in any direction. Rotation around X or Y will cause the angle to be wrong.