Skip to content

Commit 26b29ba

Browse files
committed
Added layout and 2D shapes modules
1 parent 8930770 commit 26b29ba

File tree

3 files changed

+207
-5
lines changed

3 files changed

+207
-5
lines changed

2Dshapes.scad

+163
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
/*
2+
* OpenSCAD 2D Shapes Library (www.openscad.org)
3+
* Copyright (C) 2012 Peter Uithoven
4+
*
5+
* License: LGPL 2.1 or later
6+
*/
7+
8+
// 2D Shapes
9+
//ngon(sides, radius, center=false);
10+
//complexRoundSquare(size,rads1=[0,0], rads2=[0,0], rads3=[0,0], rads4=[0,0], center=true)
11+
//roundedSquare(pos=[10,10],r=2)
12+
//ellipsePart(width,height,numQuarters)
13+
//donutSlice(innerSize,outerSize, start_angle, end_angle)
14+
//pieSlice(size, start_angle, end_angle) //size in radius(es)
15+
//ellipse(width, height) {
16+
17+
// Examples
18+
/*use <layouts.scad>;
19+
grid(105,105,true,4)
20+
{
21+
// ellipse
22+
ellipse(50,75);
23+
24+
// part of ellipse (a number of quarters)
25+
ellipsePart(50,75,3);
26+
ellipsePart(50,75,2);
27+
ellipsePart(50,75,1);
28+
29+
// complexRoundSquare examples
30+
complexRoundSquare([75,100],[20,10],[20,10],[20,10],[20,10]);
31+
complexRoundSquare([75,100],[0,0],[0,0],[30,50],[20,10]);
32+
complexRoundSquare([50,50],[10,20],[10,20],[10,20],[10,20],false);
33+
complexRoundSquare([100,100]);
34+
complexRoundSquare([100,100],rads1=[20,20],rads3=[20,20]);
35+
36+
// pie slice
37+
pieSlice(50,0,10);
38+
pieSlice(50,45,190);
39+
pieSlice([50,20],180,270);
40+
41+
// donut slice
42+
donutSlice(20,50,0,350);
43+
donutSlice(30,50,190,270);
44+
donutSlice([40,22],[50,30],180,270);
45+
donutSlice([50,20],50,180,270);
46+
donutSlice([20,30],[50,40],0,270);
47+
}*/
48+
//----------------------
49+
50+
// size, top left radius, top right radius, bottom right radius, bottom left radius, center
51+
module complexRoundSquare(size,rads1=[0,0], rads2=[0,0], rads3=[0,0], rads4=[0,0], center=true)
52+
{
53+
width = size[0];
54+
height = size[1];
55+
//%square(size=[width, height],center=true);
56+
x1 = 0-width/2+rads1[0];
57+
y1 = 0-height/2+rads1[1];
58+
x2 = width/2-rads2[0];
59+
y2 = 0-height/2+rads2[1];
60+
x3 = width/2-rads3[0];
61+
y3 = height/2-rads3[1];
62+
x4 = 0-width/2+rads4[0];
63+
y4 = height/2-rads4[1];
64+
65+
scs = 0.1; //straight corner size
66+
67+
x = (center)? 0: width/2;
68+
y = (center)? 0: height/2;
69+
70+
translate([x,y,0])
71+
{
72+
hull() {
73+
// top left
74+
if(rads1[0] > 0 && rads1[1] > 0)
75+
translate([x1,y1]) mirror([1,0]) ellipsePart(rads1[0]*2,rads1[1]*2,1);
76+
else
77+
translate([x1,y1]) square(size=[scs, scs]);
78+
79+
// top right
80+
if(rads2[0] > 0 && rads2[1] > 0)
81+
translate([x2,y2]) ellipsePart(rads2[0]*2,rads2[1]*2,1);
82+
else
83+
translate([width/2-scs,0-height/2]) square(size=[scs, scs]);
84+
85+
// bottom right
86+
if(rads3[0] > 0 && rads3[1] > 0)
87+
translate([x3,y3]) mirror([0,1]) ellipsePart(rads3[0]*2,rads3[1]*2,1);
88+
else
89+
translate([width/2-scs,height/2-scs]) square(size=[scs, scs]);
90+
91+
// bottom left
92+
if(rads4[0] > 0 && rads4[1] > 0)
93+
translate([x4,y4]) rotate([0,0,-180]) ellipsePart(rads4[0]*2,rads4[1]*2,1);
94+
else
95+
#translate([x4,height/2-scs]) square(size=[scs, scs]);
96+
}
97+
}
98+
}
99+
module roundedSquare(pos=[10,10],r=2) {
100+
minkowski() {
101+
square([pos[0]-r*2,pos[1]-r*2],center=true);
102+
circle(r=r);
103+
}
104+
}
105+
// round shapes
106+
// The orientation might change with the implementation of circle...
107+
module ngon(sides, radius, center=false){
108+
rotate([0, 0, 360/sides/2]) circle(r=radius, $fn=sides, center=center);
109+
}
110+
module ellipsePart(width,height,numQuarters)
111+
{
112+
o = 1; //slight overlap to fix a bug
113+
difference()
114+
{
115+
ellipse(width,height);
116+
if(numQuarters <= 3)
117+
translate([0-width/2-o,0-height/2-o,0]) square([width/2+o,height/2+o]);
118+
if(numQuarters <= 2)
119+
translate([0-width/2-o,-o,0]) square([width/2+o,height/2+o*2]);
120+
if(numQuarters < 2)
121+
translate([-o,0,0]) square([width/2+o*2,height/2+o]);
122+
}
123+
}
124+
module donutSlice(innerSize,outerSize, start_angle, end_angle)
125+
{
126+
difference()
127+
{
128+
pieSlice(outerSize, start_angle, end_angle);
129+
if(len(innerSize) > 1) ellipse(innerSize[0]*2,innerSize[1]*2);
130+
else circle(innerSize);
131+
}
132+
}
133+
module pieSlice(size, start_angle, end_angle) //size in radius(es)
134+
{
135+
rx = ((len(size) > 1)? size[0] : size);
136+
ry = ((len(size) > 1)? size[1] : size);
137+
trx = rx* sqrt(2) + 1;
138+
try = ry* sqrt(2) + 1;
139+
a0 = (4 * start_angle + 0 * end_angle) / 4;
140+
a1 = (3 * start_angle + 1 * end_angle) / 4;
141+
a2 = (2 * start_angle + 2 * end_angle) / 4;
142+
a3 = (1 * start_angle + 3 * end_angle) / 4;
143+
a4 = (0 * start_angle + 4 * end_angle) / 4;
144+
if(end_angle > start_angle)
145+
intersection() {
146+
if(len(size) > 1)
147+
ellipse(rx*2,ry*2);
148+
else
149+
circle(rx);
150+
polygon([
151+
[0,0],
152+
[trx * cos(a0), try * sin(a0)],
153+
[trx * cos(a1), try * sin(a1)],
154+
[trx * cos(a2), try * sin(a2)],
155+
[trx * cos(a3), try * sin(a3)],
156+
[trx * cos(a4), try * sin(a4)],
157+
[0,0]
158+
]);
159+
}
160+
}
161+
module ellipse(width, height) {
162+
scale([1, height/width, 1]) circle(r=width/2);
163+
}

layouts.scad

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
* OpenSCAD Layout Library (www.openscad.org)
3+
* Copyright (C) 2012 Peter Uithoven
4+
*
5+
* License: LGPL 2.1 or later
6+
*/
7+
8+
//list(iHeight);
9+
//grid(iWidth,iHeight,inYDir = true,limit=3)
10+
11+
// Examples:
12+
/*list(15)
13+
{
14+
square([25,10]);
15+
square([25,10]);
16+
square([25,10]);
17+
square([25,10]);
18+
square([25,10]);
19+
}*/
20+
/*grid(30,15,false,2)
21+
{
22+
square([25,10]);
23+
square([25,10]);
24+
square([25,10]);
25+
square([25,10]);
26+
square([25,10]);
27+
}*/
28+
29+
//----------------------
30+
31+
module list(iHeight)
32+
{
33+
for (i = [0 : $children-1])
34+
translate([0,i*iHeight]) child(i);
35+
}
36+
module grid(iWidth,iHeight,inYDir = true,limit=3)
37+
{
38+
for (i = [0 : $children-1])
39+
{
40+
translate([(inYDir)? (iWidth)*(i%limit) : (iWidth)*floor(i/limit),
41+
(inYDir)? (iHeight)*floor(i/limit) : (iHeight)*(i%limit)])
42+
child(i);
43+
}
44+
}

shapes.scad

-5
Original file line numberDiff line numberDiff line change
@@ -80,11 +80,6 @@ module ovalTube(height, rx, ry, wall, center = false) {
8080
}
8181
}
8282

83-
// The orientation might change with the implementation of circle...
84-
module ngon(sides, radius, center=false){
85-
rotate([0, 0, 360/sides/2]) circle(r=radius, $fn=sides, center=center);
86-
}
87-
8883
// size is the XY plane size, height in Z
8984
module hexagon(size, height) {
9085
boxWidth = size/1.75;

0 commit comments

Comments
 (0)