//ochafik.com/openscad2
//pen2 150
union(){
cylinder(h=15, r1=50, r2=50, center=false);
translate([0, 0, 15])
cylinder(h=30, r1=25, r2=25, center=false);
translate([0, 0, 45])
cylinder(h=105, r1=10, r2=1, center=false);
}//ochafik.com/openscad2
//pen1 90
union(){
cylinder(h=15, r1=20, r2=20, center=false);
translate([0, 0, 15])
cylinder(h=75, r1=10, r2=1, center=false);
}//ochafik.com/openscad2
//circle
union(){
cylinder(h=15, r1=20, r2=10, center=false);
translate([0, 0, 15])
cylinder(h=35, r1=2, r2=2, center=false, $fn = 20);
translate([0, 0, 60])
rotate([0, 90, 0])
rotate_extrude(convexity = 10)
translate([10, 0, 0])
circle(r = 2);
}//ochafik.com/openscad2
//cross
//200x100x300 distants 600 diagonaalid
union(){
translate([0, 0, 50]){
cylinder(h=4, r1=0.5, r2=0.5, center=true);
rotate([90, 0, 0])
cylinder(h=4, r1=0.5, r2=0.5, center=true);
}
cylinder(h=10, r1=20, r2=10, center=false);
translate([0, 0, 10])
cylinder(h=30, r1=2, r2=2, center=false, $fn = 20);
translate([0, 0, 50])
rotate([0, 90, 0])
rotate_extrude(convexity = 10)
translate([10, 0, 0])
circle(r = 2);
}//ochafik.com/openscad2
//cell
module cell(
r, //cylinder radius
dx, //cell length
dy, //cell width
dz //cell height
){
translate([dx/2, -dy/2, 0]){
translate([0, 0, dz])
translate([0, 0, dz])
color("green")floor(r, dx, dy, dz);
color("blue")floor(r, dx, dy, dz);
translate([-dx/2, 0, 0])
color("cyan")cylinder(h=dz, r1=r, r2=r,
center=false, $fn = 20);
translate([dx/2, 0, 0])
color("magenta")cylinder(h=dz, r1=r, r2=r,
center=false, $fn = 20);
translate([dx/2, dy, 0])
color("fuchsia")cylinder(h=dz, r1=r, r2=r,
center=false, $fn = 20);
translate([-dx/2, dy, 0])
color("royalblue")cylinder(h=dz, r1=r, r2=r,
center=false, $fn = 20);
}
}
//ochafik.com/openscad2
//array of cells
cross();
rotate([0, 0,-15])
rotate([0, 0,-15])
rotate([0, 0,-15])
translate([600, 0, 0])cell(1, 200, 150, 50);
rotate([0, 0,-15])
translate([600, 0, 0])cell(1, 200, 150, 50);
rotate([0, 0, 15])
translate([600, 0, 0])cell(1, 200, 150, 50);
//rotate([90, 0, 0])rotate([0, 90, 0])cross();
rotate([0, 0, 15])
rotate([0, 0, 15])
rotate([0, 0, 15])
translate([600, 0, 0])
cell(1, 200, 150, 50);//ochafik.com/openscad2
//axes
color("green"){
rotate([00, 90, 00])
cylinder(h=600, r1=2, r2=2, center=false);
rotate([90, 00, 00])
cylinder(h=600, r1=2, r2=2, center=true);
}/
//https://stackoverflow.com/questions/50869080/openscad-how-to-draw-a-cylinder-from-vector-to-vector
module hoop(R){
color("#3333AA")
rotate_extrude(angle = 90, convexity = 40)
translate([R, 0, 0])
circle(r = 2);
}
module beam(
x1, y1, z1, x2, y2, z2, r1, r2
){
dx = x2 - x1;
dy = y2 - y1;
dz = z2 - z1;
l = sqrt(dx * dx + dy * dy + dz * dz);
lPrXY = sqrt(dx * dx + dy * dy);
ay = asin(dy/lPrXY);
az = asin(dz/l);
rotate([0, 0, ay])
rotate([0, -az, 0])
rotate([0, 90, 0])
translate([0, 0, l/2])
color("cyan")cylinder(l, r1, r2, center = true, $fn=50);
rotate([0, 0, ay])
rotate([0, 90, 0])
translate([0, 0, lPrXY/2])
color("tan")cylinder(lPrXY, r1, r2, center = true, $fn=50);
hoop(lPrXY);
translate([0, 0, dz])
hoop(lPrXY);
translate([lPrXY, 0, 0])
translate([0, 0, dz/2])
color("#00AA00")cylinder(dz, r1, r2, center = true, $fn=50);
translate([x2, y2, z2])
sphere(8, $fn=50);
translate([x1, y1, z1])
sphere(6, $fn=50);
color("cyan")translate([x2, y2, 0])
sphere(6, $fn=50);
}
{
beam(0, 0, 0, 200, 300, 250, 4, 4);
}
/
module c_1(ay, az, l, r1, r2, c){
rotate([0, 0, az])
rotate([0, ay, 0])
rotate([0, 90, 0])
translate([0, 0, l / 2])
color(c)cylinder(l, r1, r2, center = true, $fn = 50);
}
module beam(x1, y1, z1, x2, y2, z2, r1, r2, c){
translate([x1, y1, z1]) {
dx = x2 - x1;
dy = y2 - y1;
dz = z2 - z1;
if ((abs(dx) < 1e-6)&&(abs(dy) < 1e-6)) { // || Z
if (dz > 0) {
translate([0, 0, dz / 2])
color(c)cylinder(dz, r1, r2, center = true, $fn = 50);
}
else if (dz < 0){
translate([0, 0, dz / 2])
color(c)cylinder(-dz, r2, r1, center = true, $fn = 50);
}
}
else if ((abs(dy) < 1e-6)&&(abs(dz) < 1e-6)){ // || X
if (dx > 0){
rotate([0, 90, 0])
translate([0, 0, dx / 2])
color(c)cylinder(dx, r1, r2, center = true, $fn = 50);
}
else if (dx < 0){
rotate([0, 90, 0])
translate([0, 0, dx / 2])
color(c)cylinder(-dx, r2, r1, center = true, $fn = 50);
}
}
else if ((abs(dx) < 1e-6)&&(abs(dz) < 1e-6)){ // || Y
if (dy > 0){
rotate([-90, 0, 0])
translate([0, 0, dy / 2])
color(c)cylinder(dy, r1, r2, center = true, $fn = 50);
}
else if (dy < 0){
rotate([-90, 0, 0])
translate([0, 0, dy / 2])
color(c)cylinder(-dy, r2, r1, center = true, $fn = 50);
}
}
else {
l = sqrt(pow(dx, 2) + pow(dy, 2) + pow(dz, 2) );
lPrXY = sqrt(pow(dx, 2) + pow(dy, 2) );
//minus = look from end of the axis; clockwise
az = acos(dx / lPrXY); //if lPrXY == 0, then vertical
ay = acos(lPrXY / l);
if (dx > 0){
if (dy >= 0) {
if (dz > 0) { // dx>0 dy>0 dz>0 //OK 1 1 1
c_1(-ay, az, l, r1, r2, c);
}
else { // dx>0 dy>0 dz<0 //OK 1 1-1
c_1( ay, az, l, r1, r2, c);
}
}
else if (dy < 0) {
if (dz > 0) { // dx>0 dy<0 dz>0 //OK 1-1 1
c_1(-ay, -az, l, r1, r2, c);
}
else { // dx>0 dy<0 dz<0 //OK 1-1-1
c_1( ay, -az, l, r1, r2, c);
}
}
}
else {
if (dy >= 0) {
if (dz > 0) { // dx<0 dy>0 dz>0 //OK-1 1 1
c_1(-ay, az, l, r1, r2, c);
}
else { // dx<0 dy>0 dz<0 //OK-1 1-1
c_1( ay, az, l, r1, r2, c);
}
}
else if (dy < 0) {
if (dz > 0) { // dx<0 dy<0 dz>0 //OK-1-1 1
c_1(-ay, -az, l, r1, r2, c);
}
else { // dx<0 dy<0 dz<0 //OK-1-1-1
c_1( ay, -az, l, r1, r2, c);
}
}
}
}
}
translate([x2, y2, z2])
sphere(6, $fn=50);
translate([x1, y1, z1])
sphere(6, $fn=50);
}
{
/*
beam( 0, 0, 0, 200, 200, 200, 1, 4, "#EABB94");//dx>0 dy>0 dz>0 // 1 1 1
beam( 0, 0, 0, -200, 200, 200, 1, 4, "#EABB94");//dx<0 dy>0 dz>0 //-1 1 1
beam( 0, 0, 0, 200, 200, -200, 1, 4, "#22EE22");//dx>0 dy>0 dz<0 // 1 1-1
beam( 0, 0, 0, -200, 200, -200, 1, 4, "#22EE22");//dx<0 dy>0 dz<0 //-1 1-1
beam( 0, 0, 0, 200, -200, 200, 1, 4, "#EA0094");//dx>0 dy<0 dz>0 // 1-1 1
beam( 0, 0, 0, 200, -150, 200, 1, 4, "#EABB00");//dx>0 dy<0 dz>0 // 1-1 1
beam( 0, 0, 0, -200, -200, 200, 1, 4, "#00BB94");//dx<0 dy<0 dz>0 //-1-1 1
beam( 0, 0, 0, -200, -150, 200, 1, 4, "#EABB94");//dx<0 dy<0 dz>0 //-1-1 1
beam( 0, 0, 0, 200, -200, -200, 1, 4, "#EABB94");//dx>0 dy<0 dz<0 // 1-1-1
beam( 0, 0, 0, 200, -150, -200, 1, 4, "#EABB94");//dx>0 dy<0 dz<0 // 1-1-1
beam( 0, 0, 0, -200, -200, -200, 1, 4, "#EABB94");//dx<0 dy<0 dz<0 //-1-1-1
beam( 0, 0, 0, -200, -150, -200, 1, 4, "#EABB94");//dx<0 dy<0 dz<0 //-1-1-1
*/
beam( 150, 200, 175, 150, 200, -175, 1, 4, "#EABB94");
beam( 150, 200, -175, 150, -200, -175, 1, 4, "#EABB94");
beam( 150, -200, -175, -150, -200, -175, 1, 4, "#EABB94");
beam(-150, -200, -175, -150, 200, -175, 1, 4, "#EABB94");
beam(-150, 200, -175, 150, 200, -175, 1, 4, "#EABB94");
beam( 150, 200, 175, 150, -200, 175, 1, 4, "#EABB94");
beam( 150, -200, 175, -150, -200, 175, 1, 4, "#EABB94");
beam(-150, -200, 175, -150, 200, 175, 1, 4, "#EABB94");
beam(-150, 200, 175, 150, 200, 175, 1, 4, "#EABB94");
beam(-150, -200, -175, 150, 200, 175, 1, 4, "#EABB94");
beam(-150, -200, -175, -150, -200, 175, 1, 4, "#EABB94");
beam(-150, -200, -175, -150, 200, 175, 1, 4, "#EABB94");
beam(-150, -200, -175, 150, -200, 175, 1, 4, "#EABB94");
beam( 150, 200, 175, 150, -200, -175, 1, 4, "#EABB94");
beam( 150, 200, 175, -150, -200, -175, 1, 4, "#22DD22");
beam( 150, 200, 175, -150, 200, -175, 1, 4, "#22DD22");
beam( 150, 200, 175, -150, -200, 175, 1, 4, "#22DD22");
beam( 150, -200, -175, 150, -200, 175, 1, 4, "#22DD22");
beam( 150, -200, -175, -150, -200, 175, 1, 4, "#22DD22");
beam( 150, -200, 175, 150, 200, -175, 1, 4, "#22DD22");
beam( 150, -200, -175, -150, 200, 175, 1, 4, "#22DD22");
beam(-150, 200, 175, 150, -200, -175, 1, 4, "#2222DD");
}
//https://stackoverflow.com/questions/50869080/openscad-how-to-draw-a-cylinder-from-vector-to-vector
// Transpose of matrix A (swap rows and columns)
function transpose(A) = [for (j = [0:len(A[0])-1]) [for(i = [0:len(A)-1]) A[i][j]]];
// Cylinder of radius r from P to Q
module cyl_between(P, Q, r){
v = Q - P; // vector from P to Q
L = norm(v); // height of the cylnder = dist(P, Q)
c = v / L; // unit vector: direction from P to Q
is_c_vertical = ( 1 - abs(c * [0, 0, 1]) < 1e-6); //is c parallel to z axis?
u = is_c_vertical ? [1, 0, 0] : cross([0, 0, 1], c); // normal to c and Z axis
a = u / norm(u); // unit vector normal to c and the Z axis
b = cross(c, a); // unit vector normal to a and b
// [a, b, c] is an orthonormal basis, i.e. the rotation matrix; P is the translation
MT = [a, b, c, P]; // the transformation matrix
M = transpose(MT); // OpenSCAD wants vectors in columns, so we need to transpose
multmatrix(M)
cylinder(h=L, r=r, $fn=30);
}
cyl_between([100,100,100], [100,200,100], 4);// tool; length = 50
union(){
cylinder(h=10, r1=20, r2=20, center=false);
translate([0, 0, 10])
cylinder(h=40, r1=0.5, r2=0.25, center=false);
translate([0, 0, 51]){
translate([0, 0, 5])
linear_extrude(0.25)
text("Z", size=2, font="Liberation Sans", halign="center", valign="center");
cylinder(h=4, r1=0.25, r2=0.5, center=false);}
translate([0, 0, 50])
translate([1, 0, 0])
rotate([0, 90, 0]){
translate([0, 0, 5])
linear_extrude(0.25)
text("X", size=2, font="Liberation Sans", halign="center", valign="center");
cylinder(h=3, r1=0.25, r2=0.5, center=false);}
translate([0, 0, 50])
rotate([0, 0, 90])
translate([1, 0, 0])
rotate([0, 90, 0]){
translate([0, 0, 5])
linear_extrude(0.25)
text("Y", size=2, font="Liberation Sans", halign="center", valign="center");
cylinder(h=3, r1=0.25, r2=0.5, center=false);}
}