Pliiats

//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);}
    }

Leave a Comment

Sinu e-postiaadressi ei avaldata. Nõutavad väljad on tähistatud *-ga

Scroll to Top