Código:
/* TÍTULO:
Generador de Cuerpos de revolución con perforaciones perpendiculares
DESCRIPCIÓN:
Programa de OpenSCAD para generar cuerpos de revolución con dos paredes concéntricas y una base que las une. Esas paredes pueden estar perforadas por círculos. Cada una de las dos paredes puede tener un grosor independiente y además sus perforaciones pueden tener distinto radio:
El grosor de la base también se puede definir por separado
FECHA:
3 Mayo 2014
*/
// Configuración: Esta zona se puede tocar, pero en función de los valores puedes obtener efectos raros.
radio=225; // Radio total de la pieza
grosor=3; // Grosor general
altura=25; // Altura de la pieza
radioAroInt=160; // Radio del aro interio
grosorAroExt=grosor;
grosorAroInt=grosor; // Grosor del aro interior (por defecto el grosor general
grosorBase=grosor; // Grosor de la base
perfAroExt=4.1; // radio de las perforaciones del aro exterior
perfAroInt=5; // Radio de las perforaciones del aro interior
nPerfAroExt=60; // Número de perforaciones de aro exterior (múltiplo de dos);
nPerfAroInt=12;
despAroExt=(360/nPerfAroExt)*0.5;
despAroInt=despAroExt;
perfSector=6;
angulo=(360/nPerfAroExt)*perfSector; // Angulo de la tarta (0-360) o (360/nPerfAroExt)*perfSector) para mostrar n perforacines enteras (definidas por perfSector
ganchol=10; // Longitud del gancho
ganchoa=10; // anchura del gancho
ganchog=3; // grosor del gancho, definido en ganchoa/ganchog
ganchoalt=grosorBase; // altura del gancho, por defecto el grosor de la base
ganchos=1; // mostrar ganchos de anclaje (1=si, cualquier otra cosa =no)
$fn=100; // Calidad general
// CUIDADO: No sigas tocando pasado este punto si no quieres romper nada.
module toro(r,e,a) {
difference() {
cylinder(r1=r,r2=r,h=a,center=true);
cylinder(r1=r-e,r2=r-e,h=a+2,center=true);
}
}
module piezaEntera() {
//Aro Exterior
difference() {
toro(radio,grosorAroExt,altura);
perforacion(perfAroExt,radio,nPerfAroExt,despAroExt);
}
// Aro Interior
difference()
{
toro(radioAroInt,grosorAroInt,altura);
perforacion3(4,10,nPerfAroInt,-15);
}
// Aro Central
difference() {
toro(radioAroInt+15,grosorAroInt,altura);
perforacion2(altura,5,60,despAroExt);
}
// Suelo
translate([0,0,-(altura*0.5)])toro(radio,radio-radioAroInt+grosorAroInt,grosorBase);
}
module sector(r,deg) {
degn = (deg % 360 > 0) ? deg % 360 : deg % 360 + 360;
difference() {
circle(r);
if (degn > 180) intersection_for(a = [0, 180 - degn]) rotate(a) translate([-r, 0, 0]) square(r * 2);
else union() for(a = [0, 180 - degn]) rotate(a) translate([-r, 0, 0]) square(r * 2);
}
}
module perforacion(rt,pt,n,d) {
for (i=[1:n/2]) {
rotate([0,90,i*(360/n)+d]) cylinder(r1=rt,r2=rt,h=2*pt+1,center=true);
}
}
module perforacion2(rt,pt,n,d) {
for (i=[1:n/2]) {
rotate([0,90,i*(360/n)+d]) translate([-grosorBase/2,0,0]) cube([rt,pt,600],center=true);
}
}
module perforacion3(rt,pt,n,d) {
for (i=[1:n/2]) {
rotate([0,90,i*(360/n)+d])
translate([-grosorBase/2,0,-153.5])
union() {
cube([rt,pt,pt],center=true);
translate([0,0,-2])
cube([rt-2,pt-2,pt-1],center=true);
}
}
}
module gancho(l,a,h,as){
translate([-1,10,0])
cylinder(r1=6,r2=5,h=h,center=true);
translate([-1,-10,0])
cylinder(r1=6,r2=5,h=h,center=true);
}
module piezaSeccionada(ang,g) {
if ((ang<360)&&(g==1)) {
difference() {
intersection() {
piezaEntera();
translate([0,0,-(altura+grosor+2)*0.5]) linear_extrude(height=altura+grosor+2) sector(radio+1,ang);
}
rotate([0,0,-ang]) translate([radio-0.5*(radio-radioAroInt),(0.5*ganchol),-altura*0.5]) rotate([0,0,90]) gancho(ganchol,ganchoa,ganchoalt+1,ganchog);
}
}
else
{
intersection() {
piezaEntera();
translate([0,0,-(altura+grosor+2)*0.5]) linear_extrude(height=altura+grosor+2) sector(radio+1,ang);
}
}
if ((ang<360)&&(g==1)) {
translate([radio-0.5*(radio-radioAroInt),0.5*ganchol,-altura*0.5]) rotate([0,0,90]) gancho(ganchol,ganchoa,ganchoalt,ganchog);
}
}
piezaSeccionada(angulo,ganchos);
//piezaEntera();
Marcadores