From 35914eb5eaae888da6d534e0a1a4ae6b78bb3824 Mon Sep 17 00:00:00 2001 From: Elmom Date: Thu, 26 Aug 2010 12:04:17 +0300 Subject: [PATCH] Added code from the openscad svn repo for easy use and improvement. --- boxes.scad | 43 ++++++++++++++++ shapes.scad | 135 +++++++++++++++++++++++++++++++++++++++++++++++++ triangles.scad | 4 +- 3 files changed, 180 insertions(+), 2 deletions(-) create mode 100644 boxes.scad create mode 100644 shapes.scad diff --git a/boxes.scad b/boxes.scad new file mode 100644 index 0000000..d9cb1ee --- /dev/null +++ b/boxes.scad @@ -0,0 +1,43 @@ +// Library: boxes.scad +// Version: 1.0 +// Author: Marius Kintel +// Copyright: 2010 +// License: BSD + +// roundedBox([width, height, depth], float radius, bool sidesonly); + +// EXAMPLE USAGE: +// roundedBox([20, 30, 40], 5, true); + +// size is a vector [w, h, d] +module roundedBox(size, radius, sidesonly) +{ + rot = [ [0,0,0], [90,0,90], [90,90,0] ]; + if (sidesonly) { + cube(size - [2*radius,0,0], true); + cube(size - [0,2*radius,0], true); + for (x = [radius-size[0]/2, -radius+size[0]/2], + y = [radius-size[1]/2, -radius+size[1]/2]) { + translate([x,y,0]) cylinder(r=radius, h=size[2], center=true); + } + } + else { + cube([size[0], size[1]-radius*2, size[2]-radius*2], center=true); + cube([size[0]-radius*2, size[1], size[2]-radius*2], center=true); + cube([size[0]-radius*2, size[1]-radius*2, size[2]], center=true); + + for (axis = [0:2]) { + for (x = [radius-size[axis]/2, -radius+size[axis]/2], + y = [radius-size[(axis+1)%3]/2, -radius+size[(axis+1)%3]/2]) { + rotate(rot[axis]) + translate([x,y,0]) + cylinder(h=size[(axis+2)%3]-2*radius, r=radius, center=true); + } + } + for (x = [radius-size[0]/2, -radius+size[0]/2], + y = [radius-size[1]/2, -radius+size[1]/2], + z = [radius-size[2]/2, -radius+size[2]/2]) { + translate([x,y,z]) sphere(radius); + } + } +} diff --git a/shapes.scad b/shapes.scad new file mode 100644 index 0000000..17c9349 --- /dev/null +++ b/shapes.scad @@ -0,0 +1,135 @@ +/* + * OpenSCAD Shapes Library (www.openscad.org) + * Copyright (C) 2009 Catarina Mota + * + * License: LGPL 2.1 or later +*/ + + +//box(width, height, depth); +//roundedBox(width, height, depth, factor); +//cone(height, radius); +//oval(width, height, depth); +//tube(height, radius, wall); +//ovalTube(width, height, depth, wall); +//hexagon(height, depth); +//octagon(height, depth); +//dodecagon(height, depth); +//hexagram(height, depth); +//rightTriangle(adjacent, opposite, depth); +//equiTriangle(side, depth); +//12ptStar(height, depth); + +//---------------------- + +// size is a vector [w, h, d] +module box(size) { + cube(size, true); +} + +// size is a vector [w, h, d] +module roundedBox(size, radius) { + cube(size - [2*radius,0,0], true); + cube(size - [0,2*radius,0], true); + for (x = [radius-size[0]/2, -radius+size[0]/2], + y = [radius-size[1]/2, -radius+size[1]/2]) { + translate([x,y,0]) cylinder(r=radius, h=size[2], center=true); + } +} + +module cone(height, radius, center = false) { + cylinder(height, radius, 0, center); +} + +module oval(w,h, height, center = false) { + scale([1, h/w, 1]) cylinder(h=height, r=w, center=center); +} + +// wall is wall thickness +module tube(height, radius, wall, center = false) { + difference() { + cylinder(h=height, r=radius, center=center); + cylinder(h=height, r=radius-wall, center=center); + } +} + +// wall is wall thickness +module ovalTube(height, rx, ry, wall, center = false) { + difference() { + scale([1, ry/rx, 1]) cylinder(h=height, r=rx, center=center); + scale([(rx-wall)/rx, (ry-wall)/rx, 1]) cylinder(h=height, r=rx, center=center); + } +} + +// size is the XY plane size, height in Z +module hexagon(size, height) { + boxWidth = size/1.75; + for (r = [-60, 0, 60]) rotate([0,0,r]) cube([boxWidth, size, height], true); +} + +// size is the XY plane size, height in Z +module octagon(size, height) { + intersection() { + cube([size, size, height], true); + rotate([0,0,45]) cube([size, size, height], true); + } +} + +// size is the XY plane size, height in Z +module dodecagon(size, height) { + intersection() { + hexagon(size, height); + rotate([0,0,90]) hexagon(size, height); + } +} + +// size is the XY plane size, height in Z +module hexagram(size, height) { + boxWidth=size/1.75; + for (v = [[0,1],[0,-1],[1,-1]]) { + intersection() { + rotate([0,0,60*v[0]]) cube([size, boxWidth, height], true); + rotate([0,0,60*v[1]]) cube([size, boxWidth, height], true); + } + } +} + +module rightTriangle(adjacent, opposite, height) { + difference() { + translate([-adjacent/2,opposite/2,0]) cube([adjacent, opposite, height], true); + translate([-adjacent,0,0]) { + rotate([0,0,atan(opposite/adjacent)]) dislocateBox(adjacent*2, opposite, height); + } + } +} + +module equiTriangle(side, height) { + difference() { + translate([-side/2,side/2,0]) cube([side, side, height], true); + rotate([0,0,30]) dislocateBox(side*2, side, height); + translate([-side,0,0]) { + rotate([0,0,60]) dislocateBox(side*2, side, height); + } + } +} + +module 12ptStar(size, height) { + starNum = 3; + starAngle = 360/starNum; + for (s = [1:starNum]) { + rotate([0, 0, s*starAngle]) cube([size, size, height], true); + } +} + +//----------------------- +//MOVES THE ROTATION AXIS OF A BOX FROM ITS CENTER TO THE BOTTOM LEFT CORNER +//FIXME: Why are the dimensions changed? +// why not just translate([0,0,-d/2]) cube([w,h,d]); +module dislocateBox(w,h,d) { + translate([w/2,h,0]) { + difference() { + cube([w, h*2, d+1]); + translate([-w,0,0]) cube([w, h*2, d+1]); + } + } +} diff --git a/triangles.scad b/triangles.scad index 76a4822..72ff86f 100644 --- a/triangles.scad +++ b/triangles.scad @@ -16,7 +16,7 @@ * @param number depth How wide/deep the triangle is in the 3rd dimension */ /* -module triangle(o_len, a_len, depth) +module triangle_old(o_len, a_len, depth) { difference() { @@ -51,5 +51,5 @@ module triangle(o_len, a_len, depth) } } -triangle(5,10,7); +//triangle(5,10,7);