Merge from elmom/MCAD
This commit is contained in:
commit
37c35adcc8
163
2Dshapes.scad
Normal file
163
2Dshapes.scad
Normal file
|
@ -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 <layouts.scad>;
|
||||
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);
|
||||
}
|
|
@ -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 <MCAD/*.scad>`, but some
|
||||
files include useful constants which will be available with `include <MCAD/*.scad>`,
|
||||
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 <MCAD/filename.scad>`,
|
||||
where 'filename' is one of the files listed below like 'motors' or
|
||||
'servos'. Some files include useful constants which will be available
|
||||
with `include <MCAD/filename.scad>`, 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
|
||||
|
|
44
layouts.scad
Normal file
44
layouts.scad
Normal file
|
@ -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);
|
||||
}
|
||||
}
|
60
libtriangles.scad
Normal file
60
libtriangles.scad
Normal file
|
@ -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]]);
|
||||
}
|
||||
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
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.
|
||||
*/
|
||||
|
|
Loading…
Reference in a new issue