discuss@lists.openscad.org

OpenSCAD general discussion

View all threads

Re: Export to .STL / .3MF for later 3D-printing.

SP
Sanjeev Prabhakar
Sat, May 7, 2022 4:26 PM

Quite a long code.
Can you paste a picture of what you are trying to draw.
Regards
Sanjeev

On Sat, 7 May 2022, 16:31 Jan Öhman via Discuss, discuss@lists.openscad.org
wrote:

---------- Forwarded message ----------
From: "Jan Öhman" jan_ohman@yahoo.com
To: OpenSCAD general discussion discuss@lists.openscad.org
Cc:
Bcc:
Date: Sat, 7 May 2022 11:04:31 +0000 (UTC)
Subject: [OpenSCAD] Re: Export to .STL / .3MF for later 3D-printing.
Thank you!
Begins to understand how it works. (It was not easy...)

but my solution was not good ...

Here are 2 files that do not work to render (F6)

= = product 1= = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
= =

  • . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . -
    . _ . - . _ . - . _ . - . _ . -

include <BOSL2/std.scad>
fn = 150;

placering="left";
// placering="right"

box(0, 0, 0, placering, "#C0C0C0", fn); // (X, Y, Z, left/right, colorName)

// Monteringsplattan
// mountingPlate(0, 0, 0, placering);

// LED belysning
// LEDlampa(0, 0, 0, placering);

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - - - m o d u l e r - - - - - - - - - - - - - - - - - -

//

---================
//======  box


---===
module box(posX=0, posY=0, posZ=0, mountSide="left", colorName="#00FF00",
fn=24)
{
side = mountSide == "left" ? 0
: mountSide == "right" ? 1
: assert(false,"invalid moutSide value");  // message if no case
worked

color(colorName)
translate([posX, posY, posZ])
mirror([side, 0, 0])
difference()
{
union()
{
// Skapa konturer på bottenplattan - x, y, r, angles, [grader], början
// Rotation medurs - vänster lamphållare (bakant saknas)
points1 = circSect( 140,  0,  0, [0, 0], "right",  1, fn);  // böj nere
till höger
points2 = circSect(  60,  5,  5, [0, 5], "bottom",  1, fn); //
brytpunkt längst ned
points3 = circSect(  10, 13,  10, [0, 90], "bottom", 1, fn); // böj nere
till vänster
points4 = circSect(  5, 80,  5, [0, 90], "left",  1, fn); // böj uppe
till vänster
points5 = circSect( 140, 80,  5, [0, 1], "top",  1, fn);  // böj uppe
till höger
edge = concat(points1, points2, points3, points4, points5);
path = path3d(reverse(edge));
section = wall();
path_sweep( section, path, closed=false);

// Skapa bakkant lite högre och smalare i topp
bottom1 = concat(points5, points1);
polygon(bottom1);
path1 = path3d(reverse(bottom1));
section1 = wall1(); // lite högre bakvägg wall(b=4, f=8, h=15, t=3.5)
path_sweep( section1, path1, closed=false);

// fyll upp bottenplattansbaksida
linear_extrude(4) // Bottomplate - fill up
polygon(concat(points1, points2, points3, points4, points5));

// skapa Utskjutande del under (tänk spegelvänt)
pt1 = circSect(  19.5, 85, 0, [0, 50], "top", 1, fn);  // Uppe till
höger - moturs
pt2 = circSect(  39, 1.35,  .1, [-5, 90], "right", 1, fn);  // Nere till
höger
pt3 = circSect(  10, 13.05,  10, [0, 90], "bottom", 1, fn);  // Nere
till vänster
pt4 = circSect(  5, 80, 5, [0, 90], "left",  1, fn);  // Uppe till
vänster
translate([0, 0, -2])
linear_extrude(2.1)
polygon(concat(pt1, pt2, pt3, pt4));

// utgången för kabeln på baksidan (diam 10mm) - pekar lite nedåt
cableExit(65, 35, 0, 15, "cyan", $fn=100);
}

// skapa ett borrhål i bakkant
translate([132,60,15])
{ rotate([0, 90, 0])
{ cylinder(h=10, d=2, $fn=100);
cylinder(h=4, d=9, $fn=100);
}
}

// skapa en borrmarkering i bakkant
translate([139,25,15])
{ rotate([0, 90, 0])
cylinder(h=2, d1=1, d2=2.5, $fn=100);
}

// ingravera årtalet på baksidan
translate([10, 80, -0.5])
{ mirror([side, 0, 0])
{ rotate([0, 180, 0])
{ linear_extrude(3)
text("2022", size=12, direction="ttb", font="Comic Sans
MS:style=Bold");
}
}
}

/*
// Markera skruvhål på bakkant
borr=3;
bredd=140;
hojd=8;
avstNed=20;
translate([bredd, avstNed, hojd])
{ rotate([0,90,0])
cylinder(h=2, d1=0.5, d2=borr, center=true, $fn=50);
}
*/

// borrhål
mountingHole(20, 36, 0, 7, 90.1, 15); // posX, posY, posZ, diam, dist,
deep, $fn=50

}
}
//========  Slut box

---=============================

//

---================
//======  cableExit

---==============================
module cableExit(posX, posY, posZ, angle, colorName)
{ diamHole = 7;
diamHolder = 9.8;
hight = 12;
topRad = diamHolder/2;
topDiam = diamHolder/2-topRad/2;
bowRad = 7;
offs1 = 0.1;

color(colorName)
translate([posX, posY, posZ])
{  rotate([180, 0, 180-angle])
{ difference()
{ hull()
{ cylinder(h=hight, d=diamHolder, center=false);
translate([0, 0, hight])        // rundad topp
rotate_extrude(angle=360, convexity=2)
translate([topDiam, 0, 0])  // yttre diam topp
circle(d=topRad);        // radie topp
}

     inpHight  =  2;   // ett värde som styr var utgångshålet hamnar
     translate([0, 0, -offs1])
       cylinder(h=inpHight+offs1, d=diamHole, center=false); //

Bottenhål

     translate([-bowRad, 0, inpHight-offs1]) // böjen
     { rotate([90, 0, 0])
         rotate_extrude(angle=90, convexity=10)
           translate([bowRad, 0, 0]) // ställ in radien på kabelböjen
             circle(d=diamHole);
     }
   }
 }

}
}
//======  slut cableExit

---=========================

//

---================
//======  mountingHole

---===========================
module mountingHole(posX=0, posY=0, posZ=0, diam=7, dist=90, deep=5,
$fn=50)
{ // diam =  6;  // [mm]
// dist = 90;  // [mm]
// deep =  12;  // [mm]

translate([posX, posY, posZ])
{ translate([0, 0, -10])
cylinder(h=deep, d=diam);  // fästhål 1

 //cableHold1(dist/2, 0, .2, "#D5D5D5");  // Kabelgenomföring
 translate([dist/2, 0, 0])
 {  hull()
   { cylinder(h=5, d=6);  // fästhål 1
     sphere(d=7.5);
   }
 }

 translate([dist, 0, -10])
   cylinder(h=deep, d=diam); // fästhål 2

}
}
//======  slut mountingHole

---======================

//

---================
//======  LEDlampa

---===============================
// module LEDlampa(posX=8, posY=10, posZ=0)
module LEDlampa(posX=0, posY=0, posZ=0, mountSide="left")
{ side = mountSide == "left" ? 0
: mountSide == "right" ? 1
: assert(false,"invalid moutSide value");  // message if no case
worked

xpos = mountSide == "left" ? 121
: mountSide == "right" ? -10
: assert(false,"invalid moutSide value");  // message if no case
worked
/*
ypos = mountSide == "left" ? 10.5
: mountSide == "right" ? 10.5
: assert(false,"invalid moutSide value");  // message if no case
worked

zpos = mountSide == "left" ? 5
: mountSide == "right" ? 5
: assert(false,"invalid moutSide value");  // message if no case
worked
*/
// echo(xpos,ypos,zpos);
// translate([xpos, ypos, zpos])
translate([xpos, 10.5, 5])
mirror([1, 0, 0])
translate([posX, posY, posZ])
{ LEDbottom();
translate([0, 0, 11])
LEDglas();
}
}
//======  Slut LEDlampa

---==========================

//

---================
//======  LEDglas

---================================
module LEDglas()
{
// Variabler botten
length  = 111;  // längd mm
wideMid = 50.5;  // bredd i mitten mm

cornRad = 10;    // Radien i alla hörn
wideCorn = 48;  // Bredd i kanterna

diamHole = 6;    // håldiameter i mm

colorBot = "gray";
colorTop = "orange";

// Variabler top
cornHigh = 5;  //Höjd i ändarna
midHigh  = 8;
highTop = cornHigh + 1;  // höjd mm

p1tx = 10;      // the start value
p1ty = 49.25;
p2tx = 55.5;    // the middle value
p2ty = 50.5;
p3tx = 101;    // the end value
p3ty = p1ty;

p4tx = 101;    // the start value
p4ty = 1.25;
p5tx = 55.5;    // the middle value
p5ty = 0.0;
p6tx = 10;      // the end value
p6ty = p4ty;
// Ger ovalt glas
points1 = 3points_arc([p1tx,p1ty], [p2tx,p2ty], [p3tx,p3ty], fn=100);
points2 = 3points_arc([p4tx,p4ty], [p5tx,p5ty], [p6tx,p6ty], fn=100);

color("orange")
linear_extrude(height=cornHigh+.1)
difference()
{ polygon(concat(points1, points2));

 translate([length-10 , wideMid / 2, -.2])
   circle(d=6);
 translate([10 , wideMid / 2, -.2])
   circle(d=6);

}

// Top
color(colorTop)
difference()
{ hull()
{ // hörn1
translate([cornRad, wideMid - ((wideMid-wideCorn)/2) - cornRad, 0])
// [10,39]
cylinder(h=cornHigh, d=cornRad2, center=false);
// hörn2
translate([cornRad, cornRad + ((wideMid-wideCorn)/2), 0])
// [10,12]
cylinder(h=cornHigh, d=cornRad
2, center=false);
// hörn3
translate([length - cornRad, wideMid - ((wideMid-wideCorn)/2) -
cornRad, 0]) // [101 ,39]
cylinder(h=cornHigh, d=cornRad2, center=false);
// hörn4
translate([length - cornRad, cornRad + ((wideMid-wideCorn)/2), 0])
//
cylinder(h=cornHigh, d=cornRad
2, center=false);
}

 union()
 { // Monteringshål 1 & 2
   translate([length-10 , wideMid / 2, -.2])
     cylinder(d=diamHole, h=highTop+.5, center=false);
   translate([10 , wideMid / 2, -.2])
     cylinder(d=diamHole, h=highTop+.5, center=false);
 }

}
}
//========  Slut LEDglas

---=========================

//

---================
//======  LEDbottom

---==============================
module LEDbottom()
{ p1x = 10;      // the start value
p1y = 49.25;
p2x = 55.5;    // the middle value
p2y = 50.5;
p3x = 101;    // the end value
p3y = p1y;

p4x = 101;    // the start value
p4y = 1.25;
p5x = 55.5;    // the middle value
p5y = 0.0;
p6x = 10;      // the end value
p6y = p4y;

// Variabler botten för borrhålen
length  = 111;  // längd mm
wideMid = 50.5;  // bredd i mitten mm
diamHole = 6;    // håldiameter i mm
cornHigh = 5;  //Höjd i ändarna
midHigh  = 8;
highTop = cornHigh + 1;  // höjd mm
// offs1 = 0.1;
heightHole = 15; //mm
height = 11; //mm

points1 = circSect(  10, 11.25,  10, [0, 90], "bottom", 1, fn); // Hörn
nere till vänster
points2 = circSect(  10, 39.25,  10, [0, 90], "left",  1, fn); // Hörn
uppe till vänster
points3 = 3points_arc([p1x,p1y], [p2x,p2y], [p3x,p3y], fn);
points4 = circSect( 101, 39.25,  10, [0, 90], "top",    1, fn); // Hörn
uppe till höger
points5 = circSect( 101, 11.25,  10, [0, 90], "right",  1, fn); // Hörn
nere till höger
points6 = 3points_arc([p4x,p4y], [p5x,p5y], [p6x,p6y], fn);

// The base plate for the LED lamp

difference()
{ color("gray", 0.5)
linear_extrude(height=height)
polygon(concat(points1, points2, points3, points4, points5,
points6));

// union()
 { // Monteringshål 1 & 2
   translate([length-10 , wideMid / 2, -.2])
     cylinder(d=diamHole, h=heightHole, center=false);
   translate([10 , wideMid / 2, -.2])
     cylinder(d=diamHole, h=heightHole, center=false);
 }

}
}
//========  Slut LEDbottom

---=======================

//

---================
//======  circleSect

---=============================
// Create rounded corners 2D
// https://openhome.cc/eGossip/OpenSCAD/SectorArc.html
// ange .:  x, y, radien,
//          [från, till] vinkel,
//          var vinkeln startar, (left, bottom, right, top)
//          vilken rotation (-1=medsol, 1=motsols)
function circSect(x=0, y=0, radius=10, angles=[0,270], startRef="bottom",
rotate=1, fn=24)  =
let(
startAngel  = (startRef == "left")  ?  0
: (startRef == "bottom") ?  90
: (startRef == "right")  ? 180
: (startRef == "top")    ? 270
: startRef,  // valfri vinkel
// : assert(false,"invalid moutSide value");  // Error
message if no case worked
//: undef,
r = radius,
//r = radius / cos(180 / fn),
step = 360 / fn,
// points = [[x, y],
points = [
for(a = [angles[0]-startAngel : step : angles[1]-startAngel])
[-rotate * r * cos(a)+x, r * sin(a)+y]]
) points;
//========  Slut circleSect

---======================

//

---================
//======  3points_arc

---============================
// Create an arc with three points 2D
function 3points_arc(p0, p1, p2, fn=10) =
// an alternative expression for D
// D  = 2 * ( (p1-p0).x * (p2-p0).y - (p1-p0).y * (p2-p0).x )
let( D  = 2 * cross(p1-p0, (p2-p0)) )
assert( abs(D)>1e-9, "The 3 points should not be collinear." )
let(
Ux    = ( (p2-p0).y*(p1-p0)(p1-p0) - (p1-p0).y(p2-p0)(p2-p0) )/D,
Uy    = ( (p1-p0).x
(p2-p0)(p2-p0) - (p2-p0).x(p1-p0)(p1-p0) )/D,
radius = norm([Ux,Uy]),
center = [Ux,Uy] + p0,
ang0  = atan2( (p0-center).y, (p0-center).x ),
ang2  = atan2( (p2-center).y, (p2-center).x ),
// the points are in a cw winding iff D<0
// the angular difference between vectors p2-center and p0-center
// measured from p0-center; dang is positive iff D is negative
dang  = D<0  ? ang2<ang0 ? ang2-ang0 : ang2-ang0-360
: ang2>ang0 ? ang2-ang0 : ang2-ang0+360
)
[ for(i=[0:fn-1])
let( ang = ang0 + i
dang/(fn-1) )
center + radius*[cos(ang),sin(ang)] ];
//========  Slut 3points_arc

---=====================

//

---================
//======  Wall som ett "L"

---=======================
// Normal vägghöjd
function wall() =
let(
b =  4,    // botten - tjocklek
f =  8,    // Foten
h = 15,    // Höjd
t =  3.5,  // Top
x = (b+(t/2) - (h - ( (-h / (f-t)) *t) )) / (-h / (f-t))
)
let(
points = [[0,0], [f,0], [t,h], [0,h]] ,
top = move([t/2, h, 0], circle(d=t, $fn=20)),
sqr = square([10, b]),
diff =
difference([
move([x, b], square([t/2, t/2])),
move([x+(t/2), b+(t/2), 0], circle(d = t, $fn=20) ) ])
)
union([points, top, sqr, diff]);
//========  Slut Wall

---============================

//

---================
//======  Wall1 som ett "L"

---======================
// En högre vägg
function wall1() =
let(
b =  4,    // botten - tjocklek
f =  7,    // Foten
h = 25,    // Höjd
t =  3,  // Top
x = (b+(t/2) - (h - ((-h / (f-t)) *t))) / (-h / (f-t))
)
let(
points = [[0,0], [f,0], [t,h], [0,h]] ,
top = move([t/2, h, 0], circle(d=t, $fn=20)),
sqr = square([10, b]),
diff =
difference([
move([x, b], square([t/2, t/2])),
move([x+(t/2), b+(t/2), 0], circle(d = t, $fn=20) ) ])
)
union([points, top, sqr, diff]);
//========  Slut Wall1

---===========================

//

---================
//======  Plåt på släp

---===========================
module mountingPlate(posX=0, posY=0, posZ=0, mountSide="left",
colorName="#C0C0C0", $fn=50)
{ // Hörnpositionerna
posX1 = 120;
posY1 = 0;
posX2 = posX1;
posY2 = -200;
posX3 = 120 - 75;
posY3 = -200;
posX4 = 0;
posY4 = 0;
thick=2;  // tjocklek

side = mountSide == "left" ? 0
: mountSide == "right" ? 1
: assert(false,"invalid moutSide value");  // message if no case
worked

xpos = mountSide == "left" ? 20
: mountSide == "right" ? -20
: assert(false,"invalid moutSide value");  // message if no case
worked
/*
ypos = mountSide == "left" ? 85
: mountSide == "right" ? 85
: assert(false,"invalid moutSide value");  // message if no case
worked

zpos = mountSide == "left" ? -thick
: mountSide == "right" ? -thick
: assert(false,"invalid moutSide value");  // message if no case
worked
*/
color(colorName)
{  translate([posX, posY, posZ])
translate([xpos, 85, -thick])
{ mirror([side, 0, 0])
{ linear_extrude(thick)
hull()
{ translate([posX1, posY1, 0])
square(0.1, center = true);
translate([posX2, posY2, 0])
square(0.1, center = true);
translate([posX3, posY3, 0])
square(0.1, center = true);
translate([posX4, posY4, 0])
square(0.1, center = true);
}
}
}
}
}
= = END product 1= = = = = = = = = = = = = = = = = = = = = = = = = = = =
= =

  • . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . -
    . _ . - . _ . - . _ . - . _ . -

= = product 2 = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
= =

  • . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . -
    . _ . - . _ . - . _ . - . _ . -

$fn=100;
//$fn=15;

//switch();
//cableHolder4(); //Switchboxen

// cableHolder3(0, 0, 0, 33.5, 23.5, 1.5, 2);
// showCables();

module cableHolder4(fn=24);
{ // idé från
// - https://www.thingiverse.com/thing:6400/files
// -
https://ihrchive.wordpress.com/2011/02/14/openscad-tip-round-1-of-3-basic-rounding/

// mått på Switch
heightHold = 10.5;
widthHold = 33.5;
depthHold = 23.5;
spaceHold = 10.0; // utrymmet bakom switch
holdRadie = 2;  // radie i hörnen
thick = 2;
offset1=0.5;  // öka toleransen

// innermått
holeW = widthHold + offset1;
holeH = heightHold + offset1;
holeD = depthHold + spaceHold+offset1;

// yttermått
pad = 0.1;                  // Padding to maintain manifold
box_l = holeW + thick*2;  // Bredden på switchen
box_w = holeD + thick;            // Djupet på switchen
box_h = holeH + thick; // Height
round_r = holdRadie;        // Radius of round
smooth = 45;                // Number of facets of rounding cylinder

difference()
{ union() // Detta utförs i två steg.
{ difference()  // utför fasningar och kabelmarkeringar
{ mainBox(box_l, box_w, box_h, spaceHold+thick, round_r, thick,
smooth, pad);

     // fasning vänster (underkant)
     translate([box_l/2-0.85, spaceHold-4.3, thick-offset1])  //

sidled, fram/bak , upp/ned
rotate([0,180,45])
cylinder(h=thick, d1=holeW1.414-thick-thick, d2=holeW1.414,
$fn=4);

     // fasning höger (underkant)
     translate([box_l/2-3.65, spaceHold-4.3, thick-offset1]) // sidled,

fram/bak , upp/ned
rotate([0,180,45])
cylinder(h=thick, d1=holeW1.414-thick-thick, d2=holeW1.414,
$fn=4);

     // kabelgenomföringar
     rotate([90, 180, 90]) // Markering ena sidan (vänster under)
       ovalCableHole(spaceHold/2-offset1, -1.75, -1.2);

     rotate([90, 180, 180]) // Markering bakkant (vänster under)
       ovalCableHole(spaceHold/2-1.55, -1.75, -spaceHold-0.85);

     rotate([90, 180, 180]) // Markering bakkant (höger under)
       ovalCableHole(widthHold-spaceHold/2-offset1, -1.75,

-spaceHold-0.85);

     rotate([90, -180, 90])  // Markering ena sidan (höger under)
       ovalCableHole(3.75, -1.75, widthHold-0.1);
   }
 } // Slut union - kropp

 translate([-offset1/2, -spaceHold+pad, -pad]) // hålet där switchen

ska placeras
cube([holeW, holeD+pad, holeH+pad], center=false);

   translate([4, 12, 0])
     cylinder(h=15,d=3.2);
   translate([4, 12, 17.7])
     sphere(r=6);

   translate([29.6, 12, 0])
     cylinder(h=15,d=3.2);
   translate([29.6, 12, 17.7])
     sphere(r=6);

   /*  // Hål genom lock bak - om så önskas
   translate([box_l/2-thick, -6, offset1/2])
     cylinder(h=box_h+thick*4+offset1, d=3.2, $fn=100);  // hål genom

lock bak

   translate([box_l/2-thick, -6, 17.7])
     sphere(r=6);    // kona hålet bak
   */

} // Slut difference() - box

 difference()
 { union()
   { translate([29.6, 12, heightHold-offset1*2])
       cylinder(h=2,d=5.2);        // Stödhylsa för Switchskruv1
     translate([4, 12, heightHold-offset1*2])
       cylinder(h=2,d=5.2);        // Stödhylsa för Switchskruv2

     translate([holeW/2, -spaceHold+thick+1, holeH/2])
       rotate([180,0,0])
          backHole();
   } // union - slut

   translate([4, 12, 0])     //  Hålen i stödhylsorna
     cylinder(h=15,d=3.2);

   translate([29.6, 12, 0])  //  Hålen i stödhylsorna
     cylinder(h=15,d=3.2);

   translate([box_l/2-thick, -6, -offset1])  // hål i stödhylsa bak
     cylinder(h=box_h+offset1, d=3.2, $fn=100);

   // Sänk stödhylsan
   translate([ widthHold/2-7, -spaceHold-offset1, -thick+offset1])  //

hål i stödhylsa bak
cube([15, 8, 3]);

   // kabelmarkering
   // translate([0, 0, 0])  // hål i stödhylsa bak


   }

/*
translate([4, 12, 0])
#cylinder(h=15,d=3.2);
//translate([4, 13.5, 17.3])
//#sphere(r=6);

   translate([29.6, 12, 0])
     #cylinder(h=15,d=3.2);
   //translate([29.6, 13.5, 17.3])
     //#sphere(r=6);

*/

}

module backHole()
{ wallH = 10.5;

wide1  = 12; // endast runt cylindern
wide2  = 35; // hela väggen
deep1    =  4;
height1  = 10.5;
cornRad1  =  2;
diam1 = 8;
opt1 = 0.1;

//rundadFot();

// Rundad stäcka mellan t.ex. vägg och tak -bakkant
translate([wide2/2, diam1/2-cornRad1/2, -height1/2])
{ rotate([90, 0, -90])
{ linear_extrude(wide2)
{ difference()
{ square([cornRad1, cornRad1]);

       translate([cornRad1, cornRad1])
         circle(r=cornRad1);
     }
   }
 }

}

// rundad stäcka1 (vänster) mellan t.ex. vägg och tak
translate([-wide2/2+0.15, deep1/2+cornRad1/2, -height1/2])
rotate([90, 0, 0])
{ linear_extrude(spaceHold)
{ difference()
{ square([cornRad1, cornRad1]);

     translate([cornRad1, cornRad1])
     circle(r=cornRad1);
   }
 }

}

// rundad stäcka2 mellan t.ex. vägg och tak
translate([wide2/2-0.65, deep1/2+cornRad1/2, -height1/2])
rotate([0, -90, 90])
{ linear_extrude(spaceHold)
{ difference()
{ square([cornRad1, cornRad1]);

     translate([cornRad1, cornRad1])
       circle(r=cornRad1);
   }
 }

}

// Skapa stödfot - bak
difference()
{ union()
{ //själva cylindern
translate([0, 1, 0])
{ cylinder(h=height1, d=diam1, center=true);
translate([0, diam1/2, 0])
cube([diam1,diam1-1,height1], center=true);
}

   // Rundad fot under cylinder ovan
   translate([0, 1, -height1/2])
   { rotate_extrude()
     { translate([diam1/2, 0, 0])
       { difference()
         { square([cornRad1, cornRad1]);

           translate([cornRad1, cornRad1])
             circle(r=cornRad1);
         }
       }
     }
   }

   // Rundad rakstäcka1 - cylinderfot - mellan t.ex. vägg och tak
   translate([diam1/2, diam1, -height1/2])
   { rotate([90, 0, 0])
     { linear_extrude(diam1)
       { difference()
         { square([cornRad1, cornRad1]);

           translate([cornRad1, cornRad1])
             circle(r=cornRad1);
         }
       }
     }
   }

   // Rundad rakstäcka2 - cylinderfot - mellan t.ex. vägg och tak
   translate([-diam1/2, diam1, -height1/2])
   { rotate([0, -90, 90])
     { linear_extrude(diam1)
       { difference()
         { square([cornRad1, cornRad1]);

           translate([cornRad1, cornRad1])
             circle(r=cornRad1);
         }
       }
     }
   }

   //väggen bakom cylindern som ska rundas
   translate([0, diam1/2-cornRad1, 0])
     cube([wide1, cornRad1, height1], center=true);

 }


 // Avrunda hörn1 bak
 translate([-wide1/2, cornRad1/2, cornRad1])
 { hull()
   { cylinder(h=height1+opt1, r=cornRad1, center=true);
     {  translate([0, 0, -height1/2])
         sphere(r=cornRad1);
     }
   }
 }

 // Avrunda hörn2 bak
 translate([wide1/2, cornRad1/2, cornRad1])
 { hull()
   { cylinder(h=height1+opt1, r=cornRad1, center=true);
     {  translate([0, 0, -height1/2])
         sphere(r=cornRad1);
     }
   }
 }


 // Plocka bort rundad fot bak samt det som sticker ut
 translate([-wide1/2, diam1/2-cornRad1/2, -height1/2-opt1])
   cube([wide1, diam1/2+cornRad1, height1+opt1*2], center=false);

}
}

module ovalCableHole(posX, posY, posZ)
{ // Hål 5.5 x 3.5 mm
pan = 0.1;
cableHi = 1.5;

translate([posX, posY, posZ])
{ color("white")
{ translate([0, 0, -pan])
{ cylinder(h=cableHi, d=3.5);
//#translate([0, 0, 0]) cylinder(h=10, d=1);
//translate([0, 0, -1]) cylinder(h=1, d1=0, d2=1);
//translate([0, 0, 0]) sphere(d=1); // Inre kulan
//translate([0, 0, 1.5]) sphere(d=1); // Inre kulan

     translate([0, 0, -1]) sphere(d=0.8); // yttre kulan
     translate([0, 0, 2.5]) sphere(d=0.8); // yttre kulan

   }
   translate([2, 0, -pan])
   { cylinder(h=cableHi, d=3.5);
     // #translate([0, 0, -cableHi*2]) cylinder(h=10, d=0.5);
     //translate([0, 0, 0]) sphere(d=1); // Inre kulan
     //translate([0, 0, 1.5]) sphere(d=1); // Inre kulan

     translate([0, 0, -1]) sphere(d=0.8); // yttre kulan
     translate([0, 0, 2.5]) sphere(d=0.8); // yttre kulan

   }
   translate([-3.5/2, 0, -pan])
     cube([5.5, 3.5/2, cableHi]);
   translate([-0.25, -1.74, -pan])
     cube([2.5, 1.75, cableHi]);
 }

}
}

module rundadFot()
{
// specifika värden för skruvdistansen bak
wallH = 10.5;

wide1  = 12; // endast runt cylindern
wide2  = 34; // hela väggen
deep1    =  4;
height1  = 10;
cornRad1  =  2;
diam1 = 8;
opt1 = 0.1;

color("magenta")
{ translate([0, 0, wallH])
{ difference()
{ union()
{ // Bakgavel
translate([wide2/2, opt1, height1/2])
{ rotate([90, 180, 0])
cube([wide2, height1, opt1]);
}

       // Golv
       translate([wide2/2, -height1+opt1, -height1/2])
         rotate([0, 180, 0])
           cube([wide2, height1, opt1]);

       //väggen bakom cylindern som kan rundas
       translate([0, -cornRad1/2, 0])
         cube([wide1, cornRad1, height1], center=true);

       //själva cylindern
       translate([0, -cornRad1/2, 0])
         cylinder(h=height1, d=diam1, center=true);

       // Rundad fot under cylinder ovan
       translate([0, -cornRad1/2, -height1/2])
       { rotate_extrude()
         { translate([diam1/2, 0, 0])
           { difference()
             { square([cornRad1, cornRad1]);

               translate([cornRad1, cornRad1])
                 circle(r=cornRad1);
             }
           }
         }
       }

       // Rundad stäcka mellan t.ex. vägg och tak -bakkant
       translate([wide2/2, 0, -height1/2])
       { rotate([90, 0, -90])
         { linear_extrude(wide2)
           { difference()
             { square([cornRad1, cornRad1]);

               translate([cornRad1, cornRad1])
                 circle(r=cornRad1);
             }
           }
         }
       }

       // rundad stäcka mellan t.ex. vägg och tak -sida1
       translate([-wide2/2, 0, -height1/2])
       { rotate([90, 0, 0])
         { linear_extrude(10)
           { difference()
             { square([cornRad1, cornRad1]);

               translate([cornRad1, cornRad1])
               circle(r=cornRad1);
             }
           }
         }
       }

       // rundad stäcka mellan t.ex. vägg och tak -sida2
       translate([wide2/2, -10, -height1/2])
       { rotate([90, 0, 180])
         { linear_extrude(10)
           { difference()
             { square([cornRad1, cornRad1]);

               translate([cornRad1, cornRad1])
               circle(r=cornRad1);
             }
           }
         }
       }
     } // Avsluta union = = = = = = = = = = = = = = = = = = = =


     // Avrunda hörn1 bak
     translate([-wide1/2+opt1*1.3, -deep1/2, cornRad1])
     { cylinder(h=height1+opt1, r=cornRad1, center=true);
         translate([0, 0, -height1/2])
           sphere(r=cornRad1);
     }

     // Avrunda hörn2 bak
     translate([wide1/2-opt1*1.3, -deep1/2, cornRad1])
     { cylinder(h=height1+opt1, r=cornRad1, center=true);
         translate([0, 0, -height1/2])
           sphere(r=cornRad1);
     }

     // Plocka bort rundad fot bak samt det som sticker ut
     translate([-wide1/2, 0, -height1/2-opt1])
       cube([wide1, diam1/2+cornRad1, height1+opt1*2], center=false);
   }
 }

}
}

module mainBox(box_l, box_w, box_h, spaceHold, round_r, thick, smooth, pad)
{ translate([box_l/2-thick-offset1/2, box_w/2-spaceHold, box_h/2])
{
// To fix the corners cut the main cube with smaller cubes with
spheres removed
difference()
{ cube([box_l, box_w, box_h], center = true);

   // Kant1 - liggande
   translate([0, -box_w/2+round_r, box_h/2-round_r])
   { difference()
     { translate([0,-round_r-pad,round_r+pad])
         cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center =

true);
rotate(a=[0,90,0])
cylinder(box_l+4pad,round_r,round_r,center=true,$fn=smooth);
}
}
// Kant2 - liggande
translate([0, box_w/2-round_r, box_h/2-round_r])
{ difference()
{ translate([0,round_r+pad,round_r+pad])
cube([box_l+2
pad, round_r2+pad, round_r2+pad], center =
true);
rotate(a=[0,90,0])
cylinder(box_l+4pad,round_r,round_r,center=true,$fn=smooth);
}
}
/

// Kant3 - liggande
translate([0, -box_w/2+round_r, -box_h/2+round_r])
{ difference()
{ translate([0,-round_r-pad,-round_r-pad])
cube([box_l+2pad, round_r2+pad, round_r2+pad], center =
true);
rotate(a=[0,90,0])
cylinder(box_l+4
pad,round_r,round_r,center=true,$fn=smooth);
}
}

   // Kant4 - liggande
   translate([0, box_w/2-round_r, -box_h/2+round_r])
   { difference()
     { translate([0,round_r+pad,-round_r-pad])
         cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center =

true);
rotate(a=[0,90,0])
cylinder(box_l+4pad,round_r,round_r,center=true,$fn=smooth);
}
}
/
// ----
// Kant1 - stående
translate([-box_l/2+round_r, box_w/2-round_r, 0])
{ difference()
{ translate([-round_r-pad,round_r+pad,0])
cube([round_r
2+pad, round_r
2+pad, box_h+2pad], center =
true);
cylinder(box_h+4
pad,round_r,round_r,center=true,$fn=smooth);
}
}
// Kant2 - stående
translate([box_l/2-round_r, box_w/2-round_r, 0])
{ difference()
{ translate([round_r+pad,round_r+pad,0])
cube([round_r2+pad, round_r2+pad, box_h+2pad], center =
true);
cylinder(box_h+4
pad,round_r,round_r,center=true,$fn=smooth);
}
}
// Kant3 - stående
translate([-box_l/2+round_r, -box_w/2+round_r, 0])
{ difference()
{ translate([-round_r-pad,-round_r-pad,0])
cube([round_r2+pad, round_r2+pad, box_h+2pad], center =
true);
cylinder(box_h+4
pad,round_r,round_r,center=true,$fn=smooth);
}
}
// Kant4 - stående
translate([box_l/2-round_r, -box_w/2+round_r, 0])
{ difference()
{ translate([round_r+pad,-round_r-pad,0])
cube([round_r2+pad, round_r2+pad, box_h+2pad], center =
true);
cylinder(box_h+4
pad,round_r,round_r,center=true,$fn=smooth);
}
}

 // ----
   // Kant1 liggande (andra hållet)
   translate([-box_l/2+round_r, 0, box_h/2-round_r])
   { difference()
     { translate([-round_r-pad, 0, round_r+pad])
         cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center =

true);
rotate(a=[0,90,90])
cylinder(box_w+4pad,round_r,round_r,center=true,$fn=smooth);
}
}
// Kant2 liggande (andra hållet)
translate([box_l/2-round_r, 0, box_h/2-round_r])
{ difference()
{  translate([round_r+pad, 0, round_r+pad])
cube([round_r
2+pad, box_w+2pad, round_r2+pad], center =
true);
rotate(a=[0,90,90])
cylinder(box_w+4pad,round_r,round_r,center=true,$fn=smooth);
}
}
/

// Kant3 liggande (andra hållet)
translate([-box_l/2+round_r, 0, -box_h/2+round_r])
{ difference()
{ translate([-round_r-pad, 0, -round_r-pad])
cube([round_r2+pad, box_w+2pad, round_r2+pad], center =
true);
rotate(a=[0,90,90])
cylinder(box_w+4
pad,round_r,round_r,center=true,$fn=smooth);
}
}

   // Kant4 liggande (andra hållet)
   translate([box_l/2-round_r, 0, -box_h/2+round_r])
   { difference()
     { translate([round_r+pad, 0, -round_r-pad])
         cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center =

true);
rotate(a=[0,90,90])
cylinder(box_w+4pad,round_r,round_r,center=true,$fn=smooth);
}
}
/
// ----
// Hörn1 (övre)
translate([box_l/2-round_r, box_w/2-round_r, box_h/2-round_r])
{ difference()
{ translate([round_r+pad, round_r+pad, round_r+pad])
cube([round_r
2+pad, round_r
2+pad, round_r2+pad], center =
true);
sphere(round_r,$fn=smooth);
}
}
// Hörn2 (övre)
translate([-box_l/2+round_r, box_w/2-round_r, box_h/2-round_r])
{ difference()
{ translate([-round_r-pad, round_r+pad, round_r+pad])
cube([round_r
2+pad, round_r2+pad, round_r2+pad], center =
true);
sphere(round_r,$fn=smooth);
}
}
// Hörn3 (övre)
translate([box_l/2-round_r, -box_w/2+round_r, box_h/2-round_r])
{ difference()
{ translate([round_r+pad, -round_r-pad, round_r+pad])
cube([round_r2+pad, round_r2+pad, round_r2+pad], center =
true);
sphere(round_r,$fn=smooth);
}
}
// Hörn4 (övre)
translate([-box_l/2+round_r, -box_w/2+round_r, box_h/2-round_r])
{ difference()
{ translate([-round_r-pad, -round_r-pad, round_r+pad])
cube([round_r
2+pad, round_r2+pad, round_r2+pad], center =
true);
sphere(round_r,$fn=smooth);
}
}
/*
// Hörn1 (undre)
translate([box_l/2-round_r, box_w/2-round_r, -box_h/2+round_r])
{ difference()
{ translate([round_r+pad, round_r+pad, -round_r-pad])
cube([round_r2+pad, round_r2+pad, round_r2+pad], center =
true);
sphere(round_r,$fn=smooth);
}
}
// Hörn2 (undre)
translate([-box_l/2+round_r, box_w/2-round_r, -box_h/2+round_r])
{ difference()
{ translate([-round_r-pad, round_r+pad, -round_r-pad])
cube([round_r
2+pad, round_r2+pad, round_r2+pad], center =
true);
sphere(round_r,$fn=smooth);
}
}
// Hörn3 (undre)
translate([box_l/2-round_r, -box_w/2+round_r, -box_h/2+round_r])
{ difference()
{ translate([round_r+pad, -round_r-pad, -round_r-pad])
cube([round_r2+pad, round_r2+pad, round_r2+pad], center =
true);
sphere(round_r,$fn=smooth);
}
}
// Hörn4 (undre)
translate([-box_l/2+round_r, -box_w/2+round_r, -box_h/2+round_r])
{ difference()
{ translate([-round_r-pad, -round_r-pad, -round_r-pad])
cube([round_r
2+pad, round_r2+pad, round_r2+pad], center =
true);
sphere(round_r,$fn=smooth);
}
}
*/
}
}
}
//

module cableHolder3(posX, posY, posZ, length, width, height, radius)
{ // Skapa toppen över switchen
// mått på Switchen
fn = 96;          // upplösning (endast bågen?)
heightHold = 10.5;
widthHold = 33.5;
depthHold = 23.5;
holdRadie = 1.5;  // radie i hörnen
thick = 1.5;      // tjocklek

translate([0,-thick,0])
{
difference(0, 0, 0)
{ hull()
{ difference()
{ translate([thick, 0, heightHold]) // vänster kant
{ rotate([-90, 0, 0])
{ cylinder(h=depthHold, d=thick2);
translate([0, 0, depthHold])
sphere(d=thick
2);          // längst fram
}
}
translate([0, -0.1, heightHold]) // plocka bort underdelen
rotate([-90, 0, 0])
cube([thick*2, thick+.1, depthHold+thick+.1]);
}

     difference()
     { translate([widthHold-thick, 0, heightHold]) // höger kant
       { rotate([-90, 0, 0])
         { cylinder(h=depthHold, d=thick*2);
           translate([0, 0, depthHold])
             sphere(d=thick*2);         // längst fram
         }
       }
       translate([widthHold-thick*2, -0.1, heightHold]) // plocka bort

underdelen
{ rotate([-90, 0, 0])
cube([thick*2, thick+.1, depthHold+thick+.1]);
}
}
}

   // öppna hålen för monteringsskruvarna uppe på plattan
   translate([4, 13.5, 0])
     cylinder(h=15,d=3.2);
   translate([4, 13.5, 17.3])
     sphere(r=6);

   translate([29.6, 13.5, 0])
     cylinder(h=15,d=3.2);

   translate([29.6, 13.5, 17.3])
     sphere(r=6);
 }

 // halvbåge 1 bak
 translate([thick, 0, heightHold/2+thick/2])
   rotate([0, 90, 180])
     rotate_extrude(angle = 180, convexity=20, $fn=64)
 translate([heightHold/2-thick/2, 0, 0])
   circle(d=thick*2);
 translate([thick, 0, heightHold])
   sphere(d=thick*2);  // övre kulan
 translate([thick, 0, thick])
   sphere(d=thick*2);  // undre kulan


 // halvbåge 2 bak
 translate([widthHold-thick, 0, heightHold/2+thick/2])
   rotate([0, 90, 180])
     rotate_extrude(angle = 180, convexity=20, $fn=64)
 translate([heightHold/2-thick/2, 0, 0])
   circle(d=thick*2);
 translate([widthHold-thick, 0, heightHold])
   sphere(d=thick*2);  // övre kulan
 translate([widthHold-thick, 0, thick])
   sphere(d=thick*2);  // undre kulan

 // en cylinder tvärsöver längst upp
 translate([thick, 0, heightHold])
 { rotate([0,90,0])
     cylinder(h=widthHold-thick*2, r=thick);
 }

}

// Halvbågen (kabelhållaren) på baksidan switchen
translate([widthHold-thick, -thick, heightHold/2+thick/2])
{ rotate([0,90,180])
linear_extrude(widthHold-thick2)
arc(heightHold/2-thick/2, [0, 180], thick, fn); //radius, angles,
width, fn)
}
// en cylinder tvärsöver längst ned
translate([thick, -thick, thick])
{ rotate([0,90,0])
cylinder(h=widthHold-thick
2, r=thick);
}
}

module switch(posX=0, posY=0, posZ=0)
{ buttRadie = 1.5;
height = 10.5;
width = 33.5;
depth = 23.5;
h1x = buttRadie;
h1y = buttRadie;
h2x = width-buttRadie;
h2y = buttRadie;
h3x = width-buttRadie;
h3y = depth-buttRadie;
h4x = buttRadie;
h4y = depth-buttRadie;

translate([posX, posY, posZ])
{ difference()
{ color("#F9F9F3")
// tryck-knappen
union()
{ translate([width/2, depth+6-0.1, height/2])
{ rotate([90, 0, 0])
{ translate([0,0,6])
circle(d=6.8);  // skuggan runt knapp
cylinder(h=6, d=6);
sphere(d=6);
}
}

     hull()  // Switchkropp
     { translate([h1x, h1y])
         cylinder(h=height, r=1.5);
       translate([h2x, h2y])
         cylinder(h=height, r=1.5);
       translate([h3x, h3y])
         cylinder(h=height, r=1.5);
       translate([h4x, h4y])
         cylinder(h=height, r=1.5);
     }
   }

   // Skruvhålen för switchen
   hole( 4, 12, 0, "#FFD700", height);
   hole(29.6, 12, 0, "#FFD700", height);
   // hole( 4, 12, 0, "#FFD700", 50);
   // hole(29.6, 12, 0, "#FFD700", 50);
   // hål för kablar bak
   color("gray")
   { translate([9.5, 16, height/2])
     { rotate([90, 0, 0])
         cylinder(h=16.5, d=4);
     }
     translate([24.5, 16, height/2])
     {  rotate([90, 0, 0])
         cylinder(h=16.5, d=4);
     }
   }

   // hål för kabelskruvar
   color("white")
   { translate([29.5, 17.1, height/2])
     { rotate([0, 90, 0])
         cylinder(h=4.1, d=4.5);
     }
     translate([-0.1, 17.1, height/2])
     { rotate([0, 90, 0])
         cylinder(h=4.1, d=4.5);
     }
   }
 }

 // Kabelskruvar
 cableScrew(3, 17, height/2, 90);
 cableScrew(31, 17, height/2, -90);

}
}

// Skruven som håller fast kabeln i switchen
module cableScrew(posX=0, posY=0, posZ=0, angle=0)
{ color("#FFD700")  // mässing
translate([posX, posY, posZ])
{ rotate([0, 0, angle])
{ difference()
{ // skruvskalle
translate([0, 0, 0])
rotate([90, 0, 0])
cylinder(h=2, d1=4, d2=3.5);

     // stjärnan i skruven
     translate([0, 1.85, -.25])
       rotate([0, 0, 0])
         cylinder(h=0.5, d=5);
     translate([-0.25, -.6, 2.25])
       rotate([0, 90, 0])
         cube([4.5, 2, 0.5]);
   }
 }

}
}

// borrhål
module hole(posX=0, posY=0, posZ=0, colorName="yellow", height)
{ diamHole1 = 3;
highHole1 = height;
diamHole2 = 6;
highHole2 = 2.5;
offs=0.1;

color(colorName)
{
translate([posX, posY, posZ])
{ translate([0, 0, 0])
cylinder(h=highHole1, d=diamHole1);
translate([0, 0, -offs])
cylinder(h=highHole2, d=diamHole2);
translate([0, 0, height-highHole2+offs])
cylinder(h=highHole2, d=diamHole2);
}
}
}

module showCables()
{ translate([-25,8,24])
rotate([80,177,90])
cable(10,10,0,"brun");
translate([-43,8,15])
rotate([90,180,90])
cable(10,10,0,"blå");
}

module cable(posX=0, posY=0, posZ=0, colorName="blå", radius=1.26,
width=0.62, thick=50, fn=24)
{ // default 1.5mm2
// radius = inner radie
// width = bredd/tjocklek på cirkeln (inte höjd)
// thick = höjd på cirken/ röret
// pin=

colCupper = "#D7715A";
colGreen  = "#07DA63";
colYellow = "#FFCC00";

if (colorName=="gröngul")
{ translate([posX, posY, posZ])
{ color(colGreen)
linear_extrude(thick)
arc(radius, [0, 60], width, fn);
color(colYellow)
linear_extrude(thick)
arc(radius, [60, 180], width, fn);
color(colGreen)
linear_extrude(thick)
arc(radius, [180, 240], width, fn);
color(colYellow)
linear_extrude(thick)
arc(radius, [240, 360], width, fn);

   color(colCupper)
     linear_extrude(10, center=true, convexity=10, $fn=100)
       circle(d=1.24);
 }

}
else  // vanliga kablar 1.5mm2
{
cableColor = colorName == "blå" ? "#1870D5"
: colorName == "brun" ? "#9C6137"
: colorName == "svart" ? "#000000"
: assert(false,"invalid color value");  // message if no
case worked
// : nodef

 translate([posX, posY, posZ])
 {             //el kabel - ena änden rak - andra böjd
   color(colCupper)    //kopparstump tråd rakkabel
     linear_extrude(10, center=true, convexity=10, $fn=100)
       circle(d=1.24);

    color(cableColor)
    { cylinder(h=thick, r=radius);

     translate([-radius*2, 0, thick])  // kabelböj
     rotate([90, 0, 0])
     rotate_extrude(angle=90, convexity=20)
       translate([2.5, 0, 0])
         circle(r=1.26);

     translate([-radius*2, 0, thick+radius*2])
       rotate([0, -90, 0])
       cylinder(h=5, r=radius);
   }
   translate([-10, 0, thick+radius*2])
   { rotate([0, -90, 0])
     { color(colCupper)
       { linear_extrude(5, center=true, convexity=10, $fn=100)
           circle(d=1.24);
       }
     }
   }
 }

}
}

//

---====
module arc(radius, angles, width = 1, fn = 24) {
difference() {
sector(radius + width, angles, fn); // ytterradie
sector(radius, angles, fn);        // innerradie (plockar bort
invändigt
}
}

module sector(radius, angles, fn = 24) {
r = radius / cos(180 / fn);
step = -360 / fn;

 points = concat([[0, 0]],
     [for(a = [angles[0] : step : angles[1] - 360])
         [r * cos(a), r * sin(a)]
     ],
     [[r * cos(angles[1]), r * sin(angles[1])]]
 );

 difference() {
     circle(radius, $fn = fn);
     polygon(points);
 }

}
= = END product 2 = = = = = = = = = = = = = = = = = = = = = = = = = = = =
= =

  • . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . -
    . _ . - . _ . - . _ . - . _ . -

Den fredag 6 maj 2022 14:06:55 CEST, Michael Möller <
private2michael@gmail.com> skrev:

OpenSCAD code - is a description of your model in terms of a few
cylinder/cubes added and cut out
difference() {
cylinder(d=5,h=10);
translate([0,10,0]) cube([4,6,2]) ;
}

STL file is a list of triangles which make the same outer shell as your
model. OpenSCAD makes this complicated transform from shapes to triangles.
solid OpenSCAD_Model
facet normal 0.92388 0.382682 0
outer loop
vertex 2.5 0 3
vertex 1.76777 1.76777 0
vertex 1.76777 1.76777 3
endloop
endfacet
facet normal 0.92388 0.382682 0
outer loop
vertex 1.76777 1.76777 0
vertex 2.5 0 3
vertex 2.5 0 0
endloop
endfacet
: (and so on for 300 lines) There is a binary/compressed version, but
the description is still just triangles.

Gcode is what a 3D printer understands - it is the exact list of moves
that the head has to do with how much plastic to squeeze to trace the
outline of your shape, layer, by layer. It will optionally create moves for
filling the inside or support for overhangs. Such a program is called a
SLICER and the printer will come with one.
G92 E0 ; reset extrusion distance
G1 Z2.330 F6600.000 ; lift Z
G1 X-0.000 Y1.505 F6600.000 ; move to first perimeter point
G1 Z0.330 F6600.000 ; restore layer Z
G1 E3.00000 F2400.00000 ; unretract extruder 0
G1 F1500
G1 X-1.064 Y1.064 E3.09259 ; perimeter
G1 X-1.505 Y0.000 E3.18517 ; perimeter
: (many similar lines)
G1 X1.515 Y1.515 E4.65860 ; perimeter
G1 X0.055 Y2.120 E4.78559 ; perimeter
G1 X-0.000 Y2.143 F6600.000 ; move inwards before travel
G1 X0.384 Y0.843 F6600.000 ; move to first infill point
G1 F1500
G1 X0.843 Y0.384 E4.84815 ; infill
G1 X1.097 Y-0.229 E4.91215 ; infill
:
(and so on for thousands of lines)

The 3MF still basically deals in triangles, and attributes (surface,
infill material, picture, ticket info ... ) which probably are not used by
your slicer/printer.

On Fri, 6 May 2022 at 12:37, Jan Öhman via Discuss <
discuss@lists.openscad.org> wrote:

---------- Forwarded message ----------
From: "Jan Öhman" jan_ohman@yahoo.com
To: OpenSCAD General Discussion discuss@lists.openscad.org
Cc:
Bcc:
Date: Fri, 6 May 2022 10:38:46 +0000 (UTC)
Subject: [OpenSCAD] Export to .STL / .3MF for later 3D-printing.
Hi!

Thought to create some objects in openSCAD, to print later.
I do not have my own 3D printer (yet).

One I talked to, wanted to get the drawings in .STL or .3MF. (I don't know
the difference).

If I had my own printer, have I been able to print directly from openSCAD?
(Without some export?)

In the openSCAD, no errors or problems occur.
but
The drawings I tested to export from openSCAD have given one or another
error message.
One message .:
WARNING: Object may not be a valid 2-manifold and may need repair!

Another message .:
WARNING: No top level geometry to render

What to do?

---------- Forwarded message ----------
From: "Jan Öhman via Discuss" discuss@lists.openscad.org
To: OpenSCAD General Discussion discuss@lists.openscad.org
Cc: "Jan Öhman" jan_ohman@yahoo.com
Bcc:
Date: Fri, 6 May 2022 10:38:46 +0000 (UTC)
Subject: [OpenSCAD] Export to .STL / .3MF for later 3D-printing.


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org

---------- Forwarded message ----------
From: "Jan Öhman via Discuss" discuss@lists.openscad.org
To: OpenSCAD general discussion discuss@lists.openscad.org
Cc: "Jan Öhman" jan_ohman@yahoo.com
Bcc:
Date: Sat, 7 May 2022 11:04:31 +0000 (UTC)
Subject: [OpenSCAD] Re: Export to .STL / .3MF for later 3D-printing.


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org

Quite a long code. Can you paste a picture of what you are trying to draw. Regards Sanjeev On Sat, 7 May 2022, 16:31 Jan Öhman via Discuss, <discuss@lists.openscad.org> wrote: > > > > ---------- Forwarded message ---------- > From: "Jan Öhman" <jan_ohman@yahoo.com> > To: OpenSCAD general discussion <discuss@lists.openscad.org> > Cc: > Bcc: > Date: Sat, 7 May 2022 11:04:31 +0000 (UTC) > Subject: [OpenSCAD] Re: Export to .STL / .3MF for later 3D-printing. > Thank you! > Begins to understand how it works. (It was not easy...) > > but my solution was not good ... > > Here are 2 files that do not work to render (F6) > > > = = product 1= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = > = = > - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - > . _ . - . _ . - . _ . - . _ . - > > > include <BOSL2/std.scad> > fn = 150; > > placering="left"; > // placering="right" > > box(0, 0, 0, placering, "#C0C0C0", fn); // (X, Y, Z, left/right, colorName) > > > // Monteringsplattan > // mountingPlate(0, 0, 0, placering); > > > // LED belysning > // LEDlampa(0, 0, 0, placering); > > > // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - > // - - - - m o d u l e r - - - - - - - - - - - - - - - - - - > > > > //================================================================================== > //====== box > ===================================================================== > module box(posX=0, posY=0, posZ=0, mountSide="left", colorName="#00FF00", > fn=24) > { > side = mountSide == "left" ? 0 > : mountSide == "right" ? 1 > : assert(false,"invalid moutSide value"); // message if no case > worked > > color(colorName) > translate([posX, posY, posZ]) > mirror([side, 0, 0]) > difference() > { > union() > { > // Skapa konturer på bottenplattan - x, y, r, angles, [grader], början > // Rotation medurs - vänster lamphållare (bakant saknas) > points1 = circSect( 140, 0, 0, [0, 0], "right", 1, fn); // böj nere > till höger > points2 = circSect( 60, 5, 5, [0, 5], "bottom", 1, fn); // > brytpunkt längst ned > points3 = circSect( 10, 13, 10, [0, 90], "bottom", 1, fn); // böj nere > till vänster > points4 = circSect( 5, 80, 5, [0, 90], "left", 1, fn); // böj uppe > till vänster > points5 = circSect( 140, 80, 5, [0, 1], "top", 1, fn); // böj uppe > till höger > edge = concat(points1, points2, points3, points4, points5); > path = path3d(reverse(edge)); > section = wall(); > path_sweep( section, path, closed=false); > > > // Skapa bakkant lite högre och smalare i topp > bottom1 = concat(points5, points1); > polygon(bottom1); > path1 = path3d(reverse(bottom1)); > section1 = wall1(); // lite högre bakvägg wall(b=4, f=8, h=15, t=3.5) > path_sweep( section1, path1, closed=false); > > // fyll upp bottenplattansbaksida > linear_extrude(4) // Bottomplate - fill up > polygon(concat(points1, points2, points3, points4, points5)); > > > // skapa Utskjutande del under (tänk spegelvänt) > pt1 = circSect( 19.5, 85, 0, [0, 50], "top", 1, fn); // Uppe till > höger - moturs > pt2 = circSect( 39, 1.35, .1, [-5, 90], "right", 1, fn); // Nere till > höger > pt3 = circSect( 10, 13.05, 10, [0, 90], "bottom", 1, fn); // Nere > till vänster > pt4 = circSect( 5, 80, 5, [0, 90], "left", 1, fn); // Uppe till > vänster > translate([0, 0, -2]) > linear_extrude(2.1) > polygon(concat(pt1, pt2, pt3, pt4)); > > // utgången för kabeln på baksidan (diam 10mm) - pekar lite nedåt > cableExit(65, 35, 0, 15, "cyan", $fn=100); > } > > // skapa ett borrhål i bakkant > translate([132,60,15]) > { rotate([0, 90, 0]) > { cylinder(h=10, d=2, $fn=100); > cylinder(h=4, d=9, $fn=100); > } > } > > // skapa en borrmarkering i bakkant > translate([139,25,15]) > { rotate([0, 90, 0]) > cylinder(h=2, d1=1, d2=2.5, $fn=100); > } > > > // ingravera årtalet på baksidan > translate([10, 80, -0.5]) > { mirror([side, 0, 0]) > { rotate([0, 180, 0]) > { linear_extrude(3) > text("2022", size=12, direction="ttb", font="Comic Sans > MS:style=Bold"); > } > } > } > > /* > // Markera skruvhål på bakkant > borr=3; > bredd=140; > hojd=8; > avstNed=20; > translate([bredd, avstNed, hojd]) > { rotate([0,90,0]) > cylinder(h=2, d1=0.5, d2=borr, center=true, $fn=50); > } > */ > > // borrhål > mountingHole(20, 36, 0, 7, 90.1, 15); // posX, posY, posZ, diam, dist, > deep, $fn=50 > > } > } > //======== Slut box > ============================================================== > > > > //================================================================================== > //====== cableExit > =============================================================== > module cableExit(posX, posY, posZ, angle, colorName) > { diamHole = 7; > diamHolder = 9.8; > hight = 12; > topRad = diamHolder/2; > topDiam = diamHolder/2-topRad/2; > bowRad = 7; > offs1 = 0.1; > > color(colorName) > translate([posX, posY, posZ]) > { rotate([180, 0, 180-angle]) > { difference() > { hull() > { cylinder(h=hight, d=diamHolder, center=false); > translate([0, 0, hight]) // rundad topp > rotate_extrude(angle=360, convexity=2) > translate([topDiam, 0, 0]) // yttre diam topp > circle(d=topRad); // radie topp > } > > > inpHight = 2; // ett värde som styr var utgångshålet hamnar > translate([0, 0, -offs1]) > cylinder(h=inpHight+offs1, d=diamHole, center=false); // > Bottenhål > > translate([-bowRad, 0, inpHight-offs1]) // böjen > { rotate([90, 0, 0]) > rotate_extrude(angle=90, convexity=10) > translate([bowRad, 0, 0]) // ställ in radien på kabelböjen > circle(d=diamHole); > } > } > } > } > } > //====== slut cableExit > ========================================================== > > > > //================================================================================== > //====== mountingHole > ============================================================ > module mountingHole(posX=0, posY=0, posZ=0, diam=7, dist=90, deep=5, > $fn=50) > { // diam = 6; // [mm] > // dist = 90; // [mm] > // deep = 12; // [mm] > > translate([posX, posY, posZ]) > { translate([0, 0, -10]) > cylinder(h=deep, d=diam); // fästhål 1 > > //cableHold1(dist/2, 0, .2, "#D5D5D5"); // Kabelgenomföring > translate([dist/2, 0, 0]) > { hull() > { cylinder(h=5, d=6); // fästhål 1 > sphere(d=7.5); > } > } > > translate([dist, 0, -10]) > cylinder(h=deep, d=diam); // fästhål 2 > } > } > //====== slut mountingHole > ======================================================= > > > > //================================================================================== > //====== LEDlampa > ================================================================ > // module LEDlampa(posX=8, posY=10, posZ=0) > module LEDlampa(posX=0, posY=0, posZ=0, mountSide="left") > { side = mountSide == "left" ? 0 > : mountSide == "right" ? 1 > : assert(false,"invalid moutSide value"); // message if no case > worked > > xpos = mountSide == "left" ? 121 > : mountSide == "right" ? -10 > : assert(false,"invalid moutSide value"); // message if no case > worked > /* > ypos = mountSide == "left" ? 10.5 > : mountSide == "right" ? 10.5 > : assert(false,"invalid moutSide value"); // message if no case > worked > > zpos = mountSide == "left" ? 5 > : mountSide == "right" ? 5 > : assert(false,"invalid moutSide value"); // message if no case > worked > */ > // echo(xpos,ypos,zpos); > // translate([xpos, ypos, zpos]) > translate([xpos, 10.5, 5]) > mirror([1, 0, 0]) > translate([posX, posY, posZ]) > { LEDbottom(); > translate([0, 0, 11]) > LEDglas(); > } > } > //====== Slut LEDlampa > =========================================================== > > > > //================================================================================== > //====== LEDglas > ================================================================= > module LEDglas() > { > // Variabler botten > length = 111; // längd mm > wideMid = 50.5; // bredd i mitten mm > > cornRad = 10; // Radien i alla hörn > wideCorn = 48; // Bredd i kanterna > > diamHole = 6; // håldiameter i mm > > colorBot = "gray"; > colorTop = "orange"; > > // Variabler top > cornHigh = 5; //Höjd i ändarna > midHigh = 8; > highTop = cornHigh + 1; // höjd mm > > p1tx = 10; // the start value > p1ty = 49.25; > p2tx = 55.5; // the middle value > p2ty = 50.5; > p3tx = 101; // the end value > p3ty = p1ty; > > p4tx = 101; // the start value > p4ty = 1.25; > p5tx = 55.5; // the middle value > p5ty = 0.0; > p6tx = 10; // the end value > p6ty = p4ty; > // Ger ovalt glas > points1 = 3points_arc([p1tx,p1ty], [p2tx,p2ty], [p3tx,p3ty], fn=100); > points2 = 3points_arc([p4tx,p4ty], [p5tx,p5ty], [p6tx,p6ty], fn=100); > > color("orange") > linear_extrude(height=cornHigh+.1) > difference() > { polygon(concat(points1, points2)); > > translate([length-10 , wideMid / 2, -.2]) > circle(d=6); > translate([10 , wideMid / 2, -.2]) > circle(d=6); > } > > // Top > color(colorTop) > difference() > { hull() > { // hörn1 > translate([cornRad, wideMid - ((wideMid-wideCorn)/2) - cornRad, 0]) > // [10,39] > cylinder(h=cornHigh, d=cornRad*2, center=false); > // hörn2 > translate([cornRad, cornRad + ((wideMid-wideCorn)/2), 0]) > // [10,12] > cylinder(h=cornHigh, d=cornRad*2, center=false); > // hörn3 > translate([length - cornRad, wideMid - ((wideMid-wideCorn)/2) - > cornRad, 0]) // [101 ,39] > cylinder(h=cornHigh, d=cornRad*2, center=false); > // hörn4 > translate([length - cornRad, cornRad + ((wideMid-wideCorn)/2), 0]) > // > cylinder(h=cornHigh, d=cornRad*2, center=false); > } > > union() > { // Monteringshål 1 & 2 > translate([length-10 , wideMid / 2, -.2]) > cylinder(d=diamHole, h=highTop+.5, center=false); > translate([10 , wideMid / 2, -.2]) > cylinder(d=diamHole, h=highTop+.5, center=false); > } > } > } > //======== Slut LEDglas > ========================================================== > > > > //================================================================================== > //====== LEDbottom > =============================================================== > module LEDbottom() > { p1x = 10; // the start value > p1y = 49.25; > p2x = 55.5; // the middle value > p2y = 50.5; > p3x = 101; // the end value > p3y = p1y; > > p4x = 101; // the start value > p4y = 1.25; > p5x = 55.5; // the middle value > p5y = 0.0; > p6x = 10; // the end value > p6y = p4y; > > // Variabler botten för borrhålen > length = 111; // längd mm > wideMid = 50.5; // bredd i mitten mm > diamHole = 6; // håldiameter i mm > cornHigh = 5; //Höjd i ändarna > midHigh = 8; > highTop = cornHigh + 1; // höjd mm > // offs1 = 0.1; > heightHole = 15; //mm > height = 11; //mm > > points1 = circSect( 10, 11.25, 10, [0, 90], "bottom", 1, fn); // Hörn > nere till vänster > points2 = circSect( 10, 39.25, 10, [0, 90], "left", 1, fn); // Hörn > uppe till vänster > points3 = 3points_arc([p1x,p1y], [p2x,p2y], [p3x,p3y], fn); > points4 = circSect( 101, 39.25, 10, [0, 90], "top", 1, fn); // Hörn > uppe till höger > points5 = circSect( 101, 11.25, 10, [0, 90], "right", 1, fn); // Hörn > nere till höger > points6 = 3points_arc([p4x,p4y], [p5x,p5y], [p6x,p6y], fn); > > // The base plate for the LED lamp > > > difference() > { color("gray", 0.5) > linear_extrude(height=height) > polygon(concat(points1, points2, points3, points4, points5, > points6)); > > > // union() > { // Monteringshål 1 & 2 > translate([length-10 , wideMid / 2, -.2]) > cylinder(d=diamHole, h=heightHole, center=false); > translate([10 , wideMid / 2, -.2]) > cylinder(d=diamHole, h=heightHole, center=false); > } > } > } > //======== Slut LEDbottom > ======================================================== > > > > > //================================================================================== > //====== circleSect > ============================================================== > // Create rounded corners 2D > // https://openhome.cc/eGossip/OpenSCAD/SectorArc.html > // ange .: x, y, radien, > // [från, till] vinkel, > // var vinkeln startar, (left, bottom, right, top) > // vilken rotation (-1=medsol, 1=motsols) > function circSect(x=0, y=0, radius=10, angles=[0,270], startRef="bottom", > rotate=1, fn=24) = > let( > startAngel = (startRef == "left") ? 0 > : (startRef == "bottom") ? 90 > : (startRef == "right") ? 180 > : (startRef == "top") ? 270 > : startRef, // valfri vinkel > // : assert(false,"invalid moutSide value"); // Error > message if no case worked > //: undef, > r = radius, > //r = radius / cos(180 / fn), > step = 360 / fn, > // points = [[x, y], > points = [ > for(a = [angles[0]-startAngel : step : angles[1]-startAngel]) > [-rotate * r * cos(a)+x, r * sin(a)+y]] > ) points; > //======== Slut circleSect > ======================================================= > > > > //================================================================================== > //====== 3points_arc > ============================================================= > // Create an arc with three points 2D > function 3points_arc(p0, p1, p2, fn=10) = > // an alternative expression for D > // D = 2 * ( (p1-p0).x * (p2-p0).y - (p1-p0).y * (p2-p0).x ) > let( D = 2 * cross(p1-p0, (p2-p0)) ) > assert( abs(D)>1e-9, "The 3 points should not be collinear." ) > let( > Ux = ( (p2-p0).y*(p1-p0)*(p1-p0) - (p1-p0).y*(p2-p0)*(p2-p0) )/D, > Uy = ( (p1-p0).x*(p2-p0)*(p2-p0) - (p2-p0).x*(p1-p0)*(p1-p0) )/D, > radius = norm([Ux,Uy]), > center = [Ux,Uy] + p0, > ang0 = atan2( (p0-center).y, (p0-center).x ), > ang2 = atan2( (p2-center).y, (p2-center).x ), > // the points are in a cw winding iff D<0 > // the angular difference between vectors p2-center and p0-center > // measured from p0-center; dang is positive iff D is negative > dang = D<0 ? ang2<ang0 ? ang2-ang0 : ang2-ang0-360 > : ang2>ang0 ? ang2-ang0 : ang2-ang0+360 > ) > [ for(i=[0:fn-1]) > let( ang = ang0 + i*dang/(fn-1) ) > center + radius*[cos(ang),sin(ang)] ]; > //======== Slut 3points_arc > ====================================================== > > > > //================================================================================== > //====== Wall som ett "L" > ======================================================== > // Normal vägghöjd > function wall() = > let( > b = 4, // botten - tjocklek > f = 8, // Foten > h = 15, // Höjd > t = 3.5, // Top > x = (b+(t/2) - (h - ( (-h / (f-t)) *t) )) / (-h / (f-t)) > ) > let( > points = [[0,0], [f,0], [t,h], [0,h]] , > top = move([t/2, h, 0], circle(d=t, $fn=20)), > sqr = square([10, b]), > diff = > difference([ > move([x, b], square([t/2, t/2])), > move([x+(t/2), b+(t/2), 0], circle(d = t, $fn=20) ) ]) > ) > union([points, top, sqr, diff]); > //======== Slut Wall > ============================================================= > > > > > //================================================================================== > //====== Wall1 som ett "L" > ======================================================= > // En högre vägg > function wall1() = > let( > b = 4, // botten - tjocklek > f = 7, // Foten > h = 25, // Höjd > t = 3, // Top > x = (b+(t/2) - (h - ((-h / (f-t)) *t))) / (-h / (f-t)) > ) > let( > points = [[0,0], [f,0], [t,h], [0,h]] , > top = move([t/2, h, 0], circle(d=t, $fn=20)), > sqr = square([10, b]), > diff = > difference([ > move([x, b], square([t/2, t/2])), > move([x+(t/2), b+(t/2), 0], circle(d = t, $fn=20) ) ]) > ) > union([points, top, sqr, diff]); > //======== Slut Wall1 > ============================================================ > > > > //================================================================================== > //====== Plåt på släp > ============================================================ > module mountingPlate(posX=0, posY=0, posZ=0, mountSide="left", > colorName="#C0C0C0", $fn=50) > { // Hörnpositionerna > posX1 = 120; > posY1 = 0; > posX2 = posX1; > posY2 = -200; > posX3 = 120 - 75; > posY3 = -200; > posX4 = 0; > posY4 = 0; > thick=2; // tjocklek > > side = mountSide == "left" ? 0 > : mountSide == "right" ? 1 > : assert(false,"invalid moutSide value"); // message if no case > worked > > xpos = mountSide == "left" ? 20 > : mountSide == "right" ? -20 > : assert(false,"invalid moutSide value"); // message if no case > worked > /* > ypos = mountSide == "left" ? 85 > : mountSide == "right" ? 85 > : assert(false,"invalid moutSide value"); // message if no case > worked > > zpos = mountSide == "left" ? -thick > : mountSide == "right" ? -thick > : assert(false,"invalid moutSide value"); // message if no case > worked > */ > color(colorName) > { translate([posX, posY, posZ]) > translate([xpos, 85, -thick]) > { mirror([side, 0, 0]) > { linear_extrude(thick) > hull() > { translate([posX1, posY1, 0]) > square(0.1, center = true); > translate([posX2, posY2, 0]) > square(0.1, center = true); > translate([posX3, posY3, 0]) > square(0.1, center = true); > translate([posX4, posY4, 0]) > square(0.1, center = true); > } > } > } > } > } > = = END product 1= = = = = = = = = = = = = = = = = = = = = = = = = = = = > = = > - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - > . _ . - . _ . - . _ . - . _ . - > > > > > = = product 2 = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = > = = > - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - > . _ . - . _ . - . _ . - . _ . - > > $fn=100; > //$fn=15; > > //switch(); > //cableHolder4(); //Switchboxen > > > // cableHolder3(0, 0, 0, 33.5, 23.5, 1.5, 2); > // showCables(); > > > > module cableHolder4(fn=24); > { // idé från > // - https://www.thingiverse.com/thing:6400/files > // - > https://ihrchive.wordpress.com/2011/02/14/openscad-tip-round-1-of-3-basic-rounding/ > > // mått på Switch > heightHold = 10.5; > widthHold = 33.5; > depthHold = 23.5; > spaceHold = 10.0; // utrymmet bakom switch > holdRadie = 2; // radie i hörnen > thick = 2; > offset1=0.5; // öka toleransen > > // innermått > holeW = widthHold + offset1; > holeH = heightHold + offset1; > holeD = depthHold + spaceHold+offset1; > > // yttermått > pad = 0.1; // Padding to maintain manifold > box_l = holeW + thick*2; // Bredden på switchen > box_w = holeD + thick; // Djupet på switchen > box_h = holeH + thick; // Height > round_r = holdRadie; // Radius of round > smooth = 45; // Number of facets of rounding cylinder > > > > difference() > { union() // Detta utförs i två steg. > { difference() // utför fasningar och kabelmarkeringar > { mainBox(box_l, box_w, box_h, spaceHold+thick, round_r, thick, > smooth, pad); > > // fasning vänster (underkant) > translate([box_l/2-0.85, spaceHold-4.3, thick-offset1]) // > sidled, fram/bak , upp/ned > rotate([0,180,45]) > cylinder(h=thick, d1=holeW*1.414-thick-thick, d2=holeW*1.414, > $fn=4); > > // fasning höger (underkant) > translate([box_l/2-3.65, spaceHold-4.3, thick-offset1]) // sidled, > fram/bak , upp/ned > rotate([0,180,45]) > cylinder(h=thick, d1=holeW*1.414-thick-thick, d2=holeW*1.414, > $fn=4); > > // kabelgenomföringar > rotate([90, 180, 90]) // Markering ena sidan (vänster under) > ovalCableHole(spaceHold/2-offset1, -1.75, -1.2); > > rotate([90, 180, 180]) // Markering bakkant (vänster under) > ovalCableHole(spaceHold/2-1.55, -1.75, -spaceHold-0.85); > > rotate([90, 180, 180]) // Markering bakkant (höger under) > ovalCableHole(widthHold-spaceHold/2-offset1, -1.75, > -spaceHold-0.85); > > rotate([90, -180, 90]) // Markering ena sidan (höger under) > ovalCableHole(3.75, -1.75, widthHold-0.1); > } > } // Slut union - kropp > > translate([-offset1/2, -spaceHold+pad, -pad]) // hålet där switchen > ska placeras > cube([holeW, holeD+pad, holeH+pad], center=false); > > translate([4, 12, 0]) > cylinder(h=15,d=3.2); > translate([4, 12, 17.7]) > sphere(r=6); > > translate([29.6, 12, 0]) > cylinder(h=15,d=3.2); > translate([29.6, 12, 17.7]) > sphere(r=6); > > /* // Hål genom lock bak - om så önskas > translate([box_l/2-thick, -6, offset1/2]) > cylinder(h=box_h+thick*4+offset1, d=3.2, $fn=100); // hål genom > lock bak > > translate([box_l/2-thick, -6, 17.7]) > sphere(r=6); // kona hålet bak > */ > } // Slut difference() - box > > difference() > { union() > { translate([29.6, 12, heightHold-offset1*2]) > cylinder(h=2,d=5.2); // Stödhylsa för Switchskruv1 > translate([4, 12, heightHold-offset1*2]) > cylinder(h=2,d=5.2); // Stödhylsa för Switchskruv2 > > translate([holeW/2, -spaceHold+thick+1, holeH/2]) > rotate([180,0,0]) > backHole(); > } // union - slut > > translate([4, 12, 0]) // Hålen i stödhylsorna > cylinder(h=15,d=3.2); > > translate([29.6, 12, 0]) // Hålen i stödhylsorna > cylinder(h=15,d=3.2); > > translate([box_l/2-thick, -6, -offset1]) // hål i stödhylsa bak > cylinder(h=box_h+offset1, d=3.2, $fn=100); > > // Sänk stödhylsan > translate([ widthHold/2-7, -spaceHold-offset1, -thick+offset1]) // > hål i stödhylsa bak > cube([15, 8, 3]); > > > // kabelmarkering > // translate([0, 0, 0]) // hål i stödhylsa bak > > > } > > > > > > > /* > translate([4, 12, 0]) > #cylinder(h=15,d=3.2); > //translate([4, 13.5, 17.3]) > //#sphere(r=6); > > translate([29.6, 12, 0]) > #cylinder(h=15,d=3.2); > //translate([29.6, 13.5, 17.3]) > //#sphere(r=6); > */ > > > } > > module backHole() > { wallH = 10.5; > > wide1 = 12; // endast runt cylindern > wide2 = 35; // hela väggen > deep1 = 4; > height1 = 10.5; > cornRad1 = 2; > diam1 = 8; > opt1 = 0.1; > > //rundadFot(); > > > // Rundad stäcka mellan t.ex. vägg och tak -bakkant > translate([wide2/2, diam1/2-cornRad1/2, -height1/2]) > { rotate([90, 0, -90]) > { linear_extrude(wide2) > { difference() > { square([cornRad1, cornRad1]); > > translate([cornRad1, cornRad1]) > circle(r=cornRad1); > } > } > } > } > > // rundad stäcka1 (vänster) mellan t.ex. vägg och tak > translate([-wide2/2+0.15, deep1/2+cornRad1/2, -height1/2]) > rotate([90, 0, 0]) > { linear_extrude(spaceHold) > { difference() > { square([cornRad1, cornRad1]); > > translate([cornRad1, cornRad1]) > circle(r=cornRad1); > } > } > } > > // rundad stäcka2 mellan t.ex. vägg och tak > translate([wide2/2-0.65, deep1/2+cornRad1/2, -height1/2]) > rotate([0, -90, 90]) > { linear_extrude(spaceHold) > { difference() > { square([cornRad1, cornRad1]); > > translate([cornRad1, cornRad1]) > circle(r=cornRad1); > } > } > } > > // Skapa stödfot - bak > difference() > { union() > { //själva cylindern > translate([0, 1, 0]) > { cylinder(h=height1, d=diam1, center=true); > translate([0, diam1/2, 0]) > cube([diam1,diam1-1,height1], center=true); > } > > // Rundad fot under cylinder ovan > translate([0, 1, -height1/2]) > { rotate_extrude() > { translate([diam1/2, 0, 0]) > { difference() > { square([cornRad1, cornRad1]); > > translate([cornRad1, cornRad1]) > circle(r=cornRad1); > } > } > } > } > > // Rundad rakstäcka1 - cylinderfot - mellan t.ex. vägg och tak > translate([diam1/2, diam1, -height1/2]) > { rotate([90, 0, 0]) > { linear_extrude(diam1) > { difference() > { square([cornRad1, cornRad1]); > > translate([cornRad1, cornRad1]) > circle(r=cornRad1); > } > } > } > } > > // Rundad rakstäcka2 - cylinderfot - mellan t.ex. vägg och tak > translate([-diam1/2, diam1, -height1/2]) > { rotate([0, -90, 90]) > { linear_extrude(diam1) > { difference() > { square([cornRad1, cornRad1]); > > translate([cornRad1, cornRad1]) > circle(r=cornRad1); > } > } > } > } > > //väggen bakom cylindern som ska rundas > translate([0, diam1/2-cornRad1, 0]) > cube([wide1, cornRad1, height1], center=true); > > } > > > // Avrunda hörn1 bak > translate([-wide1/2, cornRad1/2, cornRad1]) > { hull() > { cylinder(h=height1+opt1, r=cornRad1, center=true); > { translate([0, 0, -height1/2]) > sphere(r=cornRad1); > } > } > } > > // Avrunda hörn2 bak > translate([wide1/2, cornRad1/2, cornRad1]) > { hull() > { cylinder(h=height1+opt1, r=cornRad1, center=true); > { translate([0, 0, -height1/2]) > sphere(r=cornRad1); > } > } > } > > > // Plocka bort rundad fot bak samt det som sticker ut > translate([-wide1/2, diam1/2-cornRad1/2, -height1/2-opt1]) > cube([wide1, diam1/2+cornRad1, height1+opt1*2], center=false); > > } > } > > > > > > module ovalCableHole(posX, posY, posZ) > { // Hål 5.5 x 3.5 mm > pan = 0.1; > cableHi = 1.5; > > translate([posX, posY, posZ]) > { color("white") > { translate([0, 0, -pan]) > { cylinder(h=cableHi, d=3.5); > //#translate([0, 0, 0]) cylinder(h=10, d=1); > //translate([0, 0, -1]) cylinder(h=1, d1=0, d2=1); > //translate([0, 0, 0]) sphere(d=1); // Inre kulan > //translate([0, 0, 1.5]) sphere(d=1); // Inre kulan > > translate([0, 0, -1]) sphere(d=0.8); // yttre kulan > translate([0, 0, 2.5]) sphere(d=0.8); // yttre kulan > > } > translate([2, 0, -pan]) > { cylinder(h=cableHi, d=3.5); > // #translate([0, 0, -cableHi*2]) cylinder(h=10, d=0.5); > //translate([0, 0, 0]) sphere(d=1); // Inre kulan > //translate([0, 0, 1.5]) sphere(d=1); // Inre kulan > > translate([0, 0, -1]) sphere(d=0.8); // yttre kulan > translate([0, 0, 2.5]) sphere(d=0.8); // yttre kulan > > } > translate([-3.5/2, 0, -pan]) > cube([5.5, 3.5/2, cableHi]); > translate([-0.25, -1.74, -pan]) > cube([2.5, 1.75, cableHi]); > } > } > } > > > > > > > module rundadFot() > { > // specifika värden för skruvdistansen bak > wallH = 10.5; > > wide1 = 12; // endast runt cylindern > wide2 = 34; // hela väggen > deep1 = 4; > height1 = 10; > cornRad1 = 2; > diam1 = 8; > opt1 = 0.1; > > > color("magenta") > { translate([0, 0, wallH]) > { difference() > { union() > { // Bakgavel > translate([wide2/2, opt1, height1/2]) > { rotate([90, 180, 0]) > cube([wide2, height1, opt1]); > } > > // Golv > translate([wide2/2, -height1+opt1, -height1/2]) > rotate([0, 180, 0]) > cube([wide2, height1, opt1]); > > //väggen bakom cylindern som kan rundas > translate([0, -cornRad1/2, 0]) > cube([wide1, cornRad1, height1], center=true); > > //själva cylindern > translate([0, -cornRad1/2, 0]) > cylinder(h=height1, d=diam1, center=true); > > // Rundad fot under cylinder ovan > translate([0, -cornRad1/2, -height1/2]) > { rotate_extrude() > { translate([diam1/2, 0, 0]) > { difference() > { square([cornRad1, cornRad1]); > > translate([cornRad1, cornRad1]) > circle(r=cornRad1); > } > } > } > } > > // Rundad stäcka mellan t.ex. vägg och tak -bakkant > translate([wide2/2, 0, -height1/2]) > { rotate([90, 0, -90]) > { linear_extrude(wide2) > { difference() > { square([cornRad1, cornRad1]); > > translate([cornRad1, cornRad1]) > circle(r=cornRad1); > } > } > } > } > > // rundad stäcka mellan t.ex. vägg och tak -sida1 > translate([-wide2/2, 0, -height1/2]) > { rotate([90, 0, 0]) > { linear_extrude(10) > { difference() > { square([cornRad1, cornRad1]); > > translate([cornRad1, cornRad1]) > circle(r=cornRad1); > } > } > } > } > > // rundad stäcka mellan t.ex. vägg och tak -sida2 > translate([wide2/2, -10, -height1/2]) > { rotate([90, 0, 180]) > { linear_extrude(10) > { difference() > { square([cornRad1, cornRad1]); > > translate([cornRad1, cornRad1]) > circle(r=cornRad1); > } > } > } > } > } // Avsluta union = = = = = = = = = = = = = = = = = = = = > > > // Avrunda hörn1 bak > translate([-wide1/2+opt1*1.3, -deep1/2, cornRad1]) > { cylinder(h=height1+opt1, r=cornRad1, center=true); > translate([0, 0, -height1/2]) > sphere(r=cornRad1); > } > > // Avrunda hörn2 bak > translate([wide1/2-opt1*1.3, -deep1/2, cornRad1]) > { cylinder(h=height1+opt1, r=cornRad1, center=true); > translate([0, 0, -height1/2]) > sphere(r=cornRad1); > } > > // Plocka bort rundad fot bak samt det som sticker ut > translate([-wide1/2, 0, -height1/2-opt1]) > cube([wide1, diam1/2+cornRad1, height1+opt1*2], center=false); > } > } > } > } > > > > > > > > > module mainBox(box_l, box_w, box_h, spaceHold, round_r, thick, smooth, pad) > { translate([box_l/2-thick-offset1/2, box_w/2-spaceHold, box_h/2]) > { > // To fix the corners cut the main cube with smaller cubes with > spheres removed > difference() > { cube([box_l, box_w, box_h], center = true); > > // Kant1 - liggande > translate([0, -box_w/2+round_r, box_h/2-round_r]) > { difference() > { translate([0,-round_r-pad,round_r+pad]) > cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center = > true); > rotate(a=[0,90,0]) > cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth); > } > } > // Kant2 - liggande > translate([0, box_w/2-round_r, box_h/2-round_r]) > { difference() > { translate([0,round_r+pad,round_r+pad]) > cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center = > true); > rotate(a=[0,90,0]) > cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth); > } > } > /* > // Kant3 - liggande > translate([0, -box_w/2+round_r, -box_h/2+round_r]) > { difference() > { translate([0,-round_r-pad,-round_r-pad]) > cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center = > true); > rotate(a=[0,90,0]) > cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth); > } > } > > // Kant4 - liggande > translate([0, box_w/2-round_r, -box_h/2+round_r]) > { difference() > { translate([0,round_r+pad,-round_r-pad]) > cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center = > true); > rotate(a=[0,90,0]) > cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth); > } > } > */ > // ---- > // Kant1 - stående > translate([-box_l/2+round_r, box_w/2-round_r, 0]) > { difference() > { translate([-round_r-pad,round_r+pad,0]) > cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center = > true); > cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth); > } > } > // Kant2 - stående > translate([box_l/2-round_r, box_w/2-round_r, 0]) > { difference() > { translate([round_r+pad,round_r+pad,0]) > cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center = > true); > cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth); > } > } > // Kant3 - stående > translate([-box_l/2+round_r, -box_w/2+round_r, 0]) > { difference() > { translate([-round_r-pad,-round_r-pad,0]) > cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center = > true); > cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth); > } > } > // Kant4 - stående > translate([box_l/2-round_r, -box_w/2+round_r, 0]) > { difference() > { translate([round_r+pad,-round_r-pad,0]) > cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center = > true); > cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth); > } > } > > // ---- > // Kant1 liggande (andra hållet) > translate([-box_l/2+round_r, 0, box_h/2-round_r]) > { difference() > { translate([-round_r-pad, 0, round_r+pad]) > cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center = > true); > rotate(a=[0,90,90]) > cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth); > } > } > // Kant2 liggande (andra hållet) > translate([box_l/2-round_r, 0, box_h/2-round_r]) > { difference() > { translate([round_r+pad, 0, round_r+pad]) > cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center = > true); > rotate(a=[0,90,90]) > cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth); > } > } > /* > // Kant3 liggande (andra hållet) > translate([-box_l/2+round_r, 0, -box_h/2+round_r]) > { difference() > { translate([-round_r-pad, 0, -round_r-pad]) > cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center = > true); > rotate(a=[0,90,90]) > cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth); > } > } > > // Kant4 liggande (andra hållet) > translate([box_l/2-round_r, 0, -box_h/2+round_r]) > { difference() > { translate([round_r+pad, 0, -round_r-pad]) > cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center = > true); > rotate(a=[0,90,90]) > cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth); > } > } > */ > // ---- > // Hörn1 (övre) > translate([box_l/2-round_r, box_w/2-round_r, box_h/2-round_r]) > { difference() > { translate([round_r+pad, round_r+pad, round_r+pad]) > cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = > true); > sphere(round_r,$fn=smooth); > } > } > // Hörn2 (övre) > translate([-box_l/2+round_r, box_w/2-round_r, box_h/2-round_r]) > { difference() > { translate([-round_r-pad, round_r+pad, round_r+pad]) > cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = > true); > sphere(round_r,$fn=smooth); > } > } > // Hörn3 (övre) > translate([box_l/2-round_r, -box_w/2+round_r, box_h/2-round_r]) > { difference() > { translate([round_r+pad, -round_r-pad, round_r+pad]) > cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = > true); > sphere(round_r,$fn=smooth); > } > } > // Hörn4 (övre) > translate([-box_l/2+round_r, -box_w/2+round_r, box_h/2-round_r]) > { difference() > { translate([-round_r-pad, -round_r-pad, round_r+pad]) > cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = > true); > sphere(round_r,$fn=smooth); > } > } > /* > // Hörn1 (undre) > translate([box_l/2-round_r, box_w/2-round_r, -box_h/2+round_r]) > { difference() > { translate([round_r+pad, round_r+pad, -round_r-pad]) > cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = > true); > sphere(round_r,$fn=smooth); > } > } > // Hörn2 (undre) > translate([-box_l/2+round_r, box_w/2-round_r, -box_h/2+round_r]) > { difference() > { translate([-round_r-pad, round_r+pad, -round_r-pad]) > cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = > true); > sphere(round_r,$fn=smooth); > } > } > // Hörn3 (undre) > translate([box_l/2-round_r, -box_w/2+round_r, -box_h/2+round_r]) > { difference() > { translate([round_r+pad, -round_r-pad, -round_r-pad]) > cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = > true); > sphere(round_r,$fn=smooth); > } > } > // Hörn4 (undre) > translate([-box_l/2+round_r, -box_w/2+round_r, -box_h/2+round_r]) > { difference() > { translate([-round_r-pad, -round_r-pad, -round_r-pad]) > cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = > true); > sphere(round_r,$fn=smooth); > } > } > */ > } > } > } > // > > > > > > > > > > > module cableHolder3(posX, posY, posZ, length, width, height, radius) > { // Skapa toppen över switchen > // mått på Switchen > fn = 96; // upplösning (endast bågen?) > heightHold = 10.5; > widthHold = 33.5; > depthHold = 23.5; > holdRadie = 1.5; // radie i hörnen > thick = 1.5; // tjocklek > > > translate([0,-thick,0]) > { > difference(0, 0, 0) > { hull() > { difference() > { translate([thick, 0, heightHold]) // vänster kant > { rotate([-90, 0, 0]) > { cylinder(h=depthHold, d=thick*2); > translate([0, 0, depthHold]) > sphere(d=thick*2); // längst fram > } > } > translate([0, -0.1, heightHold]) // plocka bort underdelen > rotate([-90, 0, 0]) > cube([thick*2, thick+.1, depthHold+thick+.1]); > } > > difference() > { translate([widthHold-thick, 0, heightHold]) // höger kant > { rotate([-90, 0, 0]) > { cylinder(h=depthHold, d=thick*2); > translate([0, 0, depthHold]) > sphere(d=thick*2); // längst fram > } > } > translate([widthHold-thick*2, -0.1, heightHold]) // plocka bort > underdelen > { rotate([-90, 0, 0]) > cube([thick*2, thick+.1, depthHold+thick+.1]); > } > } > } > > // öppna hålen för monteringsskruvarna uppe på plattan > translate([4, 13.5, 0]) > cylinder(h=15,d=3.2); > translate([4, 13.5, 17.3]) > sphere(r=6); > > translate([29.6, 13.5, 0]) > cylinder(h=15,d=3.2); > > translate([29.6, 13.5, 17.3]) > sphere(r=6); > } > > // halvbåge 1 bak > translate([thick, 0, heightHold/2+thick/2]) > rotate([0, 90, 180]) > rotate_extrude(angle = 180, convexity=20, $fn=64) > translate([heightHold/2-thick/2, 0, 0]) > circle(d=thick*2); > translate([thick, 0, heightHold]) > sphere(d=thick*2); // övre kulan > translate([thick, 0, thick]) > sphere(d=thick*2); // undre kulan > > > // halvbåge 2 bak > translate([widthHold-thick, 0, heightHold/2+thick/2]) > rotate([0, 90, 180]) > rotate_extrude(angle = 180, convexity=20, $fn=64) > translate([heightHold/2-thick/2, 0, 0]) > circle(d=thick*2); > translate([widthHold-thick, 0, heightHold]) > sphere(d=thick*2); // övre kulan > translate([widthHold-thick, 0, thick]) > sphere(d=thick*2); // undre kulan > > // en cylinder tvärsöver längst upp > translate([thick, 0, heightHold]) > { rotate([0,90,0]) > cylinder(h=widthHold-thick*2, r=thick); > } > } > > // Halvbågen (kabelhållaren) på baksidan switchen > translate([widthHold-thick, -thick, heightHold/2+thick/2]) > { rotate([0,90,180]) > linear_extrude(widthHold-thick*2) > arc(heightHold/2-thick/2, [0, 180], thick, fn); //radius, angles, > width, fn) > } > // en cylinder tvärsöver längst ned > translate([thick, -thick, thick]) > { rotate([0,90,0]) > cylinder(h=widthHold-thick*2, r=thick); > } > } > > > > module switch(posX=0, posY=0, posZ=0) > { buttRadie = 1.5; > height = 10.5; > width = 33.5; > depth = 23.5; > h1x = buttRadie; > h1y = buttRadie; > h2x = width-buttRadie; > h2y = buttRadie; > h3x = width-buttRadie; > h3y = depth-buttRadie; > h4x = buttRadie; > h4y = depth-buttRadie; > > translate([posX, posY, posZ]) > { difference() > { color("#F9F9F3") > // tryck-knappen > union() > { translate([width/2, depth+6-0.1, height/2]) > { rotate([90, 0, 0]) > { translate([0,0,6]) > circle(d=6.8); // skuggan runt knapp > cylinder(h=6, d=6); > sphere(d=6); > } > } > > hull() // Switchkropp > { translate([h1x, h1y]) > cylinder(h=height, r=1.5); > translate([h2x, h2y]) > cylinder(h=height, r=1.5); > translate([h3x, h3y]) > cylinder(h=height, r=1.5); > translate([h4x, h4y]) > cylinder(h=height, r=1.5); > } > } > > // Skruvhålen för switchen > hole( 4, 12, 0, "#FFD700", height); > hole(29.6, 12, 0, "#FFD700", height); > // hole( 4, 12, 0, "#FFD700", 50); > // hole(29.6, 12, 0, "#FFD700", 50); > // hål för kablar bak > color("gray") > { translate([9.5, 16, height/2]) > { rotate([90, 0, 0]) > cylinder(h=16.5, d=4); > } > translate([24.5, 16, height/2]) > { rotate([90, 0, 0]) > cylinder(h=16.5, d=4); > } > } > > // hål för kabelskruvar > color("white") > { translate([29.5, 17.1, height/2]) > { rotate([0, 90, 0]) > cylinder(h=4.1, d=4.5); > } > translate([-0.1, 17.1, height/2]) > { rotate([0, 90, 0]) > cylinder(h=4.1, d=4.5); > } > } > } > > // Kabelskruvar > cableScrew(3, 17, height/2, 90); > cableScrew(31, 17, height/2, -90); > > } > } > > // Skruven som håller fast kabeln i switchen > module cableScrew(posX=0, posY=0, posZ=0, angle=0) > { color("#FFD700") // mässing > translate([posX, posY, posZ]) > { rotate([0, 0, angle]) > { difference() > { // skruvskalle > translate([0, 0, 0]) > rotate([90, 0, 0]) > cylinder(h=2, d1=4, d2=3.5); > > // stjärnan i skruven > translate([0, 1.85, -.25]) > rotate([0, 0, 0]) > cylinder(h=0.5, d=5); > translate([-0.25, -.6, 2.25]) > rotate([0, 90, 0]) > cube([4.5, 2, 0.5]); > } > } > } > } > > > > // borrhål > module hole(posX=0, posY=0, posZ=0, colorName="yellow", height) > { diamHole1 = 3; > highHole1 = height; > diamHole2 = 6; > highHole2 = 2.5; > offs=0.1; > > color(colorName) > { > translate([posX, posY, posZ]) > { translate([0, 0, 0]) > cylinder(h=highHole1, d=diamHole1); > translate([0, 0, -offs]) > cylinder(h=highHole2, d=diamHole2); > translate([0, 0, height-highHole2+offs]) > cylinder(h=highHole2, d=diamHole2); > } > } > } > > module showCables() > { translate([-25,8,24]) > rotate([80,177,90]) > cable(10,10,0,"brun"); > translate([-43,8,15]) > rotate([90,180,90]) > cable(10,10,0,"blå"); > } > > > module cable(posX=0, posY=0, posZ=0, colorName="blå", radius=1.26, > width=0.62, thick=50, fn=24) > { // default 1.5mm2 > // radius = inner radie > // width = bredd/tjocklek på cirkeln (inte höjd) > // thick = höjd på cirken/ röret > // pin= > > colCupper = "#D7715A"; > colGreen = "#07DA63"; > colYellow = "#FFCC00"; > > if (colorName=="gröngul") > { translate([posX, posY, posZ]) > { color(colGreen) > linear_extrude(thick) > arc(radius, [0, 60], width, fn); > color(colYellow) > linear_extrude(thick) > arc(radius, [60, 180], width, fn); > color(colGreen) > linear_extrude(thick) > arc(radius, [180, 240], width, fn); > color(colYellow) > linear_extrude(thick) > arc(radius, [240, 360], width, fn); > > color(colCupper) > linear_extrude(10, center=true, convexity=10, $fn=100) > circle(d=1.24); > } > } > else // vanliga kablar 1.5mm2 > { > cableColor = colorName == "blå" ? "#1870D5" > : colorName == "brun" ? "#9C6137" > : colorName == "svart" ? "#000000" > : assert(false,"invalid color value"); // message if no > case worked > // : nodef > > translate([posX, posY, posZ]) > { //el kabel - ena änden rak - andra böjd > color(colCupper) //kopparstump tråd rakkabel > linear_extrude(10, center=true, convexity=10, $fn=100) > circle(d=1.24); > > color(cableColor) > { cylinder(h=thick, r=radius); > > translate([-radius*2, 0, thick]) // kabelböj > rotate([90, 0, 0]) > rotate_extrude(angle=90, convexity=20) > translate([2.5, 0, 0]) > circle(r=1.26); > > translate([-radius*2, 0, thick+radius*2]) > rotate([0, -90, 0]) > cylinder(h=5, r=radius); > } > translate([-10, 0, thick+radius*2]) > { rotate([0, -90, 0]) > { color(colCupper) > { linear_extrude(5, center=true, convexity=10, $fn=100) > circle(d=1.24); > } > } > } > } > } > } > > > // ====================================================================== > module arc(radius, angles, width = 1, fn = 24) { > difference() { > sector(radius + width, angles, fn); // ytterradie > sector(radius, angles, fn); // innerradie (plockar bort > invändigt > } > } > > module sector(radius, angles, fn = 24) { > r = radius / cos(180 / fn); > step = -360 / fn; > > points = concat([[0, 0]], > [for(a = [angles[0] : step : angles[1] - 360]) > [r * cos(a), r * sin(a)] > ], > [[r * cos(angles[1]), r * sin(angles[1])]] > ); > > difference() { > circle(radius, $fn = fn); > polygon(points); > } > } > = = END product 2 = = = = = = = = = = = = = = = = = = = = = = = = = = = = > = = > - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - > . _ . - . _ . - . _ . - . _ . - > > > Den fredag 6 maj 2022 14:06:55 CEST, Michael Möller < > private2michael@gmail.com> skrev: > > > > OpenSCAD code - is a description of your model in terms of a few > cylinder/cubes added and cut out > difference() { > cylinder(d=5,h=10); > translate([0,10,0]) cube([4,6,2]) ; > } > > STL file is a list of triangles which make the same outer shell as your > model. OpenSCAD makes this complicated transform from shapes to triangles. > solid OpenSCAD_Model > facet normal 0.92388 0.382682 0 > outer loop > vertex 2.5 0 3 > vertex 1.76777 1.76777 0 > vertex 1.76777 1.76777 3 > endloop > endfacet > facet normal 0.92388 0.382682 0 > outer loop > vertex 1.76777 1.76777 0 > vertex 2.5 0 3 > vertex 2.5 0 0 > endloop > endfacet > : (and so on for 300 lines) There is a binary/compressed version, but > the description is still just triangles. > > Gcode is what a 3D printer understands - it is the exact list of moves > that the head has to do with how much plastic to squeeze to trace the > outline of your shape, layer, by layer. It will optionally create moves for > filling the inside or support for overhangs. Such a program is called a > SLICER and the printer will come with one. > G92 E0 ; reset extrusion distance > G1 Z2.330 F6600.000 ; lift Z > G1 X-0.000 Y1.505 F6600.000 ; move to first perimeter point > G1 Z0.330 F6600.000 ; restore layer Z > G1 E3.00000 F2400.00000 ; unretract extruder 0 > G1 F1500 > G1 X-1.064 Y1.064 E3.09259 ; perimeter > G1 X-1.505 Y0.000 E3.18517 ; perimeter > : (many similar lines) > G1 X1.515 Y1.515 E4.65860 ; perimeter > G1 X0.055 Y2.120 E4.78559 ; perimeter > G1 X-0.000 Y2.143 F6600.000 ; move inwards before travel > G1 X0.384 Y0.843 F6600.000 ; move to first infill point > G1 F1500 > G1 X0.843 Y0.384 E4.84815 ; infill > G1 X1.097 Y-0.229 E4.91215 ; infill > : > (and so on for thousands of lines) > > The 3MF still basically deals in triangles, and attributes (surface, > infill material, picture, ticket info ... ) which probably are not used by > your slicer/printer. > > On Fri, 6 May 2022 at 12:37, Jan Öhman via Discuss < > discuss@lists.openscad.org> wrote: > > > > > ---------- Forwarded message ---------- > From: "Jan Öhman" <jan_ohman@yahoo.com> > To: OpenSCAD General Discussion <discuss@lists.openscad.org> > Cc: > Bcc: > Date: Fri, 6 May 2022 10:38:46 +0000 (UTC) > Subject: [OpenSCAD] Export to .STL / .3MF for later 3D-printing. > Hi! > > Thought to create some objects in openSCAD, to print later. > I do not have my own 3D printer (yet). > > One I talked to, wanted to get the drawings in .STL or .3MF. (I don't know > the difference). > > If I had my own printer, have I been able to print directly from openSCAD? > (Without some export?) > > In the openSCAD, no errors or problems occur. > but > The drawings I tested to export from openSCAD have given one or another > error message. > One message .: > WARNING: Object may not be a valid 2-manifold and may need repair! > > Another message .: > WARNING: No top level geometry to render > > What to do? > > > > ---------- Forwarded message ---------- > From: "Jan Öhman via Discuss" <discuss@lists.openscad.org> > To: OpenSCAD General Discussion <discuss@lists.openscad.org> > Cc: "Jan Öhman" <jan_ohman@yahoo.com> > Bcc: > Date: Fri, 6 May 2022 10:38:46 +0000 (UTC) > Subject: [OpenSCAD] Export to .STL / .3MF for later 3D-printing. > _______________________________________________ > OpenSCAD mailing list > To unsubscribe send an email to discuss-leave@lists.openscad.org > > _______________________________________________ > OpenSCAD mailing list > To unsubscribe send an email to discuss-leave@lists.openscad.org > > > > ---------- Forwarded message ---------- > From: "Jan Öhman via Discuss" <discuss@lists.openscad.org> > To: OpenSCAD general discussion <discuss@lists.openscad.org> > Cc: "Jan Öhman" <jan_ohman@yahoo.com> > Bcc: > Date: Sat, 7 May 2022 11:04:31 +0000 (UTC) > Subject: [OpenSCAD] Re: Export to .STL / .3MF for later 3D-printing. > _______________________________________________ > OpenSCAD mailing list > To unsubscribe send an email to discuss-leave@lists.openscad.org >
MM
Michael Möller
Sat, May 7, 2022 4:56 PM

Jan Öhman wrote it failed in Render/F6, but works in Preview/F5 - in so
many words. I tried and got the following

First model
[image: image.png]
F6 Error: WARNING: Ignoring 2D child object for 3D operation in file , line
53

ERROR: CGAL error in CGALUtils::applyUnion3D: CGAL ERROR: assertion
violation! Expr: G.mark(v1,0)==G.mark(v2,0)&& G.mark(v1,1)==G.mark(v2,1)
File:
/mxe/usr/x86_64-w64-mingw32.static.posix/include/CGAL/Nef_S2/SM_overlayer.h
Line: 303

Which I think is pretty selfexplantory: Passed a 2D shape to something that
expected a 3D shape - but you have to read the whole code to find it ...
which I think Jan is more qualified to do :-)

2nd part
[image: image.png]

... which is one of those where zooming or rotating the model in preview
takes >5 second
[image: image.png]

And I didn't bother waiting for the F6 error ... ;-)

Of course, we do not know if the above shapes I got are the ones that Jan
wants - there are also sections of code commented out.

(From the comments it seems these are to be nice and alternative covers for
wall outlet/switches.)

On Sat, 7 May 2022 at 18:26, Sanjeev Prabhakar sprabhakar2006@gmail.com
wrote:

Quite a long code.
Can you paste a picture of what you are trying to draw.
Regards
Sanjeev

On Sat, 7 May 2022, 16:31 Jan Öhman via Discuss, <
discuss@lists.openscad.org> wrote:

---------- Forwarded message ----------
From: "Jan Öhman" jan_ohman@yahoo.com
To: OpenSCAD general discussion discuss@lists.openscad.org
Cc:
Bcc:
Date: Sat, 7 May 2022 11:04:31 +0000 (UTC)
Subject: [OpenSCAD] Re: Export to .STL / .3MF for later 3D-printing.
Thank you!
Begins to understand how it works. (It was not easy...)

but my solution was not good ...

Here are 2 files that do not work to render (F6)

= = product 1= = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
= =

  • . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . -
    . _ . - . _ . - . _ . - . _ . -

include <BOSL2/std.scad>
fn = 150;

placering="left";
// placering="right"

box(0, 0, 0, placering, "#C0C0C0", fn); // (X, Y, Z, left/right,
colorName)

// Monteringsplattan
// mountingPlate(0, 0, 0, placering);

// LED belysning
// LEDlampa(0, 0, 0, placering);

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - - - m o d u l e r - - - - - - - - - - - - - - - - - -

//

---================
//======  box


---===
module box(posX=0, posY=0, posZ=0, mountSide="left", colorName="#00FF00",
fn=24)
{
side = mountSide == "left" ? 0
: mountSide == "right" ? 1
: assert(false,"invalid moutSide value");  // message if no case
worked

color(colorName)
translate([posX, posY, posZ])
mirror([side, 0, 0])
difference()
{
union()
{
// Skapa konturer på bottenplattan - x, y, r, angles, [grader], början
// Rotation medurs - vänster lamphållare (bakant saknas)
points1 = circSect( 140,  0,  0, [0, 0], "right",  1, fn);  // böj
nere till höger
points2 = circSect(  60,  5,  5, [0, 5], "bottom",  1, fn); //
brytpunkt längst ned
points3 = circSect(  10, 13,  10, [0, 90], "bottom", 1, fn); // böj
nere till vänster
points4 = circSect(  5, 80,  5, [0, 90], "left",  1, fn); // böj
uppe till vänster
points5 = circSect( 140, 80,  5, [0, 1], "top",  1, fn);  // böj
uppe till höger
edge = concat(points1, points2, points3, points4, points5);
path = path3d(reverse(edge));
section = wall();
path_sweep( section, path, closed=false);

// Skapa bakkant lite högre och smalare i topp
bottom1 = concat(points5, points1);
polygon(bottom1);
path1 = path3d(reverse(bottom1));
section1 = wall1(); // lite högre bakvägg wall(b=4, f=8, h=15, t=3.5)
path_sweep( section1, path1, closed=false);

// fyll upp bottenplattansbaksida
linear_extrude(4) // Bottomplate - fill up
polygon(concat(points1, points2, points3, points4, points5));

// skapa Utskjutande del under (tänk spegelvänt)
pt1 = circSect(  19.5, 85, 0, [0, 50], "top", 1, fn);  // Uppe till
höger - moturs
pt2 = circSect(  39, 1.35,  .1, [-5, 90], "right", 1, fn);  // Nere
till höger
pt3 = circSect(  10, 13.05,  10, [0, 90], "bottom", 1, fn);  // Nere
till vänster
pt4 = circSect(  5, 80, 5, [0, 90], "left",  1, fn);  // Uppe till
vänster
translate([0, 0, -2])
linear_extrude(2.1)
polygon(concat(pt1, pt2, pt3, pt4));

// utgången för kabeln på baksidan (diam 10mm) - pekar lite nedåt
cableExit(65, 35, 0, 15, "cyan", $fn=100);
}

// skapa ett borrhål i bakkant
translate([132,60,15])
{ rotate([0, 90, 0])
{ cylinder(h=10, d=2, $fn=100);
cylinder(h=4, d=9, $fn=100);
}
}

// skapa en borrmarkering i bakkant
translate([139,25,15])
{ rotate([0, 90, 0])
cylinder(h=2, d1=1, d2=2.5, $fn=100);
}

// ingravera årtalet på baksidan
translate([10, 80, -0.5])
{ mirror([side, 0, 0])
{ rotate([0, 180, 0])
{ linear_extrude(3)
text("2022", size=12, direction="ttb", font="Comic Sans
MS:style=Bold");
}
}
}

/*
// Markera skruvhål på bakkant
borr=3;
bredd=140;
hojd=8;
avstNed=20;
translate([bredd, avstNed, hojd])
{ rotate([0,90,0])
cylinder(h=2, d1=0.5, d2=borr, center=true, $fn=50);
}
*/

// borrhål
mountingHole(20, 36, 0, 7, 90.1, 15); // posX, posY, posZ, diam, dist,
deep, $fn=50

}
}
//========  Slut box

---=============================

//

---================
//======  cableExit

---==============================
module cableExit(posX, posY, posZ, angle, colorName)
{ diamHole = 7;
diamHolder = 9.8;
hight = 12;
topRad = diamHolder/2;
topDiam = diamHolder/2-topRad/2;
bowRad = 7;
offs1 = 0.1;

color(colorName)
translate([posX, posY, posZ])
{  rotate([180, 0, 180-angle])
{ difference()
{ hull()
{ cylinder(h=hight, d=diamHolder, center=false);
translate([0, 0, hight])        // rundad topp
rotate_extrude(angle=360, convexity=2)
translate([topDiam, 0, 0])  // yttre diam topp
circle(d=topRad);        // radie topp
}

     inpHight  =  2;   // ett värde som styr var utgångshålet hamnar
     translate([0, 0, -offs1])
       cylinder(h=inpHight+offs1, d=diamHole, center=false); //

Bottenhål

     translate([-bowRad, 0, inpHight-offs1]) // böjen
     { rotate([90, 0, 0])
         rotate_extrude(angle=90, convexity=10)
           translate([bowRad, 0, 0]) // ställ in radien på kabelböjen
             circle(d=diamHole);
     }
   }
 }

}
}
//======  slut cableExit

---=========================

//

---================
//======  mountingHole

---===========================
module mountingHole(posX=0, posY=0, posZ=0, diam=7, dist=90, deep=5,
$fn=50)
{ // diam =  6;  // [mm]
// dist = 90;  // [mm]
// deep =  12;  // [mm]

translate([posX, posY, posZ])
{ translate([0, 0, -10])
cylinder(h=deep, d=diam);  // fästhål 1

 //cableHold1(dist/2, 0, .2, "#D5D5D5");  // Kabelgenomföring
 translate([dist/2, 0, 0])
 {  hull()
   { cylinder(h=5, d=6);  // fästhål 1
     sphere(d=7.5);
   }
 }

 translate([dist, 0, -10])
   cylinder(h=deep, d=diam); // fästhål 2

}
}
//======  slut mountingHole

---======================

//

---================
//======  LEDlampa

---===============================
// module LEDlampa(posX=8, posY=10, posZ=0)
module LEDlampa(posX=0, posY=0, posZ=0, mountSide="left")
{ side = mountSide == "left" ? 0
: mountSide == "right" ? 1
: assert(false,"invalid moutSide value");  // message if no case
worked

xpos = mountSide == "left" ? 121
: mountSide == "right" ? -10
: assert(false,"invalid moutSide value");  // message if no case
worked
/*
ypos = mountSide == "left" ? 10.5
: mountSide == "right" ? 10.5
: assert(false,"invalid moutSide value");  // message if no case
worked

zpos = mountSide == "left" ? 5
: mountSide == "right" ? 5
: assert(false,"invalid moutSide value");  // message if no case
worked
*/
// echo(xpos,ypos,zpos);
// translate([xpos, ypos, zpos])
translate([xpos, 10.5, 5])
mirror([1, 0, 0])
translate([posX, posY, posZ])
{ LEDbottom();
translate([0, 0, 11])
LEDglas();
}
}
//======  Slut LEDlampa

---==========================

//

---================
//======  LEDglas

---================================
module LEDglas()
{
// Variabler botten
length  = 111;  // längd mm
wideMid = 50.5;  // bredd i mitten mm

cornRad = 10;    // Radien i alla hörn
wideCorn = 48;  // Bredd i kanterna

diamHole = 6;    // håldiameter i mm

colorBot = "gray";
colorTop = "orange";

// Variabler top
cornHigh = 5;  //Höjd i ändarna
midHigh  = 8;
highTop = cornHigh + 1;  // höjd mm

p1tx = 10;      // the start value
p1ty = 49.25;
p2tx = 55.5;    // the middle value
p2ty = 50.5;
p3tx = 101;    // the end value
p3ty = p1ty;

p4tx = 101;    // the start value
p4ty = 1.25;
p5tx = 55.5;    // the middle value
p5ty = 0.0;
p6tx = 10;      // the end value
p6ty = p4ty;
// Ger ovalt glas
points1 = 3points_arc([p1tx,p1ty], [p2tx,p2ty], [p3tx,p3ty], fn=100);
points2 = 3points_arc([p4tx,p4ty], [p5tx,p5ty], [p6tx,p6ty], fn=100);

color("orange")
linear_extrude(height=cornHigh+.1)
difference()
{ polygon(concat(points1, points2));

 translate([length-10 , wideMid / 2, -.2])
   circle(d=6);
 translate([10 , wideMid / 2, -.2])
   circle(d=6);

}

// Top
color(colorTop)
difference()
{ hull()
{ // hörn1
translate([cornRad, wideMid - ((wideMid-wideCorn)/2) - cornRad, 0])
// [10,39]
cylinder(h=cornHigh, d=cornRad2, center=false);
// hörn2
translate([cornRad, cornRad + ((wideMid-wideCorn)/2), 0])
// [10,12]
cylinder(h=cornHigh, d=cornRad
2, center=false);
// hörn3
translate([length - cornRad, wideMid - ((wideMid-wideCorn)/2) -
cornRad, 0]) // [101 ,39]
cylinder(h=cornHigh, d=cornRad2, center=false);
// hörn4
translate([length - cornRad, cornRad + ((wideMid-wideCorn)/2), 0])
//
cylinder(h=cornHigh, d=cornRad
2, center=false);
}

 union()
 { // Monteringshål 1 & 2
   translate([length-10 , wideMid / 2, -.2])
     cylinder(d=diamHole, h=highTop+.5, center=false);
   translate([10 , wideMid / 2, -.2])
     cylinder(d=diamHole, h=highTop+.5, center=false);
 }

}
}
//========  Slut LEDglas

---=========================

//

---================
//======  LEDbottom

---==============================
module LEDbottom()
{ p1x = 10;      // the start value
p1y = 49.25;
p2x = 55.5;    // the middle value
p2y = 50.5;
p3x = 101;    // the end value
p3y = p1y;

p4x = 101;    // the start value
p4y = 1.25;
p5x = 55.5;    // the middle value
p5y = 0.0;
p6x = 10;      // the end value
p6y = p4y;

// Variabler botten för borrhålen
length  = 111;  // längd mm
wideMid = 50.5;  // bredd i mitten mm
diamHole = 6;    // håldiameter i mm
cornHigh = 5;  //Höjd i ändarna
midHigh  = 8;
highTop = cornHigh + 1;  // höjd mm
// offs1 = 0.1;
heightHole = 15; //mm
height = 11; //mm

points1 = circSect(  10, 11.25,  10, [0, 90], "bottom", 1, fn); // Hörn
nere till vänster
points2 = circSect(  10, 39.25,  10, [0, 90], "left",  1, fn); // Hörn
uppe till vänster
points3 = 3points_arc([p1x,p1y], [p2x,p2y], [p3x,p3y], fn);
points4 = circSect( 101, 39.25,  10, [0, 90], "top",    1, fn); // Hörn
uppe till höger
points5 = circSect( 101, 11.25,  10, [0, 90], "right",  1, fn); // Hörn
nere till höger
points6 = 3points_arc([p4x,p4y], [p5x,p5y], [p6x,p6y], fn);

// The base plate for the LED lamp

difference()
{ color("gray", 0.5)
linear_extrude(height=height)
polygon(concat(points1, points2, points3, points4, points5,
points6));

// union()
 { // Monteringshål 1 & 2
   translate([length-10 , wideMid / 2, -.2])
     cylinder(d=diamHole, h=heightHole, center=false);
   translate([10 , wideMid / 2, -.2])
     cylinder(d=diamHole, h=heightHole, center=false);
 }

}
}
//========  Slut LEDbottom

---=======================

//

---================
//======  circleSect

---=============================
// Create rounded corners 2D
// https://openhome.cc/eGossip/OpenSCAD/SectorArc.html
// ange .:  x, y, radien,
//          [från, till] vinkel,
//          var vinkeln startar, (left, bottom, right, top)
//          vilken rotation (-1=medsol, 1=motsols)
function circSect(x=0, y=0, radius=10, angles=[0,270], startRef="bottom",
rotate=1, fn=24)  =
let(
startAngel  = (startRef == "left")  ?  0
: (startRef == "bottom") ?  90
: (startRef == "right")  ? 180
: (startRef == "top")    ? 270
: startRef,  // valfri vinkel
// : assert(false,"invalid moutSide value");  // Error
message if no case worked
//: undef,
r = radius,
//r = radius / cos(180 / fn),
step = 360 / fn,
// points = [[x, y],
points = [
for(a = [angles[0]-startAngel : step : angles[1]-startAngel])
[-rotate * r * cos(a)+x, r * sin(a)+y]]
) points;
//========  Slut circleSect

---======================

//

---================
//======  3points_arc

---============================
// Create an arc with three points 2D
function 3points_arc(p0, p1, p2, fn=10) =
// an alternative expression for D
// D  = 2 * ( (p1-p0).x * (p2-p0).y - (p1-p0).y * (p2-p0).x )
let( D  = 2 * cross(p1-p0, (p2-p0)) )
assert( abs(D)>1e-9, "The 3 points should not be collinear." )
let(
Ux    = ( (p2-p0).y*(p1-p0)(p1-p0) - (p1-p0).y(p2-p0)(p2-p0)
)/D,
Uy    = ( (p1-p0).x
(p2-p0)(p2-p0) - (p2-p0).x(p1-p0)(p1-p0)
)/D,
radius = norm([Ux,Uy]),
center = [Ux,Uy] + p0,
ang0  = atan2( (p0-center).y, (p0-center).x ),
ang2  = atan2( (p2-center).y, (p2-center).x ),
// the points are in a cw winding iff D<0
// the angular difference between vectors p2-center and p0-center
// measured from p0-center; dang is positive iff D is negative
dang  = D<0  ? ang2<ang0 ? ang2-ang0 : ang2-ang0-360
: ang2>ang0 ? ang2-ang0 : ang2-ang0+360
)
[ for(i=[0:fn-1])
let( ang = ang0 + i
dang/(fn-1) )
center + radius*[cos(ang),sin(ang)] ];
//========  Slut 3points_arc

---=====================

//

---================
//======  Wall som ett "L"

---=======================
// Normal vägghöjd
function wall() =
let(
b =  4,    // botten - tjocklek
f =  8,    // Foten
h = 15,    // Höjd
t =  3.5,  // Top
x = (b+(t/2) - (h - ( (-h / (f-t)) *t) )) / (-h / (f-t))
)
let(
points = [[0,0], [f,0], [t,h], [0,h]] ,
top = move([t/2, h, 0], circle(d=t, $fn=20)),
sqr = square([10, b]),
diff =
difference([
move([x, b], square([t/2, t/2])),
move([x+(t/2), b+(t/2), 0], circle(d = t, $fn=20) ) ])
)
union([points, top, sqr, diff]);
//========  Slut Wall

---============================

//

---================
//======  Wall1 som ett "L"

---======================
// En högre vägg
function wall1() =
let(
b =  4,    // botten - tjocklek
f =  7,    // Foten
h = 25,    // Höjd
t =  3,  // Top
x = (b+(t/2) - (h - ((-h / (f-t)) *t))) / (-h / (f-t))
)
let(
points = [[0,0], [f,0], [t,h], [0,h]] ,
top = move([t/2, h, 0], circle(d=t, $fn=20)),
sqr = square([10, b]),
diff =
difference([
move([x, b], square([t/2, t/2])),
move([x+(t/2), b+(t/2), 0], circle(d = t, $fn=20) ) ])
)
union([points, top, sqr, diff]);
//========  Slut Wall1

---===========================

//

---================
//======  Plåt på släp

---===========================
module mountingPlate(posX=0, posY=0, posZ=0, mountSide="left",
colorName="#C0C0C0", $fn=50)
{ // Hörnpositionerna
posX1 = 120;
posY1 = 0;
posX2 = posX1;
posY2 = -200;
posX3 = 120 - 75;
posY3 = -200;
posX4 = 0;
posY4 = 0;
thick=2;  // tjocklek

side = mountSide == "left" ? 0
: mountSide == "right" ? 1
: assert(false,"invalid moutSide value");  // message if no case
worked

xpos = mountSide == "left" ? 20
: mountSide == "right" ? -20
: assert(false,"invalid moutSide value");  // message if no case
worked
/*
ypos = mountSide == "left" ? 85
: mountSide == "right" ? 85
: assert(false,"invalid moutSide value");  // message if no case
worked

zpos = mountSide == "left" ? -thick
: mountSide == "right" ? -thick
: assert(false,"invalid moutSide value");  // message if no case
worked
*/
color(colorName)
{  translate([posX, posY, posZ])
translate([xpos, 85, -thick])
{ mirror([side, 0, 0])
{ linear_extrude(thick)
hull()
{ translate([posX1, posY1, 0])
square(0.1, center = true);
translate([posX2, posY2, 0])
square(0.1, center = true);
translate([posX3, posY3, 0])
square(0.1, center = true);
translate([posX4, posY4, 0])
square(0.1, center = true);
}
}
}
}
}
= = END product 1= = = = = = = = = = = = = = = = = = = = = = = = = = = =
= =

  • . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . -
    . _ . - . _ . - . _ . - . _ . -

= = product 2 = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
= =

  • . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . -
    . _ . - . _ . - . _ . - . _ . -

$fn=100;
//$fn=15;

//switch();
//cableHolder4(); //Switchboxen

// cableHolder3(0, 0, 0, 33.5, 23.5, 1.5, 2);
// showCables();

module cableHolder4(fn=24);
{ // idé från
// - https://www.thingiverse.com/thing:6400/files
// -
https://ihrchive.wordpress.com/2011/02/14/openscad-tip-round-1-of-3-basic-rounding/

// mått på Switch
heightHold = 10.5;
widthHold = 33.5;
depthHold = 23.5;
spaceHold = 10.0; // utrymmet bakom switch
holdRadie = 2;  // radie i hörnen
thick = 2;
offset1=0.5;  // öka toleransen

// innermått
holeW = widthHold + offset1;
holeH = heightHold + offset1;
holeD = depthHold + spaceHold+offset1;

// yttermått
pad = 0.1;                  // Padding to maintain manifold
box_l = holeW + thick*2;  // Bredden på switchen
box_w = holeD + thick;            // Djupet på switchen
box_h = holeH + thick; // Height
round_r = holdRadie;        // Radius of round
smooth = 45;                // Number of facets of rounding cylinder

difference()
{ union() // Detta utförs i två steg.
{ difference()  // utför fasningar och kabelmarkeringar
{ mainBox(box_l, box_w, box_h, spaceHold+thick, round_r, thick,
smooth, pad);

     // fasning vänster (underkant)
     translate([box_l/2-0.85, spaceHold-4.3, thick-offset1])  //

sidled, fram/bak , upp/ned
rotate([0,180,45])
cylinder(h=thick, d1=holeW1.414-thick-thick, d2=holeW1.414,
$fn=4);

     // fasning höger (underkant)
     translate([box_l/2-3.65, spaceHold-4.3, thick-offset1]) //

sidled, fram/bak , upp/ned
rotate([0,180,45])
cylinder(h=thick, d1=holeW1.414-thick-thick, d2=holeW1.414,
$fn=4);

     // kabelgenomföringar
     rotate([90, 180, 90]) // Markering ena sidan (vänster under)
       ovalCableHole(spaceHold/2-offset1, -1.75, -1.2);

     rotate([90, 180, 180]) // Markering bakkant (vänster under)
       ovalCableHole(spaceHold/2-1.55, -1.75, -spaceHold-0.85);

     rotate([90, 180, 180]) // Markering bakkant (höger under)
       ovalCableHole(widthHold-spaceHold/2-offset1, -1.75,

-spaceHold-0.85);

     rotate([90, -180, 90])  // Markering ena sidan (höger under)
       ovalCableHole(3.75, -1.75, widthHold-0.1);
   }
 } // Slut union - kropp

 translate([-offset1/2, -spaceHold+pad, -pad]) // hålet där switchen

ska placeras
cube([holeW, holeD+pad, holeH+pad], center=false);

   translate([4, 12, 0])
     cylinder(h=15,d=3.2);
   translate([4, 12, 17.7])
     sphere(r=6);

   translate([29.6, 12, 0])
     cylinder(h=15,d=3.2);
   translate([29.6, 12, 17.7])
     sphere(r=6);

   /*  // Hål genom lock bak - om så önskas
   translate([box_l/2-thick, -6, offset1/2])
     cylinder(h=box_h+thick*4+offset1, d=3.2, $fn=100);  // hål genom

lock bak

   translate([box_l/2-thick, -6, 17.7])
     sphere(r=6);    // kona hålet bak
   */

} // Slut difference() - box

 difference()
 { union()
   { translate([29.6, 12, heightHold-offset1*2])
       cylinder(h=2,d=5.2);        // Stödhylsa för Switchskruv1
     translate([4, 12, heightHold-offset1*2])
       cylinder(h=2,d=5.2);        // Stödhylsa för Switchskruv2

     translate([holeW/2, -spaceHold+thick+1, holeH/2])
       rotate([180,0,0])
          backHole();
   } // union - slut

   translate([4, 12, 0])     //  Hålen i stödhylsorna
     cylinder(h=15,d=3.2);

   translate([29.6, 12, 0])  //  Hålen i stödhylsorna
     cylinder(h=15,d=3.2);

   translate([box_l/2-thick, -6, -offset1])  // hål i stödhylsa bak
     cylinder(h=box_h+offset1, d=3.2, $fn=100);

   // Sänk stödhylsan
   translate([ widthHold/2-7, -spaceHold-offset1, -thick+offset1])  //

hål i stödhylsa bak
cube([15, 8, 3]);

   // kabelmarkering
   // translate([0, 0, 0])  // hål i stödhylsa bak


   }

/*
translate([4, 12, 0])
#cylinder(h=15,d=3.2);
//translate([4, 13.5, 17.3])
//#sphere(r=6);

   translate([29.6, 12, 0])
     #cylinder(h=15,d=3.2);
   //translate([29.6, 13.5, 17.3])
     //#sphere(r=6);

*/

}

module backHole()
{ wallH = 10.5;

wide1  = 12; // endast runt cylindern
wide2  = 35; // hela väggen
deep1    =  4;
height1  = 10.5;
cornRad1  =  2;
diam1 = 8;
opt1 = 0.1;

//rundadFot();

// Rundad stäcka mellan t.ex. vägg och tak -bakkant
translate([wide2/2, diam1/2-cornRad1/2, -height1/2])
{ rotate([90, 0, -90])
{ linear_extrude(wide2)
{ difference()
{ square([cornRad1, cornRad1]);

       translate([cornRad1, cornRad1])
         circle(r=cornRad1);
     }
   }
 }

}

// rundad stäcka1 (vänster) mellan t.ex. vägg och tak
translate([-wide2/2+0.15, deep1/2+cornRad1/2, -height1/2])
rotate([90, 0, 0])
{ linear_extrude(spaceHold)
{ difference()
{ square([cornRad1, cornRad1]);

     translate([cornRad1, cornRad1])
     circle(r=cornRad1);
   }
 }

}

// rundad stäcka2 mellan t.ex. vägg och tak
translate([wide2/2-0.65, deep1/2+cornRad1/2, -height1/2])
rotate([0, -90, 90])
{ linear_extrude(spaceHold)
{ difference()
{ square([cornRad1, cornRad1]);

     translate([cornRad1, cornRad1])
       circle(r=cornRad1);
   }
 }

}

// Skapa stödfot - bak
difference()
{ union()
{ //själva cylindern
translate([0, 1, 0])
{ cylinder(h=height1, d=diam1, center=true);
translate([0, diam1/2, 0])
cube([diam1,diam1-1,height1], center=true);
}

   // Rundad fot under cylinder ovan
   translate([0, 1, -height1/2])
   { rotate_extrude()
     { translate([diam1/2, 0, 0])
       { difference()
         { square([cornRad1, cornRad1]);

           translate([cornRad1, cornRad1])
             circle(r=cornRad1);
         }
       }
     }
   }

   // Rundad rakstäcka1 - cylinderfot - mellan t.ex. vägg och tak
   translate([diam1/2, diam1, -height1/2])
   { rotate([90, 0, 0])
     { linear_extrude(diam1)
       { difference()
         { square([cornRad1, cornRad1]);

           translate([cornRad1, cornRad1])
             circle(r=cornRad1);
         }
       }
     }
   }

   // Rundad rakstäcka2 - cylinderfot - mellan t.ex. vägg och tak
   translate([-diam1/2, diam1, -height1/2])
   { rotate([0, -90, 90])
     { linear_extrude(diam1)
       { difference()
         { square([cornRad1, cornRad1]);

           translate([cornRad1, cornRad1])
             circle(r=cornRad1);
         }
       }
     }
   }

   //väggen bakom cylindern som ska rundas
   translate([0, diam1/2-cornRad1, 0])
     cube([wide1, cornRad1, height1], center=true);

 }


 // Avrunda hörn1 bak
 translate([-wide1/2, cornRad1/2, cornRad1])
 { hull()
   { cylinder(h=height1+opt1, r=cornRad1, center=true);
     {  translate([0, 0, -height1/2])
         sphere(r=cornRad1);
     }
   }
 }

 // Avrunda hörn2 bak
 translate([wide1/2, cornRad1/2, cornRad1])
 { hull()
   { cylinder(h=height1+opt1, r=cornRad1, center=true);
     {  translate([0, 0, -height1/2])
         sphere(r=cornRad1);
     }
   }
 }


 // Plocka bort rundad fot bak samt det som sticker ut
 translate([-wide1/2, diam1/2-cornRad1/2, -height1/2-opt1])
   cube([wide1, diam1/2+cornRad1, height1+opt1*2], center=false);

}
}

module ovalCableHole(posX, posY, posZ)
{ // Hål 5.5 x 3.5 mm
pan = 0.1;
cableHi = 1.5;

translate([posX, posY, posZ])
{ color("white")
{ translate([0, 0, -pan])
{ cylinder(h=cableHi, d=3.5);
//#translate([0, 0, 0]) cylinder(h=10, d=1);
//translate([0, 0, -1]) cylinder(h=1, d1=0, d2=1);
//translate([0, 0, 0]) sphere(d=1); // Inre kulan
//translate([0, 0, 1.5]) sphere(d=1); // Inre kulan

     translate([0, 0, -1]) sphere(d=0.8); // yttre kulan
     translate([0, 0, 2.5]) sphere(d=0.8); // yttre kulan

   }
   translate([2, 0, -pan])
   { cylinder(h=cableHi, d=3.5);
     // #translate([0, 0, -cableHi*2]) cylinder(h=10, d=0.5);
     //translate([0, 0, 0]) sphere(d=1); // Inre kulan
     //translate([0, 0, 1.5]) sphere(d=1); // Inre kulan

     translate([0, 0, -1]) sphere(d=0.8); // yttre kulan
     translate([0, 0, 2.5]) sphere(d=0.8); // yttre kulan

   }
   translate([-3.5/2, 0, -pan])
     cube([5.5, 3.5/2, cableHi]);
   translate([-0.25, -1.74, -pan])
     cube([2.5, 1.75, cableHi]);
 }

}
}

module rundadFot()
{
// specifika värden för skruvdistansen bak
wallH = 10.5;

wide1  = 12; // endast runt cylindern
wide2  = 34; // hela väggen
deep1    =  4;
height1  = 10;
cornRad1  =  2;
diam1 = 8;
opt1 = 0.1;

color("magenta")
{ translate([0, 0, wallH])
{ difference()
{ union()
{ // Bakgavel
translate([wide2/2, opt1, height1/2])
{ rotate([90, 180, 0])
cube([wide2, height1, opt1]);
}

       // Golv
       translate([wide2/2, -height1+opt1, -height1/2])
         rotate([0, 180, 0])
           cube([wide2, height1, opt1]);

       //väggen bakom cylindern som kan rundas
       translate([0, -cornRad1/2, 0])
         cube([wide1, cornRad1, height1], center=true);

       //själva cylindern
       translate([0, -cornRad1/2, 0])
         cylinder(h=height1, d=diam1, center=true);

       // Rundad fot under cylinder ovan
       translate([0, -cornRad1/2, -height1/2])
       { rotate_extrude()
         { translate([diam1/2, 0, 0])
           { difference()
             { square([cornRad1, cornRad1]);

               translate([cornRad1, cornRad1])
                 circle(r=cornRad1);
             }
           }
         }
       }

       // Rundad stäcka mellan t.ex. vägg och tak -bakkant
       translate([wide2/2, 0, -height1/2])
       { rotate([90, 0, -90])
         { linear_extrude(wide2)
           { difference()
             { square([cornRad1, cornRad1]);

               translate([cornRad1, cornRad1])
                 circle(r=cornRad1);
             }
           }
         }
       }

       // rundad stäcka mellan t.ex. vägg och tak -sida1
       translate([-wide2/2, 0, -height1/2])
       { rotate([90, 0, 0])
         { linear_extrude(10)
           { difference()
             { square([cornRad1, cornRad1]);

               translate([cornRad1, cornRad1])
               circle(r=cornRad1);
             }
           }
         }
       }

       // rundad stäcka mellan t.ex. vägg och tak -sida2
       translate([wide2/2, -10, -height1/2])
       { rotate([90, 0, 180])
         { linear_extrude(10)
           { difference()
             { square([cornRad1, cornRad1]);

               translate([cornRad1, cornRad1])
               circle(r=cornRad1);
             }
           }
         }
       }
     } // Avsluta union = = = = = = = = = = = = = = = = = = = =


     // Avrunda hörn1 bak
     translate([-wide1/2+opt1*1.3, -deep1/2, cornRad1])
     { cylinder(h=height1+opt1, r=cornRad1, center=true);
         translate([0, 0, -height1/2])
           sphere(r=cornRad1);
     }

     // Avrunda hörn2 bak
     translate([wide1/2-opt1*1.3, -deep1/2, cornRad1])
     { cylinder(h=height1+opt1, r=cornRad1, center=true);
         translate([0, 0, -height1/2])
           sphere(r=cornRad1);
     }

     // Plocka bort rundad fot bak samt det som sticker ut
     translate([-wide1/2, 0, -height1/2-opt1])
       cube([wide1, diam1/2+cornRad1, height1+opt1*2], center=false);
   }
 }

}
}

module mainBox(box_l, box_w, box_h, spaceHold, round_r, thick, smooth,
pad)
{ translate([box_l/2-thick-offset1/2, box_w/2-spaceHold, box_h/2])
{
// To fix the corners cut the main cube with smaller cubes with
spheres removed
difference()
{ cube([box_l, box_w, box_h], center = true);

   // Kant1 - liggande
   translate([0, -box_w/2+round_r, box_h/2-round_r])
   { difference()
     { translate([0,-round_r-pad,round_r+pad])
         cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center =

true);
rotate(a=[0,90,0])
cylinder(box_l+4pad,round_r,round_r,center=true,$fn=smooth);
}
}
// Kant2 - liggande
translate([0, box_w/2-round_r, box_h/2-round_r])
{ difference()
{ translate([0,round_r+pad,round_r+pad])
cube([box_l+2
pad, round_r2+pad, round_r2+pad], center =
true);
rotate(a=[0,90,0])
cylinder(box_l+4pad,round_r,round_r,center=true,$fn=smooth);
}
}
/

// Kant3 - liggande
translate([0, -box_w/2+round_r, -box_h/2+round_r])
{ difference()
{ translate([0,-round_r-pad,-round_r-pad])
cube([box_l+2pad, round_r2+pad, round_r2+pad], center =
true);
rotate(a=[0,90,0])
cylinder(box_l+4
pad,round_r,round_r,center=true,$fn=smooth);
}
}

   // Kant4 - liggande
   translate([0, box_w/2-round_r, -box_h/2+round_r])
   { difference()
     { translate([0,round_r+pad,-round_r-pad])
         cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center =

true);
rotate(a=[0,90,0])
cylinder(box_l+4pad,round_r,round_r,center=true,$fn=smooth);
}
}
/
// ----
// Kant1 - stående
translate([-box_l/2+round_r, box_w/2-round_r, 0])
{ difference()
{ translate([-round_r-pad,round_r+pad,0])
cube([round_r
2+pad, round_r
2+pad, box_h+2pad], center =
true);
cylinder(box_h+4
pad,round_r,round_r,center=true,$fn=smooth);
}
}
// Kant2 - stående
translate([box_l/2-round_r, box_w/2-round_r, 0])
{ difference()
{ translate([round_r+pad,round_r+pad,0])
cube([round_r2+pad, round_r2+pad, box_h+2pad], center =
true);
cylinder(box_h+4
pad,round_r,round_r,center=true,$fn=smooth);
}
}
// Kant3 - stående
translate([-box_l/2+round_r, -box_w/2+round_r, 0])
{ difference()
{ translate([-round_r-pad,-round_r-pad,0])
cube([round_r2+pad, round_r2+pad, box_h+2pad], center =
true);
cylinder(box_h+4
pad,round_r,round_r,center=true,$fn=smooth);
}
}
// Kant4 - stående
translate([box_l/2-round_r, -box_w/2+round_r, 0])
{ difference()
{ translate([round_r+pad,-round_r-pad,0])
cube([round_r2+pad, round_r2+pad, box_h+2pad], center =
true);
cylinder(box_h+4
pad,round_r,round_r,center=true,$fn=smooth);
}
}

 // ----
   // Kant1 liggande (andra hållet)
   translate([-box_l/2+round_r, 0, box_h/2-round_r])
   { difference()
     { translate([-round_r-pad, 0, round_r+pad])
         cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center =

true);
rotate(a=[0,90,90])
cylinder(box_w+4pad,round_r,round_r,center=true,$fn=smooth);
}
}
// Kant2 liggande (andra hållet)
translate([box_l/2-round_r, 0, box_h/2-round_r])
{ difference()
{  translate([round_r+pad, 0, round_r+pad])
cube([round_r
2+pad, box_w+2pad, round_r2+pad], center =
true);
rotate(a=[0,90,90])
cylinder(box_w+4pad,round_r,round_r,center=true,$fn=smooth);
}
}
/

// Kant3 liggande (andra hållet)
translate([-box_l/2+round_r, 0, -box_h/2+round_r])
{ difference()
{ translate([-round_r-pad, 0, -round_r-pad])
cube([round_r2+pad, box_w+2pad, round_r2+pad], center =
true);
rotate(a=[0,90,90])
cylinder(box_w+4
pad,round_r,round_r,center=true,$fn=smooth);
}
}

   // Kant4 liggande (andra hållet)
   translate([box_l/2-round_r, 0, -box_h/2+round_r])
   { difference()
     { translate([round_r+pad, 0, -round_r-pad])
         cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center =

true);
rotate(a=[0,90,90])
cylinder(box_w+4pad,round_r,round_r,center=true,$fn=smooth);
}
}
/
// ----
// Hörn1 (övre)
translate([box_l/2-round_r, box_w/2-round_r, box_h/2-round_r])
{ difference()
{ translate([round_r+pad, round_r+pad, round_r+pad])
cube([round_r
2+pad, round_r
2+pad, round_r2+pad], center =
true);
sphere(round_r,$fn=smooth);
}
}
// Hörn2 (övre)
translate([-box_l/2+round_r, box_w/2-round_r, box_h/2-round_r])
{ difference()
{ translate([-round_r-pad, round_r+pad, round_r+pad])
cube([round_r
2+pad, round_r2+pad, round_r2+pad], center =
true);
sphere(round_r,$fn=smooth);
}
}
// Hörn3 (övre)
translate([box_l/2-round_r, -box_w/2+round_r, box_h/2-round_r])
{ difference()
{ translate([round_r+pad, -round_r-pad, round_r+pad])
cube([round_r2+pad, round_r2+pad, round_r2+pad], center =
true);
sphere(round_r,$fn=smooth);
}
}
// Hörn4 (övre)
translate([-box_l/2+round_r, -box_w/2+round_r, box_h/2-round_r])
{ difference()
{ translate([-round_r-pad, -round_r-pad, round_r+pad])
cube([round_r
2+pad, round_r2+pad, round_r2+pad], center =
true);
sphere(round_r,$fn=smooth);
}
}
/*
// Hörn1 (undre)
translate([box_l/2-round_r, box_w/2-round_r, -box_h/2+round_r])
{ difference()
{ translate([round_r+pad, round_r+pad, -round_r-pad])
cube([round_r2+pad, round_r2+pad, round_r2+pad], center =
true);
sphere(round_r,$fn=smooth);
}
}
// Hörn2 (undre)
translate([-box_l/2+round_r, box_w/2-round_r, -box_h/2+round_r])
{ difference()
{ translate([-round_r-pad, round_r+pad, -round_r-pad])
cube([round_r
2+pad, round_r2+pad, round_r2+pad], center =
true);
sphere(round_r,$fn=smooth);
}
}
// Hörn3 (undre)
translate([box_l/2-round_r, -box_w/2+round_r, -box_h/2+round_r])
{ difference()
{ translate([round_r+pad, -round_r-pad, -round_r-pad])
cube([round_r2+pad, round_r2+pad, round_r2+pad], center =
true);
sphere(round_r,$fn=smooth);
}
}
// Hörn4 (undre)
translate([-box_l/2+round_r, -box_w/2+round_r, -box_h/2+round_r])
{ difference()
{ translate([-round_r-pad, -round_r-pad, -round_r-pad])
cube([round_r
2+pad, round_r2+pad, round_r2+pad], center =
true);
sphere(round_r,$fn=smooth);
}
}
*/
}
}
}
//

module cableHolder3(posX, posY, posZ, length, width, height, radius)
{ // Skapa toppen över switchen
// mått på Switchen
fn = 96;          // upplösning (endast bågen?)
heightHold = 10.5;
widthHold = 33.5;
depthHold = 23.5;
holdRadie = 1.5;  // radie i hörnen
thick = 1.5;      // tjocklek

translate([0,-thick,0])
{
difference(0, 0, 0)
{ hull()
{ difference()
{ translate([thick, 0, heightHold]) // vänster kant
{ rotate([-90, 0, 0])
{ cylinder(h=depthHold, d=thick2);
translate([0, 0, depthHold])
sphere(d=thick
2);          // längst fram
}
}
translate([0, -0.1, heightHold]) // plocka bort underdelen
rotate([-90, 0, 0])
cube([thick*2, thick+.1, depthHold+thick+.1]);
}

     difference()
     { translate([widthHold-thick, 0, heightHold]) // höger kant
       { rotate([-90, 0, 0])
         { cylinder(h=depthHold, d=thick*2);
           translate([0, 0, depthHold])
             sphere(d=thick*2);         // längst fram
         }
       }
       translate([widthHold-thick*2, -0.1, heightHold]) // plocka bort

underdelen
{ rotate([-90, 0, 0])
cube([thick*2, thick+.1, depthHold+thick+.1]);
}
}
}

   // öppna hålen för monteringsskruvarna uppe på plattan
   translate([4, 13.5, 0])
     cylinder(h=15,d=3.2);
   translate([4, 13.5, 17.3])
     sphere(r=6);

   translate([29.6, 13.5, 0])
     cylinder(h=15,d=3.2);

   translate([29.6, 13.5, 17.3])
     sphere(r=6);
 }

 // halvbåge 1 bak
 translate([thick, 0, heightHold/2+thick/2])
   rotate([0, 90, 180])
     rotate_extrude(angle = 180, convexity=20, $fn=64)
 translate([heightHold/2-thick/2, 0, 0])
   circle(d=thick*2);
 translate([thick, 0, heightHold])
   sphere(d=thick*2);  // övre kulan
 translate([thick, 0, thick])
   sphere(d=thick*2);  // undre kulan


 // halvbåge 2 bak
 translate([widthHold-thick, 0, heightHold/2+thick/2])
   rotate([0, 90, 180])
     rotate_extrude(angle = 180, convexity=20, $fn=64)
 translate([heightHold/2-thick/2, 0, 0])
   circle(d=thick*2);
 translate([widthHold-thick, 0, heightHold])
   sphere(d=thick*2);  // övre kulan
 translate([widthHold-thick, 0, thick])
   sphere(d=thick*2);  // undre kulan

 // en cylinder tvärsöver längst upp
 translate([thick, 0, heightHold])
 { rotate([0,90,0])
     cylinder(h=widthHold-thick*2, r=thick);
 }

}

// Halvbågen (kabelhållaren) på baksidan switchen
translate([widthHold-thick, -thick, heightHold/2+thick/2])
{ rotate([0,90,180])
linear_extrude(widthHold-thick2)
arc(heightHold/2-thick/2, [0, 180], thick, fn); //radius, angles,
width, fn)
}
// en cylinder tvärsöver längst ned
translate([thick, -thick, thick])
{ rotate([0,90,0])
cylinder(h=widthHold-thick
2, r=thick);
}
}

module switch(posX=0, posY=0, posZ=0)
{ buttRadie = 1.5;
height = 10.5;
width = 33.5;
depth = 23.5;
h1x = buttRadie;
h1y = buttRadie;
h2x = width-buttRadie;
h2y = buttRadie;
h3x = width-buttRadie;
h3y = depth-buttRadie;
h4x = buttRadie;
h4y = depth-buttRadie;

translate([posX, posY, posZ])
{ difference()
{ color("#F9F9F3")
// tryck-knappen
union()
{ translate([width/2, depth+6-0.1, height/2])
{ rotate([90, 0, 0])
{ translate([0,0,6])
circle(d=6.8);  // skuggan runt knapp
cylinder(h=6, d=6);
sphere(d=6);
}
}

     hull()  // Switchkropp
     { translate([h1x, h1y])
         cylinder(h=height, r=1.5);
       translate([h2x, h2y])
         cylinder(h=height, r=1.5);
       translate([h3x, h3y])
         cylinder(h=height, r=1.5);
       translate([h4x, h4y])
         cylinder(h=height, r=1.5);
     }
   }

   // Skruvhålen för switchen
   hole( 4, 12, 0, "#FFD700", height);
   hole(29.6, 12, 0, "#FFD700", height);
   // hole( 4, 12, 0, "#FFD700", 50);
   // hole(29.6, 12, 0, "#FFD700", 50);
   // hål för kablar bak
   color("gray")
   { translate([9.5, 16, height/2])
     { rotate([90, 0, 0])
         cylinder(h=16.5, d=4);
     }
     translate([24.5, 16, height/2])
     {  rotate([90, 0, 0])
         cylinder(h=16.5, d=4);
     }
   }

   // hål för kabelskruvar
   color("white")
   { translate([29.5, 17.1, height/2])
     { rotate([0, 90, 0])
         cylinder(h=4.1, d=4.5);
     }
     translate([-0.1, 17.1, height/2])
     { rotate([0, 90, 0])
         cylinder(h=4.1, d=4.5);
     }
   }
 }

 // Kabelskruvar
 cableScrew(3, 17, height/2, 90);
 cableScrew(31, 17, height/2, -90);

}
}

// Skruven som håller fast kabeln i switchen
module cableScrew(posX=0, posY=0, posZ=0, angle=0)
{ color("#FFD700")  // mässing
translate([posX, posY, posZ])
{ rotate([0, 0, angle])
{ difference()
{ // skruvskalle
translate([0, 0, 0])
rotate([90, 0, 0])
cylinder(h=2, d1=4, d2=3.5);

     // stjärnan i skruven
     translate([0, 1.85, -.25])
       rotate([0, 0, 0])
         cylinder(h=0.5, d=5);
     translate([-0.25, -.6, 2.25])
       rotate([0, 90, 0])
         cube([4.5, 2, 0.5]);
   }
 }

}
}

// borrhål
module hole(posX=0, posY=0, posZ=0, colorName="yellow", height)
{ diamHole1 = 3;
highHole1 = height;
diamHole2 = 6;
highHole2 = 2.5;
offs=0.1;

color(colorName)
{
translate([posX, posY, posZ])
{ translate([0, 0, 0])
cylinder(h=highHole1, d=diamHole1);
translate([0, 0, -offs])
cylinder(h=highHole2, d=diamHole2);
translate([0, 0, height-highHole2+offs])
cylinder(h=highHole2, d=diamHole2);
}
}
}

module showCables()
{ translate([-25,8,24])
rotate([80,177,90])
cable(10,10,0,"brun");
translate([-43,8,15])
rotate([90,180,90])
cable(10,10,0,"blå");
}

module cable(posX=0, posY=0, posZ=0, colorName="blå", radius=1.26,
width=0.62, thick=50, fn=24)
{ // default 1.5mm2
// radius = inner radie
// width = bredd/tjocklek på cirkeln (inte höjd)
// thick = höjd på cirken/ röret
// pin=

colCupper = "#D7715A";
colGreen  = "#07DA63";
colYellow = "#FFCC00";

if (colorName=="gröngul")
{ translate([posX, posY, posZ])
{ color(colGreen)
linear_extrude(thick)
arc(radius, [0, 60], width, fn);
color(colYellow)
linear_extrude(thick)
arc(radius, [60, 180], width, fn);
color(colGreen)
linear_extrude(thick)
arc(radius, [180, 240], width, fn);
color(colYellow)
linear_extrude(thick)
arc(radius, [240, 360], width, fn);

   color(colCupper)
     linear_extrude(10, center=true, convexity=10, $fn=100)
       circle(d=1.24);
 }

}
else  // vanliga kablar 1.5mm2
{
cableColor = colorName == "blå" ? "#1870D5"
: colorName == "brun" ? "#9C6137"
: colorName == "svart" ? "#000000"
: assert(false,"invalid color value");  // message if no
case worked
// : nodef

 translate([posX, posY, posZ])
 {             //el kabel - ena änden rak - andra böjd
   color(colCupper)    //kopparstump tråd rakkabel
     linear_extrude(10, center=true, convexity=10, $fn=100)
       circle(d=1.24);

    color(cableColor)
    { cylinder(h=thick, r=radius);

     translate([-radius*2, 0, thick])  // kabelböj
     rotate([90, 0, 0])
     rotate_extrude(angle=90, convexity=20)
       translate([2.5, 0, 0])
         circle(r=1.26);

     translate([-radius*2, 0, thick+radius*2])
       rotate([0, -90, 0])
       cylinder(h=5, r=radius);
   }
   translate([-10, 0, thick+radius*2])
   { rotate([0, -90, 0])
     { color(colCupper)
       { linear_extrude(5, center=true, convexity=10, $fn=100)
           circle(d=1.24);
       }
     }
   }
 }

}
}

//

---====
module arc(radius, angles, width = 1, fn = 24) {
difference() {
sector(radius + width, angles, fn); // ytterradie
sector(radius, angles, fn);        // innerradie (plockar bort
invändigt
}
}

module sector(radius, angles, fn = 24) {
r = radius / cos(180 / fn);
step = -360 / fn;

 points = concat([[0, 0]],
     [for(a = [angles[0] : step : angles[1] - 360])
         [r * cos(a), r * sin(a)]
     ],
     [[r * cos(angles[1]), r * sin(angles[1])]]
 );

 difference() {
     circle(radius, $fn = fn);
     polygon(points);
 }

}
= = END product 2 = = = = = = = = = = = = = = = = = = = = = = = = = = = =
= =

  • . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . -
    . _ . - . _ . - . _ . - . _ . -

Den fredag 6 maj 2022 14:06:55 CEST, Michael Möller <
private2michael@gmail.com> skrev:

OpenSCAD code - is a description of your model in terms of a few
cylinder/cubes added and cut out
difference() {
cylinder(d=5,h=10);
translate([0,10,0]) cube([4,6,2]) ;
}

STL file is a list of triangles which make the same outer shell as your
model. OpenSCAD makes this complicated transform from shapes to triangles.
solid OpenSCAD_Model
facet normal 0.92388 0.382682 0
outer loop
vertex 2.5 0 3
vertex 1.76777 1.76777 0
vertex 1.76777 1.76777 3
endloop
endfacet
facet normal 0.92388 0.382682 0
outer loop
vertex 1.76777 1.76777 0
vertex 2.5 0 3
vertex 2.5 0 0
endloop
endfacet
: (and so on for 300 lines) There is a binary/compressed version, but
the description is still just triangles.

Gcode is what a 3D printer understands - it is the exact list of moves
that the head has to do with how much plastic to squeeze to trace the
outline of your shape, layer, by layer. It will optionally create moves for
filling the inside or support for overhangs. Such a program is called a
SLICER and the printer will come with one.
G92 E0 ; reset extrusion distance
G1 Z2.330 F6600.000 ; lift Z
G1 X-0.000 Y1.505 F6600.000 ; move to first perimeter point
G1 Z0.330 F6600.000 ; restore layer Z
G1 E3.00000 F2400.00000 ; unretract extruder 0
G1 F1500
G1 X-1.064 Y1.064 E3.09259 ; perimeter
G1 X-1.505 Y0.000 E3.18517 ; perimeter
: (many similar lines)
G1 X1.515 Y1.515 E4.65860 ; perimeter
G1 X0.055 Y2.120 E4.78559 ; perimeter
G1 X-0.000 Y2.143 F6600.000 ; move inwards before travel
G1 X0.384 Y0.843 F6600.000 ; move to first infill point
G1 F1500
G1 X0.843 Y0.384 E4.84815 ; infill
G1 X1.097 Y-0.229 E4.91215 ; infill
:
(and so on for thousands of lines)

The 3MF still basically deals in triangles, and attributes (surface,
infill material, picture, ticket info ... ) which probably are not used by
your slicer/printer.

On Fri, 6 May 2022 at 12:37, Jan Öhman via Discuss <
discuss@lists.openscad.org> wrote:

---------- Forwarded message ----------
From: "Jan Öhman" jan_ohman@yahoo.com
To: OpenSCAD General Discussion discuss@lists.openscad.org
Cc:
Bcc:
Date: Fri, 6 May 2022 10:38:46 +0000 (UTC)
Subject: [OpenSCAD] Export to .STL / .3MF for later 3D-printing.
Hi!

Thought to create some objects in openSCAD, to print later.
I do not have my own 3D printer (yet).

One I talked to, wanted to get the drawings in .STL or .3MF. (I don't
know the difference).

If I had my own printer, have I been able to print directly from openSCAD?
(Without some export?)

In the openSCAD, no errors or problems occur.
but
The drawings I tested to export from openSCAD have given one or another
error message.
One message .:
WARNING: Object may not be a valid 2-manifold and may need repair!

Another message .:
WARNING: No top level geometry to render

What to do?

---------- Forwarded message ----------
From: "Jan Öhman via Discuss" discuss@lists.openscad.org
To: OpenSCAD General Discussion discuss@lists.openscad.org
Cc: "Jan Öhman" jan_ohman@yahoo.com
Bcc:
Date: Fri, 6 May 2022 10:38:46 +0000 (UTC)
Subject: [OpenSCAD] Export to .STL / .3MF for later 3D-printing.


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org

---------- Forwarded message ----------
From: "Jan Öhman via Discuss" discuss@lists.openscad.org
To: OpenSCAD general discussion discuss@lists.openscad.org
Cc: "Jan Öhman" jan_ohman@yahoo.com
Bcc:
Date: Sat, 7 May 2022 11:04:31 +0000 (UTC)
Subject: [OpenSCAD] Re: Export to .STL / .3MF for later 3D-printing.


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org

Jan Öhman wrote it failed in Render/F6, but works in Preview/F5 - in so many words. I tried and got the following First model [image: image.png] F6 Error: WARNING: Ignoring 2D child object for 3D operation in file , line 53 ERROR: CGAL error in CGALUtils::applyUnion3D: CGAL ERROR: assertion violation! Expr: G.mark(v1,0)==G.mark(v2,0)&& G.mark(v1,1)==G.mark(v2,1) File: /mxe/usr/x86_64-w64-mingw32.static.posix/include/CGAL/Nef_S2/SM_overlayer.h Line: 303 Which I think is pretty selfexplantory: Passed a 2D shape to something that expected a 3D shape - but you have to read the whole code to find it ... which I think Jan is more qualified to do :-) 2nd part [image: image.png] ... which is one of those where zooming or rotating the model in preview takes >5 second [image: image.png] And I didn't bother waiting for the F6 error ... ;-) Of course, we do not know if the above shapes I got are the ones that Jan wants - there are also sections of code commented out. (From the comments it seems these are to be nice and alternative covers for wall outlet/switches.) On Sat, 7 May 2022 at 18:26, Sanjeev Prabhakar <sprabhakar2006@gmail.com> wrote: > Quite a long code. > Can you paste a picture of what you are trying to draw. > Regards > Sanjeev > > On Sat, 7 May 2022, 16:31 Jan Öhman via Discuss, < > discuss@lists.openscad.org> wrote: > >> >> >> >> ---------- Forwarded message ---------- >> From: "Jan Öhman" <jan_ohman@yahoo.com> >> To: OpenSCAD general discussion <discuss@lists.openscad.org> >> Cc: >> Bcc: >> Date: Sat, 7 May 2022 11:04:31 +0000 (UTC) >> Subject: [OpenSCAD] Re: Export to .STL / .3MF for later 3D-printing. >> Thank you! >> Begins to understand how it works. (It was not easy...) >> >> but my solution was not good ... >> >> Here are 2 files that do not work to render (F6) >> >> >> = = product 1= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = >> = = >> - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - >> . _ . - . _ . - . _ . - . _ . - >> >> >> include <BOSL2/std.scad> >> fn = 150; >> >> placering="left"; >> // placering="right" >> >> box(0, 0, 0, placering, "#C0C0C0", fn); // (X, Y, Z, left/right, >> colorName) >> >> >> // Monteringsplattan >> // mountingPlate(0, 0, 0, placering); >> >> >> // LED belysning >> // LEDlampa(0, 0, 0, placering); >> >> >> // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >> // - - - - m o d u l e r - - - - - - - - - - - - - - - - - - >> >> >> >> //================================================================================== >> //====== box >> ===================================================================== >> module box(posX=0, posY=0, posZ=0, mountSide="left", colorName="#00FF00", >> fn=24) >> { >> side = mountSide == "left" ? 0 >> : mountSide == "right" ? 1 >> : assert(false,"invalid moutSide value"); // message if no case >> worked >> >> color(colorName) >> translate([posX, posY, posZ]) >> mirror([side, 0, 0]) >> difference() >> { >> union() >> { >> // Skapa konturer på bottenplattan - x, y, r, angles, [grader], början >> // Rotation medurs - vänster lamphållare (bakant saknas) >> points1 = circSect( 140, 0, 0, [0, 0], "right", 1, fn); // böj >> nere till höger >> points2 = circSect( 60, 5, 5, [0, 5], "bottom", 1, fn); // >> brytpunkt längst ned >> points3 = circSect( 10, 13, 10, [0, 90], "bottom", 1, fn); // böj >> nere till vänster >> points4 = circSect( 5, 80, 5, [0, 90], "left", 1, fn); // böj >> uppe till vänster >> points5 = circSect( 140, 80, 5, [0, 1], "top", 1, fn); // böj >> uppe till höger >> edge = concat(points1, points2, points3, points4, points5); >> path = path3d(reverse(edge)); >> section = wall(); >> path_sweep( section, path, closed=false); >> >> >> // Skapa bakkant lite högre och smalare i topp >> bottom1 = concat(points5, points1); >> polygon(bottom1); >> path1 = path3d(reverse(bottom1)); >> section1 = wall1(); // lite högre bakvägg wall(b=4, f=8, h=15, t=3.5) >> path_sweep( section1, path1, closed=false); >> >> // fyll upp bottenplattansbaksida >> linear_extrude(4) // Bottomplate - fill up >> polygon(concat(points1, points2, points3, points4, points5)); >> >> >> // skapa Utskjutande del under (tänk spegelvänt) >> pt1 = circSect( 19.5, 85, 0, [0, 50], "top", 1, fn); // Uppe till >> höger - moturs >> pt2 = circSect( 39, 1.35, .1, [-5, 90], "right", 1, fn); // Nere >> till höger >> pt3 = circSect( 10, 13.05, 10, [0, 90], "bottom", 1, fn); // Nere >> till vänster >> pt4 = circSect( 5, 80, 5, [0, 90], "left", 1, fn); // Uppe till >> vänster >> translate([0, 0, -2]) >> linear_extrude(2.1) >> polygon(concat(pt1, pt2, pt3, pt4)); >> >> // utgången för kabeln på baksidan (diam 10mm) - pekar lite nedåt >> cableExit(65, 35, 0, 15, "cyan", $fn=100); >> } >> >> // skapa ett borrhål i bakkant >> translate([132,60,15]) >> { rotate([0, 90, 0]) >> { cylinder(h=10, d=2, $fn=100); >> cylinder(h=4, d=9, $fn=100); >> } >> } >> >> // skapa en borrmarkering i bakkant >> translate([139,25,15]) >> { rotate([0, 90, 0]) >> cylinder(h=2, d1=1, d2=2.5, $fn=100); >> } >> >> >> // ingravera årtalet på baksidan >> translate([10, 80, -0.5]) >> { mirror([side, 0, 0]) >> { rotate([0, 180, 0]) >> { linear_extrude(3) >> text("2022", size=12, direction="ttb", font="Comic Sans >> MS:style=Bold"); >> } >> } >> } >> >> /* >> // Markera skruvhål på bakkant >> borr=3; >> bredd=140; >> hojd=8; >> avstNed=20; >> translate([bredd, avstNed, hojd]) >> { rotate([0,90,0]) >> cylinder(h=2, d1=0.5, d2=borr, center=true, $fn=50); >> } >> */ >> >> // borrhål >> mountingHole(20, 36, 0, 7, 90.1, 15); // posX, posY, posZ, diam, dist, >> deep, $fn=50 >> >> } >> } >> //======== Slut box >> ============================================================== >> >> >> >> //================================================================================== >> //====== cableExit >> =============================================================== >> module cableExit(posX, posY, posZ, angle, colorName) >> { diamHole = 7; >> diamHolder = 9.8; >> hight = 12; >> topRad = diamHolder/2; >> topDiam = diamHolder/2-topRad/2; >> bowRad = 7; >> offs1 = 0.1; >> >> color(colorName) >> translate([posX, posY, posZ]) >> { rotate([180, 0, 180-angle]) >> { difference() >> { hull() >> { cylinder(h=hight, d=diamHolder, center=false); >> translate([0, 0, hight]) // rundad topp >> rotate_extrude(angle=360, convexity=2) >> translate([topDiam, 0, 0]) // yttre diam topp >> circle(d=topRad); // radie topp >> } >> >> >> inpHight = 2; // ett värde som styr var utgångshålet hamnar >> translate([0, 0, -offs1]) >> cylinder(h=inpHight+offs1, d=diamHole, center=false); // >> Bottenhål >> >> translate([-bowRad, 0, inpHight-offs1]) // böjen >> { rotate([90, 0, 0]) >> rotate_extrude(angle=90, convexity=10) >> translate([bowRad, 0, 0]) // ställ in radien på kabelböjen >> circle(d=diamHole); >> } >> } >> } >> } >> } >> //====== slut cableExit >> ========================================================== >> >> >> >> //================================================================================== >> //====== mountingHole >> ============================================================ >> module mountingHole(posX=0, posY=0, posZ=0, diam=7, dist=90, deep=5, >> $fn=50) >> { // diam = 6; // [mm] >> // dist = 90; // [mm] >> // deep = 12; // [mm] >> >> translate([posX, posY, posZ]) >> { translate([0, 0, -10]) >> cylinder(h=deep, d=diam); // fästhål 1 >> >> //cableHold1(dist/2, 0, .2, "#D5D5D5"); // Kabelgenomföring >> translate([dist/2, 0, 0]) >> { hull() >> { cylinder(h=5, d=6); // fästhål 1 >> sphere(d=7.5); >> } >> } >> >> translate([dist, 0, -10]) >> cylinder(h=deep, d=diam); // fästhål 2 >> } >> } >> //====== slut mountingHole >> ======================================================= >> >> >> >> //================================================================================== >> //====== LEDlampa >> ================================================================ >> // module LEDlampa(posX=8, posY=10, posZ=0) >> module LEDlampa(posX=0, posY=0, posZ=0, mountSide="left") >> { side = mountSide == "left" ? 0 >> : mountSide == "right" ? 1 >> : assert(false,"invalid moutSide value"); // message if no case >> worked >> >> xpos = mountSide == "left" ? 121 >> : mountSide == "right" ? -10 >> : assert(false,"invalid moutSide value"); // message if no case >> worked >> /* >> ypos = mountSide == "left" ? 10.5 >> : mountSide == "right" ? 10.5 >> : assert(false,"invalid moutSide value"); // message if no case >> worked >> >> zpos = mountSide == "left" ? 5 >> : mountSide == "right" ? 5 >> : assert(false,"invalid moutSide value"); // message if no case >> worked >> */ >> // echo(xpos,ypos,zpos); >> // translate([xpos, ypos, zpos]) >> translate([xpos, 10.5, 5]) >> mirror([1, 0, 0]) >> translate([posX, posY, posZ]) >> { LEDbottom(); >> translate([0, 0, 11]) >> LEDglas(); >> } >> } >> //====== Slut LEDlampa >> =========================================================== >> >> >> >> //================================================================================== >> //====== LEDglas >> ================================================================= >> module LEDglas() >> { >> // Variabler botten >> length = 111; // längd mm >> wideMid = 50.5; // bredd i mitten mm >> >> cornRad = 10; // Radien i alla hörn >> wideCorn = 48; // Bredd i kanterna >> >> diamHole = 6; // håldiameter i mm >> >> colorBot = "gray"; >> colorTop = "orange"; >> >> // Variabler top >> cornHigh = 5; //Höjd i ändarna >> midHigh = 8; >> highTop = cornHigh + 1; // höjd mm >> >> p1tx = 10; // the start value >> p1ty = 49.25; >> p2tx = 55.5; // the middle value >> p2ty = 50.5; >> p3tx = 101; // the end value >> p3ty = p1ty; >> >> p4tx = 101; // the start value >> p4ty = 1.25; >> p5tx = 55.5; // the middle value >> p5ty = 0.0; >> p6tx = 10; // the end value >> p6ty = p4ty; >> // Ger ovalt glas >> points1 = 3points_arc([p1tx,p1ty], [p2tx,p2ty], [p3tx,p3ty], fn=100); >> points2 = 3points_arc([p4tx,p4ty], [p5tx,p5ty], [p6tx,p6ty], fn=100); >> >> color("orange") >> linear_extrude(height=cornHigh+.1) >> difference() >> { polygon(concat(points1, points2)); >> >> translate([length-10 , wideMid / 2, -.2]) >> circle(d=6); >> translate([10 , wideMid / 2, -.2]) >> circle(d=6); >> } >> >> // Top >> color(colorTop) >> difference() >> { hull() >> { // hörn1 >> translate([cornRad, wideMid - ((wideMid-wideCorn)/2) - cornRad, 0]) >> // [10,39] >> cylinder(h=cornHigh, d=cornRad*2, center=false); >> // hörn2 >> translate([cornRad, cornRad + ((wideMid-wideCorn)/2), 0]) >> // [10,12] >> cylinder(h=cornHigh, d=cornRad*2, center=false); >> // hörn3 >> translate([length - cornRad, wideMid - ((wideMid-wideCorn)/2) - >> cornRad, 0]) // [101 ,39] >> cylinder(h=cornHigh, d=cornRad*2, center=false); >> // hörn4 >> translate([length - cornRad, cornRad + ((wideMid-wideCorn)/2), 0]) >> // >> cylinder(h=cornHigh, d=cornRad*2, center=false); >> } >> >> union() >> { // Monteringshål 1 & 2 >> translate([length-10 , wideMid / 2, -.2]) >> cylinder(d=diamHole, h=highTop+.5, center=false); >> translate([10 , wideMid / 2, -.2]) >> cylinder(d=diamHole, h=highTop+.5, center=false); >> } >> } >> } >> //======== Slut LEDglas >> ========================================================== >> >> >> >> //================================================================================== >> //====== LEDbottom >> =============================================================== >> module LEDbottom() >> { p1x = 10; // the start value >> p1y = 49.25; >> p2x = 55.5; // the middle value >> p2y = 50.5; >> p3x = 101; // the end value >> p3y = p1y; >> >> p4x = 101; // the start value >> p4y = 1.25; >> p5x = 55.5; // the middle value >> p5y = 0.0; >> p6x = 10; // the end value >> p6y = p4y; >> >> // Variabler botten för borrhålen >> length = 111; // längd mm >> wideMid = 50.5; // bredd i mitten mm >> diamHole = 6; // håldiameter i mm >> cornHigh = 5; //Höjd i ändarna >> midHigh = 8; >> highTop = cornHigh + 1; // höjd mm >> // offs1 = 0.1; >> heightHole = 15; //mm >> height = 11; //mm >> >> points1 = circSect( 10, 11.25, 10, [0, 90], "bottom", 1, fn); // Hörn >> nere till vänster >> points2 = circSect( 10, 39.25, 10, [0, 90], "left", 1, fn); // Hörn >> uppe till vänster >> points3 = 3points_arc([p1x,p1y], [p2x,p2y], [p3x,p3y], fn); >> points4 = circSect( 101, 39.25, 10, [0, 90], "top", 1, fn); // Hörn >> uppe till höger >> points5 = circSect( 101, 11.25, 10, [0, 90], "right", 1, fn); // Hörn >> nere till höger >> points6 = 3points_arc([p4x,p4y], [p5x,p5y], [p6x,p6y], fn); >> >> // The base plate for the LED lamp >> >> >> difference() >> { color("gray", 0.5) >> linear_extrude(height=height) >> polygon(concat(points1, points2, points3, points4, points5, >> points6)); >> >> >> // union() >> { // Monteringshål 1 & 2 >> translate([length-10 , wideMid / 2, -.2]) >> cylinder(d=diamHole, h=heightHole, center=false); >> translate([10 , wideMid / 2, -.2]) >> cylinder(d=diamHole, h=heightHole, center=false); >> } >> } >> } >> //======== Slut LEDbottom >> ======================================================== >> >> >> >> >> //================================================================================== >> //====== circleSect >> ============================================================== >> // Create rounded corners 2D >> // https://openhome.cc/eGossip/OpenSCAD/SectorArc.html >> // ange .: x, y, radien, >> // [från, till] vinkel, >> // var vinkeln startar, (left, bottom, right, top) >> // vilken rotation (-1=medsol, 1=motsols) >> function circSect(x=0, y=0, radius=10, angles=[0,270], startRef="bottom", >> rotate=1, fn=24) = >> let( >> startAngel = (startRef == "left") ? 0 >> : (startRef == "bottom") ? 90 >> : (startRef == "right") ? 180 >> : (startRef == "top") ? 270 >> : startRef, // valfri vinkel >> // : assert(false,"invalid moutSide value"); // Error >> message if no case worked >> //: undef, >> r = radius, >> //r = radius / cos(180 / fn), >> step = 360 / fn, >> // points = [[x, y], >> points = [ >> for(a = [angles[0]-startAngel : step : angles[1]-startAngel]) >> [-rotate * r * cos(a)+x, r * sin(a)+y]] >> ) points; >> //======== Slut circleSect >> ======================================================= >> >> >> >> //================================================================================== >> //====== 3points_arc >> ============================================================= >> // Create an arc with three points 2D >> function 3points_arc(p0, p1, p2, fn=10) = >> // an alternative expression for D >> // D = 2 * ( (p1-p0).x * (p2-p0).y - (p1-p0).y * (p2-p0).x ) >> let( D = 2 * cross(p1-p0, (p2-p0)) ) >> assert( abs(D)>1e-9, "The 3 points should not be collinear." ) >> let( >> Ux = ( (p2-p0).y*(p1-p0)*(p1-p0) - (p1-p0).y*(p2-p0)*(p2-p0) >> )/D, >> Uy = ( (p1-p0).x*(p2-p0)*(p2-p0) - (p2-p0).x*(p1-p0)*(p1-p0) >> )/D, >> radius = norm([Ux,Uy]), >> center = [Ux,Uy] + p0, >> ang0 = atan2( (p0-center).y, (p0-center).x ), >> ang2 = atan2( (p2-center).y, (p2-center).x ), >> // the points are in a cw winding iff D<0 >> // the angular difference between vectors p2-center and p0-center >> // measured from p0-center; dang is positive iff D is negative >> dang = D<0 ? ang2<ang0 ? ang2-ang0 : ang2-ang0-360 >> : ang2>ang0 ? ang2-ang0 : ang2-ang0+360 >> ) >> [ for(i=[0:fn-1]) >> let( ang = ang0 + i*dang/(fn-1) ) >> center + radius*[cos(ang),sin(ang)] ]; >> //======== Slut 3points_arc >> ====================================================== >> >> >> >> //================================================================================== >> //====== Wall som ett "L" >> ======================================================== >> // Normal vägghöjd >> function wall() = >> let( >> b = 4, // botten - tjocklek >> f = 8, // Foten >> h = 15, // Höjd >> t = 3.5, // Top >> x = (b+(t/2) - (h - ( (-h / (f-t)) *t) )) / (-h / (f-t)) >> ) >> let( >> points = [[0,0], [f,0], [t,h], [0,h]] , >> top = move([t/2, h, 0], circle(d=t, $fn=20)), >> sqr = square([10, b]), >> diff = >> difference([ >> move([x, b], square([t/2, t/2])), >> move([x+(t/2), b+(t/2), 0], circle(d = t, $fn=20) ) ]) >> ) >> union([points, top, sqr, diff]); >> //======== Slut Wall >> ============================================================= >> >> >> >> >> //================================================================================== >> //====== Wall1 som ett "L" >> ======================================================= >> // En högre vägg >> function wall1() = >> let( >> b = 4, // botten - tjocklek >> f = 7, // Foten >> h = 25, // Höjd >> t = 3, // Top >> x = (b+(t/2) - (h - ((-h / (f-t)) *t))) / (-h / (f-t)) >> ) >> let( >> points = [[0,0], [f,0], [t,h], [0,h]] , >> top = move([t/2, h, 0], circle(d=t, $fn=20)), >> sqr = square([10, b]), >> diff = >> difference([ >> move([x, b], square([t/2, t/2])), >> move([x+(t/2), b+(t/2), 0], circle(d = t, $fn=20) ) ]) >> ) >> union([points, top, sqr, diff]); >> //======== Slut Wall1 >> ============================================================ >> >> >> >> //================================================================================== >> //====== Plåt på släp >> ============================================================ >> module mountingPlate(posX=0, posY=0, posZ=0, mountSide="left", >> colorName="#C0C0C0", $fn=50) >> { // Hörnpositionerna >> posX1 = 120; >> posY1 = 0; >> posX2 = posX1; >> posY2 = -200; >> posX3 = 120 - 75; >> posY3 = -200; >> posX4 = 0; >> posY4 = 0; >> thick=2; // tjocklek >> >> side = mountSide == "left" ? 0 >> : mountSide == "right" ? 1 >> : assert(false,"invalid moutSide value"); // message if no case >> worked >> >> xpos = mountSide == "left" ? 20 >> : mountSide == "right" ? -20 >> : assert(false,"invalid moutSide value"); // message if no case >> worked >> /* >> ypos = mountSide == "left" ? 85 >> : mountSide == "right" ? 85 >> : assert(false,"invalid moutSide value"); // message if no case >> worked >> >> zpos = mountSide == "left" ? -thick >> : mountSide == "right" ? -thick >> : assert(false,"invalid moutSide value"); // message if no case >> worked >> */ >> color(colorName) >> { translate([posX, posY, posZ]) >> translate([xpos, 85, -thick]) >> { mirror([side, 0, 0]) >> { linear_extrude(thick) >> hull() >> { translate([posX1, posY1, 0]) >> square(0.1, center = true); >> translate([posX2, posY2, 0]) >> square(0.1, center = true); >> translate([posX3, posY3, 0]) >> square(0.1, center = true); >> translate([posX4, posY4, 0]) >> square(0.1, center = true); >> } >> } >> } >> } >> } >> = = END product 1= = = = = = = = = = = = = = = = = = = = = = = = = = = = >> = = >> - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - >> . _ . - . _ . - . _ . - . _ . - >> >> >> >> >> = = product 2 = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = >> = = >> - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - >> . _ . - . _ . - . _ . - . _ . - >> >> $fn=100; >> //$fn=15; >> >> //switch(); >> //cableHolder4(); //Switchboxen >> >> >> // cableHolder3(0, 0, 0, 33.5, 23.5, 1.5, 2); >> // showCables(); >> >> >> >> module cableHolder4(fn=24); >> { // idé från >> // - https://www.thingiverse.com/thing:6400/files >> // - >> https://ihrchive.wordpress.com/2011/02/14/openscad-tip-round-1-of-3-basic-rounding/ >> >> // mått på Switch >> heightHold = 10.5; >> widthHold = 33.5; >> depthHold = 23.5; >> spaceHold = 10.0; // utrymmet bakom switch >> holdRadie = 2; // radie i hörnen >> thick = 2; >> offset1=0.5; // öka toleransen >> >> // innermått >> holeW = widthHold + offset1; >> holeH = heightHold + offset1; >> holeD = depthHold + spaceHold+offset1; >> >> // yttermått >> pad = 0.1; // Padding to maintain manifold >> box_l = holeW + thick*2; // Bredden på switchen >> box_w = holeD + thick; // Djupet på switchen >> box_h = holeH + thick; // Height >> round_r = holdRadie; // Radius of round >> smooth = 45; // Number of facets of rounding cylinder >> >> >> >> difference() >> { union() // Detta utförs i två steg. >> { difference() // utför fasningar och kabelmarkeringar >> { mainBox(box_l, box_w, box_h, spaceHold+thick, round_r, thick, >> smooth, pad); >> >> // fasning vänster (underkant) >> translate([box_l/2-0.85, spaceHold-4.3, thick-offset1]) // >> sidled, fram/bak , upp/ned >> rotate([0,180,45]) >> cylinder(h=thick, d1=holeW*1.414-thick-thick, d2=holeW*1.414, >> $fn=4); >> >> // fasning höger (underkant) >> translate([box_l/2-3.65, spaceHold-4.3, thick-offset1]) // >> sidled, fram/bak , upp/ned >> rotate([0,180,45]) >> cylinder(h=thick, d1=holeW*1.414-thick-thick, d2=holeW*1.414, >> $fn=4); >> >> // kabelgenomföringar >> rotate([90, 180, 90]) // Markering ena sidan (vänster under) >> ovalCableHole(spaceHold/2-offset1, -1.75, -1.2); >> >> rotate([90, 180, 180]) // Markering bakkant (vänster under) >> ovalCableHole(spaceHold/2-1.55, -1.75, -spaceHold-0.85); >> >> rotate([90, 180, 180]) // Markering bakkant (höger under) >> ovalCableHole(widthHold-spaceHold/2-offset1, -1.75, >> -spaceHold-0.85); >> >> rotate([90, -180, 90]) // Markering ena sidan (höger under) >> ovalCableHole(3.75, -1.75, widthHold-0.1); >> } >> } // Slut union - kropp >> >> translate([-offset1/2, -spaceHold+pad, -pad]) // hålet där switchen >> ska placeras >> cube([holeW, holeD+pad, holeH+pad], center=false); >> >> translate([4, 12, 0]) >> cylinder(h=15,d=3.2); >> translate([4, 12, 17.7]) >> sphere(r=6); >> >> translate([29.6, 12, 0]) >> cylinder(h=15,d=3.2); >> translate([29.6, 12, 17.7]) >> sphere(r=6); >> >> /* // Hål genom lock bak - om så önskas >> translate([box_l/2-thick, -6, offset1/2]) >> cylinder(h=box_h+thick*4+offset1, d=3.2, $fn=100); // hål genom >> lock bak >> >> translate([box_l/2-thick, -6, 17.7]) >> sphere(r=6); // kona hålet bak >> */ >> } // Slut difference() - box >> >> difference() >> { union() >> { translate([29.6, 12, heightHold-offset1*2]) >> cylinder(h=2,d=5.2); // Stödhylsa för Switchskruv1 >> translate([4, 12, heightHold-offset1*2]) >> cylinder(h=2,d=5.2); // Stödhylsa för Switchskruv2 >> >> translate([holeW/2, -spaceHold+thick+1, holeH/2]) >> rotate([180,0,0]) >> backHole(); >> } // union - slut >> >> translate([4, 12, 0]) // Hålen i stödhylsorna >> cylinder(h=15,d=3.2); >> >> translate([29.6, 12, 0]) // Hålen i stödhylsorna >> cylinder(h=15,d=3.2); >> >> translate([box_l/2-thick, -6, -offset1]) // hål i stödhylsa bak >> cylinder(h=box_h+offset1, d=3.2, $fn=100); >> >> // Sänk stödhylsan >> translate([ widthHold/2-7, -spaceHold-offset1, -thick+offset1]) // >> hål i stödhylsa bak >> cube([15, 8, 3]); >> >> >> // kabelmarkering >> // translate([0, 0, 0]) // hål i stödhylsa bak >> >> >> } >> >> >> >> >> >> >> /* >> translate([4, 12, 0]) >> #cylinder(h=15,d=3.2); >> //translate([4, 13.5, 17.3]) >> //#sphere(r=6); >> >> translate([29.6, 12, 0]) >> #cylinder(h=15,d=3.2); >> //translate([29.6, 13.5, 17.3]) >> //#sphere(r=6); >> */ >> >> >> } >> >> module backHole() >> { wallH = 10.5; >> >> wide1 = 12; // endast runt cylindern >> wide2 = 35; // hela väggen >> deep1 = 4; >> height1 = 10.5; >> cornRad1 = 2; >> diam1 = 8; >> opt1 = 0.1; >> >> //rundadFot(); >> >> >> // Rundad stäcka mellan t.ex. vägg och tak -bakkant >> translate([wide2/2, diam1/2-cornRad1/2, -height1/2]) >> { rotate([90, 0, -90]) >> { linear_extrude(wide2) >> { difference() >> { square([cornRad1, cornRad1]); >> >> translate([cornRad1, cornRad1]) >> circle(r=cornRad1); >> } >> } >> } >> } >> >> // rundad stäcka1 (vänster) mellan t.ex. vägg och tak >> translate([-wide2/2+0.15, deep1/2+cornRad1/2, -height1/2]) >> rotate([90, 0, 0]) >> { linear_extrude(spaceHold) >> { difference() >> { square([cornRad1, cornRad1]); >> >> translate([cornRad1, cornRad1]) >> circle(r=cornRad1); >> } >> } >> } >> >> // rundad stäcka2 mellan t.ex. vägg och tak >> translate([wide2/2-0.65, deep1/2+cornRad1/2, -height1/2]) >> rotate([0, -90, 90]) >> { linear_extrude(spaceHold) >> { difference() >> { square([cornRad1, cornRad1]); >> >> translate([cornRad1, cornRad1]) >> circle(r=cornRad1); >> } >> } >> } >> >> // Skapa stödfot - bak >> difference() >> { union() >> { //själva cylindern >> translate([0, 1, 0]) >> { cylinder(h=height1, d=diam1, center=true); >> translate([0, diam1/2, 0]) >> cube([diam1,diam1-1,height1], center=true); >> } >> >> // Rundad fot under cylinder ovan >> translate([0, 1, -height1/2]) >> { rotate_extrude() >> { translate([diam1/2, 0, 0]) >> { difference() >> { square([cornRad1, cornRad1]); >> >> translate([cornRad1, cornRad1]) >> circle(r=cornRad1); >> } >> } >> } >> } >> >> // Rundad rakstäcka1 - cylinderfot - mellan t.ex. vägg och tak >> translate([diam1/2, diam1, -height1/2]) >> { rotate([90, 0, 0]) >> { linear_extrude(diam1) >> { difference() >> { square([cornRad1, cornRad1]); >> >> translate([cornRad1, cornRad1]) >> circle(r=cornRad1); >> } >> } >> } >> } >> >> // Rundad rakstäcka2 - cylinderfot - mellan t.ex. vägg och tak >> translate([-diam1/2, diam1, -height1/2]) >> { rotate([0, -90, 90]) >> { linear_extrude(diam1) >> { difference() >> { square([cornRad1, cornRad1]); >> >> translate([cornRad1, cornRad1]) >> circle(r=cornRad1); >> } >> } >> } >> } >> >> //väggen bakom cylindern som ska rundas >> translate([0, diam1/2-cornRad1, 0]) >> cube([wide1, cornRad1, height1], center=true); >> >> } >> >> >> // Avrunda hörn1 bak >> translate([-wide1/2, cornRad1/2, cornRad1]) >> { hull() >> { cylinder(h=height1+opt1, r=cornRad1, center=true); >> { translate([0, 0, -height1/2]) >> sphere(r=cornRad1); >> } >> } >> } >> >> // Avrunda hörn2 bak >> translate([wide1/2, cornRad1/2, cornRad1]) >> { hull() >> { cylinder(h=height1+opt1, r=cornRad1, center=true); >> { translate([0, 0, -height1/2]) >> sphere(r=cornRad1); >> } >> } >> } >> >> >> // Plocka bort rundad fot bak samt det som sticker ut >> translate([-wide1/2, diam1/2-cornRad1/2, -height1/2-opt1]) >> cube([wide1, diam1/2+cornRad1, height1+opt1*2], center=false); >> >> } >> } >> >> >> >> >> >> module ovalCableHole(posX, posY, posZ) >> { // Hål 5.5 x 3.5 mm >> pan = 0.1; >> cableHi = 1.5; >> >> translate([posX, posY, posZ]) >> { color("white") >> { translate([0, 0, -pan]) >> { cylinder(h=cableHi, d=3.5); >> //#translate([0, 0, 0]) cylinder(h=10, d=1); >> //translate([0, 0, -1]) cylinder(h=1, d1=0, d2=1); >> //translate([0, 0, 0]) sphere(d=1); // Inre kulan >> //translate([0, 0, 1.5]) sphere(d=1); // Inre kulan >> >> translate([0, 0, -1]) sphere(d=0.8); // yttre kulan >> translate([0, 0, 2.5]) sphere(d=0.8); // yttre kulan >> >> } >> translate([2, 0, -pan]) >> { cylinder(h=cableHi, d=3.5); >> // #translate([0, 0, -cableHi*2]) cylinder(h=10, d=0.5); >> //translate([0, 0, 0]) sphere(d=1); // Inre kulan >> //translate([0, 0, 1.5]) sphere(d=1); // Inre kulan >> >> translate([0, 0, -1]) sphere(d=0.8); // yttre kulan >> translate([0, 0, 2.5]) sphere(d=0.8); // yttre kulan >> >> } >> translate([-3.5/2, 0, -pan]) >> cube([5.5, 3.5/2, cableHi]); >> translate([-0.25, -1.74, -pan]) >> cube([2.5, 1.75, cableHi]); >> } >> } >> } >> >> >> >> >> >> >> module rundadFot() >> { >> // specifika värden för skruvdistansen bak >> wallH = 10.5; >> >> wide1 = 12; // endast runt cylindern >> wide2 = 34; // hela väggen >> deep1 = 4; >> height1 = 10; >> cornRad1 = 2; >> diam1 = 8; >> opt1 = 0.1; >> >> >> color("magenta") >> { translate([0, 0, wallH]) >> { difference() >> { union() >> { // Bakgavel >> translate([wide2/2, opt1, height1/2]) >> { rotate([90, 180, 0]) >> cube([wide2, height1, opt1]); >> } >> >> // Golv >> translate([wide2/2, -height1+opt1, -height1/2]) >> rotate([0, 180, 0]) >> cube([wide2, height1, opt1]); >> >> //väggen bakom cylindern som kan rundas >> translate([0, -cornRad1/2, 0]) >> cube([wide1, cornRad1, height1], center=true); >> >> //själva cylindern >> translate([0, -cornRad1/2, 0]) >> cylinder(h=height1, d=diam1, center=true); >> >> // Rundad fot under cylinder ovan >> translate([0, -cornRad1/2, -height1/2]) >> { rotate_extrude() >> { translate([diam1/2, 0, 0]) >> { difference() >> { square([cornRad1, cornRad1]); >> >> translate([cornRad1, cornRad1]) >> circle(r=cornRad1); >> } >> } >> } >> } >> >> // Rundad stäcka mellan t.ex. vägg och tak -bakkant >> translate([wide2/2, 0, -height1/2]) >> { rotate([90, 0, -90]) >> { linear_extrude(wide2) >> { difference() >> { square([cornRad1, cornRad1]); >> >> translate([cornRad1, cornRad1]) >> circle(r=cornRad1); >> } >> } >> } >> } >> >> // rundad stäcka mellan t.ex. vägg och tak -sida1 >> translate([-wide2/2, 0, -height1/2]) >> { rotate([90, 0, 0]) >> { linear_extrude(10) >> { difference() >> { square([cornRad1, cornRad1]); >> >> translate([cornRad1, cornRad1]) >> circle(r=cornRad1); >> } >> } >> } >> } >> >> // rundad stäcka mellan t.ex. vägg och tak -sida2 >> translate([wide2/2, -10, -height1/2]) >> { rotate([90, 0, 180]) >> { linear_extrude(10) >> { difference() >> { square([cornRad1, cornRad1]); >> >> translate([cornRad1, cornRad1]) >> circle(r=cornRad1); >> } >> } >> } >> } >> } // Avsluta union = = = = = = = = = = = = = = = = = = = = >> >> >> // Avrunda hörn1 bak >> translate([-wide1/2+opt1*1.3, -deep1/2, cornRad1]) >> { cylinder(h=height1+opt1, r=cornRad1, center=true); >> translate([0, 0, -height1/2]) >> sphere(r=cornRad1); >> } >> >> // Avrunda hörn2 bak >> translate([wide1/2-opt1*1.3, -deep1/2, cornRad1]) >> { cylinder(h=height1+opt1, r=cornRad1, center=true); >> translate([0, 0, -height1/2]) >> sphere(r=cornRad1); >> } >> >> // Plocka bort rundad fot bak samt det som sticker ut >> translate([-wide1/2, 0, -height1/2-opt1]) >> cube([wide1, diam1/2+cornRad1, height1+opt1*2], center=false); >> } >> } >> } >> } >> >> >> >> >> >> >> >> >> module mainBox(box_l, box_w, box_h, spaceHold, round_r, thick, smooth, >> pad) >> { translate([box_l/2-thick-offset1/2, box_w/2-spaceHold, box_h/2]) >> { >> // To fix the corners cut the main cube with smaller cubes with >> spheres removed >> difference() >> { cube([box_l, box_w, box_h], center = true); >> >> // Kant1 - liggande >> translate([0, -box_w/2+round_r, box_h/2-round_r]) >> { difference() >> { translate([0,-round_r-pad,round_r+pad]) >> cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center = >> true); >> rotate(a=[0,90,0]) >> cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth); >> } >> } >> // Kant2 - liggande >> translate([0, box_w/2-round_r, box_h/2-round_r]) >> { difference() >> { translate([0,round_r+pad,round_r+pad]) >> cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center = >> true); >> rotate(a=[0,90,0]) >> cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth); >> } >> } >> /* >> // Kant3 - liggande >> translate([0, -box_w/2+round_r, -box_h/2+round_r]) >> { difference() >> { translate([0,-round_r-pad,-round_r-pad]) >> cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center = >> true); >> rotate(a=[0,90,0]) >> cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth); >> } >> } >> >> // Kant4 - liggande >> translate([0, box_w/2-round_r, -box_h/2+round_r]) >> { difference() >> { translate([0,round_r+pad,-round_r-pad]) >> cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center = >> true); >> rotate(a=[0,90,0]) >> cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth); >> } >> } >> */ >> // ---- >> // Kant1 - stående >> translate([-box_l/2+round_r, box_w/2-round_r, 0]) >> { difference() >> { translate([-round_r-pad,round_r+pad,0]) >> cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center = >> true); >> cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth); >> } >> } >> // Kant2 - stående >> translate([box_l/2-round_r, box_w/2-round_r, 0]) >> { difference() >> { translate([round_r+pad,round_r+pad,0]) >> cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center = >> true); >> cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth); >> } >> } >> // Kant3 - stående >> translate([-box_l/2+round_r, -box_w/2+round_r, 0]) >> { difference() >> { translate([-round_r-pad,-round_r-pad,0]) >> cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center = >> true); >> cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth); >> } >> } >> // Kant4 - stående >> translate([box_l/2-round_r, -box_w/2+round_r, 0]) >> { difference() >> { translate([round_r+pad,-round_r-pad,0]) >> cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center = >> true); >> cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth); >> } >> } >> >> // ---- >> // Kant1 liggande (andra hållet) >> translate([-box_l/2+round_r, 0, box_h/2-round_r]) >> { difference() >> { translate([-round_r-pad, 0, round_r+pad]) >> cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center = >> true); >> rotate(a=[0,90,90]) >> cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth); >> } >> } >> // Kant2 liggande (andra hållet) >> translate([box_l/2-round_r, 0, box_h/2-round_r]) >> { difference() >> { translate([round_r+pad, 0, round_r+pad]) >> cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center = >> true); >> rotate(a=[0,90,90]) >> cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth); >> } >> } >> /* >> // Kant3 liggande (andra hållet) >> translate([-box_l/2+round_r, 0, -box_h/2+round_r]) >> { difference() >> { translate([-round_r-pad, 0, -round_r-pad]) >> cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center = >> true); >> rotate(a=[0,90,90]) >> cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth); >> } >> } >> >> // Kant4 liggande (andra hållet) >> translate([box_l/2-round_r, 0, -box_h/2+round_r]) >> { difference() >> { translate([round_r+pad, 0, -round_r-pad]) >> cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center = >> true); >> rotate(a=[0,90,90]) >> cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth); >> } >> } >> */ >> // ---- >> // Hörn1 (övre) >> translate([box_l/2-round_r, box_w/2-round_r, box_h/2-round_r]) >> { difference() >> { translate([round_r+pad, round_r+pad, round_r+pad]) >> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = >> true); >> sphere(round_r,$fn=smooth); >> } >> } >> // Hörn2 (övre) >> translate([-box_l/2+round_r, box_w/2-round_r, box_h/2-round_r]) >> { difference() >> { translate([-round_r-pad, round_r+pad, round_r+pad]) >> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = >> true); >> sphere(round_r,$fn=smooth); >> } >> } >> // Hörn3 (övre) >> translate([box_l/2-round_r, -box_w/2+round_r, box_h/2-round_r]) >> { difference() >> { translate([round_r+pad, -round_r-pad, round_r+pad]) >> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = >> true); >> sphere(round_r,$fn=smooth); >> } >> } >> // Hörn4 (övre) >> translate([-box_l/2+round_r, -box_w/2+round_r, box_h/2-round_r]) >> { difference() >> { translate([-round_r-pad, -round_r-pad, round_r+pad]) >> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = >> true); >> sphere(round_r,$fn=smooth); >> } >> } >> /* >> // Hörn1 (undre) >> translate([box_l/2-round_r, box_w/2-round_r, -box_h/2+round_r]) >> { difference() >> { translate([round_r+pad, round_r+pad, -round_r-pad]) >> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = >> true); >> sphere(round_r,$fn=smooth); >> } >> } >> // Hörn2 (undre) >> translate([-box_l/2+round_r, box_w/2-round_r, -box_h/2+round_r]) >> { difference() >> { translate([-round_r-pad, round_r+pad, -round_r-pad]) >> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = >> true); >> sphere(round_r,$fn=smooth); >> } >> } >> // Hörn3 (undre) >> translate([box_l/2-round_r, -box_w/2+round_r, -box_h/2+round_r]) >> { difference() >> { translate([round_r+pad, -round_r-pad, -round_r-pad]) >> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = >> true); >> sphere(round_r,$fn=smooth); >> } >> } >> // Hörn4 (undre) >> translate([-box_l/2+round_r, -box_w/2+round_r, -box_h/2+round_r]) >> { difference() >> { translate([-round_r-pad, -round_r-pad, -round_r-pad]) >> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = >> true); >> sphere(round_r,$fn=smooth); >> } >> } >> */ >> } >> } >> } >> // >> >> >> >> >> >> >> >> >> >> >> module cableHolder3(posX, posY, posZ, length, width, height, radius) >> { // Skapa toppen över switchen >> // mått på Switchen >> fn = 96; // upplösning (endast bågen?) >> heightHold = 10.5; >> widthHold = 33.5; >> depthHold = 23.5; >> holdRadie = 1.5; // radie i hörnen >> thick = 1.5; // tjocklek >> >> >> translate([0,-thick,0]) >> { >> difference(0, 0, 0) >> { hull() >> { difference() >> { translate([thick, 0, heightHold]) // vänster kant >> { rotate([-90, 0, 0]) >> { cylinder(h=depthHold, d=thick*2); >> translate([0, 0, depthHold]) >> sphere(d=thick*2); // längst fram >> } >> } >> translate([0, -0.1, heightHold]) // plocka bort underdelen >> rotate([-90, 0, 0]) >> cube([thick*2, thick+.1, depthHold+thick+.1]); >> } >> >> difference() >> { translate([widthHold-thick, 0, heightHold]) // höger kant >> { rotate([-90, 0, 0]) >> { cylinder(h=depthHold, d=thick*2); >> translate([0, 0, depthHold]) >> sphere(d=thick*2); // längst fram >> } >> } >> translate([widthHold-thick*2, -0.1, heightHold]) // plocka bort >> underdelen >> { rotate([-90, 0, 0]) >> cube([thick*2, thick+.1, depthHold+thick+.1]); >> } >> } >> } >> >> // öppna hålen för monteringsskruvarna uppe på plattan >> translate([4, 13.5, 0]) >> cylinder(h=15,d=3.2); >> translate([4, 13.5, 17.3]) >> sphere(r=6); >> >> translate([29.6, 13.5, 0]) >> cylinder(h=15,d=3.2); >> >> translate([29.6, 13.5, 17.3]) >> sphere(r=6); >> } >> >> // halvbåge 1 bak >> translate([thick, 0, heightHold/2+thick/2]) >> rotate([0, 90, 180]) >> rotate_extrude(angle = 180, convexity=20, $fn=64) >> translate([heightHold/2-thick/2, 0, 0]) >> circle(d=thick*2); >> translate([thick, 0, heightHold]) >> sphere(d=thick*2); // övre kulan >> translate([thick, 0, thick]) >> sphere(d=thick*2); // undre kulan >> >> >> // halvbåge 2 bak >> translate([widthHold-thick, 0, heightHold/2+thick/2]) >> rotate([0, 90, 180]) >> rotate_extrude(angle = 180, convexity=20, $fn=64) >> translate([heightHold/2-thick/2, 0, 0]) >> circle(d=thick*2); >> translate([widthHold-thick, 0, heightHold]) >> sphere(d=thick*2); // övre kulan >> translate([widthHold-thick, 0, thick]) >> sphere(d=thick*2); // undre kulan >> >> // en cylinder tvärsöver längst upp >> translate([thick, 0, heightHold]) >> { rotate([0,90,0]) >> cylinder(h=widthHold-thick*2, r=thick); >> } >> } >> >> // Halvbågen (kabelhållaren) på baksidan switchen >> translate([widthHold-thick, -thick, heightHold/2+thick/2]) >> { rotate([0,90,180]) >> linear_extrude(widthHold-thick*2) >> arc(heightHold/2-thick/2, [0, 180], thick, fn); //radius, angles, >> width, fn) >> } >> // en cylinder tvärsöver längst ned >> translate([thick, -thick, thick]) >> { rotate([0,90,0]) >> cylinder(h=widthHold-thick*2, r=thick); >> } >> } >> >> >> >> module switch(posX=0, posY=0, posZ=0) >> { buttRadie = 1.5; >> height = 10.5; >> width = 33.5; >> depth = 23.5; >> h1x = buttRadie; >> h1y = buttRadie; >> h2x = width-buttRadie; >> h2y = buttRadie; >> h3x = width-buttRadie; >> h3y = depth-buttRadie; >> h4x = buttRadie; >> h4y = depth-buttRadie; >> >> translate([posX, posY, posZ]) >> { difference() >> { color("#F9F9F3") >> // tryck-knappen >> union() >> { translate([width/2, depth+6-0.1, height/2]) >> { rotate([90, 0, 0]) >> { translate([0,0,6]) >> circle(d=6.8); // skuggan runt knapp >> cylinder(h=6, d=6); >> sphere(d=6); >> } >> } >> >> hull() // Switchkropp >> { translate([h1x, h1y]) >> cylinder(h=height, r=1.5); >> translate([h2x, h2y]) >> cylinder(h=height, r=1.5); >> translate([h3x, h3y]) >> cylinder(h=height, r=1.5); >> translate([h4x, h4y]) >> cylinder(h=height, r=1.5); >> } >> } >> >> // Skruvhålen för switchen >> hole( 4, 12, 0, "#FFD700", height); >> hole(29.6, 12, 0, "#FFD700", height); >> // hole( 4, 12, 0, "#FFD700", 50); >> // hole(29.6, 12, 0, "#FFD700", 50); >> // hål för kablar bak >> color("gray") >> { translate([9.5, 16, height/2]) >> { rotate([90, 0, 0]) >> cylinder(h=16.5, d=4); >> } >> translate([24.5, 16, height/2]) >> { rotate([90, 0, 0]) >> cylinder(h=16.5, d=4); >> } >> } >> >> // hål för kabelskruvar >> color("white") >> { translate([29.5, 17.1, height/2]) >> { rotate([0, 90, 0]) >> cylinder(h=4.1, d=4.5); >> } >> translate([-0.1, 17.1, height/2]) >> { rotate([0, 90, 0]) >> cylinder(h=4.1, d=4.5); >> } >> } >> } >> >> // Kabelskruvar >> cableScrew(3, 17, height/2, 90); >> cableScrew(31, 17, height/2, -90); >> >> } >> } >> >> // Skruven som håller fast kabeln i switchen >> module cableScrew(posX=0, posY=0, posZ=0, angle=0) >> { color("#FFD700") // mässing >> translate([posX, posY, posZ]) >> { rotate([0, 0, angle]) >> { difference() >> { // skruvskalle >> translate([0, 0, 0]) >> rotate([90, 0, 0]) >> cylinder(h=2, d1=4, d2=3.5); >> >> // stjärnan i skruven >> translate([0, 1.85, -.25]) >> rotate([0, 0, 0]) >> cylinder(h=0.5, d=5); >> translate([-0.25, -.6, 2.25]) >> rotate([0, 90, 0]) >> cube([4.5, 2, 0.5]); >> } >> } >> } >> } >> >> >> >> // borrhål >> module hole(posX=0, posY=0, posZ=0, colorName="yellow", height) >> { diamHole1 = 3; >> highHole1 = height; >> diamHole2 = 6; >> highHole2 = 2.5; >> offs=0.1; >> >> color(colorName) >> { >> translate([posX, posY, posZ]) >> { translate([0, 0, 0]) >> cylinder(h=highHole1, d=diamHole1); >> translate([0, 0, -offs]) >> cylinder(h=highHole2, d=diamHole2); >> translate([0, 0, height-highHole2+offs]) >> cylinder(h=highHole2, d=diamHole2); >> } >> } >> } >> >> module showCables() >> { translate([-25,8,24]) >> rotate([80,177,90]) >> cable(10,10,0,"brun"); >> translate([-43,8,15]) >> rotate([90,180,90]) >> cable(10,10,0,"blå"); >> } >> >> >> module cable(posX=0, posY=0, posZ=0, colorName="blå", radius=1.26, >> width=0.62, thick=50, fn=24) >> { // default 1.5mm2 >> // radius = inner radie >> // width = bredd/tjocklek på cirkeln (inte höjd) >> // thick = höjd på cirken/ röret >> // pin= >> >> colCupper = "#D7715A"; >> colGreen = "#07DA63"; >> colYellow = "#FFCC00"; >> >> if (colorName=="gröngul") >> { translate([posX, posY, posZ]) >> { color(colGreen) >> linear_extrude(thick) >> arc(radius, [0, 60], width, fn); >> color(colYellow) >> linear_extrude(thick) >> arc(radius, [60, 180], width, fn); >> color(colGreen) >> linear_extrude(thick) >> arc(radius, [180, 240], width, fn); >> color(colYellow) >> linear_extrude(thick) >> arc(radius, [240, 360], width, fn); >> >> color(colCupper) >> linear_extrude(10, center=true, convexity=10, $fn=100) >> circle(d=1.24); >> } >> } >> else // vanliga kablar 1.5mm2 >> { >> cableColor = colorName == "blå" ? "#1870D5" >> : colorName == "brun" ? "#9C6137" >> : colorName == "svart" ? "#000000" >> : assert(false,"invalid color value"); // message if no >> case worked >> // : nodef >> >> translate([posX, posY, posZ]) >> { //el kabel - ena änden rak - andra böjd >> color(colCupper) //kopparstump tråd rakkabel >> linear_extrude(10, center=true, convexity=10, $fn=100) >> circle(d=1.24); >> >> color(cableColor) >> { cylinder(h=thick, r=radius); >> >> translate([-radius*2, 0, thick]) // kabelböj >> rotate([90, 0, 0]) >> rotate_extrude(angle=90, convexity=20) >> translate([2.5, 0, 0]) >> circle(r=1.26); >> >> translate([-radius*2, 0, thick+radius*2]) >> rotate([0, -90, 0]) >> cylinder(h=5, r=radius); >> } >> translate([-10, 0, thick+radius*2]) >> { rotate([0, -90, 0]) >> { color(colCupper) >> { linear_extrude(5, center=true, convexity=10, $fn=100) >> circle(d=1.24); >> } >> } >> } >> } >> } >> } >> >> >> // ====================================================================== >> module arc(radius, angles, width = 1, fn = 24) { >> difference() { >> sector(radius + width, angles, fn); // ytterradie >> sector(radius, angles, fn); // innerradie (plockar bort >> invändigt >> } >> } >> >> module sector(radius, angles, fn = 24) { >> r = radius / cos(180 / fn); >> step = -360 / fn; >> >> points = concat([[0, 0]], >> [for(a = [angles[0] : step : angles[1] - 360]) >> [r * cos(a), r * sin(a)] >> ], >> [[r * cos(angles[1]), r * sin(angles[1])]] >> ); >> >> difference() { >> circle(radius, $fn = fn); >> polygon(points); >> } >> } >> = = END product 2 = = = = = = = = = = = = = = = = = = = = = = = = = = = = >> = = >> - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - >> . _ . - . _ . - . _ . - . _ . - >> >> >> Den fredag 6 maj 2022 14:06:55 CEST, Michael Möller < >> private2michael@gmail.com> skrev: >> >> >> >> OpenSCAD code - is a description of your model in terms of a few >> cylinder/cubes added and cut out >> difference() { >> cylinder(d=5,h=10); >> translate([0,10,0]) cube([4,6,2]) ; >> } >> >> STL file is a list of triangles which make the same outer shell as your >> model. OpenSCAD makes this complicated transform from shapes to triangles. >> solid OpenSCAD_Model >> facet normal 0.92388 0.382682 0 >> outer loop >> vertex 2.5 0 3 >> vertex 1.76777 1.76777 0 >> vertex 1.76777 1.76777 3 >> endloop >> endfacet >> facet normal 0.92388 0.382682 0 >> outer loop >> vertex 1.76777 1.76777 0 >> vertex 2.5 0 3 >> vertex 2.5 0 0 >> endloop >> endfacet >> : (and so on for 300 lines) There is a binary/compressed version, but >> the description is still just triangles. >> >> Gcode is what a 3D printer understands - it is the exact list of moves >> that the head has to do with how much plastic to squeeze to trace the >> outline of your shape, layer, by layer. It will optionally create moves for >> filling the inside or support for overhangs. Such a program is called a >> SLICER and the printer will come with one. >> G92 E0 ; reset extrusion distance >> G1 Z2.330 F6600.000 ; lift Z >> G1 X-0.000 Y1.505 F6600.000 ; move to first perimeter point >> G1 Z0.330 F6600.000 ; restore layer Z >> G1 E3.00000 F2400.00000 ; unretract extruder 0 >> G1 F1500 >> G1 X-1.064 Y1.064 E3.09259 ; perimeter >> G1 X-1.505 Y0.000 E3.18517 ; perimeter >> : (many similar lines) >> G1 X1.515 Y1.515 E4.65860 ; perimeter >> G1 X0.055 Y2.120 E4.78559 ; perimeter >> G1 X-0.000 Y2.143 F6600.000 ; move inwards before travel >> G1 X0.384 Y0.843 F6600.000 ; move to first infill point >> G1 F1500 >> G1 X0.843 Y0.384 E4.84815 ; infill >> G1 X1.097 Y-0.229 E4.91215 ; infill >> : >> (and so on for thousands of lines) >> >> The 3MF still basically deals in triangles, and attributes (surface, >> infill material, picture, ticket info ... ) which probably are not used by >> your slicer/printer. >> >> On Fri, 6 May 2022 at 12:37, Jan Öhman via Discuss < >> discuss@lists.openscad.org> wrote: >> >> >> >> >> ---------- Forwarded message ---------- >> From: "Jan Öhman" <jan_ohman@yahoo.com> >> To: OpenSCAD General Discussion <discuss@lists.openscad.org> >> Cc: >> Bcc: >> Date: Fri, 6 May 2022 10:38:46 +0000 (UTC) >> Subject: [OpenSCAD] Export to .STL / .3MF for later 3D-printing. >> Hi! >> >> Thought to create some objects in openSCAD, to print later. >> I do not have my own 3D printer (yet). >> >> One I talked to, wanted to get the drawings in .STL or .3MF. (I don't >> know the difference). >> >> If I had my own printer, have I been able to print directly from openSCAD? >> (Without some export?) >> >> In the openSCAD, no errors or problems occur. >> but >> The drawings I tested to export from openSCAD have given one or another >> error message. >> One message .: >> WARNING: Object may not be a valid 2-manifold and may need repair! >> >> Another message .: >> WARNING: No top level geometry to render >> >> What to do? >> >> >> >> ---------- Forwarded message ---------- >> From: "Jan Öhman via Discuss" <discuss@lists.openscad.org> >> To: OpenSCAD General Discussion <discuss@lists.openscad.org> >> Cc: "Jan Öhman" <jan_ohman@yahoo.com> >> Bcc: >> Date: Fri, 6 May 2022 10:38:46 +0000 (UTC) >> Subject: [OpenSCAD] Export to .STL / .3MF for later 3D-printing. >> _______________________________________________ >> OpenSCAD mailing list >> To unsubscribe send an email to discuss-leave@lists.openscad.org >> >> _______________________________________________ >> OpenSCAD mailing list >> To unsubscribe send an email to discuss-leave@lists.openscad.org >> >> >> >> ---------- Forwarded message ---------- >> From: "Jan Öhman via Discuss" <discuss@lists.openscad.org> >> To: OpenSCAD general discussion <discuss@lists.openscad.org> >> Cc: "Jan Öhman" <jan_ohman@yahoo.com> >> Bcc: >> Date: Sat, 7 May 2022 11:04:31 +0000 (UTC) >> Subject: [OpenSCAD] Re: Export to .STL / .3MF for later 3D-printing. >> _______________________________________________ >> OpenSCAD mailing list >> To unsubscribe send an email to discuss-leave@lists.openscad.org >> > _______________________________________________ > OpenSCAD mailing list > To unsubscribe send an email to discuss-leave@lists.openscad.org >
AM
Adrian Mariano
Sat, May 7, 2022 5:05 PM

I already gave a full explanation of what's wrong and how to fix the
first program.  It has a 2d polygon (easily found as there is one lone
polygon call) that needs to be removed or linear_extruded as
appropriate.  And it makes use of path_sweep in a manner that produces
a self-intersecting polyhedron.  This issue is explained in the manual
page for path_sweep.  This can be fixed either by switching to
path_extrude2d() or by changing the corner radius to eliminate the
self-intersections.  Or changing to a profile that can actually be
rounded at the desired radius.

https://github.com/revarbat/BOSL2/wiki/skin.scad#functionmodule-path_sweep

On Sat, May 7, 2022 at 12:57 PM Michael Möller
private2michael@gmail.com wrote:

Jan Öhman wrote it failed in Render/F6, but works in Preview/F5 - in so many words. I tried and got the following

First model

F6 Error: WARNING: Ignoring 2D child object for 3D operation in file , line 53

ERROR: CGAL error in CGALUtils::applyUnion3D: CGAL ERROR: assertion violation! Expr: G.mark(v1,0)==G.mark(v2,0)&& G.mark(v1,1)==G.mark(v2,1) File: /mxe/usr/x86_64-w64-mingw32.static.posix/include/CGAL/Nef_S2/SM_overlayer.h Line: 303

Which I think is pretty selfexplantory: Passed a 2D shape to something that expected a 3D shape - but you have to read the whole code to find it ... which I think Jan is more qualified to do :-)

2nd part

... which is one of those where zooming or rotating the model in preview takes >5 second

And I didn't bother waiting for the F6 error ... ;-)

Of course, we do not know if the above shapes I got are the ones that Jan wants - there are also sections of code commented out.

(From the comments it seems these are to be nice and alternative covers for wall outlet/switches.)

On Sat, 7 May 2022 at 18:26, Sanjeev Prabhakar sprabhakar2006@gmail.com wrote:

Quite a long code.
Can you paste a picture of what you are trying to draw.
Regards
Sanjeev

On Sat, 7 May 2022, 16:31 Jan Öhman via Discuss, discuss@lists.openscad.org wrote:

---------- Forwarded message ----------
From: "Jan Öhman" jan_ohman@yahoo.com
To: OpenSCAD general discussion discuss@lists.openscad.org
Cc:
Bcc:
Date: Sat, 7 May 2022 11:04:31 +0000 (UTC)
Subject: [OpenSCAD] Re: Export to .STL / .3MF for later 3D-printing.
Thank you!
Begins to understand how it works. (It was not easy...)

but my solution was not good ...

Here are 2 files that do not work to render (F6)

= = product 1= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

  • . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . -

include <BOSL2/std.scad>
fn = 150;

placering="left";
// placering="right"

box(0, 0, 0, placering, "#C0C0C0", fn); // (X, Y, Z, left/right, colorName)

// Monteringsplattan
// mountingPlate(0, 0, 0, placering);

// LED belysning
// LEDlampa(0, 0, 0, placering);

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - - - m o d u l e r - - - - - - - - - - - - - - - - - -

//


---================

//======  box


---===

module box(posX=0, posY=0, posZ=0, mountSide="left", colorName="#00FF00", fn=24)
{
side = mountSide == "left" ? 0
: mountSide == "right" ? 1
: assert(false,"invalid moutSide value");  // message if no case worked

color(colorName)
translate([posX, posY, posZ])
mirror([side, 0, 0])
difference()
{
union()
{
// Skapa konturer på bottenplattan - x, y, r, angles, [grader], början
// Rotation medurs - vänster lamphållare (bakant saknas)
points1 = circSect( 140,  0,  0, [0, 0], "right",  1, fn);  // böj nere till höger
points2 = circSect(  60,  5,  5, [0, 5], "bottom",  1, fn); // brytpunkt längst ned
points3 = circSect(  10, 13,  10, [0, 90], "bottom", 1, fn); // böj nere till vänster
points4 = circSect(  5, 80,  5, [0, 90], "left",  1, fn); // böj uppe till vänster
points5 = circSect( 140, 80,  5, [0, 1], "top",  1, fn);  // böj uppe till höger
edge = concat(points1, points2, points3, points4, points5);
path = path3d(reverse(edge));
section = wall();
path_sweep( section, path, closed=false);

// Skapa bakkant lite högre och smalare i topp
bottom1 = concat(points5, points1);
polygon(bottom1);
path1 = path3d(reverse(bottom1));
section1 = wall1(); // lite högre bakvägg wall(b=4, f=8, h=15, t=3.5)
path_sweep( section1, path1, closed=false);

// fyll upp bottenplattansbaksida
linear_extrude(4) // Bottomplate - fill up
polygon(concat(points1, points2, points3, points4, points5));

// skapa Utskjutande del under (tänk spegelvänt)
pt1 = circSect(  19.5, 85, 0, [0, 50], "top", 1, fn);  // Uppe till höger - moturs
pt2 = circSect(  39, 1.35,  .1, [-5, 90], "right", 1, fn);  // Nere till höger
pt3 = circSect(  10, 13.05,  10, [0, 90], "bottom", 1, fn);  // Nere till vänster
pt4 = circSect(  5, 80, 5, [0, 90], "left",  1, fn);  // Uppe till vänster
translate([0, 0, -2])
linear_extrude(2.1)
polygon(concat(pt1, pt2, pt3, pt4));

// utgången för kabeln på baksidan (diam 10mm) - pekar lite nedåt
cableExit(65, 35, 0, 15, "cyan", $fn=100);
}

// skapa ett borrhål i bakkant
translate([132,60,15])
{ rotate([0, 90, 0])
{ cylinder(h=10, d=2, $fn=100);
cylinder(h=4, d=9, $fn=100);
}
}

// skapa en borrmarkering i bakkant
translate([139,25,15])
{ rotate([0, 90, 0])
cylinder(h=2, d1=1, d2=2.5, $fn=100);
}

// ingravera årtalet på baksidan
translate([10, 80, -0.5])
{ mirror([side, 0, 0])
{ rotate([0, 180, 0])
{ linear_extrude(3)
text("2022", size=12, direction="ttb", font="Comic Sans MS:style=Bold");
}
}
}

/*
// Markera skruvhål på bakkant
borr=3;
bredd=140;
hojd=8;
avstNed=20;
translate([bredd, avstNed, hojd])
{ rotate([0,90,0])
cylinder(h=2, d1=0.5, d2=borr, center=true, $fn=50);
}
*/

// borrhål
mountingHole(20, 36, 0, 7, 90.1, 15); // posX, posY, posZ, diam, dist, deep, $fn=50

}
}
//========  Slut box
---=============================

//


---================

//======  cableExit
---==============================
module cableExit(posX, posY, posZ, angle, colorName)
{ diamHole = 7;
diamHolder = 9.8;
hight = 12;
topRad = diamHolder/2;
topDiam = diamHolder/2-topRad/2;
bowRad = 7;
offs1 = 0.1;

color(colorName)
translate([posX, posY, posZ])
{  rotate([180, 0, 180-angle])
{ difference()
{ hull()
{ cylinder(h=hight, d=diamHolder, center=false);
translate([0, 0, hight])        // rundad topp
rotate_extrude(angle=360, convexity=2)
translate([topDiam, 0, 0])  // yttre diam topp
circle(d=topRad);        // radie topp
}

    inpHight  =  2;   // ett värde som styr var utgångshålet hamnar
    translate([0, 0, -offs1])
      cylinder(h=inpHight+offs1, d=diamHole, center=false); // Bottenhål

    translate([-bowRad, 0, inpHight-offs1]) // böjen
    { rotate([90, 0, 0])
        rotate_extrude(angle=90, convexity=10)
          translate([bowRad, 0, 0]) // ställ in radien på kabelböjen
            circle(d=diamHole);
    }
  }
}

}
}
//======  slut cableExit
---=========================

//


---================

//======  mountingHole
---===========================
module mountingHole(posX=0, posY=0, posZ=0, diam=7, dist=90, deep=5, $fn=50)
{ // diam =  6;  // [mm]
// dist = 90;  // [mm]
// deep =  12;  // [mm]

translate([posX, posY, posZ])
{ translate([0, 0, -10])
cylinder(h=deep, d=diam);  // fästhål 1

//cableHold1(dist/2, 0, .2, "#D5D5D5");  // Kabelgenomföring
translate([dist/2, 0, 0])
{  hull()
  { cylinder(h=5, d=6);  // fästhål 1
    sphere(d=7.5);
  }
}

translate([dist, 0, -10])
  cylinder(h=deep, d=diam); // fästhål 2

}
}
//======  slut mountingHole
---======================

//


---================

//======  LEDlampa
---===============================
// module LEDlampa(posX=8, posY=10, posZ=0)
module LEDlampa(posX=0, posY=0, posZ=0, mountSide="left")
{ side = mountSide == "left" ? 0
: mountSide == "right" ? 1
: assert(false,"invalid moutSide value");  // message if no case worked

xpos = mountSide == "left" ? 121
: mountSide == "right" ? -10
: assert(false,"invalid moutSide value");  // message if no case worked
/*
ypos = mountSide == "left" ? 10.5
: mountSide == "right" ? 10.5
: assert(false,"invalid moutSide value");  // message if no case worked

zpos = mountSide == "left" ? 5
: mountSide == "right" ? 5
: assert(false,"invalid moutSide value");  // message if no case worked
*/
// echo(xpos,ypos,zpos);
// translate([xpos, ypos, zpos])
translate([xpos, 10.5, 5])
mirror([1, 0, 0])
translate([posX, posY, posZ])
{ LEDbottom();
translate([0, 0, 11])
LEDglas();
}
}
//======  Slut LEDlampa
---==========================

//


---================

//======  LEDglas
---================================
module LEDglas()
{
// Variabler botten
length  = 111;  // längd mm
wideMid = 50.5;  // bredd i mitten mm

cornRad = 10;    // Radien i alla hörn
wideCorn = 48;  // Bredd i kanterna

diamHole = 6;    // håldiameter i mm

colorBot = "gray";
colorTop = "orange";

// Variabler top
cornHigh = 5;  //Höjd i ändarna
midHigh  = 8;
highTop = cornHigh + 1;  // höjd mm

p1tx = 10;      // the start value
p1ty = 49.25;
p2tx = 55.5;    // the middle value
p2ty = 50.5;
p3tx = 101;    // the end value
p3ty = p1ty;

p4tx = 101;    // the start value
p4ty = 1.25;
p5tx = 55.5;    // the middle value
p5ty = 0.0;
p6tx = 10;      // the end value
p6ty = p4ty;
// Ger ovalt glas
points1 = 3points_arc([p1tx,p1ty], [p2tx,p2ty], [p3tx,p3ty], fn=100);
points2 = 3points_arc([p4tx,p4ty], [p5tx,p5ty], [p6tx,p6ty], fn=100);

color("orange")
linear_extrude(height=cornHigh+.1)
difference()
{ polygon(concat(points1, points2));

translate([length-10 , wideMid / 2, -.2])
  circle(d=6);
translate([10 , wideMid / 2, -.2])
  circle(d=6);

}

// Top
color(colorTop)
difference()
{ hull()
{ // hörn1
translate([cornRad, wideMid - ((wideMid-wideCorn)/2) - cornRad, 0]) // [10,39]
cylinder(h=cornHigh, d=cornRad2, center=false);
// hörn2
translate([cornRad, cornRad + ((wideMid-wideCorn)/2), 0])          // [10,12]
cylinder(h=cornHigh, d=cornRad
2, center=false);
// hörn3
translate([length - cornRad, wideMid - ((wideMid-wideCorn)/2) - cornRad, 0]) // [101 ,39]
cylinder(h=cornHigh, d=cornRad2, center=false);
// hörn4
translate([length - cornRad, cornRad + ((wideMid-wideCorn)/2), 0])  //
cylinder(h=cornHigh, d=cornRad
2, center=false);
}

union()
{ // Monteringshål 1 & 2
  translate([length-10 , wideMid / 2, -.2])
    cylinder(d=diamHole, h=highTop+.5, center=false);
  translate([10 , wideMid / 2, -.2])
    cylinder(d=diamHole, h=highTop+.5, center=false);
}

}
}
//========  Slut LEDglas
---=========================

//


---================

//======  LEDbottom
---==============================
module LEDbottom()
{ p1x = 10;      // the start value
p1y = 49.25;
p2x = 55.5;    // the middle value
p2y = 50.5;
p3x = 101;    // the end value
p3y = p1y;

p4x = 101;    // the start value
p4y = 1.25;
p5x = 55.5;    // the middle value
p5y = 0.0;
p6x = 10;      // the end value
p6y = p4y;

// Variabler botten för borrhålen
length  = 111;  // längd mm
wideMid = 50.5;  // bredd i mitten mm
diamHole = 6;    // håldiameter i mm
cornHigh = 5;  //Höjd i ändarna
midHigh  = 8;
highTop = cornHigh + 1;  // höjd mm
// offs1 = 0.1;
heightHole = 15; //mm
height = 11; //mm

points1 = circSect(  10, 11.25,  10, [0, 90], "bottom", 1, fn); // Hörn nere till vänster
points2 = circSect(  10, 39.25,  10, [0, 90], "left",  1, fn); // Hörn uppe till vänster
points3 = 3points_arc([p1x,p1y], [p2x,p2y], [p3x,p3y], fn);
points4 = circSect( 101, 39.25,  10, [0, 90], "top",    1, fn); // Hörn uppe till höger
points5 = circSect( 101, 11.25,  10, [0, 90], "right",  1, fn); // Hörn nere till höger
points6 = 3points_arc([p4x,p4y], [p5x,p5y], [p6x,p6y], fn);

// The base plate for the LED lamp

difference()
{ color("gray", 0.5)
linear_extrude(height=height)
polygon(concat(points1, points2, points3, points4, points5, points6));

// union()
{ // Monteringshål 1 & 2
translate([length-10 , wideMid / 2, -.2])
cylinder(d=diamHole, h=heightHole, center=false);
translate([10 , wideMid / 2, -.2])
cylinder(d=diamHole, h=heightHole, center=false);
}
}
}
//========  Slut LEDbottom
---=======================

//


---================

//======  circleSect
---=============================
// Create rounded corners 2D
// https://openhome.cc/eGossip/OpenSCAD/SectorArc.html
// ange .:  x, y, radien,
//          [från, till] vinkel,
//          var vinkeln startar, (left, bottom, right, top)
//          vilken rotation (-1=medsol, 1=motsols)
function circSect(x=0, y=0, radius=10, angles=[0,270], startRef="bottom", rotate=1, fn=24)  =
let(
startAngel  = (startRef == "left")  ?  0
: (startRef == "bottom") ?  90
: (startRef == "right")  ? 180
: (startRef == "top")    ? 270
: startRef,  // valfri vinkel
// : assert(false,"invalid moutSide value");  // Error message if no case worked
//: undef,
r = radius,
//r = radius / cos(180 / fn),
step = 360 / fn,
// points = [[x, y],
points = [
for(a = [angles[0]-startAngel : step : angles[1]-startAngel])
[-rotate * r * cos(a)+x, r * sin(a)+y]]
) points;
//========  Slut circleSect
---======================

//


---================

//======  3points_arc
---============================
// Create an arc with three points 2D
function 3points_arc(p0, p1, p2, fn=10) =
// an alternative expression for D
// D  = 2 * ( (p1-p0).x * (p2-p0).y - (p1-p0).y * (p2-p0).x )
let( D  = 2 * cross(p1-p0, (p2-p0)) )
assert( abs(D)>1e-9, "The 3 points should not be collinear." )
let(
Ux    = ( (p2-p0).y*(p1-p0)(p1-p0) - (p1-p0).y(p2-p0)(p2-p0) )/D,
Uy    = ( (p1-p0).x
(p2-p0)(p2-p0) - (p2-p0).x(p1-p0)(p1-p0) )/D,
radius = norm([Ux,Uy]),
center = [Ux,Uy] + p0,
ang0  = atan2( (p0-center).y, (p0-center).x ),
ang2  = atan2( (p2-center).y, (p2-center).x ),
// the points are in a cw winding iff D<0
// the angular difference between vectors p2-center and p0-center
// measured from p0-center; dang is positive iff D is negative
dang  = D<0  ? ang2<ang0 ? ang2-ang0 : ang2-ang0-360
: ang2>ang0 ? ang2-ang0 : ang2-ang0+360
)
[ for(i=[0:fn-1])
let( ang = ang0 + i
dang/(fn-1) )
center + radius*[cos(ang),sin(ang)] ];
//========  Slut 3points_arc
---=====================

//


---================

//======  Wall som ett "L"
---=======================
// Normal vägghöjd
function wall() =
let(
b =  4,    // botten - tjocklek
f =  8,    // Foten
h = 15,    // Höjd
t =  3.5,  // Top
x = (b+(t/2) - (h - ( (-h / (f-t)) *t) )) / (-h / (f-t))
)
let(
points = [[0,0], [f,0], [t,h], [0,h]] ,
top = move([t/2, h, 0], circle(d=t, $fn=20)),
sqr = square([10, b]),
diff =
difference([
move([x, b], square([t/2, t/2])),
move([x+(t/2), b+(t/2), 0], circle(d = t, $fn=20) ) ])
)
union([points, top, sqr, diff]);
//========  Slut Wall
---============================

//


---================

//======  Wall1 som ett "L"
---======================
// En högre vägg
function wall1() =
let(
b =  4,    // botten - tjocklek
f =  7,    // Foten
h = 25,    // Höjd
t =  3,  // Top
x = (b+(t/2) - (h - ((-h / (f-t)) *t))) / (-h / (f-t))
)
let(
points = [[0,0], [f,0], [t,h], [0,h]] ,
top = move([t/2, h, 0], circle(d=t, $fn=20)),
sqr = square([10, b]),
diff =
difference([
move([x, b], square([t/2, t/2])),
move([x+(t/2), b+(t/2), 0], circle(d = t, $fn=20) ) ])
)
union([points, top, sqr, diff]);
//========  Slut Wall1
---===========================

//


---================

//======  Plåt på släp
---===========================
module mountingPlate(posX=0, posY=0, posZ=0, mountSide="left", colorName="#C0C0C0", $fn=50)
{ // Hörnpositionerna
posX1 = 120;
posY1 = 0;
posX2 = posX1;
posY2 = -200;
posX3 = 120 - 75;
posY3 = -200;
posX4 = 0;
posY4 = 0;
thick=2;  // tjocklek

side = mountSide == "left" ? 0
: mountSide == "right" ? 1
: assert(false,"invalid moutSide value");  // message if no case worked

xpos = mountSide == "left" ? 20
: mountSide == "right" ? -20
: assert(false,"invalid moutSide value");  // message if no case worked
/*
ypos = mountSide == "left" ? 85
: mountSide == "right" ? 85
: assert(false,"invalid moutSide value");  // message if no case worked

zpos = mountSide == "left" ? -thick
: mountSide == "right" ? -thick
: assert(false,"invalid moutSide value");  // message if no case worked
*/
color(colorName)
{  translate([posX, posY, posZ])
translate([xpos, 85, -thick])
{ mirror([side, 0, 0])
{ linear_extrude(thick)
hull()
{ translate([posX1, posY1, 0])
square(0.1, center = true);
translate([posX2, posY2, 0])
square(0.1, center = true);
translate([posX3, posY3, 0])
square(0.1, center = true);
translate([posX4, posY4, 0])
square(0.1, center = true);
}
}
}
}
}
= = END product 1= = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

  • . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . -

= = product 2 = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

  • . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . -

$fn=100;
//$fn=15;

//switch();
//cableHolder4(); //Switchboxen

// cableHolder3(0, 0, 0, 33.5, 23.5, 1.5, 2);
// showCables();

module cableHolder4(fn=24);
{ // idé från
// - https://www.thingiverse.com/thing:6400/files
// - https://ihrchive.wordpress.com/2011/02/14/openscad-tip-round-1-of-3-basic-rounding/

// mått på Switch
heightHold = 10.5;
widthHold = 33.5;
depthHold = 23.5;
spaceHold = 10.0; // utrymmet bakom switch
holdRadie = 2;  // radie i hörnen
thick = 2;
offset1=0.5;  // öka toleransen

// innermått
holeW = widthHold + offset1;
holeH = heightHold + offset1;
holeD = depthHold + spaceHold+offset1;

// yttermått
pad = 0.1;                  // Padding to maintain manifold
box_l = holeW + thick*2;  // Bredden på switchen
box_w = holeD + thick;            // Djupet på switchen
box_h = holeH + thick; // Height
round_r = holdRadie;        // Radius of round
smooth = 45;                // Number of facets of rounding cylinder

difference()
{ union() // Detta utförs i två steg.
{ difference()  // utför fasningar och kabelmarkeringar
{ mainBox(box_l, box_w, box_h, spaceHold+thick, round_r, thick, smooth, pad);

    // fasning vänster (underkant)
    translate([box_l/2-0.85, spaceHold-4.3, thick-offset1])  // sidled, fram/bak , upp/ned
      rotate([0,180,45])
        cylinder(h=thick, d1=holeW*1.414-thick-thick, d2=holeW*1.414, $fn=4);

    // fasning höger (underkant)
    translate([box_l/2-3.65, spaceHold-4.3, thick-offset1]) // sidled, fram/bak , upp/ned
      rotate([0,180,45])
        cylinder(h=thick, d1=holeW*1.414-thick-thick, d2=holeW*1.414, $fn=4);

    // kabelgenomföringar
    rotate([90, 180, 90]) // Markering ena sidan (vänster under)
      ovalCableHole(spaceHold/2-offset1, -1.75, -1.2);

    rotate([90, 180, 180]) // Markering bakkant (vänster under)
      ovalCableHole(spaceHold/2-1.55, -1.75, -spaceHold-0.85);

    rotate([90, 180, 180]) // Markering bakkant (höger under)
      ovalCableHole(widthHold-spaceHold/2-offset1, -1.75, -spaceHold-0.85);

    rotate([90, -180, 90])  // Markering ena sidan (höger under)
      ovalCableHole(3.75, -1.75, widthHold-0.1);
  }
} // Slut union - kropp

translate([-offset1/2, -spaceHold+pad, -pad]) // hålet där switchen ska placeras
  cube([holeW, holeD+pad, holeH+pad], center=false);

  translate([4, 12, 0])
    cylinder(h=15,d=3.2);
  translate([4, 12, 17.7])
    sphere(r=6);

  translate([29.6, 12, 0])
    cylinder(h=15,d=3.2);
  translate([29.6, 12, 17.7])
    sphere(r=6);

  /*  // Hål genom lock bak - om så önskas
  translate([box_l/2-thick, -6, offset1/2])
    cylinder(h=box_h+thick*4+offset1, d=3.2, $fn=100);  // hål genom lock bak

  translate([box_l/2-thick, -6, 17.7])
    sphere(r=6);    // kona hålet bak
  */

} // Slut difference() - box

difference()
{ union()
  { translate([29.6, 12, heightHold-offset1*2])
      cylinder(h=2,d=5.2);        // Stödhylsa för Switchskruv1
    translate([4, 12, heightHold-offset1*2])
      cylinder(h=2,d=5.2);        // Stödhylsa för Switchskruv2

    translate([holeW/2, -spaceHold+thick+1, holeH/2])
      rotate([180,0,0])
         backHole();
  } // union - slut

  translate([4, 12, 0])     //  Hålen i stödhylsorna
    cylinder(h=15,d=3.2);

  translate([29.6, 12, 0])  //  Hålen i stödhylsorna
    cylinder(h=15,d=3.2);

  translate([box_l/2-thick, -6, -offset1])  // hål i stödhylsa bak
    cylinder(h=box_h+offset1, d=3.2, $fn=100);

  // Sänk stödhylsan
  translate([ widthHold/2-7, -spaceHold-offset1, -thick+offset1])  // hål i stödhylsa bak
      cube([15, 8, 3]);


  // kabelmarkering
  // translate([0, 0, 0])  // hål i stödhylsa bak


  }

/*
translate([4, 12, 0])
#cylinder(h=15,d=3.2);
//translate([4, 13.5, 17.3])
//#sphere(r=6);

  translate([29.6, 12, 0])
    #cylinder(h=15,d=3.2);
  //translate([29.6, 13.5, 17.3])
    //#sphere(r=6);

*/

}

module backHole()
{ wallH = 10.5;

wide1  = 12; // endast runt cylindern
wide2  = 35; // hela väggen
deep1    =  4;
height1  = 10.5;
cornRad1  =  2;
diam1 = 8;
opt1 = 0.1;

//rundadFot();

// Rundad stäcka mellan t.ex. vägg och tak -bakkant
translate([wide2/2, diam1/2-cornRad1/2, -height1/2])
{ rotate([90, 0, -90])
{ linear_extrude(wide2)
{ difference()
{ square([cornRad1, cornRad1]);

      translate([cornRad1, cornRad1])
        circle(r=cornRad1);
    }
  }
}

}

// rundad stäcka1 (vänster) mellan t.ex. vägg och tak
translate([-wide2/2+0.15, deep1/2+cornRad1/2, -height1/2])
rotate([90, 0, 0])
{ linear_extrude(spaceHold)
{ difference()
{ square([cornRad1, cornRad1]);

    translate([cornRad1, cornRad1])
    circle(r=cornRad1);
  }
}

}

// rundad stäcka2 mellan t.ex. vägg och tak
translate([wide2/2-0.65, deep1/2+cornRad1/2, -height1/2])
rotate([0, -90, 90])
{ linear_extrude(spaceHold)
{ difference()
{ square([cornRad1, cornRad1]);

    translate([cornRad1, cornRad1])
      circle(r=cornRad1);
  }
}

}

// Skapa stödfot - bak
difference()
{ union()
{ //själva cylindern
translate([0, 1, 0])
{ cylinder(h=height1, d=diam1, center=true);
translate([0, diam1/2, 0])
cube([diam1,diam1-1,height1], center=true);
}

  // Rundad fot under cylinder ovan
  translate([0, 1, -height1/2])
  { rotate_extrude()
    { translate([diam1/2, 0, 0])
      { difference()
        { square([cornRad1, cornRad1]);

          translate([cornRad1, cornRad1])
            circle(r=cornRad1);
        }
      }
    }
  }

  // Rundad rakstäcka1 - cylinderfot - mellan t.ex. vägg och tak
  translate([diam1/2, diam1, -height1/2])
  { rotate([90, 0, 0])
    { linear_extrude(diam1)
      { difference()
        { square([cornRad1, cornRad1]);

          translate([cornRad1, cornRad1])
            circle(r=cornRad1);
        }
      }
    }
  }

  // Rundad rakstäcka2 - cylinderfot - mellan t.ex. vägg och tak
  translate([-diam1/2, diam1, -height1/2])
  { rotate([0, -90, 90])
    { linear_extrude(diam1)
      { difference()
        { square([cornRad1, cornRad1]);

          translate([cornRad1, cornRad1])
            circle(r=cornRad1);
        }
      }
    }
  }

  //väggen bakom cylindern som ska rundas
  translate([0, diam1/2-cornRad1, 0])
    cube([wide1, cornRad1, height1], center=true);

}


// Avrunda hörn1 bak
translate([-wide1/2, cornRad1/2, cornRad1])
{ hull()
  { cylinder(h=height1+opt1, r=cornRad1, center=true);
    {  translate([0, 0, -height1/2])
        sphere(r=cornRad1);
    }
  }
}

// Avrunda hörn2 bak
translate([wide1/2, cornRad1/2, cornRad1])
{ hull()
  { cylinder(h=height1+opt1, r=cornRad1, center=true);
    {  translate([0, 0, -height1/2])
        sphere(r=cornRad1);
    }
  }
}


// Plocka bort rundad fot bak samt det som sticker ut
translate([-wide1/2, diam1/2-cornRad1/2, -height1/2-opt1])
  cube([wide1, diam1/2+cornRad1, height1+opt1*2], center=false);

}
}

module ovalCableHole(posX, posY, posZ)
{ // Hål 5.5 x 3.5 mm
pan = 0.1;
cableHi = 1.5;

translate([posX, posY, posZ])
{ color("white")
{ translate([0, 0, -pan])
{ cylinder(h=cableHi, d=3.5);
//#translate([0, 0, 0]) cylinder(h=10, d=1);
//translate([0, 0, -1]) cylinder(h=1, d1=0, d2=1);
//translate([0, 0, 0]) sphere(d=1); // Inre kulan
//translate([0, 0, 1.5]) sphere(d=1); // Inre kulan

    translate([0, 0, -1]) sphere(d=0.8); // yttre kulan
    translate([0, 0, 2.5]) sphere(d=0.8); // yttre kulan

  }
  translate([2, 0, -pan])
  { cylinder(h=cableHi, d=3.5);
    // #translate([0, 0, -cableHi*2]) cylinder(h=10, d=0.5);
    //translate([0, 0, 0]) sphere(d=1); // Inre kulan
    //translate([0, 0, 1.5]) sphere(d=1); // Inre kulan

    translate([0, 0, -1]) sphere(d=0.8); // yttre kulan
    translate([0, 0, 2.5]) sphere(d=0.8); // yttre kulan

  }
  translate([-3.5/2, 0, -pan])
    cube([5.5, 3.5/2, cableHi]);
  translate([-0.25, -1.74, -pan])
    cube([2.5, 1.75, cableHi]);
}

}
}

module rundadFot()
{
// specifika värden för skruvdistansen bak
wallH = 10.5;

wide1  = 12; // endast runt cylindern
wide2  = 34; // hela väggen
deep1    =  4;
height1  = 10;
cornRad1  =  2;
diam1 = 8;
opt1 = 0.1;

color("magenta")
{ translate([0, 0, wallH])
{ difference()
{ union()
{ // Bakgavel
translate([wide2/2, opt1, height1/2])
{ rotate([90, 180, 0])
cube([wide2, height1, opt1]);
}

      // Golv
      translate([wide2/2, -height1+opt1, -height1/2])
        rotate([0, 180, 0])
          cube([wide2, height1, opt1]);

      //väggen bakom cylindern som kan rundas
      translate([0, -cornRad1/2, 0])
        cube([wide1, cornRad1, height1], center=true);

      //själva cylindern
      translate([0, -cornRad1/2, 0])
        cylinder(h=height1, d=diam1, center=true);

      // Rundad fot under cylinder ovan
      translate([0, -cornRad1/2, -height1/2])
      { rotate_extrude()
        { translate([diam1/2, 0, 0])
          { difference()
            { square([cornRad1, cornRad1]);

              translate([cornRad1, cornRad1])
                circle(r=cornRad1);
            }
          }
        }
      }

      // Rundad stäcka mellan t.ex. vägg och tak -bakkant
      translate([wide2/2, 0, -height1/2])
      { rotate([90, 0, -90])
        { linear_extrude(wide2)
          { difference()
            { square([cornRad1, cornRad1]);

              translate([cornRad1, cornRad1])
                circle(r=cornRad1);
            }
          }
        }
      }

      // rundad stäcka mellan t.ex. vägg och tak -sida1
      translate([-wide2/2, 0, -height1/2])
      { rotate([90, 0, 0])
        { linear_extrude(10)
          { difference()
            { square([cornRad1, cornRad1]);

              translate([cornRad1, cornRad1])
              circle(r=cornRad1);
            }
          }
        }
      }

      // rundad stäcka mellan t.ex. vägg och tak -sida2
      translate([wide2/2, -10, -height1/2])
      { rotate([90, 0, 180])
        { linear_extrude(10)
          { difference()
            { square([cornRad1, cornRad1]);

              translate([cornRad1, cornRad1])
              circle(r=cornRad1);
            }
          }
        }
      }
    } // Avsluta union = = = = = = = = = = = = = = = = = = = =


    // Avrunda hörn1 bak
    translate([-wide1/2+opt1*1.3, -deep1/2, cornRad1])
    { cylinder(h=height1+opt1, r=cornRad1, center=true);
        translate([0, 0, -height1/2])
          sphere(r=cornRad1);
    }

    // Avrunda hörn2 bak
    translate([wide1/2-opt1*1.3, -deep1/2, cornRad1])
    { cylinder(h=height1+opt1, r=cornRad1, center=true);
        translate([0, 0, -height1/2])
          sphere(r=cornRad1);
    }

    // Plocka bort rundad fot bak samt det som sticker ut
    translate([-wide1/2, 0, -height1/2-opt1])
      cube([wide1, diam1/2+cornRad1, height1+opt1*2], center=false);
  }
}

}
}

module mainBox(box_l, box_w, box_h, spaceHold, round_r, thick, smooth, pad)
{ translate([box_l/2-thick-offset1/2, box_w/2-spaceHold, box_h/2])
{
// To fix the corners cut the main cube with smaller cubes with spheres removed
difference()
{ cube([box_l, box_w, box_h], center = true);

  // Kant1 - liggande
  translate([0, -box_w/2+round_r, box_h/2-round_r])
  { difference()
    { translate([0,-round_r-pad,round_r+pad])
        cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center = true);
      rotate(a=[0,90,0])
        cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth);
    }
  }
  // Kant2 - liggande
  translate([0, box_w/2-round_r, box_h/2-round_r])
  { difference()
    { translate([0,round_r+pad,round_r+pad])
        cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center = true);
      rotate(a=[0,90,0])
        cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth);
    }
  }
  /*
  // Kant3 - liggande
  translate([0, -box_w/2+round_r, -box_h/2+round_r])
  { difference()
    { translate([0,-round_r-pad,-round_r-pad])
        cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center = true);
      rotate(a=[0,90,0])
        cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth);
    }
  }

  // Kant4 - liggande
  translate([0, box_w/2-round_r, -box_h/2+round_r])
  { difference()
    { translate([0,round_r+pad,-round_r-pad])
        cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center = true);
      rotate(a=[0,90,0])
        cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth);
    }
  }
*/
// ----
  // Kant1 - stående
  translate([-box_l/2+round_r, box_w/2-round_r, 0])
  { difference()
    { translate([-round_r-pad,round_r+pad,0])
        cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center = true);
      cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth);
    }
  }
  // Kant2 - stående
  translate([box_l/2-round_r, box_w/2-round_r, 0])
  { difference()
    { translate([round_r+pad,round_r+pad,0])
        cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center = true);
      cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth);
    }
  }
  // Kant3 - stående
  translate([-box_l/2+round_r, -box_w/2+round_r, 0])
  { difference()
    { translate([-round_r-pad,-round_r-pad,0])
        cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center = true);
      cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth);
    }
  }
  // Kant4 - stående
  translate([box_l/2-round_r, -box_w/2+round_r, 0])
  { difference()
    { translate([round_r+pad,-round_r-pad,0])
        cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center = true);
      cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth);
    }
  }

// ----
  // Kant1 liggande (andra hållet)
  translate([-box_l/2+round_r, 0, box_h/2-round_r])
  { difference()
    { translate([-round_r-pad, 0, round_r+pad])
        cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center = true);
      rotate(a=[0,90,90])
        cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth);
    }
  }
  // Kant2 liggande (andra hållet)
  translate([box_l/2-round_r, 0, box_h/2-round_r])
  { difference()
    {  translate([round_r+pad, 0, round_r+pad])
        cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center = true);
      rotate(a=[0,90,90])
        cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth);
    }
  }
  /*
  // Kant3 liggande (andra hållet)
  translate([-box_l/2+round_r, 0, -box_h/2+round_r])
  { difference()
    { translate([-round_r-pad, 0, -round_r-pad])
        cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center = true);
      rotate(a=[0,90,90])
        cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth);
    }
  }

  // Kant4 liggande (andra hållet)
  translate([box_l/2-round_r, 0, -box_h/2+round_r])
  { difference()
    { translate([round_r+pad, 0, -round_r-pad])
        cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center = true);
      rotate(a=[0,90,90])
        cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth);
    }
  }

/
// ----
// Hörn1 (övre)
translate([box_l/2-round_r, box_w/2-round_r, box_h/2-round_r])
{ difference()
{ translate([round_r+pad, round_r+pad, round_r+pad])
cube([round_r
2+pad, round_r2+pad, round_r2+pad], center = true);
sphere(round_r,$fn=smooth);
}
}
// Hörn2 (övre)
translate([-box_l/2+round_r, box_w/2-round_r, box_h/2-round_r])
{ difference()
{ translate([-round_r-pad, round_r+pad, round_r+pad])
cube([round_r2+pad, round_r2+pad, round_r2+pad], center = true);
sphere(round_r,$fn=smooth);
}
}
// Hörn3 (övre)
translate([box_l/2-round_r, -box_w/2+round_r, box_h/2-round_r])
{ difference()
{ translate([round_r+pad, -round_r-pad, round_r+pad])
cube([round_r
2+pad, round_r2+pad, round_r2+pad], center = true);
sphere(round_r,$fn=smooth);
}
}
// Hörn4 (övre)
translate([-box_l/2+round_r, -box_w/2+round_r, box_h/2-round_r])
{ difference()
{ translate([-round_r-pad, -round_r-pad, round_r+pad])
cube([round_r2+pad, round_r2+pad, round_r2+pad], center = true);
sphere(round_r,$fn=smooth);
}
}
/

// Hörn1 (undre)
translate([box_l/2-round_r, box_w/2-round_r, -box_h/2+round_r])
{ difference()
{ translate([round_r+pad, round_r+pad, -round_r-pad])
cube([round_r2+pad, round_r2+pad, round_r2+pad], center = true);
sphere(round_r,$fn=smooth);
}
}
// Hörn2 (undre)
translate([-box_l/2+round_r, box_w/2-round_r, -box_h/2+round_r])
{ difference()
{ translate([-round_r-pad, round_r+pad, -round_r-pad])
cube([round_r
2+pad, round_r2+pad, round_r2+pad], center = true);
sphere(round_r,$fn=smooth);
}
}
// Hörn3 (undre)
translate([box_l/2-round_r, -box_w/2+round_r, -box_h/2+round_r])
{ difference()
{ translate([round_r+pad, -round_r-pad, -round_r-pad])
cube([round_r2+pad, round_r2+pad, round_r2+pad], center = true);
sphere(round_r,$fn=smooth);
}
}
// Hörn4 (undre)
translate([-box_l/2+round_r, -box_w/2+round_r, -box_h/2+round_r])
{ difference()
{ translate([-round_r-pad, -round_r-pad, -round_r-pad])
cube([round_r
2+pad, round_r2+pad, round_r2+pad], center = true);
sphere(round_r,$fn=smooth);
}
}
*/
}
}
}
//

module cableHolder3(posX, posY, posZ, length, width, height, radius)
{ // Skapa toppen över switchen
// mått på Switchen
fn = 96;          // upplösning (endast bågen?)
heightHold = 10.5;
widthHold = 33.5;
depthHold = 23.5;
holdRadie = 1.5;  // radie i hörnen
thick = 1.5;      // tjocklek

translate([0,-thick,0])
{
difference(0, 0, 0)
{ hull()
{ difference()
{ translate([thick, 0, heightHold]) // vänster kant
{ rotate([-90, 0, 0])
{ cylinder(h=depthHold, d=thick2);
translate([0, 0, depthHold])
sphere(d=thick
2);          // längst fram
}
}
translate([0, -0.1, heightHold]) // plocka bort underdelen
rotate([-90, 0, 0])
cube([thick*2, thick+.1, depthHold+thick+.1]);
}

    difference()
    { translate([widthHold-thick, 0, heightHold]) // höger kant
      { rotate([-90, 0, 0])
        { cylinder(h=depthHold, d=thick*2);
          translate([0, 0, depthHold])
            sphere(d=thick*2);         // längst fram
        }
      }
      translate([widthHold-thick*2, -0.1, heightHold]) // plocka bort underdelen
      { rotate([-90, 0, 0])
          cube([thick*2, thick+.1, depthHold+thick+.1]);
      }
    }
  }

  // öppna hålen för monteringsskruvarna uppe på plattan
  translate([4, 13.5, 0])
    cylinder(h=15,d=3.2);
  translate([4, 13.5, 17.3])
    sphere(r=6);

  translate([29.6, 13.5, 0])
    cylinder(h=15,d=3.2);

  translate([29.6, 13.5, 17.3])
    sphere(r=6);
}

// halvbåge 1 bak
translate([thick, 0, heightHold/2+thick/2])
  rotate([0, 90, 180])
    rotate_extrude(angle = 180, convexity=20, $fn=64)
translate([heightHold/2-thick/2, 0, 0])
  circle(d=thick*2);
translate([thick, 0, heightHold])
  sphere(d=thick*2);  // övre kulan
translate([thick, 0, thick])
  sphere(d=thick*2);  // undre kulan


// halvbåge 2 bak
translate([widthHold-thick, 0, heightHold/2+thick/2])
  rotate([0, 90, 180])
    rotate_extrude(angle = 180, convexity=20, $fn=64)
translate([heightHold/2-thick/2, 0, 0])
  circle(d=thick*2);
translate([widthHold-thick, 0, heightHold])
  sphere(d=thick*2);  // övre kulan
translate([widthHold-thick, 0, thick])
  sphere(d=thick*2);  // undre kulan

// en cylinder tvärsöver längst upp
translate([thick, 0, heightHold])
{ rotate([0,90,0])
    cylinder(h=widthHold-thick*2, r=thick);
}

}

// Halvbågen (kabelhållaren) på baksidan switchen
translate([widthHold-thick, -thick, heightHold/2+thick/2])
{ rotate([0,90,180])
linear_extrude(widthHold-thick2)
arc(heightHold/2-thick/2, [0, 180], thick, fn); //radius, angles, width, fn)
}
// en cylinder tvärsöver längst ned
translate([thick, -thick, thick])
{ rotate([0,90,0])
cylinder(h=widthHold-thick
2, r=thick);
}
}

module switch(posX=0, posY=0, posZ=0)
{ buttRadie = 1.5;
height = 10.5;
width = 33.5;
depth = 23.5;
h1x = buttRadie;
h1y = buttRadie;
h2x = width-buttRadie;
h2y = buttRadie;
h3x = width-buttRadie;
h3y = depth-buttRadie;
h4x = buttRadie;
h4y = depth-buttRadie;

translate([posX, posY, posZ])
{ difference()
{ color("#F9F9F3")
// tryck-knappen
union()
{ translate([width/2, depth+6-0.1, height/2])
{ rotate([90, 0, 0])
{ translate([0,0,6])
circle(d=6.8);  // skuggan runt knapp
cylinder(h=6, d=6);
sphere(d=6);
}
}

    hull()  // Switchkropp
    { translate([h1x, h1y])
        cylinder(h=height, r=1.5);
      translate([h2x, h2y])
        cylinder(h=height, r=1.5);
      translate([h3x, h3y])
        cylinder(h=height, r=1.5);
      translate([h4x, h4y])
        cylinder(h=height, r=1.5);
    }
  }

  // Skruvhålen för switchen
  hole( 4, 12, 0, "#FFD700", height);
  hole(29.6, 12, 0, "#FFD700", height);
  // hole( 4, 12, 0, "#FFD700", 50);
  // hole(29.6, 12, 0, "#FFD700", 50);
  // hål för kablar bak
  color("gray")
  { translate([9.5, 16, height/2])
    { rotate([90, 0, 0])
        cylinder(h=16.5, d=4);
    }
    translate([24.5, 16, height/2])
    {  rotate([90, 0, 0])
        cylinder(h=16.5, d=4);
    }
  }

  // hål för kabelskruvar
  color("white")
  { translate([29.5, 17.1, height/2])
    { rotate([0, 90, 0])
        cylinder(h=4.1, d=4.5);
    }
    translate([-0.1, 17.1, height/2])
    { rotate([0, 90, 0])
        cylinder(h=4.1, d=4.5);
    }
  }
}

// Kabelskruvar
cableScrew(3, 17, height/2, 90);
cableScrew(31, 17, height/2, -90);

}
}

// Skruven som håller fast kabeln i switchen
module cableScrew(posX=0, posY=0, posZ=0, angle=0)
{ color("#FFD700")  // mässing
translate([posX, posY, posZ])
{ rotate([0, 0, angle])
{ difference()
{ // skruvskalle
translate([0, 0, 0])
rotate([90, 0, 0])
cylinder(h=2, d1=4, d2=3.5);

    // stjärnan i skruven
    translate([0, 1.85, -.25])
      rotate([0, 0, 0])
        cylinder(h=0.5, d=5);
    translate([-0.25, -.6, 2.25])
      rotate([0, 90, 0])
        cube([4.5, 2, 0.5]);
  }
}

}
}

// borrhål
module hole(posX=0, posY=0, posZ=0, colorName="yellow", height)
{ diamHole1 = 3;
highHole1 = height;
diamHole2 = 6;
highHole2 = 2.5;
offs=0.1;

color(colorName)
{
translate([posX, posY, posZ])
{ translate([0, 0, 0])
cylinder(h=highHole1, d=diamHole1);
translate([0, 0, -offs])
cylinder(h=highHole2, d=diamHole2);
translate([0, 0, height-highHole2+offs])
cylinder(h=highHole2, d=diamHole2);
}
}
}

module showCables()
{ translate([-25,8,24])
rotate([80,177,90])
cable(10,10,0,"brun");
translate([-43,8,15])
rotate([90,180,90])
cable(10,10,0,"blå");
}

module cable(posX=0, posY=0, posZ=0, colorName="blå", radius=1.26, width=0.62, thick=50, fn=24)
{ // default 1.5mm2
// radius = inner radie
// width = bredd/tjocklek på cirkeln (inte höjd)
// thick = höjd på cirken/ röret
// pin=

colCupper = "#D7715A";
colGreen  = "#07DA63";
colYellow = "#FFCC00";

if (colorName=="gröngul")
{ translate([posX, posY, posZ])
{ color(colGreen)
linear_extrude(thick)
arc(radius, [0, 60], width, fn);
color(colYellow)
linear_extrude(thick)
arc(radius, [60, 180], width, fn);
color(colGreen)
linear_extrude(thick)
arc(radius, [180, 240], width, fn);
color(colYellow)
linear_extrude(thick)
arc(radius, [240, 360], width, fn);

  color(colCupper)
    linear_extrude(10, center=true, convexity=10, $fn=100)
      circle(d=1.24);
}

}
else  // vanliga kablar 1.5mm2
{
cableColor = colorName == "blå" ? "#1870D5"
: colorName == "brun" ? "#9C6137"
: colorName == "svart" ? "#000000"
: assert(false,"invalid color value");  // message if no case worked
// : nodef

translate([posX, posY, posZ])
{             //el kabel - ena änden rak - andra böjd
  color(colCupper)    //kopparstump tråd rakkabel
    linear_extrude(10, center=true, convexity=10, $fn=100)
      circle(d=1.24);

   color(cableColor)
   { cylinder(h=thick, r=radius);

    translate([-radius*2, 0, thick])  // kabelböj
    rotate([90, 0, 0])
    rotate_extrude(angle=90, convexity=20)
      translate([2.5, 0, 0])
        circle(r=1.26);

    translate([-radius*2, 0, thick+radius*2])
      rotate([0, -90, 0])
      cylinder(h=5, r=radius);
  }
  translate([-10, 0, thick+radius*2])
  { rotate([0, -90, 0])
    { color(colCupper)
      { linear_extrude(5, center=true, convexity=10, $fn=100)
          circle(d=1.24);
      }
    }
  }
}

}
}

//


---====

module arc(radius, angles, width = 1, fn = 24) {
difference() {
sector(radius + width, angles, fn); // ytterradie
sector(radius, angles, fn);        // innerradie (plockar bort invändigt
}
}

module sector(radius, angles, fn = 24) {
r = radius / cos(180 / fn);
step = -360 / fn;

points = concat([[0, 0]],
    [for(a = [angles[0] : step : angles[1] - 360])
        [r * cos(a), r * sin(a)]
    ],
    [[r * cos(angles[1]), r * sin(angles[1])]]
);

difference() {
    circle(radius, $fn = fn);
    polygon(points);
}

}
= = END product 2 = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

  • . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . -

Den fredag 6 maj 2022 14:06:55 CEST, Michael Möller private2michael@gmail.com skrev:

OpenSCAD code - is a description of your model in terms of a few cylinder/cubes added and cut out
difference() {
cylinder(d=5,h=10);
translate([0,10,0]) cube([4,6,2]) ;
}

STL file is a list of triangles which make the same outer shell as your model. OpenSCAD makes this complicated transform from shapes to triangles.
solid OpenSCAD_Model
facet normal 0.92388 0.382682 0
outer loop
vertex 2.5 0 3
vertex 1.76777 1.76777 0
vertex 1.76777 1.76777 3
endloop
endfacet
facet normal 0.92388 0.382682 0
outer loop
vertex 1.76777 1.76777 0
vertex 2.5 0 3
vertex 2.5 0 0
endloop
endfacet
: (and so on for 300 lines) There is a binary/compressed version, but the description is still just triangles.

Gcode is what a 3D printer understands - it is the exact list of moves that the head has to do with how much plastic to squeeze to trace the outline of your shape, layer, by layer. It will optionally create moves for filling the inside or support for overhangs. Such a program is called a SLICER and the printer will come with one.
G92 E0 ; reset extrusion distance
G1 Z2.330 F6600.000 ; lift Z
G1 X-0.000 Y1.505 F6600.000 ; move to first perimeter point
G1 Z0.330 F6600.000 ; restore layer Z
G1 E3.00000 F2400.00000 ; unretract extruder 0
G1 F1500
G1 X-1.064 Y1.064 E3.09259 ; perimeter
G1 X-1.505 Y0.000 E3.18517 ; perimeter
: (many similar lines)
G1 X1.515 Y1.515 E4.65860 ; perimeter
G1 X0.055 Y2.120 E4.78559 ; perimeter
G1 X-0.000 Y2.143 F6600.000 ; move inwards before travel
G1 X0.384 Y0.843 F6600.000 ; move to first infill point
G1 F1500
G1 X0.843 Y0.384 E4.84815 ; infill
G1 X1.097 Y-0.229 E4.91215 ; infill
:
(and so on for thousands of lines)

The 3MF still basically deals in triangles, and attributes (surface, infill material, picture, ticket info ... ) which probably are not used by your slicer/printer.

On Fri, 6 May 2022 at 12:37, Jan Öhman via Discuss discuss@lists.openscad.org wrote:

---------- Forwarded message ----------
From: "Jan Öhman" jan_ohman@yahoo.com
To: OpenSCAD General Discussion discuss@lists.openscad.org
Cc:
Bcc:
Date: Fri, 6 May 2022 10:38:46 +0000 (UTC)
Subject: [OpenSCAD] Export to .STL / .3MF for later 3D-printing.
Hi!

Thought to create some objects in openSCAD, to print later.
I do not have my own 3D printer (yet).

One I talked to, wanted to get the drawings in .STL or .3MF. (I don't know the difference).

If I had my own printer, have I been able to print directly from openSCAD?
(Without some export?)

In the openSCAD, no errors or problems occur.
but
The drawings I tested to export from openSCAD have given one or another error message.
One message .:
WARNING: Object may not be a valid 2-manifold and may need repair!

Another message .:
WARNING: No top level geometry to render

What to do?

---------- Forwarded message ----------
From: "Jan Öhman via Discuss" discuss@lists.openscad.org
To: OpenSCAD General Discussion discuss@lists.openscad.org
Cc: "Jan Öhman" jan_ohman@yahoo.com
Bcc:
Date: Fri, 6 May 2022 10:38:46 +0000 (UTC)
Subject: [OpenSCAD] Export to .STL / .3MF for later 3D-printing.


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org

---------- Forwarded message ----------
From: "Jan Öhman via Discuss" discuss@lists.openscad.org
To: OpenSCAD general discussion discuss@lists.openscad.org
Cc: "Jan Öhman" jan_ohman@yahoo.com
Bcc:
Date: Sat, 7 May 2022 11:04:31 +0000 (UTC)
Subject: [OpenSCAD] Re: Export to .STL / .3MF for later 3D-printing.


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org

I already gave a full explanation of what's wrong and how to fix the first program. It has a 2d polygon (easily found as there is one lone polygon call) that needs to be removed or linear_extruded as appropriate. And it makes use of path_sweep in a manner that produces a self-intersecting polyhedron. This issue is explained in the manual page for path_sweep. This can be fixed either by switching to path_extrude2d() or by changing the corner radius to eliminate the self-intersections. Or changing to a profile that can actually be rounded at the desired radius. https://github.com/revarbat/BOSL2/wiki/skin.scad#functionmodule-path_sweep On Sat, May 7, 2022 at 12:57 PM Michael Möller <private2michael@gmail.com> wrote: > > Jan Öhman wrote it failed in Render/F6, but works in Preview/F5 - in so many words. I tried and got the following > > First model > > F6 Error: WARNING: Ignoring 2D child object for 3D operation in file , line 53 > > ERROR: CGAL error in CGALUtils::applyUnion3D: CGAL ERROR: assertion violation! Expr: G.mark(v1,0)==G.mark(v2,0)&& G.mark(v1,1)==G.mark(v2,1) File: /mxe/usr/x86_64-w64-mingw32.static.posix/include/CGAL/Nef_S2/SM_overlayer.h Line: 303 > > Which I think is pretty selfexplantory: Passed a 2D shape to something that expected a 3D shape - but you have to read the whole code to find it ... which I think Jan is more qualified to do :-) > > 2nd part > > ... which is one of those where zooming or rotating the model in preview takes >5 second > > And I didn't bother waiting for the F6 error ... ;-) > > > Of course, we do not know if the above shapes I got are the ones that Jan wants - there are also sections of code commented out. > > (From the comments it seems these are to be nice and alternative covers for wall outlet/switches.) > > > > On Sat, 7 May 2022 at 18:26, Sanjeev Prabhakar <sprabhakar2006@gmail.com> wrote: >> >> Quite a long code. >> Can you paste a picture of what you are trying to draw. >> Regards >> Sanjeev >> >> On Sat, 7 May 2022, 16:31 Jan Öhman via Discuss, <discuss@lists.openscad.org> wrote: >>> >>> >>> >>> >>> ---------- Forwarded message ---------- >>> From: "Jan Öhman" <jan_ohman@yahoo.com> >>> To: OpenSCAD general discussion <discuss@lists.openscad.org> >>> Cc: >>> Bcc: >>> Date: Sat, 7 May 2022 11:04:31 +0000 (UTC) >>> Subject: [OpenSCAD] Re: Export to .STL / .3MF for later 3D-printing. >>> Thank you! >>> Begins to understand how it works. (It was not easy...) >>> >>> but my solution was not good ... >>> >>> Here are 2 files that do not work to render (F6) >>> >>> >>> = = product 1= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = >>> - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - >>> >>> >>> include <BOSL2/std.scad> >>> fn = 150; >>> >>> placering="left"; >>> // placering="right" >>> >>> box(0, 0, 0, placering, "#C0C0C0", fn); // (X, Y, Z, left/right, colorName) >>> >>> >>> // Monteringsplattan >>> // mountingPlate(0, 0, 0, placering); >>> >>> >>> // LED belysning >>> // LEDlampa(0, 0, 0, placering); >>> >>> >>> // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >>> // - - - - m o d u l e r - - - - - - - - - - - - - - - - - - >>> >>> >>> //================================================================================== >>> //====== box ===================================================================== >>> module box(posX=0, posY=0, posZ=0, mountSide="left", colorName="#00FF00", fn=24) >>> { >>> side = mountSide == "left" ? 0 >>> : mountSide == "right" ? 1 >>> : assert(false,"invalid moutSide value"); // message if no case worked >>> >>> color(colorName) >>> translate([posX, posY, posZ]) >>> mirror([side, 0, 0]) >>> difference() >>> { >>> union() >>> { >>> // Skapa konturer på bottenplattan - x, y, r, angles, [grader], början >>> // Rotation medurs - vänster lamphållare (bakant saknas) >>> points1 = circSect( 140, 0, 0, [0, 0], "right", 1, fn); // böj nere till höger >>> points2 = circSect( 60, 5, 5, [0, 5], "bottom", 1, fn); // brytpunkt längst ned >>> points3 = circSect( 10, 13, 10, [0, 90], "bottom", 1, fn); // böj nere till vänster >>> points4 = circSect( 5, 80, 5, [0, 90], "left", 1, fn); // böj uppe till vänster >>> points5 = circSect( 140, 80, 5, [0, 1], "top", 1, fn); // böj uppe till höger >>> edge = concat(points1, points2, points3, points4, points5); >>> path = path3d(reverse(edge)); >>> section = wall(); >>> path_sweep( section, path, closed=false); >>> >>> >>> // Skapa bakkant lite högre och smalare i topp >>> bottom1 = concat(points5, points1); >>> polygon(bottom1); >>> path1 = path3d(reverse(bottom1)); >>> section1 = wall1(); // lite högre bakvägg wall(b=4, f=8, h=15, t=3.5) >>> path_sweep( section1, path1, closed=false); >>> >>> // fyll upp bottenplattansbaksida >>> linear_extrude(4) // Bottomplate - fill up >>> polygon(concat(points1, points2, points3, points4, points5)); >>> >>> >>> // skapa Utskjutande del under (tänk spegelvänt) >>> pt1 = circSect( 19.5, 85, 0, [0, 50], "top", 1, fn); // Uppe till höger - moturs >>> pt2 = circSect( 39, 1.35, .1, [-5, 90], "right", 1, fn); // Nere till höger >>> pt3 = circSect( 10, 13.05, 10, [0, 90], "bottom", 1, fn); // Nere till vänster >>> pt4 = circSect( 5, 80, 5, [0, 90], "left", 1, fn); // Uppe till vänster >>> translate([0, 0, -2]) >>> linear_extrude(2.1) >>> polygon(concat(pt1, pt2, pt3, pt4)); >>> >>> // utgången för kabeln på baksidan (diam 10mm) - pekar lite nedåt >>> cableExit(65, 35, 0, 15, "cyan", $fn=100); >>> } >>> >>> // skapa ett borrhål i bakkant >>> translate([132,60,15]) >>> { rotate([0, 90, 0]) >>> { cylinder(h=10, d=2, $fn=100); >>> cylinder(h=4, d=9, $fn=100); >>> } >>> } >>> >>> // skapa en borrmarkering i bakkant >>> translate([139,25,15]) >>> { rotate([0, 90, 0]) >>> cylinder(h=2, d1=1, d2=2.5, $fn=100); >>> } >>> >>> >>> // ingravera årtalet på baksidan >>> translate([10, 80, -0.5]) >>> { mirror([side, 0, 0]) >>> { rotate([0, 180, 0]) >>> { linear_extrude(3) >>> text("2022", size=12, direction="ttb", font="Comic Sans MS:style=Bold"); >>> } >>> } >>> } >>> >>> /* >>> // Markera skruvhål på bakkant >>> borr=3; >>> bredd=140; >>> hojd=8; >>> avstNed=20; >>> translate([bredd, avstNed, hojd]) >>> { rotate([0,90,0]) >>> cylinder(h=2, d1=0.5, d2=borr, center=true, $fn=50); >>> } >>> */ >>> >>> // borrhål >>> mountingHole(20, 36, 0, 7, 90.1, 15); // posX, posY, posZ, diam, dist, deep, $fn=50 >>> >>> } >>> } >>> //======== Slut box ============================================================== >>> >>> >>> //================================================================================== >>> //====== cableExit =============================================================== >>> module cableExit(posX, posY, posZ, angle, colorName) >>> { diamHole = 7; >>> diamHolder = 9.8; >>> hight = 12; >>> topRad = diamHolder/2; >>> topDiam = diamHolder/2-topRad/2; >>> bowRad = 7; >>> offs1 = 0.1; >>> >>> color(colorName) >>> translate([posX, posY, posZ]) >>> { rotate([180, 0, 180-angle]) >>> { difference() >>> { hull() >>> { cylinder(h=hight, d=diamHolder, center=false); >>> translate([0, 0, hight]) // rundad topp >>> rotate_extrude(angle=360, convexity=2) >>> translate([topDiam, 0, 0]) // yttre diam topp >>> circle(d=topRad); // radie topp >>> } >>> >>> >>> inpHight = 2; // ett värde som styr var utgångshålet hamnar >>> translate([0, 0, -offs1]) >>> cylinder(h=inpHight+offs1, d=diamHole, center=false); // Bottenhål >>> >>> translate([-bowRad, 0, inpHight-offs1]) // böjen >>> { rotate([90, 0, 0]) >>> rotate_extrude(angle=90, convexity=10) >>> translate([bowRad, 0, 0]) // ställ in radien på kabelböjen >>> circle(d=diamHole); >>> } >>> } >>> } >>> } >>> } >>> //====== slut cableExit ========================================================== >>> >>> >>> //================================================================================== >>> //====== mountingHole ============================================================ >>> module mountingHole(posX=0, posY=0, posZ=0, diam=7, dist=90, deep=5, $fn=50) >>> { // diam = 6; // [mm] >>> // dist = 90; // [mm] >>> // deep = 12; // [mm] >>> >>> translate([posX, posY, posZ]) >>> { translate([0, 0, -10]) >>> cylinder(h=deep, d=diam); // fästhål 1 >>> >>> //cableHold1(dist/2, 0, .2, "#D5D5D5"); // Kabelgenomföring >>> translate([dist/2, 0, 0]) >>> { hull() >>> { cylinder(h=5, d=6); // fästhål 1 >>> sphere(d=7.5); >>> } >>> } >>> >>> translate([dist, 0, -10]) >>> cylinder(h=deep, d=diam); // fästhål 2 >>> } >>> } >>> //====== slut mountingHole ======================================================= >>> >>> >>> //================================================================================== >>> //====== LEDlampa ================================================================ >>> // module LEDlampa(posX=8, posY=10, posZ=0) >>> module LEDlampa(posX=0, posY=0, posZ=0, mountSide="left") >>> { side = mountSide == "left" ? 0 >>> : mountSide == "right" ? 1 >>> : assert(false,"invalid moutSide value"); // message if no case worked >>> >>> xpos = mountSide == "left" ? 121 >>> : mountSide == "right" ? -10 >>> : assert(false,"invalid moutSide value"); // message if no case worked >>> /* >>> ypos = mountSide == "left" ? 10.5 >>> : mountSide == "right" ? 10.5 >>> : assert(false,"invalid moutSide value"); // message if no case worked >>> >>> zpos = mountSide == "left" ? 5 >>> : mountSide == "right" ? 5 >>> : assert(false,"invalid moutSide value"); // message if no case worked >>> */ >>> // echo(xpos,ypos,zpos); >>> // translate([xpos, ypos, zpos]) >>> translate([xpos, 10.5, 5]) >>> mirror([1, 0, 0]) >>> translate([posX, posY, posZ]) >>> { LEDbottom(); >>> translate([0, 0, 11]) >>> LEDglas(); >>> } >>> } >>> //====== Slut LEDlampa =========================================================== >>> >>> >>> //================================================================================== >>> //====== LEDglas ================================================================= >>> module LEDglas() >>> { >>> // Variabler botten >>> length = 111; // längd mm >>> wideMid = 50.5; // bredd i mitten mm >>> >>> cornRad = 10; // Radien i alla hörn >>> wideCorn = 48; // Bredd i kanterna >>> >>> diamHole = 6; // håldiameter i mm >>> >>> colorBot = "gray"; >>> colorTop = "orange"; >>> >>> // Variabler top >>> cornHigh = 5; //Höjd i ändarna >>> midHigh = 8; >>> highTop = cornHigh + 1; // höjd mm >>> >>> p1tx = 10; // the start value >>> p1ty = 49.25; >>> p2tx = 55.5; // the middle value >>> p2ty = 50.5; >>> p3tx = 101; // the end value >>> p3ty = p1ty; >>> >>> p4tx = 101; // the start value >>> p4ty = 1.25; >>> p5tx = 55.5; // the middle value >>> p5ty = 0.0; >>> p6tx = 10; // the end value >>> p6ty = p4ty; >>> // Ger ovalt glas >>> points1 = 3points_arc([p1tx,p1ty], [p2tx,p2ty], [p3tx,p3ty], fn=100); >>> points2 = 3points_arc([p4tx,p4ty], [p5tx,p5ty], [p6tx,p6ty], fn=100); >>> >>> color("orange") >>> linear_extrude(height=cornHigh+.1) >>> difference() >>> { polygon(concat(points1, points2)); >>> >>> translate([length-10 , wideMid / 2, -.2]) >>> circle(d=6); >>> translate([10 , wideMid / 2, -.2]) >>> circle(d=6); >>> } >>> >>> // Top >>> color(colorTop) >>> difference() >>> { hull() >>> { // hörn1 >>> translate([cornRad, wideMid - ((wideMid-wideCorn)/2) - cornRad, 0]) // [10,39] >>> cylinder(h=cornHigh, d=cornRad*2, center=false); >>> // hörn2 >>> translate([cornRad, cornRad + ((wideMid-wideCorn)/2), 0]) // [10,12] >>> cylinder(h=cornHigh, d=cornRad*2, center=false); >>> // hörn3 >>> translate([length - cornRad, wideMid - ((wideMid-wideCorn)/2) - cornRad, 0]) // [101 ,39] >>> cylinder(h=cornHigh, d=cornRad*2, center=false); >>> // hörn4 >>> translate([length - cornRad, cornRad + ((wideMid-wideCorn)/2), 0]) // >>> cylinder(h=cornHigh, d=cornRad*2, center=false); >>> } >>> >>> union() >>> { // Monteringshål 1 & 2 >>> translate([length-10 , wideMid / 2, -.2]) >>> cylinder(d=diamHole, h=highTop+.5, center=false); >>> translate([10 , wideMid / 2, -.2]) >>> cylinder(d=diamHole, h=highTop+.5, center=false); >>> } >>> } >>> } >>> //======== Slut LEDglas ========================================================== >>> >>> >>> //================================================================================== >>> //====== LEDbottom =============================================================== >>> module LEDbottom() >>> { p1x = 10; // the start value >>> p1y = 49.25; >>> p2x = 55.5; // the middle value >>> p2y = 50.5; >>> p3x = 101; // the end value >>> p3y = p1y; >>> >>> p4x = 101; // the start value >>> p4y = 1.25; >>> p5x = 55.5; // the middle value >>> p5y = 0.0; >>> p6x = 10; // the end value >>> p6y = p4y; >>> >>> // Variabler botten för borrhålen >>> length = 111; // längd mm >>> wideMid = 50.5; // bredd i mitten mm >>> diamHole = 6; // håldiameter i mm >>> cornHigh = 5; //Höjd i ändarna >>> midHigh = 8; >>> highTop = cornHigh + 1; // höjd mm >>> // offs1 = 0.1; >>> heightHole = 15; //mm >>> height = 11; //mm >>> >>> points1 = circSect( 10, 11.25, 10, [0, 90], "bottom", 1, fn); // Hörn nere till vänster >>> points2 = circSect( 10, 39.25, 10, [0, 90], "left", 1, fn); // Hörn uppe till vänster >>> points3 = 3points_arc([p1x,p1y], [p2x,p2y], [p3x,p3y], fn); >>> points4 = circSect( 101, 39.25, 10, [0, 90], "top", 1, fn); // Hörn uppe till höger >>> points5 = circSect( 101, 11.25, 10, [0, 90], "right", 1, fn); // Hörn nere till höger >>> points6 = 3points_arc([p4x,p4y], [p5x,p5y], [p6x,p6y], fn); >>> >>> // The base plate for the LED lamp >>> >>> >>> difference() >>> { color("gray", 0.5) >>> linear_extrude(height=height) >>> polygon(concat(points1, points2, points3, points4, points5, points6)); >>> >>> >>> // union() >>> { // Monteringshål 1 & 2 >>> translate([length-10 , wideMid / 2, -.2]) >>> cylinder(d=diamHole, h=heightHole, center=false); >>> translate([10 , wideMid / 2, -.2]) >>> cylinder(d=diamHole, h=heightHole, center=false); >>> } >>> } >>> } >>> //======== Slut LEDbottom ======================================================== >>> >>> >>> >>> //================================================================================== >>> //====== circleSect ============================================================== >>> // Create rounded corners 2D >>> // https://openhome.cc/eGossip/OpenSCAD/SectorArc.html >>> // ange .: x, y, radien, >>> // [från, till] vinkel, >>> // var vinkeln startar, (left, bottom, right, top) >>> // vilken rotation (-1=medsol, 1=motsols) >>> function circSect(x=0, y=0, radius=10, angles=[0,270], startRef="bottom", rotate=1, fn=24) = >>> let( >>> startAngel = (startRef == "left") ? 0 >>> : (startRef == "bottom") ? 90 >>> : (startRef == "right") ? 180 >>> : (startRef == "top") ? 270 >>> : startRef, // valfri vinkel >>> // : assert(false,"invalid moutSide value"); // Error message if no case worked >>> //: undef, >>> r = radius, >>> //r = radius / cos(180 / fn), >>> step = 360 / fn, >>> // points = [[x, y], >>> points = [ >>> for(a = [angles[0]-startAngel : step : angles[1]-startAngel]) >>> [-rotate * r * cos(a)+x, r * sin(a)+y]] >>> ) points; >>> //======== Slut circleSect ======================================================= >>> >>> >>> //================================================================================== >>> //====== 3points_arc ============================================================= >>> // Create an arc with three points 2D >>> function 3points_arc(p0, p1, p2, fn=10) = >>> // an alternative expression for D >>> // D = 2 * ( (p1-p0).x * (p2-p0).y - (p1-p0).y * (p2-p0).x ) >>> let( D = 2 * cross(p1-p0, (p2-p0)) ) >>> assert( abs(D)>1e-9, "The 3 points should not be collinear." ) >>> let( >>> Ux = ( (p2-p0).y*(p1-p0)*(p1-p0) - (p1-p0).y*(p2-p0)*(p2-p0) )/D, >>> Uy = ( (p1-p0).x*(p2-p0)*(p2-p0) - (p2-p0).x*(p1-p0)*(p1-p0) )/D, >>> radius = norm([Ux,Uy]), >>> center = [Ux,Uy] + p0, >>> ang0 = atan2( (p0-center).y, (p0-center).x ), >>> ang2 = atan2( (p2-center).y, (p2-center).x ), >>> // the points are in a cw winding iff D<0 >>> // the angular difference between vectors p2-center and p0-center >>> // measured from p0-center; dang is positive iff D is negative >>> dang = D<0 ? ang2<ang0 ? ang2-ang0 : ang2-ang0-360 >>> : ang2>ang0 ? ang2-ang0 : ang2-ang0+360 >>> ) >>> [ for(i=[0:fn-1]) >>> let( ang = ang0 + i*dang/(fn-1) ) >>> center + radius*[cos(ang),sin(ang)] ]; >>> //======== Slut 3points_arc ====================================================== >>> >>> >>> //================================================================================== >>> //====== Wall som ett "L" ======================================================== >>> // Normal vägghöjd >>> function wall() = >>> let( >>> b = 4, // botten - tjocklek >>> f = 8, // Foten >>> h = 15, // Höjd >>> t = 3.5, // Top >>> x = (b+(t/2) - (h - ( (-h / (f-t)) *t) )) / (-h / (f-t)) >>> ) >>> let( >>> points = [[0,0], [f,0], [t,h], [0,h]] , >>> top = move([t/2, h, 0], circle(d=t, $fn=20)), >>> sqr = square([10, b]), >>> diff = >>> difference([ >>> move([x, b], square([t/2, t/2])), >>> move([x+(t/2), b+(t/2), 0], circle(d = t, $fn=20) ) ]) >>> ) >>> union([points, top, sqr, diff]); >>> //======== Slut Wall ============================================================= >>> >>> >>> >>> //================================================================================== >>> //====== Wall1 som ett "L" ======================================================= >>> // En högre vägg >>> function wall1() = >>> let( >>> b = 4, // botten - tjocklek >>> f = 7, // Foten >>> h = 25, // Höjd >>> t = 3, // Top >>> x = (b+(t/2) - (h - ((-h / (f-t)) *t))) / (-h / (f-t)) >>> ) >>> let( >>> points = [[0,0], [f,0], [t,h], [0,h]] , >>> top = move([t/2, h, 0], circle(d=t, $fn=20)), >>> sqr = square([10, b]), >>> diff = >>> difference([ >>> move([x, b], square([t/2, t/2])), >>> move([x+(t/2), b+(t/2), 0], circle(d = t, $fn=20) ) ]) >>> ) >>> union([points, top, sqr, diff]); >>> //======== Slut Wall1 ============================================================ >>> >>> >>> //================================================================================== >>> //====== Plåt på släp ============================================================ >>> module mountingPlate(posX=0, posY=0, posZ=0, mountSide="left", colorName="#C0C0C0", $fn=50) >>> { // Hörnpositionerna >>> posX1 = 120; >>> posY1 = 0; >>> posX2 = posX1; >>> posY2 = -200; >>> posX3 = 120 - 75; >>> posY3 = -200; >>> posX4 = 0; >>> posY4 = 0; >>> thick=2; // tjocklek >>> >>> side = mountSide == "left" ? 0 >>> : mountSide == "right" ? 1 >>> : assert(false,"invalid moutSide value"); // message if no case worked >>> >>> xpos = mountSide == "left" ? 20 >>> : mountSide == "right" ? -20 >>> : assert(false,"invalid moutSide value"); // message if no case worked >>> /* >>> ypos = mountSide == "left" ? 85 >>> : mountSide == "right" ? 85 >>> : assert(false,"invalid moutSide value"); // message if no case worked >>> >>> zpos = mountSide == "left" ? -thick >>> : mountSide == "right" ? -thick >>> : assert(false,"invalid moutSide value"); // message if no case worked >>> */ >>> color(colorName) >>> { translate([posX, posY, posZ]) >>> translate([xpos, 85, -thick]) >>> { mirror([side, 0, 0]) >>> { linear_extrude(thick) >>> hull() >>> { translate([posX1, posY1, 0]) >>> square(0.1, center = true); >>> translate([posX2, posY2, 0]) >>> square(0.1, center = true); >>> translate([posX3, posY3, 0]) >>> square(0.1, center = true); >>> translate([posX4, posY4, 0]) >>> square(0.1, center = true); >>> } >>> } >>> } >>> } >>> } >>> = = END product 1= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = >>> - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - >>> >>> >>> >>> >>> = = product 2 = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = >>> - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - >>> >>> $fn=100; >>> //$fn=15; >>> >>> //switch(); >>> //cableHolder4(); //Switchboxen >>> >>> >>> // cableHolder3(0, 0, 0, 33.5, 23.5, 1.5, 2); >>> // showCables(); >>> >>> >>> >>> module cableHolder4(fn=24); >>> { // idé från >>> // - https://www.thingiverse.com/thing:6400/files >>> // - https://ihrchive.wordpress.com/2011/02/14/openscad-tip-round-1-of-3-basic-rounding/ >>> >>> // mått på Switch >>> heightHold = 10.5; >>> widthHold = 33.5; >>> depthHold = 23.5; >>> spaceHold = 10.0; // utrymmet bakom switch >>> holdRadie = 2; // radie i hörnen >>> thick = 2; >>> offset1=0.5; // öka toleransen >>> >>> // innermått >>> holeW = widthHold + offset1; >>> holeH = heightHold + offset1; >>> holeD = depthHold + spaceHold+offset1; >>> >>> // yttermått >>> pad = 0.1; // Padding to maintain manifold >>> box_l = holeW + thick*2; // Bredden på switchen >>> box_w = holeD + thick; // Djupet på switchen >>> box_h = holeH + thick; // Height >>> round_r = holdRadie; // Radius of round >>> smooth = 45; // Number of facets of rounding cylinder >>> >>> >>> >>> difference() >>> { union() // Detta utförs i två steg. >>> { difference() // utför fasningar och kabelmarkeringar >>> { mainBox(box_l, box_w, box_h, spaceHold+thick, round_r, thick, smooth, pad); >>> >>> // fasning vänster (underkant) >>> translate([box_l/2-0.85, spaceHold-4.3, thick-offset1]) // sidled, fram/bak , upp/ned >>> rotate([0,180,45]) >>> cylinder(h=thick, d1=holeW*1.414-thick-thick, d2=holeW*1.414, $fn=4); >>> >>> // fasning höger (underkant) >>> translate([box_l/2-3.65, spaceHold-4.3, thick-offset1]) // sidled, fram/bak , upp/ned >>> rotate([0,180,45]) >>> cylinder(h=thick, d1=holeW*1.414-thick-thick, d2=holeW*1.414, $fn=4); >>> >>> // kabelgenomföringar >>> rotate([90, 180, 90]) // Markering ena sidan (vänster under) >>> ovalCableHole(spaceHold/2-offset1, -1.75, -1.2); >>> >>> rotate([90, 180, 180]) // Markering bakkant (vänster under) >>> ovalCableHole(spaceHold/2-1.55, -1.75, -spaceHold-0.85); >>> >>> rotate([90, 180, 180]) // Markering bakkant (höger under) >>> ovalCableHole(widthHold-spaceHold/2-offset1, -1.75, -spaceHold-0.85); >>> >>> rotate([90, -180, 90]) // Markering ena sidan (höger under) >>> ovalCableHole(3.75, -1.75, widthHold-0.1); >>> } >>> } // Slut union - kropp >>> >>> translate([-offset1/2, -spaceHold+pad, -pad]) // hålet där switchen ska placeras >>> cube([holeW, holeD+pad, holeH+pad], center=false); >>> >>> translate([4, 12, 0]) >>> cylinder(h=15,d=3.2); >>> translate([4, 12, 17.7]) >>> sphere(r=6); >>> >>> translate([29.6, 12, 0]) >>> cylinder(h=15,d=3.2); >>> translate([29.6, 12, 17.7]) >>> sphere(r=6); >>> >>> /* // Hål genom lock bak - om så önskas >>> translate([box_l/2-thick, -6, offset1/2]) >>> cylinder(h=box_h+thick*4+offset1, d=3.2, $fn=100); // hål genom lock bak >>> >>> translate([box_l/2-thick, -6, 17.7]) >>> sphere(r=6); // kona hålet bak >>> */ >>> } // Slut difference() - box >>> >>> difference() >>> { union() >>> { translate([29.6, 12, heightHold-offset1*2]) >>> cylinder(h=2,d=5.2); // Stödhylsa för Switchskruv1 >>> translate([4, 12, heightHold-offset1*2]) >>> cylinder(h=2,d=5.2); // Stödhylsa för Switchskruv2 >>> >>> translate([holeW/2, -spaceHold+thick+1, holeH/2]) >>> rotate([180,0,0]) >>> backHole(); >>> } // union - slut >>> >>> translate([4, 12, 0]) // Hålen i stödhylsorna >>> cylinder(h=15,d=3.2); >>> >>> translate([29.6, 12, 0]) // Hålen i stödhylsorna >>> cylinder(h=15,d=3.2); >>> >>> translate([box_l/2-thick, -6, -offset1]) // hål i stödhylsa bak >>> cylinder(h=box_h+offset1, d=3.2, $fn=100); >>> >>> // Sänk stödhylsan >>> translate([ widthHold/2-7, -spaceHold-offset1, -thick+offset1]) // hål i stödhylsa bak >>> cube([15, 8, 3]); >>> >>> >>> // kabelmarkering >>> // translate([0, 0, 0]) // hål i stödhylsa bak >>> >>> >>> } >>> >>> >>> >>> >>> >>> >>> /* >>> translate([4, 12, 0]) >>> #cylinder(h=15,d=3.2); >>> //translate([4, 13.5, 17.3]) >>> //#sphere(r=6); >>> >>> translate([29.6, 12, 0]) >>> #cylinder(h=15,d=3.2); >>> //translate([29.6, 13.5, 17.3]) >>> //#sphere(r=6); >>> */ >>> >>> >>> } >>> >>> module backHole() >>> { wallH = 10.5; >>> >>> wide1 = 12; // endast runt cylindern >>> wide2 = 35; // hela väggen >>> deep1 = 4; >>> height1 = 10.5; >>> cornRad1 = 2; >>> diam1 = 8; >>> opt1 = 0.1; >>> >>> //rundadFot(); >>> >>> >>> // Rundad stäcka mellan t.ex. vägg och tak -bakkant >>> translate([wide2/2, diam1/2-cornRad1/2, -height1/2]) >>> { rotate([90, 0, -90]) >>> { linear_extrude(wide2) >>> { difference() >>> { square([cornRad1, cornRad1]); >>> >>> translate([cornRad1, cornRad1]) >>> circle(r=cornRad1); >>> } >>> } >>> } >>> } >>> >>> // rundad stäcka1 (vänster) mellan t.ex. vägg och tak >>> translate([-wide2/2+0.15, deep1/2+cornRad1/2, -height1/2]) >>> rotate([90, 0, 0]) >>> { linear_extrude(spaceHold) >>> { difference() >>> { square([cornRad1, cornRad1]); >>> >>> translate([cornRad1, cornRad1]) >>> circle(r=cornRad1); >>> } >>> } >>> } >>> >>> // rundad stäcka2 mellan t.ex. vägg och tak >>> translate([wide2/2-0.65, deep1/2+cornRad1/2, -height1/2]) >>> rotate([0, -90, 90]) >>> { linear_extrude(spaceHold) >>> { difference() >>> { square([cornRad1, cornRad1]); >>> >>> translate([cornRad1, cornRad1]) >>> circle(r=cornRad1); >>> } >>> } >>> } >>> >>> // Skapa stödfot - bak >>> difference() >>> { union() >>> { //själva cylindern >>> translate([0, 1, 0]) >>> { cylinder(h=height1, d=diam1, center=true); >>> translate([0, diam1/2, 0]) >>> cube([diam1,diam1-1,height1], center=true); >>> } >>> >>> // Rundad fot under cylinder ovan >>> translate([0, 1, -height1/2]) >>> { rotate_extrude() >>> { translate([diam1/2, 0, 0]) >>> { difference() >>> { square([cornRad1, cornRad1]); >>> >>> translate([cornRad1, cornRad1]) >>> circle(r=cornRad1); >>> } >>> } >>> } >>> } >>> >>> // Rundad rakstäcka1 - cylinderfot - mellan t.ex. vägg och tak >>> translate([diam1/2, diam1, -height1/2]) >>> { rotate([90, 0, 0]) >>> { linear_extrude(diam1) >>> { difference() >>> { square([cornRad1, cornRad1]); >>> >>> translate([cornRad1, cornRad1]) >>> circle(r=cornRad1); >>> } >>> } >>> } >>> } >>> >>> // Rundad rakstäcka2 - cylinderfot - mellan t.ex. vägg och tak >>> translate([-diam1/2, diam1, -height1/2]) >>> { rotate([0, -90, 90]) >>> { linear_extrude(diam1) >>> { difference() >>> { square([cornRad1, cornRad1]); >>> >>> translate([cornRad1, cornRad1]) >>> circle(r=cornRad1); >>> } >>> } >>> } >>> } >>> >>> //väggen bakom cylindern som ska rundas >>> translate([0, diam1/2-cornRad1, 0]) >>> cube([wide1, cornRad1, height1], center=true); >>> >>> } >>> >>> >>> // Avrunda hörn1 bak >>> translate([-wide1/2, cornRad1/2, cornRad1]) >>> { hull() >>> { cylinder(h=height1+opt1, r=cornRad1, center=true); >>> { translate([0, 0, -height1/2]) >>> sphere(r=cornRad1); >>> } >>> } >>> } >>> >>> // Avrunda hörn2 bak >>> translate([wide1/2, cornRad1/2, cornRad1]) >>> { hull() >>> { cylinder(h=height1+opt1, r=cornRad1, center=true); >>> { translate([0, 0, -height1/2]) >>> sphere(r=cornRad1); >>> } >>> } >>> } >>> >>> >>> // Plocka bort rundad fot bak samt det som sticker ut >>> translate([-wide1/2, diam1/2-cornRad1/2, -height1/2-opt1]) >>> cube([wide1, diam1/2+cornRad1, height1+opt1*2], center=false); >>> >>> } >>> } >>> >>> >>> >>> >>> >>> module ovalCableHole(posX, posY, posZ) >>> { // Hål 5.5 x 3.5 mm >>> pan = 0.1; >>> cableHi = 1.5; >>> >>> translate([posX, posY, posZ]) >>> { color("white") >>> { translate([0, 0, -pan]) >>> { cylinder(h=cableHi, d=3.5); >>> //#translate([0, 0, 0]) cylinder(h=10, d=1); >>> //translate([0, 0, -1]) cylinder(h=1, d1=0, d2=1); >>> //translate([0, 0, 0]) sphere(d=1); // Inre kulan >>> //translate([0, 0, 1.5]) sphere(d=1); // Inre kulan >>> >>> translate([0, 0, -1]) sphere(d=0.8); // yttre kulan >>> translate([0, 0, 2.5]) sphere(d=0.8); // yttre kulan >>> >>> } >>> translate([2, 0, -pan]) >>> { cylinder(h=cableHi, d=3.5); >>> // #translate([0, 0, -cableHi*2]) cylinder(h=10, d=0.5); >>> //translate([0, 0, 0]) sphere(d=1); // Inre kulan >>> //translate([0, 0, 1.5]) sphere(d=1); // Inre kulan >>> >>> translate([0, 0, -1]) sphere(d=0.8); // yttre kulan >>> translate([0, 0, 2.5]) sphere(d=0.8); // yttre kulan >>> >>> } >>> translate([-3.5/2, 0, -pan]) >>> cube([5.5, 3.5/2, cableHi]); >>> translate([-0.25, -1.74, -pan]) >>> cube([2.5, 1.75, cableHi]); >>> } >>> } >>> } >>> >>> >>> >>> >>> >>> >>> module rundadFot() >>> { >>> // specifika värden för skruvdistansen bak >>> wallH = 10.5; >>> >>> wide1 = 12; // endast runt cylindern >>> wide2 = 34; // hela väggen >>> deep1 = 4; >>> height1 = 10; >>> cornRad1 = 2; >>> diam1 = 8; >>> opt1 = 0.1; >>> >>> >>> color("magenta") >>> { translate([0, 0, wallH]) >>> { difference() >>> { union() >>> { // Bakgavel >>> translate([wide2/2, opt1, height1/2]) >>> { rotate([90, 180, 0]) >>> cube([wide2, height1, opt1]); >>> } >>> >>> // Golv >>> translate([wide2/2, -height1+opt1, -height1/2]) >>> rotate([0, 180, 0]) >>> cube([wide2, height1, opt1]); >>> >>> //väggen bakom cylindern som kan rundas >>> translate([0, -cornRad1/2, 0]) >>> cube([wide1, cornRad1, height1], center=true); >>> >>> //själva cylindern >>> translate([0, -cornRad1/2, 0]) >>> cylinder(h=height1, d=diam1, center=true); >>> >>> // Rundad fot under cylinder ovan >>> translate([0, -cornRad1/2, -height1/2]) >>> { rotate_extrude() >>> { translate([diam1/2, 0, 0]) >>> { difference() >>> { square([cornRad1, cornRad1]); >>> >>> translate([cornRad1, cornRad1]) >>> circle(r=cornRad1); >>> } >>> } >>> } >>> } >>> >>> // Rundad stäcka mellan t.ex. vägg och tak -bakkant >>> translate([wide2/2, 0, -height1/2]) >>> { rotate([90, 0, -90]) >>> { linear_extrude(wide2) >>> { difference() >>> { square([cornRad1, cornRad1]); >>> >>> translate([cornRad1, cornRad1]) >>> circle(r=cornRad1); >>> } >>> } >>> } >>> } >>> >>> // rundad stäcka mellan t.ex. vägg och tak -sida1 >>> translate([-wide2/2, 0, -height1/2]) >>> { rotate([90, 0, 0]) >>> { linear_extrude(10) >>> { difference() >>> { square([cornRad1, cornRad1]); >>> >>> translate([cornRad1, cornRad1]) >>> circle(r=cornRad1); >>> } >>> } >>> } >>> } >>> >>> // rundad stäcka mellan t.ex. vägg och tak -sida2 >>> translate([wide2/2, -10, -height1/2]) >>> { rotate([90, 0, 180]) >>> { linear_extrude(10) >>> { difference() >>> { square([cornRad1, cornRad1]); >>> >>> translate([cornRad1, cornRad1]) >>> circle(r=cornRad1); >>> } >>> } >>> } >>> } >>> } // Avsluta union = = = = = = = = = = = = = = = = = = = = >>> >>> >>> // Avrunda hörn1 bak >>> translate([-wide1/2+opt1*1.3, -deep1/2, cornRad1]) >>> { cylinder(h=height1+opt1, r=cornRad1, center=true); >>> translate([0, 0, -height1/2]) >>> sphere(r=cornRad1); >>> } >>> >>> // Avrunda hörn2 bak >>> translate([wide1/2-opt1*1.3, -deep1/2, cornRad1]) >>> { cylinder(h=height1+opt1, r=cornRad1, center=true); >>> translate([0, 0, -height1/2]) >>> sphere(r=cornRad1); >>> } >>> >>> // Plocka bort rundad fot bak samt det som sticker ut >>> translate([-wide1/2, 0, -height1/2-opt1]) >>> cube([wide1, diam1/2+cornRad1, height1+opt1*2], center=false); >>> } >>> } >>> } >>> } >>> >>> >>> >>> >>> >>> >>> >>> >>> module mainBox(box_l, box_w, box_h, spaceHold, round_r, thick, smooth, pad) >>> { translate([box_l/2-thick-offset1/2, box_w/2-spaceHold, box_h/2]) >>> { >>> // To fix the corners cut the main cube with smaller cubes with spheres removed >>> difference() >>> { cube([box_l, box_w, box_h], center = true); >>> >>> // Kant1 - liggande >>> translate([0, -box_w/2+round_r, box_h/2-round_r]) >>> { difference() >>> { translate([0,-round_r-pad,round_r+pad]) >>> cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center = true); >>> rotate(a=[0,90,0]) >>> cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> // Kant2 - liggande >>> translate([0, box_w/2-round_r, box_h/2-round_r]) >>> { difference() >>> { translate([0,round_r+pad,round_r+pad]) >>> cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center = true); >>> rotate(a=[0,90,0]) >>> cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> /* >>> // Kant3 - liggande >>> translate([0, -box_w/2+round_r, -box_h/2+round_r]) >>> { difference() >>> { translate([0,-round_r-pad,-round_r-pad]) >>> cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center = true); >>> rotate(a=[0,90,0]) >>> cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> >>> // Kant4 - liggande >>> translate([0, box_w/2-round_r, -box_h/2+round_r]) >>> { difference() >>> { translate([0,round_r+pad,-round_r-pad]) >>> cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center = true); >>> rotate(a=[0,90,0]) >>> cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> */ >>> // ---- >>> // Kant1 - stående >>> translate([-box_l/2+round_r, box_w/2-round_r, 0]) >>> { difference() >>> { translate([-round_r-pad,round_r+pad,0]) >>> cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center = true); >>> cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> // Kant2 - stående >>> translate([box_l/2-round_r, box_w/2-round_r, 0]) >>> { difference() >>> { translate([round_r+pad,round_r+pad,0]) >>> cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center = true); >>> cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> // Kant3 - stående >>> translate([-box_l/2+round_r, -box_w/2+round_r, 0]) >>> { difference() >>> { translate([-round_r-pad,-round_r-pad,0]) >>> cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center = true); >>> cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> // Kant4 - stående >>> translate([box_l/2-round_r, -box_w/2+round_r, 0]) >>> { difference() >>> { translate([round_r+pad,-round_r-pad,0]) >>> cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center = true); >>> cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> >>> // ---- >>> // Kant1 liggande (andra hållet) >>> translate([-box_l/2+round_r, 0, box_h/2-round_r]) >>> { difference() >>> { translate([-round_r-pad, 0, round_r+pad]) >>> cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center = true); >>> rotate(a=[0,90,90]) >>> cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> // Kant2 liggande (andra hållet) >>> translate([box_l/2-round_r, 0, box_h/2-round_r]) >>> { difference() >>> { translate([round_r+pad, 0, round_r+pad]) >>> cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center = true); >>> rotate(a=[0,90,90]) >>> cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> /* >>> // Kant3 liggande (andra hållet) >>> translate([-box_l/2+round_r, 0, -box_h/2+round_r]) >>> { difference() >>> { translate([-round_r-pad, 0, -round_r-pad]) >>> cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center = true); >>> rotate(a=[0,90,90]) >>> cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> >>> // Kant4 liggande (andra hållet) >>> translate([box_l/2-round_r, 0, -box_h/2+round_r]) >>> { difference() >>> { translate([round_r+pad, 0, -round_r-pad]) >>> cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center = true); >>> rotate(a=[0,90,90]) >>> cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> */ >>> // ---- >>> // Hörn1 (övre) >>> translate([box_l/2-round_r, box_w/2-round_r, box_h/2-round_r]) >>> { difference() >>> { translate([round_r+pad, round_r+pad, round_r+pad]) >>> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = true); >>> sphere(round_r,$fn=smooth); >>> } >>> } >>> // Hörn2 (övre) >>> translate([-box_l/2+round_r, box_w/2-round_r, box_h/2-round_r]) >>> { difference() >>> { translate([-round_r-pad, round_r+pad, round_r+pad]) >>> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = true); >>> sphere(round_r,$fn=smooth); >>> } >>> } >>> // Hörn3 (övre) >>> translate([box_l/2-round_r, -box_w/2+round_r, box_h/2-round_r]) >>> { difference() >>> { translate([round_r+pad, -round_r-pad, round_r+pad]) >>> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = true); >>> sphere(round_r,$fn=smooth); >>> } >>> } >>> // Hörn4 (övre) >>> translate([-box_l/2+round_r, -box_w/2+round_r, box_h/2-round_r]) >>> { difference() >>> { translate([-round_r-pad, -round_r-pad, round_r+pad]) >>> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = true); >>> sphere(round_r,$fn=smooth); >>> } >>> } >>> /* >>> // Hörn1 (undre) >>> translate([box_l/2-round_r, box_w/2-round_r, -box_h/2+round_r]) >>> { difference() >>> { translate([round_r+pad, round_r+pad, -round_r-pad]) >>> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = true); >>> sphere(round_r,$fn=smooth); >>> } >>> } >>> // Hörn2 (undre) >>> translate([-box_l/2+round_r, box_w/2-round_r, -box_h/2+round_r]) >>> { difference() >>> { translate([-round_r-pad, round_r+pad, -round_r-pad]) >>> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = true); >>> sphere(round_r,$fn=smooth); >>> } >>> } >>> // Hörn3 (undre) >>> translate([box_l/2-round_r, -box_w/2+round_r, -box_h/2+round_r]) >>> { difference() >>> { translate([round_r+pad, -round_r-pad, -round_r-pad]) >>> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = true); >>> sphere(round_r,$fn=smooth); >>> } >>> } >>> // Hörn4 (undre) >>> translate([-box_l/2+round_r, -box_w/2+round_r, -box_h/2+round_r]) >>> { difference() >>> { translate([-round_r-pad, -round_r-pad, -round_r-pad]) >>> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = true); >>> sphere(round_r,$fn=smooth); >>> } >>> } >>> */ >>> } >>> } >>> } >>> // >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> module cableHolder3(posX, posY, posZ, length, width, height, radius) >>> { // Skapa toppen över switchen >>> // mått på Switchen >>> fn = 96; // upplösning (endast bågen?) >>> heightHold = 10.5; >>> widthHold = 33.5; >>> depthHold = 23.5; >>> holdRadie = 1.5; // radie i hörnen >>> thick = 1.5; // tjocklek >>> >>> >>> translate([0,-thick,0]) >>> { >>> difference(0, 0, 0) >>> { hull() >>> { difference() >>> { translate([thick, 0, heightHold]) // vänster kant >>> { rotate([-90, 0, 0]) >>> { cylinder(h=depthHold, d=thick*2); >>> translate([0, 0, depthHold]) >>> sphere(d=thick*2); // längst fram >>> } >>> } >>> translate([0, -0.1, heightHold]) // plocka bort underdelen >>> rotate([-90, 0, 0]) >>> cube([thick*2, thick+.1, depthHold+thick+.1]); >>> } >>> >>> difference() >>> { translate([widthHold-thick, 0, heightHold]) // höger kant >>> { rotate([-90, 0, 0]) >>> { cylinder(h=depthHold, d=thick*2); >>> translate([0, 0, depthHold]) >>> sphere(d=thick*2); // längst fram >>> } >>> } >>> translate([widthHold-thick*2, -0.1, heightHold]) // plocka bort underdelen >>> { rotate([-90, 0, 0]) >>> cube([thick*2, thick+.1, depthHold+thick+.1]); >>> } >>> } >>> } >>> >>> // öppna hålen för monteringsskruvarna uppe på plattan >>> translate([4, 13.5, 0]) >>> cylinder(h=15,d=3.2); >>> translate([4, 13.5, 17.3]) >>> sphere(r=6); >>> >>> translate([29.6, 13.5, 0]) >>> cylinder(h=15,d=3.2); >>> >>> translate([29.6, 13.5, 17.3]) >>> sphere(r=6); >>> } >>> >>> // halvbåge 1 bak >>> translate([thick, 0, heightHold/2+thick/2]) >>> rotate([0, 90, 180]) >>> rotate_extrude(angle = 180, convexity=20, $fn=64) >>> translate([heightHold/2-thick/2, 0, 0]) >>> circle(d=thick*2); >>> translate([thick, 0, heightHold]) >>> sphere(d=thick*2); // övre kulan >>> translate([thick, 0, thick]) >>> sphere(d=thick*2); // undre kulan >>> >>> >>> // halvbåge 2 bak >>> translate([widthHold-thick, 0, heightHold/2+thick/2]) >>> rotate([0, 90, 180]) >>> rotate_extrude(angle = 180, convexity=20, $fn=64) >>> translate([heightHold/2-thick/2, 0, 0]) >>> circle(d=thick*2); >>> translate([widthHold-thick, 0, heightHold]) >>> sphere(d=thick*2); // övre kulan >>> translate([widthHold-thick, 0, thick]) >>> sphere(d=thick*2); // undre kulan >>> >>> // en cylinder tvärsöver längst upp >>> translate([thick, 0, heightHold]) >>> { rotate([0,90,0]) >>> cylinder(h=widthHold-thick*2, r=thick); >>> } >>> } >>> >>> // Halvbågen (kabelhållaren) på baksidan switchen >>> translate([widthHold-thick, -thick, heightHold/2+thick/2]) >>> { rotate([0,90,180]) >>> linear_extrude(widthHold-thick*2) >>> arc(heightHold/2-thick/2, [0, 180], thick, fn); //radius, angles, width, fn) >>> } >>> // en cylinder tvärsöver längst ned >>> translate([thick, -thick, thick]) >>> { rotate([0,90,0]) >>> cylinder(h=widthHold-thick*2, r=thick); >>> } >>> } >>> >>> >>> >>> module switch(posX=0, posY=0, posZ=0) >>> { buttRadie = 1.5; >>> height = 10.5; >>> width = 33.5; >>> depth = 23.5; >>> h1x = buttRadie; >>> h1y = buttRadie; >>> h2x = width-buttRadie; >>> h2y = buttRadie; >>> h3x = width-buttRadie; >>> h3y = depth-buttRadie; >>> h4x = buttRadie; >>> h4y = depth-buttRadie; >>> >>> translate([posX, posY, posZ]) >>> { difference() >>> { color("#F9F9F3") >>> // tryck-knappen >>> union() >>> { translate([width/2, depth+6-0.1, height/2]) >>> { rotate([90, 0, 0]) >>> { translate([0,0,6]) >>> circle(d=6.8); // skuggan runt knapp >>> cylinder(h=6, d=6); >>> sphere(d=6); >>> } >>> } >>> >>> hull() // Switchkropp >>> { translate([h1x, h1y]) >>> cylinder(h=height, r=1.5); >>> translate([h2x, h2y]) >>> cylinder(h=height, r=1.5); >>> translate([h3x, h3y]) >>> cylinder(h=height, r=1.5); >>> translate([h4x, h4y]) >>> cylinder(h=height, r=1.5); >>> } >>> } >>> >>> // Skruvhålen för switchen >>> hole( 4, 12, 0, "#FFD700", height); >>> hole(29.6, 12, 0, "#FFD700", height); >>> // hole( 4, 12, 0, "#FFD700", 50); >>> // hole(29.6, 12, 0, "#FFD700", 50); >>> // hål för kablar bak >>> color("gray") >>> { translate([9.5, 16, height/2]) >>> { rotate([90, 0, 0]) >>> cylinder(h=16.5, d=4); >>> } >>> translate([24.5, 16, height/2]) >>> { rotate([90, 0, 0]) >>> cylinder(h=16.5, d=4); >>> } >>> } >>> >>> // hål för kabelskruvar >>> color("white") >>> { translate([29.5, 17.1, height/2]) >>> { rotate([0, 90, 0]) >>> cylinder(h=4.1, d=4.5); >>> } >>> translate([-0.1, 17.1, height/2]) >>> { rotate([0, 90, 0]) >>> cylinder(h=4.1, d=4.5); >>> } >>> } >>> } >>> >>> // Kabelskruvar >>> cableScrew(3, 17, height/2, 90); >>> cableScrew(31, 17, height/2, -90); >>> >>> } >>> } >>> >>> // Skruven som håller fast kabeln i switchen >>> module cableScrew(posX=0, posY=0, posZ=0, angle=0) >>> { color("#FFD700") // mässing >>> translate([posX, posY, posZ]) >>> { rotate([0, 0, angle]) >>> { difference() >>> { // skruvskalle >>> translate([0, 0, 0]) >>> rotate([90, 0, 0]) >>> cylinder(h=2, d1=4, d2=3.5); >>> >>> // stjärnan i skruven >>> translate([0, 1.85, -.25]) >>> rotate([0, 0, 0]) >>> cylinder(h=0.5, d=5); >>> translate([-0.25, -.6, 2.25]) >>> rotate([0, 90, 0]) >>> cube([4.5, 2, 0.5]); >>> } >>> } >>> } >>> } >>> >>> >>> >>> // borrhål >>> module hole(posX=0, posY=0, posZ=0, colorName="yellow", height) >>> { diamHole1 = 3; >>> highHole1 = height; >>> diamHole2 = 6; >>> highHole2 = 2.5; >>> offs=0.1; >>> >>> color(colorName) >>> { >>> translate([posX, posY, posZ]) >>> { translate([0, 0, 0]) >>> cylinder(h=highHole1, d=diamHole1); >>> translate([0, 0, -offs]) >>> cylinder(h=highHole2, d=diamHole2); >>> translate([0, 0, height-highHole2+offs]) >>> cylinder(h=highHole2, d=diamHole2); >>> } >>> } >>> } >>> >>> module showCables() >>> { translate([-25,8,24]) >>> rotate([80,177,90]) >>> cable(10,10,0,"brun"); >>> translate([-43,8,15]) >>> rotate([90,180,90]) >>> cable(10,10,0,"blå"); >>> } >>> >>> >>> module cable(posX=0, posY=0, posZ=0, colorName="blå", radius=1.26, width=0.62, thick=50, fn=24) >>> { // default 1.5mm2 >>> // radius = inner radie >>> // width = bredd/tjocklek på cirkeln (inte höjd) >>> // thick = höjd på cirken/ röret >>> // pin= >>> >>> colCupper = "#D7715A"; >>> colGreen = "#07DA63"; >>> colYellow = "#FFCC00"; >>> >>> if (colorName=="gröngul") >>> { translate([posX, posY, posZ]) >>> { color(colGreen) >>> linear_extrude(thick) >>> arc(radius, [0, 60], width, fn); >>> color(colYellow) >>> linear_extrude(thick) >>> arc(radius, [60, 180], width, fn); >>> color(colGreen) >>> linear_extrude(thick) >>> arc(radius, [180, 240], width, fn); >>> color(colYellow) >>> linear_extrude(thick) >>> arc(radius, [240, 360], width, fn); >>> >>> color(colCupper) >>> linear_extrude(10, center=true, convexity=10, $fn=100) >>> circle(d=1.24); >>> } >>> } >>> else // vanliga kablar 1.5mm2 >>> { >>> cableColor = colorName == "blå" ? "#1870D5" >>> : colorName == "brun" ? "#9C6137" >>> : colorName == "svart" ? "#000000" >>> : assert(false,"invalid color value"); // message if no case worked >>> // : nodef >>> >>> translate([posX, posY, posZ]) >>> { //el kabel - ena änden rak - andra böjd >>> color(colCupper) //kopparstump tråd rakkabel >>> linear_extrude(10, center=true, convexity=10, $fn=100) >>> circle(d=1.24); >>> >>> color(cableColor) >>> { cylinder(h=thick, r=radius); >>> >>> translate([-radius*2, 0, thick]) // kabelböj >>> rotate([90, 0, 0]) >>> rotate_extrude(angle=90, convexity=20) >>> translate([2.5, 0, 0]) >>> circle(r=1.26); >>> >>> translate([-radius*2, 0, thick+radius*2]) >>> rotate([0, -90, 0]) >>> cylinder(h=5, r=radius); >>> } >>> translate([-10, 0, thick+radius*2]) >>> { rotate([0, -90, 0]) >>> { color(colCupper) >>> { linear_extrude(5, center=true, convexity=10, $fn=100) >>> circle(d=1.24); >>> } >>> } >>> } >>> } >>> } >>> } >>> >>> >>> // ====================================================================== >>> module arc(radius, angles, width = 1, fn = 24) { >>> difference() { >>> sector(radius + width, angles, fn); // ytterradie >>> sector(radius, angles, fn); // innerradie (plockar bort invändigt >>> } >>> } >>> >>> module sector(radius, angles, fn = 24) { >>> r = radius / cos(180 / fn); >>> step = -360 / fn; >>> >>> points = concat([[0, 0]], >>> [for(a = [angles[0] : step : angles[1] - 360]) >>> [r * cos(a), r * sin(a)] >>> ], >>> [[r * cos(angles[1]), r * sin(angles[1])]] >>> ); >>> >>> difference() { >>> circle(radius, $fn = fn); >>> polygon(points); >>> } >>> } >>> = = END product 2 = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = >>> - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - >>> >>> >>> Den fredag 6 maj 2022 14:06:55 CEST, Michael Möller <private2michael@gmail.com> skrev: >>> >>> >>> >>> OpenSCAD code - is a description of your model in terms of a few cylinder/cubes added and cut out >>> difference() { >>> cylinder(d=5,h=10); >>> translate([0,10,0]) cube([4,6,2]) ; >>> } >>> >>> STL file is a list of triangles which make the same outer shell as your model. OpenSCAD makes this complicated transform from shapes to triangles. >>> solid OpenSCAD_Model >>> facet normal 0.92388 0.382682 0 >>> outer loop >>> vertex 2.5 0 3 >>> vertex 1.76777 1.76777 0 >>> vertex 1.76777 1.76777 3 >>> endloop >>> endfacet >>> facet normal 0.92388 0.382682 0 >>> outer loop >>> vertex 1.76777 1.76777 0 >>> vertex 2.5 0 3 >>> vertex 2.5 0 0 >>> endloop >>> endfacet >>> : (and so on for 300 lines) There is a binary/compressed version, but the description is still just triangles. >>> >>> Gcode is what a 3D printer understands - it is the exact list of moves that the head has to do with how much plastic to squeeze to trace the outline of your shape, layer, by layer. It will optionally create moves for filling the inside or support for overhangs. Such a program is called a SLICER and the printer will come with one. >>> G92 E0 ; reset extrusion distance >>> G1 Z2.330 F6600.000 ; lift Z >>> G1 X-0.000 Y1.505 F6600.000 ; move to first perimeter point >>> G1 Z0.330 F6600.000 ; restore layer Z >>> G1 E3.00000 F2400.00000 ; unretract extruder 0 >>> G1 F1500 >>> G1 X-1.064 Y1.064 E3.09259 ; perimeter >>> G1 X-1.505 Y0.000 E3.18517 ; perimeter >>> : (many similar lines) >>> G1 X1.515 Y1.515 E4.65860 ; perimeter >>> G1 X0.055 Y2.120 E4.78559 ; perimeter >>> G1 X-0.000 Y2.143 F6600.000 ; move inwards before travel >>> G1 X0.384 Y0.843 F6600.000 ; move to first infill point >>> G1 F1500 >>> G1 X0.843 Y0.384 E4.84815 ; infill >>> G1 X1.097 Y-0.229 E4.91215 ; infill >>> : >>> (and so on for thousands of lines) >>> >>> The 3MF still basically deals in triangles, and attributes (surface, infill material, picture, ticket info ... ) which probably are not used by your slicer/printer. >>> >>> On Fri, 6 May 2022 at 12:37, Jan Öhman via Discuss <discuss@lists.openscad.org> wrote: >>> >>> >>> >>> >>> ---------- Forwarded message ---------- >>> From: "Jan Öhman" <jan_ohman@yahoo.com> >>> To: OpenSCAD General Discussion <discuss@lists.openscad.org> >>> Cc: >>> Bcc: >>> Date: Fri, 6 May 2022 10:38:46 +0000 (UTC) >>> Subject: [OpenSCAD] Export to .STL / .3MF for later 3D-printing. >>> Hi! >>> >>> Thought to create some objects in openSCAD, to print later. >>> I do not have my own 3D printer (yet). >>> >>> One I talked to, wanted to get the drawings in .STL or .3MF. (I don't know the difference). >>> >>> If I had my own printer, have I been able to print directly from openSCAD? >>> (Without some export?) >>> >>> In the openSCAD, no errors or problems occur. >>> but >>> The drawings I tested to export from openSCAD have given one or another error message. >>> One message .: >>> WARNING: Object may not be a valid 2-manifold and may need repair! >>> >>> Another message .: >>> WARNING: No top level geometry to render >>> >>> What to do? >>> >>> >>> >>> ---------- Forwarded message ---------- >>> From: "Jan Öhman via Discuss" <discuss@lists.openscad.org> >>> To: OpenSCAD General Discussion <discuss@lists.openscad.org> >>> Cc: "Jan Öhman" <jan_ohman@yahoo.com> >>> Bcc: >>> Date: Fri, 6 May 2022 10:38:46 +0000 (UTC) >>> Subject: [OpenSCAD] Export to .STL / .3MF for later 3D-printing. >>> _______________________________________________ >>> OpenSCAD mailing list >>> To unsubscribe send an email to discuss-leave@lists.openscad.org >>> >>> _______________________________________________ >>> OpenSCAD mailing list >>> To unsubscribe send an email to discuss-leave@lists.openscad.org >>> >>> >>> >>> ---------- Forwarded message ---------- >>> From: "Jan Öhman via Discuss" <discuss@lists.openscad.org> >>> To: OpenSCAD general discussion <discuss@lists.openscad.org> >>> Cc: "Jan Öhman" <jan_ohman@yahoo.com> >>> Bcc: >>> Date: Sat, 7 May 2022 11:04:31 +0000 (UTC) >>> Subject: [OpenSCAD] Re: Export to .STL / .3MF for later 3D-printing. >>> _______________________________________________ >>> OpenSCAD mailing list >>> To unsubscribe send an email to discuss-leave@lists.openscad.org >> >> _______________________________________________ >> OpenSCAD mailing list >> To unsubscribe send an email to discuss-leave@lists.openscad.org > > _______________________________________________ > OpenSCAD mailing list > To unsubscribe send an email to discuss-leave@lists.openscad.org
SP
Sanjeev Prabhakar
Sat, May 7, 2022 5:33 PM

Alright,

I have written a few functions, which can do similar shapes.

But again there is a learning curve. I feel BOSL is a very extensive work
(I have not used it though, except few interactions with Adrian)

you can refer to the m39.scad file in
https://github.com/sprabhakar2006/openSCAD

It is a kind of similar application.

Regards
Sanjeev

On Sat, 7 May 2022 at 22:27, Michael Möller private2michael@gmail.com
wrote:

Jan Öhman wrote it failed in Render/F6, but works in Preview/F5 - in so
many words. I tried and got the following

First model
[image: image.png]
F6 Error: WARNING: Ignoring 2D child object for 3D operation in file ,
line 53

ERROR: CGAL error in CGALUtils::applyUnion3D: CGAL ERROR: assertion
violation! Expr: G.mark(v1,0)==G.mark(v2,0)&& G.mark(v1,1)==G.mark(v2,1)
File:
/mxe/usr/x86_64-w64-mingw32.static.posix/include/CGAL/Nef_S2/SM_overlayer.h
Line: 303

Which I think is pretty selfexplantory: Passed a 2D shape to something
that expected a 3D shape - but you have to read the whole code to find it
... which I think Jan is more qualified to do :-)

2nd part
[image: image.png]

... which is one of those where zooming or rotating the model in preview
takes >5 second
[image: image.png]

And I didn't bother waiting for the F6 error ... ;-)

Of course, we do not know if the above shapes I got are the ones that Jan
wants - there are also sections of code commented out.

(From the comments it seems these are to be nice and alternative covers
for wall outlet/switches.)

On Sat, 7 May 2022 at 18:26, Sanjeev Prabhakar sprabhakar2006@gmail.com
wrote:

Quite a long code.
Can you paste a picture of what you are trying to draw.
Regards
Sanjeev

On Sat, 7 May 2022, 16:31 Jan Öhman via Discuss, <
discuss@lists.openscad.org> wrote:

---------- Forwarded message ----------
From: "Jan Öhman" jan_ohman@yahoo.com
To: OpenSCAD general discussion discuss@lists.openscad.org
Cc:
Bcc:
Date: Sat, 7 May 2022 11:04:31 +0000 (UTC)
Subject: [OpenSCAD] Re: Export to .STL / .3MF for later 3D-printing.
Thank you!
Begins to understand how it works. (It was not easy...)

but my solution was not good ...

Here are 2 files that do not work to render (F6)

= = product 1= = = = = = = = = = = = = = = = = = = = = = = = = = = = =
= = =

  • . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . -
    . _ . - . _ . - . _ . - . _ . -

include <BOSL2/std.scad>
fn = 150;

placering="left";
// placering="right"

box(0, 0, 0, placering, "#C0C0C0", fn); // (X, Y, Z, left/right,
colorName)

// Monteringsplattan
// mountingPlate(0, 0, 0, placering);

// LED belysning
// LEDlampa(0, 0, 0, placering);

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - - - m o d u l e r - - - - - - - - - - - - - - - - - -

//

---================
//======  box


---===
module box(posX=0, posY=0, posZ=0, mountSide="left",
colorName="#00FF00", fn=24)
{
side = mountSide == "left" ? 0
: mountSide == "right" ? 1
: assert(false,"invalid moutSide value");  // message if no case
worked

color(colorName)
translate([posX, posY, posZ])
mirror([side, 0, 0])
difference()
{
union()
{
// Skapa konturer på bottenplattan - x, y, r, angles, [grader], början
// Rotation medurs - vänster lamphållare (bakant saknas)
points1 = circSect( 140,  0,  0, [0, 0], "right",  1, fn);  // böj
nere till höger
points2 = circSect(  60,  5,  5, [0, 5], "bottom",  1, fn); //
brytpunkt längst ned
points3 = circSect(  10, 13,  10, [0, 90], "bottom", 1, fn); // böj
nere till vänster
points4 = circSect(  5, 80,  5, [0, 90], "left",  1, fn); // böj
uppe till vänster
points5 = circSect( 140, 80,  5, [0, 1], "top",  1, fn);  // böj
uppe till höger
edge = concat(points1, points2, points3, points4, points5);
path = path3d(reverse(edge));
section = wall();
path_sweep( section, path, closed=false);

// Skapa bakkant lite högre och smalare i topp
bottom1 = concat(points5, points1);
polygon(bottom1);
path1 = path3d(reverse(bottom1));
section1 = wall1(); // lite högre bakvägg wall(b=4, f=8, h=15, t=3.5)
path_sweep( section1, path1, closed=false);

// fyll upp bottenplattansbaksida
linear_extrude(4) // Bottomplate - fill up
polygon(concat(points1, points2, points3, points4, points5));

// skapa Utskjutande del under (tänk spegelvänt)
pt1 = circSect(  19.5, 85, 0, [0, 50], "top", 1, fn);  // Uppe till
höger - moturs
pt2 = circSect(  39, 1.35,  .1, [-5, 90], "right", 1, fn);  // Nere
till höger
pt3 = circSect(  10, 13.05,  10, [0, 90], "bottom", 1, fn);  // Nere
till vänster
pt4 = circSect(  5, 80, 5, [0, 90], "left",  1, fn);  // Uppe till
vänster
translate([0, 0, -2])
linear_extrude(2.1)
polygon(concat(pt1, pt2, pt3, pt4));

// utgången för kabeln på baksidan (diam 10mm) - pekar lite nedåt
cableExit(65, 35, 0, 15, "cyan", $fn=100);
}

// skapa ett borrhål i bakkant
translate([132,60,15])
{ rotate([0, 90, 0])
{ cylinder(h=10, d=2, $fn=100);
cylinder(h=4, d=9, $fn=100);
}
}

// skapa en borrmarkering i bakkant
translate([139,25,15])
{ rotate([0, 90, 0])
cylinder(h=2, d1=1, d2=2.5, $fn=100);
}

// ingravera årtalet på baksidan
translate([10, 80, -0.5])
{ mirror([side, 0, 0])
{ rotate([0, 180, 0])
{ linear_extrude(3)
text("2022", size=12, direction="ttb", font="Comic Sans
MS:style=Bold");
}
}
}

/*
// Markera skruvhål på bakkant
borr=3;
bredd=140;
hojd=8;
avstNed=20;
translate([bredd, avstNed, hojd])
{ rotate([0,90,0])
cylinder(h=2, d1=0.5, d2=borr, center=true, $fn=50);
}
*/

// borrhål
mountingHole(20, 36, 0, 7, 90.1, 15); // posX, posY, posZ, diam, dist,
deep, $fn=50

}
}
//========  Slut box

---=============================

//

---================
//======  cableExit

---==============================
module cableExit(posX, posY, posZ, angle, colorName)
{ diamHole = 7;
diamHolder = 9.8;
hight = 12;
topRad = diamHolder/2;
topDiam = diamHolder/2-topRad/2;
bowRad = 7;
offs1 = 0.1;

color(colorName)
translate([posX, posY, posZ])
{  rotate([180, 0, 180-angle])
{ difference()
{ hull()
{ cylinder(h=hight, d=diamHolder, center=false);
translate([0, 0, hight])        // rundad topp
rotate_extrude(angle=360, convexity=2)
translate([topDiam, 0, 0])  // yttre diam topp
circle(d=topRad);        // radie topp
}

     inpHight  =  2;   // ett värde som styr var utgångshålet hamnar
     translate([0, 0, -offs1])
       cylinder(h=inpHight+offs1, d=diamHole, center=false); //

Bottenhål

     translate([-bowRad, 0, inpHight-offs1]) // böjen
     { rotate([90, 0, 0])
         rotate_extrude(angle=90, convexity=10)
           translate([bowRad, 0, 0]) // ställ in radien på kabelböjen
             circle(d=diamHole);
     }
   }
 }

}
}
//======  slut cableExit

---=========================

//

---================
//======  mountingHole

---===========================
module mountingHole(posX=0, posY=0, posZ=0, diam=7, dist=90, deep=5,
$fn=50)
{ // diam =  6;  // [mm]
// dist = 90;  // [mm]
// deep =  12;  // [mm]

translate([posX, posY, posZ])
{ translate([0, 0, -10])
cylinder(h=deep, d=diam);  // fästhål 1

 //cableHold1(dist/2, 0, .2, "#D5D5D5");  // Kabelgenomföring
 translate([dist/2, 0, 0])
 {  hull()
   { cylinder(h=5, d=6);  // fästhål 1
     sphere(d=7.5);
   }
 }

 translate([dist, 0, -10])
   cylinder(h=deep, d=diam); // fästhål 2

}
}
//======  slut mountingHole

---======================

//

---================
//======  LEDlampa

---===============================
// module LEDlampa(posX=8, posY=10, posZ=0)
module LEDlampa(posX=0, posY=0, posZ=0, mountSide="left")
{ side = mountSide == "left" ? 0
: mountSide == "right" ? 1
: assert(false,"invalid moutSide value");  // message if no case
worked

xpos = mountSide == "left" ? 121
: mountSide == "right" ? -10
: assert(false,"invalid moutSide value");  // message if no case
worked
/*
ypos = mountSide == "left" ? 10.5
: mountSide == "right" ? 10.5
: assert(false,"invalid moutSide value");  // message if no case
worked

zpos = mountSide == "left" ? 5
: mountSide == "right" ? 5
: assert(false,"invalid moutSide value");  // message if no case
worked
*/
// echo(xpos,ypos,zpos);
// translate([xpos, ypos, zpos])
translate([xpos, 10.5, 5])
mirror([1, 0, 0])
translate([posX, posY, posZ])
{ LEDbottom();
translate([0, 0, 11])
LEDglas();
}
}
//======  Slut LEDlampa

---==========================

//

---================
//======  LEDglas

---================================
module LEDglas()
{
// Variabler botten
length  = 111;  // längd mm
wideMid = 50.5;  // bredd i mitten mm

cornRad = 10;    // Radien i alla hörn
wideCorn = 48;  // Bredd i kanterna

diamHole = 6;    // håldiameter i mm

colorBot = "gray";
colorTop = "orange";

// Variabler top
cornHigh = 5;  //Höjd i ändarna
midHigh  = 8;
highTop = cornHigh + 1;  // höjd mm

p1tx = 10;      // the start value
p1ty = 49.25;
p2tx = 55.5;    // the middle value
p2ty = 50.5;
p3tx = 101;    // the end value
p3ty = p1ty;

p4tx = 101;    // the start value
p4ty = 1.25;
p5tx = 55.5;    // the middle value
p5ty = 0.0;
p6tx = 10;      // the end value
p6ty = p4ty;
// Ger ovalt glas
points1 = 3points_arc([p1tx,p1ty], [p2tx,p2ty], [p3tx,p3ty], fn=100);
points2 = 3points_arc([p4tx,p4ty], [p5tx,p5ty], [p6tx,p6ty], fn=100);

color("orange")
linear_extrude(height=cornHigh+.1)
difference()
{ polygon(concat(points1, points2));

 translate([length-10 , wideMid / 2, -.2])
   circle(d=6);
 translate([10 , wideMid / 2, -.2])
   circle(d=6);

}

// Top
color(colorTop)
difference()
{ hull()
{ // hörn1
translate([cornRad, wideMid - ((wideMid-wideCorn)/2) - cornRad,
0]) // [10,39]
cylinder(h=cornHigh, d=cornRad2, center=false);
// hörn2
translate([cornRad, cornRad + ((wideMid-wideCorn)/2), 0])
// [10,12]
cylinder(h=cornHigh, d=cornRad
2, center=false);
// hörn3
translate([length - cornRad, wideMid - ((wideMid-wideCorn)/2) -
cornRad, 0]) // [101 ,39]
cylinder(h=cornHigh, d=cornRad2, center=false);
// hörn4
translate([length - cornRad, cornRad + ((wideMid-wideCorn)/2),
0])  //
cylinder(h=cornHigh, d=cornRad
2, center=false);
}

 union()
 { // Monteringshål 1 & 2
   translate([length-10 , wideMid / 2, -.2])
     cylinder(d=diamHole, h=highTop+.5, center=false);
   translate([10 , wideMid / 2, -.2])
     cylinder(d=diamHole, h=highTop+.5, center=false);
 }

}
}
//========  Slut LEDglas

---=========================

//

---================
//======  LEDbottom

---==============================
module LEDbottom()
{ p1x = 10;      // the start value
p1y = 49.25;
p2x = 55.5;    // the middle value
p2y = 50.5;
p3x = 101;    // the end value
p3y = p1y;

p4x = 101;    // the start value
p4y = 1.25;
p5x = 55.5;    // the middle value
p5y = 0.0;
p6x = 10;      // the end value
p6y = p4y;

// Variabler botten för borrhålen
length  = 111;  // längd mm
wideMid = 50.5;  // bredd i mitten mm
diamHole = 6;    // håldiameter i mm
cornHigh = 5;  //Höjd i ändarna
midHigh  = 8;
highTop = cornHigh + 1;  // höjd mm
// offs1 = 0.1;
heightHole = 15; //mm
height = 11; //mm

points1 = circSect(  10, 11.25,  10, [0, 90], "bottom", 1, fn); //
Hörn nere till vänster
points2 = circSect(  10, 39.25,  10, [0, 90], "left",  1, fn); //
Hörn uppe till vänster
points3 = 3points_arc([p1x,p1y], [p2x,p2y], [p3x,p3y], fn);
points4 = circSect( 101, 39.25,  10, [0, 90], "top",    1, fn); //
Hörn uppe till höger
points5 = circSect( 101, 11.25,  10, [0, 90], "right",  1, fn); //
Hörn nere till höger
points6 = 3points_arc([p4x,p4y], [p5x,p5y], [p6x,p6y], fn);

// The base plate for the LED lamp

difference()
{ color("gray", 0.5)
linear_extrude(height=height)
polygon(concat(points1, points2, points3, points4, points5,
points6));

// union()
 { // Monteringshål 1 & 2
   translate([length-10 , wideMid / 2, -.2])
     cylinder(d=diamHole, h=heightHole, center=false);
   translate([10 , wideMid / 2, -.2])
     cylinder(d=diamHole, h=heightHole, center=false);
 }

}
}
//========  Slut LEDbottom

---=======================

//

---================
//======  circleSect

---=============================
// Create rounded corners 2D
// https://openhome.cc/eGossip/OpenSCAD/SectorArc.html
// ange .:  x, y, radien,
//          [från, till] vinkel,
//          var vinkeln startar, (left, bottom, right, top)
//          vilken rotation (-1=medsol, 1=motsols)
function circSect(x=0, y=0, radius=10, angles=[0,270],
startRef="bottom", rotate=1, fn=24)  =
let(
startAngel  = (startRef == "left")  ?  0
: (startRef == "bottom") ?  90
: (startRef == "right")  ? 180
: (startRef == "top")    ? 270
: startRef,  // valfri vinkel
// : assert(false,"invalid moutSide value");  // Error
message if no case worked
//: undef,
r = radius,
//r = radius / cos(180 / fn),
step = 360 / fn,
// points = [[x, y],
points = [
for(a = [angles[0]-startAngel : step : angles[1]-startAngel])
[-rotate * r * cos(a)+x, r * sin(a)+y]]
) points;
//========  Slut circleSect

---======================

//

---================
//======  3points_arc

---============================
// Create an arc with three points 2D
function 3points_arc(p0, p1, p2, fn=10) =
// an alternative expression for D
// D  = 2 * ( (p1-p0).x * (p2-p0).y - (p1-p0).y * (p2-p0).x )
let( D  = 2 * cross(p1-p0, (p2-p0)) )
assert( abs(D)>1e-9, "The 3 points should not be collinear." )
let(
Ux    = ( (p2-p0).y*(p1-p0)(p1-p0) - (p1-p0).y(p2-p0)(p2-p0)
)/D,
Uy    = ( (p1-p0).x
(p2-p0)(p2-p0) - (p2-p0).x(p1-p0)(p1-p0)
)/D,
radius = norm([Ux,Uy]),
center = [Ux,Uy] + p0,
ang0  = atan2( (p0-center).y, (p0-center).x ),
ang2  = atan2( (p2-center).y, (p2-center).x ),
// the points are in a cw winding iff D<0
// the angular difference between vectors p2-center and p0-center
// measured from p0-center; dang is positive iff D is negative
dang  = D<0  ? ang2<ang0 ? ang2-ang0 : ang2-ang0-360
: ang2>ang0 ? ang2-ang0 : ang2-ang0+360
)
[ for(i=[0:fn-1])
let( ang = ang0 + i
dang/(fn-1) )
center + radius*[cos(ang),sin(ang)] ];
//========  Slut 3points_arc

---=====================

//

---================
//======  Wall som ett "L"

---=======================
// Normal vägghöjd
function wall() =
let(
b =  4,    // botten - tjocklek
f =  8,    // Foten
h = 15,    // Höjd
t =  3.5,  // Top
x = (b+(t/2) - (h - ( (-h / (f-t)) *t) )) / (-h / (f-t))
)
let(
points = [[0,0], [f,0], [t,h], [0,h]] ,
top = move([t/2, h, 0], circle(d=t, $fn=20)),
sqr = square([10, b]),
diff =
difference([
move([x, b], square([t/2, t/2])),
move([x+(t/2), b+(t/2), 0], circle(d = t, $fn=20) ) ])
)
union([points, top, sqr, diff]);
//========  Slut Wall

---============================

//

---================
//======  Wall1 som ett "L"

---======================
// En högre vägg
function wall1() =
let(
b =  4,    // botten - tjocklek
f =  7,    // Foten
h = 25,    // Höjd
t =  3,  // Top
x = (b+(t/2) - (h - ((-h / (f-t)) *t))) / (-h / (f-t))
)
let(
points = [[0,0], [f,0], [t,h], [0,h]] ,
top = move([t/2, h, 0], circle(d=t, $fn=20)),
sqr = square([10, b]),
diff =
difference([
move([x, b], square([t/2, t/2])),
move([x+(t/2), b+(t/2), 0], circle(d = t, $fn=20) ) ])
)
union([points, top, sqr, diff]);
//========  Slut Wall1

---===========================

//

---================
//======  Plåt på släp

---===========================
module mountingPlate(posX=0, posY=0, posZ=0, mountSide="left",
colorName="#C0C0C0", $fn=50)
{ // Hörnpositionerna
posX1 = 120;
posY1 = 0;
posX2 = posX1;
posY2 = -200;
posX3 = 120 - 75;
posY3 = -200;
posX4 = 0;
posY4 = 0;
thick=2;  // tjocklek

side = mountSide == "left" ? 0
: mountSide == "right" ? 1
: assert(false,"invalid moutSide value");  // message if no case
worked

xpos = mountSide == "left" ? 20
: mountSide == "right" ? -20
: assert(false,"invalid moutSide value");  // message if no case
worked
/*
ypos = mountSide == "left" ? 85
: mountSide == "right" ? 85
: assert(false,"invalid moutSide value");  // message if no case
worked

zpos = mountSide == "left" ? -thick
: mountSide == "right" ? -thick
: assert(false,"invalid moutSide value");  // message if no case
worked
*/
color(colorName)
{  translate([posX, posY, posZ])
translate([xpos, 85, -thick])
{ mirror([side, 0, 0])
{ linear_extrude(thick)
hull()
{ translate([posX1, posY1, 0])
square(0.1, center = true);
translate([posX2, posY2, 0])
square(0.1, center = true);
translate([posX3, posY3, 0])
square(0.1, center = true);
translate([posX4, posY4, 0])
square(0.1, center = true);
}
}
}
}
}
= = END product 1= = = = = = = = = = = = = = = = = = = = = = = = = = =
= = =

  • . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . -
    . _ . - . _ . - . _ . - . _ . -

= = product 2 = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
= = =

  • . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . -
    . _ . - . _ . - . _ . - . _ . -

$fn=100;
//$fn=15;

//switch();
//cableHolder4(); //Switchboxen

// cableHolder3(0, 0, 0, 33.5, 23.5, 1.5, 2);
// showCables();

module cableHolder4(fn=24);
{ // idé från
// - https://www.thingiverse.com/thing:6400/files
// -
https://ihrchive.wordpress.com/2011/02/14/openscad-tip-round-1-of-3-basic-rounding/

// mått på Switch
heightHold = 10.5;
widthHold = 33.5;
depthHold = 23.5;
spaceHold = 10.0; // utrymmet bakom switch
holdRadie = 2;  // radie i hörnen
thick = 2;
offset1=0.5;  // öka toleransen

// innermått
holeW = widthHold + offset1;
holeH = heightHold + offset1;
holeD = depthHold + spaceHold+offset1;

// yttermått
pad = 0.1;                  // Padding to maintain manifold
box_l = holeW + thick*2;  // Bredden på switchen
box_w = holeD + thick;            // Djupet på switchen
box_h = holeH + thick; // Height
round_r = holdRadie;        // Radius of round
smooth = 45;                // Number of facets of rounding cylinder

difference()
{ union() // Detta utförs i två steg.
{ difference()  // utför fasningar och kabelmarkeringar
{ mainBox(box_l, box_w, box_h, spaceHold+thick, round_r, thick,
smooth, pad);

     // fasning vänster (underkant)
     translate([box_l/2-0.85, spaceHold-4.3, thick-offset1])  //

sidled, fram/bak , upp/ned
rotate([0,180,45])
cylinder(h=thick, d1=holeW1.414-thick-thick,
d2=holeW
1.414, $fn=4);

     // fasning höger (underkant)
     translate([box_l/2-3.65, spaceHold-4.3, thick-offset1]) //

sidled, fram/bak , upp/ned
rotate([0,180,45])
cylinder(h=thick, d1=holeW1.414-thick-thick,
d2=holeW
1.414, $fn=4);

     // kabelgenomföringar
     rotate([90, 180, 90]) // Markering ena sidan (vänster under)
       ovalCableHole(spaceHold/2-offset1, -1.75, -1.2);

     rotate([90, 180, 180]) // Markering bakkant (vänster under)
       ovalCableHole(spaceHold/2-1.55, -1.75, -spaceHold-0.85);

     rotate([90, 180, 180]) // Markering bakkant (höger under)
       ovalCableHole(widthHold-spaceHold/2-offset1, -1.75,

-spaceHold-0.85);

     rotate([90, -180, 90])  // Markering ena sidan (höger under)
       ovalCableHole(3.75, -1.75, widthHold-0.1);
   }
 } // Slut union - kropp

 translate([-offset1/2, -spaceHold+pad, -pad]) // hålet där switchen

ska placeras
cube([holeW, holeD+pad, holeH+pad], center=false);

   translate([4, 12, 0])
     cylinder(h=15,d=3.2);
   translate([4, 12, 17.7])
     sphere(r=6);

   translate([29.6, 12, 0])
     cylinder(h=15,d=3.2);
   translate([29.6, 12, 17.7])
     sphere(r=6);

   /*  // Hål genom lock bak - om så önskas
   translate([box_l/2-thick, -6, offset1/2])
     cylinder(h=box_h+thick*4+offset1, d=3.2, $fn=100);  // hål genom

lock bak

   translate([box_l/2-thick, -6, 17.7])
     sphere(r=6);    // kona hålet bak
   */

} // Slut difference() - box

 difference()
 { union()
   { translate([29.6, 12, heightHold-offset1*2])
       cylinder(h=2,d=5.2);        // Stödhylsa för Switchskruv1
     translate([4, 12, heightHold-offset1*2])
       cylinder(h=2,d=5.2);        // Stödhylsa för Switchskruv2

     translate([holeW/2, -spaceHold+thick+1, holeH/2])
       rotate([180,0,0])
          backHole();
   } // union - slut

   translate([4, 12, 0])     //  Hålen i stödhylsorna
     cylinder(h=15,d=3.2);

   translate([29.6, 12, 0])  //  Hålen i stödhylsorna
     cylinder(h=15,d=3.2);

   translate([box_l/2-thick, -6, -offset1])  // hål i stödhylsa bak
     cylinder(h=box_h+offset1, d=3.2, $fn=100);

   // Sänk stödhylsan
   translate([ widthHold/2-7, -spaceHold-offset1, -thick+offset1])

// hål i stödhylsa bak
cube([15, 8, 3]);

   // kabelmarkering
   // translate([0, 0, 0])  // hål i stödhylsa bak


   }

/*
translate([4, 12, 0])
#cylinder(h=15,d=3.2);
//translate([4, 13.5, 17.3])
//#sphere(r=6);

   translate([29.6, 12, 0])
     #cylinder(h=15,d=3.2);
   //translate([29.6, 13.5, 17.3])
     //#sphere(r=6);

*/

}

module backHole()
{ wallH = 10.5;

wide1  = 12; // endast runt cylindern
wide2  = 35; // hela väggen
deep1    =  4;
height1  = 10.5;
cornRad1  =  2;
diam1 = 8;
opt1 = 0.1;

//rundadFot();

// Rundad stäcka mellan t.ex. vägg och tak -bakkant
translate([wide2/2, diam1/2-cornRad1/2, -height1/2])
{ rotate([90, 0, -90])
{ linear_extrude(wide2)
{ difference()
{ square([cornRad1, cornRad1]);

       translate([cornRad1, cornRad1])
         circle(r=cornRad1);
     }
   }
 }

}

// rundad stäcka1 (vänster) mellan t.ex. vägg och tak
translate([-wide2/2+0.15, deep1/2+cornRad1/2, -height1/2])
rotate([90, 0, 0])
{ linear_extrude(spaceHold)
{ difference()
{ square([cornRad1, cornRad1]);

     translate([cornRad1, cornRad1])
     circle(r=cornRad1);
   }
 }

}

// rundad stäcka2 mellan t.ex. vägg och tak
translate([wide2/2-0.65, deep1/2+cornRad1/2, -height1/2])
rotate([0, -90, 90])
{ linear_extrude(spaceHold)
{ difference()
{ square([cornRad1, cornRad1]);

     translate([cornRad1, cornRad1])
       circle(r=cornRad1);
   }
 }

}

// Skapa stödfot - bak
difference()
{ union()
{ //själva cylindern
translate([0, 1, 0])
{ cylinder(h=height1, d=diam1, center=true);
translate([0, diam1/2, 0])
cube([diam1,diam1-1,height1], center=true);
}

   // Rundad fot under cylinder ovan
   translate([0, 1, -height1/2])
   { rotate_extrude()
     { translate([diam1/2, 0, 0])
       { difference()
         { square([cornRad1, cornRad1]);

           translate([cornRad1, cornRad1])
             circle(r=cornRad1);
         }
       }
     }
   }

   // Rundad rakstäcka1 - cylinderfot - mellan t.ex. vägg och tak
   translate([diam1/2, diam1, -height1/2])
   { rotate([90, 0, 0])
     { linear_extrude(diam1)
       { difference()
         { square([cornRad1, cornRad1]);

           translate([cornRad1, cornRad1])
             circle(r=cornRad1);
         }
       }
     }
   }

   // Rundad rakstäcka2 - cylinderfot - mellan t.ex. vägg och tak
   translate([-diam1/2, diam1, -height1/2])
   { rotate([0, -90, 90])
     { linear_extrude(diam1)
       { difference()
         { square([cornRad1, cornRad1]);

           translate([cornRad1, cornRad1])
             circle(r=cornRad1);
         }
       }
     }
   }

   //väggen bakom cylindern som ska rundas
   translate([0, diam1/2-cornRad1, 0])
     cube([wide1, cornRad1, height1], center=true);

 }


 // Avrunda hörn1 bak
 translate([-wide1/2, cornRad1/2, cornRad1])
 { hull()
   { cylinder(h=height1+opt1, r=cornRad1, center=true);
     {  translate([0, 0, -height1/2])
         sphere(r=cornRad1);
     }
   }
 }

 // Avrunda hörn2 bak
 translate([wide1/2, cornRad1/2, cornRad1])
 { hull()
   { cylinder(h=height1+opt1, r=cornRad1, center=true);
     {  translate([0, 0, -height1/2])
         sphere(r=cornRad1);
     }
   }
 }


 // Plocka bort rundad fot bak samt det som sticker ut
 translate([-wide1/2, diam1/2-cornRad1/2, -height1/2-opt1])
   cube([wide1, diam1/2+cornRad1, height1+opt1*2], center=false);

}
}

module ovalCableHole(posX, posY, posZ)
{ // Hål 5.5 x 3.5 mm
pan = 0.1;
cableHi = 1.5;

translate([posX, posY, posZ])
{ color("white")
{ translate([0, 0, -pan])
{ cylinder(h=cableHi, d=3.5);
//#translate([0, 0, 0]) cylinder(h=10, d=1);
//translate([0, 0, -1]) cylinder(h=1, d1=0, d2=1);
//translate([0, 0, 0]) sphere(d=1); // Inre kulan
//translate([0, 0, 1.5]) sphere(d=1); // Inre kulan

     translate([0, 0, -1]) sphere(d=0.8); // yttre kulan
     translate([0, 0, 2.5]) sphere(d=0.8); // yttre kulan

   }
   translate([2, 0, -pan])
   { cylinder(h=cableHi, d=3.5);
     // #translate([0, 0, -cableHi*2]) cylinder(h=10, d=0.5);
     //translate([0, 0, 0]) sphere(d=1); // Inre kulan
     //translate([0, 0, 1.5]) sphere(d=1); // Inre kulan

     translate([0, 0, -1]) sphere(d=0.8); // yttre kulan
     translate([0, 0, 2.5]) sphere(d=0.8); // yttre kulan

   }
   translate([-3.5/2, 0, -pan])
     cube([5.5, 3.5/2, cableHi]);
   translate([-0.25, -1.74, -pan])
     cube([2.5, 1.75, cableHi]);
 }

}
}

module rundadFot()
{
// specifika värden för skruvdistansen bak
wallH = 10.5;

wide1  = 12; // endast runt cylindern
wide2  = 34; // hela väggen
deep1    =  4;
height1  = 10;
cornRad1  =  2;
diam1 = 8;
opt1 = 0.1;

color("magenta")
{ translate([0, 0, wallH])
{ difference()
{ union()
{ // Bakgavel
translate([wide2/2, opt1, height1/2])
{ rotate([90, 180, 0])
cube([wide2, height1, opt1]);
}

       // Golv
       translate([wide2/2, -height1+opt1, -height1/2])
         rotate([0, 180, 0])
           cube([wide2, height1, opt1]);

       //väggen bakom cylindern som kan rundas
       translate([0, -cornRad1/2, 0])
         cube([wide1, cornRad1, height1], center=true);

       //själva cylindern
       translate([0, -cornRad1/2, 0])
         cylinder(h=height1, d=diam1, center=true);

       // Rundad fot under cylinder ovan
       translate([0, -cornRad1/2, -height1/2])
       { rotate_extrude()
         { translate([diam1/2, 0, 0])
           { difference()
             { square([cornRad1, cornRad1]);

               translate([cornRad1, cornRad1])
                 circle(r=cornRad1);
             }
           }
         }
       }

       // Rundad stäcka mellan t.ex. vägg och tak -bakkant
       translate([wide2/2, 0, -height1/2])
       { rotate([90, 0, -90])
         { linear_extrude(wide2)
           { difference()
             { square([cornRad1, cornRad1]);

               translate([cornRad1, cornRad1])
                 circle(r=cornRad1);
             }
           }
         }
       }

       // rundad stäcka mellan t.ex. vägg och tak -sida1
       translate([-wide2/2, 0, -height1/2])
       { rotate([90, 0, 0])
         { linear_extrude(10)
           { difference()
             { square([cornRad1, cornRad1]);

               translate([cornRad1, cornRad1])
               circle(r=cornRad1);
             }
           }
         }
       }

       // rundad stäcka mellan t.ex. vägg och tak -sida2
       translate([wide2/2, -10, -height1/2])
       { rotate([90, 0, 180])
         { linear_extrude(10)
           { difference()
             { square([cornRad1, cornRad1]);

               translate([cornRad1, cornRad1])
               circle(r=cornRad1);
             }
           }
         }
       }
     } // Avsluta union = = = = = = = = = = = = = = = = = = = =


     // Avrunda hörn1 bak
     translate([-wide1/2+opt1*1.3, -deep1/2, cornRad1])
     { cylinder(h=height1+opt1, r=cornRad1, center=true);
         translate([0, 0, -height1/2])
           sphere(r=cornRad1);
     }

     // Avrunda hörn2 bak
     translate([wide1/2-opt1*1.3, -deep1/2, cornRad1])
     { cylinder(h=height1+opt1, r=cornRad1, center=true);
         translate([0, 0, -height1/2])
           sphere(r=cornRad1);
     }

     // Plocka bort rundad fot bak samt det som sticker ut
     translate([-wide1/2, 0, -height1/2-opt1])
       cube([wide1, diam1/2+cornRad1, height1+opt1*2], center=false);
   }
 }

}
}

module mainBox(box_l, box_w, box_h, spaceHold, round_r, thick, smooth,
pad)
{ translate([box_l/2-thick-offset1/2, box_w/2-spaceHold, box_h/2])
{
// To fix the corners cut the main cube with smaller cubes with
spheres removed
difference()
{ cube([box_l, box_w, box_h], center = true);

   // Kant1 - liggande
   translate([0, -box_w/2+round_r, box_h/2-round_r])
   { difference()
     { translate([0,-round_r-pad,round_r+pad])
         cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center =

true);
rotate(a=[0,90,0])
cylinder(box_l+4pad,round_r,round_r,center=true,$fn=smooth);
}
}
// Kant2 - liggande
translate([0, box_w/2-round_r, box_h/2-round_r])
{ difference()
{ translate([0,round_r+pad,round_r+pad])
cube([box_l+2
pad, round_r2+pad, round_r2+pad], center =
true);
rotate(a=[0,90,0])
cylinder(box_l+4pad,round_r,round_r,center=true,$fn=smooth);
}
}
/

// Kant3 - liggande
translate([0, -box_w/2+round_r, -box_h/2+round_r])
{ difference()
{ translate([0,-round_r-pad,-round_r-pad])
cube([box_l+2pad, round_r2+pad, round_r2+pad], center =
true);
rotate(a=[0,90,0])
cylinder(box_l+4
pad,round_r,round_r,center=true,$fn=smooth);
}
}

   // Kant4 - liggande
   translate([0, box_w/2-round_r, -box_h/2+round_r])
   { difference()
     { translate([0,round_r+pad,-round_r-pad])
         cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center =

true);
rotate(a=[0,90,0])
cylinder(box_l+4pad,round_r,round_r,center=true,$fn=smooth);
}
}
/
// ----
// Kant1 - stående
translate([-box_l/2+round_r, box_w/2-round_r, 0])
{ difference()
{ translate([-round_r-pad,round_r+pad,0])
cube([round_r
2+pad, round_r
2+pad, box_h+2pad], center =
true);
cylinder(box_h+4
pad,round_r,round_r,center=true,$fn=smooth);
}
}
// Kant2 - stående
translate([box_l/2-round_r, box_w/2-round_r, 0])
{ difference()
{ translate([round_r+pad,round_r+pad,0])
cube([round_r2+pad, round_r2+pad, box_h+2pad], center =
true);
cylinder(box_h+4
pad,round_r,round_r,center=true,$fn=smooth);
}
}
// Kant3 - stående
translate([-box_l/2+round_r, -box_w/2+round_r, 0])
{ difference()
{ translate([-round_r-pad,-round_r-pad,0])
cube([round_r2+pad, round_r2+pad, box_h+2pad], center =
true);
cylinder(box_h+4
pad,round_r,round_r,center=true,$fn=smooth);
}
}
// Kant4 - stående
translate([box_l/2-round_r, -box_w/2+round_r, 0])
{ difference()
{ translate([round_r+pad,-round_r-pad,0])
cube([round_r2+pad, round_r2+pad, box_h+2pad], center =
true);
cylinder(box_h+4
pad,round_r,round_r,center=true,$fn=smooth);
}
}

 // ----
   // Kant1 liggande (andra hållet)
   translate([-box_l/2+round_r, 0, box_h/2-round_r])
   { difference()
     { translate([-round_r-pad, 0, round_r+pad])
         cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center =

true);
rotate(a=[0,90,90])
cylinder(box_w+4pad,round_r,round_r,center=true,$fn=smooth);
}
}
// Kant2 liggande (andra hållet)
translate([box_l/2-round_r, 0, box_h/2-round_r])
{ difference()
{  translate([round_r+pad, 0, round_r+pad])
cube([round_r
2+pad, box_w+2pad, round_r2+pad], center =
true);
rotate(a=[0,90,90])
cylinder(box_w+4pad,round_r,round_r,center=true,$fn=smooth);
}
}
/

// Kant3 liggande (andra hållet)
translate([-box_l/2+round_r, 0, -box_h/2+round_r])
{ difference()
{ translate([-round_r-pad, 0, -round_r-pad])
cube([round_r2+pad, box_w+2pad, round_r2+pad], center =
true);
rotate(a=[0,90,90])
cylinder(box_w+4
pad,round_r,round_r,center=true,$fn=smooth);
}
}

   // Kant4 liggande (andra hållet)
   translate([box_l/2-round_r, 0, -box_h/2+round_r])
   { difference()
     { translate([round_r+pad, 0, -round_r-pad])
         cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center =

true);
rotate(a=[0,90,90])
cylinder(box_w+4pad,round_r,round_r,center=true,$fn=smooth);
}
}
/
// ----
// Hörn1 (övre)
translate([box_l/2-round_r, box_w/2-round_r, box_h/2-round_r])
{ difference()
{ translate([round_r+pad, round_r+pad, round_r+pad])
cube([round_r
2+pad, round_r
2+pad, round_r2+pad], center =
true);
sphere(round_r,$fn=smooth);
}
}
// Hörn2 (övre)
translate([-box_l/2+round_r, box_w/2-round_r, box_h/2-round_r])
{ difference()
{ translate([-round_r-pad, round_r+pad, round_r+pad])
cube([round_r
2+pad, round_r2+pad, round_r2+pad], center =
true);
sphere(round_r,$fn=smooth);
}
}
// Hörn3 (övre)
translate([box_l/2-round_r, -box_w/2+round_r, box_h/2-round_r])
{ difference()
{ translate([round_r+pad, -round_r-pad, round_r+pad])
cube([round_r2+pad, round_r2+pad, round_r2+pad], center =
true);
sphere(round_r,$fn=smooth);
}
}
// Hörn4 (övre)
translate([-box_l/2+round_r, -box_w/2+round_r, box_h/2-round_r])
{ difference()
{ translate([-round_r-pad, -round_r-pad, round_r+pad])
cube([round_r
2+pad, round_r2+pad, round_r2+pad], center =
true);
sphere(round_r,$fn=smooth);
}
}
/*
// Hörn1 (undre)
translate([box_l/2-round_r, box_w/2-round_r, -box_h/2+round_r])
{ difference()
{ translate([round_r+pad, round_r+pad, -round_r-pad])
cube([round_r2+pad, round_r2+pad, round_r2+pad], center =
true);
sphere(round_r,$fn=smooth);
}
}
// Hörn2 (undre)
translate([-box_l/2+round_r, box_w/2-round_r, -box_h/2+round_r])
{ difference()
{ translate([-round_r-pad, round_r+pad, -round_r-pad])
cube([round_r
2+pad, round_r2+pad, round_r2+pad], center =
true);
sphere(round_r,$fn=smooth);
}
}
// Hörn3 (undre)
translate([box_l/2-round_r, -box_w/2+round_r, -box_h/2+round_r])
{ difference()
{ translate([round_r+pad, -round_r-pad, -round_r-pad])
cube([round_r2+pad, round_r2+pad, round_r2+pad], center =
true);
sphere(round_r,$fn=smooth);
}
}
// Hörn4 (undre)
translate([-box_l/2+round_r, -box_w/2+round_r, -box_h/2+round_r])
{ difference()
{ translate([-round_r-pad, -round_r-pad, -round_r-pad])
cube([round_r
2+pad, round_r2+pad, round_r2+pad], center =
true);
sphere(round_r,$fn=smooth);
}
}
*/
}
}
}
//

module cableHolder3(posX, posY, posZ, length, width, height, radius)
{ // Skapa toppen över switchen
// mått på Switchen
fn = 96;          // upplösning (endast bågen?)
heightHold = 10.5;
widthHold = 33.5;
depthHold = 23.5;
holdRadie = 1.5;  // radie i hörnen
thick = 1.5;      // tjocklek

translate([0,-thick,0])
{
difference(0, 0, 0)
{ hull()
{ difference()
{ translate([thick, 0, heightHold]) // vänster kant
{ rotate([-90, 0, 0])
{ cylinder(h=depthHold, d=thick2);
translate([0, 0, depthHold])
sphere(d=thick
2);          // längst fram
}
}
translate([0, -0.1, heightHold]) // plocka bort underdelen
rotate([-90, 0, 0])
cube([thick*2, thick+.1, depthHold+thick+.1]);
}

     difference()
     { translate([widthHold-thick, 0, heightHold]) // höger kant
       { rotate([-90, 0, 0])
         { cylinder(h=depthHold, d=thick*2);
           translate([0, 0, depthHold])
             sphere(d=thick*2);         // längst fram
         }
       }
       translate([widthHold-thick*2, -0.1, heightHold]) // plocka

bort underdelen
{ rotate([-90, 0, 0])
cube([thick*2, thick+.1, depthHold+thick+.1]);
}
}
}

   // öppna hålen för monteringsskruvarna uppe på plattan
   translate([4, 13.5, 0])
     cylinder(h=15,d=3.2);
   translate([4, 13.5, 17.3])
     sphere(r=6);

   translate([29.6, 13.5, 0])
     cylinder(h=15,d=3.2);

   translate([29.6, 13.5, 17.3])
     sphere(r=6);
 }

 // halvbåge 1 bak
 translate([thick, 0, heightHold/2+thick/2])
   rotate([0, 90, 180])
     rotate_extrude(angle = 180, convexity=20, $fn=64)
 translate([heightHold/2-thick/2, 0, 0])
   circle(d=thick*2);
 translate([thick, 0, heightHold])
   sphere(d=thick*2);  // övre kulan
 translate([thick, 0, thick])
   sphere(d=thick*2);  // undre kulan


 // halvbåge 2 bak
 translate([widthHold-thick, 0, heightHold/2+thick/2])
   rotate([0, 90, 180])
     rotate_extrude(angle = 180, convexity=20, $fn=64)
 translate([heightHold/2-thick/2, 0, 0])
   circle(d=thick*2);
 translate([widthHold-thick, 0, heightHold])
   sphere(d=thick*2);  // övre kulan
 translate([widthHold-thick, 0, thick])
   sphere(d=thick*2);  // undre kulan

 // en cylinder tvärsöver längst upp
 translate([thick, 0, heightHold])
 { rotate([0,90,0])
     cylinder(h=widthHold-thick*2, r=thick);
 }

}

// Halvbågen (kabelhållaren) på baksidan switchen
translate([widthHold-thick, -thick, heightHold/2+thick/2])
{ rotate([0,90,180])
linear_extrude(widthHold-thick2)
arc(heightHold/2-thick/2, [0, 180], thick, fn); //radius,
angles, width, fn)
}
// en cylinder tvärsöver längst ned
translate([thick, -thick, thick])
{ rotate([0,90,0])
cylinder(h=widthHold-thick
2, r=thick);
}
}

module switch(posX=0, posY=0, posZ=0)
{ buttRadie = 1.5;
height = 10.5;
width = 33.5;
depth = 23.5;
h1x = buttRadie;
h1y = buttRadie;
h2x = width-buttRadie;
h2y = buttRadie;
h3x = width-buttRadie;
h3y = depth-buttRadie;
h4x = buttRadie;
h4y = depth-buttRadie;

translate([posX, posY, posZ])
{ difference()
{ color("#F9F9F3")
// tryck-knappen
union()
{ translate([width/2, depth+6-0.1, height/2])
{ rotate([90, 0, 0])
{ translate([0,0,6])
circle(d=6.8);  // skuggan runt knapp
cylinder(h=6, d=6);
sphere(d=6);
}
}

     hull()  // Switchkropp
     { translate([h1x, h1y])
         cylinder(h=height, r=1.5);
       translate([h2x, h2y])
         cylinder(h=height, r=1.5);
       translate([h3x, h3y])
         cylinder(h=height, r=1.5);
       translate([h4x, h4y])
         cylinder(h=height, r=1.5);
     }
   }

   // Skruvhålen för switchen
   hole( 4, 12, 0, "#FFD700", height);
   hole(29.6, 12, 0, "#FFD700", height);
   // hole( 4, 12, 0, "#FFD700", 50);
   // hole(29.6, 12, 0, "#FFD700", 50);
   // hål för kablar bak
   color("gray")
   { translate([9.5, 16, height/2])
     { rotate([90, 0, 0])
         cylinder(h=16.5, d=4);
     }
     translate([24.5, 16, height/2])
     {  rotate([90, 0, 0])
         cylinder(h=16.5, d=4);
     }
   }

   // hål för kabelskruvar
   color("white")
   { translate([29.5, 17.1, height/2])
     { rotate([0, 90, 0])
         cylinder(h=4.1, d=4.5);
     }
     translate([-0.1, 17.1, height/2])
     { rotate([0, 90, 0])
         cylinder(h=4.1, d=4.5);
     }
   }
 }

 // Kabelskruvar
 cableScrew(3, 17, height/2, 90);
 cableScrew(31, 17, height/2, -90);

}
}

// Skruven som håller fast kabeln i switchen
module cableScrew(posX=0, posY=0, posZ=0, angle=0)
{ color("#FFD700")  // mässing
translate([posX, posY, posZ])
{ rotate([0, 0, angle])
{ difference()
{ // skruvskalle
translate([0, 0, 0])
rotate([90, 0, 0])
cylinder(h=2, d1=4, d2=3.5);

     // stjärnan i skruven
     translate([0, 1.85, -.25])
       rotate([0, 0, 0])
         cylinder(h=0.5, d=5);
     translate([-0.25, -.6, 2.25])
       rotate([0, 90, 0])
         cube([4.5, 2, 0.5]);
   }
 }

}
}

// borrhål
module hole(posX=0, posY=0, posZ=0, colorName="yellow", height)
{ diamHole1 = 3;
highHole1 = height;
diamHole2 = 6;
highHole2 = 2.5;
offs=0.1;

color(colorName)
{
translate([posX, posY, posZ])
{ translate([0, 0, 0])
cylinder(h=highHole1, d=diamHole1);
translate([0, 0, -offs])
cylinder(h=highHole2, d=diamHole2);
translate([0, 0, height-highHole2+offs])
cylinder(h=highHole2, d=diamHole2);
}
}
}

module showCables()
{ translate([-25,8,24])
rotate([80,177,90])
cable(10,10,0,"brun");
translate([-43,8,15])
rotate([90,180,90])
cable(10,10,0,"blå");
}

module cable(posX=0, posY=0, posZ=0, colorName="blå", radius=1.26,
width=0.62, thick=50, fn=24)
{ // default 1.5mm2
// radius = inner radie
// width = bredd/tjocklek på cirkeln (inte höjd)
// thick = höjd på cirken/ röret
// pin=

colCupper = "#D7715A";
colGreen  = "#07DA63";
colYellow = "#FFCC00";

if (colorName=="gröngul")
{ translate([posX, posY, posZ])
{ color(colGreen)
linear_extrude(thick)
arc(radius, [0, 60], width, fn);
color(colYellow)
linear_extrude(thick)
arc(radius, [60, 180], width, fn);
color(colGreen)
linear_extrude(thick)
arc(radius, [180, 240], width, fn);
color(colYellow)
linear_extrude(thick)
arc(radius, [240, 360], width, fn);

   color(colCupper)
     linear_extrude(10, center=true, convexity=10, $fn=100)
       circle(d=1.24);
 }

}
else  // vanliga kablar 1.5mm2
{
cableColor = colorName == "blå" ? "#1870D5"
: colorName == "brun" ? "#9C6137"
: colorName == "svart" ? "#000000"
: assert(false,"invalid color value");  // message if no
case worked
// : nodef

 translate([posX, posY, posZ])
 {             //el kabel - ena änden rak - andra böjd
   color(colCupper)    //kopparstump tråd rakkabel
     linear_extrude(10, center=true, convexity=10, $fn=100)
       circle(d=1.24);

    color(cableColor)
    { cylinder(h=thick, r=radius);

     translate([-radius*2, 0, thick])  // kabelböj
     rotate([90, 0, 0])
     rotate_extrude(angle=90, convexity=20)
       translate([2.5, 0, 0])
         circle(r=1.26);

     translate([-radius*2, 0, thick+radius*2])
       rotate([0, -90, 0])
       cylinder(h=5, r=radius);
   }
   translate([-10, 0, thick+radius*2])
   { rotate([0, -90, 0])
     { color(colCupper)
       { linear_extrude(5, center=true, convexity=10, $fn=100)
           circle(d=1.24);
       }
     }
   }
 }

}
}

//

---====
module arc(radius, angles, width = 1, fn = 24) {
difference() {
sector(radius + width, angles, fn); // ytterradie
sector(radius, angles, fn);        // innerradie (plockar bort
invändigt
}
}

module sector(radius, angles, fn = 24) {
r = radius / cos(180 / fn);
step = -360 / fn;

 points = concat([[0, 0]],
     [for(a = [angles[0] : step : angles[1] - 360])
         [r * cos(a), r * sin(a)]
     ],
     [[r * cos(angles[1]), r * sin(angles[1])]]
 );

 difference() {
     circle(radius, $fn = fn);
     polygon(points);
 }

}
= = END product 2 = = = = = = = = = = = = = = = = = = = = = = = = = = =
= = =

  • . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _
    . - . _ . - . _ . - . _ . - . _ . -

Den fredag 6 maj 2022 14:06:55 CEST, Michael Möller <
private2michael@gmail.com> skrev:

OpenSCAD code - is a description of your model in terms of a few
cylinder/cubes added and cut out
difference() {
cylinder(d=5,h=10);
translate([0,10,0]) cube([4,6,2]) ;
}

STL file is a list of triangles which make the same outer shell as your
model. OpenSCAD makes this complicated transform from shapes to triangles.
solid OpenSCAD_Model
facet normal 0.92388 0.382682 0
outer loop
vertex 2.5 0 3
vertex 1.76777 1.76777 0
vertex 1.76777 1.76777 3
endloop
endfacet
facet normal 0.92388 0.382682 0
outer loop
vertex 1.76777 1.76777 0
vertex 2.5 0 3
vertex 2.5 0 0
endloop
endfacet
: (and so on for 300 lines) There is a binary/compressed version, but
the description is still just triangles.

Gcode is what a 3D printer understands - it is the exact list of moves
that the head has to do with how much plastic to squeeze to trace the
outline of your shape, layer, by layer. It will optionally create moves for
filling the inside or support for overhangs. Such a program is called a
SLICER and the printer will come with one.
G92 E0 ; reset extrusion distance
G1 Z2.330 F6600.000 ; lift Z
G1 X-0.000 Y1.505 F6600.000 ; move to first perimeter point
G1 Z0.330 F6600.000 ; restore layer Z
G1 E3.00000 F2400.00000 ; unretract extruder 0
G1 F1500
G1 X-1.064 Y1.064 E3.09259 ; perimeter
G1 X-1.505 Y0.000 E3.18517 ; perimeter
: (many similar lines)
G1 X1.515 Y1.515 E4.65860 ; perimeter
G1 X0.055 Y2.120 E4.78559 ; perimeter
G1 X-0.000 Y2.143 F6600.000 ; move inwards before travel
G1 X0.384 Y0.843 F6600.000 ; move to first infill point
G1 F1500
G1 X0.843 Y0.384 E4.84815 ; infill
G1 X1.097 Y-0.229 E4.91215 ; infill
:
(and so on for thousands of lines)

The 3MF still basically deals in triangles, and attributes (surface,
infill material, picture, ticket info ... ) which probably are not used by
your slicer/printer.

On Fri, 6 May 2022 at 12:37, Jan Öhman via Discuss <
discuss@lists.openscad.org> wrote:

---------- Forwarded message ----------
From: "Jan Öhman" jan_ohman@yahoo.com
To: OpenSCAD General Discussion discuss@lists.openscad.org
Cc:
Bcc:
Date: Fri, 6 May 2022 10:38:46 +0000 (UTC)
Subject: [OpenSCAD] Export to .STL / .3MF for later 3D-printing.
Hi!

Thought to create some objects in openSCAD, to print later.
I do not have my own 3D printer (yet).

One I talked to, wanted to get the drawings in .STL or .3MF. (I don't
know the difference).

If I had my own printer, have I been able to print directly from
openSCAD?
(Without some export?)

In the openSCAD, no errors or problems occur.
but
The drawings I tested to export from openSCAD have given one or another
error message.
One message .:
WARNING: Object may not be a valid 2-manifold and may need repair!

Another message .:
WARNING: No top level geometry to render

What to do?

---------- Forwarded message ----------
From: "Jan Öhman via Discuss" discuss@lists.openscad.org
To: OpenSCAD General Discussion discuss@lists.openscad.org
Cc: "Jan Öhman" jan_ohman@yahoo.com
Bcc:
Date: Fri, 6 May 2022 10:38:46 +0000 (UTC)
Subject: [OpenSCAD] Export to .STL / .3MF for later 3D-printing.


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org

---------- Forwarded message ----------
From: "Jan Öhman via Discuss" discuss@lists.openscad.org
To: OpenSCAD general discussion discuss@lists.openscad.org
Cc: "Jan Öhman" jan_ohman@yahoo.com
Bcc:
Date: Sat, 7 May 2022 11:04:31 +0000 (UTC)
Subject: [OpenSCAD] Re: Export to .STL / .3MF for later 3D-printing.


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org

Alright, I have written a few functions, which can do similar shapes. But again there is a learning curve. I feel BOSL is a very extensive work (I have not used it though, except few interactions with Adrian) you can refer to the m39.scad file in https://github.com/sprabhakar2006/openSCAD It is a kind of similar application. Regards Sanjeev On Sat, 7 May 2022 at 22:27, Michael Möller <private2michael@gmail.com> wrote: > Jan Öhman wrote it failed in Render/F6, but works in Preview/F5 - in so > many words. I tried and got the following > > First model > [image: image.png] > F6 Error: WARNING: Ignoring 2D child object for 3D operation in file , > line 53 > > ERROR: CGAL error in CGALUtils::applyUnion3D: CGAL ERROR: assertion > violation! Expr: G.mark(v1,0)==G.mark(v2,0)&& G.mark(v1,1)==G.mark(v2,1) > File: > /mxe/usr/x86_64-w64-mingw32.static.posix/include/CGAL/Nef_S2/SM_overlayer.h > Line: 303 > > Which I think is pretty selfexplantory: Passed a 2D shape to something > that expected a 3D shape - but you have to read the whole code to find it > ... which I think Jan is more qualified to do :-) > > 2nd part > [image: image.png] > > ... which is one of those where zooming or rotating the model in preview > takes >5 second > [image: image.png] > > And I didn't bother waiting for the F6 error ... ;-) > > > Of course, we do not know if the above shapes I got are the ones that Jan > wants - there are also sections of code commented out. > > (From the comments it seems these are to be nice and alternative covers > for wall outlet/switches.) > > > > On Sat, 7 May 2022 at 18:26, Sanjeev Prabhakar <sprabhakar2006@gmail.com> > wrote: > >> Quite a long code. >> Can you paste a picture of what you are trying to draw. >> Regards >> Sanjeev >> >> On Sat, 7 May 2022, 16:31 Jan Öhman via Discuss, < >> discuss@lists.openscad.org> wrote: >> >>> >>> >>> >>> ---------- Forwarded message ---------- >>> From: "Jan Öhman" <jan_ohman@yahoo.com> >>> To: OpenSCAD general discussion <discuss@lists.openscad.org> >>> Cc: >>> Bcc: >>> Date: Sat, 7 May 2022 11:04:31 +0000 (UTC) >>> Subject: [OpenSCAD] Re: Export to .STL / .3MF for later 3D-printing. >>> Thank you! >>> Begins to understand how it works. (It was not easy...) >>> >>> but my solution was not good ... >>> >>> Here are 2 files that do not work to render (F6) >>> >>> >>> = = product 1= = = = = = = = = = = = = = = = = = = = = = = = = = = = = >>> = = = >>> - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - >>> . _ . - . _ . - . _ . - . _ . - >>> >>> >>> include <BOSL2/std.scad> >>> fn = 150; >>> >>> placering="left"; >>> // placering="right" >>> >>> box(0, 0, 0, placering, "#C0C0C0", fn); // (X, Y, Z, left/right, >>> colorName) >>> >>> >>> // Monteringsplattan >>> // mountingPlate(0, 0, 0, placering); >>> >>> >>> // LED belysning >>> // LEDlampa(0, 0, 0, placering); >>> >>> >>> // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >>> // - - - - m o d u l e r - - - - - - - - - - - - - - - - - - >>> >>> >>> >>> //================================================================================== >>> //====== box >>> ===================================================================== >>> module box(posX=0, posY=0, posZ=0, mountSide="left", >>> colorName="#00FF00", fn=24) >>> { >>> side = mountSide == "left" ? 0 >>> : mountSide == "right" ? 1 >>> : assert(false,"invalid moutSide value"); // message if no case >>> worked >>> >>> color(colorName) >>> translate([posX, posY, posZ]) >>> mirror([side, 0, 0]) >>> difference() >>> { >>> union() >>> { >>> // Skapa konturer på bottenplattan - x, y, r, angles, [grader], början >>> // Rotation medurs - vänster lamphållare (bakant saknas) >>> points1 = circSect( 140, 0, 0, [0, 0], "right", 1, fn); // böj >>> nere till höger >>> points2 = circSect( 60, 5, 5, [0, 5], "bottom", 1, fn); // >>> brytpunkt längst ned >>> points3 = circSect( 10, 13, 10, [0, 90], "bottom", 1, fn); // böj >>> nere till vänster >>> points4 = circSect( 5, 80, 5, [0, 90], "left", 1, fn); // böj >>> uppe till vänster >>> points5 = circSect( 140, 80, 5, [0, 1], "top", 1, fn); // böj >>> uppe till höger >>> edge = concat(points1, points2, points3, points4, points5); >>> path = path3d(reverse(edge)); >>> section = wall(); >>> path_sweep( section, path, closed=false); >>> >>> >>> // Skapa bakkant lite högre och smalare i topp >>> bottom1 = concat(points5, points1); >>> polygon(bottom1); >>> path1 = path3d(reverse(bottom1)); >>> section1 = wall1(); // lite högre bakvägg wall(b=4, f=8, h=15, t=3.5) >>> path_sweep( section1, path1, closed=false); >>> >>> // fyll upp bottenplattansbaksida >>> linear_extrude(4) // Bottomplate - fill up >>> polygon(concat(points1, points2, points3, points4, points5)); >>> >>> >>> // skapa Utskjutande del under (tänk spegelvänt) >>> pt1 = circSect( 19.5, 85, 0, [0, 50], "top", 1, fn); // Uppe till >>> höger - moturs >>> pt2 = circSect( 39, 1.35, .1, [-5, 90], "right", 1, fn); // Nere >>> till höger >>> pt3 = circSect( 10, 13.05, 10, [0, 90], "bottom", 1, fn); // Nere >>> till vänster >>> pt4 = circSect( 5, 80, 5, [0, 90], "left", 1, fn); // Uppe till >>> vänster >>> translate([0, 0, -2]) >>> linear_extrude(2.1) >>> polygon(concat(pt1, pt2, pt3, pt4)); >>> >>> // utgången för kabeln på baksidan (diam 10mm) - pekar lite nedåt >>> cableExit(65, 35, 0, 15, "cyan", $fn=100); >>> } >>> >>> // skapa ett borrhål i bakkant >>> translate([132,60,15]) >>> { rotate([0, 90, 0]) >>> { cylinder(h=10, d=2, $fn=100); >>> cylinder(h=4, d=9, $fn=100); >>> } >>> } >>> >>> // skapa en borrmarkering i bakkant >>> translate([139,25,15]) >>> { rotate([0, 90, 0]) >>> cylinder(h=2, d1=1, d2=2.5, $fn=100); >>> } >>> >>> >>> // ingravera årtalet på baksidan >>> translate([10, 80, -0.5]) >>> { mirror([side, 0, 0]) >>> { rotate([0, 180, 0]) >>> { linear_extrude(3) >>> text("2022", size=12, direction="ttb", font="Comic Sans >>> MS:style=Bold"); >>> } >>> } >>> } >>> >>> /* >>> // Markera skruvhål på bakkant >>> borr=3; >>> bredd=140; >>> hojd=8; >>> avstNed=20; >>> translate([bredd, avstNed, hojd]) >>> { rotate([0,90,0]) >>> cylinder(h=2, d1=0.5, d2=borr, center=true, $fn=50); >>> } >>> */ >>> >>> // borrhål >>> mountingHole(20, 36, 0, 7, 90.1, 15); // posX, posY, posZ, diam, dist, >>> deep, $fn=50 >>> >>> } >>> } >>> //======== Slut box >>> ============================================================== >>> >>> >>> >>> //================================================================================== >>> //====== cableExit >>> =============================================================== >>> module cableExit(posX, posY, posZ, angle, colorName) >>> { diamHole = 7; >>> diamHolder = 9.8; >>> hight = 12; >>> topRad = diamHolder/2; >>> topDiam = diamHolder/2-topRad/2; >>> bowRad = 7; >>> offs1 = 0.1; >>> >>> color(colorName) >>> translate([posX, posY, posZ]) >>> { rotate([180, 0, 180-angle]) >>> { difference() >>> { hull() >>> { cylinder(h=hight, d=diamHolder, center=false); >>> translate([0, 0, hight]) // rundad topp >>> rotate_extrude(angle=360, convexity=2) >>> translate([topDiam, 0, 0]) // yttre diam topp >>> circle(d=topRad); // radie topp >>> } >>> >>> >>> inpHight = 2; // ett värde som styr var utgångshålet hamnar >>> translate([0, 0, -offs1]) >>> cylinder(h=inpHight+offs1, d=diamHole, center=false); // >>> Bottenhål >>> >>> translate([-bowRad, 0, inpHight-offs1]) // böjen >>> { rotate([90, 0, 0]) >>> rotate_extrude(angle=90, convexity=10) >>> translate([bowRad, 0, 0]) // ställ in radien på kabelböjen >>> circle(d=diamHole); >>> } >>> } >>> } >>> } >>> } >>> //====== slut cableExit >>> ========================================================== >>> >>> >>> >>> //================================================================================== >>> //====== mountingHole >>> ============================================================ >>> module mountingHole(posX=0, posY=0, posZ=0, diam=7, dist=90, deep=5, >>> $fn=50) >>> { // diam = 6; // [mm] >>> // dist = 90; // [mm] >>> // deep = 12; // [mm] >>> >>> translate([posX, posY, posZ]) >>> { translate([0, 0, -10]) >>> cylinder(h=deep, d=diam); // fästhål 1 >>> >>> //cableHold1(dist/2, 0, .2, "#D5D5D5"); // Kabelgenomföring >>> translate([dist/2, 0, 0]) >>> { hull() >>> { cylinder(h=5, d=6); // fästhål 1 >>> sphere(d=7.5); >>> } >>> } >>> >>> translate([dist, 0, -10]) >>> cylinder(h=deep, d=diam); // fästhål 2 >>> } >>> } >>> //====== slut mountingHole >>> ======================================================= >>> >>> >>> >>> //================================================================================== >>> //====== LEDlampa >>> ================================================================ >>> // module LEDlampa(posX=8, posY=10, posZ=0) >>> module LEDlampa(posX=0, posY=0, posZ=0, mountSide="left") >>> { side = mountSide == "left" ? 0 >>> : mountSide == "right" ? 1 >>> : assert(false,"invalid moutSide value"); // message if no case >>> worked >>> >>> xpos = mountSide == "left" ? 121 >>> : mountSide == "right" ? -10 >>> : assert(false,"invalid moutSide value"); // message if no case >>> worked >>> /* >>> ypos = mountSide == "left" ? 10.5 >>> : mountSide == "right" ? 10.5 >>> : assert(false,"invalid moutSide value"); // message if no case >>> worked >>> >>> zpos = mountSide == "left" ? 5 >>> : mountSide == "right" ? 5 >>> : assert(false,"invalid moutSide value"); // message if no case >>> worked >>> */ >>> // echo(xpos,ypos,zpos); >>> // translate([xpos, ypos, zpos]) >>> translate([xpos, 10.5, 5]) >>> mirror([1, 0, 0]) >>> translate([posX, posY, posZ]) >>> { LEDbottom(); >>> translate([0, 0, 11]) >>> LEDglas(); >>> } >>> } >>> //====== Slut LEDlampa >>> =========================================================== >>> >>> >>> >>> //================================================================================== >>> //====== LEDglas >>> ================================================================= >>> module LEDglas() >>> { >>> // Variabler botten >>> length = 111; // längd mm >>> wideMid = 50.5; // bredd i mitten mm >>> >>> cornRad = 10; // Radien i alla hörn >>> wideCorn = 48; // Bredd i kanterna >>> >>> diamHole = 6; // håldiameter i mm >>> >>> colorBot = "gray"; >>> colorTop = "orange"; >>> >>> // Variabler top >>> cornHigh = 5; //Höjd i ändarna >>> midHigh = 8; >>> highTop = cornHigh + 1; // höjd mm >>> >>> p1tx = 10; // the start value >>> p1ty = 49.25; >>> p2tx = 55.5; // the middle value >>> p2ty = 50.5; >>> p3tx = 101; // the end value >>> p3ty = p1ty; >>> >>> p4tx = 101; // the start value >>> p4ty = 1.25; >>> p5tx = 55.5; // the middle value >>> p5ty = 0.0; >>> p6tx = 10; // the end value >>> p6ty = p4ty; >>> // Ger ovalt glas >>> points1 = 3points_arc([p1tx,p1ty], [p2tx,p2ty], [p3tx,p3ty], fn=100); >>> points2 = 3points_arc([p4tx,p4ty], [p5tx,p5ty], [p6tx,p6ty], fn=100); >>> >>> color("orange") >>> linear_extrude(height=cornHigh+.1) >>> difference() >>> { polygon(concat(points1, points2)); >>> >>> translate([length-10 , wideMid / 2, -.2]) >>> circle(d=6); >>> translate([10 , wideMid / 2, -.2]) >>> circle(d=6); >>> } >>> >>> // Top >>> color(colorTop) >>> difference() >>> { hull() >>> { // hörn1 >>> translate([cornRad, wideMid - ((wideMid-wideCorn)/2) - cornRad, >>> 0]) // [10,39] >>> cylinder(h=cornHigh, d=cornRad*2, center=false); >>> // hörn2 >>> translate([cornRad, cornRad + ((wideMid-wideCorn)/2), 0]) >>> // [10,12] >>> cylinder(h=cornHigh, d=cornRad*2, center=false); >>> // hörn3 >>> translate([length - cornRad, wideMid - ((wideMid-wideCorn)/2) - >>> cornRad, 0]) // [101 ,39] >>> cylinder(h=cornHigh, d=cornRad*2, center=false); >>> // hörn4 >>> translate([length - cornRad, cornRad + ((wideMid-wideCorn)/2), >>> 0]) // >>> cylinder(h=cornHigh, d=cornRad*2, center=false); >>> } >>> >>> union() >>> { // Monteringshål 1 & 2 >>> translate([length-10 , wideMid / 2, -.2]) >>> cylinder(d=diamHole, h=highTop+.5, center=false); >>> translate([10 , wideMid / 2, -.2]) >>> cylinder(d=diamHole, h=highTop+.5, center=false); >>> } >>> } >>> } >>> //======== Slut LEDglas >>> ========================================================== >>> >>> >>> >>> //================================================================================== >>> //====== LEDbottom >>> =============================================================== >>> module LEDbottom() >>> { p1x = 10; // the start value >>> p1y = 49.25; >>> p2x = 55.5; // the middle value >>> p2y = 50.5; >>> p3x = 101; // the end value >>> p3y = p1y; >>> >>> p4x = 101; // the start value >>> p4y = 1.25; >>> p5x = 55.5; // the middle value >>> p5y = 0.0; >>> p6x = 10; // the end value >>> p6y = p4y; >>> >>> // Variabler botten för borrhålen >>> length = 111; // längd mm >>> wideMid = 50.5; // bredd i mitten mm >>> diamHole = 6; // håldiameter i mm >>> cornHigh = 5; //Höjd i ändarna >>> midHigh = 8; >>> highTop = cornHigh + 1; // höjd mm >>> // offs1 = 0.1; >>> heightHole = 15; //mm >>> height = 11; //mm >>> >>> points1 = circSect( 10, 11.25, 10, [0, 90], "bottom", 1, fn); // >>> Hörn nere till vänster >>> points2 = circSect( 10, 39.25, 10, [0, 90], "left", 1, fn); // >>> Hörn uppe till vänster >>> points3 = 3points_arc([p1x,p1y], [p2x,p2y], [p3x,p3y], fn); >>> points4 = circSect( 101, 39.25, 10, [0, 90], "top", 1, fn); // >>> Hörn uppe till höger >>> points5 = circSect( 101, 11.25, 10, [0, 90], "right", 1, fn); // >>> Hörn nere till höger >>> points6 = 3points_arc([p4x,p4y], [p5x,p5y], [p6x,p6y], fn); >>> >>> // The base plate for the LED lamp >>> >>> >>> difference() >>> { color("gray", 0.5) >>> linear_extrude(height=height) >>> polygon(concat(points1, points2, points3, points4, points5, >>> points6)); >>> >>> >>> // union() >>> { // Monteringshål 1 & 2 >>> translate([length-10 , wideMid / 2, -.2]) >>> cylinder(d=diamHole, h=heightHole, center=false); >>> translate([10 , wideMid / 2, -.2]) >>> cylinder(d=diamHole, h=heightHole, center=false); >>> } >>> } >>> } >>> //======== Slut LEDbottom >>> ======================================================== >>> >>> >>> >>> >>> //================================================================================== >>> //====== circleSect >>> ============================================================== >>> // Create rounded corners 2D >>> // https://openhome.cc/eGossip/OpenSCAD/SectorArc.html >>> // ange .: x, y, radien, >>> // [från, till] vinkel, >>> // var vinkeln startar, (left, bottom, right, top) >>> // vilken rotation (-1=medsol, 1=motsols) >>> function circSect(x=0, y=0, radius=10, angles=[0,270], >>> startRef="bottom", rotate=1, fn=24) = >>> let( >>> startAngel = (startRef == "left") ? 0 >>> : (startRef == "bottom") ? 90 >>> : (startRef == "right") ? 180 >>> : (startRef == "top") ? 270 >>> : startRef, // valfri vinkel >>> // : assert(false,"invalid moutSide value"); // Error >>> message if no case worked >>> //: undef, >>> r = radius, >>> //r = radius / cos(180 / fn), >>> step = 360 / fn, >>> // points = [[x, y], >>> points = [ >>> for(a = [angles[0]-startAngel : step : angles[1]-startAngel]) >>> [-rotate * r * cos(a)+x, r * sin(a)+y]] >>> ) points; >>> //======== Slut circleSect >>> ======================================================= >>> >>> >>> >>> //================================================================================== >>> //====== 3points_arc >>> ============================================================= >>> // Create an arc with three points 2D >>> function 3points_arc(p0, p1, p2, fn=10) = >>> // an alternative expression for D >>> // D = 2 * ( (p1-p0).x * (p2-p0).y - (p1-p0).y * (p2-p0).x ) >>> let( D = 2 * cross(p1-p0, (p2-p0)) ) >>> assert( abs(D)>1e-9, "The 3 points should not be collinear." ) >>> let( >>> Ux = ( (p2-p0).y*(p1-p0)*(p1-p0) - (p1-p0).y*(p2-p0)*(p2-p0) >>> )/D, >>> Uy = ( (p1-p0).x*(p2-p0)*(p2-p0) - (p2-p0).x*(p1-p0)*(p1-p0) >>> )/D, >>> radius = norm([Ux,Uy]), >>> center = [Ux,Uy] + p0, >>> ang0 = atan2( (p0-center).y, (p0-center).x ), >>> ang2 = atan2( (p2-center).y, (p2-center).x ), >>> // the points are in a cw winding iff D<0 >>> // the angular difference between vectors p2-center and p0-center >>> // measured from p0-center; dang is positive iff D is negative >>> dang = D<0 ? ang2<ang0 ? ang2-ang0 : ang2-ang0-360 >>> : ang2>ang0 ? ang2-ang0 : ang2-ang0+360 >>> ) >>> [ for(i=[0:fn-1]) >>> let( ang = ang0 + i*dang/(fn-1) ) >>> center + radius*[cos(ang),sin(ang)] ]; >>> //======== Slut 3points_arc >>> ====================================================== >>> >>> >>> >>> //================================================================================== >>> //====== Wall som ett "L" >>> ======================================================== >>> // Normal vägghöjd >>> function wall() = >>> let( >>> b = 4, // botten - tjocklek >>> f = 8, // Foten >>> h = 15, // Höjd >>> t = 3.5, // Top >>> x = (b+(t/2) - (h - ( (-h / (f-t)) *t) )) / (-h / (f-t)) >>> ) >>> let( >>> points = [[0,0], [f,0], [t,h], [0,h]] , >>> top = move([t/2, h, 0], circle(d=t, $fn=20)), >>> sqr = square([10, b]), >>> diff = >>> difference([ >>> move([x, b], square([t/2, t/2])), >>> move([x+(t/2), b+(t/2), 0], circle(d = t, $fn=20) ) ]) >>> ) >>> union([points, top, sqr, diff]); >>> //======== Slut Wall >>> ============================================================= >>> >>> >>> >>> >>> //================================================================================== >>> //====== Wall1 som ett "L" >>> ======================================================= >>> // En högre vägg >>> function wall1() = >>> let( >>> b = 4, // botten - tjocklek >>> f = 7, // Foten >>> h = 25, // Höjd >>> t = 3, // Top >>> x = (b+(t/2) - (h - ((-h / (f-t)) *t))) / (-h / (f-t)) >>> ) >>> let( >>> points = [[0,0], [f,0], [t,h], [0,h]] , >>> top = move([t/2, h, 0], circle(d=t, $fn=20)), >>> sqr = square([10, b]), >>> diff = >>> difference([ >>> move([x, b], square([t/2, t/2])), >>> move([x+(t/2), b+(t/2), 0], circle(d = t, $fn=20) ) ]) >>> ) >>> union([points, top, sqr, diff]); >>> //======== Slut Wall1 >>> ============================================================ >>> >>> >>> >>> //================================================================================== >>> //====== Plåt på släp >>> ============================================================ >>> module mountingPlate(posX=0, posY=0, posZ=0, mountSide="left", >>> colorName="#C0C0C0", $fn=50) >>> { // Hörnpositionerna >>> posX1 = 120; >>> posY1 = 0; >>> posX2 = posX1; >>> posY2 = -200; >>> posX3 = 120 - 75; >>> posY3 = -200; >>> posX4 = 0; >>> posY4 = 0; >>> thick=2; // tjocklek >>> >>> side = mountSide == "left" ? 0 >>> : mountSide == "right" ? 1 >>> : assert(false,"invalid moutSide value"); // message if no case >>> worked >>> >>> xpos = mountSide == "left" ? 20 >>> : mountSide == "right" ? -20 >>> : assert(false,"invalid moutSide value"); // message if no case >>> worked >>> /* >>> ypos = mountSide == "left" ? 85 >>> : mountSide == "right" ? 85 >>> : assert(false,"invalid moutSide value"); // message if no case >>> worked >>> >>> zpos = mountSide == "left" ? -thick >>> : mountSide == "right" ? -thick >>> : assert(false,"invalid moutSide value"); // message if no case >>> worked >>> */ >>> color(colorName) >>> { translate([posX, posY, posZ]) >>> translate([xpos, 85, -thick]) >>> { mirror([side, 0, 0]) >>> { linear_extrude(thick) >>> hull() >>> { translate([posX1, posY1, 0]) >>> square(0.1, center = true); >>> translate([posX2, posY2, 0]) >>> square(0.1, center = true); >>> translate([posX3, posY3, 0]) >>> square(0.1, center = true); >>> translate([posX4, posY4, 0]) >>> square(0.1, center = true); >>> } >>> } >>> } >>> } >>> } >>> = = END product 1= = = = = = = = = = = = = = = = = = = = = = = = = = = >>> = = = >>> - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - >>> . _ . - . _ . - . _ . - . _ . - >>> >>> >>> >>> >>> = = product 2 = = = = = = = = = = = = = = = = = = = = = = = = = = = = = >>> = = = >>> - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - >>> . _ . - . _ . - . _ . - . _ . - >>> >>> $fn=100; >>> //$fn=15; >>> >>> //switch(); >>> //cableHolder4(); //Switchboxen >>> >>> >>> // cableHolder3(0, 0, 0, 33.5, 23.5, 1.5, 2); >>> // showCables(); >>> >>> >>> >>> module cableHolder4(fn=24); >>> { // idé från >>> // - https://www.thingiverse.com/thing:6400/files >>> // - >>> https://ihrchive.wordpress.com/2011/02/14/openscad-tip-round-1-of-3-basic-rounding/ >>> >>> // mått på Switch >>> heightHold = 10.5; >>> widthHold = 33.5; >>> depthHold = 23.5; >>> spaceHold = 10.0; // utrymmet bakom switch >>> holdRadie = 2; // radie i hörnen >>> thick = 2; >>> offset1=0.5; // öka toleransen >>> >>> // innermått >>> holeW = widthHold + offset1; >>> holeH = heightHold + offset1; >>> holeD = depthHold + spaceHold+offset1; >>> >>> // yttermått >>> pad = 0.1; // Padding to maintain manifold >>> box_l = holeW + thick*2; // Bredden på switchen >>> box_w = holeD + thick; // Djupet på switchen >>> box_h = holeH + thick; // Height >>> round_r = holdRadie; // Radius of round >>> smooth = 45; // Number of facets of rounding cylinder >>> >>> >>> >>> difference() >>> { union() // Detta utförs i två steg. >>> { difference() // utför fasningar och kabelmarkeringar >>> { mainBox(box_l, box_w, box_h, spaceHold+thick, round_r, thick, >>> smooth, pad); >>> >>> // fasning vänster (underkant) >>> translate([box_l/2-0.85, spaceHold-4.3, thick-offset1]) // >>> sidled, fram/bak , upp/ned >>> rotate([0,180,45]) >>> cylinder(h=thick, d1=holeW*1.414-thick-thick, >>> d2=holeW*1.414, $fn=4); >>> >>> // fasning höger (underkant) >>> translate([box_l/2-3.65, spaceHold-4.3, thick-offset1]) // >>> sidled, fram/bak , upp/ned >>> rotate([0,180,45]) >>> cylinder(h=thick, d1=holeW*1.414-thick-thick, >>> d2=holeW*1.414, $fn=4); >>> >>> // kabelgenomföringar >>> rotate([90, 180, 90]) // Markering ena sidan (vänster under) >>> ovalCableHole(spaceHold/2-offset1, -1.75, -1.2); >>> >>> rotate([90, 180, 180]) // Markering bakkant (vänster under) >>> ovalCableHole(spaceHold/2-1.55, -1.75, -spaceHold-0.85); >>> >>> rotate([90, 180, 180]) // Markering bakkant (höger under) >>> ovalCableHole(widthHold-spaceHold/2-offset1, -1.75, >>> -spaceHold-0.85); >>> >>> rotate([90, -180, 90]) // Markering ena sidan (höger under) >>> ovalCableHole(3.75, -1.75, widthHold-0.1); >>> } >>> } // Slut union - kropp >>> >>> translate([-offset1/2, -spaceHold+pad, -pad]) // hålet där switchen >>> ska placeras >>> cube([holeW, holeD+pad, holeH+pad], center=false); >>> >>> translate([4, 12, 0]) >>> cylinder(h=15,d=3.2); >>> translate([4, 12, 17.7]) >>> sphere(r=6); >>> >>> translate([29.6, 12, 0]) >>> cylinder(h=15,d=3.2); >>> translate([29.6, 12, 17.7]) >>> sphere(r=6); >>> >>> /* // Hål genom lock bak - om så önskas >>> translate([box_l/2-thick, -6, offset1/2]) >>> cylinder(h=box_h+thick*4+offset1, d=3.2, $fn=100); // hål genom >>> lock bak >>> >>> translate([box_l/2-thick, -6, 17.7]) >>> sphere(r=6); // kona hålet bak >>> */ >>> } // Slut difference() - box >>> >>> difference() >>> { union() >>> { translate([29.6, 12, heightHold-offset1*2]) >>> cylinder(h=2,d=5.2); // Stödhylsa för Switchskruv1 >>> translate([4, 12, heightHold-offset1*2]) >>> cylinder(h=2,d=5.2); // Stödhylsa för Switchskruv2 >>> >>> translate([holeW/2, -spaceHold+thick+1, holeH/2]) >>> rotate([180,0,0]) >>> backHole(); >>> } // union - slut >>> >>> translate([4, 12, 0]) // Hålen i stödhylsorna >>> cylinder(h=15,d=3.2); >>> >>> translate([29.6, 12, 0]) // Hålen i stödhylsorna >>> cylinder(h=15,d=3.2); >>> >>> translate([box_l/2-thick, -6, -offset1]) // hål i stödhylsa bak >>> cylinder(h=box_h+offset1, d=3.2, $fn=100); >>> >>> // Sänk stödhylsan >>> translate([ widthHold/2-7, -spaceHold-offset1, -thick+offset1]) >>> // hål i stödhylsa bak >>> cube([15, 8, 3]); >>> >>> >>> // kabelmarkering >>> // translate([0, 0, 0]) // hål i stödhylsa bak >>> >>> >>> } >>> >>> >>> >>> >>> >>> >>> /* >>> translate([4, 12, 0]) >>> #cylinder(h=15,d=3.2); >>> //translate([4, 13.5, 17.3]) >>> //#sphere(r=6); >>> >>> translate([29.6, 12, 0]) >>> #cylinder(h=15,d=3.2); >>> //translate([29.6, 13.5, 17.3]) >>> //#sphere(r=6); >>> */ >>> >>> >>> } >>> >>> module backHole() >>> { wallH = 10.5; >>> >>> wide1 = 12; // endast runt cylindern >>> wide2 = 35; // hela väggen >>> deep1 = 4; >>> height1 = 10.5; >>> cornRad1 = 2; >>> diam1 = 8; >>> opt1 = 0.1; >>> >>> //rundadFot(); >>> >>> >>> // Rundad stäcka mellan t.ex. vägg och tak -bakkant >>> translate([wide2/2, diam1/2-cornRad1/2, -height1/2]) >>> { rotate([90, 0, -90]) >>> { linear_extrude(wide2) >>> { difference() >>> { square([cornRad1, cornRad1]); >>> >>> translate([cornRad1, cornRad1]) >>> circle(r=cornRad1); >>> } >>> } >>> } >>> } >>> >>> // rundad stäcka1 (vänster) mellan t.ex. vägg och tak >>> translate([-wide2/2+0.15, deep1/2+cornRad1/2, -height1/2]) >>> rotate([90, 0, 0]) >>> { linear_extrude(spaceHold) >>> { difference() >>> { square([cornRad1, cornRad1]); >>> >>> translate([cornRad1, cornRad1]) >>> circle(r=cornRad1); >>> } >>> } >>> } >>> >>> // rundad stäcka2 mellan t.ex. vägg och tak >>> translate([wide2/2-0.65, deep1/2+cornRad1/2, -height1/2]) >>> rotate([0, -90, 90]) >>> { linear_extrude(spaceHold) >>> { difference() >>> { square([cornRad1, cornRad1]); >>> >>> translate([cornRad1, cornRad1]) >>> circle(r=cornRad1); >>> } >>> } >>> } >>> >>> // Skapa stödfot - bak >>> difference() >>> { union() >>> { //själva cylindern >>> translate([0, 1, 0]) >>> { cylinder(h=height1, d=diam1, center=true); >>> translate([0, diam1/2, 0]) >>> cube([diam1,diam1-1,height1], center=true); >>> } >>> >>> // Rundad fot under cylinder ovan >>> translate([0, 1, -height1/2]) >>> { rotate_extrude() >>> { translate([diam1/2, 0, 0]) >>> { difference() >>> { square([cornRad1, cornRad1]); >>> >>> translate([cornRad1, cornRad1]) >>> circle(r=cornRad1); >>> } >>> } >>> } >>> } >>> >>> // Rundad rakstäcka1 - cylinderfot - mellan t.ex. vägg och tak >>> translate([diam1/2, diam1, -height1/2]) >>> { rotate([90, 0, 0]) >>> { linear_extrude(diam1) >>> { difference() >>> { square([cornRad1, cornRad1]); >>> >>> translate([cornRad1, cornRad1]) >>> circle(r=cornRad1); >>> } >>> } >>> } >>> } >>> >>> // Rundad rakstäcka2 - cylinderfot - mellan t.ex. vägg och tak >>> translate([-diam1/2, diam1, -height1/2]) >>> { rotate([0, -90, 90]) >>> { linear_extrude(diam1) >>> { difference() >>> { square([cornRad1, cornRad1]); >>> >>> translate([cornRad1, cornRad1]) >>> circle(r=cornRad1); >>> } >>> } >>> } >>> } >>> >>> //väggen bakom cylindern som ska rundas >>> translate([0, diam1/2-cornRad1, 0]) >>> cube([wide1, cornRad1, height1], center=true); >>> >>> } >>> >>> >>> // Avrunda hörn1 bak >>> translate([-wide1/2, cornRad1/2, cornRad1]) >>> { hull() >>> { cylinder(h=height1+opt1, r=cornRad1, center=true); >>> { translate([0, 0, -height1/2]) >>> sphere(r=cornRad1); >>> } >>> } >>> } >>> >>> // Avrunda hörn2 bak >>> translate([wide1/2, cornRad1/2, cornRad1]) >>> { hull() >>> { cylinder(h=height1+opt1, r=cornRad1, center=true); >>> { translate([0, 0, -height1/2]) >>> sphere(r=cornRad1); >>> } >>> } >>> } >>> >>> >>> // Plocka bort rundad fot bak samt det som sticker ut >>> translate([-wide1/2, diam1/2-cornRad1/2, -height1/2-opt1]) >>> cube([wide1, diam1/2+cornRad1, height1+opt1*2], center=false); >>> >>> } >>> } >>> >>> >>> >>> >>> >>> module ovalCableHole(posX, posY, posZ) >>> { // Hål 5.5 x 3.5 mm >>> pan = 0.1; >>> cableHi = 1.5; >>> >>> translate([posX, posY, posZ]) >>> { color("white") >>> { translate([0, 0, -pan]) >>> { cylinder(h=cableHi, d=3.5); >>> //#translate([0, 0, 0]) cylinder(h=10, d=1); >>> //translate([0, 0, -1]) cylinder(h=1, d1=0, d2=1); >>> //translate([0, 0, 0]) sphere(d=1); // Inre kulan >>> //translate([0, 0, 1.5]) sphere(d=1); // Inre kulan >>> >>> translate([0, 0, -1]) sphere(d=0.8); // yttre kulan >>> translate([0, 0, 2.5]) sphere(d=0.8); // yttre kulan >>> >>> } >>> translate([2, 0, -pan]) >>> { cylinder(h=cableHi, d=3.5); >>> // #translate([0, 0, -cableHi*2]) cylinder(h=10, d=0.5); >>> //translate([0, 0, 0]) sphere(d=1); // Inre kulan >>> //translate([0, 0, 1.5]) sphere(d=1); // Inre kulan >>> >>> translate([0, 0, -1]) sphere(d=0.8); // yttre kulan >>> translate([0, 0, 2.5]) sphere(d=0.8); // yttre kulan >>> >>> } >>> translate([-3.5/2, 0, -pan]) >>> cube([5.5, 3.5/2, cableHi]); >>> translate([-0.25, -1.74, -pan]) >>> cube([2.5, 1.75, cableHi]); >>> } >>> } >>> } >>> >>> >>> >>> >>> >>> >>> module rundadFot() >>> { >>> // specifika värden för skruvdistansen bak >>> wallH = 10.5; >>> >>> wide1 = 12; // endast runt cylindern >>> wide2 = 34; // hela väggen >>> deep1 = 4; >>> height1 = 10; >>> cornRad1 = 2; >>> diam1 = 8; >>> opt1 = 0.1; >>> >>> >>> color("magenta") >>> { translate([0, 0, wallH]) >>> { difference() >>> { union() >>> { // Bakgavel >>> translate([wide2/2, opt1, height1/2]) >>> { rotate([90, 180, 0]) >>> cube([wide2, height1, opt1]); >>> } >>> >>> // Golv >>> translate([wide2/2, -height1+opt1, -height1/2]) >>> rotate([0, 180, 0]) >>> cube([wide2, height1, opt1]); >>> >>> //väggen bakom cylindern som kan rundas >>> translate([0, -cornRad1/2, 0]) >>> cube([wide1, cornRad1, height1], center=true); >>> >>> //själva cylindern >>> translate([0, -cornRad1/2, 0]) >>> cylinder(h=height1, d=diam1, center=true); >>> >>> // Rundad fot under cylinder ovan >>> translate([0, -cornRad1/2, -height1/2]) >>> { rotate_extrude() >>> { translate([diam1/2, 0, 0]) >>> { difference() >>> { square([cornRad1, cornRad1]); >>> >>> translate([cornRad1, cornRad1]) >>> circle(r=cornRad1); >>> } >>> } >>> } >>> } >>> >>> // Rundad stäcka mellan t.ex. vägg och tak -bakkant >>> translate([wide2/2, 0, -height1/2]) >>> { rotate([90, 0, -90]) >>> { linear_extrude(wide2) >>> { difference() >>> { square([cornRad1, cornRad1]); >>> >>> translate([cornRad1, cornRad1]) >>> circle(r=cornRad1); >>> } >>> } >>> } >>> } >>> >>> // rundad stäcka mellan t.ex. vägg och tak -sida1 >>> translate([-wide2/2, 0, -height1/2]) >>> { rotate([90, 0, 0]) >>> { linear_extrude(10) >>> { difference() >>> { square([cornRad1, cornRad1]); >>> >>> translate([cornRad1, cornRad1]) >>> circle(r=cornRad1); >>> } >>> } >>> } >>> } >>> >>> // rundad stäcka mellan t.ex. vägg och tak -sida2 >>> translate([wide2/2, -10, -height1/2]) >>> { rotate([90, 0, 180]) >>> { linear_extrude(10) >>> { difference() >>> { square([cornRad1, cornRad1]); >>> >>> translate([cornRad1, cornRad1]) >>> circle(r=cornRad1); >>> } >>> } >>> } >>> } >>> } // Avsluta union = = = = = = = = = = = = = = = = = = = = >>> >>> >>> // Avrunda hörn1 bak >>> translate([-wide1/2+opt1*1.3, -deep1/2, cornRad1]) >>> { cylinder(h=height1+opt1, r=cornRad1, center=true); >>> translate([0, 0, -height1/2]) >>> sphere(r=cornRad1); >>> } >>> >>> // Avrunda hörn2 bak >>> translate([wide1/2-opt1*1.3, -deep1/2, cornRad1]) >>> { cylinder(h=height1+opt1, r=cornRad1, center=true); >>> translate([0, 0, -height1/2]) >>> sphere(r=cornRad1); >>> } >>> >>> // Plocka bort rundad fot bak samt det som sticker ut >>> translate([-wide1/2, 0, -height1/2-opt1]) >>> cube([wide1, diam1/2+cornRad1, height1+opt1*2], center=false); >>> } >>> } >>> } >>> } >>> >>> >>> >>> >>> >>> >>> >>> >>> module mainBox(box_l, box_w, box_h, spaceHold, round_r, thick, smooth, >>> pad) >>> { translate([box_l/2-thick-offset1/2, box_w/2-spaceHold, box_h/2]) >>> { >>> // To fix the corners cut the main cube with smaller cubes with >>> spheres removed >>> difference() >>> { cube([box_l, box_w, box_h], center = true); >>> >>> // Kant1 - liggande >>> translate([0, -box_w/2+round_r, box_h/2-round_r]) >>> { difference() >>> { translate([0,-round_r-pad,round_r+pad]) >>> cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center = >>> true); >>> rotate(a=[0,90,0]) >>> cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> // Kant2 - liggande >>> translate([0, box_w/2-round_r, box_h/2-round_r]) >>> { difference() >>> { translate([0,round_r+pad,round_r+pad]) >>> cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center = >>> true); >>> rotate(a=[0,90,0]) >>> cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> /* >>> // Kant3 - liggande >>> translate([0, -box_w/2+round_r, -box_h/2+round_r]) >>> { difference() >>> { translate([0,-round_r-pad,-round_r-pad]) >>> cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center = >>> true); >>> rotate(a=[0,90,0]) >>> cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> >>> // Kant4 - liggande >>> translate([0, box_w/2-round_r, -box_h/2+round_r]) >>> { difference() >>> { translate([0,round_r+pad,-round_r-pad]) >>> cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center = >>> true); >>> rotate(a=[0,90,0]) >>> cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> */ >>> // ---- >>> // Kant1 - stående >>> translate([-box_l/2+round_r, box_w/2-round_r, 0]) >>> { difference() >>> { translate([-round_r-pad,round_r+pad,0]) >>> cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center = >>> true); >>> cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> // Kant2 - stående >>> translate([box_l/2-round_r, box_w/2-round_r, 0]) >>> { difference() >>> { translate([round_r+pad,round_r+pad,0]) >>> cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center = >>> true); >>> cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> // Kant3 - stående >>> translate([-box_l/2+round_r, -box_w/2+round_r, 0]) >>> { difference() >>> { translate([-round_r-pad,-round_r-pad,0]) >>> cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center = >>> true); >>> cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> // Kant4 - stående >>> translate([box_l/2-round_r, -box_w/2+round_r, 0]) >>> { difference() >>> { translate([round_r+pad,-round_r-pad,0]) >>> cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center = >>> true); >>> cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> >>> // ---- >>> // Kant1 liggande (andra hållet) >>> translate([-box_l/2+round_r, 0, box_h/2-round_r]) >>> { difference() >>> { translate([-round_r-pad, 0, round_r+pad]) >>> cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center = >>> true); >>> rotate(a=[0,90,90]) >>> cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> // Kant2 liggande (andra hållet) >>> translate([box_l/2-round_r, 0, box_h/2-round_r]) >>> { difference() >>> { translate([round_r+pad, 0, round_r+pad]) >>> cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center = >>> true); >>> rotate(a=[0,90,90]) >>> cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> /* >>> // Kant3 liggande (andra hållet) >>> translate([-box_l/2+round_r, 0, -box_h/2+round_r]) >>> { difference() >>> { translate([-round_r-pad, 0, -round_r-pad]) >>> cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center = >>> true); >>> rotate(a=[0,90,90]) >>> cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> >>> // Kant4 liggande (andra hållet) >>> translate([box_l/2-round_r, 0, -box_h/2+round_r]) >>> { difference() >>> { translate([round_r+pad, 0, -round_r-pad]) >>> cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center = >>> true); >>> rotate(a=[0,90,90]) >>> cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> */ >>> // ---- >>> // Hörn1 (övre) >>> translate([box_l/2-round_r, box_w/2-round_r, box_h/2-round_r]) >>> { difference() >>> { translate([round_r+pad, round_r+pad, round_r+pad]) >>> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = >>> true); >>> sphere(round_r,$fn=smooth); >>> } >>> } >>> // Hörn2 (övre) >>> translate([-box_l/2+round_r, box_w/2-round_r, box_h/2-round_r]) >>> { difference() >>> { translate([-round_r-pad, round_r+pad, round_r+pad]) >>> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = >>> true); >>> sphere(round_r,$fn=smooth); >>> } >>> } >>> // Hörn3 (övre) >>> translate([box_l/2-round_r, -box_w/2+round_r, box_h/2-round_r]) >>> { difference() >>> { translate([round_r+pad, -round_r-pad, round_r+pad]) >>> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = >>> true); >>> sphere(round_r,$fn=smooth); >>> } >>> } >>> // Hörn4 (övre) >>> translate([-box_l/2+round_r, -box_w/2+round_r, box_h/2-round_r]) >>> { difference() >>> { translate([-round_r-pad, -round_r-pad, round_r+pad]) >>> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = >>> true); >>> sphere(round_r,$fn=smooth); >>> } >>> } >>> /* >>> // Hörn1 (undre) >>> translate([box_l/2-round_r, box_w/2-round_r, -box_h/2+round_r]) >>> { difference() >>> { translate([round_r+pad, round_r+pad, -round_r-pad]) >>> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = >>> true); >>> sphere(round_r,$fn=smooth); >>> } >>> } >>> // Hörn2 (undre) >>> translate([-box_l/2+round_r, box_w/2-round_r, -box_h/2+round_r]) >>> { difference() >>> { translate([-round_r-pad, round_r+pad, -round_r-pad]) >>> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = >>> true); >>> sphere(round_r,$fn=smooth); >>> } >>> } >>> // Hörn3 (undre) >>> translate([box_l/2-round_r, -box_w/2+round_r, -box_h/2+round_r]) >>> { difference() >>> { translate([round_r+pad, -round_r-pad, -round_r-pad]) >>> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = >>> true); >>> sphere(round_r,$fn=smooth); >>> } >>> } >>> // Hörn4 (undre) >>> translate([-box_l/2+round_r, -box_w/2+round_r, -box_h/2+round_r]) >>> { difference() >>> { translate([-round_r-pad, -round_r-pad, -round_r-pad]) >>> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = >>> true); >>> sphere(round_r,$fn=smooth); >>> } >>> } >>> */ >>> } >>> } >>> } >>> // >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> module cableHolder3(posX, posY, posZ, length, width, height, radius) >>> { // Skapa toppen över switchen >>> // mått på Switchen >>> fn = 96; // upplösning (endast bågen?) >>> heightHold = 10.5; >>> widthHold = 33.5; >>> depthHold = 23.5; >>> holdRadie = 1.5; // radie i hörnen >>> thick = 1.5; // tjocklek >>> >>> >>> translate([0,-thick,0]) >>> { >>> difference(0, 0, 0) >>> { hull() >>> { difference() >>> { translate([thick, 0, heightHold]) // vänster kant >>> { rotate([-90, 0, 0]) >>> { cylinder(h=depthHold, d=thick*2); >>> translate([0, 0, depthHold]) >>> sphere(d=thick*2); // längst fram >>> } >>> } >>> translate([0, -0.1, heightHold]) // plocka bort underdelen >>> rotate([-90, 0, 0]) >>> cube([thick*2, thick+.1, depthHold+thick+.1]); >>> } >>> >>> difference() >>> { translate([widthHold-thick, 0, heightHold]) // höger kant >>> { rotate([-90, 0, 0]) >>> { cylinder(h=depthHold, d=thick*2); >>> translate([0, 0, depthHold]) >>> sphere(d=thick*2); // längst fram >>> } >>> } >>> translate([widthHold-thick*2, -0.1, heightHold]) // plocka >>> bort underdelen >>> { rotate([-90, 0, 0]) >>> cube([thick*2, thick+.1, depthHold+thick+.1]); >>> } >>> } >>> } >>> >>> // öppna hålen för monteringsskruvarna uppe på plattan >>> translate([4, 13.5, 0]) >>> cylinder(h=15,d=3.2); >>> translate([4, 13.5, 17.3]) >>> sphere(r=6); >>> >>> translate([29.6, 13.5, 0]) >>> cylinder(h=15,d=3.2); >>> >>> translate([29.6, 13.5, 17.3]) >>> sphere(r=6); >>> } >>> >>> // halvbåge 1 bak >>> translate([thick, 0, heightHold/2+thick/2]) >>> rotate([0, 90, 180]) >>> rotate_extrude(angle = 180, convexity=20, $fn=64) >>> translate([heightHold/2-thick/2, 0, 0]) >>> circle(d=thick*2); >>> translate([thick, 0, heightHold]) >>> sphere(d=thick*2); // övre kulan >>> translate([thick, 0, thick]) >>> sphere(d=thick*2); // undre kulan >>> >>> >>> // halvbåge 2 bak >>> translate([widthHold-thick, 0, heightHold/2+thick/2]) >>> rotate([0, 90, 180]) >>> rotate_extrude(angle = 180, convexity=20, $fn=64) >>> translate([heightHold/2-thick/2, 0, 0]) >>> circle(d=thick*2); >>> translate([widthHold-thick, 0, heightHold]) >>> sphere(d=thick*2); // övre kulan >>> translate([widthHold-thick, 0, thick]) >>> sphere(d=thick*2); // undre kulan >>> >>> // en cylinder tvärsöver längst upp >>> translate([thick, 0, heightHold]) >>> { rotate([0,90,0]) >>> cylinder(h=widthHold-thick*2, r=thick); >>> } >>> } >>> >>> // Halvbågen (kabelhållaren) på baksidan switchen >>> translate([widthHold-thick, -thick, heightHold/2+thick/2]) >>> { rotate([0,90,180]) >>> linear_extrude(widthHold-thick*2) >>> arc(heightHold/2-thick/2, [0, 180], thick, fn); //radius, >>> angles, width, fn) >>> } >>> // en cylinder tvärsöver längst ned >>> translate([thick, -thick, thick]) >>> { rotate([0,90,0]) >>> cylinder(h=widthHold-thick*2, r=thick); >>> } >>> } >>> >>> >>> >>> module switch(posX=0, posY=0, posZ=0) >>> { buttRadie = 1.5; >>> height = 10.5; >>> width = 33.5; >>> depth = 23.5; >>> h1x = buttRadie; >>> h1y = buttRadie; >>> h2x = width-buttRadie; >>> h2y = buttRadie; >>> h3x = width-buttRadie; >>> h3y = depth-buttRadie; >>> h4x = buttRadie; >>> h4y = depth-buttRadie; >>> >>> translate([posX, posY, posZ]) >>> { difference() >>> { color("#F9F9F3") >>> // tryck-knappen >>> union() >>> { translate([width/2, depth+6-0.1, height/2]) >>> { rotate([90, 0, 0]) >>> { translate([0,0,6]) >>> circle(d=6.8); // skuggan runt knapp >>> cylinder(h=6, d=6); >>> sphere(d=6); >>> } >>> } >>> >>> hull() // Switchkropp >>> { translate([h1x, h1y]) >>> cylinder(h=height, r=1.5); >>> translate([h2x, h2y]) >>> cylinder(h=height, r=1.5); >>> translate([h3x, h3y]) >>> cylinder(h=height, r=1.5); >>> translate([h4x, h4y]) >>> cylinder(h=height, r=1.5); >>> } >>> } >>> >>> // Skruvhålen för switchen >>> hole( 4, 12, 0, "#FFD700", height); >>> hole(29.6, 12, 0, "#FFD700", height); >>> // hole( 4, 12, 0, "#FFD700", 50); >>> // hole(29.6, 12, 0, "#FFD700", 50); >>> // hål för kablar bak >>> color("gray") >>> { translate([9.5, 16, height/2]) >>> { rotate([90, 0, 0]) >>> cylinder(h=16.5, d=4); >>> } >>> translate([24.5, 16, height/2]) >>> { rotate([90, 0, 0]) >>> cylinder(h=16.5, d=4); >>> } >>> } >>> >>> // hål för kabelskruvar >>> color("white") >>> { translate([29.5, 17.1, height/2]) >>> { rotate([0, 90, 0]) >>> cylinder(h=4.1, d=4.5); >>> } >>> translate([-0.1, 17.1, height/2]) >>> { rotate([0, 90, 0]) >>> cylinder(h=4.1, d=4.5); >>> } >>> } >>> } >>> >>> // Kabelskruvar >>> cableScrew(3, 17, height/2, 90); >>> cableScrew(31, 17, height/2, -90); >>> >>> } >>> } >>> >>> // Skruven som håller fast kabeln i switchen >>> module cableScrew(posX=0, posY=0, posZ=0, angle=0) >>> { color("#FFD700") // mässing >>> translate([posX, posY, posZ]) >>> { rotate([0, 0, angle]) >>> { difference() >>> { // skruvskalle >>> translate([0, 0, 0]) >>> rotate([90, 0, 0]) >>> cylinder(h=2, d1=4, d2=3.5); >>> >>> // stjärnan i skruven >>> translate([0, 1.85, -.25]) >>> rotate([0, 0, 0]) >>> cylinder(h=0.5, d=5); >>> translate([-0.25, -.6, 2.25]) >>> rotate([0, 90, 0]) >>> cube([4.5, 2, 0.5]); >>> } >>> } >>> } >>> } >>> >>> >>> >>> // borrhål >>> module hole(posX=0, posY=0, posZ=0, colorName="yellow", height) >>> { diamHole1 = 3; >>> highHole1 = height; >>> diamHole2 = 6; >>> highHole2 = 2.5; >>> offs=0.1; >>> >>> color(colorName) >>> { >>> translate([posX, posY, posZ]) >>> { translate([0, 0, 0]) >>> cylinder(h=highHole1, d=diamHole1); >>> translate([0, 0, -offs]) >>> cylinder(h=highHole2, d=diamHole2); >>> translate([0, 0, height-highHole2+offs]) >>> cylinder(h=highHole2, d=diamHole2); >>> } >>> } >>> } >>> >>> module showCables() >>> { translate([-25,8,24]) >>> rotate([80,177,90]) >>> cable(10,10,0,"brun"); >>> translate([-43,8,15]) >>> rotate([90,180,90]) >>> cable(10,10,0,"blå"); >>> } >>> >>> >>> module cable(posX=0, posY=0, posZ=0, colorName="blå", radius=1.26, >>> width=0.62, thick=50, fn=24) >>> { // default 1.5mm2 >>> // radius = inner radie >>> // width = bredd/tjocklek på cirkeln (inte höjd) >>> // thick = höjd på cirken/ röret >>> // pin= >>> >>> colCupper = "#D7715A"; >>> colGreen = "#07DA63"; >>> colYellow = "#FFCC00"; >>> >>> if (colorName=="gröngul") >>> { translate([posX, posY, posZ]) >>> { color(colGreen) >>> linear_extrude(thick) >>> arc(radius, [0, 60], width, fn); >>> color(colYellow) >>> linear_extrude(thick) >>> arc(radius, [60, 180], width, fn); >>> color(colGreen) >>> linear_extrude(thick) >>> arc(radius, [180, 240], width, fn); >>> color(colYellow) >>> linear_extrude(thick) >>> arc(radius, [240, 360], width, fn); >>> >>> color(colCupper) >>> linear_extrude(10, center=true, convexity=10, $fn=100) >>> circle(d=1.24); >>> } >>> } >>> else // vanliga kablar 1.5mm2 >>> { >>> cableColor = colorName == "blå" ? "#1870D5" >>> : colorName == "brun" ? "#9C6137" >>> : colorName == "svart" ? "#000000" >>> : assert(false,"invalid color value"); // message if no >>> case worked >>> // : nodef >>> >>> translate([posX, posY, posZ]) >>> { //el kabel - ena änden rak - andra böjd >>> color(colCupper) //kopparstump tråd rakkabel >>> linear_extrude(10, center=true, convexity=10, $fn=100) >>> circle(d=1.24); >>> >>> color(cableColor) >>> { cylinder(h=thick, r=radius); >>> >>> translate([-radius*2, 0, thick]) // kabelböj >>> rotate([90, 0, 0]) >>> rotate_extrude(angle=90, convexity=20) >>> translate([2.5, 0, 0]) >>> circle(r=1.26); >>> >>> translate([-radius*2, 0, thick+radius*2]) >>> rotate([0, -90, 0]) >>> cylinder(h=5, r=radius); >>> } >>> translate([-10, 0, thick+radius*2]) >>> { rotate([0, -90, 0]) >>> { color(colCupper) >>> { linear_extrude(5, center=true, convexity=10, $fn=100) >>> circle(d=1.24); >>> } >>> } >>> } >>> } >>> } >>> } >>> >>> >>> // ====================================================================== >>> module arc(radius, angles, width = 1, fn = 24) { >>> difference() { >>> sector(radius + width, angles, fn); // ytterradie >>> sector(radius, angles, fn); // innerradie (plockar bort >>> invändigt >>> } >>> } >>> >>> module sector(radius, angles, fn = 24) { >>> r = radius / cos(180 / fn); >>> step = -360 / fn; >>> >>> points = concat([[0, 0]], >>> [for(a = [angles[0] : step : angles[1] - 360]) >>> [r * cos(a), r * sin(a)] >>> ], >>> [[r * cos(angles[1]), r * sin(angles[1])]] >>> ); >>> >>> difference() { >>> circle(radius, $fn = fn); >>> polygon(points); >>> } >>> } >>> = = END product 2 = = = = = = = = = = = = = = = = = = = = = = = = = = = >>> = = = >>> - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ >>> . - . _ . - . _ . - . _ . - . _ . - >>> >>> >>> Den fredag 6 maj 2022 14:06:55 CEST, Michael Möller < >>> private2michael@gmail.com> skrev: >>> >>> >>> >>> OpenSCAD code - is a description of your model in terms of a few >>> cylinder/cubes added and cut out >>> difference() { >>> cylinder(d=5,h=10); >>> translate([0,10,0]) cube([4,6,2]) ; >>> } >>> >>> STL file is a list of triangles which make the same outer shell as your >>> model. OpenSCAD makes this complicated transform from shapes to triangles. >>> solid OpenSCAD_Model >>> facet normal 0.92388 0.382682 0 >>> outer loop >>> vertex 2.5 0 3 >>> vertex 1.76777 1.76777 0 >>> vertex 1.76777 1.76777 3 >>> endloop >>> endfacet >>> facet normal 0.92388 0.382682 0 >>> outer loop >>> vertex 1.76777 1.76777 0 >>> vertex 2.5 0 3 >>> vertex 2.5 0 0 >>> endloop >>> endfacet >>> : (and so on for 300 lines) There is a binary/compressed version, but >>> the description is still just triangles. >>> >>> Gcode is what a 3D printer understands - it is the exact list of moves >>> that the head has to do with how much plastic to squeeze to trace the >>> outline of your shape, layer, by layer. It will optionally create moves for >>> filling the inside or support for overhangs. Such a program is called a >>> SLICER and the printer will come with one. >>> G92 E0 ; reset extrusion distance >>> G1 Z2.330 F6600.000 ; lift Z >>> G1 X-0.000 Y1.505 F6600.000 ; move to first perimeter point >>> G1 Z0.330 F6600.000 ; restore layer Z >>> G1 E3.00000 F2400.00000 ; unretract extruder 0 >>> G1 F1500 >>> G1 X-1.064 Y1.064 E3.09259 ; perimeter >>> G1 X-1.505 Y0.000 E3.18517 ; perimeter >>> : (many similar lines) >>> G1 X1.515 Y1.515 E4.65860 ; perimeter >>> G1 X0.055 Y2.120 E4.78559 ; perimeter >>> G1 X-0.000 Y2.143 F6600.000 ; move inwards before travel >>> G1 X0.384 Y0.843 F6600.000 ; move to first infill point >>> G1 F1500 >>> G1 X0.843 Y0.384 E4.84815 ; infill >>> G1 X1.097 Y-0.229 E4.91215 ; infill >>> : >>> (and so on for thousands of lines) >>> >>> The 3MF still basically deals in triangles, and attributes (surface, >>> infill material, picture, ticket info ... ) which probably are not used by >>> your slicer/printer. >>> >>> On Fri, 6 May 2022 at 12:37, Jan Öhman via Discuss < >>> discuss@lists.openscad.org> wrote: >>> >>> >>> >>> >>> ---------- Forwarded message ---------- >>> From: "Jan Öhman" <jan_ohman@yahoo.com> >>> To: OpenSCAD General Discussion <discuss@lists.openscad.org> >>> Cc: >>> Bcc: >>> Date: Fri, 6 May 2022 10:38:46 +0000 (UTC) >>> Subject: [OpenSCAD] Export to .STL / .3MF for later 3D-printing. >>> Hi! >>> >>> Thought to create some objects in openSCAD, to print later. >>> I do not have my own 3D printer (yet). >>> >>> One I talked to, wanted to get the drawings in .STL or .3MF. (I don't >>> know the difference). >>> >>> If I had my own printer, have I been able to print directly from >>> openSCAD? >>> (Without some export?) >>> >>> In the openSCAD, no errors or problems occur. >>> but >>> The drawings I tested to export from openSCAD have given one or another >>> error message. >>> One message .: >>> WARNING: Object may not be a valid 2-manifold and may need repair! >>> >>> Another message .: >>> WARNING: No top level geometry to render >>> >>> What to do? >>> >>> >>> >>> ---------- Forwarded message ---------- >>> From: "Jan Öhman via Discuss" <discuss@lists.openscad.org> >>> To: OpenSCAD General Discussion <discuss@lists.openscad.org> >>> Cc: "Jan Öhman" <jan_ohman@yahoo.com> >>> Bcc: >>> Date: Fri, 6 May 2022 10:38:46 +0000 (UTC) >>> Subject: [OpenSCAD] Export to .STL / .3MF for later 3D-printing. >>> _______________________________________________ >>> OpenSCAD mailing list >>> To unsubscribe send an email to discuss-leave@lists.openscad.org >>> >>> _______________________________________________ >>> OpenSCAD mailing list >>> To unsubscribe send an email to discuss-leave@lists.openscad.org >>> >>> >>> >>> ---------- Forwarded message ---------- >>> From: "Jan Öhman via Discuss" <discuss@lists.openscad.org> >>> To: OpenSCAD general discussion <discuss@lists.openscad.org> >>> Cc: "Jan Öhman" <jan_ohman@yahoo.com> >>> Bcc: >>> Date: Sat, 7 May 2022 11:04:31 +0000 (UTC) >>> Subject: [OpenSCAD] Re: Export to .STL / .3MF for later 3D-printing. >>> _______________________________________________ >>> OpenSCAD mailing list >>> To unsubscribe send an email to discuss-leave@lists.openscad.org >>> >> _______________________________________________ >> OpenSCAD mailing list >> To unsubscribe send an email to discuss-leave@lists.openscad.org >> > _______________________________________________ > OpenSCAD mailing list > To unsubscribe send an email to discuss-leave@lists.openscad.org >
MM
Michael Möller
Sat, May 7, 2022 5:51 PM

Indeed you did Adrian, I was curious what that long code was going to
produce.

Michael, fra mobilen

lør. 7. maj 2022 19.06 skrev Adrian Mariano avm4@cornell.edu:

I already gave a full explanation of what's wrong and how to fix the
first program.  It has a 2d polygon (easily found as there is one lone
polygon call) that needs to be removed or linear_extruded as
appropriate.  And it makes use of path_sweep in a manner that produces
a self-intersecting polyhedron.  This issue is explained in the manual
page for path_sweep.  This can be fixed either by switching to
path_extrude2d() or by changing the corner radius to eliminate the
self-intersections.  Or changing to a profile that can actually be
rounded at the desired radius.

https://github.com/revarbat/BOSL2/wiki/skin.scad#functionmodule-path_sweep

On Sat, May 7, 2022 at 12:57 PM Michael Möller
private2michael@gmail.com wrote:

Jan Öhman wrote it failed in Render/F6, but works in Preview/F5 - in so

many words. I tried and got the following

First model

F6 Error: WARNING: Ignoring 2D child object for 3D operation in file ,

line 53

ERROR: CGAL error in CGALUtils::applyUnion3D: CGAL ERROR: assertion

violation! Expr: G.mark(v1,0)==G.mark(v2,0)&& G.mark(v1,1)==G.mark(v2,1)
File:
/mxe/usr/x86_64-w64-mingw32.static.posix/include/CGAL/Nef_S2/SM_overlayer.h
Line: 303

Which I think is pretty selfexplantory: Passed a 2D shape to something

that expected a 3D shape - but you have to read the whole code to find it
... which I think Jan is more qualified to do :-)

2nd part

... which is one of those where zooming or rotating the model in preview

takes >5 second

And I didn't bother waiting for the F6 error ... ;-)

Of course, we do not know if the above shapes I got are the ones that

Jan wants - there are also sections of code commented out.

(From the comments it seems these are to be nice and alternative covers

for wall outlet/switches.)

On Sat, 7 May 2022 at 18:26, Sanjeev Prabhakar sprabhakar2006@gmail.com

wrote:

Quite a long code.
Can you paste a picture of what you are trying to draw.
Regards
Sanjeev

On Sat, 7 May 2022, 16:31 Jan Öhman via Discuss, <

---------- Forwarded message ----------
From: "Jan Öhman" jan_ohman@yahoo.com
To: OpenSCAD general discussion discuss@lists.openscad.org
Cc:
Bcc:
Date: Sat, 7 May 2022 11:04:31 +0000 (UTC)
Subject: [OpenSCAD] Re: Export to .STL / .3MF for later 3D-printing.
Thank you!
Begins to understand how it works. (It was not easy...)

but my solution was not good ...

Here are 2 files that do not work to render (F6)

= = product 1= = = = = = = = = = = = = = = = = = = = = = = = = = = = =

= = =

  • . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _

. - . _ . - . _ . - . _ . - . _ . -

include <BOSL2/std.scad>
fn = 150;

placering="left";
// placering="right"

box(0, 0, 0, placering, "#C0C0C0", fn); // (X, Y, Z, left/right,

colorName)

// Monteringsplattan
// mountingPlate(0, 0, 0, placering);

// LED belysning
// LEDlampa(0, 0, 0, placering);

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - - - m o d u l e r - - - - - - - - - - - - - - - - - -

//

---================

//======  box


---===

module box(posX=0, posY=0, posZ=0, mountSide="left",

colorName="#00FF00", fn=24)

{
side = mountSide == "left" ? 0
: mountSide == "right" ? 1
: assert(false,"invalid moutSide value");  // message if no

case worked

color(colorName)
translate([posX, posY, posZ])
mirror([side, 0, 0])
difference()
{
union()
{
// Skapa konturer på bottenplattan - x, y, r, angles, [grader],

början

// Rotation medurs - vänster lamphållare (bakant saknas)
points1 = circSect( 140,  0,  0, [0, 0], "right",  1, fn);  // böj

nere till höger

points2 = circSect(  60,  5,  5, [0, 5], "bottom",  1, fn); //

brytpunkt längst ned

points3 = circSect(  10, 13,  10, [0, 90], "bottom", 1, fn); // böj

nere till vänster

points4 = circSect(  5, 80,  5, [0, 90], "left",  1, fn); // böj

uppe till vänster

points5 = circSect( 140, 80,  5, [0, 1], "top",  1, fn);  // böj

uppe till höger

edge = concat(points1, points2, points3, points4, points5);
path = path3d(reverse(edge));
section = wall();
path_sweep( section, path, closed=false);

// Skapa bakkant lite högre och smalare i topp
bottom1 = concat(points5, points1);
polygon(bottom1);
path1 = path3d(reverse(bottom1));
section1 = wall1(); // lite högre bakvägg wall(b=4, f=8, h=15, t=3.5)
path_sweep( section1, path1, closed=false);

// fyll upp bottenplattansbaksida
linear_extrude(4) // Bottomplate - fill up
polygon(concat(points1, points2, points3, points4, points5));

// skapa Utskjutande del under (tänk spegelvänt)
pt1 = circSect(  19.5, 85, 0, [0, 50], "top", 1, fn);  // Uppe till

höger - moturs

pt2 = circSect(  39, 1.35,  .1, [-5, 90], "right", 1, fn);  // Nere

till höger

pt3 = circSect(  10, 13.05,  10, [0, 90], "bottom", 1, fn);  // Nere

till vänster

pt4 = circSect(  5, 80, 5, [0, 90], "left",  1, fn);  // Uppe till

vänster

translate([0, 0, -2])
linear_extrude(2.1)
polygon(concat(pt1, pt2, pt3, pt4));

// utgången för kabeln på baksidan (diam 10mm) - pekar lite nedåt
cableExit(65, 35, 0, 15, "cyan", $fn=100);
}

// skapa ett borrhål i bakkant
translate([132,60,15])
{ rotate([0, 90, 0])
{ cylinder(h=10, d=2, $fn=100);
cylinder(h=4, d=9, $fn=100);
}
}

// skapa en borrmarkering i bakkant
translate([139,25,15])
{ rotate([0, 90, 0])
cylinder(h=2, d1=1, d2=2.5, $fn=100);
}

// ingravera årtalet på baksidan
translate([10, 80, -0.5])
{ mirror([side, 0, 0])
{ rotate([0, 180, 0])
{ linear_extrude(3)
text("2022", size=12, direction="ttb", font="Comic Sans

MS:style=Bold");

   }
 }

}

/*
// Markera skruvhål på bakkant
borr=3;
bredd=140;
hojd=8;
avstNed=20;
translate([bredd, avstNed, hojd])
{ rotate([0,90,0])
cylinder(h=2, d1=0.5, d2=borr, center=true, $fn=50);
}
*/

// borrhål
mountingHole(20, 36, 0, 7, 90.1, 15); // posX, posY, posZ, diam,

dist, deep, $fn=50

}
}
//========  Slut box

---=============================

//

---================

//======  cableExit

---==============================

module cableExit(posX, posY, posZ, angle, colorName)
{ diamHole = 7;
diamHolder = 9.8;
hight = 12;
topRad = diamHolder/2;
topDiam = diamHolder/2-topRad/2;
bowRad = 7;
offs1 = 0.1;

color(colorName)
translate([posX, posY, posZ])
{  rotate([180, 0, 180-angle])
{ difference()
{ hull()
{ cylinder(h=hight, d=diamHolder, center=false);
translate([0, 0, hight])        // rundad topp
rotate_extrude(angle=360, convexity=2)
translate([topDiam, 0, 0])  // yttre diam topp
circle(d=topRad);        // radie topp
}

     inpHight  =  2;   // ett värde som styr var utgångshålet hamnar
     translate([0, 0, -offs1])
       cylinder(h=inpHight+offs1, d=diamHole, center=false); //

Bottenhål

     translate([-bowRad, 0, inpHight-offs1]) // böjen
     { rotate([90, 0, 0])
         rotate_extrude(angle=90, convexity=10)
           translate([bowRad, 0, 0]) // ställ in radien på

kabelböjen

             circle(d=diamHole);
     }
   }
 }

}
}
//======  slut cableExit

---=========================

//

---================

//======  mountingHole

---===========================

module mountingHole(posX=0, posY=0, posZ=0, diam=7, dist=90, deep=5,

$fn=50)

{ // diam =  6;  // [mm]
// dist = 90;  // [mm]
// deep =  12;  // [mm]

translate([posX, posY, posZ])
{ translate([0, 0, -10])
cylinder(h=deep, d=diam);  // fästhål 1

 //cableHold1(dist/2, 0, .2, "#D5D5D5");  // Kabelgenomföring
 translate([dist/2, 0, 0])
 {  hull()
   { cylinder(h=5, d=6);  // fästhål 1
     sphere(d=7.5);
   }
 }

 translate([dist, 0, -10])
   cylinder(h=deep, d=diam); // fästhål 2

}
}
//======  slut mountingHole

---======================

//

---================

//======  LEDlampa

---===============================

// module LEDlampa(posX=8, posY=10, posZ=0)
module LEDlampa(posX=0, posY=0, posZ=0, mountSide="left")
{ side = mountSide == "left" ? 0
: mountSide == "right" ? 1
: assert(false,"invalid moutSide value");  // message if no

case worked

xpos = mountSide == "left" ? 121
: mountSide == "right" ? -10
: assert(false,"invalid moutSide value");  // message if no

case worked

/*
ypos = mountSide == "left" ? 10.5
: mountSide == "right" ? 10.5
: assert(false,"invalid moutSide value");  // message if no

case worked

zpos = mountSide == "left" ? 5
: mountSide == "right" ? 5
: assert(false,"invalid moutSide value");  // message if no

case worked

*/
// echo(xpos,ypos,zpos);
// translate([xpos, ypos, zpos])
translate([xpos, 10.5, 5])
mirror([1, 0, 0])
translate([posX, posY, posZ])
{ LEDbottom();
translate([0, 0, 11])
LEDglas();
}
}
//======  Slut LEDlampa

---==========================

//

---================

//======  LEDglas

---================================

module LEDglas()
{
// Variabler botten
length  = 111;  // längd mm
wideMid = 50.5;  // bredd i mitten mm

cornRad = 10;    // Radien i alla hörn
wideCorn = 48;  // Bredd i kanterna

diamHole = 6;    // håldiameter i mm

colorBot = "gray";
colorTop = "orange";

// Variabler top
cornHigh = 5;  //Höjd i ändarna
midHigh  = 8;
highTop = cornHigh + 1;  // höjd mm

p1tx = 10;      // the start value
p1ty = 49.25;
p2tx = 55.5;    // the middle value
p2ty = 50.5;
p3tx = 101;    // the end value
p3ty = p1ty;

p4tx = 101;    // the start value
p4ty = 1.25;
p5tx = 55.5;    // the middle value
p5ty = 0.0;
p6tx = 10;      // the end value
p6ty = p4ty;
// Ger ovalt glas
points1 = 3points_arc([p1tx,p1ty], [p2tx,p2ty], [p3tx,p3ty], fn=100);
points2 = 3points_arc([p4tx,p4ty], [p5tx,p5ty], [p6tx,p6ty], fn=100);

color("orange")
linear_extrude(height=cornHigh+.1)
difference()
{ polygon(concat(points1, points2));

 translate([length-10 , wideMid / 2, -.2])
   circle(d=6);
 translate([10 , wideMid / 2, -.2])
   circle(d=6);

}

// Top
color(colorTop)
difference()
{ hull()
{ // hörn1
translate([cornRad, wideMid - ((wideMid-wideCorn)/2) - cornRad,

0]) // [10,39]

     cylinder(h=cornHigh, d=cornRad*2, center=false);
   // hörn2
   translate([cornRad, cornRad + ((wideMid-wideCorn)/2), 0])
// [10,12]
     cylinder(h=cornHigh, d=cornRad*2, center=false);
   // hörn3
   translate([length - cornRad, wideMid - ((wideMid-wideCorn)/2) -

cornRad, 0]) // [101 ,39]

     cylinder(h=cornHigh, d=cornRad*2, center=false);
   // hörn4
   translate([length - cornRad, cornRad + ((wideMid-wideCorn)/2),

0])  //

     cylinder(h=cornHigh, d=cornRad*2, center=false);
 }

 union()
 { // Monteringshål 1 & 2
   translate([length-10 , wideMid / 2, -.2])
     cylinder(d=diamHole, h=highTop+.5, center=false);
   translate([10 , wideMid / 2, -.2])
     cylinder(d=diamHole, h=highTop+.5, center=false);
 }

}
}
//========  Slut LEDglas

---=========================

//

---================

//======  LEDbottom

---==============================

module LEDbottom()
{ p1x = 10;      // the start value
p1y = 49.25;
p2x = 55.5;    // the middle value
p2y = 50.5;
p3x = 101;    // the end value
p3y = p1y;

p4x = 101;    // the start value
p4y = 1.25;
p5x = 55.5;    // the middle value
p5y = 0.0;
p6x = 10;      // the end value
p6y = p4y;

// Variabler botten för borrhålen
length  = 111;  // längd mm
wideMid = 50.5;  // bredd i mitten mm
diamHole = 6;    // håldiameter i mm
cornHigh = 5;  //Höjd i ändarna
midHigh  = 8;
highTop = cornHigh + 1;  // höjd mm
// offs1 = 0.1;
heightHole = 15; //mm
height = 11; //mm

points1 = circSect(  10, 11.25,  10, [0, 90], "bottom", 1, fn); //

Hörn nere till vänster

points2 = circSect(  10, 39.25,  10, [0, 90], "left",  1, fn); //

Hörn uppe till vänster

points3 = 3points_arc([p1x,p1y], [p2x,p2y], [p3x,p3y], fn);
points4 = circSect( 101, 39.25,  10, [0, 90], "top",    1, fn); //

Hörn uppe till höger

points5 = circSect( 101, 11.25,  10, [0, 90], "right",  1, fn); //

Hörn nere till höger

points6 = 3points_arc([p4x,p4y], [p5x,p5y], [p6x,p6y], fn);

// The base plate for the LED lamp

difference()
{ color("gray", 0.5)
linear_extrude(height=height)
polygon(concat(points1, points2, points3, points4, points5,

points6));

// union()
 { // Monteringshål 1 & 2
   translate([length-10 , wideMid / 2, -.2])
     cylinder(d=diamHole, h=heightHole, center=false);
   translate([10 , wideMid / 2, -.2])
     cylinder(d=diamHole, h=heightHole, center=false);
 }

}
}
//========  Slut LEDbottom

---=======================

//

---================

//======  circleSect

---=============================

// Create rounded corners 2D
// https://openhome.cc/eGossip/OpenSCAD/SectorArc.html
// ange .:  x, y, radien,
//          [från, till] vinkel,
//          var vinkeln startar, (left, bottom, right, top)
//          vilken rotation (-1=medsol, 1=motsols)
function circSect(x=0, y=0, radius=10, angles=[0,270],

startRef="bottom", rotate=1, fn=24)  =

 let(
     startAngel  = (startRef == "left")   ?   0
                 : (startRef == "bottom") ?  90
                 : (startRef == "right")  ? 180
                 : (startRef == "top")    ? 270
                 : startRef,  // valfri vinkel
               // : assert(false,"invalid moutSide value");  //

Error message if no case worked

               //: undef,
     r = radius,
     //r = radius / cos(180 / fn),
     step = 360 / fn,
     // points = [[x, y],
     points = [
         for(a = [angles[0]-startAngel : step :

angles[1]-startAngel])

             [-rotate * r * cos(a)+x, r * sin(a)+y]]
 ) points;

//========  Slut circleSect

---======================

//

---================

//======  3points_arc

---============================

// Create an arc with three points 2D
function 3points_arc(p0, p1, p2, fn=10) =
// an alternative expression for D
// D  = 2 * ( (p1-p0).x * (p2-p0).y - (p1-p0).y * (p2-p0).x )
let( D  = 2 * cross(p1-p0, (p2-p0)) )
assert( abs(D)>1e-9, "The 3 points should not be collinear." )
let(
Ux    = ( (p2-p0).y*(p1-p0)(p1-p0) - (p1-p0).y(p2-p0)*(p2-p0)

)/D,

   Uy     = ( (p1-p0).x*(p2-p0)*(p2-p0) - (p2-p0).x*(p1-p0)*(p1-p0)

)/D,

   radius = norm([Ux,Uy]),
   center = [Ux,Uy] + p0,
   ang0   = atan2( (p0-center).y, (p0-center).x ),
   ang2   = atan2( (p2-center).y, (p2-center).x ),
   // the points are in a cw winding iff D<0
   // the angular difference between vectors p2-center and p0-center
   // measured from p0-center; dang is positive iff D is negative
   dang   = D<0  ? ang2<ang0 ? ang2-ang0 : ang2-ang0-360
                 : ang2>ang0 ? ang2-ang0 : ang2-ang0+360

)
[ for(i=[0:fn-1])
let( ang = ang0 + idang/(fn-1) )
center + radius
[cos(ang),sin(ang)] ];
//========  Slut 3points_arc

---=====================

//

---================

//======  Wall som ett "L"

---=======================

// Normal vägghöjd
function wall() =
let(
b =  4,    // botten - tjocklek
f =  8,    // Foten
h = 15,    // Höjd
t =  3.5,  // Top
x = (b+(t/2) - (h - ( (-h / (f-t)) *t) )) / (-h / (f-t))
)
let(
points = [[0,0], [f,0], [t,h], [0,h]] ,
top = move([t/2, h, 0], circle(d=t, $fn=20)),
sqr = square([10, b]),
diff =
difference([
move([x, b], square([t/2, t/2])),
move([x+(t/2), b+(t/2), 0], circle(d = t, $fn=20) )

])

     )
 union([points, top, sqr, diff]);

//========  Slut Wall

---============================

//

---================

//======  Wall1 som ett "L"

---======================

// En högre vägg
function wall1() =
let(
b =  4,    // botten - tjocklek
f =  7,    // Foten
h = 25,    // Höjd
t =  3,  // Top
x = (b+(t/2) - (h - ((-h / (f-t)) *t))) / (-h / (f-t))
)
let(
points = [[0,0], [f,0], [t,h], [0,h]] ,
top = move([t/2, h, 0], circle(d=t, $fn=20)),
sqr = square([10, b]),
diff =
difference([
move([x, b], square([t/2, t/2])),
move([x+(t/2), b+(t/2), 0], circle(d = t, $fn=20) ) ])
)
union([points, top, sqr, diff]);
//========  Slut Wall1

---===========================

//

---================

//======  Plåt på släp

---===========================

module mountingPlate(posX=0, posY=0, posZ=0, mountSide="left",

colorName="#C0C0C0", $fn=50)

{ // Hörnpositionerna
posX1 = 120;
posY1 = 0;
posX2 = posX1;
posY2 = -200;
posX3 = 120 - 75;
posY3 = -200;
posX4 = 0;
posY4 = 0;
thick=2;  // tjocklek

side = mountSide == "left" ? 0
: mountSide == "right" ? 1
: assert(false,"invalid moutSide value");  // message if no

case worked

xpos = mountSide == "left" ? 20
: mountSide == "right" ? -20
: assert(false,"invalid moutSide value");  // message if no

case worked

/*
ypos = mountSide == "left" ? 85
: mountSide == "right" ? 85
: assert(false,"invalid moutSide value");  // message if no

case worked

zpos = mountSide == "left" ? -thick
: mountSide == "right" ? -thick
: assert(false,"invalid moutSide value");  // message if no

case worked

*/
color(colorName)
{  translate([posX, posY, posZ])
translate([xpos, 85, -thick])
{ mirror([side, 0, 0])
{ linear_extrude(thick)
hull()
{ translate([posX1, posY1, 0])
square(0.1, center = true);
translate([posX2, posY2, 0])
square(0.1, center = true);
translate([posX3, posY3, 0])
square(0.1, center = true);
translate([posX4, posY4, 0])
square(0.1, center = true);
}
}
}
}
}
= = END product 1= = = = = = = = = = = = = = = = = = = = = = = = = = =

= = =

  • . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _

. - . _ . - . _ . - . _ . - . _ . -

= = product 2 = = = = = = = = = = = = = = = = = = = = = = = = = = = =

= = = =

  • . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _

. - . _ . - . _ . - . _ . - . _ . -

$fn=100;
//$fn=15;

//switch();
//cableHolder4(); //Switchboxen

// cableHolder3(0, 0, 0, 33.5, 23.5, 1.5, 2);
// showCables();

module cableHolder4(fn=24);
{ // idé från
// - https://www.thingiverse.com/thing:6400/files
// -

// mått på Switch
heightHold = 10.5;
widthHold = 33.5;
depthHold = 23.5;
spaceHold = 10.0; // utrymmet bakom switch
holdRadie = 2;  // radie i hörnen
thick = 2;
offset1=0.5;  // öka toleransen

// innermått
holeW = widthHold + offset1;
holeH = heightHold + offset1;
holeD = depthHold + spaceHold+offset1;

// yttermått
pad = 0.1;                  // Padding to maintain manifold
box_l = holeW + thick*2;  // Bredden på switchen
box_w = holeD + thick;            // Djupet på switchen
box_h = holeH + thick; // Height
round_r = holdRadie;        // Radius of round
smooth = 45;                // Number of facets of rounding cylinder

difference()
{ union() // Detta utförs i två steg.
{ difference()  // utför fasningar och kabelmarkeringar
{ mainBox(box_l, box_w, box_h, spaceHold+thick, round_r, thick,

smooth, pad);

     // fasning vänster (underkant)
     translate([box_l/2-0.85, spaceHold-4.3, thick-offset1])  //

sidled, fram/bak , upp/ned

       rotate([0,180,45])
         cylinder(h=thick, d1=holeW*1.414-thick-thick,

d2=holeW*1.414, $fn=4);

     // fasning höger (underkant)
     translate([box_l/2-3.65, spaceHold-4.3, thick-offset1]) //

sidled, fram/bak , upp/ned

       rotate([0,180,45])
         cylinder(h=thick, d1=holeW*1.414-thick-thick,

d2=holeW*1.414, $fn=4);

     // kabelgenomföringar
     rotate([90, 180, 90]) // Markering ena sidan (vänster under)
       ovalCableHole(spaceHold/2-offset1, -1.75, -1.2);

     rotate([90, 180, 180]) // Markering bakkant (vänster under)
       ovalCableHole(spaceHold/2-1.55, -1.75, -spaceHold-0.85);

     rotate([90, 180, 180]) // Markering bakkant (höger under)
       ovalCableHole(widthHold-spaceHold/2-offset1, -1.75,

-spaceHold-0.85);

     rotate([90, -180, 90])  // Markering ena sidan (höger under)
       ovalCableHole(3.75, -1.75, widthHold-0.1);
   }
 } // Slut union - kropp

 translate([-offset1/2, -spaceHold+pad, -pad]) // hålet där

switchen ska placeras

   cube([holeW, holeD+pad, holeH+pad], center=false);

   translate([4, 12, 0])
     cylinder(h=15,d=3.2);
   translate([4, 12, 17.7])
     sphere(r=6);

   translate([29.6, 12, 0])
     cylinder(h=15,d=3.2);
   translate([29.6, 12, 17.7])
     sphere(r=6);

   /*  // Hål genom lock bak - om så önskas
   translate([box_l/2-thick, -6, offset1/2])
     cylinder(h=box_h+thick*4+offset1, d=3.2, $fn=100);  // hål

genom lock bak

   translate([box_l/2-thick, -6, 17.7])
     sphere(r=6);    // kona hålet bak
   */

} // Slut difference() - box

 difference()
 { union()
   { translate([29.6, 12, heightHold-offset1*2])
       cylinder(h=2,d=5.2);        // Stödhylsa för Switchskruv1
     translate([4, 12, heightHold-offset1*2])
       cylinder(h=2,d=5.2);        // Stödhylsa för Switchskruv2

     translate([holeW/2, -spaceHold+thick+1, holeH/2])
       rotate([180,0,0])
          backHole();
   } // union - slut

   translate([4, 12, 0])     //  Hålen i stödhylsorna
     cylinder(h=15,d=3.2);

   translate([29.6, 12, 0])  //  Hålen i stödhylsorna
     cylinder(h=15,d=3.2);

   translate([box_l/2-thick, -6, -offset1])  // hål i stödhylsa bak
     cylinder(h=box_h+offset1, d=3.2, $fn=100);

   // Sänk stödhylsan
   translate([ widthHold/2-7, -spaceHold-offset1, -thick+offset1])

// hål i stödhylsa bak

       cube([15, 8, 3]);


   // kabelmarkering
   // translate([0, 0, 0])  // hål i stödhylsa bak


   }

/*
translate([4, 12, 0])
#cylinder(h=15,d=3.2);
//translate([4, 13.5, 17.3])
//#sphere(r=6);

   translate([29.6, 12, 0])
     #cylinder(h=15,d=3.2);
   //translate([29.6, 13.5, 17.3])
     //#sphere(r=6);

*/

}

module backHole()
{ wallH = 10.5;

wide1  = 12; // endast runt cylindern
wide2  = 35; // hela väggen
deep1    =  4;
height1  = 10.5;
cornRad1  =  2;
diam1 = 8;
opt1 = 0.1;

//rundadFot();

// Rundad stäcka mellan t.ex. vägg och tak -bakkant
translate([wide2/2, diam1/2-cornRad1/2, -height1/2])
{ rotate([90, 0, -90])
{ linear_extrude(wide2)
{ difference()
{ square([cornRad1, cornRad1]);

       translate([cornRad1, cornRad1])
         circle(r=cornRad1);
     }
   }
 }

}

// rundad stäcka1 (vänster) mellan t.ex. vägg och tak
translate([-wide2/2+0.15, deep1/2+cornRad1/2, -height1/2])
rotate([90, 0, 0])
{ linear_extrude(spaceHold)
{ difference()
{ square([cornRad1, cornRad1]);

     translate([cornRad1, cornRad1])
     circle(r=cornRad1);
   }
 }

}

// rundad stäcka2 mellan t.ex. vägg och tak
translate([wide2/2-0.65, deep1/2+cornRad1/2, -height1/2])
rotate([0, -90, 90])
{ linear_extrude(spaceHold)
{ difference()
{ square([cornRad1, cornRad1]);

     translate([cornRad1, cornRad1])
       circle(r=cornRad1);
   }
 }

}

// Skapa stödfot - bak
difference()
{ union()
{ //själva cylindern
translate([0, 1, 0])
{ cylinder(h=height1, d=diam1, center=true);
translate([0, diam1/2, 0])
cube([diam1,diam1-1,height1], center=true);
}

   // Rundad fot under cylinder ovan
   translate([0, 1, -height1/2])
   { rotate_extrude()
     { translate([diam1/2, 0, 0])
       { difference()
         { square([cornRad1, cornRad1]);

           translate([cornRad1, cornRad1])
             circle(r=cornRad1);
         }
       }
     }
   }

   // Rundad rakstäcka1 - cylinderfot - mellan t.ex. vägg och tak
   translate([diam1/2, diam1, -height1/2])
   { rotate([90, 0, 0])
     { linear_extrude(diam1)
       { difference()
         { square([cornRad1, cornRad1]);

           translate([cornRad1, cornRad1])
             circle(r=cornRad1);
         }
       }
     }
   }

   // Rundad rakstäcka2 - cylinderfot - mellan t.ex. vägg och tak
   translate([-diam1/2, diam1, -height1/2])
   { rotate([0, -90, 90])
     { linear_extrude(diam1)
       { difference()
         { square([cornRad1, cornRad1]);

           translate([cornRad1, cornRad1])
             circle(r=cornRad1);
         }
       }
     }
   }

   //väggen bakom cylindern som ska rundas
   translate([0, diam1/2-cornRad1, 0])
     cube([wide1, cornRad1, height1], center=true);

 }


 // Avrunda hörn1 bak
 translate([-wide1/2, cornRad1/2, cornRad1])
 { hull()
   { cylinder(h=height1+opt1, r=cornRad1, center=true);
     {  translate([0, 0, -height1/2])
         sphere(r=cornRad1);
     }
   }
 }

 // Avrunda hörn2 bak
 translate([wide1/2, cornRad1/2, cornRad1])
 { hull()
   { cylinder(h=height1+opt1, r=cornRad1, center=true);
     {  translate([0, 0, -height1/2])
         sphere(r=cornRad1);
     }
   }
 }


 // Plocka bort rundad fot bak samt det som sticker ut
 translate([-wide1/2, diam1/2-cornRad1/2, -height1/2-opt1])
   cube([wide1, diam1/2+cornRad1, height1+opt1*2], center=false);

}
}

module ovalCableHole(posX, posY, posZ)
{ // Hål 5.5 x 3.5 mm
pan = 0.1;
cableHi = 1.5;

translate([posX, posY, posZ])
{ color("white")
{ translate([0, 0, -pan])
{ cylinder(h=cableHi, d=3.5);
//#translate([0, 0, 0]) cylinder(h=10, d=1);
//translate([0, 0, -1]) cylinder(h=1, d1=0, d2=1);
//translate([0, 0, 0]) sphere(d=1); // Inre kulan
//translate([0, 0, 1.5]) sphere(d=1); // Inre kulan

     translate([0, 0, -1]) sphere(d=0.8); // yttre kulan
     translate([0, 0, 2.5]) sphere(d=0.8); // yttre kulan

   }
   translate([2, 0, -pan])
   { cylinder(h=cableHi, d=3.5);
     // #translate([0, 0, -cableHi*2]) cylinder(h=10, d=0.5);
     //translate([0, 0, 0]) sphere(d=1); // Inre kulan
     //translate([0, 0, 1.5]) sphere(d=1); // Inre kulan

     translate([0, 0, -1]) sphere(d=0.8); // yttre kulan
     translate([0, 0, 2.5]) sphere(d=0.8); // yttre kulan

   }
   translate([-3.5/2, 0, -pan])
     cube([5.5, 3.5/2, cableHi]);
   translate([-0.25, -1.74, -pan])
     cube([2.5, 1.75, cableHi]);
 }

}
}

module rundadFot()
{
// specifika värden för skruvdistansen bak
wallH = 10.5;

wide1  = 12; // endast runt cylindern
wide2  = 34; // hela väggen
deep1    =  4;
height1  = 10;
cornRad1  =  2;
diam1 = 8;
opt1 = 0.1;

color("magenta")
{ translate([0, 0, wallH])
{ difference()
{ union()
{ // Bakgavel
translate([wide2/2, opt1, height1/2])
{ rotate([90, 180, 0])
cube([wide2, height1, opt1]);
}

       // Golv
       translate([wide2/2, -height1+opt1, -height1/2])
         rotate([0, 180, 0])
           cube([wide2, height1, opt1]);

       //väggen bakom cylindern som kan rundas
       translate([0, -cornRad1/2, 0])
         cube([wide1, cornRad1, height1], center=true);

       //själva cylindern
       translate([0, -cornRad1/2, 0])
         cylinder(h=height1, d=diam1, center=true);

       // Rundad fot under cylinder ovan
       translate([0, -cornRad1/2, -height1/2])
       { rotate_extrude()
         { translate([diam1/2, 0, 0])
           { difference()
             { square([cornRad1, cornRad1]);

               translate([cornRad1, cornRad1])
                 circle(r=cornRad1);
             }
           }
         }
       }

       // Rundad stäcka mellan t.ex. vägg och tak -bakkant
       translate([wide2/2, 0, -height1/2])
       { rotate([90, 0, -90])
         { linear_extrude(wide2)
           { difference()
             { square([cornRad1, cornRad1]);

               translate([cornRad1, cornRad1])
                 circle(r=cornRad1);
             }
           }
         }
       }

       // rundad stäcka mellan t.ex. vägg och tak -sida1
       translate([-wide2/2, 0, -height1/2])
       { rotate([90, 0, 0])
         { linear_extrude(10)
           { difference()
             { square([cornRad1, cornRad1]);

               translate([cornRad1, cornRad1])
               circle(r=cornRad1);
             }
           }
         }
       }

       // rundad stäcka mellan t.ex. vägg och tak -sida2
       translate([wide2/2, -10, -height1/2])
       { rotate([90, 0, 180])
         { linear_extrude(10)
           { difference()
             { square([cornRad1, cornRad1]);

               translate([cornRad1, cornRad1])
               circle(r=cornRad1);
             }
           }
         }
       }
     } // Avsluta union = = = = = = = = = = = = = = = = = = = =


     // Avrunda hörn1 bak
     translate([-wide1/2+opt1*1.3, -deep1/2, cornRad1])
     { cylinder(h=height1+opt1, r=cornRad1, center=true);
         translate([0, 0, -height1/2])
           sphere(r=cornRad1);
     }

     // Avrunda hörn2 bak
     translate([wide1/2-opt1*1.3, -deep1/2, cornRad1])
     { cylinder(h=height1+opt1, r=cornRad1, center=true);
         translate([0, 0, -height1/2])
           sphere(r=cornRad1);
     }

     // Plocka bort rundad fot bak samt det som sticker ut
     translate([-wide1/2, 0, -height1/2-opt1])
       cube([wide1, diam1/2+cornRad1, height1+opt1*2],

center=false);

   }
 }

}
}

module mainBox(box_l, box_w, box_h, spaceHold, round_r, thick, smooth,

pad)

{ translate([box_l/2-thick-offset1/2, box_w/2-spaceHold, box_h/2])
{
// To fix the corners cut the main cube with smaller cubes with

spheres removed

 difference()
 { cube([box_l, box_w, box_h], center = true);

   // Kant1 - liggande
   translate([0, -box_w/2+round_r, box_h/2-round_r])
   { difference()
     { translate([0,-round_r-pad,round_r+pad])
         cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center =

true);

       rotate(a=[0,90,0])

cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth);

     }
   }
   // Kant2 - liggande
   translate([0, box_w/2-round_r, box_h/2-round_r])
   { difference()
     { translate([0,round_r+pad,round_r+pad])
         cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center =

true);

       rotate(a=[0,90,0])

cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth);

     }
   }
   /*
   // Kant3 - liggande
   translate([0, -box_w/2+round_r, -box_h/2+round_r])
   { difference()
     { translate([0,-round_r-pad,-round_r-pad])
         cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center =

true);

       rotate(a=[0,90,0])

cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth);

     }
   }

   // Kant4 - liggande
   translate([0, box_w/2-round_r, -box_h/2+round_r])
   { difference()
     { translate([0,round_r+pad,-round_r-pad])
         cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center =

true);

       rotate(a=[0,90,0])

cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth);

     }
   }
 */
 // ----
   // Kant1 - stående
   translate([-box_l/2+round_r, box_w/2-round_r, 0])
   { difference()
     { translate([-round_r-pad,round_r+pad,0])
         cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center =

true);

       cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth);
     }
   }
   // Kant2 - stående
   translate([box_l/2-round_r, box_w/2-round_r, 0])
   { difference()
     { translate([round_r+pad,round_r+pad,0])
         cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center =

true);

       cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth);
     }
   }
   // Kant3 - stående
   translate([-box_l/2+round_r, -box_w/2+round_r, 0])
   { difference()
     { translate([-round_r-pad,-round_r-pad,0])
         cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center =

true);

       cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth);
     }
   }
   // Kant4 - stående
   translate([box_l/2-round_r, -box_w/2+round_r, 0])
   { difference()
     { translate([round_r+pad,-round_r-pad,0])
         cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center =

true);

       cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth);
     }
   }

 // ----
   // Kant1 liggande (andra hållet)
   translate([-box_l/2+round_r, 0, box_h/2-round_r])
   { difference()
     { translate([-round_r-pad, 0, round_r+pad])
         cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center =

true);

       rotate(a=[0,90,90])

cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth);

     }
   }
   // Kant2 liggande (andra hållet)
   translate([box_l/2-round_r, 0, box_h/2-round_r])
   { difference()
     {  translate([round_r+pad, 0, round_r+pad])
         cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center =

true);

       rotate(a=[0,90,90])

cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth);

     }
   }
   /*
   // Kant3 liggande (andra hållet)
   translate([-box_l/2+round_r, 0, -box_h/2+round_r])
   { difference()
     { translate([-round_r-pad, 0, -round_r-pad])
         cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center =

true);

       rotate(a=[0,90,90])

cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth);

     }
   }

   // Kant4 liggande (andra hållet)
   translate([box_l/2-round_r, 0, -box_h/2+round_r])
   { difference()
     { translate([round_r+pad, 0, -round_r-pad])
         cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center =

true);

       rotate(a=[0,90,90])

cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth);

     }
   }

/
// ----
// Hörn1 (övre)
translate([box_l/2-round_r, box_w/2-round_r, box_h/2-round_r])
{ difference()
{ translate([round_r+pad, round_r+pad, round_r+pad])
cube([round_r
2+pad, round_r2+pad, round_r2+pad], center

= true);

       sphere(round_r,$fn=smooth);
     }
   }
   // Hörn2 (övre)
   translate([-box_l/2+round_r, box_w/2-round_r, box_h/2-round_r])
   { difference()
     { translate([-round_r-pad, round_r+pad, round_r+pad])
         cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center

= true);

       sphere(round_r,$fn=smooth);
     }
   }
   // Hörn3 (övre)
   translate([box_l/2-round_r, -box_w/2+round_r, box_h/2-round_r])
   { difference()
     { translate([round_r+pad, -round_r-pad, round_r+pad])
         cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center

= true);

       sphere(round_r,$fn=smooth);
     }
   }
   // Hörn4 (övre)
   translate([-box_l/2+round_r, -box_w/2+round_r, box_h/2-round_r])
   { difference()
     { translate([-round_r-pad, -round_r-pad, round_r+pad])
         cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center

= true);

       sphere(round_r,$fn=smooth);
     }
   }
   /*
   // Hörn1 (undre)
   translate([box_l/2-round_r, box_w/2-round_r, -box_h/2+round_r])
   { difference()
     { translate([round_r+pad, round_r+pad, -round_r-pad])
         cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center

= true);

       sphere(round_r,$fn=smooth);
     }
   }
   // Hörn2 (undre)
   translate([-box_l/2+round_r, box_w/2-round_r, -box_h/2+round_r])
   { difference()
     { translate([-round_r-pad, round_r+pad, -round_r-pad])
         cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center

= true);

       sphere(round_r,$fn=smooth);
     }
   }
   // Hörn3 (undre)
   translate([box_l/2-round_r, -box_w/2+round_r, -box_h/2+round_r])
   { difference()
     { translate([round_r+pad, -round_r-pad, -round_r-pad])
         cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center

= true);

       sphere(round_r,$fn=smooth);
     }
   }
   // Hörn4 (undre)
   translate([-box_l/2+round_r, -box_w/2+round_r, -box_h/2+round_r])
   { difference()
     { translate([-round_r-pad, -round_r-pad, -round_r-pad])
         cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center

= true);

       sphere(round_r,$fn=smooth);
     }
   }
   */
 }

}
}
//

module cableHolder3(posX, posY, posZ, length, width, height, radius)
{ // Skapa toppen över switchen
// mått på Switchen
fn = 96;          // upplösning (endast bågen?)
heightHold = 10.5;
widthHold = 33.5;
depthHold = 23.5;
holdRadie = 1.5;  // radie i hörnen
thick = 1.5;      // tjocklek

translate([0,-thick,0])
{
difference(0, 0, 0)
{ hull()
{ difference()
{ translate([thick, 0, heightHold]) // vänster kant
{ rotate([-90, 0, 0])
{ cylinder(h=depthHold, d=thick2);
translate([0, 0, depthHold])
sphere(d=thick
2);          // längst fram
}
}
translate([0, -0.1, heightHold]) // plocka bort underdelen
rotate([-90, 0, 0])
cube([thick*2, thick+.1, depthHold+thick+.1]);
}

     difference()
     { translate([widthHold-thick, 0, heightHold]) // höger kant
       { rotate([-90, 0, 0])
         { cylinder(h=depthHold, d=thick*2);
           translate([0, 0, depthHold])
             sphere(d=thick*2);         // längst fram
         }
       }
       translate([widthHold-thick*2, -0.1, heightHold]) // plocka

bort underdelen

       { rotate([-90, 0, 0])
           cube([thick*2, thick+.1, depthHold+thick+.1]);
       }
     }
   }

   // öppna hålen för monteringsskruvarna uppe på plattan
   translate([4, 13.5, 0])
     cylinder(h=15,d=3.2);
   translate([4, 13.5, 17.3])
     sphere(r=6);

   translate([29.6, 13.5, 0])
     cylinder(h=15,d=3.2);

   translate([29.6, 13.5, 17.3])
     sphere(r=6);
 }

 // halvbåge 1 bak
 translate([thick, 0, heightHold/2+thick/2])
   rotate([0, 90, 180])
     rotate_extrude(angle = 180, convexity=20, $fn=64)
 translate([heightHold/2-thick/2, 0, 0])
   circle(d=thick*2);
 translate([thick, 0, heightHold])
   sphere(d=thick*2);  // övre kulan
 translate([thick, 0, thick])
   sphere(d=thick*2);  // undre kulan


 // halvbåge 2 bak
 translate([widthHold-thick, 0, heightHold/2+thick/2])
   rotate([0, 90, 180])
     rotate_extrude(angle = 180, convexity=20, $fn=64)
 translate([heightHold/2-thick/2, 0, 0])
   circle(d=thick*2);
 translate([widthHold-thick, 0, heightHold])
   sphere(d=thick*2);  // övre kulan
 translate([widthHold-thick, 0, thick])
   sphere(d=thick*2);  // undre kulan

 // en cylinder tvärsöver längst upp
 translate([thick, 0, heightHold])
 { rotate([0,90,0])
     cylinder(h=widthHold-thick*2, r=thick);
 }

}

// Halvbågen (kabelhållaren) på baksidan switchen
translate([widthHold-thick, -thick, heightHold/2+thick/2])
{ rotate([0,90,180])
linear_extrude(widthHold-thick*2)
arc(heightHold/2-thick/2, [0, 180], thick, fn); //radius,

angles, width, fn)

}
// en cylinder tvärsöver längst ned
translate([thick, -thick, thick])
{ rotate([0,90,0])
cylinder(h=widthHold-thick*2, r=thick);
}
}

module switch(posX=0, posY=0, posZ=0)
{ buttRadie = 1.5;
height = 10.5;
width = 33.5;
depth = 23.5;
h1x = buttRadie;
h1y = buttRadie;
h2x = width-buttRadie;
h2y = buttRadie;
h3x = width-buttRadie;
h3y = depth-buttRadie;
h4x = buttRadie;
h4y = depth-buttRadie;

translate([posX, posY, posZ])
{ difference()
{ color("#F9F9F3")
// tryck-knappen
union()
{ translate([width/2, depth+6-0.1, height/2])
{ rotate([90, 0, 0])
{ translate([0,0,6])
circle(d=6.8);  // skuggan runt knapp
cylinder(h=6, d=6);
sphere(d=6);
}
}

     hull()  // Switchkropp
     { translate([h1x, h1y])
         cylinder(h=height, r=1.5);
       translate([h2x, h2y])
         cylinder(h=height, r=1.5);
       translate([h3x, h3y])
         cylinder(h=height, r=1.5);
       translate([h4x, h4y])
         cylinder(h=height, r=1.5);
     }
   }

   // Skruvhålen för switchen
   hole( 4, 12, 0, "#FFD700", height);
   hole(29.6, 12, 0, "#FFD700", height);
   // hole( 4, 12, 0, "#FFD700", 50);
   // hole(29.6, 12, 0, "#FFD700", 50);
   // hål för kablar bak
   color("gray")
   { translate([9.5, 16, height/2])
     { rotate([90, 0, 0])
         cylinder(h=16.5, d=4);
     }
     translate([24.5, 16, height/2])
     {  rotate([90, 0, 0])
         cylinder(h=16.5, d=4);
     }
   }

   // hål för kabelskruvar
   color("white")
   { translate([29.5, 17.1, height/2])
     { rotate([0, 90, 0])
         cylinder(h=4.1, d=4.5);
     }
     translate([-0.1, 17.1, height/2])
     { rotate([0, 90, 0])
         cylinder(h=4.1, d=4.5);
     }
   }
 }

 // Kabelskruvar
 cableScrew(3, 17, height/2, 90);
 cableScrew(31, 17, height/2, -90);

}
}

// Skruven som håller fast kabeln i switchen
module cableScrew(posX=0, posY=0, posZ=0, angle=0)
{ color("#FFD700")  // mässing
translate([posX, posY, posZ])
{ rotate([0, 0, angle])
{ difference()
{ // skruvskalle
translate([0, 0, 0])
rotate([90, 0, 0])
cylinder(h=2, d1=4, d2=3.5);

     // stjärnan i skruven
     translate([0, 1.85, -.25])
       rotate([0, 0, 0])
         cylinder(h=0.5, d=5);
     translate([-0.25, -.6, 2.25])
       rotate([0, 90, 0])
         cube([4.5, 2, 0.5]);
   }
 }

}
}

// borrhål
module hole(posX=0, posY=0, posZ=0, colorName="yellow", height)
{ diamHole1 = 3;
highHole1 = height;
diamHole2 = 6;
highHole2 = 2.5;
offs=0.1;

color(colorName)
{
translate([posX, posY, posZ])
{ translate([0, 0, 0])
cylinder(h=highHole1, d=diamHole1);
translate([0, 0, -offs])
cylinder(h=highHole2, d=diamHole2);
translate([0, 0, height-highHole2+offs])
cylinder(h=highHole2, d=diamHole2);
}
}
}

module showCables()
{ translate([-25,8,24])
rotate([80,177,90])
cable(10,10,0,"brun");
translate([-43,8,15])
rotate([90,180,90])
cable(10,10,0,"blå");
}

module cable(posX=0, posY=0, posZ=0, colorName="blå", radius=1.26,

width=0.62, thick=50, fn=24)

{ // default 1.5mm2
// radius = inner radie
// width = bredd/tjocklek på cirkeln (inte höjd)
// thick = höjd på cirken/ röret
// pin=

colCupper = "#D7715A";
colGreen  = "#07DA63";
colYellow = "#FFCC00";

if (colorName=="gröngul")
{ translate([posX, posY, posZ])
{ color(colGreen)
linear_extrude(thick)
arc(radius, [0, 60], width, fn);
color(colYellow)
linear_extrude(thick)
arc(radius, [60, 180], width, fn);
color(colGreen)
linear_extrude(thick)
arc(radius, [180, 240], width, fn);
color(colYellow)
linear_extrude(thick)
arc(radius, [240, 360], width, fn);

   color(colCupper)
     linear_extrude(10, center=true, convexity=10, $fn=100)
       circle(d=1.24);
 }

}
else  // vanliga kablar 1.5mm2
{
cableColor = colorName == "blå" ? "#1870D5"
: colorName == "brun" ? "#9C6137"
: colorName == "svart" ? "#000000"
: assert(false,"invalid color value");  // message if

no case worked

         // : nodef

 translate([posX, posY, posZ])
 {             //el kabel - ena änden rak - andra böjd
   color(colCupper)    //kopparstump tråd rakkabel
     linear_extrude(10, center=true, convexity=10, $fn=100)
       circle(d=1.24);

    color(cableColor)
    { cylinder(h=thick, r=radius);

     translate([-radius*2, 0, thick])  // kabelböj
     rotate([90, 0, 0])
     rotate_extrude(angle=90, convexity=20)
       translate([2.5, 0, 0])
         circle(r=1.26);

     translate([-radius*2, 0, thick+radius*2])
       rotate([0, -90, 0])
       cylinder(h=5, r=radius);
   }
   translate([-10, 0, thick+radius*2])
   { rotate([0, -90, 0])
     { color(colCupper)
       { linear_extrude(5, center=true, convexity=10, $fn=100)
           circle(d=1.24);
       }
     }
   }
 }

}
}

//


---====

module arc(radius, angles, width = 1, fn = 24) {
difference() {
sector(radius + width, angles, fn); // ytterradie
sector(radius, angles, fn);        // innerradie (plockar

bort invändigt

 }

}

module sector(radius, angles, fn = 24) {
r = radius / cos(180 / fn);
step = -360 / fn;

 points = concat([[0, 0]],
     [for(a = [angles[0] : step : angles[1] - 360])
         [r * cos(a), r * sin(a)]
     ],
     [[r * cos(angles[1]), r * sin(angles[1])]]
 );

 difference() {
     circle(radius, $fn = fn);
     polygon(points);
 }

}
= = END product 2 = = = = = = = = = = = = = = = = = = = = = = = = = =

= = = =

  • . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _

. - . _ . - . _ . - . _ . - . _ . -

Den fredag 6 maj 2022 14:06:55 CEST, Michael Möller <

OpenSCAD code - is a description of your model in terms of a few

cylinder/cubes added and cut out

difference() {
cylinder(d=5,h=10);
translate([0,10,0]) cube([4,6,2]) ;
}

STL file is a list of triangles which make the same outer shell as

your model. OpenSCAD makes this complicated transform from shapes to
triangles.

solid OpenSCAD_Model
facet normal 0.92388 0.382682 0
outer loop
vertex 2.5 0 3
vertex 1.76777 1.76777 0
vertex 1.76777 1.76777 3
endloop
endfacet
facet normal 0.92388 0.382682 0
outer loop
vertex 1.76777 1.76777 0
vertex 2.5 0 3
vertex 2.5 0 0
endloop
endfacet
: (and so on for 300 lines) There is a binary/compressed version,

but the description is still just triangles.

Gcode is what a 3D printer understands - it is the exact list of moves

that the head has to do with how much plastic to squeeze to trace the
outline of your shape, layer, by layer. It will optionally create moves for
filling the inside or support for overhangs. Such a program is called a
SLICER and the printer will come with one.

G92 E0 ; reset extrusion distance
G1 Z2.330 F6600.000 ; lift Z
G1 X-0.000 Y1.505 F6600.000 ; move to first perimeter point
G1 Z0.330 F6600.000 ; restore layer Z
G1 E3.00000 F2400.00000 ; unretract extruder 0
G1 F1500
G1 X-1.064 Y1.064 E3.09259 ; perimeter
G1 X-1.505 Y0.000 E3.18517 ; perimeter
: (many similar lines)
G1 X1.515 Y1.515 E4.65860 ; perimeter
G1 X0.055 Y2.120 E4.78559 ; perimeter
G1 X-0.000 Y2.143 F6600.000 ; move inwards before travel
G1 X0.384 Y0.843 F6600.000 ; move to first infill point
G1 F1500
G1 X0.843 Y0.384 E4.84815 ; infill
G1 X1.097 Y-0.229 E4.91215 ; infill
:
(and so on for thousands of lines)

The 3MF still basically deals in triangles, and attributes (surface,

infill material, picture, ticket info ... ) which probably are not used by
your slicer/printer.

On Fri, 6 May 2022 at 12:37, Jan Öhman via Discuss <

---------- Forwarded message ----------
From: "Jan Öhman" jan_ohman@yahoo.com
To: OpenSCAD General Discussion discuss@lists.openscad.org
Cc:
Bcc:
Date: Fri, 6 May 2022 10:38:46 +0000 (UTC)
Subject: [OpenSCAD] Export to .STL / .3MF for later 3D-printing.
Hi!

Thought to create some objects in openSCAD, to print later.
I do not have my own 3D printer (yet).

One I talked to, wanted to get the drawings in .STL or .3MF. (I don't

know the difference).

If I had my own printer, have I been able to print directly from

openSCAD?

(Without some export?)

In the openSCAD, no errors or problems occur.
but
The drawings I tested to export from openSCAD have given one or

another error message.

One message .:
WARNING: Object may not be a valid 2-manifold and may need repair!

Another message .:
WARNING: No top level geometry to render

What to do?

---------- Forwarded message ----------
From: "Jan Öhman via Discuss" discuss@lists.openscad.org
To: OpenSCAD General Discussion discuss@lists.openscad.org
Cc: "Jan Öhman" jan_ohman@yahoo.com
Bcc:
Date: Fri, 6 May 2022 10:38:46 +0000 (UTC)
Subject: [OpenSCAD] Export to .STL / .3MF for later 3D-printing.


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org

---------- Forwarded message ----------
From: "Jan Öhman via Discuss" discuss@lists.openscad.org
To: OpenSCAD general discussion discuss@lists.openscad.org
Cc: "Jan Öhman" jan_ohman@yahoo.com
Bcc:
Date: Sat, 7 May 2022 11:04:31 +0000 (UTC)
Subject: [OpenSCAD] Re: Export to .STL / .3MF for later 3D-printing.


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org

Indeed you did Adrian, I was curious what that long code was going to produce. Michael, fra mobilen lør. 7. maj 2022 19.06 skrev Adrian Mariano <avm4@cornell.edu>: > I already gave a full explanation of what's wrong and how to fix the > first program. It has a 2d polygon (easily found as there is one lone > polygon call) that needs to be removed or linear_extruded as > appropriate. And it makes use of path_sweep in a manner that produces > a self-intersecting polyhedron. This issue is explained in the manual > page for path_sweep. This can be fixed either by switching to > path_extrude2d() or by changing the corner radius to eliminate the > self-intersections. Or changing to a profile that can actually be > rounded at the desired radius. > > https://github.com/revarbat/BOSL2/wiki/skin.scad#functionmodule-path_sweep > > On Sat, May 7, 2022 at 12:57 PM Michael Möller > <private2michael@gmail.com> wrote: > > > > Jan Öhman wrote it failed in Render/F6, but works in Preview/F5 - in so > many words. I tried and got the following > > > > First model > > > > F6 Error: WARNING: Ignoring 2D child object for 3D operation in file , > line 53 > > > > ERROR: CGAL error in CGALUtils::applyUnion3D: CGAL ERROR: assertion > violation! Expr: G.mark(v1,0)==G.mark(v2,0)&& G.mark(v1,1)==G.mark(v2,1) > File: > /mxe/usr/x86_64-w64-mingw32.static.posix/include/CGAL/Nef_S2/SM_overlayer.h > Line: 303 > > > > Which I think is pretty selfexplantory: Passed a 2D shape to something > that expected a 3D shape - but you have to read the whole code to find it > ... which I think Jan is more qualified to do :-) > > > > 2nd part > > > > ... which is one of those where zooming or rotating the model in preview > takes >5 second > > > > And I didn't bother waiting for the F6 error ... ;-) > > > > > > Of course, we do not know if the above shapes I got are the ones that > Jan wants - there are also sections of code commented out. > > > > (From the comments it seems these are to be nice and alternative covers > for wall outlet/switches.) > > > > > > > > On Sat, 7 May 2022 at 18:26, Sanjeev Prabhakar <sprabhakar2006@gmail.com> > wrote: > >> > >> Quite a long code. > >> Can you paste a picture of what you are trying to draw. > >> Regards > >> Sanjeev > >> > >> On Sat, 7 May 2022, 16:31 Jan Öhman via Discuss, < > discuss@lists.openscad.org> wrote: > >>> > >>> > >>> > >>> > >>> ---------- Forwarded message ---------- > >>> From: "Jan Öhman" <jan_ohman@yahoo.com> > >>> To: OpenSCAD general discussion <discuss@lists.openscad.org> > >>> Cc: > >>> Bcc: > >>> Date: Sat, 7 May 2022 11:04:31 +0000 (UTC) > >>> Subject: [OpenSCAD] Re: Export to .STL / .3MF for later 3D-printing. > >>> Thank you! > >>> Begins to understand how it works. (It was not easy...) > >>> > >>> but my solution was not good ... > >>> > >>> Here are 2 files that do not work to render (F6) > >>> > >>> > >>> = = product 1= = = = = = = = = = = = = = = = = = = = = = = = = = = = = > = = = > >>> - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ > . - . _ . - . _ . - . _ . - . _ . - > >>> > >>> > >>> include <BOSL2/std.scad> > >>> fn = 150; > >>> > >>> placering="left"; > >>> // placering="right" > >>> > >>> box(0, 0, 0, placering, "#C0C0C0", fn); // (X, Y, Z, left/right, > colorName) > >>> > >>> > >>> // Monteringsplattan > >>> // mountingPlate(0, 0, 0, placering); > >>> > >>> > >>> // LED belysning > >>> // LEDlampa(0, 0, 0, placering); > >>> > >>> > >>> // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - > >>> // - - - - m o d u l e r - - - - - - - - - - - - - - - - - - > >>> > >>> > >>> > //================================================================================== > >>> //====== box > ===================================================================== > >>> module box(posX=0, posY=0, posZ=0, mountSide="left", > colorName="#00FF00", fn=24) > >>> { > >>> side = mountSide == "left" ? 0 > >>> : mountSide == "right" ? 1 > >>> : assert(false,"invalid moutSide value"); // message if no > case worked > >>> > >>> color(colorName) > >>> translate([posX, posY, posZ]) > >>> mirror([side, 0, 0]) > >>> difference() > >>> { > >>> union() > >>> { > >>> // Skapa konturer på bottenplattan - x, y, r, angles, [grader], > början > >>> // Rotation medurs - vänster lamphållare (bakant saknas) > >>> points1 = circSect( 140, 0, 0, [0, 0], "right", 1, fn); // böj > nere till höger > >>> points2 = circSect( 60, 5, 5, [0, 5], "bottom", 1, fn); // > brytpunkt längst ned > >>> points3 = circSect( 10, 13, 10, [0, 90], "bottom", 1, fn); // böj > nere till vänster > >>> points4 = circSect( 5, 80, 5, [0, 90], "left", 1, fn); // böj > uppe till vänster > >>> points5 = circSect( 140, 80, 5, [0, 1], "top", 1, fn); // böj > uppe till höger > >>> edge = concat(points1, points2, points3, points4, points5); > >>> path = path3d(reverse(edge)); > >>> section = wall(); > >>> path_sweep( section, path, closed=false); > >>> > >>> > >>> // Skapa bakkant lite högre och smalare i topp > >>> bottom1 = concat(points5, points1); > >>> polygon(bottom1); > >>> path1 = path3d(reverse(bottom1)); > >>> section1 = wall1(); // lite högre bakvägg wall(b=4, f=8, h=15, t=3.5) > >>> path_sweep( section1, path1, closed=false); > >>> > >>> // fyll upp bottenplattansbaksida > >>> linear_extrude(4) // Bottomplate - fill up > >>> polygon(concat(points1, points2, points3, points4, points5)); > >>> > >>> > >>> // skapa Utskjutande del under (tänk spegelvänt) > >>> pt1 = circSect( 19.5, 85, 0, [0, 50], "top", 1, fn); // Uppe till > höger - moturs > >>> pt2 = circSect( 39, 1.35, .1, [-5, 90], "right", 1, fn); // Nere > till höger > >>> pt3 = circSect( 10, 13.05, 10, [0, 90], "bottom", 1, fn); // Nere > till vänster > >>> pt4 = circSect( 5, 80, 5, [0, 90], "left", 1, fn); // Uppe till > vänster > >>> translate([0, 0, -2]) > >>> linear_extrude(2.1) > >>> polygon(concat(pt1, pt2, pt3, pt4)); > >>> > >>> // utgången för kabeln på baksidan (diam 10mm) - pekar lite nedåt > >>> cableExit(65, 35, 0, 15, "cyan", $fn=100); > >>> } > >>> > >>> // skapa ett borrhål i bakkant > >>> translate([132,60,15]) > >>> { rotate([0, 90, 0]) > >>> { cylinder(h=10, d=2, $fn=100); > >>> cylinder(h=4, d=9, $fn=100); > >>> } > >>> } > >>> > >>> // skapa en borrmarkering i bakkant > >>> translate([139,25,15]) > >>> { rotate([0, 90, 0]) > >>> cylinder(h=2, d1=1, d2=2.5, $fn=100); > >>> } > >>> > >>> > >>> // ingravera årtalet på baksidan > >>> translate([10, 80, -0.5]) > >>> { mirror([side, 0, 0]) > >>> { rotate([0, 180, 0]) > >>> { linear_extrude(3) > >>> text("2022", size=12, direction="ttb", font="Comic Sans > MS:style=Bold"); > >>> } > >>> } > >>> } > >>> > >>> /* > >>> // Markera skruvhål på bakkant > >>> borr=3; > >>> bredd=140; > >>> hojd=8; > >>> avstNed=20; > >>> translate([bredd, avstNed, hojd]) > >>> { rotate([0,90,0]) > >>> cylinder(h=2, d1=0.5, d2=borr, center=true, $fn=50); > >>> } > >>> */ > >>> > >>> // borrhål > >>> mountingHole(20, 36, 0, 7, 90.1, 15); // posX, posY, posZ, diam, > dist, deep, $fn=50 > >>> > >>> } > >>> } > >>> //======== Slut box > ============================================================== > >>> > >>> > >>> > //================================================================================== > >>> //====== cableExit > =============================================================== > >>> module cableExit(posX, posY, posZ, angle, colorName) > >>> { diamHole = 7; > >>> diamHolder = 9.8; > >>> hight = 12; > >>> topRad = diamHolder/2; > >>> topDiam = diamHolder/2-topRad/2; > >>> bowRad = 7; > >>> offs1 = 0.1; > >>> > >>> color(colorName) > >>> translate([posX, posY, posZ]) > >>> { rotate([180, 0, 180-angle]) > >>> { difference() > >>> { hull() > >>> { cylinder(h=hight, d=diamHolder, center=false); > >>> translate([0, 0, hight]) // rundad topp > >>> rotate_extrude(angle=360, convexity=2) > >>> translate([topDiam, 0, 0]) // yttre diam topp > >>> circle(d=topRad); // radie topp > >>> } > >>> > >>> > >>> inpHight = 2; // ett värde som styr var utgångshålet hamnar > >>> translate([0, 0, -offs1]) > >>> cylinder(h=inpHight+offs1, d=diamHole, center=false); // > Bottenhål > >>> > >>> translate([-bowRad, 0, inpHight-offs1]) // böjen > >>> { rotate([90, 0, 0]) > >>> rotate_extrude(angle=90, convexity=10) > >>> translate([bowRad, 0, 0]) // ställ in radien på > kabelböjen > >>> circle(d=diamHole); > >>> } > >>> } > >>> } > >>> } > >>> } > >>> //====== slut cableExit > ========================================================== > >>> > >>> > >>> > //================================================================================== > >>> //====== mountingHole > ============================================================ > >>> module mountingHole(posX=0, posY=0, posZ=0, diam=7, dist=90, deep=5, > $fn=50) > >>> { // diam = 6; // [mm] > >>> // dist = 90; // [mm] > >>> // deep = 12; // [mm] > >>> > >>> translate([posX, posY, posZ]) > >>> { translate([0, 0, -10]) > >>> cylinder(h=deep, d=diam); // fästhål 1 > >>> > >>> //cableHold1(dist/2, 0, .2, "#D5D5D5"); // Kabelgenomföring > >>> translate([dist/2, 0, 0]) > >>> { hull() > >>> { cylinder(h=5, d=6); // fästhål 1 > >>> sphere(d=7.5); > >>> } > >>> } > >>> > >>> translate([dist, 0, -10]) > >>> cylinder(h=deep, d=diam); // fästhål 2 > >>> } > >>> } > >>> //====== slut mountingHole > ======================================================= > >>> > >>> > >>> > //================================================================================== > >>> //====== LEDlampa > ================================================================ > >>> // module LEDlampa(posX=8, posY=10, posZ=0) > >>> module LEDlampa(posX=0, posY=0, posZ=0, mountSide="left") > >>> { side = mountSide == "left" ? 0 > >>> : mountSide == "right" ? 1 > >>> : assert(false,"invalid moutSide value"); // message if no > case worked > >>> > >>> xpos = mountSide == "left" ? 121 > >>> : mountSide == "right" ? -10 > >>> : assert(false,"invalid moutSide value"); // message if no > case worked > >>> /* > >>> ypos = mountSide == "left" ? 10.5 > >>> : mountSide == "right" ? 10.5 > >>> : assert(false,"invalid moutSide value"); // message if no > case worked > >>> > >>> zpos = mountSide == "left" ? 5 > >>> : mountSide == "right" ? 5 > >>> : assert(false,"invalid moutSide value"); // message if no > case worked > >>> */ > >>> // echo(xpos,ypos,zpos); > >>> // translate([xpos, ypos, zpos]) > >>> translate([xpos, 10.5, 5]) > >>> mirror([1, 0, 0]) > >>> translate([posX, posY, posZ]) > >>> { LEDbottom(); > >>> translate([0, 0, 11]) > >>> LEDglas(); > >>> } > >>> } > >>> //====== Slut LEDlampa > =========================================================== > >>> > >>> > >>> > //================================================================================== > >>> //====== LEDglas > ================================================================= > >>> module LEDglas() > >>> { > >>> // Variabler botten > >>> length = 111; // längd mm > >>> wideMid = 50.5; // bredd i mitten mm > >>> > >>> cornRad = 10; // Radien i alla hörn > >>> wideCorn = 48; // Bredd i kanterna > >>> > >>> diamHole = 6; // håldiameter i mm > >>> > >>> colorBot = "gray"; > >>> colorTop = "orange"; > >>> > >>> // Variabler top > >>> cornHigh = 5; //Höjd i ändarna > >>> midHigh = 8; > >>> highTop = cornHigh + 1; // höjd mm > >>> > >>> p1tx = 10; // the start value > >>> p1ty = 49.25; > >>> p2tx = 55.5; // the middle value > >>> p2ty = 50.5; > >>> p3tx = 101; // the end value > >>> p3ty = p1ty; > >>> > >>> p4tx = 101; // the start value > >>> p4ty = 1.25; > >>> p5tx = 55.5; // the middle value > >>> p5ty = 0.0; > >>> p6tx = 10; // the end value > >>> p6ty = p4ty; > >>> // Ger ovalt glas > >>> points1 = 3points_arc([p1tx,p1ty], [p2tx,p2ty], [p3tx,p3ty], fn=100); > >>> points2 = 3points_arc([p4tx,p4ty], [p5tx,p5ty], [p6tx,p6ty], fn=100); > >>> > >>> color("orange") > >>> linear_extrude(height=cornHigh+.1) > >>> difference() > >>> { polygon(concat(points1, points2)); > >>> > >>> translate([length-10 , wideMid / 2, -.2]) > >>> circle(d=6); > >>> translate([10 , wideMid / 2, -.2]) > >>> circle(d=6); > >>> } > >>> > >>> // Top > >>> color(colorTop) > >>> difference() > >>> { hull() > >>> { // hörn1 > >>> translate([cornRad, wideMid - ((wideMid-wideCorn)/2) - cornRad, > 0]) // [10,39] > >>> cylinder(h=cornHigh, d=cornRad*2, center=false); > >>> // hörn2 > >>> translate([cornRad, cornRad + ((wideMid-wideCorn)/2), 0]) > // [10,12] > >>> cylinder(h=cornHigh, d=cornRad*2, center=false); > >>> // hörn3 > >>> translate([length - cornRad, wideMid - ((wideMid-wideCorn)/2) - > cornRad, 0]) // [101 ,39] > >>> cylinder(h=cornHigh, d=cornRad*2, center=false); > >>> // hörn4 > >>> translate([length - cornRad, cornRad + ((wideMid-wideCorn)/2), > 0]) // > >>> cylinder(h=cornHigh, d=cornRad*2, center=false); > >>> } > >>> > >>> union() > >>> { // Monteringshål 1 & 2 > >>> translate([length-10 , wideMid / 2, -.2]) > >>> cylinder(d=diamHole, h=highTop+.5, center=false); > >>> translate([10 , wideMid / 2, -.2]) > >>> cylinder(d=diamHole, h=highTop+.5, center=false); > >>> } > >>> } > >>> } > >>> //======== Slut LEDglas > ========================================================== > >>> > >>> > >>> > //================================================================================== > >>> //====== LEDbottom > =============================================================== > >>> module LEDbottom() > >>> { p1x = 10; // the start value > >>> p1y = 49.25; > >>> p2x = 55.5; // the middle value > >>> p2y = 50.5; > >>> p3x = 101; // the end value > >>> p3y = p1y; > >>> > >>> p4x = 101; // the start value > >>> p4y = 1.25; > >>> p5x = 55.5; // the middle value > >>> p5y = 0.0; > >>> p6x = 10; // the end value > >>> p6y = p4y; > >>> > >>> // Variabler botten för borrhålen > >>> length = 111; // längd mm > >>> wideMid = 50.5; // bredd i mitten mm > >>> diamHole = 6; // håldiameter i mm > >>> cornHigh = 5; //Höjd i ändarna > >>> midHigh = 8; > >>> highTop = cornHigh + 1; // höjd mm > >>> // offs1 = 0.1; > >>> heightHole = 15; //mm > >>> height = 11; //mm > >>> > >>> points1 = circSect( 10, 11.25, 10, [0, 90], "bottom", 1, fn); // > Hörn nere till vänster > >>> points2 = circSect( 10, 39.25, 10, [0, 90], "left", 1, fn); // > Hörn uppe till vänster > >>> points3 = 3points_arc([p1x,p1y], [p2x,p2y], [p3x,p3y], fn); > >>> points4 = circSect( 101, 39.25, 10, [0, 90], "top", 1, fn); // > Hörn uppe till höger > >>> points5 = circSect( 101, 11.25, 10, [0, 90], "right", 1, fn); // > Hörn nere till höger > >>> points6 = 3points_arc([p4x,p4y], [p5x,p5y], [p6x,p6y], fn); > >>> > >>> // The base plate for the LED lamp > >>> > >>> > >>> difference() > >>> { color("gray", 0.5) > >>> linear_extrude(height=height) > >>> polygon(concat(points1, points2, points3, points4, points5, > points6)); > >>> > >>> > >>> // union() > >>> { // Monteringshål 1 & 2 > >>> translate([length-10 , wideMid / 2, -.2]) > >>> cylinder(d=diamHole, h=heightHole, center=false); > >>> translate([10 , wideMid / 2, -.2]) > >>> cylinder(d=diamHole, h=heightHole, center=false); > >>> } > >>> } > >>> } > >>> //======== Slut LEDbottom > ======================================================== > >>> > >>> > >>> > >>> > //================================================================================== > >>> //====== circleSect > ============================================================== > >>> // Create rounded corners 2D > >>> // https://openhome.cc/eGossip/OpenSCAD/SectorArc.html > >>> // ange .: x, y, radien, > >>> // [från, till] vinkel, > >>> // var vinkeln startar, (left, bottom, right, top) > >>> // vilken rotation (-1=medsol, 1=motsols) > >>> function circSect(x=0, y=0, radius=10, angles=[0,270], > startRef="bottom", rotate=1, fn=24) = > >>> let( > >>> startAngel = (startRef == "left") ? 0 > >>> : (startRef == "bottom") ? 90 > >>> : (startRef == "right") ? 180 > >>> : (startRef == "top") ? 270 > >>> : startRef, // valfri vinkel > >>> // : assert(false,"invalid moutSide value"); // > Error message if no case worked > >>> //: undef, > >>> r = radius, > >>> //r = radius / cos(180 / fn), > >>> step = 360 / fn, > >>> // points = [[x, y], > >>> points = [ > >>> for(a = [angles[0]-startAngel : step : > angles[1]-startAngel]) > >>> [-rotate * r * cos(a)+x, r * sin(a)+y]] > >>> ) points; > >>> //======== Slut circleSect > ======================================================= > >>> > >>> > >>> > //================================================================================== > >>> //====== 3points_arc > ============================================================= > >>> // Create an arc with three points 2D > >>> function 3points_arc(p0, p1, p2, fn=10) = > >>> // an alternative expression for D > >>> // D = 2 * ( (p1-p0).x * (p2-p0).y - (p1-p0).y * (p2-p0).x ) > >>> let( D = 2 * cross(p1-p0, (p2-p0)) ) > >>> assert( abs(D)>1e-9, "The 3 points should not be collinear." ) > >>> let( > >>> Ux = ( (p2-p0).y*(p1-p0)*(p1-p0) - (p1-p0).y*(p2-p0)*(p2-p0) > )/D, > >>> Uy = ( (p1-p0).x*(p2-p0)*(p2-p0) - (p2-p0).x*(p1-p0)*(p1-p0) > )/D, > >>> radius = norm([Ux,Uy]), > >>> center = [Ux,Uy] + p0, > >>> ang0 = atan2( (p0-center).y, (p0-center).x ), > >>> ang2 = atan2( (p2-center).y, (p2-center).x ), > >>> // the points are in a cw winding iff D<0 > >>> // the angular difference between vectors p2-center and p0-center > >>> // measured from p0-center; dang is positive iff D is negative > >>> dang = D<0 ? ang2<ang0 ? ang2-ang0 : ang2-ang0-360 > >>> : ang2>ang0 ? ang2-ang0 : ang2-ang0+360 > >>> ) > >>> [ for(i=[0:fn-1]) > >>> let( ang = ang0 + i*dang/(fn-1) ) > >>> center + radius*[cos(ang),sin(ang)] ]; > >>> //======== Slut 3points_arc > ====================================================== > >>> > >>> > >>> > //================================================================================== > >>> //====== Wall som ett "L" > ======================================================== > >>> // Normal vägghöjd > >>> function wall() = > >>> let( > >>> b = 4, // botten - tjocklek > >>> f = 8, // Foten > >>> h = 15, // Höjd > >>> t = 3.5, // Top > >>> x = (b+(t/2) - (h - ( (-h / (f-t)) *t) )) / (-h / (f-t)) > >>> ) > >>> let( > >>> points = [[0,0], [f,0], [t,h], [0,h]] , > >>> top = move([t/2, h, 0], circle(d=t, $fn=20)), > >>> sqr = square([10, b]), > >>> diff = > >>> difference([ > >>> move([x, b], square([t/2, t/2])), > >>> move([x+(t/2), b+(t/2), 0], circle(d = t, $fn=20) ) > ]) > >>> ) > >>> union([points, top, sqr, diff]); > >>> //======== Slut Wall > ============================================================= > >>> > >>> > >>> > >>> > //================================================================================== > >>> //====== Wall1 som ett "L" > ======================================================= > >>> // En högre vägg > >>> function wall1() = > >>> let( > >>> b = 4, // botten - tjocklek > >>> f = 7, // Foten > >>> h = 25, // Höjd > >>> t = 3, // Top > >>> x = (b+(t/2) - (h - ((-h / (f-t)) *t))) / (-h / (f-t)) > >>> ) > >>> let( > >>> points = [[0,0], [f,0], [t,h], [0,h]] , > >>> top = move([t/2, h, 0], circle(d=t, $fn=20)), > >>> sqr = square([10, b]), > >>> diff = > >>> difference([ > >>> move([x, b], square([t/2, t/2])), > >>> move([x+(t/2), b+(t/2), 0], circle(d = t, $fn=20) ) ]) > >>> ) > >>> union([points, top, sqr, diff]); > >>> //======== Slut Wall1 > ============================================================ > >>> > >>> > >>> > //================================================================================== > >>> //====== Plåt på släp > ============================================================ > >>> module mountingPlate(posX=0, posY=0, posZ=0, mountSide="left", > colorName="#C0C0C0", $fn=50) > >>> { // Hörnpositionerna > >>> posX1 = 120; > >>> posY1 = 0; > >>> posX2 = posX1; > >>> posY2 = -200; > >>> posX3 = 120 - 75; > >>> posY3 = -200; > >>> posX4 = 0; > >>> posY4 = 0; > >>> thick=2; // tjocklek > >>> > >>> side = mountSide == "left" ? 0 > >>> : mountSide == "right" ? 1 > >>> : assert(false,"invalid moutSide value"); // message if no > case worked > >>> > >>> xpos = mountSide == "left" ? 20 > >>> : mountSide == "right" ? -20 > >>> : assert(false,"invalid moutSide value"); // message if no > case worked > >>> /* > >>> ypos = mountSide == "left" ? 85 > >>> : mountSide == "right" ? 85 > >>> : assert(false,"invalid moutSide value"); // message if no > case worked > >>> > >>> zpos = mountSide == "left" ? -thick > >>> : mountSide == "right" ? -thick > >>> : assert(false,"invalid moutSide value"); // message if no > case worked > >>> */ > >>> color(colorName) > >>> { translate([posX, posY, posZ]) > >>> translate([xpos, 85, -thick]) > >>> { mirror([side, 0, 0]) > >>> { linear_extrude(thick) > >>> hull() > >>> { translate([posX1, posY1, 0]) > >>> square(0.1, center = true); > >>> translate([posX2, posY2, 0]) > >>> square(0.1, center = true); > >>> translate([posX3, posY3, 0]) > >>> square(0.1, center = true); > >>> translate([posX4, posY4, 0]) > >>> square(0.1, center = true); > >>> } > >>> } > >>> } > >>> } > >>> } > >>> = = END product 1= = = = = = = = = = = = = = = = = = = = = = = = = = = > = = = > >>> - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ > . - . _ . - . _ . - . _ . - . _ . - > >>> > >>> > >>> > >>> > >>> = = product 2 = = = = = = = = = = = = = = = = = = = = = = = = = = = = > = = = = > >>> - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ > . - . _ . - . _ . - . _ . - . _ . - > >>> > >>> $fn=100; > >>> //$fn=15; > >>> > >>> //switch(); > >>> //cableHolder4(); //Switchboxen > >>> > >>> > >>> // cableHolder3(0, 0, 0, 33.5, 23.5, 1.5, 2); > >>> // showCables(); > >>> > >>> > >>> > >>> module cableHolder4(fn=24); > >>> { // idé från > >>> // - https://www.thingiverse.com/thing:6400/files > >>> // - > https://ihrchive.wordpress.com/2011/02/14/openscad-tip-round-1-of-3-basic-rounding/ > >>> > >>> // mått på Switch > >>> heightHold = 10.5; > >>> widthHold = 33.5; > >>> depthHold = 23.5; > >>> spaceHold = 10.0; // utrymmet bakom switch > >>> holdRadie = 2; // radie i hörnen > >>> thick = 2; > >>> offset1=0.5; // öka toleransen > >>> > >>> // innermått > >>> holeW = widthHold + offset1; > >>> holeH = heightHold + offset1; > >>> holeD = depthHold + spaceHold+offset1; > >>> > >>> // yttermått > >>> pad = 0.1; // Padding to maintain manifold > >>> box_l = holeW + thick*2; // Bredden på switchen > >>> box_w = holeD + thick; // Djupet på switchen > >>> box_h = holeH + thick; // Height > >>> round_r = holdRadie; // Radius of round > >>> smooth = 45; // Number of facets of rounding cylinder > >>> > >>> > >>> > >>> difference() > >>> { union() // Detta utförs i två steg. > >>> { difference() // utför fasningar och kabelmarkeringar > >>> { mainBox(box_l, box_w, box_h, spaceHold+thick, round_r, thick, > smooth, pad); > >>> > >>> // fasning vänster (underkant) > >>> translate([box_l/2-0.85, spaceHold-4.3, thick-offset1]) // > sidled, fram/bak , upp/ned > >>> rotate([0,180,45]) > >>> cylinder(h=thick, d1=holeW*1.414-thick-thick, > d2=holeW*1.414, $fn=4); > >>> > >>> // fasning höger (underkant) > >>> translate([box_l/2-3.65, spaceHold-4.3, thick-offset1]) // > sidled, fram/bak , upp/ned > >>> rotate([0,180,45]) > >>> cylinder(h=thick, d1=holeW*1.414-thick-thick, > d2=holeW*1.414, $fn=4); > >>> > >>> // kabelgenomföringar > >>> rotate([90, 180, 90]) // Markering ena sidan (vänster under) > >>> ovalCableHole(spaceHold/2-offset1, -1.75, -1.2); > >>> > >>> rotate([90, 180, 180]) // Markering bakkant (vänster under) > >>> ovalCableHole(spaceHold/2-1.55, -1.75, -spaceHold-0.85); > >>> > >>> rotate([90, 180, 180]) // Markering bakkant (höger under) > >>> ovalCableHole(widthHold-spaceHold/2-offset1, -1.75, > -spaceHold-0.85); > >>> > >>> rotate([90, -180, 90]) // Markering ena sidan (höger under) > >>> ovalCableHole(3.75, -1.75, widthHold-0.1); > >>> } > >>> } // Slut union - kropp > >>> > >>> translate([-offset1/2, -spaceHold+pad, -pad]) // hålet där > switchen ska placeras > >>> cube([holeW, holeD+pad, holeH+pad], center=false); > >>> > >>> translate([4, 12, 0]) > >>> cylinder(h=15,d=3.2); > >>> translate([4, 12, 17.7]) > >>> sphere(r=6); > >>> > >>> translate([29.6, 12, 0]) > >>> cylinder(h=15,d=3.2); > >>> translate([29.6, 12, 17.7]) > >>> sphere(r=6); > >>> > >>> /* // Hål genom lock bak - om så önskas > >>> translate([box_l/2-thick, -6, offset1/2]) > >>> cylinder(h=box_h+thick*4+offset1, d=3.2, $fn=100); // hål > genom lock bak > >>> > >>> translate([box_l/2-thick, -6, 17.7]) > >>> sphere(r=6); // kona hålet bak > >>> */ > >>> } // Slut difference() - box > >>> > >>> difference() > >>> { union() > >>> { translate([29.6, 12, heightHold-offset1*2]) > >>> cylinder(h=2,d=5.2); // Stödhylsa för Switchskruv1 > >>> translate([4, 12, heightHold-offset1*2]) > >>> cylinder(h=2,d=5.2); // Stödhylsa för Switchskruv2 > >>> > >>> translate([holeW/2, -spaceHold+thick+1, holeH/2]) > >>> rotate([180,0,0]) > >>> backHole(); > >>> } // union - slut > >>> > >>> translate([4, 12, 0]) // Hålen i stödhylsorna > >>> cylinder(h=15,d=3.2); > >>> > >>> translate([29.6, 12, 0]) // Hålen i stödhylsorna > >>> cylinder(h=15,d=3.2); > >>> > >>> translate([box_l/2-thick, -6, -offset1]) // hål i stödhylsa bak > >>> cylinder(h=box_h+offset1, d=3.2, $fn=100); > >>> > >>> // Sänk stödhylsan > >>> translate([ widthHold/2-7, -spaceHold-offset1, -thick+offset1]) > // hål i stödhylsa bak > >>> cube([15, 8, 3]); > >>> > >>> > >>> // kabelmarkering > >>> // translate([0, 0, 0]) // hål i stödhylsa bak > >>> > >>> > >>> } > >>> > >>> > >>> > >>> > >>> > >>> > >>> /* > >>> translate([4, 12, 0]) > >>> #cylinder(h=15,d=3.2); > >>> //translate([4, 13.5, 17.3]) > >>> //#sphere(r=6); > >>> > >>> translate([29.6, 12, 0]) > >>> #cylinder(h=15,d=3.2); > >>> //translate([29.6, 13.5, 17.3]) > >>> //#sphere(r=6); > >>> */ > >>> > >>> > >>> } > >>> > >>> module backHole() > >>> { wallH = 10.5; > >>> > >>> wide1 = 12; // endast runt cylindern > >>> wide2 = 35; // hela väggen > >>> deep1 = 4; > >>> height1 = 10.5; > >>> cornRad1 = 2; > >>> diam1 = 8; > >>> opt1 = 0.1; > >>> > >>> //rundadFot(); > >>> > >>> > >>> // Rundad stäcka mellan t.ex. vägg och tak -bakkant > >>> translate([wide2/2, diam1/2-cornRad1/2, -height1/2]) > >>> { rotate([90, 0, -90]) > >>> { linear_extrude(wide2) > >>> { difference() > >>> { square([cornRad1, cornRad1]); > >>> > >>> translate([cornRad1, cornRad1]) > >>> circle(r=cornRad1); > >>> } > >>> } > >>> } > >>> } > >>> > >>> // rundad stäcka1 (vänster) mellan t.ex. vägg och tak > >>> translate([-wide2/2+0.15, deep1/2+cornRad1/2, -height1/2]) > >>> rotate([90, 0, 0]) > >>> { linear_extrude(spaceHold) > >>> { difference() > >>> { square([cornRad1, cornRad1]); > >>> > >>> translate([cornRad1, cornRad1]) > >>> circle(r=cornRad1); > >>> } > >>> } > >>> } > >>> > >>> // rundad stäcka2 mellan t.ex. vägg och tak > >>> translate([wide2/2-0.65, deep1/2+cornRad1/2, -height1/2]) > >>> rotate([0, -90, 90]) > >>> { linear_extrude(spaceHold) > >>> { difference() > >>> { square([cornRad1, cornRad1]); > >>> > >>> translate([cornRad1, cornRad1]) > >>> circle(r=cornRad1); > >>> } > >>> } > >>> } > >>> > >>> // Skapa stödfot - bak > >>> difference() > >>> { union() > >>> { //själva cylindern > >>> translate([0, 1, 0]) > >>> { cylinder(h=height1, d=diam1, center=true); > >>> translate([0, diam1/2, 0]) > >>> cube([diam1,diam1-1,height1], center=true); > >>> } > >>> > >>> // Rundad fot under cylinder ovan > >>> translate([0, 1, -height1/2]) > >>> { rotate_extrude() > >>> { translate([diam1/2, 0, 0]) > >>> { difference() > >>> { square([cornRad1, cornRad1]); > >>> > >>> translate([cornRad1, cornRad1]) > >>> circle(r=cornRad1); > >>> } > >>> } > >>> } > >>> } > >>> > >>> // Rundad rakstäcka1 - cylinderfot - mellan t.ex. vägg och tak > >>> translate([diam1/2, diam1, -height1/2]) > >>> { rotate([90, 0, 0]) > >>> { linear_extrude(diam1) > >>> { difference() > >>> { square([cornRad1, cornRad1]); > >>> > >>> translate([cornRad1, cornRad1]) > >>> circle(r=cornRad1); > >>> } > >>> } > >>> } > >>> } > >>> > >>> // Rundad rakstäcka2 - cylinderfot - mellan t.ex. vägg och tak > >>> translate([-diam1/2, diam1, -height1/2]) > >>> { rotate([0, -90, 90]) > >>> { linear_extrude(diam1) > >>> { difference() > >>> { square([cornRad1, cornRad1]); > >>> > >>> translate([cornRad1, cornRad1]) > >>> circle(r=cornRad1); > >>> } > >>> } > >>> } > >>> } > >>> > >>> //väggen bakom cylindern som ska rundas > >>> translate([0, diam1/2-cornRad1, 0]) > >>> cube([wide1, cornRad1, height1], center=true); > >>> > >>> } > >>> > >>> > >>> // Avrunda hörn1 bak > >>> translate([-wide1/2, cornRad1/2, cornRad1]) > >>> { hull() > >>> { cylinder(h=height1+opt1, r=cornRad1, center=true); > >>> { translate([0, 0, -height1/2]) > >>> sphere(r=cornRad1); > >>> } > >>> } > >>> } > >>> > >>> // Avrunda hörn2 bak > >>> translate([wide1/2, cornRad1/2, cornRad1]) > >>> { hull() > >>> { cylinder(h=height1+opt1, r=cornRad1, center=true); > >>> { translate([0, 0, -height1/2]) > >>> sphere(r=cornRad1); > >>> } > >>> } > >>> } > >>> > >>> > >>> // Plocka bort rundad fot bak samt det som sticker ut > >>> translate([-wide1/2, diam1/2-cornRad1/2, -height1/2-opt1]) > >>> cube([wide1, diam1/2+cornRad1, height1+opt1*2], center=false); > >>> > >>> } > >>> } > >>> > >>> > >>> > >>> > >>> > >>> module ovalCableHole(posX, posY, posZ) > >>> { // Hål 5.5 x 3.5 mm > >>> pan = 0.1; > >>> cableHi = 1.5; > >>> > >>> translate([posX, posY, posZ]) > >>> { color("white") > >>> { translate([0, 0, -pan]) > >>> { cylinder(h=cableHi, d=3.5); > >>> //#translate([0, 0, 0]) cylinder(h=10, d=1); > >>> //translate([0, 0, -1]) cylinder(h=1, d1=0, d2=1); > >>> //translate([0, 0, 0]) sphere(d=1); // Inre kulan > >>> //translate([0, 0, 1.5]) sphere(d=1); // Inre kulan > >>> > >>> translate([0, 0, -1]) sphere(d=0.8); // yttre kulan > >>> translate([0, 0, 2.5]) sphere(d=0.8); // yttre kulan > >>> > >>> } > >>> translate([2, 0, -pan]) > >>> { cylinder(h=cableHi, d=3.5); > >>> // #translate([0, 0, -cableHi*2]) cylinder(h=10, d=0.5); > >>> //translate([0, 0, 0]) sphere(d=1); // Inre kulan > >>> //translate([0, 0, 1.5]) sphere(d=1); // Inre kulan > >>> > >>> translate([0, 0, -1]) sphere(d=0.8); // yttre kulan > >>> translate([0, 0, 2.5]) sphere(d=0.8); // yttre kulan > >>> > >>> } > >>> translate([-3.5/2, 0, -pan]) > >>> cube([5.5, 3.5/2, cableHi]); > >>> translate([-0.25, -1.74, -pan]) > >>> cube([2.5, 1.75, cableHi]); > >>> } > >>> } > >>> } > >>> > >>> > >>> > >>> > >>> > >>> > >>> module rundadFot() > >>> { > >>> // specifika värden för skruvdistansen bak > >>> wallH = 10.5; > >>> > >>> wide1 = 12; // endast runt cylindern > >>> wide2 = 34; // hela väggen > >>> deep1 = 4; > >>> height1 = 10; > >>> cornRad1 = 2; > >>> diam1 = 8; > >>> opt1 = 0.1; > >>> > >>> > >>> color("magenta") > >>> { translate([0, 0, wallH]) > >>> { difference() > >>> { union() > >>> { // Bakgavel > >>> translate([wide2/2, opt1, height1/2]) > >>> { rotate([90, 180, 0]) > >>> cube([wide2, height1, opt1]); > >>> } > >>> > >>> // Golv > >>> translate([wide2/2, -height1+opt1, -height1/2]) > >>> rotate([0, 180, 0]) > >>> cube([wide2, height1, opt1]); > >>> > >>> //väggen bakom cylindern som kan rundas > >>> translate([0, -cornRad1/2, 0]) > >>> cube([wide1, cornRad1, height1], center=true); > >>> > >>> //själva cylindern > >>> translate([0, -cornRad1/2, 0]) > >>> cylinder(h=height1, d=diam1, center=true); > >>> > >>> // Rundad fot under cylinder ovan > >>> translate([0, -cornRad1/2, -height1/2]) > >>> { rotate_extrude() > >>> { translate([diam1/2, 0, 0]) > >>> { difference() > >>> { square([cornRad1, cornRad1]); > >>> > >>> translate([cornRad1, cornRad1]) > >>> circle(r=cornRad1); > >>> } > >>> } > >>> } > >>> } > >>> > >>> // Rundad stäcka mellan t.ex. vägg och tak -bakkant > >>> translate([wide2/2, 0, -height1/2]) > >>> { rotate([90, 0, -90]) > >>> { linear_extrude(wide2) > >>> { difference() > >>> { square([cornRad1, cornRad1]); > >>> > >>> translate([cornRad1, cornRad1]) > >>> circle(r=cornRad1); > >>> } > >>> } > >>> } > >>> } > >>> > >>> // rundad stäcka mellan t.ex. vägg och tak -sida1 > >>> translate([-wide2/2, 0, -height1/2]) > >>> { rotate([90, 0, 0]) > >>> { linear_extrude(10) > >>> { difference() > >>> { square([cornRad1, cornRad1]); > >>> > >>> translate([cornRad1, cornRad1]) > >>> circle(r=cornRad1); > >>> } > >>> } > >>> } > >>> } > >>> > >>> // rundad stäcka mellan t.ex. vägg och tak -sida2 > >>> translate([wide2/2, -10, -height1/2]) > >>> { rotate([90, 0, 180]) > >>> { linear_extrude(10) > >>> { difference() > >>> { square([cornRad1, cornRad1]); > >>> > >>> translate([cornRad1, cornRad1]) > >>> circle(r=cornRad1); > >>> } > >>> } > >>> } > >>> } > >>> } // Avsluta union = = = = = = = = = = = = = = = = = = = = > >>> > >>> > >>> // Avrunda hörn1 bak > >>> translate([-wide1/2+opt1*1.3, -deep1/2, cornRad1]) > >>> { cylinder(h=height1+opt1, r=cornRad1, center=true); > >>> translate([0, 0, -height1/2]) > >>> sphere(r=cornRad1); > >>> } > >>> > >>> // Avrunda hörn2 bak > >>> translate([wide1/2-opt1*1.3, -deep1/2, cornRad1]) > >>> { cylinder(h=height1+opt1, r=cornRad1, center=true); > >>> translate([0, 0, -height1/2]) > >>> sphere(r=cornRad1); > >>> } > >>> > >>> // Plocka bort rundad fot bak samt det som sticker ut > >>> translate([-wide1/2, 0, -height1/2-opt1]) > >>> cube([wide1, diam1/2+cornRad1, height1+opt1*2], > center=false); > >>> } > >>> } > >>> } > >>> } > >>> > >>> > >>> > >>> > >>> > >>> > >>> > >>> > >>> module mainBox(box_l, box_w, box_h, spaceHold, round_r, thick, smooth, > pad) > >>> { translate([box_l/2-thick-offset1/2, box_w/2-spaceHold, box_h/2]) > >>> { > >>> // To fix the corners cut the main cube with smaller cubes with > spheres removed > >>> difference() > >>> { cube([box_l, box_w, box_h], center = true); > >>> > >>> // Kant1 - liggande > >>> translate([0, -box_w/2+round_r, box_h/2-round_r]) > >>> { difference() > >>> { translate([0,-round_r-pad,round_r+pad]) > >>> cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center = > true); > >>> rotate(a=[0,90,0]) > >>> > cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth); > >>> } > >>> } > >>> // Kant2 - liggande > >>> translate([0, box_w/2-round_r, box_h/2-round_r]) > >>> { difference() > >>> { translate([0,round_r+pad,round_r+pad]) > >>> cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center = > true); > >>> rotate(a=[0,90,0]) > >>> > cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth); > >>> } > >>> } > >>> /* > >>> // Kant3 - liggande > >>> translate([0, -box_w/2+round_r, -box_h/2+round_r]) > >>> { difference() > >>> { translate([0,-round_r-pad,-round_r-pad]) > >>> cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center = > true); > >>> rotate(a=[0,90,0]) > >>> > cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth); > >>> } > >>> } > >>> > >>> // Kant4 - liggande > >>> translate([0, box_w/2-round_r, -box_h/2+round_r]) > >>> { difference() > >>> { translate([0,round_r+pad,-round_r-pad]) > >>> cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center = > true); > >>> rotate(a=[0,90,0]) > >>> > cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth); > >>> } > >>> } > >>> */ > >>> // ---- > >>> // Kant1 - stående > >>> translate([-box_l/2+round_r, box_w/2-round_r, 0]) > >>> { difference() > >>> { translate([-round_r-pad,round_r+pad,0]) > >>> cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center = > true); > >>> cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth); > >>> } > >>> } > >>> // Kant2 - stående > >>> translate([box_l/2-round_r, box_w/2-round_r, 0]) > >>> { difference() > >>> { translate([round_r+pad,round_r+pad,0]) > >>> cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center = > true); > >>> cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth); > >>> } > >>> } > >>> // Kant3 - stående > >>> translate([-box_l/2+round_r, -box_w/2+round_r, 0]) > >>> { difference() > >>> { translate([-round_r-pad,-round_r-pad,0]) > >>> cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center = > true); > >>> cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth); > >>> } > >>> } > >>> // Kant4 - stående > >>> translate([box_l/2-round_r, -box_w/2+round_r, 0]) > >>> { difference() > >>> { translate([round_r+pad,-round_r-pad,0]) > >>> cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center = > true); > >>> cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth); > >>> } > >>> } > >>> > >>> // ---- > >>> // Kant1 liggande (andra hållet) > >>> translate([-box_l/2+round_r, 0, box_h/2-round_r]) > >>> { difference() > >>> { translate([-round_r-pad, 0, round_r+pad]) > >>> cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center = > true); > >>> rotate(a=[0,90,90]) > >>> > cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth); > >>> } > >>> } > >>> // Kant2 liggande (andra hållet) > >>> translate([box_l/2-round_r, 0, box_h/2-round_r]) > >>> { difference() > >>> { translate([round_r+pad, 0, round_r+pad]) > >>> cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center = > true); > >>> rotate(a=[0,90,90]) > >>> > cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth); > >>> } > >>> } > >>> /* > >>> // Kant3 liggande (andra hållet) > >>> translate([-box_l/2+round_r, 0, -box_h/2+round_r]) > >>> { difference() > >>> { translate([-round_r-pad, 0, -round_r-pad]) > >>> cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center = > true); > >>> rotate(a=[0,90,90]) > >>> > cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth); > >>> } > >>> } > >>> > >>> // Kant4 liggande (andra hållet) > >>> translate([box_l/2-round_r, 0, -box_h/2+round_r]) > >>> { difference() > >>> { translate([round_r+pad, 0, -round_r-pad]) > >>> cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center = > true); > >>> rotate(a=[0,90,90]) > >>> > cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth); > >>> } > >>> } > >>> */ > >>> // ---- > >>> // Hörn1 (övre) > >>> translate([box_l/2-round_r, box_w/2-round_r, box_h/2-round_r]) > >>> { difference() > >>> { translate([round_r+pad, round_r+pad, round_r+pad]) > >>> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center > = true); > >>> sphere(round_r,$fn=smooth); > >>> } > >>> } > >>> // Hörn2 (övre) > >>> translate([-box_l/2+round_r, box_w/2-round_r, box_h/2-round_r]) > >>> { difference() > >>> { translate([-round_r-pad, round_r+pad, round_r+pad]) > >>> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center > = true); > >>> sphere(round_r,$fn=smooth); > >>> } > >>> } > >>> // Hörn3 (övre) > >>> translate([box_l/2-round_r, -box_w/2+round_r, box_h/2-round_r]) > >>> { difference() > >>> { translate([round_r+pad, -round_r-pad, round_r+pad]) > >>> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center > = true); > >>> sphere(round_r,$fn=smooth); > >>> } > >>> } > >>> // Hörn4 (övre) > >>> translate([-box_l/2+round_r, -box_w/2+round_r, box_h/2-round_r]) > >>> { difference() > >>> { translate([-round_r-pad, -round_r-pad, round_r+pad]) > >>> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center > = true); > >>> sphere(round_r,$fn=smooth); > >>> } > >>> } > >>> /* > >>> // Hörn1 (undre) > >>> translate([box_l/2-round_r, box_w/2-round_r, -box_h/2+round_r]) > >>> { difference() > >>> { translate([round_r+pad, round_r+pad, -round_r-pad]) > >>> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center > = true); > >>> sphere(round_r,$fn=smooth); > >>> } > >>> } > >>> // Hörn2 (undre) > >>> translate([-box_l/2+round_r, box_w/2-round_r, -box_h/2+round_r]) > >>> { difference() > >>> { translate([-round_r-pad, round_r+pad, -round_r-pad]) > >>> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center > = true); > >>> sphere(round_r,$fn=smooth); > >>> } > >>> } > >>> // Hörn3 (undre) > >>> translate([box_l/2-round_r, -box_w/2+round_r, -box_h/2+round_r]) > >>> { difference() > >>> { translate([round_r+pad, -round_r-pad, -round_r-pad]) > >>> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center > = true); > >>> sphere(round_r,$fn=smooth); > >>> } > >>> } > >>> // Hörn4 (undre) > >>> translate([-box_l/2+round_r, -box_w/2+round_r, -box_h/2+round_r]) > >>> { difference() > >>> { translate([-round_r-pad, -round_r-pad, -round_r-pad]) > >>> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center > = true); > >>> sphere(round_r,$fn=smooth); > >>> } > >>> } > >>> */ > >>> } > >>> } > >>> } > >>> // > >>> > >>> > >>> > >>> > >>> > >>> > >>> > >>> > >>> > >>> > >>> module cableHolder3(posX, posY, posZ, length, width, height, radius) > >>> { // Skapa toppen över switchen > >>> // mått på Switchen > >>> fn = 96; // upplösning (endast bågen?) > >>> heightHold = 10.5; > >>> widthHold = 33.5; > >>> depthHold = 23.5; > >>> holdRadie = 1.5; // radie i hörnen > >>> thick = 1.5; // tjocklek > >>> > >>> > >>> translate([0,-thick,0]) > >>> { > >>> difference(0, 0, 0) > >>> { hull() > >>> { difference() > >>> { translate([thick, 0, heightHold]) // vänster kant > >>> { rotate([-90, 0, 0]) > >>> { cylinder(h=depthHold, d=thick*2); > >>> translate([0, 0, depthHold]) > >>> sphere(d=thick*2); // längst fram > >>> } > >>> } > >>> translate([0, -0.1, heightHold]) // plocka bort underdelen > >>> rotate([-90, 0, 0]) > >>> cube([thick*2, thick+.1, depthHold+thick+.1]); > >>> } > >>> > >>> difference() > >>> { translate([widthHold-thick, 0, heightHold]) // höger kant > >>> { rotate([-90, 0, 0]) > >>> { cylinder(h=depthHold, d=thick*2); > >>> translate([0, 0, depthHold]) > >>> sphere(d=thick*2); // längst fram > >>> } > >>> } > >>> translate([widthHold-thick*2, -0.1, heightHold]) // plocka > bort underdelen > >>> { rotate([-90, 0, 0]) > >>> cube([thick*2, thick+.1, depthHold+thick+.1]); > >>> } > >>> } > >>> } > >>> > >>> // öppna hålen för monteringsskruvarna uppe på plattan > >>> translate([4, 13.5, 0]) > >>> cylinder(h=15,d=3.2); > >>> translate([4, 13.5, 17.3]) > >>> sphere(r=6); > >>> > >>> translate([29.6, 13.5, 0]) > >>> cylinder(h=15,d=3.2); > >>> > >>> translate([29.6, 13.5, 17.3]) > >>> sphere(r=6); > >>> } > >>> > >>> // halvbåge 1 bak > >>> translate([thick, 0, heightHold/2+thick/2]) > >>> rotate([0, 90, 180]) > >>> rotate_extrude(angle = 180, convexity=20, $fn=64) > >>> translate([heightHold/2-thick/2, 0, 0]) > >>> circle(d=thick*2); > >>> translate([thick, 0, heightHold]) > >>> sphere(d=thick*2); // övre kulan > >>> translate([thick, 0, thick]) > >>> sphere(d=thick*2); // undre kulan > >>> > >>> > >>> // halvbåge 2 bak > >>> translate([widthHold-thick, 0, heightHold/2+thick/2]) > >>> rotate([0, 90, 180]) > >>> rotate_extrude(angle = 180, convexity=20, $fn=64) > >>> translate([heightHold/2-thick/2, 0, 0]) > >>> circle(d=thick*2); > >>> translate([widthHold-thick, 0, heightHold]) > >>> sphere(d=thick*2); // övre kulan > >>> translate([widthHold-thick, 0, thick]) > >>> sphere(d=thick*2); // undre kulan > >>> > >>> // en cylinder tvärsöver längst upp > >>> translate([thick, 0, heightHold]) > >>> { rotate([0,90,0]) > >>> cylinder(h=widthHold-thick*2, r=thick); > >>> } > >>> } > >>> > >>> // Halvbågen (kabelhållaren) på baksidan switchen > >>> translate([widthHold-thick, -thick, heightHold/2+thick/2]) > >>> { rotate([0,90,180]) > >>> linear_extrude(widthHold-thick*2) > >>> arc(heightHold/2-thick/2, [0, 180], thick, fn); //radius, > angles, width, fn) > >>> } > >>> // en cylinder tvärsöver längst ned > >>> translate([thick, -thick, thick]) > >>> { rotate([0,90,0]) > >>> cylinder(h=widthHold-thick*2, r=thick); > >>> } > >>> } > >>> > >>> > >>> > >>> module switch(posX=0, posY=0, posZ=0) > >>> { buttRadie = 1.5; > >>> height = 10.5; > >>> width = 33.5; > >>> depth = 23.5; > >>> h1x = buttRadie; > >>> h1y = buttRadie; > >>> h2x = width-buttRadie; > >>> h2y = buttRadie; > >>> h3x = width-buttRadie; > >>> h3y = depth-buttRadie; > >>> h4x = buttRadie; > >>> h4y = depth-buttRadie; > >>> > >>> translate([posX, posY, posZ]) > >>> { difference() > >>> { color("#F9F9F3") > >>> // tryck-knappen > >>> union() > >>> { translate([width/2, depth+6-0.1, height/2]) > >>> { rotate([90, 0, 0]) > >>> { translate([0,0,6]) > >>> circle(d=6.8); // skuggan runt knapp > >>> cylinder(h=6, d=6); > >>> sphere(d=6); > >>> } > >>> } > >>> > >>> hull() // Switchkropp > >>> { translate([h1x, h1y]) > >>> cylinder(h=height, r=1.5); > >>> translate([h2x, h2y]) > >>> cylinder(h=height, r=1.5); > >>> translate([h3x, h3y]) > >>> cylinder(h=height, r=1.5); > >>> translate([h4x, h4y]) > >>> cylinder(h=height, r=1.5); > >>> } > >>> } > >>> > >>> // Skruvhålen för switchen > >>> hole( 4, 12, 0, "#FFD700", height); > >>> hole(29.6, 12, 0, "#FFD700", height); > >>> // hole( 4, 12, 0, "#FFD700", 50); > >>> // hole(29.6, 12, 0, "#FFD700", 50); > >>> // hål för kablar bak > >>> color("gray") > >>> { translate([9.5, 16, height/2]) > >>> { rotate([90, 0, 0]) > >>> cylinder(h=16.5, d=4); > >>> } > >>> translate([24.5, 16, height/2]) > >>> { rotate([90, 0, 0]) > >>> cylinder(h=16.5, d=4); > >>> } > >>> } > >>> > >>> // hål för kabelskruvar > >>> color("white") > >>> { translate([29.5, 17.1, height/2]) > >>> { rotate([0, 90, 0]) > >>> cylinder(h=4.1, d=4.5); > >>> } > >>> translate([-0.1, 17.1, height/2]) > >>> { rotate([0, 90, 0]) > >>> cylinder(h=4.1, d=4.5); > >>> } > >>> } > >>> } > >>> > >>> // Kabelskruvar > >>> cableScrew(3, 17, height/2, 90); > >>> cableScrew(31, 17, height/2, -90); > >>> > >>> } > >>> } > >>> > >>> // Skruven som håller fast kabeln i switchen > >>> module cableScrew(posX=0, posY=0, posZ=0, angle=0) > >>> { color("#FFD700") // mässing > >>> translate([posX, posY, posZ]) > >>> { rotate([0, 0, angle]) > >>> { difference() > >>> { // skruvskalle > >>> translate([0, 0, 0]) > >>> rotate([90, 0, 0]) > >>> cylinder(h=2, d1=4, d2=3.5); > >>> > >>> // stjärnan i skruven > >>> translate([0, 1.85, -.25]) > >>> rotate([0, 0, 0]) > >>> cylinder(h=0.5, d=5); > >>> translate([-0.25, -.6, 2.25]) > >>> rotate([0, 90, 0]) > >>> cube([4.5, 2, 0.5]); > >>> } > >>> } > >>> } > >>> } > >>> > >>> > >>> > >>> // borrhål > >>> module hole(posX=0, posY=0, posZ=0, colorName="yellow", height) > >>> { diamHole1 = 3; > >>> highHole1 = height; > >>> diamHole2 = 6; > >>> highHole2 = 2.5; > >>> offs=0.1; > >>> > >>> color(colorName) > >>> { > >>> translate([posX, posY, posZ]) > >>> { translate([0, 0, 0]) > >>> cylinder(h=highHole1, d=diamHole1); > >>> translate([0, 0, -offs]) > >>> cylinder(h=highHole2, d=diamHole2); > >>> translate([0, 0, height-highHole2+offs]) > >>> cylinder(h=highHole2, d=diamHole2); > >>> } > >>> } > >>> } > >>> > >>> module showCables() > >>> { translate([-25,8,24]) > >>> rotate([80,177,90]) > >>> cable(10,10,0,"brun"); > >>> translate([-43,8,15]) > >>> rotate([90,180,90]) > >>> cable(10,10,0,"blå"); > >>> } > >>> > >>> > >>> module cable(posX=0, posY=0, posZ=0, colorName="blå", radius=1.26, > width=0.62, thick=50, fn=24) > >>> { // default 1.5mm2 > >>> // radius = inner radie > >>> // width = bredd/tjocklek på cirkeln (inte höjd) > >>> // thick = höjd på cirken/ röret > >>> // pin= > >>> > >>> colCupper = "#D7715A"; > >>> colGreen = "#07DA63"; > >>> colYellow = "#FFCC00"; > >>> > >>> if (colorName=="gröngul") > >>> { translate([posX, posY, posZ]) > >>> { color(colGreen) > >>> linear_extrude(thick) > >>> arc(radius, [0, 60], width, fn); > >>> color(colYellow) > >>> linear_extrude(thick) > >>> arc(radius, [60, 180], width, fn); > >>> color(colGreen) > >>> linear_extrude(thick) > >>> arc(radius, [180, 240], width, fn); > >>> color(colYellow) > >>> linear_extrude(thick) > >>> arc(radius, [240, 360], width, fn); > >>> > >>> color(colCupper) > >>> linear_extrude(10, center=true, convexity=10, $fn=100) > >>> circle(d=1.24); > >>> } > >>> } > >>> else // vanliga kablar 1.5mm2 > >>> { > >>> cableColor = colorName == "blå" ? "#1870D5" > >>> : colorName == "brun" ? "#9C6137" > >>> : colorName == "svart" ? "#000000" > >>> : assert(false,"invalid color value"); // message if > no case worked > >>> // : nodef > >>> > >>> translate([posX, posY, posZ]) > >>> { //el kabel - ena änden rak - andra böjd > >>> color(colCupper) //kopparstump tråd rakkabel > >>> linear_extrude(10, center=true, convexity=10, $fn=100) > >>> circle(d=1.24); > >>> > >>> color(cableColor) > >>> { cylinder(h=thick, r=radius); > >>> > >>> translate([-radius*2, 0, thick]) // kabelböj > >>> rotate([90, 0, 0]) > >>> rotate_extrude(angle=90, convexity=20) > >>> translate([2.5, 0, 0]) > >>> circle(r=1.26); > >>> > >>> translate([-radius*2, 0, thick+radius*2]) > >>> rotate([0, -90, 0]) > >>> cylinder(h=5, r=radius); > >>> } > >>> translate([-10, 0, thick+radius*2]) > >>> { rotate([0, -90, 0]) > >>> { color(colCupper) > >>> { linear_extrude(5, center=true, convexity=10, $fn=100) > >>> circle(d=1.24); > >>> } > >>> } > >>> } > >>> } > >>> } > >>> } > >>> > >>> > >>> // > ====================================================================== > >>> module arc(radius, angles, width = 1, fn = 24) { > >>> difference() { > >>> sector(radius + width, angles, fn); // ytterradie > >>> sector(radius, angles, fn); // innerradie (plockar > bort invändigt > >>> } > >>> } > >>> > >>> module sector(radius, angles, fn = 24) { > >>> r = radius / cos(180 / fn); > >>> step = -360 / fn; > >>> > >>> points = concat([[0, 0]], > >>> [for(a = [angles[0] : step : angles[1] - 360]) > >>> [r * cos(a), r * sin(a)] > >>> ], > >>> [[r * cos(angles[1]), r * sin(angles[1])]] > >>> ); > >>> > >>> difference() { > >>> circle(radius, $fn = fn); > >>> polygon(points); > >>> } > >>> } > >>> = = END product 2 = = = = = = = = = = = = = = = = = = = = = = = = = = > = = = = > >>> - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ > . - . _ . - . _ . - . _ . - . _ . - > >>> > >>> > >>> Den fredag 6 maj 2022 14:06:55 CEST, Michael Möller < > private2michael@gmail.com> skrev: > >>> > >>> > >>> > >>> OpenSCAD code - is a description of your model in terms of a few > cylinder/cubes added and cut out > >>> difference() { > >>> cylinder(d=5,h=10); > >>> translate([0,10,0]) cube([4,6,2]) ; > >>> } > >>> > >>> STL file is a list of triangles which make the same outer shell as > your model. OpenSCAD makes this complicated transform from shapes to > triangles. > >>> solid OpenSCAD_Model > >>> facet normal 0.92388 0.382682 0 > >>> outer loop > >>> vertex 2.5 0 3 > >>> vertex 1.76777 1.76777 0 > >>> vertex 1.76777 1.76777 3 > >>> endloop > >>> endfacet > >>> facet normal 0.92388 0.382682 0 > >>> outer loop > >>> vertex 1.76777 1.76777 0 > >>> vertex 2.5 0 3 > >>> vertex 2.5 0 0 > >>> endloop > >>> endfacet > >>> : (and so on for 300 lines) There is a binary/compressed version, > but the description is still just triangles. > >>> > >>> Gcode is what a 3D printer understands - it is the exact list of moves > that the head has to do with how much plastic to squeeze to trace the > outline of your shape, layer, by layer. It will optionally create moves for > filling the inside or support for overhangs. Such a program is called a > SLICER and the printer will come with one. > >>> G92 E0 ; reset extrusion distance > >>> G1 Z2.330 F6600.000 ; lift Z > >>> G1 X-0.000 Y1.505 F6600.000 ; move to first perimeter point > >>> G1 Z0.330 F6600.000 ; restore layer Z > >>> G1 E3.00000 F2400.00000 ; unretract extruder 0 > >>> G1 F1500 > >>> G1 X-1.064 Y1.064 E3.09259 ; perimeter > >>> G1 X-1.505 Y0.000 E3.18517 ; perimeter > >>> : (many similar lines) > >>> G1 X1.515 Y1.515 E4.65860 ; perimeter > >>> G1 X0.055 Y2.120 E4.78559 ; perimeter > >>> G1 X-0.000 Y2.143 F6600.000 ; move inwards before travel > >>> G1 X0.384 Y0.843 F6600.000 ; move to first infill point > >>> G1 F1500 > >>> G1 X0.843 Y0.384 E4.84815 ; infill > >>> G1 X1.097 Y-0.229 E4.91215 ; infill > >>> : > >>> (and so on for thousands of lines) > >>> > >>> The 3MF still basically deals in triangles, and attributes (surface, > infill material, picture, ticket info ... ) which probably are not used by > your slicer/printer. > >>> > >>> On Fri, 6 May 2022 at 12:37, Jan Öhman via Discuss < > discuss@lists.openscad.org> wrote: > >>> > >>> > >>> > >>> > >>> ---------- Forwarded message ---------- > >>> From: "Jan Öhman" <jan_ohman@yahoo.com> > >>> To: OpenSCAD General Discussion <discuss@lists.openscad.org> > >>> Cc: > >>> Bcc: > >>> Date: Fri, 6 May 2022 10:38:46 +0000 (UTC) > >>> Subject: [OpenSCAD] Export to .STL / .3MF for later 3D-printing. > >>> Hi! > >>> > >>> Thought to create some objects in openSCAD, to print later. > >>> I do not have my own 3D printer (yet). > >>> > >>> One I talked to, wanted to get the drawings in .STL or .3MF. (I don't > know the difference). > >>> > >>> If I had my own printer, have I been able to print directly from > openSCAD? > >>> (Without some export?) > >>> > >>> In the openSCAD, no errors or problems occur. > >>> but > >>> The drawings I tested to export from openSCAD have given one or > another error message. > >>> One message .: > >>> WARNING: Object may not be a valid 2-manifold and may need repair! > >>> > >>> Another message .: > >>> WARNING: No top level geometry to render > >>> > >>> What to do? > >>> > >>> > >>> > >>> ---------- Forwarded message ---------- > >>> From: "Jan Öhman via Discuss" <discuss@lists.openscad.org> > >>> To: OpenSCAD General Discussion <discuss@lists.openscad.org> > >>> Cc: "Jan Öhman" <jan_ohman@yahoo.com> > >>> Bcc: > >>> Date: Fri, 6 May 2022 10:38:46 +0000 (UTC) > >>> Subject: [OpenSCAD] Export to .STL / .3MF for later 3D-printing. > >>> _______________________________________________ > >>> OpenSCAD mailing list > >>> To unsubscribe send an email to discuss-leave@lists.openscad.org > >>> > >>> _______________________________________________ > >>> OpenSCAD mailing list > >>> To unsubscribe send an email to discuss-leave@lists.openscad.org > >>> > >>> > >>> > >>> ---------- Forwarded message ---------- > >>> From: "Jan Öhman via Discuss" <discuss@lists.openscad.org> > >>> To: OpenSCAD general discussion <discuss@lists.openscad.org> > >>> Cc: "Jan Öhman" <jan_ohman@yahoo.com> > >>> Bcc: > >>> Date: Sat, 7 May 2022 11:04:31 +0000 (UTC) > >>> Subject: [OpenSCAD] Re: Export to .STL / .3MF for later 3D-printing. > >>> _______________________________________________ > >>> OpenSCAD mailing list > >>> To unsubscribe send an email to discuss-leave@lists.openscad.org > >> > >> _______________________________________________ > >> OpenSCAD mailing list > >> To unsubscribe send an email to discuss-leave@lists.openscad.org > > > > _______________________________________________ > > OpenSCAD mailing list > > To unsubscribe send an email to discuss-leave@lists.openscad.org > _______________________________________________ > OpenSCAD mailing list > To unsubscribe send an email to discuss-leave@lists.openscad.org >
Jan Öhman
Sat, May 7, 2022 9:38 PM

Thanks every one.
I understand that Adrian Mariano has an explanation (probably pretty good).But still do not understand what to do in my case.
"...It has a 2d polygon (easily found as there is one lonepolygon call) that needs to be removed "I think it is the polygon call in the moule Box that it is referenced.
But if I delete the polygon call, that structure will disappear ... or ...?

"or linear_extruded" I don't understand...
"And it makes use of path_sweep in a manner that producesa self-intersecting polyhedron."
Now it will be very difficult - I think

"This issue is explained in the manual page for path_sweep."
OK!

"This can be fixed either by switching to path_extrude2d() or
by changing the corner radius to eliminate the self-intersections."
"or changing to a profile that can actually be rounded at the desired radius."  Is this the same problem that is solved in another way?

Den lördag 7 maj 2022 19:50:51 CEST, Michael Möller <private2michael@gmail.com> skrev:  

Indeed you did Adrian, I was curious what that long code was going to produce.

Michael, fra mobilen
lør. 7. maj 2022 19.06 skrev Adrian Mariano avm4@cornell.edu:

I already gave a full explanation of what's wrong and how to fix the
first program.  It has a 2d polygon (easily found as there is one lone
polygon call) that needs to be removed or linear_extruded as
appropriate.  And it makes use of path_sweep in a manner that produces
a self-intersecting polyhedron.  This issue is explained in the manual
page for path_sweep.  This can be fixed either by switching to
path_extrude2d() or by changing the corner radius to eliminate the
self-intersections.   Or changing to a profile that can actually be
rounded at the desired radius.

https://github.com/revarbat/BOSL2/wiki/skin.scad#functionmodule-path_sweep

On Sat, May 7, 2022 at 12:57 PM Michael Möller
private2michael@gmail.com wrote:

Jan Öhman wrote it failed in Render/F6, but works in Preview/F5 - in so many words. I tried and got the following

First model

F6 Error: WARNING: Ignoring 2D child object for 3D operation in file , line 53

ERROR: CGAL error in CGALUtils::applyUnion3D: CGAL ERROR: assertion violation! Expr: G.mark(v1,0)==G.mark(v2,0)&& G.mark(v1,1)==G.mark(v2,1) File: /mxe/usr/x86_64-w64-mingw32.static.posix/include/CGAL/Nef_S2/SM_overlayer.h Line: 303

Which I think is pretty selfexplantory: Passed a 2D shape to something that expected a 3D shape - but you have to read the whole code to find it ... which I think Jan is more qualified to do :-)

2nd part

... which is one of those where zooming or rotating the model in preview takes >5 second

And I didn't bother waiting for the F6 error ... ;-)

Of course, we do not know if the above shapes I got are the ones that Jan wants - there are also sections of code commented out.

(From the comments it seems these are to be nice and alternative covers for wall outlet/switches.)

On Sat, 7 May 2022 at 18:26, Sanjeev Prabhakar sprabhakar2006@gmail.com wrote:

Quite a long code.
Can you paste a picture of what you are trying to draw.
Regards
Sanjeev

On Sat, 7 May 2022, 16:31 Jan Öhman via Discuss, discuss@lists.openscad.org wrote:

---------- Forwarded message ----------
From: "Jan Öhman" jan_ohman@yahoo.com
To: OpenSCAD general discussion discuss@lists.openscad.org
Cc:
Bcc:
Date: Sat, 7 May 2022 11:04:31 +0000 (UTC)
Subject: [OpenSCAD] Re: Export to .STL / .3MF for later 3D-printing.
Thank you!
Begins to understand how it works. (It was not easy...)

but my solution was not good ...

Here are 2 files that do not work to render (F6)

= = product 1= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

  • . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . -

include <BOSL2/std.scad>
fn = 150;

placering="left";
// placering="right"

box(0, 0, 0, placering, "#C0C0C0", fn); // (X, Y, Z, left/right, colorName)

// Monteringsplattan
// mountingPlate(0, 0, 0, placering);

// LED belysning
// LEDlampa(0, 0, 0, placering);

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - - - m o d u l e r - - - - - - - - - - - - - - - - - -

//

---================
//======  box 

---===
module box(posX=0, posY=0, posZ=0, mountSide="left", colorName="#00FF00", fn=24)
{
   side = mountSide == "left" ? 0
        : mountSide == "right" ? 1
        : assert(false,"invalid moutSide value");  // message if no case worked

   color(colorName)
   translate([posX, posY, posZ])
   mirror([side, 0, 0])
   difference()
   {
   union()
   {
   // Skapa konturer på bottenplattan - x, y, r, angles, [grader], början
   // Rotation medurs - vänster lamphållare (bakant saknas)
   points1 = circSect( 140,  0,   0, [0, 0], "right",  1, fn);  // böj nere till höger
   points2 = circSect(  60,  5,   5, [0, 5], "bottom",  1, fn); // brytpunkt längst ned
   points3 = circSect(  10, 13,  10, [0, 90], "bottom", 1, fn); // böj nere till vänster
   points4 = circSect(   5, 80,   5, [0, 90], "left",   1, fn); // böj uppe till vänster
   points5 = circSect( 140, 80,   5, [0, 1], "top",   1, fn);   // böj uppe till höger
   edge = concat(points1, points2, points3, points4, points5);
   path = path3d(reverse(edge));
   section = wall();
   path_sweep( section, path, closed=false);

   // Skapa bakkant lite högre och smalare i topp
   bottom1 = concat(points5, points1);
   polygon(bottom1);
   path1 = path3d(reverse(bottom1));
   section1 = wall1(); // lite högre bakvägg wall(b=4, f=8, h=15, t=3.5)
   path_sweep( section1, path1, closed=false);

   // fyll upp bottenplattansbaksida
   linear_extrude(4) // Bottomplate - fill up
     polygon(concat(points1, points2, points3, points4, points5));

   // skapa Utskjutande del under (tänk spegelvänt)
   pt1 = circSect(  19.5, 85, 0, [0, 50], "top", 1, fn);  // Uppe till höger - moturs
   pt2 = circSect(  39, 1.35,  .1, [-5, 90], "right", 1, fn);  // Nere till höger
   pt3 = circSect(  10, 13.05,  10, [0, 90], "bottom", 1, fn);  // Nere till vänster
   pt4 = circSect(   5, 80, 5, [0, 90], "left",   1, fn);  // Uppe till vänster
   translate([0, 0, -2])
     linear_extrude(2.1)
       polygon(concat(pt1, pt2, pt3, pt4));

   // utgången för kabeln på baksidan (diam 10mm) - pekar lite nedåt
   cableExit(65, 35, 0, 15, "cyan", $fn=100);
   }

   // skapa ett borrhål i bakkant
   translate([132,60,15])
   { rotate([0, 90, 0])
     { cylinder(h=10, d=2, $fn=100);
       cylinder(h=4, d=9, $fn=100);
     }
   }

   // skapa en borrmarkering i bakkant
   translate([139,25,15])
   { rotate([0, 90, 0])
       cylinder(h=2, d1=1, d2=2.5, $fn=100);
   }

   // ingravera årtalet på baksidan
   translate([10, 80, -0.5])
   { mirror([side, 0, 0])
     { rotate([0, 180, 0])
       { linear_extrude(3)
           text("2022", size=12, direction="ttb", font="Comic Sans MS:style=Bold");
       }
     }
   }

   /*
   // Markera skruvhål på bakkant
   borr=3;
   bredd=140;
   hojd=8;
   avstNed=20;
   translate([bredd, avstNed, hojd])
   { rotate([0,90,0])
       cylinder(h=2, d1=0.5, d2=borr, center=true, $fn=50);
   }
   */

   // borrhål
   mountingHole(20, 36, 0, 7, 90.1, 15); // posX, posY, posZ, diam, dist, deep, $fn=50

   }
}
//========  Slut box 
---=============================

//

---================
//======  cableExit 
---==============================
module cableExit(posX, posY, posZ, angle, colorName)
{ diamHole = 7;
   diamHolder = 9.8;
   hight = 12;
   topRad = diamHolder/2;
   topDiam = diamHolder/2-topRad/2;
   bowRad = 7;
   offs1 = 0.1;

   color(colorName)
   translate([posX, posY, posZ])
   {  rotate([180, 0, 180-angle])
     { difference()
       { hull()
         { cylinder(h=hight, d=diamHolder, center=false);
           translate([0, 0, hight])        // rundad topp
             rotate_extrude(angle=360, convexity=2)
               translate([topDiam, 0, 0])  // yttre diam topp
                 circle(d=topRad);         // radie topp
         }

         inpHight  =  2;   // ett värde som styr var utgångshålet hamnar
         translate([0, 0, -offs1])
           cylinder(h=inpHight+offs1, d=diamHole, center=false); // Bottenhål

         translate([-bowRad, 0, inpHight-offs1]) // böjen
         { rotate([90, 0, 0])
             rotate_extrude(angle=90, convexity=10)
               translate([bowRad, 0, 0]) // ställ in radien på kabelböjen
                 circle(d=diamHole);
         }
       }
     }
   }
}
//======  slut cableExit 
---=========================

//

---================
//======  mountingHole 
---===========================
module mountingHole(posX=0, posY=0, posZ=0, diam=7, dist=90, deep=5, $fn=50)
{ // diam =  6;   // [mm]
   // dist = 90;   // [mm]
   // deep =  12;  // [mm]

   translate([posX, posY, posZ])
   { translate([0, 0, -10])
       cylinder(h=deep, d=diam);  // fästhål 1

     //cableHold1(dist/2, 0, .2, "#D5D5D5");  // Kabelgenomföring
     translate([dist/2, 0, 0])
     {  hull()
       { cylinder(h=5, d=6);  // fästhål 1
         sphere(d=7.5);
       }
     }

     translate([dist, 0, -10])
       cylinder(h=deep, d=diam); // fästhål 2
   }
}
//======  slut mountingHole 
---======================

//

---================
//======  LEDlampa 
---===============================
// module LEDlampa(posX=8, posY=10, posZ=0)
module LEDlampa(posX=0, posY=0, posZ=0, mountSide="left")
{ side = mountSide == "left" ? 0
        : mountSide == "right" ? 1
        : assert(false,"invalid moutSide value");  // message if no case worked

   xpos = mountSide == "left" ? 121
        : mountSide == "right" ? -10
        : assert(false,"invalid moutSide value");  // message if no case worked
  /*
   ypos = mountSide == "left" ? 10.5
        : mountSide == "right" ? 10.5
        : assert(false,"invalid moutSide value");  // message if no case worked

   zpos = mountSide == "left" ? 5
        : mountSide == "right" ? 5
        : assert(false,"invalid moutSide value");  // message if no case worked
*/
// echo(xpos,ypos,zpos);
   // translate([xpos, ypos, zpos])
   translate([xpos, 10.5, 5])
   mirror([1, 0, 0])
   translate([posX, posY, posZ])
   { LEDbottom();
       translate([0, 0, 11])
         LEDglas();
   }
}
//======  Slut LEDlampa 
---==========================

//

---================
//======  LEDglas 
---================================
module LEDglas()
{
   // Variabler botten
   length  = 111;   // längd mm
   wideMid = 50.5;  // bredd i mitten mm

   cornRad = 10;    // Radien i alla hörn
   wideCorn = 48;   // Bredd i kanterna

   diamHole = 6;    // håldiameter i mm

   colorBot = "gray";
   colorTop = "orange";

   // Variabler top
   cornHigh = 5;   //Höjd i ändarna
   midHigh  = 8;
   highTop = cornHigh + 1;  // höjd mm

   p1tx = 10;      // the start value
   p1ty = 49.25;
   p2tx = 55.5;    // the middle value
   p2ty = 50.5;
   p3tx = 101;     // the end value
   p3ty = p1ty;

   p4tx = 101;     // the start value
   p4ty = 1.25;
   p5tx = 55.5;    // the middle value
   p5ty = 0.0;
   p6tx = 10;      // the end value
   p6ty = p4ty;
   // Ger ovalt glas
   points1 = 3points_arc([p1tx,p1ty], [p2tx,p2ty], [p3tx,p3ty], fn=100);
   points2 = 3points_arc([p4tx,p4ty], [p5tx,p5ty], [p6tx,p6ty], fn=100);

   color("orange")
   linear_extrude(height=cornHigh+.1)
   difference()
   { polygon(concat(points1, points2));

     translate([length-10 , wideMid / 2, -.2])
       circle(d=6);
     translate([10 , wideMid / 2, -.2])
       circle(d=6);
   }

   // Top
   color(colorTop)
   difference()
   { hull()
     { // hörn1
       translate([cornRad, wideMid - ((wideMid-wideCorn)/2) - cornRad, 0]) // [10,39]
         cylinder(h=cornHigh, d=cornRad2, center=false);
       // hörn2
       translate([cornRad, cornRad + ((wideMid-wideCorn)/2), 0])           // [10,12]
         cylinder(h=cornHigh, d=cornRad
2, center=false);
       // hörn3
       translate([length - cornRad, wideMid - ((wideMid-wideCorn)/2) - cornRad, 0]) // [101 ,39]
         cylinder(h=cornHigh, d=cornRad2, center=false);
       // hörn4
       translate([length - cornRad, cornRad + ((wideMid-wideCorn)/2), 0])  //
         cylinder(h=cornHigh, d=cornRad
2, center=false);
     }

     union()
     { // Monteringshål 1 & 2
       translate([length-10 , wideMid / 2, -.2])
         cylinder(d=diamHole, h=highTop+.5, center=false);
       translate([10 , wideMid / 2, -.2])
         cylinder(d=diamHole, h=highTop+.5, center=false);
     }
   }
}
//========  Slut LEDglas 
---=========================

//

---================
//======  LEDbottom 
---==============================
module LEDbottom()
{ p1x = 10;      // the start value
   p1y = 49.25;
   p2x = 55.5;    // the middle value
   p2y = 50.5;
   p3x = 101;     // the end value
   p3y = p1y;

   p4x = 101;     // the start value
   p4y = 1.25;
   p5x = 55.5;    // the middle value
   p5y = 0.0;
   p6x = 10;      // the end value
   p6y = p4y;

   // Variabler botten för borrhålen
   length  = 111;   // längd mm
   wideMid = 50.5;  // bredd i mitten mm
   diamHole = 6;    // håldiameter i mm
   cornHigh = 5;   //Höjd i ändarna
   midHigh  = 8;
   highTop = cornHigh + 1;  // höjd mm
   // offs1 = 0.1;
   heightHole = 15; //mm
   height = 11; //mm

   points1 = circSect(  10, 11.25,  10, [0, 90], "bottom", 1, fn); // Hörn nere till vänster
   points2 = circSect(  10, 39.25,  10, [0, 90], "left",   1, fn); // Hörn uppe till vänster
   points3 = 3points_arc([p1x,p1y], [p2x,p2y], [p3x,p3y], fn);
   points4 = circSect( 101, 39.25,  10, [0, 90], "top",    1, fn); // Hörn uppe till höger
   points5 = circSect( 101, 11.25,  10, [0, 90], "right",  1, fn); // Hörn nere till höger
   points6 = 3points_arc([p4x,p4y], [p5x,p5y], [p6x,p6y], fn);

   // The base plate for the LED lamp

   difference()
   { color("gray", 0.5)
     linear_extrude(height=height)
       polygon(concat(points1, points2, points3, points4, points5, points6));

    // union()
     { // Monteringshål 1 & 2
       translate([length-10 , wideMid / 2, -.2])
         cylinder(d=diamHole, h=heightHole, center=false);
       translate([10 , wideMid / 2, -.2])
         cylinder(d=diamHole, h=heightHole, center=false);
     }
   }
}
//========  Slut LEDbottom 
---=======================

//

---================
//======  circleSect 
---=============================
// Create rounded corners 2D
// https://openhome.cc/eGossip/OpenSCAD/SectorArc.html
// ange .:  x, y, radien,
//          [från, till] vinkel,
//          var vinkeln startar, (left, bottom, right, top)
//          vilken rotation (-1=medsol, 1=motsols)
function circSect(x=0, y=0, radius=10, angles=[0,270], startRef="bottom", rotate=1, fn=24)  =
     let(
         startAngel  = (startRef == "left")   ?   0
                     : (startRef == "bottom") ?  90
                     : (startRef == "right")  ? 180
                     : (startRef == "top")    ? 270
                     : startRef,  // valfri vinkel
                   // : assert(false,"invalid moutSide value");  // Error message if no case worked
                   //: undef,
         r = radius,
         //r = radius / cos(180 / fn),
         step = 360 / fn,
         // points = [[x, y],
         points = [
             for(a = [angles[0]-startAngel : step : angles[1]-startAngel])
                 [-rotate * r * cos(a)+x, r * sin(a)+y]]
     ) points;
//========  Slut circleSect 
---======================

//

---================
//======  3points_arc 
---============================
// Create an arc with three points 2D
function 3points_arc(p0, p1, p2, fn=10) =
   // an alternative expression for D
   // D  = 2 * ( (p1-p0).x * (p2-p0).y - (p1-p0).y * (p2-p0).x )
   let( D  = 2 * cross(p1-p0, (p2-p0)) )
   assert( abs(D)>1e-9, "The 3 points should not be collinear." )
   let(
       Ux     = ( (p2-p0).y*(p1-p0)(p1-p0) - (p1-p0).y(p2-p0)(p2-p0) )/D,
       Uy     = ( (p1-p0).x
(p2-p0)(p2-p0) - (p2-p0).x(p1-p0)(p1-p0) )/D,
       radius = norm([Ux,Uy]),
       center = [Ux,Uy] + p0,
       ang0   = atan2( (p0-center).y, (p0-center).x ),
       ang2   = atan2( (p2-center).y, (p2-center).x ),
       // the points are in a cw winding iff D<0
       // the angular difference between vectors p2-center and p0-center
       // measured from p0-center; dang is positive iff D is negative
       dang   = D<0  ? ang2<ang0 ? ang2-ang0 : ang2-ang0-360
                     : ang2>ang0 ? ang2-ang0 : ang2-ang0+360
   )
   [ for(i=[0:fn-1])
       let( ang = ang0 + i
dang/(fn-1) )
       center + radius*[cos(ang),sin(ang)] ];
//========  Slut 3points_arc 
---=====================

//

---================
//======  Wall som ett "L" 
---=======================
// Normal vägghöjd
function wall() =
   let(
         b =  4,     // botten - tjocklek
         f =  8,     // Foten
         h = 15,     // Höjd
         t =  3.5,   // Top
         x = (b+(t/2) - (h - ( (-h / (f-t)) *t) )) / (-h / (f-t))
     )
     let(
         points = [[0,0], [f,0], [t,h], [0,h]] ,
         top = move([t/2, h, 0], circle(d=t, $fn=20)),
         sqr = square([10, b]),
         diff =
             difference([
                   move([x, b], square([t/2, t/2])),
                   move([x+(t/2), b+(t/2), 0], circle(d = t, $fn=20) ) ])
         )
     union([points, top, sqr, diff]);
//========  Slut Wall 
---============================

//

---================
//======  Wall1 som ett "L" 
---======================
// En högre vägg
function wall1() =
   let(
     b =  4,     // botten - tjocklek
     f =  7,     // Foten
     h = 25,     // Höjd
     t =  3,   // Top
     x = (b+(t/2) - (h - ((-h / (f-t)) *t))) / (-h / (f-t))
   )
   let(
     points = [[0,0], [f,0], [t,h], [0,h]] ,
     top = move([t/2, h, 0], circle(d=t, $fn=20)),
     sqr = square([10, b]),
     diff =
       difference([
         move([x, b], square([t/2, t/2])),
         move([x+(t/2), b+(t/2), 0], circle(d = t, $fn=20) ) ])
     )
     union([points, top, sqr, diff]);
//========  Slut Wall1 
---===========================

//

---================
//======  Plåt på släp 
---===========================
module mountingPlate(posX=0, posY=0, posZ=0, mountSide="left", colorName="#C0C0C0", $fn=50)
{ // Hörnpositionerna
   posX1 = 120;
   posY1 = 0;
   posX2 = posX1;
   posY2 = -200;
   posX3 = 120 - 75;
   posY3 = -200;
   posX4 = 0;
   posY4 = 0;
   thick=2;  // tjocklek

   side = mountSide == "left" ? 0
        : mountSide == "right" ? 1
        : assert(false,"invalid moutSide value");  // message if no case worked

   xpos = mountSide == "left" ? 20
        : mountSide == "right" ? -20
        : assert(false,"invalid moutSide value");  // message if no case worked
/*
   ypos = mountSide == "left" ? 85
        : mountSide == "right" ? 85
        : assert(false,"invalid moutSide value");  // message if no case worked

   zpos = mountSide == "left" ? -thick
        : mountSide == "right" ? -thick
        : assert(false,"invalid moutSide value");  // message if no case worked
*/
   color(colorName)
   {  translate([posX, posY, posZ])
      translate([xpos, 85, -thick])
     { mirror([side, 0, 0])
       { linear_extrude(thick)
         hull()
         { translate([posX1, posY1, 0])
             square(0.1, center = true);
           translate([posX2, posY2, 0])
             square(0.1, center = true);
           translate([posX3, posY3, 0])
             square(0.1, center = true);
           translate([posX4, posY4, 0])
             square(0.1, center = true);
         }
       }
     }
   }
}
= = END product 1= = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

  • . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . -

= = product 2 = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

  • . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . -

$fn=100;
//$fn=15;

//switch();
//cableHolder4(); //Switchboxen

// cableHolder3(0, 0, 0, 33.5, 23.5, 1.5, 2);
// showCables();

module cableHolder4(fn=24);
{ // idé från
   // - https://www.thingiverse.com/thing:6400/files
   // - https://ihrchive.wordpress.com/2011/02/14/openscad-tip-round-1-of-3-basic-rounding/

   // mått på Switch
   heightHold = 10.5;
   widthHold = 33.5;
   depthHold = 23.5;
   spaceHold = 10.0; // utrymmet bakom switch
   holdRadie = 2;  // radie i hörnen
   thick = 2;
   offset1=0.5;  // öka toleransen

   // innermått
   holeW = widthHold + offset1;
   holeH = heightHold + offset1;
   holeD = depthHold + spaceHold+offset1;

   // yttermått
   pad = 0.1;                   // Padding to maintain manifold
   box_l = holeW + thick*2;   // Bredden på switchen
   box_w = holeD + thick;             // Djupet på switchen
   box_h = holeH + thick; // Height
   round_r = holdRadie;         // Radius of round
   smooth = 45;                 // Number of facets of rounding cylinder

   difference()
   { union() // Detta utförs i två steg.
     { difference()  // utför fasningar och kabelmarkeringar
       { mainBox(box_l, box_w, box_h, spaceHold+thick, round_r, thick, smooth, pad);

         // fasning vänster (underkant)
         translate([box_l/2-0.85, spaceHold-4.3, thick-offset1])  // sidled, fram/bak , upp/ned
           rotate([0,180,45])
             cylinder(h=thick, d1=holeW1.414-thick-thick, d2=holeW1.414, $fn=4);

         // fasning höger (underkant)
         translate([box_l/2-3.65, spaceHold-4.3, thick-offset1]) // sidled, fram/bak , upp/ned
           rotate([0,180,45])
             cylinder(h=thick, d1=holeW1.414-thick-thick, d2=holeW1.414, $fn=4);

         // kabelgenomföringar
         rotate([90, 180, 90]) // Markering ena sidan (vänster under)
           ovalCableHole(spaceHold/2-offset1, -1.75, -1.2);

         rotate([90, 180, 180]) // Markering bakkant (vänster under)
           ovalCableHole(spaceHold/2-1.55, -1.75, -spaceHold-0.85);

         rotate([90, 180, 180]) // Markering bakkant (höger under)
           ovalCableHole(widthHold-spaceHold/2-offset1, -1.75, -spaceHold-0.85);

         rotate([90, -180, 90])  // Markering ena sidan (höger under)
           ovalCableHole(3.75, -1.75, widthHold-0.1);
       }
     } // Slut union - kropp

     translate([-offset1/2, -spaceHold+pad, -pad]) // hålet där switchen ska placeras
       cube([holeW, holeD+pad, holeH+pad], center=false);

       translate([4, 12, 0])
         cylinder(h=15,d=3.2);
       translate([4, 12, 17.7])
         sphere(r=6);

       translate([29.6, 12, 0])
         cylinder(h=15,d=3.2);
       translate([29.6, 12, 17.7])
         sphere(r=6);

       /*  // Hål genom lock bak - om så önskas
       translate([box_l/2-thick, -6, offset1/2])
         cylinder(h=box_h+thick*4+offset1, d=3.2, $fn=100);  // hål genom lock bak

       translate([box_l/2-thick, -6, 17.7])
         sphere(r=6);    // kona hålet bak
       */
   } // Slut difference() - box

     difference()
     { union()
       { translate([29.6, 12, heightHold-offset12])
           cylinder(h=2,d=5.2);        // Stödhylsa för Switchskruv1
         translate([4, 12, heightHold-offset1
2])
           cylinder(h=2,d=5.2);        // Stödhylsa för Switchskruv2

         translate([holeW/2, -spaceHold+thick+1, holeH/2])
           rotate([180,0,0])
              backHole();
       } // union - slut

       translate([4, 12, 0])     //  Hålen i stödhylsorna
         cylinder(h=15,d=3.2);

       translate([29.6, 12, 0])  //  Hålen i stödhylsorna
         cylinder(h=15,d=3.2);

       translate([box_l/2-thick, -6, -offset1])  // hål i stödhylsa bak
         cylinder(h=box_h+offset1, d=3.2, $fn=100);

       // Sänk stödhylsan
       translate([ widthHold/2-7, -spaceHold-offset1, -thick+offset1])  // hål i stödhylsa bak
           cube([15, 8, 3]);

       // kabelmarkering
       // translate([0, 0, 0])  // hål i stödhylsa bak

       }

/*
       translate([4, 12, 0])
         #cylinder(h=15,d=3.2);
       //translate([4, 13.5, 17.3])
         //#sphere(r=6);

       translate([29.6, 12, 0])
         #cylinder(h=15,d=3.2);
       //translate([29.6, 13.5, 17.3])
         //#sphere(r=6);
*/

}

module backHole()
{ wallH = 10.5;

   wide1   = 12; // endast runt cylindern
   wide2   = 35; // hela väggen
   deep1    =  4;
   height1  = 10.5;
   cornRad1  =  2;
   diam1 = 8;
   opt1 = 0.1;

   //rundadFot();

   // Rundad stäcka mellan t.ex. vägg och tak -bakkant
   translate([wide2/2, diam1/2-cornRad1/2, -height1/2])
   { rotate([90, 0, -90])
     { linear_extrude(wide2)
       { difference()
         { square([cornRad1, cornRad1]);

           translate([cornRad1, cornRad1])
             circle(r=cornRad1);
         }
       }
     }
   }

   // rundad stäcka1 (vänster) mellan t.ex. vägg och tak
   translate([-wide2/2+0.15, deep1/2+cornRad1/2, -height1/2])
   rotate([90, 0, 0])
   { linear_extrude(spaceHold)
     { difference()
       { square([cornRad1, cornRad1]);

         translate([cornRad1, cornRad1])
         circle(r=cornRad1);
       }
     }
   }

   // rundad stäcka2 mellan t.ex. vägg och tak
   translate([wide2/2-0.65, deep1/2+cornRad1/2, -height1/2])
   rotate([0, -90, 90])
   { linear_extrude(spaceHold)
     { difference()
       { square([cornRad1, cornRad1]);

         translate([cornRad1, cornRad1])
           circle(r=cornRad1);
       }
     }
   }

   // Skapa stödfot - bak
   difference()
   { union()
     { //själva cylindern
       translate([0, 1, 0])
       { cylinder(h=height1, d=diam1, center=true);
         translate([0, diam1/2, 0])
           cube([diam1,diam1-1,height1], center=true);
       }

       // Rundad fot under cylinder ovan
       translate([0, 1, -height1/2])
       { rotate_extrude()
         { translate([diam1/2, 0, 0])
           { difference()
             { square([cornRad1, cornRad1]);

               translate([cornRad1, cornRad1])
                 circle(r=cornRad1);
             }
           }
         }
       }

       // Rundad rakstäcka1 - cylinderfot - mellan t.ex. vägg och tak
       translate([diam1/2, diam1, -height1/2])
       { rotate([90, 0, 0])
         { linear_extrude(diam1)
           { difference()
             { square([cornRad1, cornRad1]);

               translate([cornRad1, cornRad1])
                 circle(r=cornRad1);
             }
           }
         }
       }

       // Rundad rakstäcka2 - cylinderfot - mellan t.ex. vägg och tak
       translate([-diam1/2, diam1, -height1/2])
       { rotate([0, -90, 90])
         { linear_extrude(diam1)
           { difference()
             { square([cornRad1, cornRad1]);

               translate([cornRad1, cornRad1])
                 circle(r=cornRad1);
             }
           }
         }
       }

       //väggen bakom cylindern som ska rundas
       translate([0, diam1/2-cornRad1, 0])
         cube([wide1, cornRad1, height1], center=true);

     }

     // Avrunda hörn1 bak
     translate([-wide1/2, cornRad1/2, cornRad1])
     { hull()
       { cylinder(h=height1+opt1, r=cornRad1, center=true);
         {  translate([0, 0, -height1/2])
             sphere(r=cornRad1);
         }
       }
     }

     // Avrunda hörn2 bak
     translate([wide1/2, cornRad1/2, cornRad1])
     { hull()
       { cylinder(h=height1+opt1, r=cornRad1, center=true);
         {  translate([0, 0, -height1/2])
             sphere(r=cornRad1);
         }
       }
     }

     // Plocka bort rundad fot bak samt det som sticker ut
     translate([-wide1/2, diam1/2-cornRad1/2, -height1/2-opt1])
       cube([wide1, diam1/2+cornRad1, height1+opt1*2], center=false);

   }
}

module ovalCableHole(posX, posY, posZ)
{ // Hål 5.5 x 3.5 mm
   pan = 0.1;
   cableHi = 1.5;

   translate([posX, posY, posZ])
   { color("white")
     { translate([0, 0, -pan])
       { cylinder(h=cableHi, d=3.5);
         //#translate([0, 0, 0]) cylinder(h=10, d=1);
         //translate([0, 0, -1]) cylinder(h=1, d1=0, d2=1);
         //translate([0, 0, 0]) sphere(d=1); // Inre kulan
         //translate([0, 0, 1.5]) sphere(d=1); // Inre kulan

         translate([0, 0, -1]) sphere(d=0.8); // yttre kulan
         translate([0, 0, 2.5]) sphere(d=0.8); // yttre kulan

       }
       translate([2, 0, -pan])
       { cylinder(h=cableHi, d=3.5);
         // #translate([0, 0, -cableHi*2]) cylinder(h=10, d=0.5);
         //translate([0, 0, 0]) sphere(d=1); // Inre kulan
         //translate([0, 0, 1.5]) sphere(d=1); // Inre kulan

         translate([0, 0, -1]) sphere(d=0.8); // yttre kulan
         translate([0, 0, 2.5]) sphere(d=0.8); // yttre kulan

       }
       translate([-3.5/2, 0, -pan])
         cube([5.5, 3.5/2, cableHi]);
       translate([-0.25, -1.74, -pan])
         cube([2.5, 1.75, cableHi]);
     }
   }
}

module rundadFot()
{
   // specifika värden för skruvdistansen bak
   wallH = 10.5;

   wide1   = 12; // endast runt cylindern
   wide2   = 34; // hela väggen
   deep1    =  4;
   height1  = 10;
   cornRad1  =  2;
   diam1 = 8;
   opt1 = 0.1;

   color("magenta")
   { translate([0, 0, wallH])
     { difference()
       { union()
         { // Bakgavel
           translate([wide2/2, opt1, height1/2])
           { rotate([90, 180, 0])
               cube([wide2, height1, opt1]);
           }

           // Golv
           translate([wide2/2, -height1+opt1, -height1/2])
             rotate([0, 180, 0])
               cube([wide2, height1, opt1]);

           //väggen bakom cylindern som kan rundas
           translate([0, -cornRad1/2, 0])
             cube([wide1, cornRad1, height1], center=true);

           //själva cylindern
           translate([0, -cornRad1/2, 0])
             cylinder(h=height1, d=diam1, center=true);

           // Rundad fot under cylinder ovan
           translate([0, -cornRad1/2, -height1/2])
           { rotate_extrude()
             { translate([diam1/2, 0, 0])
               { difference()
                 { square([cornRad1, cornRad1]);

                   translate([cornRad1, cornRad1])
                     circle(r=cornRad1);
                 }
               }
             }
           }

           // Rundad stäcka mellan t.ex. vägg och tak -bakkant
           translate([wide2/2, 0, -height1/2])
           { rotate([90, 0, -90])
             { linear_extrude(wide2)
               { difference()
                 { square([cornRad1, cornRad1]);

                   translate([cornRad1, cornRad1])
                     circle(r=cornRad1);
                 }
               }
             }
           }

           // rundad stäcka mellan t.ex. vägg och tak -sida1
           translate([-wide2/2, 0, -height1/2])
           { rotate([90, 0, 0])
             { linear_extrude(10)
               { difference()
                 { square([cornRad1, cornRad1]);

                   translate([cornRad1, cornRad1])
                   circle(r=cornRad1);
                 }
               }
             }
           }

           // rundad stäcka mellan t.ex. vägg och tak -sida2
           translate([wide2/2, -10, -height1/2])
           { rotate([90, 0, 180])
             { linear_extrude(10)
               { difference()
                 { square([cornRad1, cornRad1]);

                   translate([cornRad1, cornRad1])
                   circle(r=cornRad1);
                 }
               }
             }
           }
         } // Avsluta union = = = = = = = = = = = = = = = = = = = =

         // Avrunda hörn1 bak
         translate([-wide1/2+opt1*1.3, -deep1/2, cornRad1])
         { cylinder(h=height1+opt1, r=cornRad1, center=true);
             translate([0, 0, -height1/2])
               sphere(r=cornRad1);
         }

         // Avrunda hörn2 bak
         translate([wide1/2-opt1*1.3, -deep1/2, cornRad1])
         { cylinder(h=height1+opt1, r=cornRad1, center=true);
             translate([0, 0, -height1/2])
               sphere(r=cornRad1);
         }

         // Plocka bort rundad fot bak samt det som sticker ut
         translate([-wide1/2, 0, -height1/2-opt1])
           cube([wide1, diam1/2+cornRad1, height1+opt1*2], center=false);
       }
     }
   }
}

module mainBox(box_l, box_w, box_h, spaceHold, round_r, thick, smooth, pad)
{ translate([box_l/2-thick-offset1/2, box_w/2-spaceHold, box_h/2])
   {
     // To fix the corners cut the main cube with smaller cubes with spheres removed
     difference()
     { cube([box_l, box_w, box_h], center = true);

       // Kant1 - liggande
       translate([0, -box_w/2+round_r, box_h/2-round_r])
       { difference()
         { translate([0,-round_r-pad,round_r+pad])
             cube([box_l+2pad, round_r2+pad, round_r2+pad], center = true);
           rotate(a=[0,90,0])
             cylinder(box_l+4
pad,round_r,round_r,center=true,$fn=smooth);
         }
       }
       // Kant2 - liggande
       translate([0, box_w/2-round_r, box_h/2-round_r])
       { difference()
         { translate([0,round_r+pad,round_r+pad])
             cube([box_l+2pad, round_r2+pad, round_r2+pad], center = true);
           rotate(a=[0,90,0])
             cylinder(box_l+4
pad,round_r,round_r,center=true,$fn=smooth);
         }
       }
       /*
       // Kant3 - liggande
       translate([0, -box_w/2+round_r, -box_h/2+round_r])
       { difference()
         { translate([0,-round_r-pad,-round_r-pad])
             cube([box_l+2pad, round_r2+pad, round_r2+pad], center = true);
           rotate(a=[0,90,0])
             cylinder(box_l+4
pad,round_r,round_r,center=true,$fn=smooth);
         }
       }

       // Kant4 - liggande
       translate([0, box_w/2-round_r, -box_h/2+round_r])
       { difference()
         { translate([0,round_r+pad,-round_r-pad])
             cube([box_l+2pad, round_r2+pad, round_r2+pad], center = true);
           rotate(a=[0,90,0])
             cylinder(box_l+4
pad,round_r,round_r,center=true,$fn=smooth);
         }
       }
     /
     // ----
       // Kant1 - stående
       translate([-box_l/2+round_r, box_w/2-round_r, 0])
       { difference()
         { translate([-round_r-pad,round_r+pad,0])
             cube([round_r
2+pad, round_r2+pad, box_h+2pad], center = true);
           cylinder(box_h+4pad,round_r,round_r,center=true,$fn=smooth);
         }
       }
       // Kant2 - stående
       translate([box_l/2-round_r, box_w/2-round_r, 0])
       { difference()
         { translate([round_r+pad,round_r+pad,0])
             cube([round_r
2+pad, round_r2+pad, box_h+2pad], center = true);
           cylinder(box_h+4pad,round_r,round_r,center=true,$fn=smooth);
         }
       }
       // Kant3 - stående
       translate([-box_l/2+round_r, -box_w/2+round_r, 0])
       { difference()
         { translate([-round_r-pad,-round_r-pad,0])
             cube([round_r
2+pad, round_r2+pad, box_h+2pad], center = true);
           cylinder(box_h+4pad,round_r,round_r,center=true,$fn=smooth);
         }
       }
       // Kant4 - stående
       translate([box_l/2-round_r, -box_w/2+round_r, 0])
       { difference()
         { translate([round_r+pad,-round_r-pad,0])
             cube([round_r
2+pad, round_r2+pad, box_h+2pad], center = true);
           cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth);
         }
       }

     // ----
       // Kant1 liggande (andra hållet)
       translate([-box_l/2+round_r, 0, box_h/2-round_r])
       { difference()
         { translate([-round_r-pad, 0, round_r+pad])
             cube([round_r2+pad, box_w+2pad, round_r2+pad], center = true);
           rotate(a=[0,90,90])
             cylinder(box_w+4
pad,round_r,round_r,center=true,$fn=smooth);
         }
       }
       // Kant2 liggande (andra hållet)
       translate([box_l/2-round_r, 0, box_h/2-round_r])
       { difference()
         {  translate([round_r+pad, 0, round_r+pad])
             cube([round_r2+pad, box_w+2pad, round_r2+pad], center = true);
           rotate(a=[0,90,90])
             cylinder(box_w+4
pad,round_r,round_r,center=true,$fn=smooth);
         }
       }
       /*
       // Kant3 liggande (andra hållet)
       translate([-box_l/2+round_r, 0, -box_h/2+round_r])
       { difference()
         { translate([-round_r-pad, 0, -round_r-pad])
             cube([round_r2+pad, box_w+2pad, round_r2+pad], center = true);
           rotate(a=[0,90,90])
             cylinder(box_w+4
pad,round_r,round_r,center=true,$fn=smooth);
         }
       }

       // Kant4 liggande (andra hållet)
       translate([box_l/2-round_r, 0, -box_h/2+round_r])
       { difference()
         { translate([round_r+pad, 0, -round_r-pad])
             cube([round_r2+pad, box_w+2pad, round_r2+pad], center = true);
           rotate(a=[0,90,90])
             cylinder(box_w+4
pad,round_r,round_r,center=true,$fn=smooth);
         }
       }
   /
     // ----
       // Hörn1 (övre)
       translate([box_l/2-round_r, box_w/2-round_r, box_h/2-round_r])
       { difference()
         { translate([round_r+pad, round_r+pad, round_r+pad])
             cube([round_r
2+pad, round_r2+pad, round_r2+pad], center = true);
           sphere(round_r,$fn=smooth);
         }
       }
       // Hörn2 (övre)
       translate([-box_l/2+round_r, box_w/2-round_r, box_h/2-round_r])
       { difference()
         { translate([-round_r-pad, round_r+pad, round_r+pad])
             cube([round_r2+pad, round_r2+pad, round_r2+pad], center = true);
           sphere(round_r,$fn=smooth);
         }
       }
       // Hörn3 (övre)
       translate([box_l/2-round_r, -box_w/2+round_r, box_h/2-round_r])
       { difference()
         { translate([round_r+pad, -round_r-pad, round_r+pad])
             cube([round_r
2+pad, round_r2+pad, round_r2+pad], center = true);
           sphere(round_r,$fn=smooth);
         }
       }
       // Hörn4 (övre)
       translate([-box_l/2+round_r, -box_w/2+round_r, box_h/2-round_r])
       { difference()
         { translate([-round_r-pad, -round_r-pad, round_r+pad])
             cube([round_r2+pad, round_r2+pad, round_r2+pad], center = true);
           sphere(round_r,$fn=smooth);
         }
       }
       /

       // Hörn1 (undre)
       translate([box_l/2-round_r, box_w/2-round_r, -box_h/2+round_r])
       { difference()
         { translate([round_r+pad, round_r+pad, -round_r-pad])
             cube([round_r2+pad, round_r2+pad, round_r2+pad], center = true);
           sphere(round_r,$fn=smooth);
         }
       }
       // Hörn2 (undre)
       translate([-box_l/2+round_r, box_w/2-round_r, -box_h/2+round_r])
       { difference()
         { translate([-round_r-pad, round_r+pad, -round_r-pad])
             cube([round_r
2+pad, round_r2+pad, round_r2+pad], center = true);
           sphere(round_r,$fn=smooth);
         }
       }
       // Hörn3 (undre)
       translate([box_l/2-round_r, -box_w/2+round_r, -box_h/2+round_r])
       { difference()
         { translate([round_r+pad, -round_r-pad, -round_r-pad])
             cube([round_r2+pad, round_r2+pad, round_r2+pad], center = true);
           sphere(round_r,$fn=smooth);
         }
       }
       // Hörn4 (undre)
       translate([-box_l/2+round_r, -box_w/2+round_r, -box_h/2+round_r])
       { difference()
         { translate([-round_r-pad, -round_r-pad, -round_r-pad])
             cube([round_r
2+pad, round_r2+pad, round_r2+pad], center = true);
           sphere(round_r,$fn=smooth);
         }
       }
       */
     }
   }
}
//

module cableHolder3(posX, posY, posZ, length, width, height, radius)
{ // Skapa toppen över switchen
   // mått på Switchen
   fn = 96;          // upplösning (endast bågen?)
   heightHold = 10.5;
   widthHold = 33.5;
   depthHold = 23.5;
   holdRadie = 1.5;  // radie i hörnen
   thick = 1.5;      // tjocklek

   translate([0,-thick,0])
   {
     difference(0, 0, 0)
     { hull()
       { difference()
         { translate([thick, 0, heightHold]) // vänster kant
           { rotate([-90, 0, 0])
             { cylinder(h=depthHold, d=thick2);
               translate([0, 0, depthHold])
                 sphere(d=thick
2);          // längst fram
             }
           }
           translate([0, -0.1, heightHold]) // plocka bort underdelen
             rotate([-90, 0, 0])
               cube([thick*2, thick+.1, depthHold+thick+.1]);
         }

         difference()
         { translate([widthHold-thick, 0, heightHold]) // höger kant
           { rotate([-90, 0, 0])
             { cylinder(h=depthHold, d=thick2);
               translate([0, 0, depthHold])
                 sphere(d=thick
2);         // längst fram
             }
           }
           translate([widthHold-thick2, -0.1, heightHold]) // plocka bort underdelen
           { rotate([-90, 0, 0])
               cube([thick
2, thick+.1, depthHold+thick+.1]);
           }
         }
       }

       // öppna hålen för monteringsskruvarna uppe på plattan
       translate([4, 13.5, 0])
         cylinder(h=15,d=3.2);
       translate([4, 13.5, 17.3])
         sphere(r=6);

       translate([29.6, 13.5, 0])
         cylinder(h=15,d=3.2);

       translate([29.6, 13.5, 17.3])
         sphere(r=6);
     }

     // halvbåge 1 bak
     translate([thick, 0, heightHold/2+thick/2])
       rotate([0, 90, 180])
         rotate_extrude(angle = 180, convexity=20, $fn=64)
     translate([heightHold/2-thick/2, 0, 0])
       circle(d=thick2);
     translate([thick, 0, heightHold])
       sphere(d=thick
2);  // övre kulan
     translate([thick, 0, thick])
       sphere(d=thick*2);  // undre kulan

     // halvbåge 2 bak
     translate([widthHold-thick, 0, heightHold/2+thick/2])
       rotate([0, 90, 180])
         rotate_extrude(angle = 180, convexity=20, $fn=64)
     translate([heightHold/2-thick/2, 0, 0])
       circle(d=thick2);
     translate([widthHold-thick, 0, heightHold])
       sphere(d=thick
2);  // övre kulan
     translate([widthHold-thick, 0, thick])
       sphere(d=thick*2);  // undre kulan

     // en cylinder tvärsöver längst upp
     translate([thick, 0, heightHold])
     { rotate([0,90,0])
         cylinder(h=widthHold-thick*2, r=thick);
     }
   }

   // Halvbågen (kabelhållaren) på baksidan switchen
   translate([widthHold-thick, -thick, heightHold/2+thick/2])
   { rotate([0,90,180])
       linear_extrude(widthHold-thick2)
         arc(heightHold/2-thick/2, [0, 180], thick, fn); //radius, angles, width, fn)
   }
   // en cylinder tvärsöver längst ned
   translate([thick, -thick, thick])
   { rotate([0,90,0])
       cylinder(h=widthHold-thick
2, r=thick);
   }
}

module switch(posX=0, posY=0, posZ=0)
{ buttRadie = 1.5;
   height = 10.5;
   width = 33.5;
   depth = 23.5;
   h1x = buttRadie;
   h1y = buttRadie;
   h2x = width-buttRadie;
   h2y = buttRadie;
   h3x = width-buttRadie;
   h3y = depth-buttRadie;
   h4x = buttRadie;
   h4y = depth-buttRadie;

   translate([posX, posY, posZ])
   { difference()
     { color("#F9F9F3")
        // tryck-knappen
       union()
       { translate([width/2, depth+6-0.1, height/2])
         { rotate([90, 0, 0])
           { translate([0,0,6])
               circle(d=6.8);  // skuggan runt knapp
             cylinder(h=6, d=6);
             sphere(d=6);
           }
         }

         hull()  // Switchkropp
         { translate([h1x, h1y])
             cylinder(h=height, r=1.5);
           translate([h2x, h2y])
             cylinder(h=height, r=1.5);
           translate([h3x, h3y])
             cylinder(h=height, r=1.5);
           translate([h4x, h4y])
             cylinder(h=height, r=1.5);
         }
       }

       // Skruvhålen för switchen
       hole( 4, 12, 0, "#FFD700", height);
       hole(29.6, 12, 0, "#FFD700", height);
       // hole( 4, 12, 0, "#FFD700", 50);
       // hole(29.6, 12, 0, "#FFD700", 50);
       // hål för kablar bak
       color("gray")
       { translate([9.5, 16, height/2])
         { rotate([90, 0, 0])
             cylinder(h=16.5, d=4);
         }
         translate([24.5, 16, height/2])
         {  rotate([90, 0, 0])
             cylinder(h=16.5, d=4);
         }
       }

       // hål för kabelskruvar
       color("white")
       { translate([29.5, 17.1, height/2])
         { rotate([0, 90, 0])
             cylinder(h=4.1, d=4.5);
         }
         translate([-0.1, 17.1, height/2])
         { rotate([0, 90, 0])
             cylinder(h=4.1, d=4.5);
         }
       }
     }

     // Kabelskruvar
     cableScrew(3, 17, height/2, 90);
     cableScrew(31, 17, height/2, -90);

   }
}

// Skruven som håller fast kabeln i switchen
module cableScrew(posX=0, posY=0, posZ=0, angle=0)
{ color("#FFD700")  // mässing
   translate([posX, posY, posZ])
   { rotate([0, 0, angle])
     { difference()
       { // skruvskalle
         translate([0, 0, 0])
           rotate([90, 0, 0])
             cylinder(h=2, d1=4, d2=3.5);

         // stjärnan i skruven
         translate([0, 1.85, -.25])
           rotate([0, 0, 0])
             cylinder(h=0.5, d=5);
         translate([-0.25, -.6, 2.25])
           rotate([0, 90, 0])
             cube([4.5, 2, 0.5]);
       }
     }
   }
}

// borrhål
module hole(posX=0, posY=0, posZ=0, colorName="yellow", height)
{ diamHole1 = 3;
   highHole1 = height;
   diamHole2 = 6;
   highHole2 = 2.5;
   offs=0.1;

   color(colorName)
   {
     translate([posX, posY, posZ])
     { translate([0, 0, 0])
         cylinder(h=highHole1, d=diamHole1);
       translate([0, 0, -offs])
         cylinder(h=highHole2, d=diamHole2);
       translate([0, 0, height-highHole2+offs])
         cylinder(h=highHole2, d=diamHole2);
     }
   }
}

module showCables()
{ translate([-25,8,24])
     rotate([80,177,90])
       cable(10,10,0,"brun");
   translate([-43,8,15])
     rotate([90,180,90])
       cable(10,10,0,"blå");
}

module cable(posX=0, posY=0, posZ=0, colorName="blå", radius=1.26, width=0.62, thick=50, fn=24)
{ // default 1.5mm2
   // radius = inner radie
   // width = bredd/tjocklek på cirkeln (inte höjd)
   // thick = höjd på cirken/ röret
   // pin=

   colCupper = "#D7715A";
   colGreen  = "#07DA63";
   colYellow = "#FFCC00";

   if (colorName=="gröngul")
   { translate([posX, posY, posZ])
     { color(colGreen)
         linear_extrude(thick)
           arc(radius, [0, 60], width, fn);
       color(colYellow)
         linear_extrude(thick)
           arc(radius, [60, 180], width, fn);
       color(colGreen)
         linear_extrude(thick)
           arc(radius, [180, 240], width, fn);
       color(colYellow)
         linear_extrude(thick)
           arc(radius, [240, 360], width, fn);

       color(colCupper)
         linear_extrude(10, center=true, convexity=10, $fn=100)
           circle(d=1.24);
     }
   }
   else  // vanliga kablar 1.5mm2
   {
     cableColor = colorName == "blå" ? "#1870D5"
                : colorName == "brun" ? "#9C6137"
                : colorName == "svart" ? "#000000"
                : assert(false,"invalid color value");  // message if no case worked
             // : nodef

     translate([posX, posY, posZ])
     {             //el kabel - ena änden rak - andra böjd
       color(colCupper)    //kopparstump tråd rakkabel
         linear_extrude(10, center=true, convexity=10, $fn=100)
           circle(d=1.24);

        color(cableColor)
        { cylinder(h=thick, r=radius);

         translate([-radius*2, 0, thick])  // kabelböj
         rotate([90, 0, 0])
         rotate_extrude(angle=90, convexity=20)
           translate([2.5, 0, 0])
             circle(r=1.26);

         translate([-radius2, 0, thick+radius2])
           rotate([0, -90, 0])
           cylinder(h=5, r=radius);
       }
       translate([-10, 0, thick+radius*2])
       { rotate([0, -90, 0])
         { color(colCupper)
           { linear_extrude(5, center=true, convexity=10, $fn=100)
               circle(d=1.24);
           }
         }
       }
     }
   }
}

//

---====
module arc(radius, angles, width = 1, fn = 24) {
     difference() {
         sector(radius + width, angles, fn); // ytterradie
         sector(radius, angles, fn);         // innerradie (plockar bort invändigt
     }
}

module sector(radius, angles, fn = 24) {
     r = radius / cos(180 / fn);
     step = -360 / fn;

     points = concat([[0, 0]],
         [for(a = [angles[0] : step : angles[1] - 360])
             [r * cos(a), r * sin(a)]
         ],
         [[r * cos(angles[1]), r * sin(angles[1])]]
     );

     difference() {
         circle(radius, $fn = fn);
         polygon(points);
     }
}
= = END product 2 = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

  • . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . -

Den fredag 6 maj 2022 14:06:55 CEST, Michael Möller private2michael@gmail.com skrev:

OpenSCAD code - is a description of your model in terms of a few cylinder/cubes added and cut out
difference() {
   cylinder(d=5,h=10);
   translate([0,10,0]) cube([4,6,2]) ;
}

STL file is a list of triangles which make the same outer shell as your model. OpenSCAD makes this complicated transform from shapes to triangles.
solid OpenSCAD_Model
   facet normal 0.92388 0.382682 0
     outer loop
       vertex 2.5 0 3
       vertex 1.76777 1.76777 0
       vertex 1.76777 1.76777 3
     endloop
   endfacet
   facet normal 0.92388 0.382682 0
     outer loop
       vertex 1.76777 1.76777 0
       vertex 2.5 0 3
       vertex 2.5 0 0
     endloop
   endfacet
   : (and so on for 300 lines) There is a binary/compressed version, but the description is still just triangles.

Gcode is what a 3D printer understands - it is the exact list of moves that the head has to do with how much plastic to squeeze to trace the outline of your shape, layer, by layer. It will optionally create moves for filling the inside or support for overhangs. Such a program is called a SLICER and the printer will come with one.
G92 E0 ; reset extrusion distance
G1 Z2.330 F6600.000 ; lift Z
G1 X-0.000 Y1.505 F6600.000 ; move to first perimeter point
G1 Z0.330 F6600.000 ; restore layer Z
G1 E3.00000 F2400.00000 ; unretract extruder 0
G1 F1500
G1 X-1.064 Y1.064 E3.09259 ; perimeter
G1 X-1.505 Y0.000 E3.18517 ; perimeter
   : (many similar lines)
G1 X1.515 Y1.515 E4.65860 ; perimeter
G1 X0.055 Y2.120 E4.78559 ; perimeter
G1 X-0.000 Y2.143 F6600.000 ; move inwards before travel
G1 X0.384 Y0.843 F6600.000 ; move to first infill point
G1 F1500
G1 X0.843 Y0.384 E4.84815 ; infill
G1 X1.097 Y-0.229 E4.91215 ; infill
  :
(and so on for thousands of lines)

The 3MF still basically deals in triangles, and attributes (surface, infill material, picture, ticket info ... ) which probably are not used by your slicer/printer.

On Fri, 6 May 2022 at 12:37, Jan Öhman via Discuss discuss@lists.openscad.org wrote:

---------- Forwarded message ----------
From: "Jan Öhman" jan_ohman@yahoo.com
To: OpenSCAD General Discussion discuss@lists.openscad.org
Cc:
Bcc:
Date: Fri, 6 May 2022 10:38:46 +0000 (UTC)
Subject: [OpenSCAD] Export to .STL / .3MF for later 3D-printing.
Hi!

Thought to create some objects in openSCAD, to print later.
I do not have my own 3D printer (yet).

One I talked to, wanted to get the drawings in .STL or .3MF. (I don't know the difference).

If I had my own printer, have I been able to print directly from openSCAD?
(Without some export?)

In the openSCAD, no errors or problems occur.
but
The drawings I tested to export from openSCAD have given one or another error message.
One message .:
WARNING: Object may not be a valid 2-manifold and may need repair!

Another message .:
WARNING: No top level geometry to render

What to do?

---------- Forwarded message ----------
From: "Jan Öhman via Discuss" discuss@lists.openscad.org
To: OpenSCAD General Discussion discuss@lists.openscad.org
Cc: "Jan Öhman" jan_ohman@yahoo.com
Bcc:
Date: Fri, 6 May 2022 10:38:46 +0000 (UTC)
Subject: [OpenSCAD] Export to .STL / .3MF for later 3D-printing.


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org

---------- Forwarded message ----------
From: "Jan Öhman via Discuss" discuss@lists.openscad.org
To: OpenSCAD general discussion discuss@lists.openscad.org
Cc: "Jan Öhman" jan_ohman@yahoo.com
Bcc:
Date: Sat, 7 May 2022 11:04:31 +0000 (UTC)
Subject: [OpenSCAD] Re: Export to .STL / .3MF for later 3D-printing.


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org

Thanks every one. I understand that Adrian Mariano has an explanation (probably pretty good).But still do not understand what to do in my case. "...It has a 2d polygon (easily found as there is one lonepolygon call) that needs to be removed "I think it is the polygon call in the moule Box that it is referenced. But if I delete the polygon call, that structure will disappear ... or ...? "or linear_extruded" I don't understand... "And it makes use of path_sweep in a manner that producesa self-intersecting polyhedron." Now it will be very difficult - I think "This issue is explained in the manual page for path_sweep." OK! "This can be fixed either by switching to path_extrude2d() or by changing the corner radius to eliminate the self-intersections." "or changing to a profile that can actually be rounded at the desired radius." Is this the same problem that is solved in another way? Den lördag 7 maj 2022 19:50:51 CEST, Michael Möller <private2michael@gmail.com> skrev: Indeed you did Adrian, I was curious what that long code was going to produce. Michael, fra mobilen lør. 7. maj 2022 19.06 skrev Adrian Mariano <avm4@cornell.edu>: I already gave a full explanation of what's wrong and how to fix the first program.  It has a 2d polygon (easily found as there is one lone polygon call) that needs to be removed or linear_extruded as appropriate.  And it makes use of path_sweep in a manner that produces a self-intersecting polyhedron.  This issue is explained in the manual page for path_sweep.  This can be fixed either by switching to path_extrude2d() or by changing the corner radius to eliminate the self-intersections.   Or changing to a profile that can actually be rounded at the desired radius. https://github.com/revarbat/BOSL2/wiki/skin.scad#functionmodule-path_sweep On Sat, May 7, 2022 at 12:57 PM Michael Möller <private2michael@gmail.com> wrote: > > Jan Öhman wrote it failed in Render/F6, but works in Preview/F5 - in so many words. I tried and got the following > > First model > > F6 Error: WARNING: Ignoring 2D child object for 3D operation in file , line 53 > > ERROR: CGAL error in CGALUtils::applyUnion3D: CGAL ERROR: assertion violation! Expr: G.mark(v1,0)==G.mark(v2,0)&& G.mark(v1,1)==G.mark(v2,1) File: /mxe/usr/x86_64-w64-mingw32.static.posix/include/CGAL/Nef_S2/SM_overlayer.h Line: 303 > > Which I think is pretty selfexplantory: Passed a 2D shape to something that expected a 3D shape - but you have to read the whole code to find it ... which I think Jan is more qualified to do :-) > > 2nd part > > ... which is one of those where zooming or rotating the model in preview takes >5 second > > And I didn't bother waiting for the F6 error ... ;-) > > > Of course, we do not know if the above shapes I got are the ones that Jan wants - there are also sections of code commented out. > > (From the comments it seems these are to be nice and alternative covers for wall outlet/switches.) > > > > On Sat, 7 May 2022 at 18:26, Sanjeev Prabhakar <sprabhakar2006@gmail.com> wrote: >> >> Quite a long code. >> Can you paste a picture of what you are trying to draw. >> Regards >> Sanjeev >> >> On Sat, 7 May 2022, 16:31 Jan Öhman via Discuss, <discuss@lists.openscad.org> wrote: >>> >>> >>> >>> >>> ---------- Forwarded message ---------- >>> From: "Jan Öhman" <jan_ohman@yahoo.com> >>> To: OpenSCAD general discussion <discuss@lists.openscad.org> >>> Cc: >>> Bcc: >>> Date: Sat, 7 May 2022 11:04:31 +0000 (UTC) >>> Subject: [OpenSCAD] Re: Export to .STL / .3MF for later 3D-printing. >>> Thank you! >>> Begins to understand how it works. (It was not easy...) >>> >>> but my solution was not good ... >>> >>> Here are 2 files that do not work to render (F6) >>> >>> >>> = = product 1= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = >>> - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - >>> >>> >>> include <BOSL2/std.scad> >>> fn = 150; >>> >>> placering="left"; >>> // placering="right" >>> >>> box(0, 0, 0, placering, "#C0C0C0", fn); // (X, Y, Z, left/right, colorName) >>> >>> >>> // Monteringsplattan >>> // mountingPlate(0, 0, 0, placering); >>> >>> >>> // LED belysning >>> // LEDlampa(0, 0, 0, placering); >>> >>> >>> // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >>> // - - - - m o d u l e r - - - - - - - - - - - - - - - - - - >>> >>> >>> //================================================================================== >>> //======  box  ===================================================================== >>> module box(posX=0, posY=0, posZ=0, mountSide="left", colorName="#00FF00", fn=24) >>> { >>>   side = mountSide == "left" ? 0 >>>        : mountSide == "right" ? 1 >>>        : assert(false,"invalid moutSide value");  // message if no case worked >>> >>>   color(colorName) >>>   translate([posX, posY, posZ]) >>>   mirror([side, 0, 0]) >>>   difference() >>>   { >>>   union() >>>   { >>>   // Skapa konturer på bottenplattan - x, y, r, angles, [grader], början >>>   // Rotation medurs - vänster lamphållare (bakant saknas) >>>   points1 = circSect( 140,  0,   0, [0, 0], "right",  1, fn);  // böj nere till höger >>>   points2 = circSect(  60,  5,   5, [0, 5], "bottom",  1, fn); // brytpunkt längst ned >>>   points3 = circSect(  10, 13,  10, [0, 90], "bottom", 1, fn); // böj nere till vänster >>>   points4 = circSect(   5, 80,   5, [0, 90], "left",   1, fn); // böj uppe till vänster >>>   points5 = circSect( 140, 80,   5, [0, 1], "top",   1, fn);   // böj uppe till höger >>>   edge = concat(points1, points2, points3, points4, points5); >>>   path = path3d(reverse(edge)); >>>   section = wall(); >>>   path_sweep( section, path, closed=false); >>> >>> >>>   // Skapa bakkant lite högre och smalare i topp >>>   bottom1 = concat(points5, points1); >>>   polygon(bottom1); >>>   path1 = path3d(reverse(bottom1)); >>>   section1 = wall1(); // lite högre bakvägg wall(b=4, f=8, h=15, t=3.5) >>>   path_sweep( section1, path1, closed=false); >>> >>>   // fyll upp bottenplattansbaksida >>>   linear_extrude(4) // Bottomplate - fill up >>>     polygon(concat(points1, points2, points3, points4, points5)); >>> >>> >>>   // skapa Utskjutande del under (tänk spegelvänt) >>>   pt1 = circSect(  19.5, 85, 0, [0, 50], "top", 1, fn);  // Uppe till höger - moturs >>>   pt2 = circSect(  39, 1.35,  .1, [-5, 90], "right", 1, fn);  // Nere till höger >>>   pt3 = circSect(  10, 13.05,  10, [0, 90], "bottom", 1, fn);  // Nere till vänster >>>   pt4 = circSect(   5, 80, 5, [0, 90], "left",   1, fn);  // Uppe till vänster >>>   translate([0, 0, -2]) >>>     linear_extrude(2.1) >>>       polygon(concat(pt1, pt2, pt3, pt4)); >>> >>>   // utgången för kabeln på baksidan (diam 10mm) - pekar lite nedåt >>>   cableExit(65, 35, 0, 15, "cyan", $fn=100); >>>   } >>> >>>   // skapa ett borrhål i bakkant >>>   translate([132,60,15]) >>>   { rotate([0, 90, 0]) >>>     { cylinder(h=10, d=2, $fn=100); >>>       cylinder(h=4, d=9, $fn=100); >>>     } >>>   } >>> >>>   // skapa en borrmarkering i bakkant >>>   translate([139,25,15]) >>>   { rotate([0, 90, 0]) >>>       cylinder(h=2, d1=1, d2=2.5, $fn=100); >>>   } >>> >>> >>>   // ingravera årtalet på baksidan >>>   translate([10, 80, -0.5]) >>>   { mirror([side, 0, 0]) >>>     { rotate([0, 180, 0]) >>>       { linear_extrude(3) >>>           text("2022", size=12, direction="ttb", font="Comic Sans MS:style=Bold"); >>>       } >>>     } >>>   } >>> >>>   /* >>>   // Markera skruvhål på bakkant >>>   borr=3; >>>   bredd=140; >>>   hojd=8; >>>   avstNed=20; >>>   translate([bredd, avstNed, hojd]) >>>   { rotate([0,90,0]) >>>       cylinder(h=2, d1=0.5, d2=borr, center=true, $fn=50); >>>   } >>>   */ >>> >>>   // borrhål >>>   mountingHole(20, 36, 0, 7, 90.1, 15); // posX, posY, posZ, diam, dist, deep, $fn=50 >>> >>>   } >>> } >>> //========  Slut box  ============================================================== >>> >>> >>> //================================================================================== >>> //======  cableExit  =============================================================== >>> module cableExit(posX, posY, posZ, angle, colorName) >>> { diamHole = 7; >>>   diamHolder = 9.8; >>>   hight = 12; >>>   topRad = diamHolder/2; >>>   topDiam = diamHolder/2-topRad/2; >>>   bowRad = 7; >>>   offs1 = 0.1; >>> >>>   color(colorName) >>>   translate([posX, posY, posZ]) >>>   {  rotate([180, 0, 180-angle]) >>>     { difference() >>>       { hull() >>>         { cylinder(h=hight, d=diamHolder, center=false); >>>           translate([0, 0, hight])        // rundad topp >>>             rotate_extrude(angle=360, convexity=2) >>>               translate([topDiam, 0, 0])  // yttre diam topp >>>                 circle(d=topRad);         // radie topp >>>         } >>> >>> >>>         inpHight  =  2;   // ett värde som styr var utgångshålet hamnar >>>         translate([0, 0, -offs1]) >>>           cylinder(h=inpHight+offs1, d=diamHole, center=false); // Bottenhål >>> >>>         translate([-bowRad, 0, inpHight-offs1]) // böjen >>>         { rotate([90, 0, 0]) >>>             rotate_extrude(angle=90, convexity=10) >>>               translate([bowRad, 0, 0]) // ställ in radien på kabelböjen >>>                 circle(d=diamHole); >>>         } >>>       } >>>     } >>>   } >>> } >>> //======  slut cableExit  ========================================================== >>> >>> >>> //================================================================================== >>> //======  mountingHole  ============================================================ >>> module mountingHole(posX=0, posY=0, posZ=0, diam=7, dist=90, deep=5, $fn=50) >>> { // diam =  6;   // [mm] >>>   // dist = 90;   // [mm] >>>   // deep =  12;  // [mm] >>> >>>   translate([posX, posY, posZ]) >>>   { translate([0, 0, -10]) >>>       cylinder(h=deep, d=diam);  // fästhål 1 >>> >>>     //cableHold1(dist/2, 0, .2, "#D5D5D5");  // Kabelgenomföring >>>     translate([dist/2, 0, 0]) >>>     {  hull() >>>       { cylinder(h=5, d=6);  // fästhål 1 >>>         sphere(d=7.5); >>>       } >>>     } >>> >>>     translate([dist, 0, -10]) >>>       cylinder(h=deep, d=diam); // fästhål 2 >>>   } >>> } >>> //======  slut mountingHole  ======================================================= >>> >>> >>> //================================================================================== >>> //======  LEDlampa  ================================================================ >>> // module LEDlampa(posX=8, posY=10, posZ=0) >>> module LEDlampa(posX=0, posY=0, posZ=0, mountSide="left") >>> { side = mountSide == "left" ? 0 >>>        : mountSide == "right" ? 1 >>>        : assert(false,"invalid moutSide value");  // message if no case worked >>> >>>   xpos = mountSide == "left" ? 121 >>>        : mountSide == "right" ? -10 >>>        : assert(false,"invalid moutSide value");  // message if no case worked >>>  /* >>>   ypos = mountSide == "left" ? 10.5 >>>        : mountSide == "right" ? 10.5 >>>        : assert(false,"invalid moutSide value");  // message if no case worked >>> >>>   zpos = mountSide == "left" ? 5 >>>        : mountSide == "right" ? 5 >>>        : assert(false,"invalid moutSide value");  // message if no case worked >>> */ >>> // echo(xpos,ypos,zpos); >>>   // translate([xpos, ypos, zpos]) >>>   translate([xpos, 10.5, 5]) >>>   mirror([1, 0, 0]) >>>   translate([posX, posY, posZ]) >>>   { LEDbottom(); >>>       translate([0, 0, 11]) >>>         LEDglas(); >>>   } >>> } >>> //======  Slut LEDlampa  =========================================================== >>> >>> >>> //================================================================================== >>> //======  LEDglas  ================================================================= >>> module LEDglas() >>> { >>>   // Variabler botten >>>   length  = 111;   // längd mm >>>   wideMid = 50.5;  // bredd i mitten mm >>> >>>   cornRad = 10;    // Radien i alla hörn >>>   wideCorn = 48;   // Bredd i kanterna >>> >>>   diamHole = 6;    // håldiameter i mm >>> >>>   colorBot = "gray"; >>>   colorTop = "orange"; >>> >>>   // Variabler top >>>   cornHigh = 5;   //Höjd i ändarna >>>   midHigh  = 8; >>>   highTop = cornHigh + 1;  // höjd mm >>> >>>   p1tx = 10;      // the start value >>>   p1ty = 49.25; >>>   p2tx = 55.5;    // the middle value >>>   p2ty = 50.5; >>>   p3tx = 101;     // the end value >>>   p3ty = p1ty; >>> >>>   p4tx = 101;     // the start value >>>   p4ty = 1.25; >>>   p5tx = 55.5;    // the middle value >>>   p5ty = 0.0; >>>   p6tx = 10;      // the end value >>>   p6ty = p4ty; >>>   // Ger ovalt glas >>>   points1 = 3points_arc([p1tx,p1ty], [p2tx,p2ty], [p3tx,p3ty], fn=100); >>>   points2 = 3points_arc([p4tx,p4ty], [p5tx,p5ty], [p6tx,p6ty], fn=100); >>> >>>   color("orange") >>>   linear_extrude(height=cornHigh+.1) >>>   difference() >>>   { polygon(concat(points1, points2)); >>> >>>     translate([length-10 , wideMid / 2, -.2]) >>>       circle(d=6); >>>     translate([10 , wideMid / 2, -.2]) >>>       circle(d=6); >>>   } >>> >>>   // Top >>>   color(colorTop) >>>   difference() >>>   { hull() >>>     { // hörn1 >>>       translate([cornRad, wideMid - ((wideMid-wideCorn)/2) - cornRad, 0]) // [10,39] >>>         cylinder(h=cornHigh, d=cornRad*2, center=false); >>>       // hörn2 >>>       translate([cornRad, cornRad + ((wideMid-wideCorn)/2), 0])           // [10,12] >>>         cylinder(h=cornHigh, d=cornRad*2, center=false); >>>       // hörn3 >>>       translate([length - cornRad, wideMid - ((wideMid-wideCorn)/2) - cornRad, 0]) // [101 ,39] >>>         cylinder(h=cornHigh, d=cornRad*2, center=false); >>>       // hörn4 >>>       translate([length - cornRad, cornRad + ((wideMid-wideCorn)/2), 0])  // >>>         cylinder(h=cornHigh, d=cornRad*2, center=false); >>>     } >>> >>>     union() >>>     { // Monteringshål 1 & 2 >>>       translate([length-10 , wideMid / 2, -.2]) >>>         cylinder(d=diamHole, h=highTop+.5, center=false); >>>       translate([10 , wideMid / 2, -.2]) >>>         cylinder(d=diamHole, h=highTop+.5, center=false); >>>     } >>>   } >>> } >>> //========  Slut LEDglas  ========================================================== >>> >>> >>> //================================================================================== >>> //======  LEDbottom  =============================================================== >>> module LEDbottom() >>> { p1x = 10;      // the start value >>>   p1y = 49.25; >>>   p2x = 55.5;    // the middle value >>>   p2y = 50.5; >>>   p3x = 101;     // the end value >>>   p3y = p1y; >>> >>>   p4x = 101;     // the start value >>>   p4y = 1.25; >>>   p5x = 55.5;    // the middle value >>>   p5y = 0.0; >>>   p6x = 10;      // the end value >>>   p6y = p4y; >>> >>>   // Variabler botten för borrhålen >>>   length  = 111;   // längd mm >>>   wideMid = 50.5;  // bredd i mitten mm >>>   diamHole = 6;    // håldiameter i mm >>>   cornHigh = 5;   //Höjd i ändarna >>>   midHigh  = 8; >>>   highTop = cornHigh + 1;  // höjd mm >>>   // offs1 = 0.1; >>>   heightHole = 15; //mm >>>   height = 11; //mm >>> >>>   points1 = circSect(  10, 11.25,  10, [0, 90], "bottom", 1, fn); // Hörn nere till vänster >>>   points2 = circSect(  10, 39.25,  10, [0, 90], "left",   1, fn); // Hörn uppe till vänster >>>   points3 = 3points_arc([p1x,p1y], [p2x,p2y], [p3x,p3y], fn); >>>   points4 = circSect( 101, 39.25,  10, [0, 90], "top",    1, fn); // Hörn uppe till höger >>>   points5 = circSect( 101, 11.25,  10, [0, 90], "right",  1, fn); // Hörn nere till höger >>>   points6 = 3points_arc([p4x,p4y], [p5x,p5y], [p6x,p6y], fn); >>> >>>   // The base plate for the LED lamp >>> >>> >>>   difference() >>>   { color("gray", 0.5) >>>     linear_extrude(height=height) >>>       polygon(concat(points1, points2, points3, points4, points5, points6)); >>> >>> >>>    // union() >>>     { // Monteringshål 1 & 2 >>>       translate([length-10 , wideMid / 2, -.2]) >>>         cylinder(d=diamHole, h=heightHole, center=false); >>>       translate([10 , wideMid / 2, -.2]) >>>         cylinder(d=diamHole, h=heightHole, center=false); >>>     } >>>   } >>> } >>> //========  Slut LEDbottom  ======================================================== >>> >>> >>> >>> //================================================================================== >>> //======  circleSect  ============================================================== >>> // Create rounded corners 2D >>> // https://openhome.cc/eGossip/OpenSCAD/SectorArc.html >>> // ange .:  x, y, radien, >>> //          [från, till] vinkel, >>> //          var vinkeln startar, (left, bottom, right, top) >>> //          vilken rotation (-1=medsol, 1=motsols) >>> function circSect(x=0, y=0, radius=10, angles=[0,270], startRef="bottom", rotate=1, fn=24)  = >>>     let( >>>         startAngel  = (startRef == "left")   ?   0 >>>                     : (startRef == "bottom") ?  90 >>>                     : (startRef == "right")  ? 180 >>>                     : (startRef == "top")    ? 270 >>>                     : startRef,  // valfri vinkel >>>                   // : assert(false,"invalid moutSide value");  // Error message if no case worked >>>                   //: undef, >>>         r = radius, >>>         //r = radius / cos(180 / fn), >>>         step = 360 / fn, >>>         // points = [[x, y], >>>         points = [ >>>             for(a = [angles[0]-startAngel : step : angles[1]-startAngel]) >>>                 [-rotate * r * cos(a)+x, r * sin(a)+y]] >>>     ) points; >>> //========  Slut circleSect  ======================================================= >>> >>> >>> //================================================================================== >>> //======  3points_arc  ============================================================= >>> // Create an arc with three points 2D >>> function 3points_arc(p0, p1, p2, fn=10) = >>>   // an alternative expression for D >>>   // D  = 2 * ( (p1-p0).x * (p2-p0).y - (p1-p0).y * (p2-p0).x ) >>>   let( D  = 2 * cross(p1-p0, (p2-p0)) ) >>>   assert( abs(D)>1e-9, "The 3 points should not be collinear." ) >>>   let( >>>       Ux     = ( (p2-p0).y*(p1-p0)*(p1-p0) - (p1-p0).y*(p2-p0)*(p2-p0) )/D, >>>       Uy     = ( (p1-p0).x*(p2-p0)*(p2-p0) - (p2-p0).x*(p1-p0)*(p1-p0) )/D, >>>       radius = norm([Ux,Uy]), >>>       center = [Ux,Uy] + p0, >>>       ang0   = atan2( (p0-center).y, (p0-center).x ), >>>       ang2   = atan2( (p2-center).y, (p2-center).x ), >>>       // the points are in a cw winding iff D<0 >>>       // the angular difference between vectors p2-center and p0-center >>>       // measured from p0-center; dang is positive iff D is negative >>>       dang   = D<0  ? ang2<ang0 ? ang2-ang0 : ang2-ang0-360 >>>                     : ang2>ang0 ? ang2-ang0 : ang2-ang0+360 >>>   ) >>>   [ for(i=[0:fn-1]) >>>       let( ang = ang0 + i*dang/(fn-1) ) >>>       center + radius*[cos(ang),sin(ang)] ]; >>> //========  Slut 3points_arc  ====================================================== >>> >>> >>> //================================================================================== >>> //======  Wall som ett "L"  ======================================================== >>> // Normal vägghöjd >>> function wall() = >>>   let( >>>         b =  4,     // botten - tjocklek >>>         f =  8,     // Foten >>>         h = 15,     // Höjd >>>         t =  3.5,   // Top >>>         x = (b+(t/2) - (h - ( (-h / (f-t)) *t) )) / (-h / (f-t)) >>>     ) >>>     let( >>>         points = [[0,0], [f,0], [t,h], [0,h]] , >>>         top = move([t/2, h, 0], circle(d=t, $fn=20)), >>>         sqr = square([10, b]), >>>         diff = >>>             difference([ >>>                   move([x, b], square([t/2, t/2])), >>>                   move([x+(t/2), b+(t/2), 0], circle(d = t, $fn=20) ) ]) >>>         ) >>>     union([points, top, sqr, diff]); >>> //========  Slut Wall  ============================================================= >>> >>> >>> >>> //================================================================================== >>> //======  Wall1 som ett "L"  ======================================================= >>> // En högre vägg >>> function wall1() = >>>   let( >>>     b =  4,     // botten - tjocklek >>>     f =  7,     // Foten >>>     h = 25,     // Höjd >>>     t =  3,   // Top >>>     x = (b+(t/2) - (h - ((-h / (f-t)) *t))) / (-h / (f-t)) >>>   ) >>>   let( >>>     points = [[0,0], [f,0], [t,h], [0,h]] , >>>     top = move([t/2, h, 0], circle(d=t, $fn=20)), >>>     sqr = square([10, b]), >>>     diff = >>>       difference([ >>>         move([x, b], square([t/2, t/2])), >>>         move([x+(t/2), b+(t/2), 0], circle(d = t, $fn=20) ) ]) >>>     ) >>>     union([points, top, sqr, diff]); >>> //========  Slut Wall1  ============================================================ >>> >>> >>> //================================================================================== >>> //======  Plåt på släp  ============================================================ >>> module mountingPlate(posX=0, posY=0, posZ=0, mountSide="left", colorName="#C0C0C0", $fn=50) >>> { // Hörnpositionerna >>>   posX1 = 120; >>>   posY1 = 0; >>>   posX2 = posX1; >>>   posY2 = -200; >>>   posX3 = 120 - 75; >>>   posY3 = -200; >>>   posX4 = 0; >>>   posY4 = 0; >>>   thick=2;  // tjocklek >>> >>>   side = mountSide == "left" ? 0 >>>        : mountSide == "right" ? 1 >>>        : assert(false,"invalid moutSide value");  // message if no case worked >>> >>>   xpos = mountSide == "left" ? 20 >>>        : mountSide == "right" ? -20 >>>        : assert(false,"invalid moutSide value");  // message if no case worked >>> /* >>>   ypos = mountSide == "left" ? 85 >>>        : mountSide == "right" ? 85 >>>        : assert(false,"invalid moutSide value");  // message if no case worked >>> >>>   zpos = mountSide == "left" ? -thick >>>        : mountSide == "right" ? -thick >>>        : assert(false,"invalid moutSide value");  // message if no case worked >>> */ >>>   color(colorName) >>>   {  translate([posX, posY, posZ]) >>>      translate([xpos, 85, -thick]) >>>     { mirror([side, 0, 0]) >>>       { linear_extrude(thick) >>>         hull() >>>         { translate([posX1, posY1, 0]) >>>             square(0.1, center = true); >>>           translate([posX2, posY2, 0]) >>>             square(0.1, center = true); >>>           translate([posX3, posY3, 0]) >>>             square(0.1, center = true); >>>           translate([posX4, posY4, 0]) >>>             square(0.1, center = true); >>>         } >>>       } >>>     } >>>   } >>> } >>> = = END product 1= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = >>> - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - >>> >>> >>> >>> >>> = = product 2 = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = >>> - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - >>> >>> $fn=100; >>> //$fn=15; >>> >>> //switch(); >>> //cableHolder4(); //Switchboxen >>> >>> >>> // cableHolder3(0, 0, 0, 33.5, 23.5, 1.5, 2); >>> // showCables(); >>> >>> >>> >>> module cableHolder4(fn=24); >>> { // idé från >>>   // - https://www.thingiverse.com/thing:6400/files >>>   // - https://ihrchive.wordpress.com/2011/02/14/openscad-tip-round-1-of-3-basic-rounding/ >>> >>>   // mått på Switch >>>   heightHold = 10.5; >>>   widthHold = 33.5; >>>   depthHold = 23.5; >>>   spaceHold = 10.0; // utrymmet bakom switch >>>   holdRadie = 2;  // radie i hörnen >>>   thick = 2; >>>   offset1=0.5;  // öka toleransen >>> >>>   // innermått >>>   holeW = widthHold + offset1; >>>   holeH = heightHold + offset1; >>>   holeD = depthHold + spaceHold+offset1; >>> >>>   // yttermått >>>   pad = 0.1;                   // Padding to maintain manifold >>>   box_l = holeW + thick*2;   // Bredden på switchen >>>   box_w = holeD + thick;             // Djupet på switchen >>>   box_h = holeH + thick; // Height >>>   round_r = holdRadie;         // Radius of round >>>   smooth = 45;                 // Number of facets of rounding cylinder >>> >>> >>> >>>   difference() >>>   { union() // Detta utförs i två steg. >>>     { difference()  // utför fasningar och kabelmarkeringar >>>       { mainBox(box_l, box_w, box_h, spaceHold+thick, round_r, thick, smooth, pad); >>> >>>         // fasning vänster (underkant) >>>         translate([box_l/2-0.85, spaceHold-4.3, thick-offset1])  // sidled, fram/bak , upp/ned >>>           rotate([0,180,45]) >>>             cylinder(h=thick, d1=holeW*1.414-thick-thick, d2=holeW*1.414, $fn=4); >>> >>>         // fasning höger (underkant) >>>         translate([box_l/2-3.65, spaceHold-4.3, thick-offset1]) // sidled, fram/bak , upp/ned >>>           rotate([0,180,45]) >>>             cylinder(h=thick, d1=holeW*1.414-thick-thick, d2=holeW*1.414, $fn=4); >>> >>>         // kabelgenomföringar >>>         rotate([90, 180, 90]) // Markering ena sidan (vänster under) >>>           ovalCableHole(spaceHold/2-offset1, -1.75, -1.2); >>> >>>         rotate([90, 180, 180]) // Markering bakkant (vänster under) >>>           ovalCableHole(spaceHold/2-1.55, -1.75, -spaceHold-0.85); >>> >>>         rotate([90, 180, 180]) // Markering bakkant (höger under) >>>           ovalCableHole(widthHold-spaceHold/2-offset1, -1.75, -spaceHold-0.85); >>> >>>         rotate([90, -180, 90])  // Markering ena sidan (höger under) >>>           ovalCableHole(3.75, -1.75, widthHold-0.1); >>>       } >>>     } // Slut union - kropp >>> >>>     translate([-offset1/2, -spaceHold+pad, -pad]) // hålet där switchen ska placeras >>>       cube([holeW, holeD+pad, holeH+pad], center=false); >>> >>>       translate([4, 12, 0]) >>>         cylinder(h=15,d=3.2); >>>       translate([4, 12, 17.7]) >>>         sphere(r=6); >>> >>>       translate([29.6, 12, 0]) >>>         cylinder(h=15,d=3.2); >>>       translate([29.6, 12, 17.7]) >>>         sphere(r=6); >>> >>>       /*  // Hål genom lock bak - om så önskas >>>       translate([box_l/2-thick, -6, offset1/2]) >>>         cylinder(h=box_h+thick*4+offset1, d=3.2, $fn=100);  // hål genom lock bak >>> >>>       translate([box_l/2-thick, -6, 17.7]) >>>         sphere(r=6);    // kona hålet bak >>>       */ >>>   } // Slut difference() - box >>> >>>     difference() >>>     { union() >>>       { translate([29.6, 12, heightHold-offset1*2]) >>>           cylinder(h=2,d=5.2);        // Stödhylsa för Switchskruv1 >>>         translate([4, 12, heightHold-offset1*2]) >>>           cylinder(h=2,d=5.2);        // Stödhylsa för Switchskruv2 >>> >>>         translate([holeW/2, -spaceHold+thick+1, holeH/2]) >>>           rotate([180,0,0]) >>>              backHole(); >>>       } // union - slut >>> >>>       translate([4, 12, 0])     //  Hålen i stödhylsorna >>>         cylinder(h=15,d=3.2); >>> >>>       translate([29.6, 12, 0])  //  Hålen i stödhylsorna >>>         cylinder(h=15,d=3.2); >>> >>>       translate([box_l/2-thick, -6, -offset1])  // hål i stödhylsa bak >>>         cylinder(h=box_h+offset1, d=3.2, $fn=100); >>> >>>       // Sänk stödhylsan >>>       translate([ widthHold/2-7, -spaceHold-offset1, -thick+offset1])  // hål i stödhylsa bak >>>           cube([15, 8, 3]); >>> >>> >>>       // kabelmarkering >>>       // translate([0, 0, 0])  // hål i stödhylsa bak >>> >>> >>>       } >>> >>> >>> >>> >>> >>> >>> /* >>>       translate([4, 12, 0]) >>>         #cylinder(h=15,d=3.2); >>>       //translate([4, 13.5, 17.3]) >>>         //#sphere(r=6); >>> >>>       translate([29.6, 12, 0]) >>>         #cylinder(h=15,d=3.2); >>>       //translate([29.6, 13.5, 17.3]) >>>         //#sphere(r=6); >>> */ >>> >>> >>> } >>> >>> module backHole() >>> { wallH = 10.5; >>> >>>   wide1   = 12; // endast runt cylindern >>>   wide2   = 35; // hela väggen >>>   deep1    =  4; >>>   height1  = 10.5; >>>   cornRad1  =  2; >>>   diam1 = 8; >>>   opt1 = 0.1; >>> >>>   //rundadFot(); >>> >>> >>>   // Rundad stäcka mellan t.ex. vägg och tak -bakkant >>>   translate([wide2/2, diam1/2-cornRad1/2, -height1/2]) >>>   { rotate([90, 0, -90]) >>>     { linear_extrude(wide2) >>>       { difference() >>>         { square([cornRad1, cornRad1]); >>> >>>           translate([cornRad1, cornRad1]) >>>             circle(r=cornRad1); >>>         } >>>       } >>>     } >>>   } >>> >>>   // rundad stäcka1 (vänster) mellan t.ex. vägg och tak >>>   translate([-wide2/2+0.15, deep1/2+cornRad1/2, -height1/2]) >>>   rotate([90, 0, 0]) >>>   { linear_extrude(spaceHold) >>>     { difference() >>>       { square([cornRad1, cornRad1]); >>> >>>         translate([cornRad1, cornRad1]) >>>         circle(r=cornRad1); >>>       } >>>     } >>>   } >>> >>>   // rundad stäcka2 mellan t.ex. vägg och tak >>>   translate([wide2/2-0.65, deep1/2+cornRad1/2, -height1/2]) >>>   rotate([0, -90, 90]) >>>   { linear_extrude(spaceHold) >>>     { difference() >>>       { square([cornRad1, cornRad1]); >>> >>>         translate([cornRad1, cornRad1]) >>>           circle(r=cornRad1); >>>       } >>>     } >>>   } >>> >>>   // Skapa stödfot - bak >>>   difference() >>>   { union() >>>     { //själva cylindern >>>       translate([0, 1, 0]) >>>       { cylinder(h=height1, d=diam1, center=true); >>>         translate([0, diam1/2, 0]) >>>           cube([diam1,diam1-1,height1], center=true); >>>       } >>> >>>       // Rundad fot under cylinder ovan >>>       translate([0, 1, -height1/2]) >>>       { rotate_extrude() >>>         { translate([diam1/2, 0, 0]) >>>           { difference() >>>             { square([cornRad1, cornRad1]); >>> >>>               translate([cornRad1, cornRad1]) >>>                 circle(r=cornRad1); >>>             } >>>           } >>>         } >>>       } >>> >>>       // Rundad rakstäcka1 - cylinderfot - mellan t.ex. vägg och tak >>>       translate([diam1/2, diam1, -height1/2]) >>>       { rotate([90, 0, 0]) >>>         { linear_extrude(diam1) >>>           { difference() >>>             { square([cornRad1, cornRad1]); >>> >>>               translate([cornRad1, cornRad1]) >>>                 circle(r=cornRad1); >>>             } >>>           } >>>         } >>>       } >>> >>>       // Rundad rakstäcka2 - cylinderfot - mellan t.ex. vägg och tak >>>       translate([-diam1/2, diam1, -height1/2]) >>>       { rotate([0, -90, 90]) >>>         { linear_extrude(diam1) >>>           { difference() >>>             { square([cornRad1, cornRad1]); >>> >>>               translate([cornRad1, cornRad1]) >>>                 circle(r=cornRad1); >>>             } >>>           } >>>         } >>>       } >>> >>>       //väggen bakom cylindern som ska rundas >>>       translate([0, diam1/2-cornRad1, 0]) >>>         cube([wide1, cornRad1, height1], center=true); >>> >>>     } >>> >>> >>>     // Avrunda hörn1 bak >>>     translate([-wide1/2, cornRad1/2, cornRad1]) >>>     { hull() >>>       { cylinder(h=height1+opt1, r=cornRad1, center=true); >>>         {  translate([0, 0, -height1/2]) >>>             sphere(r=cornRad1); >>>         } >>>       } >>>     } >>> >>>     // Avrunda hörn2 bak >>>     translate([wide1/2, cornRad1/2, cornRad1]) >>>     { hull() >>>       { cylinder(h=height1+opt1, r=cornRad1, center=true); >>>         {  translate([0, 0, -height1/2]) >>>             sphere(r=cornRad1); >>>         } >>>       } >>>     } >>> >>> >>>     // Plocka bort rundad fot bak samt det som sticker ut >>>     translate([-wide1/2, diam1/2-cornRad1/2, -height1/2-opt1]) >>>       cube([wide1, diam1/2+cornRad1, height1+opt1*2], center=false); >>> >>>   } >>> } >>> >>> >>> >>> >>> >>> module ovalCableHole(posX, posY, posZ) >>> { // Hål 5.5 x 3.5 mm >>>   pan = 0.1; >>>   cableHi = 1.5; >>> >>>   translate([posX, posY, posZ]) >>>   { color("white") >>>     { translate([0, 0, -pan]) >>>       { cylinder(h=cableHi, d=3.5); >>>         //#translate([0, 0, 0]) cylinder(h=10, d=1); >>>         //translate([0, 0, -1]) cylinder(h=1, d1=0, d2=1); >>>         //translate([0, 0, 0]) sphere(d=1); // Inre kulan >>>         //translate([0, 0, 1.5]) sphere(d=1); // Inre kulan >>> >>>         translate([0, 0, -1]) sphere(d=0.8); // yttre kulan >>>         translate([0, 0, 2.5]) sphere(d=0.8); // yttre kulan >>> >>>       } >>>       translate([2, 0, -pan]) >>>       { cylinder(h=cableHi, d=3.5); >>>         // #translate([0, 0, -cableHi*2]) cylinder(h=10, d=0.5); >>>         //translate([0, 0, 0]) sphere(d=1); // Inre kulan >>>         //translate([0, 0, 1.5]) sphere(d=1); // Inre kulan >>> >>>         translate([0, 0, -1]) sphere(d=0.8); // yttre kulan >>>         translate([0, 0, 2.5]) sphere(d=0.8); // yttre kulan >>> >>>       } >>>       translate([-3.5/2, 0, -pan]) >>>         cube([5.5, 3.5/2, cableHi]); >>>       translate([-0.25, -1.74, -pan]) >>>         cube([2.5, 1.75, cableHi]); >>>     } >>>   } >>> } >>> >>> >>> >>> >>> >>> >>> module rundadFot() >>> { >>>   // specifika värden för skruvdistansen bak >>>   wallH = 10.5; >>> >>>   wide1   = 12; // endast runt cylindern >>>   wide2   = 34; // hela väggen >>>   deep1    =  4; >>>   height1  = 10; >>>   cornRad1  =  2; >>>   diam1 = 8; >>>   opt1 = 0.1; >>> >>> >>>   color("magenta") >>>   { translate([0, 0, wallH]) >>>     { difference() >>>       { union() >>>         { // Bakgavel >>>           translate([wide2/2, opt1, height1/2]) >>>           { rotate([90, 180, 0]) >>>               cube([wide2, height1, opt1]); >>>           } >>> >>>           // Golv >>>           translate([wide2/2, -height1+opt1, -height1/2]) >>>             rotate([0, 180, 0]) >>>               cube([wide2, height1, opt1]); >>> >>>           //väggen bakom cylindern som kan rundas >>>           translate([0, -cornRad1/2, 0]) >>>             cube([wide1, cornRad1, height1], center=true); >>> >>>           //själva cylindern >>>           translate([0, -cornRad1/2, 0]) >>>             cylinder(h=height1, d=diam1, center=true); >>> >>>           // Rundad fot under cylinder ovan >>>           translate([0, -cornRad1/2, -height1/2]) >>>           { rotate_extrude() >>>             { translate([diam1/2, 0, 0]) >>>               { difference() >>>                 { square([cornRad1, cornRad1]); >>> >>>                   translate([cornRad1, cornRad1]) >>>                     circle(r=cornRad1); >>>                 } >>>               } >>>             } >>>           } >>> >>>           // Rundad stäcka mellan t.ex. vägg och tak -bakkant >>>           translate([wide2/2, 0, -height1/2]) >>>           { rotate([90, 0, -90]) >>>             { linear_extrude(wide2) >>>               { difference() >>>                 { square([cornRad1, cornRad1]); >>> >>>                   translate([cornRad1, cornRad1]) >>>                     circle(r=cornRad1); >>>                 } >>>               } >>>             } >>>           } >>> >>>           // rundad stäcka mellan t.ex. vägg och tak -sida1 >>>           translate([-wide2/2, 0, -height1/2]) >>>           { rotate([90, 0, 0]) >>>             { linear_extrude(10) >>>               { difference() >>>                 { square([cornRad1, cornRad1]); >>> >>>                   translate([cornRad1, cornRad1]) >>>                   circle(r=cornRad1); >>>                 } >>>               } >>>             } >>>           } >>> >>>           // rundad stäcka mellan t.ex. vägg och tak -sida2 >>>           translate([wide2/2, -10, -height1/2]) >>>           { rotate([90, 0, 180]) >>>             { linear_extrude(10) >>>               { difference() >>>                 { square([cornRad1, cornRad1]); >>> >>>                   translate([cornRad1, cornRad1]) >>>                   circle(r=cornRad1); >>>                 } >>>               } >>>             } >>>           } >>>         } // Avsluta union = = = = = = = = = = = = = = = = = = = = >>> >>> >>>         // Avrunda hörn1 bak >>>         translate([-wide1/2+opt1*1.3, -deep1/2, cornRad1]) >>>         { cylinder(h=height1+opt1, r=cornRad1, center=true); >>>             translate([0, 0, -height1/2]) >>>               sphere(r=cornRad1); >>>         } >>> >>>         // Avrunda hörn2 bak >>>         translate([wide1/2-opt1*1.3, -deep1/2, cornRad1]) >>>         { cylinder(h=height1+opt1, r=cornRad1, center=true); >>>             translate([0, 0, -height1/2]) >>>               sphere(r=cornRad1); >>>         } >>> >>>         // Plocka bort rundad fot bak samt det som sticker ut >>>         translate([-wide1/2, 0, -height1/2-opt1]) >>>           cube([wide1, diam1/2+cornRad1, height1+opt1*2], center=false); >>>       } >>>     } >>>   } >>> } >>> >>> >>> >>> >>> >>> >>> >>> >>> module mainBox(box_l, box_w, box_h, spaceHold, round_r, thick, smooth, pad) >>> { translate([box_l/2-thick-offset1/2, box_w/2-spaceHold, box_h/2]) >>>   { >>>     // To fix the corners cut the main cube with smaller cubes with spheres removed >>>     difference() >>>     { cube([box_l, box_w, box_h], center = true); >>> >>>       // Kant1 - liggande >>>       translate([0, -box_w/2+round_r, box_h/2-round_r]) >>>       { difference() >>>         { translate([0,-round_r-pad,round_r+pad]) >>>             cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center = true); >>>           rotate(a=[0,90,0]) >>>             cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth); >>>         } >>>       } >>>       // Kant2 - liggande >>>       translate([0, box_w/2-round_r, box_h/2-round_r]) >>>       { difference() >>>         { translate([0,round_r+pad,round_r+pad]) >>>             cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center = true); >>>           rotate(a=[0,90,0]) >>>             cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth); >>>         } >>>       } >>>       /* >>>       // Kant3 - liggande >>>       translate([0, -box_w/2+round_r, -box_h/2+round_r]) >>>       { difference() >>>         { translate([0,-round_r-pad,-round_r-pad]) >>>             cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center = true); >>>           rotate(a=[0,90,0]) >>>             cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth); >>>         } >>>       } >>> >>>       // Kant4 - liggande >>>       translate([0, box_w/2-round_r, -box_h/2+round_r]) >>>       { difference() >>>         { translate([0,round_r+pad,-round_r-pad]) >>>             cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center = true); >>>           rotate(a=[0,90,0]) >>>             cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth); >>>         } >>>       } >>>     */ >>>     // ---- >>>       // Kant1 - stående >>>       translate([-box_l/2+round_r, box_w/2-round_r, 0]) >>>       { difference() >>>         { translate([-round_r-pad,round_r+pad,0]) >>>             cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center = true); >>>           cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth); >>>         } >>>       } >>>       // Kant2 - stående >>>       translate([box_l/2-round_r, box_w/2-round_r, 0]) >>>       { difference() >>>         { translate([round_r+pad,round_r+pad,0]) >>>             cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center = true); >>>           cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth); >>>         } >>>       } >>>       // Kant3 - stående >>>       translate([-box_l/2+round_r, -box_w/2+round_r, 0]) >>>       { difference() >>>         { translate([-round_r-pad,-round_r-pad,0]) >>>             cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center = true); >>>           cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth); >>>         } >>>       } >>>       // Kant4 - stående >>>       translate([box_l/2-round_r, -box_w/2+round_r, 0]) >>>       { difference() >>>         { translate([round_r+pad,-round_r-pad,0]) >>>             cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center = true); >>>           cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth); >>>         } >>>       } >>> >>>     // ---- >>>       // Kant1 liggande (andra hållet) >>>       translate([-box_l/2+round_r, 0, box_h/2-round_r]) >>>       { difference() >>>         { translate([-round_r-pad, 0, round_r+pad]) >>>             cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center = true); >>>           rotate(a=[0,90,90]) >>>             cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth); >>>         } >>>       } >>>       // Kant2 liggande (andra hållet) >>>       translate([box_l/2-round_r, 0, box_h/2-round_r]) >>>       { difference() >>>         {  translate([round_r+pad, 0, round_r+pad]) >>>             cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center = true); >>>           rotate(a=[0,90,90]) >>>             cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth); >>>         } >>>       } >>>       /* >>>       // Kant3 liggande (andra hållet) >>>       translate([-box_l/2+round_r, 0, -box_h/2+round_r]) >>>       { difference() >>>         { translate([-round_r-pad, 0, -round_r-pad]) >>>             cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center = true); >>>           rotate(a=[0,90,90]) >>>             cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth); >>>         } >>>       } >>> >>>       // Kant4 liggande (andra hållet) >>>       translate([box_l/2-round_r, 0, -box_h/2+round_r]) >>>       { difference() >>>         { translate([round_r+pad, 0, -round_r-pad]) >>>             cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center = true); >>>           rotate(a=[0,90,90]) >>>             cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth); >>>         } >>>       } >>>   */ >>>     // ---- >>>       // Hörn1 (övre) >>>       translate([box_l/2-round_r, box_w/2-round_r, box_h/2-round_r]) >>>       { difference() >>>         { translate([round_r+pad, round_r+pad, round_r+pad]) >>>             cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = true); >>>           sphere(round_r,$fn=smooth); >>>         } >>>       } >>>       // Hörn2 (övre) >>>       translate([-box_l/2+round_r, box_w/2-round_r, box_h/2-round_r]) >>>       { difference() >>>         { translate([-round_r-pad, round_r+pad, round_r+pad]) >>>             cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = true); >>>           sphere(round_r,$fn=smooth); >>>         } >>>       } >>>       // Hörn3 (övre) >>>       translate([box_l/2-round_r, -box_w/2+round_r, box_h/2-round_r]) >>>       { difference() >>>         { translate([round_r+pad, -round_r-pad, round_r+pad]) >>>             cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = true); >>>           sphere(round_r,$fn=smooth); >>>         } >>>       } >>>       // Hörn4 (övre) >>>       translate([-box_l/2+round_r, -box_w/2+round_r, box_h/2-round_r]) >>>       { difference() >>>         { translate([-round_r-pad, -round_r-pad, round_r+pad]) >>>             cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = true); >>>           sphere(round_r,$fn=smooth); >>>         } >>>       } >>>       /* >>>       // Hörn1 (undre) >>>       translate([box_l/2-round_r, box_w/2-round_r, -box_h/2+round_r]) >>>       { difference() >>>         { translate([round_r+pad, round_r+pad, -round_r-pad]) >>>             cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = true); >>>           sphere(round_r,$fn=smooth); >>>         } >>>       } >>>       // Hörn2 (undre) >>>       translate([-box_l/2+round_r, box_w/2-round_r, -box_h/2+round_r]) >>>       { difference() >>>         { translate([-round_r-pad, round_r+pad, -round_r-pad]) >>>             cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = true); >>>           sphere(round_r,$fn=smooth); >>>         } >>>       } >>>       // Hörn3 (undre) >>>       translate([box_l/2-round_r, -box_w/2+round_r, -box_h/2+round_r]) >>>       { difference() >>>         { translate([round_r+pad, -round_r-pad, -round_r-pad]) >>>             cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = true); >>>           sphere(round_r,$fn=smooth); >>>         } >>>       } >>>       // Hörn4 (undre) >>>       translate([-box_l/2+round_r, -box_w/2+round_r, -box_h/2+round_r]) >>>       { difference() >>>         { translate([-round_r-pad, -round_r-pad, -round_r-pad]) >>>             cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = true); >>>           sphere(round_r,$fn=smooth); >>>         } >>>       } >>>       */ >>>     } >>>   } >>> } >>> // >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> module cableHolder3(posX, posY, posZ, length, width, height, radius) >>> { // Skapa toppen över switchen >>>   // mått på Switchen >>>   fn = 96;          // upplösning (endast bågen?) >>>   heightHold = 10.5; >>>   widthHold = 33.5; >>>   depthHold = 23.5; >>>   holdRadie = 1.5;  // radie i hörnen >>>   thick = 1.5;      // tjocklek >>> >>> >>>   translate([0,-thick,0]) >>>   { >>>     difference(0, 0, 0) >>>     { hull() >>>       { difference() >>>         { translate([thick, 0, heightHold]) // vänster kant >>>           { rotate([-90, 0, 0]) >>>             { cylinder(h=depthHold, d=thick*2); >>>               translate([0, 0, depthHold]) >>>                 sphere(d=thick*2);          // längst fram >>>             } >>>           } >>>           translate([0, -0.1, heightHold]) // plocka bort underdelen >>>             rotate([-90, 0, 0]) >>>               cube([thick*2, thick+.1, depthHold+thick+.1]); >>>         } >>> >>>         difference() >>>         { translate([widthHold-thick, 0, heightHold]) // höger kant >>>           { rotate([-90, 0, 0]) >>>             { cylinder(h=depthHold, d=thick*2); >>>               translate([0, 0, depthHold]) >>>                 sphere(d=thick*2);         // längst fram >>>             } >>>           } >>>           translate([widthHold-thick*2, -0.1, heightHold]) // plocka bort underdelen >>>           { rotate([-90, 0, 0]) >>>               cube([thick*2, thick+.1, depthHold+thick+.1]); >>>           } >>>         } >>>       } >>> >>>       // öppna hålen för monteringsskruvarna uppe på plattan >>>       translate([4, 13.5, 0]) >>>         cylinder(h=15,d=3.2); >>>       translate([4, 13.5, 17.3]) >>>         sphere(r=6); >>> >>>       translate([29.6, 13.5, 0]) >>>         cylinder(h=15,d=3.2); >>> >>>       translate([29.6, 13.5, 17.3]) >>>         sphere(r=6); >>>     } >>> >>>     // halvbåge 1 bak >>>     translate([thick, 0, heightHold/2+thick/2]) >>>       rotate([0, 90, 180]) >>>         rotate_extrude(angle = 180, convexity=20, $fn=64) >>>     translate([heightHold/2-thick/2, 0, 0]) >>>       circle(d=thick*2); >>>     translate([thick, 0, heightHold]) >>>       sphere(d=thick*2);  // övre kulan >>>     translate([thick, 0, thick]) >>>       sphere(d=thick*2);  // undre kulan >>> >>> >>>     // halvbåge 2 bak >>>     translate([widthHold-thick, 0, heightHold/2+thick/2]) >>>       rotate([0, 90, 180]) >>>         rotate_extrude(angle = 180, convexity=20, $fn=64) >>>     translate([heightHold/2-thick/2, 0, 0]) >>>       circle(d=thick*2); >>>     translate([widthHold-thick, 0, heightHold]) >>>       sphere(d=thick*2);  // övre kulan >>>     translate([widthHold-thick, 0, thick]) >>>       sphere(d=thick*2);  // undre kulan >>> >>>     // en cylinder tvärsöver längst upp >>>     translate([thick, 0, heightHold]) >>>     { rotate([0,90,0]) >>>         cylinder(h=widthHold-thick*2, r=thick); >>>     } >>>   } >>> >>>   // Halvbågen (kabelhållaren) på baksidan switchen >>>   translate([widthHold-thick, -thick, heightHold/2+thick/2]) >>>   { rotate([0,90,180]) >>>       linear_extrude(widthHold-thick*2) >>>         arc(heightHold/2-thick/2, [0, 180], thick, fn); //radius, angles, width, fn) >>>   } >>>   // en cylinder tvärsöver längst ned >>>   translate([thick, -thick, thick]) >>>   { rotate([0,90,0]) >>>       cylinder(h=widthHold-thick*2, r=thick); >>>   } >>> } >>> >>> >>> >>> module switch(posX=0, posY=0, posZ=0) >>> { buttRadie = 1.5; >>>   height = 10.5; >>>   width = 33.5; >>>   depth = 23.5; >>>   h1x = buttRadie; >>>   h1y = buttRadie; >>>   h2x = width-buttRadie; >>>   h2y = buttRadie; >>>   h3x = width-buttRadie; >>>   h3y = depth-buttRadie; >>>   h4x = buttRadie; >>>   h4y = depth-buttRadie; >>> >>>   translate([posX, posY, posZ]) >>>   { difference() >>>     { color("#F9F9F3") >>>        // tryck-knappen >>>       union() >>>       { translate([width/2, depth+6-0.1, height/2]) >>>         { rotate([90, 0, 0]) >>>           { translate([0,0,6]) >>>               circle(d=6.8);  // skuggan runt knapp >>>             cylinder(h=6, d=6); >>>             sphere(d=6); >>>           } >>>         } >>> >>>         hull()  // Switchkropp >>>         { translate([h1x, h1y]) >>>             cylinder(h=height, r=1.5); >>>           translate([h2x, h2y]) >>>             cylinder(h=height, r=1.5); >>>           translate([h3x, h3y]) >>>             cylinder(h=height, r=1.5); >>>           translate([h4x, h4y]) >>>             cylinder(h=height, r=1.5); >>>         } >>>       } >>> >>>       // Skruvhålen för switchen >>>       hole( 4, 12, 0, "#FFD700", height); >>>       hole(29.6, 12, 0, "#FFD700", height); >>>       // hole( 4, 12, 0, "#FFD700", 50); >>>       // hole(29.6, 12, 0, "#FFD700", 50); >>>       // hål för kablar bak >>>       color("gray") >>>       { translate([9.5, 16, height/2]) >>>         { rotate([90, 0, 0]) >>>             cylinder(h=16.5, d=4); >>>         } >>>         translate([24.5, 16, height/2]) >>>         {  rotate([90, 0, 0]) >>>             cylinder(h=16.5, d=4); >>>         } >>>       } >>> >>>       // hål för kabelskruvar >>>       color("white") >>>       { translate([29.5, 17.1, height/2]) >>>         { rotate([0, 90, 0]) >>>             cylinder(h=4.1, d=4.5); >>>         } >>>         translate([-0.1, 17.1, height/2]) >>>         { rotate([0, 90, 0]) >>>             cylinder(h=4.1, d=4.5); >>>         } >>>       } >>>     } >>> >>>     // Kabelskruvar >>>     cableScrew(3, 17, height/2, 90); >>>     cableScrew(31, 17, height/2, -90); >>> >>>   } >>> } >>> >>> // Skruven som håller fast kabeln i switchen >>> module cableScrew(posX=0, posY=0, posZ=0, angle=0) >>> { color("#FFD700")  // mässing >>>   translate([posX, posY, posZ]) >>>   { rotate([0, 0, angle]) >>>     { difference() >>>       { // skruvskalle >>>         translate([0, 0, 0]) >>>           rotate([90, 0, 0]) >>>             cylinder(h=2, d1=4, d2=3.5); >>> >>>         // stjärnan i skruven >>>         translate([0, 1.85, -.25]) >>>           rotate([0, 0, 0]) >>>             cylinder(h=0.5, d=5); >>>         translate([-0.25, -.6, 2.25]) >>>           rotate([0, 90, 0]) >>>             cube([4.5, 2, 0.5]); >>>       } >>>     } >>>   } >>> } >>> >>> >>> >>> // borrhål >>> module hole(posX=0, posY=0, posZ=0, colorName="yellow", height) >>> { diamHole1 = 3; >>>   highHole1 = height; >>>   diamHole2 = 6; >>>   highHole2 = 2.5; >>>   offs=0.1; >>> >>>   color(colorName) >>>   { >>>     translate([posX, posY, posZ]) >>>     { translate([0, 0, 0]) >>>         cylinder(h=highHole1, d=diamHole1); >>>       translate([0, 0, -offs]) >>>         cylinder(h=highHole2, d=diamHole2); >>>       translate([0, 0, height-highHole2+offs]) >>>         cylinder(h=highHole2, d=diamHole2); >>>     } >>>   } >>> } >>> >>> module showCables() >>> { translate([-25,8,24]) >>>     rotate([80,177,90]) >>>       cable(10,10,0,"brun"); >>>   translate([-43,8,15]) >>>     rotate([90,180,90]) >>>       cable(10,10,0,"blå"); >>> } >>> >>> >>> module cable(posX=0, posY=0, posZ=0, colorName="blå", radius=1.26, width=0.62, thick=50, fn=24) >>> { // default 1.5mm2 >>>   // radius = inner radie >>>   // width = bredd/tjocklek på cirkeln (inte höjd) >>>   // thick = höjd på cirken/ röret >>>   // pin= >>> >>>   colCupper = "#D7715A"; >>>   colGreen  = "#07DA63"; >>>   colYellow = "#FFCC00"; >>> >>>   if (colorName=="gröngul") >>>   { translate([posX, posY, posZ]) >>>     { color(colGreen) >>>         linear_extrude(thick) >>>           arc(radius, [0, 60], width, fn); >>>       color(colYellow) >>>         linear_extrude(thick) >>>           arc(radius, [60, 180], width, fn); >>>       color(colGreen) >>>         linear_extrude(thick) >>>           arc(radius, [180, 240], width, fn); >>>       color(colYellow) >>>         linear_extrude(thick) >>>           arc(radius, [240, 360], width, fn); >>> >>>       color(colCupper) >>>         linear_extrude(10, center=true, convexity=10, $fn=100) >>>           circle(d=1.24); >>>     } >>>   } >>>   else  // vanliga kablar 1.5mm2 >>>   { >>>     cableColor = colorName == "blå" ? "#1870D5" >>>                : colorName == "brun" ? "#9C6137" >>>                : colorName == "svart" ? "#000000" >>>                : assert(false,"invalid color value");  // message if no case worked >>>             // : nodef >>> >>>     translate([posX, posY, posZ]) >>>     {             //el kabel - ena änden rak - andra böjd >>>       color(colCupper)    //kopparstump tråd rakkabel >>>         linear_extrude(10, center=true, convexity=10, $fn=100) >>>           circle(d=1.24); >>> >>>        color(cableColor) >>>        { cylinder(h=thick, r=radius); >>> >>>         translate([-radius*2, 0, thick])  // kabelböj >>>         rotate([90, 0, 0]) >>>         rotate_extrude(angle=90, convexity=20) >>>           translate([2.5, 0, 0]) >>>             circle(r=1.26); >>> >>>         translate([-radius*2, 0, thick+radius*2]) >>>           rotate([0, -90, 0]) >>>           cylinder(h=5, r=radius); >>>       } >>>       translate([-10, 0, thick+radius*2]) >>>       { rotate([0, -90, 0]) >>>         { color(colCupper) >>>           { linear_extrude(5, center=true, convexity=10, $fn=100) >>>               circle(d=1.24); >>>           } >>>         } >>>       } >>>     } >>>   } >>> } >>> >>> >>> // ====================================================================== >>> module arc(radius, angles, width = 1, fn = 24) { >>>     difference() { >>>         sector(radius + width, angles, fn); // ytterradie >>>         sector(radius, angles, fn);         // innerradie (plockar bort invändigt >>>     } >>> } >>> >>> module sector(radius, angles, fn = 24) { >>>     r = radius / cos(180 / fn); >>>     step = -360 / fn; >>> >>>     points = concat([[0, 0]], >>>         [for(a = [angles[0] : step : angles[1] - 360]) >>>             [r * cos(a), r * sin(a)] >>>         ], >>>         [[r * cos(angles[1]), r * sin(angles[1])]] >>>     ); >>> >>>     difference() { >>>         circle(radius, $fn = fn); >>>         polygon(points); >>>     } >>> } >>> = = END product 2 = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = >>> - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - >>> >>> >>> Den fredag 6 maj 2022 14:06:55 CEST, Michael Möller <private2michael@gmail.com> skrev: >>> >>> >>> >>> OpenSCAD code - is a description of your model in terms of a few cylinder/cubes added and cut out >>> difference() { >>>   cylinder(d=5,h=10); >>>   translate([0,10,0]) cube([4,6,2]) ; >>> } >>> >>> STL file is a list of triangles which make the same outer shell as your model. OpenSCAD makes this complicated transform from shapes to triangles. >>> solid OpenSCAD_Model >>>   facet normal 0.92388 0.382682 0 >>>     outer loop >>>       vertex 2.5 0 3 >>>       vertex 1.76777 1.76777 0 >>>       vertex 1.76777 1.76777 3 >>>     endloop >>>   endfacet >>>   facet normal 0.92388 0.382682 0 >>>     outer loop >>>       vertex 1.76777 1.76777 0 >>>       vertex 2.5 0 3 >>>       vertex 2.5 0 0 >>>     endloop >>>   endfacet >>>   : (and so on for 300 lines) There is a binary/compressed version, but the description is still just triangles. >>> >>> Gcode is what a 3D printer understands - it is the exact list of moves that the head has to do with how much plastic to squeeze to trace the outline of your shape, layer, by layer. It will optionally create moves for filling the inside or support for overhangs. Such a program is called a SLICER and the printer will come with one. >>> G92 E0 ; reset extrusion distance >>> G1 Z2.330 F6600.000 ; lift Z >>> G1 X-0.000 Y1.505 F6600.000 ; move to first perimeter point >>> G1 Z0.330 F6600.000 ; restore layer Z >>> G1 E3.00000 F2400.00000 ; unretract extruder 0 >>> G1 F1500 >>> G1 X-1.064 Y1.064 E3.09259 ; perimeter >>> G1 X-1.505 Y0.000 E3.18517 ; perimeter >>>   : (many similar lines) >>> G1 X1.515 Y1.515 E4.65860 ; perimeter >>> G1 X0.055 Y2.120 E4.78559 ; perimeter >>> G1 X-0.000 Y2.143 F6600.000 ; move inwards before travel >>> G1 X0.384 Y0.843 F6600.000 ; move to first infill point >>> G1 F1500 >>> G1 X0.843 Y0.384 E4.84815 ; infill >>> G1 X1.097 Y-0.229 E4.91215 ; infill >>>  : >>> (and so on for thousands of lines) >>> >>> The 3MF still basically deals in triangles, and attributes (surface, infill material, picture, ticket info ... ) which probably are not used by your slicer/printer. >>> >>> On Fri, 6 May 2022 at 12:37, Jan Öhman via Discuss <discuss@lists.openscad.org> wrote: >>> >>> >>> >>> >>> ---------- Forwarded message ---------- >>> From: "Jan Öhman" <jan_ohman@yahoo.com> >>> To: OpenSCAD General Discussion <discuss@lists.openscad.org> >>> Cc: >>> Bcc: >>> Date: Fri, 6 May 2022 10:38:46 +0000 (UTC) >>> Subject: [OpenSCAD] Export to .STL / .3MF for later 3D-printing. >>> Hi! >>> >>> Thought to create some objects in openSCAD, to print later. >>> I do not have my own 3D printer (yet). >>> >>> One I talked to, wanted to get the drawings in .STL or .3MF. (I don't know the difference). >>> >>> If I had my own printer, have I been able to print directly from openSCAD? >>> (Without some export?) >>> >>> In the openSCAD, no errors or problems occur. >>> but >>> The drawings I tested to export from openSCAD have given one or another error message. >>> One message .: >>> WARNING: Object may not be a valid 2-manifold and may need repair! >>> >>> Another message .: >>> WARNING: No top level geometry to render >>> >>> What to do? >>> >>> >>> >>> ---------- Forwarded message ---------- >>> From: "Jan Öhman via Discuss" <discuss@lists.openscad.org> >>> To: OpenSCAD General Discussion <discuss@lists.openscad.org> >>> Cc: "Jan Öhman" <jan_ohman@yahoo.com> >>> Bcc: >>> Date: Fri, 6 May 2022 10:38:46 +0000 (UTC) >>> Subject: [OpenSCAD] Export to .STL / .3MF for later 3D-printing. >>> _______________________________________________ >>> OpenSCAD mailing list >>> To unsubscribe send an email to discuss-leave@lists.openscad.org >>> >>> _______________________________________________ >>> OpenSCAD mailing list >>> To unsubscribe send an email to discuss-leave@lists.openscad.org >>> >>> >>> >>> ---------- Forwarded message ---------- >>> From: "Jan Öhman via Discuss" <discuss@lists.openscad.org> >>> To: OpenSCAD general discussion <discuss@lists.openscad.org> >>> Cc: "Jan Öhman" <jan_ohman@yahoo.com> >>> Bcc: >>> Date: Sat, 7 May 2022 11:04:31 +0000 (UTC) >>> Subject: [OpenSCAD] Re: Export to .STL / .3MF for later 3D-printing. >>> _______________________________________________ >>> OpenSCAD mailing list >>> To unsubscribe send an email to discuss-leave@lists.openscad.org >> >> _______________________________________________ >> OpenSCAD mailing list >> To unsubscribe send an email to discuss-leave@lists.openscad.org > > _______________________________________________ > OpenSCAD mailing list > To unsubscribe send an email to discuss-leave@lists.openscad.org _______________________________________________ OpenSCAD mailing list To unsubscribe send an email to discuss-leave@lists.openscad.org _______________________________________________ OpenSCAD mailing list To unsubscribe send an email to discuss-leave@lists.openscad.org
SP
Sanjeev Prabhakar
Sun, May 8, 2022 1:51 PM

I tried to build the basic shape.

try the following code (you would need dependencies.scad which is available
at https://github.com/sprabhakar2006/openSCAD):

include<dependencies.scad>

sec=cr(pts1([[0,3,10],[40,-3,10],[100,0,.1],[0,80,.1],[-100,0,10],[-40,-3,10]]),10);

path=cr(pts1([[-10,0],[10,0,0],[0,15,1.5],[-1.5,0]]),10);
prism=prism1(sec,path);

path1=cr(pts1([[-10,3],[6,0,2],[1,12,1.5],[1.5,0],[0,1]]),10);
prism1=prism1(sec,path1);

prism2=l_extrude(offset(sec,-10),3);

sec1=cr(pts1([[0,0,1],[10,0,1],[0,25,1.5],[-3,0,1.5],[-2,-22,2],[-5,0]]),5);
prism3=trns([140-10,80,0],q_rot(["x90"],l_extrude(sec1,80)));
render()
difference(){
swp(prism);
swp(prism1);
}
swp(prism2);
swp(prism3);

dimensions are approximate and I have not checked the exact code.
above code renders successfully

On Sat, 7 May 2022 at 22:27, Michael Möller private2michael@gmail.com
wrote:

Jan Öhman wrote it failed in Render/F6, but works in Preview/F5 - in so
many words. I tried and got the following

First model
[image: image.png]
F6 Error: WARNING: Ignoring 2D child object for 3D operation in file ,
line 53

ERROR: CGAL error in CGALUtils::applyUnion3D: CGAL ERROR: assertion
violation! Expr: G.mark(v1,0)==G.mark(v2,0)&& G.mark(v1,1)==G.mark(v2,1)
File:
/mxe/usr/x86_64-w64-mingw32.static.posix/include/CGAL/Nef_S2/SM_overlayer.h
Line: 303

Which I think is pretty selfexplantory: Passed a 2D shape to something
that expected a 3D shape - but you have to read the whole code to find it
... which I think Jan is more qualified to do :-)

2nd part
[image: image.png]

... which is one of those where zooming or rotating the model in preview
takes >5 second
[image: image.png]

And I didn't bother waiting for the F6 error ... ;-)

Of course, we do not know if the above shapes I got are the ones that Jan
wants - there are also sections of code commented out.

(From the comments it seems these are to be nice and alternative covers
for wall outlet/switches.)

On Sat, 7 May 2022 at 18:26, Sanjeev Prabhakar sprabhakar2006@gmail.com
wrote:

Quite a long code.
Can you paste a picture of what you are trying to draw.
Regards
Sanjeev

On Sat, 7 May 2022, 16:31 Jan Öhman via Discuss, <
discuss@lists.openscad.org> wrote:

---------- Forwarded message ----------
From: "Jan Öhman" jan_ohman@yahoo.com
To: OpenSCAD general discussion discuss@lists.openscad.org
Cc:
Bcc:
Date: Sat, 7 May 2022 11:04:31 +0000 (UTC)
Subject: [OpenSCAD] Re: Export to .STL / .3MF for later 3D-printing.
Thank you!
Begins to understand how it works. (It was not easy...)

but my solution was not good ...

Here are 2 files that do not work to render (F6)

= = product 1= = = = = = = = = = = = = = = = = = = = = = = = = = = = =
= = =

  • . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . -
    . _ . - . _ . - . _ . - . _ . -

include <BOSL2/std.scad>
fn = 150;

placering="left";
// placering="right"

box(0, 0, 0, placering, "#C0C0C0", fn); // (X, Y, Z, left/right,
colorName)

// Monteringsplattan
// mountingPlate(0, 0, 0, placering);

// LED belysning
// LEDlampa(0, 0, 0, placering);

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - - - m o d u l e r - - - - - - - - - - - - - - - - - -

//

---================
//======  box


---===
module box(posX=0, posY=0, posZ=0, mountSide="left",
colorName="#00FF00", fn=24)
{
side = mountSide == "left" ? 0
: mountSide == "right" ? 1
: assert(false,"invalid moutSide value");  // message if no case
worked

color(colorName)
translate([posX, posY, posZ])
mirror([side, 0, 0])
difference()
{
union()
{
// Skapa konturer på bottenplattan - x, y, r, angles, [grader], början
// Rotation medurs - vänster lamphållare (bakant saknas)
points1 = circSect( 140,  0,  0, [0, 0], "right",  1, fn);  // böj
nere till höger
points2 = circSect(  60,  5,  5, [0, 5], "bottom",  1, fn); //
brytpunkt längst ned
points3 = circSect(  10, 13,  10, [0, 90], "bottom", 1, fn); // böj
nere till vänster
points4 = circSect(  5, 80,  5, [0, 90], "left",  1, fn); // böj
uppe till vänster
points5 = circSect( 140, 80,  5, [0, 1], "top",  1, fn);  // böj
uppe till höger
edge = concat(points1, points2, points3, points4, points5);
path = path3d(reverse(edge));
section = wall();
path_sweep( section, path, closed=false);

// Skapa bakkant lite högre och smalare i topp
bottom1 = concat(points5, points1);
polygon(bottom1);
path1 = path3d(reverse(bottom1));
section1 = wall1(); // lite högre bakvägg wall(b=4, f=8, h=15, t=3.5)
path_sweep( section1, path1, closed=false);

// fyll upp bottenplattansbaksida
linear_extrude(4) // Bottomplate - fill up
polygon(concat(points1, points2, points3, points4, points5));

// skapa Utskjutande del under (tänk spegelvänt)
pt1 = circSect(  19.5, 85, 0, [0, 50], "top", 1, fn);  // Uppe till
höger - moturs
pt2 = circSect(  39, 1.35,  .1, [-5, 90], "right", 1, fn);  // Nere
till höger
pt3 = circSect(  10, 13.05,  10, [0, 90], "bottom", 1, fn);  // Nere
till vänster
pt4 = circSect(  5, 80, 5, [0, 90], "left",  1, fn);  // Uppe till
vänster
translate([0, 0, -2])
linear_extrude(2.1)
polygon(concat(pt1, pt2, pt3, pt4));

// utgången för kabeln på baksidan (diam 10mm) - pekar lite nedåt
cableExit(65, 35, 0, 15, "cyan", $fn=100);
}

// skapa ett borrhål i bakkant
translate([132,60,15])
{ rotate([0, 90, 0])
{ cylinder(h=10, d=2, $fn=100);
cylinder(h=4, d=9, $fn=100);
}
}

// skapa en borrmarkering i bakkant
translate([139,25,15])
{ rotate([0, 90, 0])
cylinder(h=2, d1=1, d2=2.5, $fn=100);
}

// ingravera årtalet på baksidan
translate([10, 80, -0.5])
{ mirror([side, 0, 0])
{ rotate([0, 180, 0])
{ linear_extrude(3)
text("2022", size=12, direction="ttb", font="Comic Sans
MS:style=Bold");
}
}
}

/*
// Markera skruvhål på bakkant
borr=3;
bredd=140;
hojd=8;
avstNed=20;
translate([bredd, avstNed, hojd])
{ rotate([0,90,0])
cylinder(h=2, d1=0.5, d2=borr, center=true, $fn=50);
}
*/

// borrhål
mountingHole(20, 36, 0, 7, 90.1, 15); // posX, posY, posZ, diam, dist,
deep, $fn=50

}
}
//========  Slut box

---=============================

//

---================
//======  cableExit

---==============================
module cableExit(posX, posY, posZ, angle, colorName)
{ diamHole = 7;
diamHolder = 9.8;
hight = 12;
topRad = diamHolder/2;
topDiam = diamHolder/2-topRad/2;
bowRad = 7;
offs1 = 0.1;

color(colorName)
translate([posX, posY, posZ])
{  rotate([180, 0, 180-angle])
{ difference()
{ hull()
{ cylinder(h=hight, d=diamHolder, center=false);
translate([0, 0, hight])        // rundad topp
rotate_extrude(angle=360, convexity=2)
translate([topDiam, 0, 0])  // yttre diam topp
circle(d=topRad);        // radie topp
}

     inpHight  =  2;   // ett värde som styr var utgångshålet hamnar
     translate([0, 0, -offs1])
       cylinder(h=inpHight+offs1, d=diamHole, center=false); //

Bottenhål

     translate([-bowRad, 0, inpHight-offs1]) // böjen
     { rotate([90, 0, 0])
         rotate_extrude(angle=90, convexity=10)
           translate([bowRad, 0, 0]) // ställ in radien på kabelböjen
             circle(d=diamHole);
     }
   }
 }

}
}
//======  slut cableExit

---=========================

//

---================
//======  mountingHole

---===========================
module mountingHole(posX=0, posY=0, posZ=0, diam=7, dist=90, deep=5,
$fn=50)
{ // diam =  6;  // [mm]
// dist = 90;  // [mm]
// deep =  12;  // [mm]

translate([posX, posY, posZ])
{ translate([0, 0, -10])
cylinder(h=deep, d=diam);  // fästhål 1

 //cableHold1(dist/2, 0, .2, "#D5D5D5");  // Kabelgenomföring
 translate([dist/2, 0, 0])
 {  hull()
   { cylinder(h=5, d=6);  // fästhål 1
     sphere(d=7.5);
   }
 }

 translate([dist, 0, -10])
   cylinder(h=deep, d=diam); // fästhål 2

}
}
//======  slut mountingHole

---======================

//

---================
//======  LEDlampa

---===============================
// module LEDlampa(posX=8, posY=10, posZ=0)
module LEDlampa(posX=0, posY=0, posZ=0, mountSide="left")
{ side = mountSide == "left" ? 0
: mountSide == "right" ? 1
: assert(false,"invalid moutSide value");  // message if no case
worked

xpos = mountSide == "left" ? 121
: mountSide == "right" ? -10
: assert(false,"invalid moutSide value");  // message if no case
worked
/*
ypos = mountSide == "left" ? 10.5
: mountSide == "right" ? 10.5
: assert(false,"invalid moutSide value");  // message if no case
worked

zpos = mountSide == "left" ? 5
: mountSide == "right" ? 5
: assert(false,"invalid moutSide value");  // message if no case
worked
*/
// echo(xpos,ypos,zpos);
// translate([xpos, ypos, zpos])
translate([xpos, 10.5, 5])
mirror([1, 0, 0])
translate([posX, posY, posZ])
{ LEDbottom();
translate([0, 0, 11])
LEDglas();
}
}
//======  Slut LEDlampa

---==========================

//

---================
//======  LEDglas

---================================
module LEDglas()
{
// Variabler botten
length  = 111;  // längd mm
wideMid = 50.5;  // bredd i mitten mm

cornRad = 10;    // Radien i alla hörn
wideCorn = 48;  // Bredd i kanterna

diamHole = 6;    // håldiameter i mm

colorBot = "gray";
colorTop = "orange";

// Variabler top
cornHigh = 5;  //Höjd i ändarna
midHigh  = 8;
highTop = cornHigh + 1;  // höjd mm

p1tx = 10;      // the start value
p1ty = 49.25;
p2tx = 55.5;    // the middle value
p2ty = 50.5;
p3tx = 101;    // the end value
p3ty = p1ty;

p4tx = 101;    // the start value
p4ty = 1.25;
p5tx = 55.5;    // the middle value
p5ty = 0.0;
p6tx = 10;      // the end value
p6ty = p4ty;
// Ger ovalt glas
points1 = 3points_arc([p1tx,p1ty], [p2tx,p2ty], [p3tx,p3ty], fn=100);
points2 = 3points_arc([p4tx,p4ty], [p5tx,p5ty], [p6tx,p6ty], fn=100);

color("orange")
linear_extrude(height=cornHigh+.1)
difference()
{ polygon(concat(points1, points2));

 translate([length-10 , wideMid / 2, -.2])
   circle(d=6);
 translate([10 , wideMid / 2, -.2])
   circle(d=6);

}

// Top
color(colorTop)
difference()
{ hull()
{ // hörn1
translate([cornRad, wideMid - ((wideMid-wideCorn)/2) - cornRad,
0]) // [10,39]
cylinder(h=cornHigh, d=cornRad2, center=false);
// hörn2
translate([cornRad, cornRad + ((wideMid-wideCorn)/2), 0])
// [10,12]
cylinder(h=cornHigh, d=cornRad
2, center=false);
// hörn3
translate([length - cornRad, wideMid - ((wideMid-wideCorn)/2) -
cornRad, 0]) // [101 ,39]
cylinder(h=cornHigh, d=cornRad2, center=false);
// hörn4
translate([length - cornRad, cornRad + ((wideMid-wideCorn)/2),
0])  //
cylinder(h=cornHigh, d=cornRad
2, center=false);
}

 union()
 { // Monteringshål 1 & 2
   translate([length-10 , wideMid / 2, -.2])
     cylinder(d=diamHole, h=highTop+.5, center=false);
   translate([10 , wideMid / 2, -.2])
     cylinder(d=diamHole, h=highTop+.5, center=false);
 }

}
}
//========  Slut LEDglas

---=========================

//

---================
//======  LEDbottom

---==============================
module LEDbottom()
{ p1x = 10;      // the start value
p1y = 49.25;
p2x = 55.5;    // the middle value
p2y = 50.5;
p3x = 101;    // the end value
p3y = p1y;

p4x = 101;    // the start value
p4y = 1.25;
p5x = 55.5;    // the middle value
p5y = 0.0;
p6x = 10;      // the end value
p6y = p4y;

// Variabler botten för borrhålen
length  = 111;  // längd mm
wideMid = 50.5;  // bredd i mitten mm
diamHole = 6;    // håldiameter i mm
cornHigh = 5;  //Höjd i ändarna
midHigh  = 8;
highTop = cornHigh + 1;  // höjd mm
// offs1 = 0.1;
heightHole = 15; //mm
height = 11; //mm

points1 = circSect(  10, 11.25,  10, [0, 90], "bottom", 1, fn); //
Hörn nere till vänster
points2 = circSect(  10, 39.25,  10, [0, 90], "left",  1, fn); //
Hörn uppe till vänster
points3 = 3points_arc([p1x,p1y], [p2x,p2y], [p3x,p3y], fn);
points4 = circSect( 101, 39.25,  10, [0, 90], "top",    1, fn); //
Hörn uppe till höger
points5 = circSect( 101, 11.25,  10, [0, 90], "right",  1, fn); //
Hörn nere till höger
points6 = 3points_arc([p4x,p4y], [p5x,p5y], [p6x,p6y], fn);

// The base plate for the LED lamp

difference()
{ color("gray", 0.5)
linear_extrude(height=height)
polygon(concat(points1, points2, points3, points4, points5,
points6));

// union()
 { // Monteringshål 1 & 2
   translate([length-10 , wideMid / 2, -.2])
     cylinder(d=diamHole, h=heightHole, center=false);
   translate([10 , wideMid / 2, -.2])
     cylinder(d=diamHole, h=heightHole, center=false);
 }

}
}
//========  Slut LEDbottom

---=======================

//

---================
//======  circleSect

---=============================
// Create rounded corners 2D
// https://openhome.cc/eGossip/OpenSCAD/SectorArc.html
// ange .:  x, y, radien,
//          [från, till] vinkel,
//          var vinkeln startar, (left, bottom, right, top)
//          vilken rotation (-1=medsol, 1=motsols)
function circSect(x=0, y=0, radius=10, angles=[0,270],
startRef="bottom", rotate=1, fn=24)  =
let(
startAngel  = (startRef == "left")  ?  0
: (startRef == "bottom") ?  90
: (startRef == "right")  ? 180
: (startRef == "top")    ? 270
: startRef,  // valfri vinkel
// : assert(false,"invalid moutSide value");  // Error
message if no case worked
//: undef,
r = radius,
//r = radius / cos(180 / fn),
step = 360 / fn,
// points = [[x, y],
points = [
for(a = [angles[0]-startAngel : step : angles[1]-startAngel])
[-rotate * r * cos(a)+x, r * sin(a)+y]]
) points;
//========  Slut circleSect

---======================

//

---================
//======  3points_arc

---============================
// Create an arc with three points 2D
function 3points_arc(p0, p1, p2, fn=10) =
// an alternative expression for D
// D  = 2 * ( (p1-p0).x * (p2-p0).y - (p1-p0).y * (p2-p0).x )
let( D  = 2 * cross(p1-p0, (p2-p0)) )
assert( abs(D)>1e-9, "The 3 points should not be collinear." )
let(
Ux    = ( (p2-p0).y*(p1-p0)(p1-p0) - (p1-p0).y(p2-p0)(p2-p0)
)/D,
Uy    = ( (p1-p0).x
(p2-p0)(p2-p0) - (p2-p0).x(p1-p0)(p1-p0)
)/D,
radius = norm([Ux,Uy]),
center = [Ux,Uy] + p0,
ang0  = atan2( (p0-center).y, (p0-center).x ),
ang2  = atan2( (p2-center).y, (p2-center).x ),
// the points are in a cw winding iff D<0
// the angular difference between vectors p2-center and p0-center
// measured from p0-center; dang is positive iff D is negative
dang  = D<0  ? ang2<ang0 ? ang2-ang0 : ang2-ang0-360
: ang2>ang0 ? ang2-ang0 : ang2-ang0+360
)
[ for(i=[0:fn-1])
let( ang = ang0 + i
dang/(fn-1) )
center + radius*[cos(ang),sin(ang)] ];
//========  Slut 3points_arc

---=====================

//

---================
//======  Wall som ett "L"

---=======================
// Normal vägghöjd
function wall() =
let(
b =  4,    // botten - tjocklek
f =  8,    // Foten
h = 15,    // Höjd
t =  3.5,  // Top
x = (b+(t/2) - (h - ( (-h / (f-t)) *t) )) / (-h / (f-t))
)
let(
points = [[0,0], [f,0], [t,h], [0,h]] ,
top = move([t/2, h, 0], circle(d=t, $fn=20)),
sqr = square([10, b]),
diff =
difference([
move([x, b], square([t/2, t/2])),
move([x+(t/2), b+(t/2), 0], circle(d = t, $fn=20) ) ])
)
union([points, top, sqr, diff]);
//========  Slut Wall

---============================

//

---================
//======  Wall1 som ett "L"

---======================
// En högre vägg
function wall1() =
let(
b =  4,    // botten - tjocklek
f =  7,    // Foten
h = 25,    // Höjd
t =  3,  // Top
x = (b+(t/2) - (h - ((-h / (f-t)) *t))) / (-h / (f-t))
)
let(
points = [[0,0], [f,0], [t,h], [0,h]] ,
top = move([t/2, h, 0], circle(d=t, $fn=20)),
sqr = square([10, b]),
diff =
difference([
move([x, b], square([t/2, t/2])),
move([x+(t/2), b+(t/2), 0], circle(d = t, $fn=20) ) ])
)
union([points, top, sqr, diff]);
//========  Slut Wall1

---===========================

//

---================
//======  Plåt på släp

---===========================
module mountingPlate(posX=0, posY=0, posZ=0, mountSide="left",
colorName="#C0C0C0", $fn=50)
{ // Hörnpositionerna
posX1 = 120;
posY1 = 0;
posX2 = posX1;
posY2 = -200;
posX3 = 120 - 75;
posY3 = -200;
posX4 = 0;
posY4 = 0;
thick=2;  // tjocklek

side = mountSide == "left" ? 0
: mountSide == "right" ? 1
: assert(false,"invalid moutSide value");  // message if no case
worked

xpos = mountSide == "left" ? 20
: mountSide == "right" ? -20
: assert(false,"invalid moutSide value");  // message if no case
worked
/*
ypos = mountSide == "left" ? 85
: mountSide == "right" ? 85
: assert(false,"invalid moutSide value");  // message if no case
worked

zpos = mountSide == "left" ? -thick
: mountSide == "right" ? -thick
: assert(false,"invalid moutSide value");  // message if no case
worked
*/
color(colorName)
{  translate([posX, posY, posZ])
translate([xpos, 85, -thick])
{ mirror([side, 0, 0])
{ linear_extrude(thick)
hull()
{ translate([posX1, posY1, 0])
square(0.1, center = true);
translate([posX2, posY2, 0])
square(0.1, center = true);
translate([posX3, posY3, 0])
square(0.1, center = true);
translate([posX4, posY4, 0])
square(0.1, center = true);
}
}
}
}
}
= = END product 1= = = = = = = = = = = = = = = = = = = = = = = = = = =
= = =

  • . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . -
    . _ . - . _ . - . _ . - . _ . -

= = product 2 = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
= = =

  • . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . -
    . _ . - . _ . - . _ . - . _ . -

$fn=100;
//$fn=15;

//switch();
//cableHolder4(); //Switchboxen

// cableHolder3(0, 0, 0, 33.5, 23.5, 1.5, 2);
// showCables();

module cableHolder4(fn=24);
{ // idé från
// - https://www.thingiverse.com/thing:6400/files
// -
https://ihrchive.wordpress.com/2011/02/14/openscad-tip-round-1-of-3-basic-rounding/

// mått på Switch
heightHold = 10.5;
widthHold = 33.5;
depthHold = 23.5;
spaceHold = 10.0; // utrymmet bakom switch
holdRadie = 2;  // radie i hörnen
thick = 2;
offset1=0.5;  // öka toleransen

// innermått
holeW = widthHold + offset1;
holeH = heightHold + offset1;
holeD = depthHold + spaceHold+offset1;

// yttermått
pad = 0.1;                  // Padding to maintain manifold
box_l = holeW + thick*2;  // Bredden på switchen
box_w = holeD + thick;            // Djupet på switchen
box_h = holeH + thick; // Height
round_r = holdRadie;        // Radius of round
smooth = 45;                // Number of facets of rounding cylinder

difference()
{ union() // Detta utförs i två steg.
{ difference()  // utför fasningar och kabelmarkeringar
{ mainBox(box_l, box_w, box_h, spaceHold+thick, round_r, thick,
smooth, pad);

     // fasning vänster (underkant)
     translate([box_l/2-0.85, spaceHold-4.3, thick-offset1])  //

sidled, fram/bak , upp/ned
rotate([0,180,45])
cylinder(h=thick, d1=holeW1.414-thick-thick,
d2=holeW
1.414, $fn=4);

     // fasning höger (underkant)
     translate([box_l/2-3.65, spaceHold-4.3, thick-offset1]) //

sidled, fram/bak , upp/ned
rotate([0,180,45])
cylinder(h=thick, d1=holeW1.414-thick-thick,
d2=holeW
1.414, $fn=4);

     // kabelgenomföringar
     rotate([90, 180, 90]) // Markering ena sidan (vänster under)
       ovalCableHole(spaceHold/2-offset1, -1.75, -1.2);

     rotate([90, 180, 180]) // Markering bakkant (vänster under)
       ovalCableHole(spaceHold/2-1.55, -1.75, -spaceHold-0.85);

     rotate([90, 180, 180]) // Markering bakkant (höger under)
       ovalCableHole(widthHold-spaceHold/2-offset1, -1.75,

-spaceHold-0.85);

     rotate([90, -180, 90])  // Markering ena sidan (höger under)
       ovalCableHole(3.75, -1.75, widthHold-0.1);
   }
 } // Slut union - kropp

 translate([-offset1/2, -spaceHold+pad, -pad]) // hålet där switchen

ska placeras
cube([holeW, holeD+pad, holeH+pad], center=false);

   translate([4, 12, 0])
     cylinder(h=15,d=3.2);
   translate([4, 12, 17.7])
     sphere(r=6);

   translate([29.6, 12, 0])
     cylinder(h=15,d=3.2);
   translate([29.6, 12, 17.7])
     sphere(r=6);

   /*  // Hål genom lock bak - om så önskas
   translate([box_l/2-thick, -6, offset1/2])
     cylinder(h=box_h+thick*4+offset1, d=3.2, $fn=100);  // hål genom

lock bak

   translate([box_l/2-thick, -6, 17.7])
     sphere(r=6);    // kona hålet bak
   */

} // Slut difference() - box

 difference()
 { union()
   { translate([29.6, 12, heightHold-offset1*2])
       cylinder(h=2,d=5.2);        // Stödhylsa för Switchskruv1
     translate([4, 12, heightHold-offset1*2])
       cylinder(h=2,d=5.2);        // Stödhylsa för Switchskruv2

     translate([holeW/2, -spaceHold+thick+1, holeH/2])
       rotate([180,0,0])
          backHole();
   } // union - slut

   translate([4, 12, 0])     //  Hålen i stödhylsorna
     cylinder(h=15,d=3.2);

   translate([29.6, 12, 0])  //  Hålen i stödhylsorna
     cylinder(h=15,d=3.2);

   translate([box_l/2-thick, -6, -offset1])  // hål i stödhylsa bak
     cylinder(h=box_h+offset1, d=3.2, $fn=100);

   // Sänk stödhylsan
   translate([ widthHold/2-7, -spaceHold-offset1, -thick+offset1])

// hål i stödhylsa bak
cube([15, 8, 3]);

   // kabelmarkering
   // translate([0, 0, 0])  // hål i stödhylsa bak


   }

/*
translate([4, 12, 0])
#cylinder(h=15,d=3.2);
//translate([4, 13.5, 17.3])
//#sphere(r=6);

   translate([29.6, 12, 0])
     #cylinder(h=15,d=3.2);
   //translate([29.6, 13.5, 17.3])
     //#sphere(r=6);

*/

}

module backHole()
{ wallH = 10.5;

wide1  = 12; // endast runt cylindern
wide2  = 35; // hela väggen
deep1    =  4;
height1  = 10.5;
cornRad1  =  2;
diam1 = 8;
opt1 = 0.1;

//rundadFot();

// Rundad stäcka mellan t.ex. vägg och tak -bakkant
translate([wide2/2, diam1/2-cornRad1/2, -height1/2])
{ rotate([90, 0, -90])
{ linear_extrude(wide2)
{ difference()
{ square([cornRad1, cornRad1]);

       translate([cornRad1, cornRad1])
         circle(r=cornRad1);
     }
   }
 }

}

// rundad stäcka1 (vänster) mellan t.ex. vägg och tak
translate([-wide2/2+0.15, deep1/2+cornRad1/2, -height1/2])
rotate([90, 0, 0])
{ linear_extrude(spaceHold)
{ difference()
{ square([cornRad1, cornRad1]);

     translate([cornRad1, cornRad1])
     circle(r=cornRad1);
   }
 }

}

// rundad stäcka2 mellan t.ex. vägg och tak
translate([wide2/2-0.65, deep1/2+cornRad1/2, -height1/2])
rotate([0, -90, 90])
{ linear_extrude(spaceHold)
{ difference()
{ square([cornRad1, cornRad1]);

     translate([cornRad1, cornRad1])
       circle(r=cornRad1);
   }
 }

}

// Skapa stödfot - bak
difference()
{ union()
{ //själva cylindern
translate([0, 1, 0])
{ cylinder(h=height1, d=diam1, center=true);
translate([0, diam1/2, 0])
cube([diam1,diam1-1,height1], center=true);
}

   // Rundad fot under cylinder ovan
   translate([0, 1, -height1/2])
   { rotate_extrude()
     { translate([diam1/2, 0, 0])
       { difference()
         { square([cornRad1, cornRad1]);

           translate([cornRad1, cornRad1])
             circle(r=cornRad1);
         }
       }
     }
   }

   // Rundad rakstäcka1 - cylinderfot - mellan t.ex. vägg och tak
   translate([diam1/2, diam1, -height1/2])
   { rotate([90, 0, 0])
     { linear_extrude(diam1)
       { difference()
         { square([cornRad1, cornRad1]);

           translate([cornRad1, cornRad1])
             circle(r=cornRad1);
         }
       }
     }
   }

   // Rundad rakstäcka2 - cylinderfot - mellan t.ex. vägg och tak
   translate([-diam1/2, diam1, -height1/2])
   { rotate([0, -90, 90])
     { linear_extrude(diam1)
       { difference()
         { square([cornRad1, cornRad1]);

           translate([cornRad1, cornRad1])
             circle(r=cornRad1);
         }
       }
     }
   }

   //väggen bakom cylindern som ska rundas
   translate([0, diam1/2-cornRad1, 0])
     cube([wide1, cornRad1, height1], center=true);

 }


 // Avrunda hörn1 bak
 translate([-wide1/2, cornRad1/2, cornRad1])
 { hull()
   { cylinder(h=height1+opt1, r=cornRad1, center=true);
     {  translate([0, 0, -height1/2])
         sphere(r=cornRad1);
     }
   }
 }

 // Avrunda hörn2 bak
 translate([wide1/2, cornRad1/2, cornRad1])
 { hull()
   { cylinder(h=height1+opt1, r=cornRad1, center=true);
     {  translate([0, 0, -height1/2])
         sphere(r=cornRad1);
     }
   }
 }


 // Plocka bort rundad fot bak samt det som sticker ut
 translate([-wide1/2, diam1/2-cornRad1/2, -height1/2-opt1])
   cube([wide1, diam1/2+cornRad1, height1+opt1*2], center=false);

}
}

module ovalCableHole(posX, posY, posZ)
{ // Hål 5.5 x 3.5 mm
pan = 0.1;
cableHi = 1.5;

translate([posX, posY, posZ])
{ color("white")
{ translate([0, 0, -pan])
{ cylinder(h=cableHi, d=3.5);
//#translate([0, 0, 0]) cylinder(h=10, d=1);
//translate([0, 0, -1]) cylinder(h=1, d1=0, d2=1);
//translate([0, 0, 0]) sphere(d=1); // Inre kulan
//translate([0, 0, 1.5]) sphere(d=1); // Inre kulan

     translate([0, 0, -1]) sphere(d=0.8); // yttre kulan
     translate([0, 0, 2.5]) sphere(d=0.8); // yttre kulan

   }
   translate([2, 0, -pan])
   { cylinder(h=cableHi, d=3.5);
     // #translate([0, 0, -cableHi*2]) cylinder(h=10, d=0.5);
     //translate([0, 0, 0]) sphere(d=1); // Inre kulan
     //translate([0, 0, 1.5]) sphere(d=1); // Inre kulan

     translate([0, 0, -1]) sphere(d=0.8); // yttre kulan
     translate([0, 0, 2.5]) sphere(d=0.8); // yttre kulan

   }
   translate([-3.5/2, 0, -pan])
     cube([5.5, 3.5/2, cableHi]);
   translate([-0.25, -1.74, -pan])
     cube([2.5, 1.75, cableHi]);
 }

}
}

module rundadFot()
{
// specifika värden för skruvdistansen bak
wallH = 10.5;

wide1  = 12; // endast runt cylindern
wide2  = 34; // hela väggen
deep1    =  4;
height1  = 10;
cornRad1  =  2;
diam1 = 8;
opt1 = 0.1;

color("magenta")
{ translate([0, 0, wallH])
{ difference()
{ union()
{ // Bakgavel
translate([wide2/2, opt1, height1/2])
{ rotate([90, 180, 0])
cube([wide2, height1, opt1]);
}

       // Golv
       translate([wide2/2, -height1+opt1, -height1/2])
         rotate([0, 180, 0])
           cube([wide2, height1, opt1]);

       //väggen bakom cylindern som kan rundas
       translate([0, -cornRad1/2, 0])
         cube([wide1, cornRad1, height1], center=true);

       //själva cylindern
       translate([0, -cornRad1/2, 0])
         cylinder(h=height1, d=diam1, center=true);

       // Rundad fot under cylinder ovan
       translate([0, -cornRad1/2, -height1/2])
       { rotate_extrude()
         { translate([diam1/2, 0, 0])
           { difference()
             { square([cornRad1, cornRad1]);

               translate([cornRad1, cornRad1])
                 circle(r=cornRad1);
             }
           }
         }
       }

       // Rundad stäcka mellan t.ex. vägg och tak -bakkant
       translate([wide2/2, 0, -height1/2])
       { rotate([90, 0, -90])
         { linear_extrude(wide2)
           { difference()
             { square([cornRad1, cornRad1]);

               translate([cornRad1, cornRad1])
                 circle(r=cornRad1);
             }
           }
         }
       }

       // rundad stäcka mellan t.ex. vägg och tak -sida1
       translate([-wide2/2, 0, -height1/2])
       { rotate([90, 0, 0])
         { linear_extrude(10)
           { difference()
             { square([cornRad1, cornRad1]);

               translate([cornRad1, cornRad1])
               circle(r=cornRad1);
             }
           }
         }
       }

       // rundad stäcka mellan t.ex. vägg och tak -sida2
       translate([wide2/2, -10, -height1/2])
       { rotate([90, 0, 180])
         { linear_extrude(10)
           { difference()
             { square([cornRad1, cornRad1]);

               translate([cornRad1, cornRad1])
               circle(r=cornRad1);
             }
           }
         }
       }
     } // Avsluta union = = = = = = = = = = = = = = = = = = = =


     // Avrunda hörn1 bak
     translate([-wide1/2+opt1*1.3, -deep1/2, cornRad1])
     { cylinder(h=height1+opt1, r=cornRad1, center=true);
         translate([0, 0, -height1/2])
           sphere(r=cornRad1);
     }

     // Avrunda hörn2 bak
     translate([wide1/2-opt1*1.3, -deep1/2, cornRad1])
     { cylinder(h=height1+opt1, r=cornRad1, center=true);
         translate([0, 0, -height1/2])
           sphere(r=cornRad1);
     }

     // Plocka bort rundad fot bak samt det som sticker ut
     translate([-wide1/2, 0, -height1/2-opt1])
       cube([wide1, diam1/2+cornRad1, height1+opt1*2], center=false);
   }
 }

}
}

module mainBox(box_l, box_w, box_h, spaceHold, round_r, thick, smooth,
pad)
{ translate([box_l/2-thick-offset1/2, box_w/2-spaceHold, box_h/2])
{
// To fix the corners cut the main cube with smaller cubes with
spheres removed
difference()
{ cube([box_l, box_w, box_h], center = true);

   // Kant1 - liggande
   translate([0, -box_w/2+round_r, box_h/2-round_r])
   { difference()
     { translate([0,-round_r-pad,round_r+pad])
         cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center =

true);
rotate(a=[0,90,0])
cylinder(box_l+4pad,round_r,round_r,center=true,$fn=smooth);
}
}
// Kant2 - liggande
translate([0, box_w/2-round_r, box_h/2-round_r])
{ difference()
{ translate([0,round_r+pad,round_r+pad])
cube([box_l+2
pad, round_r2+pad, round_r2+pad], center =
true);
rotate(a=[0,90,0])
cylinder(box_l+4pad,round_r,round_r,center=true,$fn=smooth);
}
}
/

// Kant3 - liggande
translate([0, -box_w/2+round_r, -box_h/2+round_r])
{ difference()
{ translate([0,-round_r-pad,-round_r-pad])
cube([box_l+2pad, round_r2+pad, round_r2+pad], center =
true);
rotate(a=[0,90,0])
cylinder(box_l+4
pad,round_r,round_r,center=true,$fn=smooth);
}
}

   // Kant4 - liggande
   translate([0, box_w/2-round_r, -box_h/2+round_r])
   { difference()
     { translate([0,round_r+pad,-round_r-pad])
         cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center =

true);
rotate(a=[0,90,0])
cylinder(box_l+4pad,round_r,round_r,center=true,$fn=smooth);
}
}
/
// ----
// Kant1 - stående
translate([-box_l/2+round_r, box_w/2-round_r, 0])
{ difference()
{ translate([-round_r-pad,round_r+pad,0])
cube([round_r
2+pad, round_r
2+pad, box_h+2pad], center =
true);
cylinder(box_h+4
pad,round_r,round_r,center=true,$fn=smooth);
}
}
// Kant2 - stående
translate([box_l/2-round_r, box_w/2-round_r, 0])
{ difference()
{ translate([round_r+pad,round_r+pad,0])
cube([round_r2+pad, round_r2+pad, box_h+2pad], center =
true);
cylinder(box_h+4
pad,round_r,round_r,center=true,$fn=smooth);
}
}
// Kant3 - stående
translate([-box_l/2+round_r, -box_w/2+round_r, 0])
{ difference()
{ translate([-round_r-pad,-round_r-pad,0])
cube([round_r2+pad, round_r2+pad, box_h+2pad], center =
true);
cylinder(box_h+4
pad,round_r,round_r,center=true,$fn=smooth);
}
}
// Kant4 - stående
translate([box_l/2-round_r, -box_w/2+round_r, 0])
{ difference()
{ translate([round_r+pad,-round_r-pad,0])
cube([round_r2+pad, round_r2+pad, box_h+2pad], center =
true);
cylinder(box_h+4
pad,round_r,round_r,center=true,$fn=smooth);
}
}

 // ----
   // Kant1 liggande (andra hållet)
   translate([-box_l/2+round_r, 0, box_h/2-round_r])
   { difference()
     { translate([-round_r-pad, 0, round_r+pad])
         cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center =

true);
rotate(a=[0,90,90])
cylinder(box_w+4pad,round_r,round_r,center=true,$fn=smooth);
}
}
// Kant2 liggande (andra hållet)
translate([box_l/2-round_r, 0, box_h/2-round_r])
{ difference()
{  translate([round_r+pad, 0, round_r+pad])
cube([round_r
2+pad, box_w+2pad, round_r2+pad], center =
true);
rotate(a=[0,90,90])
cylinder(box_w+4pad,round_r,round_r,center=true,$fn=smooth);
}
}
/

// Kant3 liggande (andra hållet)
translate([-box_l/2+round_r, 0, -box_h/2+round_r])
{ difference()
{ translate([-round_r-pad, 0, -round_r-pad])
cube([round_r2+pad, box_w+2pad, round_r2+pad], center =
true);
rotate(a=[0,90,90])
cylinder(box_w+4
pad,round_r,round_r,center=true,$fn=smooth);
}
}

   // Kant4 liggande (andra hållet)
   translate([box_l/2-round_r, 0, -box_h/2+round_r])
   { difference()
     { translate([round_r+pad, 0, -round_r-pad])
         cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center =

true);
rotate(a=[0,90,90])
cylinder(box_w+4pad,round_r,round_r,center=true,$fn=smooth);
}
}
/
// ----
// Hörn1 (övre)
translate([box_l/2-round_r, box_w/2-round_r, box_h/2-round_r])
{ difference()
{ translate([round_r+pad, round_r+pad, round_r+pad])
cube([round_r
2+pad, round_r
2+pad, round_r2+pad], center =
true);
sphere(round_r,$fn=smooth);
}
}
// Hörn2 (övre)
translate([-box_l/2+round_r, box_w/2-round_r, box_h/2-round_r])
{ difference()
{ translate([-round_r-pad, round_r+pad, round_r+pad])
cube([round_r
2+pad, round_r2+pad, round_r2+pad], center =
true);
sphere(round_r,$fn=smooth);
}
}
// Hörn3 (övre)
translate([box_l/2-round_r, -box_w/2+round_r, box_h/2-round_r])
{ difference()
{ translate([round_r+pad, -round_r-pad, round_r+pad])
cube([round_r2+pad, round_r2+pad, round_r2+pad], center =
true);
sphere(round_r,$fn=smooth);
}
}
// Hörn4 (övre)
translate([-box_l/2+round_r, -box_w/2+round_r, box_h/2-round_r])
{ difference()
{ translate([-round_r-pad, -round_r-pad, round_r+pad])
cube([round_r
2+pad, round_r2+pad, round_r2+pad], center =
true);
sphere(round_r,$fn=smooth);
}
}
/*
// Hörn1 (undre)
translate([box_l/2-round_r, box_w/2-round_r, -box_h/2+round_r])
{ difference()
{ translate([round_r+pad, round_r+pad, -round_r-pad])
cube([round_r2+pad, round_r2+pad, round_r2+pad], center =
true);
sphere(round_r,$fn=smooth);
}
}
// Hörn2 (undre)
translate([-box_l/2+round_r, box_w/2-round_r, -box_h/2+round_r])
{ difference()
{ translate([-round_r-pad, round_r+pad, -round_r-pad])
cube([round_r
2+pad, round_r2+pad, round_r2+pad], center =
true);
sphere(round_r,$fn=smooth);
}
}
// Hörn3 (undre)
translate([box_l/2-round_r, -box_w/2+round_r, -box_h/2+round_r])
{ difference()
{ translate([round_r+pad, -round_r-pad, -round_r-pad])
cube([round_r2+pad, round_r2+pad, round_r2+pad], center =
true);
sphere(round_r,$fn=smooth);
}
}
// Hörn4 (undre)
translate([-box_l/2+round_r, -box_w/2+round_r, -box_h/2+round_r])
{ difference()
{ translate([-round_r-pad, -round_r-pad, -round_r-pad])
cube([round_r
2+pad, round_r2+pad, round_r2+pad], center =
true);
sphere(round_r,$fn=smooth);
}
}
*/
}
}
}
//

module cableHolder3(posX, posY, posZ, length, width, height, radius)
{ // Skapa toppen över switchen
// mått på Switchen
fn = 96;          // upplösning (endast bågen?)
heightHold = 10.5;
widthHold = 33.5;
depthHold = 23.5;
holdRadie = 1.5;  // radie i hörnen
thick = 1.5;      // tjocklek

translate([0,-thick,0])
{
difference(0, 0, 0)
{ hull()
{ difference()
{ translate([thick, 0, heightHold]) // vänster kant
{ rotate([-90, 0, 0])
{ cylinder(h=depthHold, d=thick2);
translate([0, 0, depthHold])
sphere(d=thick
2);          // längst fram
}
}
translate([0, -0.1, heightHold]) // plocka bort underdelen
rotate([-90, 0, 0])
cube([thick*2, thick+.1, depthHold+thick+.1]);
}

     difference()
     { translate([widthHold-thick, 0, heightHold]) // höger kant
       { rotate([-90, 0, 0])
         { cylinder(h=depthHold, d=thick*2);
           translate([0, 0, depthHold])
             sphere(d=thick*2);         // längst fram
         }
       }
       translate([widthHold-thick*2, -0.1, heightHold]) // plocka

bort underdelen
{ rotate([-90, 0, 0])
cube([thick*2, thick+.1, depthHold+thick+.1]);
}
}
}

   // öppna hålen för monteringsskruvarna uppe på plattan
   translate([4, 13.5, 0])
     cylinder(h=15,d=3.2);
   translate([4, 13.5, 17.3])
     sphere(r=6);

   translate([29.6, 13.5, 0])
     cylinder(h=15,d=3.2);

   translate([29.6, 13.5, 17.3])
     sphere(r=6);
 }

 // halvbåge 1 bak
 translate([thick, 0, heightHold/2+thick/2])
   rotate([0, 90, 180])
     rotate_extrude(angle = 180, convexity=20, $fn=64)
 translate([heightHold/2-thick/2, 0, 0])
   circle(d=thick*2);
 translate([thick, 0, heightHold])
   sphere(d=thick*2);  // övre kulan
 translate([thick, 0, thick])
   sphere(d=thick*2);  // undre kulan


 // halvbåge 2 bak
 translate([widthHold-thick, 0, heightHold/2+thick/2])
   rotate([0, 90, 180])
     rotate_extrude(angle = 180, convexity=20, $fn=64)
 translate([heightHold/2-thick/2, 0, 0])
   circle(d=thick*2);
 translate([widthHold-thick, 0, heightHold])
   sphere(d=thick*2);  // övre kulan
 translate([widthHold-thick, 0, thick])
   sphere(d=thick*2);  // undre kulan

 // en cylinder tvärsöver längst upp
 translate([thick, 0, heightHold])
 { rotate([0,90,0])
     cylinder(h=widthHold-thick*2, r=thick);
 }

}

// Halvbågen (kabelhållaren) på baksidan switchen
translate([widthHold-thick, -thick, heightHold/2+thick/2])
{ rotate([0,90,180])
linear_extrude(widthHold-thick2)
arc(heightHold/2-thick/2, [0, 180], thick, fn); //radius,
angles, width, fn)
}
// en cylinder tvärsöver längst ned
translate([thick, -thick, thick])
{ rotate([0,90,0])
cylinder(h=widthHold-thick
2, r=thick);
}
}

module switch(posX=0, posY=0, posZ=0)
{ buttRadie = 1.5;
height = 10.5;
width = 33.5;
depth = 23.5;
h1x = buttRadie;
h1y = buttRadie;
h2x = width-buttRadie;
h2y = buttRadie;
h3x = width-buttRadie;
h3y = depth-buttRadie;
h4x = buttRadie;
h4y = depth-buttRadie;

translate([posX, posY, posZ])
{ difference()
{ color("#F9F9F3")
// tryck-knappen
union()
{ translate([width/2, depth+6-0.1, height/2])
{ rotate([90, 0, 0])
{ translate([0,0,6])
circle(d=6.8);  // skuggan runt knapp
cylinder(h=6, d=6);
sphere(d=6);
}
}

     hull()  // Switchkropp
     { translate([h1x, h1y])
         cylinder(h=height, r=1.5);
       translate([h2x, h2y])
         cylinder(h=height, r=1.5);
       translate([h3x, h3y])
         cylinder(h=height, r=1.5);
       translate([h4x, h4y])
         cylinder(h=height, r=1.5);
     }
   }

   // Skruvhålen för switchen
   hole( 4, 12, 0, "#FFD700", height);
   hole(29.6, 12, 0, "#FFD700", height);
   // hole( 4, 12, 0, "#FFD700", 50);
   // hole(29.6, 12, 0, "#FFD700", 50);
   // hål för kablar bak
   color("gray")
   { translate([9.5, 16, height/2])
     { rotate([90, 0, 0])
         cylinder(h=16.5, d=4);
     }
     translate([24.5, 16, height/2])
     {  rotate([90, 0, 0])
         cylinder(h=16.5, d=4);
     }
   }

   // hål för kabelskruvar
   color("white")
   { translate([29.5, 17.1, height/2])
     { rotate([0, 90, 0])
         cylinder(h=4.1, d=4.5);
     }
     translate([-0.1, 17.1, height/2])
     { rotate([0, 90, 0])
         cylinder(h=4.1, d=4.5);
     }
   }
 }

 // Kabelskruvar
 cableScrew(3, 17, height/2, 90);
 cableScrew(31, 17, height/2, -90);

}
}

// Skruven som håller fast kabeln i switchen
module cableScrew(posX=0, posY=0, posZ=0, angle=0)
{ color("#FFD700")  // mässing
translate([posX, posY, posZ])
{ rotate([0, 0, angle])
{ difference()
{ // skruvskalle
translate([0, 0, 0])
rotate([90, 0, 0])
cylinder(h=2, d1=4, d2=3.5);

     // stjärnan i skruven
     translate([0, 1.85, -.25])
       rotate([0, 0, 0])
         cylinder(h=0.5, d=5);
     translate([-0.25, -.6, 2.25])
       rotate([0, 90, 0])
         cube([4.5, 2, 0.5]);
   }
 }

}
}

// borrhål
module hole(posX=0, posY=0, posZ=0, colorName="yellow", height)
{ diamHole1 = 3;
highHole1 = height;
diamHole2 = 6;
highHole2 = 2.5;
offs=0.1;

color(colorName)
{
translate([posX, posY, posZ])
{ translate([0, 0, 0])
cylinder(h=highHole1, d=diamHole1);
translate([0, 0, -offs])
cylinder(h=highHole2, d=diamHole2);
translate([0, 0, height-highHole2+offs])
cylinder(h=highHole2, d=diamHole2);
}
}
}

module showCables()
{ translate([-25,8,24])
rotate([80,177,90])
cable(10,10,0,"brun");
translate([-43,8,15])
rotate([90,180,90])
cable(10,10,0,"blå");
}

module cable(posX=0, posY=0, posZ=0, colorName="blå", radius=1.26,
width=0.62, thick=50, fn=24)
{ // default 1.5mm2
// radius = inner radie
// width = bredd/tjocklek på cirkeln (inte höjd)
// thick = höjd på cirken/ röret
// pin=

colCupper = "#D7715A";
colGreen  = "#07DA63";
colYellow = "#FFCC00";

if (colorName=="gröngul")
{ translate([posX, posY, posZ])
{ color(colGreen)
linear_extrude(thick)
arc(radius, [0, 60], width, fn);
color(colYellow)
linear_extrude(thick)
arc(radius, [60, 180], width, fn);
color(colGreen)
linear_extrude(thick)
arc(radius, [180, 240], width, fn);
color(colYellow)
linear_extrude(thick)
arc(radius, [240, 360], width, fn);

   color(colCupper)
     linear_extrude(10, center=true, convexity=10, $fn=100)
       circle(d=1.24);
 }

}
else  // vanliga kablar 1.5mm2
{
cableColor = colorName == "blå" ? "#1870D5"
: colorName == "brun" ? "#9C6137"
: colorName == "svart" ? "#000000"
: assert(false,"invalid color value");  // message if no
case worked
// : nodef

 translate([posX, posY, posZ])
 {             //el kabel - ena änden rak - andra böjd
   color(colCupper)    //kopparstump tråd rakkabel
     linear_extrude(10, center=true, convexity=10, $fn=100)
       circle(d=1.24);

    color(cableColor)
    { cylinder(h=thick, r=radius);

     translate([-radius*2, 0, thick])  // kabelböj
     rotate([90, 0, 0])
     rotate_extrude(angle=90, convexity=20)
       translate([2.5, 0, 0])
         circle(r=1.26);

     translate([-radius*2, 0, thick+radius*2])
       rotate([0, -90, 0])
       cylinder(h=5, r=radius);
   }
   translate([-10, 0, thick+radius*2])
   { rotate([0, -90, 0])
     { color(colCupper)
       { linear_extrude(5, center=true, convexity=10, $fn=100)
           circle(d=1.24);
       }
     }
   }
 }

}
}

//

---====
module arc(radius, angles, width = 1, fn = 24) {
difference() {
sector(radius + width, angles, fn); // ytterradie
sector(radius, angles, fn);        // innerradie (plockar bort
invändigt
}
}

module sector(radius, angles, fn = 24) {
r = radius / cos(180 / fn);
step = -360 / fn;

 points = concat([[0, 0]],
     [for(a = [angles[0] : step : angles[1] - 360])
         [r * cos(a), r * sin(a)]
     ],
     [[r * cos(angles[1]), r * sin(angles[1])]]
 );

 difference() {
     circle(radius, $fn = fn);
     polygon(points);
 }

}
= = END product 2 = = = = = = = = = = = = = = = = = = = = = = = = = = =
= = =

  • . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _
    . - . _ . - . _ . - . _ . - . _ . -

Den fredag 6 maj 2022 14:06:55 CEST, Michael Möller <
private2michael@gmail.com> skrev:

OpenSCAD code - is a description of your model in terms of a few
cylinder/cubes added and cut out
difference() {
cylinder(d=5,h=10);
translate([0,10,0]) cube([4,6,2]) ;
}

STL file is a list of triangles which make the same outer shell as your
model. OpenSCAD makes this complicated transform from shapes to triangles.
solid OpenSCAD_Model
facet normal 0.92388 0.382682 0
outer loop
vertex 2.5 0 3
vertex 1.76777 1.76777 0
vertex 1.76777 1.76777 3
endloop
endfacet
facet normal 0.92388 0.382682 0
outer loop
vertex 1.76777 1.76777 0
vertex 2.5 0 3
vertex 2.5 0 0
endloop
endfacet
: (and so on for 300 lines) There is a binary/compressed version, but
the description is still just triangles.

Gcode is what a 3D printer understands - it is the exact list of moves
that the head has to do with how much plastic to squeeze to trace the
outline of your shape, layer, by layer. It will optionally create moves for
filling the inside or support for overhangs. Such a program is called a
SLICER and the printer will come with one.
G92 E0 ; reset extrusion distance
G1 Z2.330 F6600.000 ; lift Z
G1 X-0.000 Y1.505 F6600.000 ; move to first perimeter point
G1 Z0.330 F6600.000 ; restore layer Z
G1 E3.00000 F2400.00000 ; unretract extruder 0
G1 F1500
G1 X-1.064 Y1.064 E3.09259 ; perimeter
G1 X-1.505 Y0.000 E3.18517 ; perimeter
: (many similar lines)
G1 X1.515 Y1.515 E4.65860 ; perimeter
G1 X0.055 Y2.120 E4.78559 ; perimeter
G1 X-0.000 Y2.143 F6600.000 ; move inwards before travel
G1 X0.384 Y0.843 F6600.000 ; move to first infill point
G1 F1500
G1 X0.843 Y0.384 E4.84815 ; infill
G1 X1.097 Y-0.229 E4.91215 ; infill
:
(and so on for thousands of lines)

The 3MF still basically deals in triangles, and attributes (surface,
infill material, picture, ticket info ... ) which probably are not used by
your slicer/printer.

On Fri, 6 May 2022 at 12:37, Jan Öhman via Discuss <
discuss@lists.openscad.org> wrote:

---------- Forwarded message ----------
From: "Jan Öhman" jan_ohman@yahoo.com
To: OpenSCAD General Discussion discuss@lists.openscad.org
Cc:
Bcc:
Date: Fri, 6 May 2022 10:38:46 +0000 (UTC)
Subject: [OpenSCAD] Export to .STL / .3MF for later 3D-printing.
Hi!

Thought to create some objects in openSCAD, to print later.
I do not have my own 3D printer (yet).

One I talked to, wanted to get the drawings in .STL or .3MF. (I don't
know the difference).

If I had my own printer, have I been able to print directly from
openSCAD?
(Without some export?)

In the openSCAD, no errors or problems occur.
but
The drawings I tested to export from openSCAD have given one or another
error message.
One message .:
WARNING: Object may not be a valid 2-manifold and may need repair!

Another message .:
WARNING: No top level geometry to render

What to do?

---------- Forwarded message ----------
From: "Jan Öhman via Discuss" discuss@lists.openscad.org
To: OpenSCAD General Discussion discuss@lists.openscad.org
Cc: "Jan Öhman" jan_ohman@yahoo.com
Bcc:
Date: Fri, 6 May 2022 10:38:46 +0000 (UTC)
Subject: [OpenSCAD] Export to .STL / .3MF for later 3D-printing.


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org

---------- Forwarded message ----------
From: "Jan Öhman via Discuss" discuss@lists.openscad.org
To: OpenSCAD general discussion discuss@lists.openscad.org
Cc: "Jan Öhman" jan_ohman@yahoo.com
Bcc:
Date: Sat, 7 May 2022 11:04:31 +0000 (UTC)
Subject: [OpenSCAD] Re: Export to .STL / .3MF for later 3D-printing.


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org

I tried to build the basic shape. try the following code (you would need dependencies.scad which is available at https://github.com/sprabhakar2006/openSCAD): include<dependencies.scad> sec=cr(pts1([[0,3,10],[40,-3,10],[100,0,.1],[0,80,.1],[-100,0,10],[-40,-3,10]]),10); path=cr(pts1([[-10,0],[10,0,0],[0,15,1.5],[-1.5,0]]),10); prism=prism1(sec,path); path1=cr(pts1([[-10,3],[6,0,2],[1,12,1.5],[1.5,0],[0,1]]),10); prism1=prism1(sec,path1); prism2=l_extrude(offset(sec,-10),3); sec1=cr(pts1([[0,0,1],[10,0,1],[0,25,1.5],[-3,0,1.5],[-2,-22,2],[-5,0]]),5); prism3=trns([140-10,80,0],q_rot(["x90"],l_extrude(sec1,80))); render() difference(){ swp(prism); swp(prism1); } swp(prism2); swp(prism3); dimensions are approximate and I have not checked the exact code. above code renders successfully On Sat, 7 May 2022 at 22:27, Michael Möller <private2michael@gmail.com> wrote: > Jan Öhman wrote it failed in Render/F6, but works in Preview/F5 - in so > many words. I tried and got the following > > First model > [image: image.png] > F6 Error: WARNING: Ignoring 2D child object for 3D operation in file , > line 53 > > ERROR: CGAL error in CGALUtils::applyUnion3D: CGAL ERROR: assertion > violation! Expr: G.mark(v1,0)==G.mark(v2,0)&& G.mark(v1,1)==G.mark(v2,1) > File: > /mxe/usr/x86_64-w64-mingw32.static.posix/include/CGAL/Nef_S2/SM_overlayer.h > Line: 303 > > Which I think is pretty selfexplantory: Passed a 2D shape to something > that expected a 3D shape - but you have to read the whole code to find it > ... which I think Jan is more qualified to do :-) > > 2nd part > [image: image.png] > > ... which is one of those where zooming or rotating the model in preview > takes >5 second > [image: image.png] > > And I didn't bother waiting for the F6 error ... ;-) > > > Of course, we do not know if the above shapes I got are the ones that Jan > wants - there are also sections of code commented out. > > (From the comments it seems these are to be nice and alternative covers > for wall outlet/switches.) > > > > On Sat, 7 May 2022 at 18:26, Sanjeev Prabhakar <sprabhakar2006@gmail.com> > wrote: > >> Quite a long code. >> Can you paste a picture of what you are trying to draw. >> Regards >> Sanjeev >> >> On Sat, 7 May 2022, 16:31 Jan Öhman via Discuss, < >> discuss@lists.openscad.org> wrote: >> >>> >>> >>> >>> ---------- Forwarded message ---------- >>> From: "Jan Öhman" <jan_ohman@yahoo.com> >>> To: OpenSCAD general discussion <discuss@lists.openscad.org> >>> Cc: >>> Bcc: >>> Date: Sat, 7 May 2022 11:04:31 +0000 (UTC) >>> Subject: [OpenSCAD] Re: Export to .STL / .3MF for later 3D-printing. >>> Thank you! >>> Begins to understand how it works. (It was not easy...) >>> >>> but my solution was not good ... >>> >>> Here are 2 files that do not work to render (F6) >>> >>> >>> = = product 1= = = = = = = = = = = = = = = = = = = = = = = = = = = = = >>> = = = >>> - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - >>> . _ . - . _ . - . _ . - . _ . - >>> >>> >>> include <BOSL2/std.scad> >>> fn = 150; >>> >>> placering="left"; >>> // placering="right" >>> >>> box(0, 0, 0, placering, "#C0C0C0", fn); // (X, Y, Z, left/right, >>> colorName) >>> >>> >>> // Monteringsplattan >>> // mountingPlate(0, 0, 0, placering); >>> >>> >>> // LED belysning >>> // LEDlampa(0, 0, 0, placering); >>> >>> >>> // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >>> // - - - - m o d u l e r - - - - - - - - - - - - - - - - - - >>> >>> >>> >>> //================================================================================== >>> //====== box >>> ===================================================================== >>> module box(posX=0, posY=0, posZ=0, mountSide="left", >>> colorName="#00FF00", fn=24) >>> { >>> side = mountSide == "left" ? 0 >>> : mountSide == "right" ? 1 >>> : assert(false,"invalid moutSide value"); // message if no case >>> worked >>> >>> color(colorName) >>> translate([posX, posY, posZ]) >>> mirror([side, 0, 0]) >>> difference() >>> { >>> union() >>> { >>> // Skapa konturer på bottenplattan - x, y, r, angles, [grader], början >>> // Rotation medurs - vänster lamphållare (bakant saknas) >>> points1 = circSect( 140, 0, 0, [0, 0], "right", 1, fn); // böj >>> nere till höger >>> points2 = circSect( 60, 5, 5, [0, 5], "bottom", 1, fn); // >>> brytpunkt längst ned >>> points3 = circSect( 10, 13, 10, [0, 90], "bottom", 1, fn); // böj >>> nere till vänster >>> points4 = circSect( 5, 80, 5, [0, 90], "left", 1, fn); // böj >>> uppe till vänster >>> points5 = circSect( 140, 80, 5, [0, 1], "top", 1, fn); // böj >>> uppe till höger >>> edge = concat(points1, points2, points3, points4, points5); >>> path = path3d(reverse(edge)); >>> section = wall(); >>> path_sweep( section, path, closed=false); >>> >>> >>> // Skapa bakkant lite högre och smalare i topp >>> bottom1 = concat(points5, points1); >>> polygon(bottom1); >>> path1 = path3d(reverse(bottom1)); >>> section1 = wall1(); // lite högre bakvägg wall(b=4, f=8, h=15, t=3.5) >>> path_sweep( section1, path1, closed=false); >>> >>> // fyll upp bottenplattansbaksida >>> linear_extrude(4) // Bottomplate - fill up >>> polygon(concat(points1, points2, points3, points4, points5)); >>> >>> >>> // skapa Utskjutande del under (tänk spegelvänt) >>> pt1 = circSect( 19.5, 85, 0, [0, 50], "top", 1, fn); // Uppe till >>> höger - moturs >>> pt2 = circSect( 39, 1.35, .1, [-5, 90], "right", 1, fn); // Nere >>> till höger >>> pt3 = circSect( 10, 13.05, 10, [0, 90], "bottom", 1, fn); // Nere >>> till vänster >>> pt4 = circSect( 5, 80, 5, [0, 90], "left", 1, fn); // Uppe till >>> vänster >>> translate([0, 0, -2]) >>> linear_extrude(2.1) >>> polygon(concat(pt1, pt2, pt3, pt4)); >>> >>> // utgången för kabeln på baksidan (diam 10mm) - pekar lite nedåt >>> cableExit(65, 35, 0, 15, "cyan", $fn=100); >>> } >>> >>> // skapa ett borrhål i bakkant >>> translate([132,60,15]) >>> { rotate([0, 90, 0]) >>> { cylinder(h=10, d=2, $fn=100); >>> cylinder(h=4, d=9, $fn=100); >>> } >>> } >>> >>> // skapa en borrmarkering i bakkant >>> translate([139,25,15]) >>> { rotate([0, 90, 0]) >>> cylinder(h=2, d1=1, d2=2.5, $fn=100); >>> } >>> >>> >>> // ingravera årtalet på baksidan >>> translate([10, 80, -0.5]) >>> { mirror([side, 0, 0]) >>> { rotate([0, 180, 0]) >>> { linear_extrude(3) >>> text("2022", size=12, direction="ttb", font="Comic Sans >>> MS:style=Bold"); >>> } >>> } >>> } >>> >>> /* >>> // Markera skruvhål på bakkant >>> borr=3; >>> bredd=140; >>> hojd=8; >>> avstNed=20; >>> translate([bredd, avstNed, hojd]) >>> { rotate([0,90,0]) >>> cylinder(h=2, d1=0.5, d2=borr, center=true, $fn=50); >>> } >>> */ >>> >>> // borrhål >>> mountingHole(20, 36, 0, 7, 90.1, 15); // posX, posY, posZ, diam, dist, >>> deep, $fn=50 >>> >>> } >>> } >>> //======== Slut box >>> ============================================================== >>> >>> >>> >>> //================================================================================== >>> //====== cableExit >>> =============================================================== >>> module cableExit(posX, posY, posZ, angle, colorName) >>> { diamHole = 7; >>> diamHolder = 9.8; >>> hight = 12; >>> topRad = diamHolder/2; >>> topDiam = diamHolder/2-topRad/2; >>> bowRad = 7; >>> offs1 = 0.1; >>> >>> color(colorName) >>> translate([posX, posY, posZ]) >>> { rotate([180, 0, 180-angle]) >>> { difference() >>> { hull() >>> { cylinder(h=hight, d=diamHolder, center=false); >>> translate([0, 0, hight]) // rundad topp >>> rotate_extrude(angle=360, convexity=2) >>> translate([topDiam, 0, 0]) // yttre diam topp >>> circle(d=topRad); // radie topp >>> } >>> >>> >>> inpHight = 2; // ett värde som styr var utgångshålet hamnar >>> translate([0, 0, -offs1]) >>> cylinder(h=inpHight+offs1, d=diamHole, center=false); // >>> Bottenhål >>> >>> translate([-bowRad, 0, inpHight-offs1]) // böjen >>> { rotate([90, 0, 0]) >>> rotate_extrude(angle=90, convexity=10) >>> translate([bowRad, 0, 0]) // ställ in radien på kabelböjen >>> circle(d=diamHole); >>> } >>> } >>> } >>> } >>> } >>> //====== slut cableExit >>> ========================================================== >>> >>> >>> >>> //================================================================================== >>> //====== mountingHole >>> ============================================================ >>> module mountingHole(posX=0, posY=0, posZ=0, diam=7, dist=90, deep=5, >>> $fn=50) >>> { // diam = 6; // [mm] >>> // dist = 90; // [mm] >>> // deep = 12; // [mm] >>> >>> translate([posX, posY, posZ]) >>> { translate([0, 0, -10]) >>> cylinder(h=deep, d=diam); // fästhål 1 >>> >>> //cableHold1(dist/2, 0, .2, "#D5D5D5"); // Kabelgenomföring >>> translate([dist/2, 0, 0]) >>> { hull() >>> { cylinder(h=5, d=6); // fästhål 1 >>> sphere(d=7.5); >>> } >>> } >>> >>> translate([dist, 0, -10]) >>> cylinder(h=deep, d=diam); // fästhål 2 >>> } >>> } >>> //====== slut mountingHole >>> ======================================================= >>> >>> >>> >>> //================================================================================== >>> //====== LEDlampa >>> ================================================================ >>> // module LEDlampa(posX=8, posY=10, posZ=0) >>> module LEDlampa(posX=0, posY=0, posZ=0, mountSide="left") >>> { side = mountSide == "left" ? 0 >>> : mountSide == "right" ? 1 >>> : assert(false,"invalid moutSide value"); // message if no case >>> worked >>> >>> xpos = mountSide == "left" ? 121 >>> : mountSide == "right" ? -10 >>> : assert(false,"invalid moutSide value"); // message if no case >>> worked >>> /* >>> ypos = mountSide == "left" ? 10.5 >>> : mountSide == "right" ? 10.5 >>> : assert(false,"invalid moutSide value"); // message if no case >>> worked >>> >>> zpos = mountSide == "left" ? 5 >>> : mountSide == "right" ? 5 >>> : assert(false,"invalid moutSide value"); // message if no case >>> worked >>> */ >>> // echo(xpos,ypos,zpos); >>> // translate([xpos, ypos, zpos]) >>> translate([xpos, 10.5, 5]) >>> mirror([1, 0, 0]) >>> translate([posX, posY, posZ]) >>> { LEDbottom(); >>> translate([0, 0, 11]) >>> LEDglas(); >>> } >>> } >>> //====== Slut LEDlampa >>> =========================================================== >>> >>> >>> >>> //================================================================================== >>> //====== LEDglas >>> ================================================================= >>> module LEDglas() >>> { >>> // Variabler botten >>> length = 111; // längd mm >>> wideMid = 50.5; // bredd i mitten mm >>> >>> cornRad = 10; // Radien i alla hörn >>> wideCorn = 48; // Bredd i kanterna >>> >>> diamHole = 6; // håldiameter i mm >>> >>> colorBot = "gray"; >>> colorTop = "orange"; >>> >>> // Variabler top >>> cornHigh = 5; //Höjd i ändarna >>> midHigh = 8; >>> highTop = cornHigh + 1; // höjd mm >>> >>> p1tx = 10; // the start value >>> p1ty = 49.25; >>> p2tx = 55.5; // the middle value >>> p2ty = 50.5; >>> p3tx = 101; // the end value >>> p3ty = p1ty; >>> >>> p4tx = 101; // the start value >>> p4ty = 1.25; >>> p5tx = 55.5; // the middle value >>> p5ty = 0.0; >>> p6tx = 10; // the end value >>> p6ty = p4ty; >>> // Ger ovalt glas >>> points1 = 3points_arc([p1tx,p1ty], [p2tx,p2ty], [p3tx,p3ty], fn=100); >>> points2 = 3points_arc([p4tx,p4ty], [p5tx,p5ty], [p6tx,p6ty], fn=100); >>> >>> color("orange") >>> linear_extrude(height=cornHigh+.1) >>> difference() >>> { polygon(concat(points1, points2)); >>> >>> translate([length-10 , wideMid / 2, -.2]) >>> circle(d=6); >>> translate([10 , wideMid / 2, -.2]) >>> circle(d=6); >>> } >>> >>> // Top >>> color(colorTop) >>> difference() >>> { hull() >>> { // hörn1 >>> translate([cornRad, wideMid - ((wideMid-wideCorn)/2) - cornRad, >>> 0]) // [10,39] >>> cylinder(h=cornHigh, d=cornRad*2, center=false); >>> // hörn2 >>> translate([cornRad, cornRad + ((wideMid-wideCorn)/2), 0]) >>> // [10,12] >>> cylinder(h=cornHigh, d=cornRad*2, center=false); >>> // hörn3 >>> translate([length - cornRad, wideMid - ((wideMid-wideCorn)/2) - >>> cornRad, 0]) // [101 ,39] >>> cylinder(h=cornHigh, d=cornRad*2, center=false); >>> // hörn4 >>> translate([length - cornRad, cornRad + ((wideMid-wideCorn)/2), >>> 0]) // >>> cylinder(h=cornHigh, d=cornRad*2, center=false); >>> } >>> >>> union() >>> { // Monteringshål 1 & 2 >>> translate([length-10 , wideMid / 2, -.2]) >>> cylinder(d=diamHole, h=highTop+.5, center=false); >>> translate([10 , wideMid / 2, -.2]) >>> cylinder(d=diamHole, h=highTop+.5, center=false); >>> } >>> } >>> } >>> //======== Slut LEDglas >>> ========================================================== >>> >>> >>> >>> //================================================================================== >>> //====== LEDbottom >>> =============================================================== >>> module LEDbottom() >>> { p1x = 10; // the start value >>> p1y = 49.25; >>> p2x = 55.5; // the middle value >>> p2y = 50.5; >>> p3x = 101; // the end value >>> p3y = p1y; >>> >>> p4x = 101; // the start value >>> p4y = 1.25; >>> p5x = 55.5; // the middle value >>> p5y = 0.0; >>> p6x = 10; // the end value >>> p6y = p4y; >>> >>> // Variabler botten för borrhålen >>> length = 111; // längd mm >>> wideMid = 50.5; // bredd i mitten mm >>> diamHole = 6; // håldiameter i mm >>> cornHigh = 5; //Höjd i ändarna >>> midHigh = 8; >>> highTop = cornHigh + 1; // höjd mm >>> // offs1 = 0.1; >>> heightHole = 15; //mm >>> height = 11; //mm >>> >>> points1 = circSect( 10, 11.25, 10, [0, 90], "bottom", 1, fn); // >>> Hörn nere till vänster >>> points2 = circSect( 10, 39.25, 10, [0, 90], "left", 1, fn); // >>> Hörn uppe till vänster >>> points3 = 3points_arc([p1x,p1y], [p2x,p2y], [p3x,p3y], fn); >>> points4 = circSect( 101, 39.25, 10, [0, 90], "top", 1, fn); // >>> Hörn uppe till höger >>> points5 = circSect( 101, 11.25, 10, [0, 90], "right", 1, fn); // >>> Hörn nere till höger >>> points6 = 3points_arc([p4x,p4y], [p5x,p5y], [p6x,p6y], fn); >>> >>> // The base plate for the LED lamp >>> >>> >>> difference() >>> { color("gray", 0.5) >>> linear_extrude(height=height) >>> polygon(concat(points1, points2, points3, points4, points5, >>> points6)); >>> >>> >>> // union() >>> { // Monteringshål 1 & 2 >>> translate([length-10 , wideMid / 2, -.2]) >>> cylinder(d=diamHole, h=heightHole, center=false); >>> translate([10 , wideMid / 2, -.2]) >>> cylinder(d=diamHole, h=heightHole, center=false); >>> } >>> } >>> } >>> //======== Slut LEDbottom >>> ======================================================== >>> >>> >>> >>> >>> //================================================================================== >>> //====== circleSect >>> ============================================================== >>> // Create rounded corners 2D >>> // https://openhome.cc/eGossip/OpenSCAD/SectorArc.html >>> // ange .: x, y, radien, >>> // [från, till] vinkel, >>> // var vinkeln startar, (left, bottom, right, top) >>> // vilken rotation (-1=medsol, 1=motsols) >>> function circSect(x=0, y=0, radius=10, angles=[0,270], >>> startRef="bottom", rotate=1, fn=24) = >>> let( >>> startAngel = (startRef == "left") ? 0 >>> : (startRef == "bottom") ? 90 >>> : (startRef == "right") ? 180 >>> : (startRef == "top") ? 270 >>> : startRef, // valfri vinkel >>> // : assert(false,"invalid moutSide value"); // Error >>> message if no case worked >>> //: undef, >>> r = radius, >>> //r = radius / cos(180 / fn), >>> step = 360 / fn, >>> // points = [[x, y], >>> points = [ >>> for(a = [angles[0]-startAngel : step : angles[1]-startAngel]) >>> [-rotate * r * cos(a)+x, r * sin(a)+y]] >>> ) points; >>> //======== Slut circleSect >>> ======================================================= >>> >>> >>> >>> //================================================================================== >>> //====== 3points_arc >>> ============================================================= >>> // Create an arc with three points 2D >>> function 3points_arc(p0, p1, p2, fn=10) = >>> // an alternative expression for D >>> // D = 2 * ( (p1-p0).x * (p2-p0).y - (p1-p0).y * (p2-p0).x ) >>> let( D = 2 * cross(p1-p0, (p2-p0)) ) >>> assert( abs(D)>1e-9, "The 3 points should not be collinear." ) >>> let( >>> Ux = ( (p2-p0).y*(p1-p0)*(p1-p0) - (p1-p0).y*(p2-p0)*(p2-p0) >>> )/D, >>> Uy = ( (p1-p0).x*(p2-p0)*(p2-p0) - (p2-p0).x*(p1-p0)*(p1-p0) >>> )/D, >>> radius = norm([Ux,Uy]), >>> center = [Ux,Uy] + p0, >>> ang0 = atan2( (p0-center).y, (p0-center).x ), >>> ang2 = atan2( (p2-center).y, (p2-center).x ), >>> // the points are in a cw winding iff D<0 >>> // the angular difference between vectors p2-center and p0-center >>> // measured from p0-center; dang is positive iff D is negative >>> dang = D<0 ? ang2<ang0 ? ang2-ang0 : ang2-ang0-360 >>> : ang2>ang0 ? ang2-ang0 : ang2-ang0+360 >>> ) >>> [ for(i=[0:fn-1]) >>> let( ang = ang0 + i*dang/(fn-1) ) >>> center + radius*[cos(ang),sin(ang)] ]; >>> //======== Slut 3points_arc >>> ====================================================== >>> >>> >>> >>> //================================================================================== >>> //====== Wall som ett "L" >>> ======================================================== >>> // Normal vägghöjd >>> function wall() = >>> let( >>> b = 4, // botten - tjocklek >>> f = 8, // Foten >>> h = 15, // Höjd >>> t = 3.5, // Top >>> x = (b+(t/2) - (h - ( (-h / (f-t)) *t) )) / (-h / (f-t)) >>> ) >>> let( >>> points = [[0,0], [f,0], [t,h], [0,h]] , >>> top = move([t/2, h, 0], circle(d=t, $fn=20)), >>> sqr = square([10, b]), >>> diff = >>> difference([ >>> move([x, b], square([t/2, t/2])), >>> move([x+(t/2), b+(t/2), 0], circle(d = t, $fn=20) ) ]) >>> ) >>> union([points, top, sqr, diff]); >>> //======== Slut Wall >>> ============================================================= >>> >>> >>> >>> >>> //================================================================================== >>> //====== Wall1 som ett "L" >>> ======================================================= >>> // En högre vägg >>> function wall1() = >>> let( >>> b = 4, // botten - tjocklek >>> f = 7, // Foten >>> h = 25, // Höjd >>> t = 3, // Top >>> x = (b+(t/2) - (h - ((-h / (f-t)) *t))) / (-h / (f-t)) >>> ) >>> let( >>> points = [[0,0], [f,0], [t,h], [0,h]] , >>> top = move([t/2, h, 0], circle(d=t, $fn=20)), >>> sqr = square([10, b]), >>> diff = >>> difference([ >>> move([x, b], square([t/2, t/2])), >>> move([x+(t/2), b+(t/2), 0], circle(d = t, $fn=20) ) ]) >>> ) >>> union([points, top, sqr, diff]); >>> //======== Slut Wall1 >>> ============================================================ >>> >>> >>> >>> //================================================================================== >>> //====== Plåt på släp >>> ============================================================ >>> module mountingPlate(posX=0, posY=0, posZ=0, mountSide="left", >>> colorName="#C0C0C0", $fn=50) >>> { // Hörnpositionerna >>> posX1 = 120; >>> posY1 = 0; >>> posX2 = posX1; >>> posY2 = -200; >>> posX3 = 120 - 75; >>> posY3 = -200; >>> posX4 = 0; >>> posY4 = 0; >>> thick=2; // tjocklek >>> >>> side = mountSide == "left" ? 0 >>> : mountSide == "right" ? 1 >>> : assert(false,"invalid moutSide value"); // message if no case >>> worked >>> >>> xpos = mountSide == "left" ? 20 >>> : mountSide == "right" ? -20 >>> : assert(false,"invalid moutSide value"); // message if no case >>> worked >>> /* >>> ypos = mountSide == "left" ? 85 >>> : mountSide == "right" ? 85 >>> : assert(false,"invalid moutSide value"); // message if no case >>> worked >>> >>> zpos = mountSide == "left" ? -thick >>> : mountSide == "right" ? -thick >>> : assert(false,"invalid moutSide value"); // message if no case >>> worked >>> */ >>> color(colorName) >>> { translate([posX, posY, posZ]) >>> translate([xpos, 85, -thick]) >>> { mirror([side, 0, 0]) >>> { linear_extrude(thick) >>> hull() >>> { translate([posX1, posY1, 0]) >>> square(0.1, center = true); >>> translate([posX2, posY2, 0]) >>> square(0.1, center = true); >>> translate([posX3, posY3, 0]) >>> square(0.1, center = true); >>> translate([posX4, posY4, 0]) >>> square(0.1, center = true); >>> } >>> } >>> } >>> } >>> } >>> = = END product 1= = = = = = = = = = = = = = = = = = = = = = = = = = = >>> = = = >>> - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - >>> . _ . - . _ . - . _ . - . _ . - >>> >>> >>> >>> >>> = = product 2 = = = = = = = = = = = = = = = = = = = = = = = = = = = = = >>> = = = >>> - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - >>> . _ . - . _ . - . _ . - . _ . - >>> >>> $fn=100; >>> //$fn=15; >>> >>> //switch(); >>> //cableHolder4(); //Switchboxen >>> >>> >>> // cableHolder3(0, 0, 0, 33.5, 23.5, 1.5, 2); >>> // showCables(); >>> >>> >>> >>> module cableHolder4(fn=24); >>> { // idé från >>> // - https://www.thingiverse.com/thing:6400/files >>> // - >>> https://ihrchive.wordpress.com/2011/02/14/openscad-tip-round-1-of-3-basic-rounding/ >>> >>> // mått på Switch >>> heightHold = 10.5; >>> widthHold = 33.5; >>> depthHold = 23.5; >>> spaceHold = 10.0; // utrymmet bakom switch >>> holdRadie = 2; // radie i hörnen >>> thick = 2; >>> offset1=0.5; // öka toleransen >>> >>> // innermått >>> holeW = widthHold + offset1; >>> holeH = heightHold + offset1; >>> holeD = depthHold + spaceHold+offset1; >>> >>> // yttermått >>> pad = 0.1; // Padding to maintain manifold >>> box_l = holeW + thick*2; // Bredden på switchen >>> box_w = holeD + thick; // Djupet på switchen >>> box_h = holeH + thick; // Height >>> round_r = holdRadie; // Radius of round >>> smooth = 45; // Number of facets of rounding cylinder >>> >>> >>> >>> difference() >>> { union() // Detta utförs i två steg. >>> { difference() // utför fasningar och kabelmarkeringar >>> { mainBox(box_l, box_w, box_h, spaceHold+thick, round_r, thick, >>> smooth, pad); >>> >>> // fasning vänster (underkant) >>> translate([box_l/2-0.85, spaceHold-4.3, thick-offset1]) // >>> sidled, fram/bak , upp/ned >>> rotate([0,180,45]) >>> cylinder(h=thick, d1=holeW*1.414-thick-thick, >>> d2=holeW*1.414, $fn=4); >>> >>> // fasning höger (underkant) >>> translate([box_l/2-3.65, spaceHold-4.3, thick-offset1]) // >>> sidled, fram/bak , upp/ned >>> rotate([0,180,45]) >>> cylinder(h=thick, d1=holeW*1.414-thick-thick, >>> d2=holeW*1.414, $fn=4); >>> >>> // kabelgenomföringar >>> rotate([90, 180, 90]) // Markering ena sidan (vänster under) >>> ovalCableHole(spaceHold/2-offset1, -1.75, -1.2); >>> >>> rotate([90, 180, 180]) // Markering bakkant (vänster under) >>> ovalCableHole(spaceHold/2-1.55, -1.75, -spaceHold-0.85); >>> >>> rotate([90, 180, 180]) // Markering bakkant (höger under) >>> ovalCableHole(widthHold-spaceHold/2-offset1, -1.75, >>> -spaceHold-0.85); >>> >>> rotate([90, -180, 90]) // Markering ena sidan (höger under) >>> ovalCableHole(3.75, -1.75, widthHold-0.1); >>> } >>> } // Slut union - kropp >>> >>> translate([-offset1/2, -spaceHold+pad, -pad]) // hålet där switchen >>> ska placeras >>> cube([holeW, holeD+pad, holeH+pad], center=false); >>> >>> translate([4, 12, 0]) >>> cylinder(h=15,d=3.2); >>> translate([4, 12, 17.7]) >>> sphere(r=6); >>> >>> translate([29.6, 12, 0]) >>> cylinder(h=15,d=3.2); >>> translate([29.6, 12, 17.7]) >>> sphere(r=6); >>> >>> /* // Hål genom lock bak - om så önskas >>> translate([box_l/2-thick, -6, offset1/2]) >>> cylinder(h=box_h+thick*4+offset1, d=3.2, $fn=100); // hål genom >>> lock bak >>> >>> translate([box_l/2-thick, -6, 17.7]) >>> sphere(r=6); // kona hålet bak >>> */ >>> } // Slut difference() - box >>> >>> difference() >>> { union() >>> { translate([29.6, 12, heightHold-offset1*2]) >>> cylinder(h=2,d=5.2); // Stödhylsa för Switchskruv1 >>> translate([4, 12, heightHold-offset1*2]) >>> cylinder(h=2,d=5.2); // Stödhylsa för Switchskruv2 >>> >>> translate([holeW/2, -spaceHold+thick+1, holeH/2]) >>> rotate([180,0,0]) >>> backHole(); >>> } // union - slut >>> >>> translate([4, 12, 0]) // Hålen i stödhylsorna >>> cylinder(h=15,d=3.2); >>> >>> translate([29.6, 12, 0]) // Hålen i stödhylsorna >>> cylinder(h=15,d=3.2); >>> >>> translate([box_l/2-thick, -6, -offset1]) // hål i stödhylsa bak >>> cylinder(h=box_h+offset1, d=3.2, $fn=100); >>> >>> // Sänk stödhylsan >>> translate([ widthHold/2-7, -spaceHold-offset1, -thick+offset1]) >>> // hål i stödhylsa bak >>> cube([15, 8, 3]); >>> >>> >>> // kabelmarkering >>> // translate([0, 0, 0]) // hål i stödhylsa bak >>> >>> >>> } >>> >>> >>> >>> >>> >>> >>> /* >>> translate([4, 12, 0]) >>> #cylinder(h=15,d=3.2); >>> //translate([4, 13.5, 17.3]) >>> //#sphere(r=6); >>> >>> translate([29.6, 12, 0]) >>> #cylinder(h=15,d=3.2); >>> //translate([29.6, 13.5, 17.3]) >>> //#sphere(r=6); >>> */ >>> >>> >>> } >>> >>> module backHole() >>> { wallH = 10.5; >>> >>> wide1 = 12; // endast runt cylindern >>> wide2 = 35; // hela väggen >>> deep1 = 4; >>> height1 = 10.5; >>> cornRad1 = 2; >>> diam1 = 8; >>> opt1 = 0.1; >>> >>> //rundadFot(); >>> >>> >>> // Rundad stäcka mellan t.ex. vägg och tak -bakkant >>> translate([wide2/2, diam1/2-cornRad1/2, -height1/2]) >>> { rotate([90, 0, -90]) >>> { linear_extrude(wide2) >>> { difference() >>> { square([cornRad1, cornRad1]); >>> >>> translate([cornRad1, cornRad1]) >>> circle(r=cornRad1); >>> } >>> } >>> } >>> } >>> >>> // rundad stäcka1 (vänster) mellan t.ex. vägg och tak >>> translate([-wide2/2+0.15, deep1/2+cornRad1/2, -height1/2]) >>> rotate([90, 0, 0]) >>> { linear_extrude(spaceHold) >>> { difference() >>> { square([cornRad1, cornRad1]); >>> >>> translate([cornRad1, cornRad1]) >>> circle(r=cornRad1); >>> } >>> } >>> } >>> >>> // rundad stäcka2 mellan t.ex. vägg och tak >>> translate([wide2/2-0.65, deep1/2+cornRad1/2, -height1/2]) >>> rotate([0, -90, 90]) >>> { linear_extrude(spaceHold) >>> { difference() >>> { square([cornRad1, cornRad1]); >>> >>> translate([cornRad1, cornRad1]) >>> circle(r=cornRad1); >>> } >>> } >>> } >>> >>> // Skapa stödfot - bak >>> difference() >>> { union() >>> { //själva cylindern >>> translate([0, 1, 0]) >>> { cylinder(h=height1, d=diam1, center=true); >>> translate([0, diam1/2, 0]) >>> cube([diam1,diam1-1,height1], center=true); >>> } >>> >>> // Rundad fot under cylinder ovan >>> translate([0, 1, -height1/2]) >>> { rotate_extrude() >>> { translate([diam1/2, 0, 0]) >>> { difference() >>> { square([cornRad1, cornRad1]); >>> >>> translate([cornRad1, cornRad1]) >>> circle(r=cornRad1); >>> } >>> } >>> } >>> } >>> >>> // Rundad rakstäcka1 - cylinderfot - mellan t.ex. vägg och tak >>> translate([diam1/2, diam1, -height1/2]) >>> { rotate([90, 0, 0]) >>> { linear_extrude(diam1) >>> { difference() >>> { square([cornRad1, cornRad1]); >>> >>> translate([cornRad1, cornRad1]) >>> circle(r=cornRad1); >>> } >>> } >>> } >>> } >>> >>> // Rundad rakstäcka2 - cylinderfot - mellan t.ex. vägg och tak >>> translate([-diam1/2, diam1, -height1/2]) >>> { rotate([0, -90, 90]) >>> { linear_extrude(diam1) >>> { difference() >>> { square([cornRad1, cornRad1]); >>> >>> translate([cornRad1, cornRad1]) >>> circle(r=cornRad1); >>> } >>> } >>> } >>> } >>> >>> //väggen bakom cylindern som ska rundas >>> translate([0, diam1/2-cornRad1, 0]) >>> cube([wide1, cornRad1, height1], center=true); >>> >>> } >>> >>> >>> // Avrunda hörn1 bak >>> translate([-wide1/2, cornRad1/2, cornRad1]) >>> { hull() >>> { cylinder(h=height1+opt1, r=cornRad1, center=true); >>> { translate([0, 0, -height1/2]) >>> sphere(r=cornRad1); >>> } >>> } >>> } >>> >>> // Avrunda hörn2 bak >>> translate([wide1/2, cornRad1/2, cornRad1]) >>> { hull() >>> { cylinder(h=height1+opt1, r=cornRad1, center=true); >>> { translate([0, 0, -height1/2]) >>> sphere(r=cornRad1); >>> } >>> } >>> } >>> >>> >>> // Plocka bort rundad fot bak samt det som sticker ut >>> translate([-wide1/2, diam1/2-cornRad1/2, -height1/2-opt1]) >>> cube([wide1, diam1/2+cornRad1, height1+opt1*2], center=false); >>> >>> } >>> } >>> >>> >>> >>> >>> >>> module ovalCableHole(posX, posY, posZ) >>> { // Hål 5.5 x 3.5 mm >>> pan = 0.1; >>> cableHi = 1.5; >>> >>> translate([posX, posY, posZ]) >>> { color("white") >>> { translate([0, 0, -pan]) >>> { cylinder(h=cableHi, d=3.5); >>> //#translate([0, 0, 0]) cylinder(h=10, d=1); >>> //translate([0, 0, -1]) cylinder(h=1, d1=0, d2=1); >>> //translate([0, 0, 0]) sphere(d=1); // Inre kulan >>> //translate([0, 0, 1.5]) sphere(d=1); // Inre kulan >>> >>> translate([0, 0, -1]) sphere(d=0.8); // yttre kulan >>> translate([0, 0, 2.5]) sphere(d=0.8); // yttre kulan >>> >>> } >>> translate([2, 0, -pan]) >>> { cylinder(h=cableHi, d=3.5); >>> // #translate([0, 0, -cableHi*2]) cylinder(h=10, d=0.5); >>> //translate([0, 0, 0]) sphere(d=1); // Inre kulan >>> //translate([0, 0, 1.5]) sphere(d=1); // Inre kulan >>> >>> translate([0, 0, -1]) sphere(d=0.8); // yttre kulan >>> translate([0, 0, 2.5]) sphere(d=0.8); // yttre kulan >>> >>> } >>> translate([-3.5/2, 0, -pan]) >>> cube([5.5, 3.5/2, cableHi]); >>> translate([-0.25, -1.74, -pan]) >>> cube([2.5, 1.75, cableHi]); >>> } >>> } >>> } >>> >>> >>> >>> >>> >>> >>> module rundadFot() >>> { >>> // specifika värden för skruvdistansen bak >>> wallH = 10.5; >>> >>> wide1 = 12; // endast runt cylindern >>> wide2 = 34; // hela väggen >>> deep1 = 4; >>> height1 = 10; >>> cornRad1 = 2; >>> diam1 = 8; >>> opt1 = 0.1; >>> >>> >>> color("magenta") >>> { translate([0, 0, wallH]) >>> { difference() >>> { union() >>> { // Bakgavel >>> translate([wide2/2, opt1, height1/2]) >>> { rotate([90, 180, 0]) >>> cube([wide2, height1, opt1]); >>> } >>> >>> // Golv >>> translate([wide2/2, -height1+opt1, -height1/2]) >>> rotate([0, 180, 0]) >>> cube([wide2, height1, opt1]); >>> >>> //väggen bakom cylindern som kan rundas >>> translate([0, -cornRad1/2, 0]) >>> cube([wide1, cornRad1, height1], center=true); >>> >>> //själva cylindern >>> translate([0, -cornRad1/2, 0]) >>> cylinder(h=height1, d=diam1, center=true); >>> >>> // Rundad fot under cylinder ovan >>> translate([0, -cornRad1/2, -height1/2]) >>> { rotate_extrude() >>> { translate([diam1/2, 0, 0]) >>> { difference() >>> { square([cornRad1, cornRad1]); >>> >>> translate([cornRad1, cornRad1]) >>> circle(r=cornRad1); >>> } >>> } >>> } >>> } >>> >>> // Rundad stäcka mellan t.ex. vägg och tak -bakkant >>> translate([wide2/2, 0, -height1/2]) >>> { rotate([90, 0, -90]) >>> { linear_extrude(wide2) >>> { difference() >>> { square([cornRad1, cornRad1]); >>> >>> translate([cornRad1, cornRad1]) >>> circle(r=cornRad1); >>> } >>> } >>> } >>> } >>> >>> // rundad stäcka mellan t.ex. vägg och tak -sida1 >>> translate([-wide2/2, 0, -height1/2]) >>> { rotate([90, 0, 0]) >>> { linear_extrude(10) >>> { difference() >>> { square([cornRad1, cornRad1]); >>> >>> translate([cornRad1, cornRad1]) >>> circle(r=cornRad1); >>> } >>> } >>> } >>> } >>> >>> // rundad stäcka mellan t.ex. vägg och tak -sida2 >>> translate([wide2/2, -10, -height1/2]) >>> { rotate([90, 0, 180]) >>> { linear_extrude(10) >>> { difference() >>> { square([cornRad1, cornRad1]); >>> >>> translate([cornRad1, cornRad1]) >>> circle(r=cornRad1); >>> } >>> } >>> } >>> } >>> } // Avsluta union = = = = = = = = = = = = = = = = = = = = >>> >>> >>> // Avrunda hörn1 bak >>> translate([-wide1/2+opt1*1.3, -deep1/2, cornRad1]) >>> { cylinder(h=height1+opt1, r=cornRad1, center=true); >>> translate([0, 0, -height1/2]) >>> sphere(r=cornRad1); >>> } >>> >>> // Avrunda hörn2 bak >>> translate([wide1/2-opt1*1.3, -deep1/2, cornRad1]) >>> { cylinder(h=height1+opt1, r=cornRad1, center=true); >>> translate([0, 0, -height1/2]) >>> sphere(r=cornRad1); >>> } >>> >>> // Plocka bort rundad fot bak samt det som sticker ut >>> translate([-wide1/2, 0, -height1/2-opt1]) >>> cube([wide1, diam1/2+cornRad1, height1+opt1*2], center=false); >>> } >>> } >>> } >>> } >>> >>> >>> >>> >>> >>> >>> >>> >>> module mainBox(box_l, box_w, box_h, spaceHold, round_r, thick, smooth, >>> pad) >>> { translate([box_l/2-thick-offset1/2, box_w/2-spaceHold, box_h/2]) >>> { >>> // To fix the corners cut the main cube with smaller cubes with >>> spheres removed >>> difference() >>> { cube([box_l, box_w, box_h], center = true); >>> >>> // Kant1 - liggande >>> translate([0, -box_w/2+round_r, box_h/2-round_r]) >>> { difference() >>> { translate([0,-round_r-pad,round_r+pad]) >>> cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center = >>> true); >>> rotate(a=[0,90,0]) >>> cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> // Kant2 - liggande >>> translate([0, box_w/2-round_r, box_h/2-round_r]) >>> { difference() >>> { translate([0,round_r+pad,round_r+pad]) >>> cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center = >>> true); >>> rotate(a=[0,90,0]) >>> cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> /* >>> // Kant3 - liggande >>> translate([0, -box_w/2+round_r, -box_h/2+round_r]) >>> { difference() >>> { translate([0,-round_r-pad,-round_r-pad]) >>> cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center = >>> true); >>> rotate(a=[0,90,0]) >>> cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> >>> // Kant4 - liggande >>> translate([0, box_w/2-round_r, -box_h/2+round_r]) >>> { difference() >>> { translate([0,round_r+pad,-round_r-pad]) >>> cube([box_l+2*pad, round_r*2+pad, round_r*2+pad], center = >>> true); >>> rotate(a=[0,90,0]) >>> cylinder(box_l+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> */ >>> // ---- >>> // Kant1 - stående >>> translate([-box_l/2+round_r, box_w/2-round_r, 0]) >>> { difference() >>> { translate([-round_r-pad,round_r+pad,0]) >>> cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center = >>> true); >>> cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> // Kant2 - stående >>> translate([box_l/2-round_r, box_w/2-round_r, 0]) >>> { difference() >>> { translate([round_r+pad,round_r+pad,0]) >>> cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center = >>> true); >>> cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> // Kant3 - stående >>> translate([-box_l/2+round_r, -box_w/2+round_r, 0]) >>> { difference() >>> { translate([-round_r-pad,-round_r-pad,0]) >>> cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center = >>> true); >>> cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> // Kant4 - stående >>> translate([box_l/2-round_r, -box_w/2+round_r, 0]) >>> { difference() >>> { translate([round_r+pad,-round_r-pad,0]) >>> cube([round_r*2+pad, round_r*2+pad, box_h+2*pad], center = >>> true); >>> cylinder(box_h+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> >>> // ---- >>> // Kant1 liggande (andra hållet) >>> translate([-box_l/2+round_r, 0, box_h/2-round_r]) >>> { difference() >>> { translate([-round_r-pad, 0, round_r+pad]) >>> cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center = >>> true); >>> rotate(a=[0,90,90]) >>> cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> // Kant2 liggande (andra hållet) >>> translate([box_l/2-round_r, 0, box_h/2-round_r]) >>> { difference() >>> { translate([round_r+pad, 0, round_r+pad]) >>> cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center = >>> true); >>> rotate(a=[0,90,90]) >>> cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> /* >>> // Kant3 liggande (andra hållet) >>> translate([-box_l/2+round_r, 0, -box_h/2+round_r]) >>> { difference() >>> { translate([-round_r-pad, 0, -round_r-pad]) >>> cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center = >>> true); >>> rotate(a=[0,90,90]) >>> cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> >>> // Kant4 liggande (andra hållet) >>> translate([box_l/2-round_r, 0, -box_h/2+round_r]) >>> { difference() >>> { translate([round_r+pad, 0, -round_r-pad]) >>> cube([round_r*2+pad, box_w+2*pad, round_r*2+pad], center = >>> true); >>> rotate(a=[0,90,90]) >>> cylinder(box_w+4*pad,round_r,round_r,center=true,$fn=smooth); >>> } >>> } >>> */ >>> // ---- >>> // Hörn1 (övre) >>> translate([box_l/2-round_r, box_w/2-round_r, box_h/2-round_r]) >>> { difference() >>> { translate([round_r+pad, round_r+pad, round_r+pad]) >>> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = >>> true); >>> sphere(round_r,$fn=smooth); >>> } >>> } >>> // Hörn2 (övre) >>> translate([-box_l/2+round_r, box_w/2-round_r, box_h/2-round_r]) >>> { difference() >>> { translate([-round_r-pad, round_r+pad, round_r+pad]) >>> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = >>> true); >>> sphere(round_r,$fn=smooth); >>> } >>> } >>> // Hörn3 (övre) >>> translate([box_l/2-round_r, -box_w/2+round_r, box_h/2-round_r]) >>> { difference() >>> { translate([round_r+pad, -round_r-pad, round_r+pad]) >>> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = >>> true); >>> sphere(round_r,$fn=smooth); >>> } >>> } >>> // Hörn4 (övre) >>> translate([-box_l/2+round_r, -box_w/2+round_r, box_h/2-round_r]) >>> { difference() >>> { translate([-round_r-pad, -round_r-pad, round_r+pad]) >>> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = >>> true); >>> sphere(round_r,$fn=smooth); >>> } >>> } >>> /* >>> // Hörn1 (undre) >>> translate([box_l/2-round_r, box_w/2-round_r, -box_h/2+round_r]) >>> { difference() >>> { translate([round_r+pad, round_r+pad, -round_r-pad]) >>> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = >>> true); >>> sphere(round_r,$fn=smooth); >>> } >>> } >>> // Hörn2 (undre) >>> translate([-box_l/2+round_r, box_w/2-round_r, -box_h/2+round_r]) >>> { difference() >>> { translate([-round_r-pad, round_r+pad, -round_r-pad]) >>> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = >>> true); >>> sphere(round_r,$fn=smooth); >>> } >>> } >>> // Hörn3 (undre) >>> translate([box_l/2-round_r, -box_w/2+round_r, -box_h/2+round_r]) >>> { difference() >>> { translate([round_r+pad, -round_r-pad, -round_r-pad]) >>> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = >>> true); >>> sphere(round_r,$fn=smooth); >>> } >>> } >>> // Hörn4 (undre) >>> translate([-box_l/2+round_r, -box_w/2+round_r, -box_h/2+round_r]) >>> { difference() >>> { translate([-round_r-pad, -round_r-pad, -round_r-pad]) >>> cube([round_r*2+pad, round_r*2+pad, round_r*2+pad], center = >>> true); >>> sphere(round_r,$fn=smooth); >>> } >>> } >>> */ >>> } >>> } >>> } >>> // >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> module cableHolder3(posX, posY, posZ, length, width, height, radius) >>> { // Skapa toppen över switchen >>> // mått på Switchen >>> fn = 96; // upplösning (endast bågen?) >>> heightHold = 10.5; >>> widthHold = 33.5; >>> depthHold = 23.5; >>> holdRadie = 1.5; // radie i hörnen >>> thick = 1.5; // tjocklek >>> >>> >>> translate([0,-thick,0]) >>> { >>> difference(0, 0, 0) >>> { hull() >>> { difference() >>> { translate([thick, 0, heightHold]) // vänster kant >>> { rotate([-90, 0, 0]) >>> { cylinder(h=depthHold, d=thick*2); >>> translate([0, 0, depthHold]) >>> sphere(d=thick*2); // längst fram >>> } >>> } >>> translate([0, -0.1, heightHold]) // plocka bort underdelen >>> rotate([-90, 0, 0]) >>> cube([thick*2, thick+.1, depthHold+thick+.1]); >>> } >>> >>> difference() >>> { translate([widthHold-thick, 0, heightHold]) // höger kant >>> { rotate([-90, 0, 0]) >>> { cylinder(h=depthHold, d=thick*2); >>> translate([0, 0, depthHold]) >>> sphere(d=thick*2); // längst fram >>> } >>> } >>> translate([widthHold-thick*2, -0.1, heightHold]) // plocka >>> bort underdelen >>> { rotate([-90, 0, 0]) >>> cube([thick*2, thick+.1, depthHold+thick+.1]); >>> } >>> } >>> } >>> >>> // öppna hålen för monteringsskruvarna uppe på plattan >>> translate([4, 13.5, 0]) >>> cylinder(h=15,d=3.2); >>> translate([4, 13.5, 17.3]) >>> sphere(r=6); >>> >>> translate([29.6, 13.5, 0]) >>> cylinder(h=15,d=3.2); >>> >>> translate([29.6, 13.5, 17.3]) >>> sphere(r=6); >>> } >>> >>> // halvbåge 1 bak >>> translate([thick, 0, heightHold/2+thick/2]) >>> rotate([0, 90, 180]) >>> rotate_extrude(angle = 180, convexity=20, $fn=64) >>> translate([heightHold/2-thick/2, 0, 0]) >>> circle(d=thick*2); >>> translate([thick, 0, heightHold]) >>> sphere(d=thick*2); // övre kulan >>> translate([thick, 0, thick]) >>> sphere(d=thick*2); // undre kulan >>> >>> >>> // halvbåge 2 bak >>> translate([widthHold-thick, 0, heightHold/2+thick/2]) >>> rotate([0, 90, 180]) >>> rotate_extrude(angle = 180, convexity=20, $fn=64) >>> translate([heightHold/2-thick/2, 0, 0]) >>> circle(d=thick*2); >>> translate([widthHold-thick, 0, heightHold]) >>> sphere(d=thick*2); // övre kulan >>> translate([widthHold-thick, 0, thick]) >>> sphere(d=thick*2); // undre kulan >>> >>> // en cylinder tvärsöver längst upp >>> translate([thick, 0, heightHold]) >>> { rotate([0,90,0]) >>> cylinder(h=widthHold-thick*2, r=thick); >>> } >>> } >>> >>> // Halvbågen (kabelhållaren) på baksidan switchen >>> translate([widthHold-thick, -thick, heightHold/2+thick/2]) >>> { rotate([0,90,180]) >>> linear_extrude(widthHold-thick*2) >>> arc(heightHold/2-thick/2, [0, 180], thick, fn); //radius, >>> angles, width, fn) >>> } >>> // en cylinder tvärsöver längst ned >>> translate([thick, -thick, thick]) >>> { rotate([0,90,0]) >>> cylinder(h=widthHold-thick*2, r=thick); >>> } >>> } >>> >>> >>> >>> module switch(posX=0, posY=0, posZ=0) >>> { buttRadie = 1.5; >>> height = 10.5; >>> width = 33.5; >>> depth = 23.5; >>> h1x = buttRadie; >>> h1y = buttRadie; >>> h2x = width-buttRadie; >>> h2y = buttRadie; >>> h3x = width-buttRadie; >>> h3y = depth-buttRadie; >>> h4x = buttRadie; >>> h4y = depth-buttRadie; >>> >>> translate([posX, posY, posZ]) >>> { difference() >>> { color("#F9F9F3") >>> // tryck-knappen >>> union() >>> { translate([width/2, depth+6-0.1, height/2]) >>> { rotate([90, 0, 0]) >>> { translate([0,0,6]) >>> circle(d=6.8); // skuggan runt knapp >>> cylinder(h=6, d=6); >>> sphere(d=6); >>> } >>> } >>> >>> hull() // Switchkropp >>> { translate([h1x, h1y]) >>> cylinder(h=height, r=1.5); >>> translate([h2x, h2y]) >>> cylinder(h=height, r=1.5); >>> translate([h3x, h3y]) >>> cylinder(h=height, r=1.5); >>> translate([h4x, h4y]) >>> cylinder(h=height, r=1.5); >>> } >>> } >>> >>> // Skruvhålen för switchen >>> hole( 4, 12, 0, "#FFD700", height); >>> hole(29.6, 12, 0, "#FFD700", height); >>> // hole( 4, 12, 0, "#FFD700", 50); >>> // hole(29.6, 12, 0, "#FFD700", 50); >>> // hål för kablar bak >>> color("gray") >>> { translate([9.5, 16, height/2]) >>> { rotate([90, 0, 0]) >>> cylinder(h=16.5, d=4); >>> } >>> translate([24.5, 16, height/2]) >>> { rotate([90, 0, 0]) >>> cylinder(h=16.5, d=4); >>> } >>> } >>> >>> // hål för kabelskruvar >>> color("white") >>> { translate([29.5, 17.1, height/2]) >>> { rotate([0, 90, 0]) >>> cylinder(h=4.1, d=4.5); >>> } >>> translate([-0.1, 17.1, height/2]) >>> { rotate([0, 90, 0]) >>> cylinder(h=4.1, d=4.5); >>> } >>> } >>> } >>> >>> // Kabelskruvar >>> cableScrew(3, 17, height/2, 90); >>> cableScrew(31, 17, height/2, -90); >>> >>> } >>> } >>> >>> // Skruven som håller fast kabeln i switchen >>> module cableScrew(posX=0, posY=0, posZ=0, angle=0) >>> { color("#FFD700") // mässing >>> translate([posX, posY, posZ]) >>> { rotate([0, 0, angle]) >>> { difference() >>> { // skruvskalle >>> translate([0, 0, 0]) >>> rotate([90, 0, 0]) >>> cylinder(h=2, d1=4, d2=3.5); >>> >>> // stjärnan i skruven >>> translate([0, 1.85, -.25]) >>> rotate([0, 0, 0]) >>> cylinder(h=0.5, d=5); >>> translate([-0.25, -.6, 2.25]) >>> rotate([0, 90, 0]) >>> cube([4.5, 2, 0.5]); >>> } >>> } >>> } >>> } >>> >>> >>> >>> // borrhål >>> module hole(posX=0, posY=0, posZ=0, colorName="yellow", height) >>> { diamHole1 = 3; >>> highHole1 = height; >>> diamHole2 = 6; >>> highHole2 = 2.5; >>> offs=0.1; >>> >>> color(colorName) >>> { >>> translate([posX, posY, posZ]) >>> { translate([0, 0, 0]) >>> cylinder(h=highHole1, d=diamHole1); >>> translate([0, 0, -offs]) >>> cylinder(h=highHole2, d=diamHole2); >>> translate([0, 0, height-highHole2+offs]) >>> cylinder(h=highHole2, d=diamHole2); >>> } >>> } >>> } >>> >>> module showCables() >>> { translate([-25,8,24]) >>> rotate([80,177,90]) >>> cable(10,10,0,"brun"); >>> translate([-43,8,15]) >>> rotate([90,180,90]) >>> cable(10,10,0,"blå"); >>> } >>> >>> >>> module cable(posX=0, posY=0, posZ=0, colorName="blå", radius=1.26, >>> width=0.62, thick=50, fn=24) >>> { // default 1.5mm2 >>> // radius = inner radie >>> // width = bredd/tjocklek på cirkeln (inte höjd) >>> // thick = höjd på cirken/ röret >>> // pin= >>> >>> colCupper = "#D7715A"; >>> colGreen = "#07DA63"; >>> colYellow = "#FFCC00"; >>> >>> if (colorName=="gröngul") >>> { translate([posX, posY, posZ]) >>> { color(colGreen) >>> linear_extrude(thick) >>> arc(radius, [0, 60], width, fn); >>> color(colYellow) >>> linear_extrude(thick) >>> arc(radius, [60, 180], width, fn); >>> color(colGreen) >>> linear_extrude(thick) >>> arc(radius, [180, 240], width, fn); >>> color(colYellow) >>> linear_extrude(thick) >>> arc(radius, [240, 360], width, fn); >>> >>> color(colCupper) >>> linear_extrude(10, center=true, convexity=10, $fn=100) >>> circle(d=1.24); >>> } >>> } >>> else // vanliga kablar 1.5mm2 >>> { >>> cableColor = colorName == "blå" ? "#1870D5" >>> : colorName == "brun" ? "#9C6137" >>> : colorName == "svart" ? "#000000" >>> : assert(false,"invalid color value"); // message if no >>> case worked >>> // : nodef >>> >>> translate([posX, posY, posZ]) >>> { //el kabel - ena änden rak - andra böjd >>> color(colCupper) //kopparstump tråd rakkabel >>> linear_extrude(10, center=true, convexity=10, $fn=100) >>> circle(d=1.24); >>> >>> color(cableColor) >>> { cylinder(h=thick, r=radius); >>> >>> translate([-radius*2, 0, thick]) // kabelböj >>> rotate([90, 0, 0]) >>> rotate_extrude(angle=90, convexity=20) >>> translate([2.5, 0, 0]) >>> circle(r=1.26); >>> >>> translate([-radius*2, 0, thick+radius*2]) >>> rotate([0, -90, 0]) >>> cylinder(h=5, r=radius); >>> } >>> translate([-10, 0, thick+radius*2]) >>> { rotate([0, -90, 0]) >>> { color(colCupper) >>> { linear_extrude(5, center=true, convexity=10, $fn=100) >>> circle(d=1.24); >>> } >>> } >>> } >>> } >>> } >>> } >>> >>> >>> // ====================================================================== >>> module arc(radius, angles, width = 1, fn = 24) { >>> difference() { >>> sector(radius + width, angles, fn); // ytterradie >>> sector(radius, angles, fn); // innerradie (plockar bort >>> invändigt >>> } >>> } >>> >>> module sector(radius, angles, fn = 24) { >>> r = radius / cos(180 / fn); >>> step = -360 / fn; >>> >>> points = concat([[0, 0]], >>> [for(a = [angles[0] : step : angles[1] - 360]) >>> [r * cos(a), r * sin(a)] >>> ], >>> [[r * cos(angles[1]), r * sin(angles[1])]] >>> ); >>> >>> difference() { >>> circle(radius, $fn = fn); >>> polygon(points); >>> } >>> } >>> = = END product 2 = = = = = = = = = = = = = = = = = = = = = = = = = = = >>> = = = >>> - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ >>> . - . _ . - . _ . - . _ . - . _ . - >>> >>> >>> Den fredag 6 maj 2022 14:06:55 CEST, Michael Möller < >>> private2michael@gmail.com> skrev: >>> >>> >>> >>> OpenSCAD code - is a description of your model in terms of a few >>> cylinder/cubes added and cut out >>> difference() { >>> cylinder(d=5,h=10); >>> translate([0,10,0]) cube([4,6,2]) ; >>> } >>> >>> STL file is a list of triangles which make the same outer shell as your >>> model. OpenSCAD makes this complicated transform from shapes to triangles. >>> solid OpenSCAD_Model >>> facet normal 0.92388 0.382682 0 >>> outer loop >>> vertex 2.5 0 3 >>> vertex 1.76777 1.76777 0 >>> vertex 1.76777 1.76777 3 >>> endloop >>> endfacet >>> facet normal 0.92388 0.382682 0 >>> outer loop >>> vertex 1.76777 1.76777 0 >>> vertex 2.5 0 3 >>> vertex 2.5 0 0 >>> endloop >>> endfacet >>> : (and so on for 300 lines) There is a binary/compressed version, but >>> the description is still just triangles. >>> >>> Gcode is what a 3D printer understands - it is the exact list of moves >>> that the head has to do with how much plastic to squeeze to trace the >>> outline of your shape, layer, by layer. It will optionally create moves for >>> filling the inside or support for overhangs. Such a program is called a >>> SLICER and the printer will come with one. >>> G92 E0 ; reset extrusion distance >>> G1 Z2.330 F6600.000 ; lift Z >>> G1 X-0.000 Y1.505 F6600.000 ; move to first perimeter point >>> G1 Z0.330 F6600.000 ; restore layer Z >>> G1 E3.00000 F2400.00000 ; unretract extruder 0 >>> G1 F1500 >>> G1 X-1.064 Y1.064 E3.09259 ; perimeter >>> G1 X-1.505 Y0.000 E3.18517 ; perimeter >>> : (many similar lines) >>> G1 X1.515 Y1.515 E4.65860 ; perimeter >>> G1 X0.055 Y2.120 E4.78559 ; perimeter >>> G1 X-0.000 Y2.143 F6600.000 ; move inwards before travel >>> G1 X0.384 Y0.843 F6600.000 ; move to first infill point >>> G1 F1500 >>> G1 X0.843 Y0.384 E4.84815 ; infill >>> G1 X1.097 Y-0.229 E4.91215 ; infill >>> : >>> (and so on for thousands of lines) >>> >>> The 3MF still basically deals in triangles, and attributes (surface, >>> infill material, picture, ticket info ... ) which probably are not used by >>> your slicer/printer. >>> >>> On Fri, 6 May 2022 at 12:37, Jan Öhman via Discuss < >>> discuss@lists.openscad.org> wrote: >>> >>> >>> >>> >>> ---------- Forwarded message ---------- >>> From: "Jan Öhman" <jan_ohman@yahoo.com> >>> To: OpenSCAD General Discussion <discuss@lists.openscad.org> >>> Cc: >>> Bcc: >>> Date: Fri, 6 May 2022 10:38:46 +0000 (UTC) >>> Subject: [OpenSCAD] Export to .STL / .3MF for later 3D-printing. >>> Hi! >>> >>> Thought to create some objects in openSCAD, to print later. >>> I do not have my own 3D printer (yet). >>> >>> One I talked to, wanted to get the drawings in .STL or .3MF. (I don't >>> know the difference). >>> >>> If I had my own printer, have I been able to print directly from >>> openSCAD? >>> (Without some export?) >>> >>> In the openSCAD, no errors or problems occur. >>> but >>> The drawings I tested to export from openSCAD have given one or another >>> error message. >>> One message .: >>> WARNING: Object may not be a valid 2-manifold and may need repair! >>> >>> Another message .: >>> WARNING: No top level geometry to render >>> >>> What to do? >>> >>> >>> >>> ---------- Forwarded message ---------- >>> From: "Jan Öhman via Discuss" <discuss@lists.openscad.org> >>> To: OpenSCAD General Discussion <discuss@lists.openscad.org> >>> Cc: "Jan Öhman" <jan_ohman@yahoo.com> >>> Bcc: >>> Date: Fri, 6 May 2022 10:38:46 +0000 (UTC) >>> Subject: [OpenSCAD] Export to .STL / .3MF for later 3D-printing. >>> _______________________________________________ >>> OpenSCAD mailing list >>> To unsubscribe send an email to discuss-leave@lists.openscad.org >>> >>> _______________________________________________ >>> OpenSCAD mailing list >>> To unsubscribe send an email to discuss-leave@lists.openscad.org >>> >>> >>> >>> ---------- Forwarded message ---------- >>> From: "Jan Öhman via Discuss" <discuss@lists.openscad.org> >>> To: OpenSCAD general discussion <discuss@lists.openscad.org> >>> Cc: "Jan Öhman" <jan_ohman@yahoo.com> >>> Bcc: >>> Date: Sat, 7 May 2022 11:04:31 +0000 (UTC) >>> Subject: [OpenSCAD] Re: Export to .STL / .3MF for later 3D-printing. >>> _______________________________________________ >>> OpenSCAD mailing list >>> To unsubscribe send an email to discuss-leave@lists.openscad.org >>> >> _______________________________________________ >> OpenSCAD mailing list >> To unsubscribe send an email to discuss-leave@lists.openscad.org >> > _______________________________________________ > OpenSCAD mailing list > To unsubscribe send an email to discuss-leave@lists.openscad.org >
Jan Öhman
Mon, May 9, 2022 7:45 AM

Thanks everyone!
Wrote a new program (below) where all the features are removed, then I changed a variable
From  points5 = circSect( 140, 80,   5, [0, 1], "top",   1, fn);   // böj uppe till höger
to  points5 = circSect( 140, 80,   5, [0, 0], "top",   1, fn);   // böj uppe till höger

Now another problem was occurred (like the second structure above)
but now allways
WARNING: No top level geometry to render 

What does this mean?

---==========
include <BOSL2/std.scad>fn = 50;
points1 = circSect( 140,  0,   0, [0, 0], "right",  1, fn);  // böj nere till högerpoints2 = circSect(  60,  5,   5, [0, 5], "bottom",  1, fn); // brytpunkt längst nedpoints3 = circSect(  10, 13,  10, [0, 90], "bottom", 1, fn); // böj nere till vänsterpoints4 = circSect(   5, 80,   5, [0, 90], "left",   1, fn); // böj uppe till vänsterpoints5 = circSect( 140, 80,   5, [0, 0], "top",   1, fn);   // böj uppe till högeredge = concat(points1, points2, points3, points4, points5);// echo(edge);  // [140, 85] to [140, 85]path = path3d(reverse(edge));section = theWall(4, 8, 15, 3.5); // bottom thickness, foot, height, top [mm]path_sweep( section, path, closed=false);

// Skapa bakkant lite högre och smalare i toppbottom1 = concat(points5, points1);// echo(bottom1);  // [140, 85] to [140, 0]polygon(bottom1);path1 = path3d(reverse(bottom1));section1 = theWall(4, 7, 25, 3); // bottom thickness, foot, height, top [mm]path_sweep( section1, path1, closed=false );

//

---================//======  circleSect 
---=============================// Create rounded corners 2D// https://openhome.cc/eGossip/OpenSCAD/SectorArc.html// ange .:  x, y, radien,//          [från, till] vinkel,//          var vinkeln startar, (left, bottom, right, top)//          vilken rotation (-1=medsol, 1=motsols)function circSect(x=0, y=0, radius=10, angles=[0,270], startRef="bottom", rotate=1, fn=24)  =    let(        startAngel  = (startRef == "left")   ?   0                    : (startRef == "bottom") ?  90                    : (startRef == "right")  ? 180                    : (startRef == "top")    ? 270                    : startRef,  // valfri vinkel                  // : assert(false,"invalid moutSide value");  // Error message if no case worked                  //: undef,        r = radius,        //r = radius / cos(180 / fn),        step = 360 / fn,        // points = [[x, y],        points = [            for(a = [angles[0]-startAngel : step : angles[1]-startAngel])                [-rotate * r * cos(a)+x, r * sin(a)+y]]    ) points;//========  Slut circleSect 
---======================

//

---================//======  theWall som ett "L" 
---=======================// Normal vägghöjdfunction theWall(b, f, h, t) =   let( x = (b+(t/2) - (h - ( (-h / (f-t)) *t) )) / (-h / (f-t)) )  let(      points = [[0,0], [f,0], [t,h], [0,h]] ,      top = move([t/2, h, 0], circle(d=t, $fn=20)),      sqr = square([10, b]),      diff =        difference([                  move([x, b], square([t/2, t/2])),                  move([x+(t/2), b+(t/2), 0], circle(d = t, $fn=20) ) ])  )  union([points, top, sqr, diff]);//========  Slut theWall 
---============================
Den söndag 8 maj 2022 15:51:35 CEST, Sanjeev Prabhakar sprabhakar2006@gmail.com skrev:

I tried to build the basic shape.
try the following code (you would need dependencies.scad which is available at https://github.com/sprabhakar2006/openSCAD):
include<dependencies.scad>

sec=cr(pts1([[0,3,10],[40,-3,10],[100,0,.1],[0,80,.1],[-100,0,10],[-40,-3,10]]),10);

path=cr(pts1([[-10,0],[10,0,0],[0,15,1.5],[-1.5,0]]),10);
prism=prism1(sec,path);

path1=cr(pts1([[-10,3],[6,0,2],[1,12,1.5],[1.5,0],[0,1]]),10);
prism1=prism1(sec,path1);

prism2=l_extrude(offset(sec,-10),3);

sec1=cr(pts1([[0,0,1],[10,0,1],[0,25,1.5],[-3,0,1.5],[-2,-22,2],[-5,0]]),5);
prism3=trns([140-10,80,0],q_rot(["x90"],l_extrude(sec1,80)));
render()
difference(){
swp(prism);
swp(prism1);
}
swp(prism2);
swp(prism3);

dimensions are approximate and I have not checked the exact code.above code renders successfully
On Sat, 7 May 2022 at 22:27, Michael Möller private2michael@gmail.com wrote:

Jan Öhman wrote it failed in Render/F6, but works in Preview/F5 - in so many words. I tried and got the following
First model
F6 Error: WARNING: Ignoring 2D child object for 3D operation in file , line 53 
ERROR: CGAL error in CGALUtils::applyUnion3D: CGAL ERROR: assertion violation! Expr: G.mark(v1,0)==G.mark(v2,0)&& G.mark(v1,1)==G.mark(v2,1) File: /mxe/usr/x86_64-w64-mingw32.static.posix/include/CGAL/Nef_S2/SM_overlayer.h Line: 303 

Which I think is pretty selfexplantory: Passed a 2D shape to something that expected a 3D shape - but you have to read the whole code to find it ... which I think Jan is more qualified to do :-)

2nd part

... which is one of those where zooming or rotating the model in preview takes >5 second

And I didn't bother waiting for the F6 error ... ;-)

Of course, we do not know if the above shapes I got are the ones that Jan wants - there are also sections of code commented out.

(From the comments it seems these are to be nice and alternative covers for wall outlet/switches.)

On Sat, 7 May 2022 at 18:26, Sanjeev Prabhakar sprabhakar2006@gmail.com wrote:

Quite a long code.Can you paste a picture of what you are trying to draw.RegardsSanjeev
On Sat, 7 May 2022, 16:31 Jan Öhman via Discuss, discuss@lists.openscad.org wrote:

---------- Forwarded message ----------
From: "Jan Öhman" jan_ohman@yahoo.com
To: OpenSCAD general discussion discuss@lists.openscad.org
Cc: 
Bcc: 
Date: Sat, 7 May 2022 11:04:31 +0000 (UTC)
Subject: [OpenSCAD] Re: Export to .STL / .3MF for later 3D-printing.
Thank you!
Begins to understand how it works. (It was not easy...)
but my solution was not good ...
Here are 2 files that do not work to render (F6)

= = product 1= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =  - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . -

include <BOSL2/std.scad>fn = 150;
placering="left";// placering="right"
box(0, 0, 0, placering, "#C0C0C0", fn); // (X, Y, Z, left/right, colorName)

// Monteringsplattan// mountingPlate(0, 0, 0, placering);

// LED belysning// LEDlampa(0, 0, 0, placering);

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - m o d u l e r - - - - - - - - - - - - - - - - - - 

//

---================//======  box 

---===module box(posX=0, posY=0, posZ=0, mountSide="left", colorName="#00FF00", fn=24){   side = mountSide == "left" ? 0       : mountSide == "right" ? 1       : assert(false,"invalid moutSide value");  // message if no case worked    color(colorName)  translate([posX, posY, posZ])  mirror([side, 0, 0])  difference()  {  union()  {  // Skapa konturer på bottenplattan - x, y, r, angles, [grader], början  // Rotation medurs - vänster lamphållare (bakant saknas)  points1 = circSect( 140,  0,   0, [0, 0], "right",  1, fn);  // böj nere till höger  points2 = circSect(  60,  5,   5, [0, 5], "bottom",  1, fn); // brytpunkt längst ned  points3 = circSect(  10, 13,  10, [0, 90], "bottom", 1, fn); // böj nere till vänster  points4 = circSect(   5, 80,   5, [0, 90], "left",   1, fn); // böj uppe till vänster  points5 = circSect( 140, 80,   5, [0, 1], "top",   1, fn);   // böj uppe till höger  edge = concat(points1, points2, points3, points4, points5);  path = path3d(reverse(edge));  section = wall();  path_sweep( section, path, closed=false);
    // Skapa bakkant lite högre och smalare i topp  bottom1 = concat(points5, points1);  polygon(bottom1);  path1 = path3d(reverse(bottom1));  section1 = wall1(); // lite högre bakvägg wall(b=4, f=8, h=15, t=3.5)  path_sweep( section1, path1, closed=false);
  // fyll upp bottenplattansbaksida  linear_extrude(4) // Bottomplate - fill up    polygon(concat(points1, points2, points3, points4, points5));      // skapa Utskjutande del under (tänk spegelvänt)  pt1 = circSect(  19.5, 85, 0, [0, 50], "top", 1, fn);  // Uppe till höger - moturs  pt2 = circSect(  39, 1.35,  .1, [-5, 90], "right", 1, fn);  // Nere till höger  pt3 = circSect(  10, 13.05,  10, [0, 90], "bottom", 1, fn);  // Nere till vänster  pt4 = circSect(   5, 80, 5, [0, 90], "left",   1, fn);  // Uppe till vänster  translate([0, 0, -2])    linear_extrude(2.1)      polygon(concat(pt1, pt2, pt3, pt4));
  // utgången för kabeln på baksidan (diam 10mm) - pekar lite nedåt  cableExit(65, 35, 0, 15, "cyan", $fn=100);  }     // skapa ett borrhål i bakkant  translate([132,60,15])  { rotate([0, 90, 0])    { cylinder(h=10, d=2, $fn=100);      cylinder(h=4, d=9, $fn=100);      }  }    // skapa en borrmarkering i bakkant  translate([139,25,15])  { rotate([0, 90, 0])      cylinder(h=2, d1=1, d2=2.5, $fn=100);  }     // ingravera årtalet på baksidan  translate([10, 80, -0.5])  { mirror([side, 0, 0])    { rotate([0, 180, 0])      { linear_extrude(3)          text("2022", size=12, direction="ttb", font="Comic Sans MS:style=Bold");      }    }  }    /*  // Markera skruvhål på bakkant  borr=3;  bredd=140;  hojd=8;  avstNed=20;  translate([bredd, avstNed, hojd])  { rotate([0,90,0])      cylinder(h=2, d1=0.5, d2=borr, center=true, $fn=50);  }  */    // borrhål  mountingHole(20, 36, 0, 7, 90.1, 15); // posX, posY, posZ, diam, dist, deep, $fn=50    }}//========  Slut box 
---=============================

//

---================//======  cableExit 
---==============================module cableExit(posX, posY, posZ, angle, colorName){ diamHole = 7;  diamHolder = 9.8;  hight = 12;  topRad = diamHolder/2;  topDiam = diamHolder/2-topRad/2;  bowRad = 7;  offs1 = 0.1;
  color(colorName)  translate([posX, posY, posZ])  {  rotate([180, 0, 180-angle])    { difference()       { hull()        { cylinder(h=hight, d=diamHolder, center=false);          translate([0, 0, hight])        // rundad topp            rotate_extrude(angle=360, convexity=2)              translate([topDiam, 0, 0])  // yttre diam topp                circle(d=topRad);         // radie topp        }                  inpHight  =  2;   // ett värde som styr var utgångshålet hamnar        translate([0, 0, -offs1])          cylinder(h=inpHight+offs1, d=diamHole, center=false); // Bottenhål              translate([-bowRad, 0, inpHight-offs1]) // böjen        { rotate([90, 0, 0])            rotate_extrude(angle=90, convexity=10)              translate([bowRad, 0, 0]) // ställ in radien på kabelböjen                circle(d=diamHole);        }      }    }  }}//======  slut cableExit 
---=========================

//

---================//======  mountingHole 
---===========================module mountingHole(posX=0, posY=0, posZ=0, diam=7, dist=90, deep=5, $fn=50){ // diam =  6;   // [mm]  // dist = 90;   // [mm]  // deep =  12;  // [mm]
  translate([posX, posY, posZ])  { translate([0, 0, -10])      cylinder(h=deep, d=diam);  // fästhål 1        //cableHold1(dist/2, 0, .2, "#D5D5D5");  // Kabelgenomföring    translate([dist/2, 0, 0])    {  hull()      { cylinder(h=5, d=6);  // fästhål 1        sphere(d=7.5);      }    }        translate([dist, 0, -10])      cylinder(h=deep, d=diam); // fästhål 2  }}//======  slut mountingHole 
---======================

//

---================//======  LEDlampa 
---===============================// module LEDlampa(posX=8, posY=10, posZ=0)module LEDlampa(posX=0, posY=0, posZ=0, mountSide="left"){ side = mountSide == "left" ? 0       : mountSide == "right" ? 1       : assert(false,"invalid moutSide value");  // message if no case worked    xpos = mountSide == "left" ? 121       : mountSide == "right" ? -10       : assert(false,"invalid moutSide value");  // message if no case worked /*   ypos = mountSide == "left" ? 10.5       : mountSide == "right" ? 10.5       : assert(false,"invalid moutSide value");  // message if no case worked    zpos = mountSide == "left" ? 5       : mountSide == "right" ? 5       : assert(false,"invalid moutSide value");  // message if no case worked*/// echo(xpos,ypos,zpos);  // translate([xpos, ypos, zpos])  translate([xpos, 10.5, 5])  mirror([1, 0, 0])  translate([posX, posY, posZ])  { LEDbottom();      translate([0, 0, 11])        LEDglas();  }}//======  Slut LEDlampa 
---==========================

//

---================//======  LEDglas 
---================================module LEDglas(){  // Variabler botten  length  = 111;   // längd mm  wideMid = 50.5;  // bredd i mitten mm    cornRad = 10;    // Radien i alla hörn  wideCorn = 48;   // Bredd i kanterna    diamHole = 6;    // håldiameter i mm    colorBot = "gray";  colorTop = "orange";    // Variabler top  cornHigh = 5;   //Höjd i ändarna  midHigh  = 8;  highTop = cornHigh + 1;  // höjd mm          p1tx = 10;      // the start value  p1ty = 49.25;      p2tx = 55.5;    // the middle value  p2ty = 50.5;  p3tx = 101;     // the end value  p3ty = p1ty;    p4tx = 101;     // the start value  p4ty = 1.25;      p5tx = 55.5;    // the middle value  p5ty = 0.0;  p6tx = 10;      // the end value  p6ty = p4ty;  // Ger ovalt glas  points1 = 3points_arc([p1tx,p1ty], [p2tx,p2ty], [p3tx,p3ty], fn=100);  points2 = 3points_arc([p4tx,p4ty], [p5tx,p5ty], [p6tx,p6ty], fn=100);        color("orange")  linear_extrude(height=cornHigh+.1)  difference()    { polygon(concat(points1, points2));            translate([length-10 , wideMid / 2, -.2])      circle(d=6);    translate([10 , wideMid / 2, -.2])      circle(d=6);  }     // Top  color(colorTop)  difference()  { hull()    { // hörn1      translate([cornRad, wideMid - ((wideMid-wideCorn)/2) - cornRad, 0]) // [10,39]        cylinder(h=cornHigh, d=cornRad2, center=false);      // hörn2      translate([cornRad, cornRad + ((wideMid-wideCorn)/2), 0])           // [10,12]        cylinder(h=cornHigh, d=cornRad2, center=false);      // hörn3      translate([length - cornRad, wideMid - ((wideMid-wideCorn)/2) - cornRad, 0]) // [101 ,39]        cylinder(h=cornHigh, d=cornRad2, center=false);         // hörn4      translate([length - cornRad, cornRad + ((wideMid-wideCorn)/2), 0])  //         cylinder(h=cornHigh, d=cornRad2, center=false);    }              union()    { // Monteringshål 1 & 2      translate([length-10 , wideMid / 2, -.2])        cylinder(d=diamHole, h=highTop+.5, center=false);      translate([10 , wideMid / 2, -.2])        cylinder(d=diamHole, h=highTop+.5, center=false);    }  }}//========  Slut LEDglas 
---=========================

//

---================//======  LEDbottom 
---==============================module LEDbottom(){ p1x = 10;      // the start value  p1y = 49.25;      p2x = 55.5;    // the middle value  p2y = 50.5;  p3x = 101;     // the end value  p3y = p1y;
  p4x = 101;     // the start value  p4y = 1.25;      p5x = 55.5;    // the middle value  p5y = 0.0;  p6x = 10;      // the end value  p6y = p4y;    // Variabler botten för borrhålen   length  = 111;   // längd mm  wideMid = 50.5;  // bredd i mitten mm  diamHole = 6;    // håldiameter i mm  cornHigh = 5;   //Höjd i ändarna  midHigh  = 8;  highTop = cornHigh + 1;  // höjd mm  // offs1 = 0.1;  heightHole = 15; //mm  height = 11; //mm    points1 = circSect(  10, 11.25,  10, [0, 90], "bottom", 1, fn); // Hörn nere till vänster  points2 = circSect(  10, 39.25,  10, [0, 90], "left",   1, fn); // Hörn uppe till vänster  points3 = 3points_arc([p1x,p1y], [p2x,p2y], [p3x,p3y], fn);  points4 = circSect( 101, 39.25,  10, [0, 90], "top",    1, fn); // Hörn uppe till höger   points5 = circSect( 101, 11.25,  10, [0, 90], "right",  1, fn); // Hörn nere till höger   points6 = 3points_arc([p4x,p4y], [p5x,p5y], [p6x,p6y], fn);
  // The base plate for the LED lamp
    difference()  { color("gray", 0.5)     linear_extrude(height=height)      polygon(concat(points1, points2, points3, points4, points5, points6));

   // union()    { // Monteringshål 1 & 2      translate([length-10 , wideMid / 2, -.2])        cylinder(d=diamHole, h=heightHole, center=false);      translate([10 , wideMid / 2, -.2])        cylinder(d=diamHole, h=heightHole, center=false);    }  }}//========  Slut LEDbottom 
---=======================

//

---================//======  circleSect 
---=============================// Create rounded corners 2D// https://openhome.cc/eGossip/OpenSCAD/SectorArc.html// ange .:  x, y, radien,//          [från, till] vinkel,//          var vinkeln startar, (left, bottom, right, top)//          vilken rotation (-1=medsol, 1=motsols)function circSect(x=0, y=0, radius=10, angles=[0,270], startRef="bottom", rotate=1, fn=24)  =    let(        startAngel  = (startRef == "left")   ?   0                    : (startRef == "bottom") ?  90                    : (startRef == "right")  ? 180                    : (startRef == "top")    ? 270                    : startRef,  // valfri vinkel                  // : assert(false,"invalid moutSide value");  // Error message if no case worked                  //: undef,        r = radius,        //r = radius / cos(180 / fn),        step = 360 / fn,        // points = [[x, y],        points = [            for(a = [angles[0]-startAngel : step : angles[1]-startAngel])                [-rotate * r * cos(a)+x, r * sin(a)+y]]    ) points;//========  Slut circleSect 
---======================

//

---================//======  3points_arc 
---============================// Create an arc with three points 2Dfunction 3points_arc(p0, p1, p2, fn=10) =  // an alternative expression for D  // D  = 2 * ( (p1-p0).x * (p2-p0).y - (p1-p0).y * (p2-p0).x )  let( D  = 2 * cross(p1-p0, (p2-p0)) )  assert( abs(D)>1e-9, "The 3 points should not be collinear." )  let(      Ux     = ( (p2-p0).y*(p1-p0)(p1-p0) - (p1-p0).y(p2-p0)(p2-p0) )/D,      Uy     = ( (p1-p0).x(p2-p0)(p2-p0) - (p2-p0).x(p1-p0)(p1-p0) )/D,      radius = norm([Ux,Uy]),      center = [Ux,Uy] + p0,      ang0   = atan2( (p0-center).y, (p0-center).x ),      ang2   = atan2( (p2-center).y, (p2-center).x ),      // the points are in a cw winding iff D<0      // the angular difference between vectors p2-center and p0-center      // measured from p0-center; dang is positive iff D is negative      dang   = D<0  ? ang2<ang0 ? ang2-ang0 : ang2-ang0-360                    : ang2>ang0 ? ang2-ang0 : ang2-ang0+360  )  [ for(i=[0:fn-1])      let( ang = ang0 + idang/(fn-1) )      center + radius*[cos(ang),sin(ang)] ];//========  Slut 3points_arc 
---=====================

//

---================//======  Wall som ett "L" 
---=======================// Normal vägghöjdfunction wall() =   let(        b =  4,     // botten - tjocklek        f =  8,     // Foten        h = 15,     // Höjd        t =  3.5,   // Top        x = (b+(t/2) - (h - ( (-h / (f-t)) *t) )) / (-h / (f-t))    )    let(        points = [[0,0], [f,0], [t,h], [0,h]] ,        top = move([t/2, h, 0], circle(d=t, $fn=20)),        sqr = square([10, b]),        diff =            difference([                  move([x, b], square([t/2, t/2])),                  move([x+(t/2), b+(t/2), 0], circle(d = t, $fn=20) ) ])        )    union([points, top, sqr, diff]);//========  Slut Wall 
---============================

//

---================//======  Wall1 som ett "L" 
---======================// En högre väggfunction wall1() =  let(    b =  4,     // botten - tjocklek    f =  7,     // Foten    h = 25,     // Höjd    t =  3,   // Top    x = (b+(t/2) - (h - ((-h / (f-t)) *t))) / (-h / (f-t))  )  let(    points = [[0,0], [f,0], [t,h], [0,h]] ,    top = move([t/2, h, 0], circle(d=t, $fn=20)),    sqr = square([10, b]),    diff =      difference([        move([x, b], square([t/2, t/2])),        move([x+(t/2), b+(t/2), 0], circle(d = t, $fn=20) ) ])    )    union([points, top, sqr, diff]);//========  Slut Wall1 
---===========================

//

---================//======  Plåt på släp 
---===========================module mountingPlate(posX=0, posY=0, posZ=0, mountSide="left", colorName="#C0C0C0", $fn=50){ // Hörnpositionerna  posX1 = 120;  posY1 = 0;  posX2 = posX1;  posY2 = -200;  posX3 = 120 - 75;  posY3 = -200;  posX4 = 0;  posY4 = 0;  thick=2;  // tjocklek    side = mountSide == "left" ? 0       : mountSide == "right" ? 1       : assert(false,"invalid moutSide value");  // message if no case worked    xpos = mountSide == "left" ? 20       : mountSide == "right" ? -20       : assert(false,"invalid moutSide value");  // message if no case worked/*    ypos = mountSide == "left" ? 85       : mountSide == "right" ? 85       : assert(false,"invalid moutSide value");  // message if no case worked    zpos = mountSide == "left" ? -thick       : mountSide == "right" ? -thick       : assert(false,"invalid moutSide value");  // message if no case worked*/    color(colorName)  {  translate([posX, posY, posZ])     translate([xpos, 85, -thick])    { mirror([side, 0, 0])      { linear_extrude(thick)        hull()        { translate([posX1, posY1, 0])            square(0.1, center = true);          translate([posX2, posY2, 0])            square(0.1, center = true);          translate([posX3, posY3, 0])            square(0.1, center = true);          translate([posX4, posY4, 0])            square(0.1, center = true);        }      }    }  }}= = END product 1= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . -

= = product 2 = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . - . _ . -
 
$fn=100;//$fn=15;
//switch();//cableHolder4(); //Switchboxen

// cableHolder3(0, 0, 0, 33.5, 23.5, 1.5, 2);// showCables();

module cableHolder4(fn=24);{ // idé från  // - https://www.thingiverse.com/thing:6400/files  // - https://ihrchive.wordpress.com/2011/02/14/openscad-tip-round-1-of-3-basic-rounding/    // mått på Switch  heightHold = 10.5;  widthHold = 33.5;  depthHold = 23.5;  spaceHold = 10.0; // utrymmet bakom switch  holdRadie = 2;  // radie i hörnen  thick = 2;  offset1=0.5;  // öka toleransen    // innermått  holeW = widthHold + offset1;  holeH = heightHold + offset1;  holeD = depthHold + spaceHold+offset1;    // yttermått  pad = 0.1;                   // Padding to maintain manifold  box_l = holeW + thick*2;   // Bredden på switchen  box_w = holeD + thick;             // Djupet på switchen  box_h = holeH + thick;  // Height  round_r = holdRadie;         // Radius of round  smooth = 45;                 // Number of facets of rounding cylinder

  difference()  { union() // Detta utförs i två steg.    { difference()  // utför fasningar och kabelmarkeringar      { mainBox(box_l, box_w, box_h, spaceHold+thick, round_r, thick, smooth, pad);
        // fasning vänster (underkant)        translate([box_l/2-0.85, spaceHold-4.3, thick-offset1])  // sidled, fram/bak , upp/ned          rotate([0,180,45])            cylinder(h=thick, d1=holeW1.414-thick-thick, d2=holeW1.414, $fn=4);            // fasning höger (underkant)        translate([box_l/2-3.65, spaceHold-4.3, thick-offset1]) // sidled, fram/bak , upp/ned          rotate([0,180,45])            cylinder(h=thick, d1=holeW1.414-thick-thick, d2=holeW1.414, $fn=4);              // kabelgenomföringar        rotate([90, 180, 90]) // Markering ena sidan (vänster under)          ovalCableHole(spaceHold/2-offset1, -1.75, -1.2);            rotate([90, 180, 180]) // Markering bakkant (vänster under)          ovalCableHole(spaceHold/2-1.55, -1.75, -spaceHold-0.85);            rotate([90, 180, 180]) // Markering bakkant (höger under)          ovalCableHole(widthHold-spaceHold/2-offset1, -1.75, -spaceHold-0.85);              rotate([90, -180, 90])  // Markering ena sidan (höger under)          ovalCableHole(3.75, -1.75, widthHold-0.1);      }    } // Slut union - kropp        translate([-offset1/2, -spaceHold+pad, -pad]) // hålet där switchen ska placeras      cube([holeW, holeD+pad, holeH+pad], center=false);
      translate([4, 12, 0])        cylinder(h=15,d=3.2);      translate([4, 12, 17.7])        sphere(r=6);          translate([29.6, 12, 0])        cylinder(h=15,d=3.2);      translate([29.6, 12, 17.7])        sphere(r=6);            /*  // Hål genom lock bak - om så önskas      translate([box_l/2-thick, -6, offset1/2])        cylinder(h=box_h+thick4+offset1, d=3.2, $fn=100);  // hål genom lock bak            translate([box_l/2-thick, -6, 17.7])        sphere(r=6);    // kona hålet bak      /  } // Slut difference() - box
    difference()    { union()      { translate([29.6, 12, heightHold-offset1
2])          cylinder(h=2,d=5.2);        // Stödhylsa för Switchskruv1        translate([4, 12, heightHold-offset1
2])          cylinder(h=2,d=5.2);        // Stödhylsa för Switchskruv2
        translate([holeW/2, -spaceHold+thick+1, holeH/2])          rotate([180,0,0])             backHole();      } // union - slut             translate([4, 12, 0])     //  Hålen i stödhylsorna        cylinder(h=15,d=3.2);            translate([29.6, 12, 0])  //  Hålen i stödhylsorna        cylinder(h=15,d=3.2);       translate([box_l/2-thick, -6, -offset1])  // hål i stödhylsa bak        cylinder(h=box_h+offset1, d=3.2, $fn=100);            // Sänk stödhylsan        translate([ widthHold/2-7, -spaceHold-offset1, -thick+offset1])  // hål i stödhylsa bak          cube([15, 8, 3]);                  // kabelmarkering      // translate([0, 0, 0])  // hål i stödhylsa bak
            }

/*      translate([4, 12, 0])        #cylinder(h=15,d=3.2);      //translate([4, 13.5, 17.3])        //#sphere(r=6);          translate([29.6, 12, 0])        #cylinder(h=15,d=3.2);      //translate([29.6, 13.5, 17.3]