|
|
@@ -2,373 +2,432 @@ include <../config/vesa.scad>
|
|
|
include <../config/wall.scad>
|
|
|
include <../config/hook.scad>
|
|
|
|
|
|
-function vesa_hinge_full_height() =
|
|
|
- vesa_hinge_height
|
|
|
- + vesa_hinge_thickness * 2;
|
|
|
+module vesa_rsquare(width, height) {
|
|
|
+ move_x = width / 2 - vesa_rounding;
|
|
|
+ move_y = height / 2 - vesa_rounding;
|
|
|
|
|
|
-module vesa_hinge_object() {
|
|
|
- module bottom_base_object() {
|
|
|
- move_x = vesa_hinge_width / 2;
|
|
|
- move_y = vesa_hinge_full_height() / 2;
|
|
|
-
|
|
|
- linear_extrude(height = vesa_hinge_thickness) {
|
|
|
- square([move_x * 2, move_y * 2], center = true);
|
|
|
+ hull() {
|
|
|
+ translate([move_x, move_y]) {
|
|
|
+ circle(r = vesa_rounding);
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
- module hanging_object() {
|
|
|
- rotate([90, 0, 0]) {
|
|
|
- linear_extrude(height = vesa_hinge_thickness, center = true) {
|
|
|
- radius = vesa_hinge_depth / 2;
|
|
|
-
|
|
|
- difference() {
|
|
|
- hull() {
|
|
|
- translate([0, radius]) {
|
|
|
- circle(r = radius);
|
|
|
- }
|
|
|
|
|
|
- translate([0, radius / 2]) {
|
|
|
- square([radius * 2, radius], center = true);
|
|
|
- }
|
|
|
- }
|
|
|
+ translate([-move_x, move_y]) {
|
|
|
+ circle(r = vesa_rounding);
|
|
|
+ }
|
|
|
|
|
|
- translate([0, radius]) {
|
|
|
- circle(r = vesa_hinge_screw / 2);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ translate([move_x, -move_y]) {
|
|
|
+ circle(r = vesa_rounding);
|
|
|
+ }
|
|
|
+
|
|
|
+ translate([-move_x, -move_y]) {
|
|
|
+ circle(r = vesa_rounding);
|
|
|
}
|
|
|
}
|
|
|
+}
|
|
|
|
|
|
- move_y = vesa_hinge_height / 2 + vesa_hinge_thickness / 2;
|
|
|
- move_z = vesa_hinge_thickness;
|
|
|
+module vesa_hinge(size, thickness, hole) {
|
|
|
+ linear_extrude(height = thickness, center = true) {
|
|
|
+ difference() {
|
|
|
+ union() {
|
|
|
+ circle(r = size / 2);
|
|
|
+ translate([0, size / 4]) {
|
|
|
+ square([size, size / 2], center = true);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- translate([0, move_y, move_z]) {
|
|
|
- hanging_object();
|
|
|
+ circle(r = hole / 2);
|
|
|
+ }
|
|
|
}
|
|
|
+}
|
|
|
|
|
|
- translate([0, -move_y, move_z]) {
|
|
|
- hanging_object();
|
|
|
- }
|
|
|
+module vesa_monitor_hinge() {
|
|
|
+ vesa_hinge(vesa_frame_thickness, vesa_thickness, vesa_base_screw);
|
|
|
+}
|
|
|
|
|
|
- bottom_base_object();
|
|
|
+module vesa_main_hinge() {
|
|
|
+ vesa_hinge(vesa_frame_thickness * 2, vesa_thickness, vesa_base_screw);
|
|
|
}
|
|
|
|
|
|
-module vesa_thread(rotated = true) {
|
|
|
+module vesa_monitor() {
|
|
|
+ outside_width = vesa_frame_thickness + vesa_width;
|
|
|
+ outside_height = vesa_frame_thickness + vesa_height;
|
|
|
+ inside_width = vesa_width - vesa_frame_thickness;
|
|
|
+ inside_height = vesa_height - vesa_frame_thickness;
|
|
|
+
|
|
|
module base_object() {
|
|
|
- cylinder(r = vesa_thread_radius / 2, h = vesa_thread_height);
|
|
|
- cylinder(r = vesa_thread_top_radius / 2, h = vesa_thread_top_height);
|
|
|
- }
|
|
|
+ linear_extrude(height = vesa_thickness) {
|
|
|
+ difference() {
|
|
|
+ vesa_rsquare(outside_width, outside_height);
|
|
|
+ vesa_rsquare(inside_width, inside_height);
|
|
|
|
|
|
- if (rotated) {
|
|
|
- rotate([0, 180, 0]) {
|
|
|
- base_object();
|
|
|
- }
|
|
|
- } else {
|
|
|
- base_object();
|
|
|
- }
|
|
|
-}
|
|
|
+ translate([vesa_width / 2, vesa_height / 2]) {
|
|
|
+ circle(r = vesa_hole / 2);
|
|
|
+ }
|
|
|
|
|
|
-module vesa_connector_object(center = false) {
|
|
|
- module base_shape() {
|
|
|
- hull() {
|
|
|
- move_x = vesa_connector_length / 2 - vesa_hinge_depth / 2;
|
|
|
-
|
|
|
- translate([move_x, 0]) {
|
|
|
- circle(r = vesa_hinge_depth / 2);
|
|
|
+ translate([-vesa_width / 2, vesa_height / 2]) {
|
|
|
+ circle(r = vesa_hole / 2);
|
|
|
+ }
|
|
|
+
|
|
|
+ translate([vesa_width / 2, -vesa_height / 2]) {
|
|
|
+ circle(r = vesa_hole / 2);
|
|
|
+ }
|
|
|
+
|
|
|
+ translate([-vesa_width / 2, -vesa_height / 2]) {
|
|
|
+ circle(r = vesa_hole / 2);
|
|
|
+ }
|
|
|
}
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- translate([-move_x, 0]) {
|
|
|
- circle(r = vesa_hinge_depth / 2);
|
|
|
+ module hinge() {
|
|
|
+ translate([0, vesa_height / 2, -vesa_frame_thickness / 2]){
|
|
|
+ rotate([90, 0, 90]) {
|
|
|
+ vesa_monitor_hinge();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- module mounting_screws() {
|
|
|
- radius = vesa_hinge_screw / 2;
|
|
|
- move_x = vesa_connector_length / 2 - vesa_hinge_depth / 2 + radius;
|
|
|
-
|
|
|
- translate([move_x, 0]) {
|
|
|
- circle(r = radius);
|
|
|
+ module double_hinge() {
|
|
|
+ translate([-vesa_thickness, 0, 0]) {
|
|
|
+ hinge();
|
|
|
}
|
|
|
|
|
|
- translate([-move_x, 0]) {
|
|
|
- circle(r = radius);
|
|
|
+ translate([vesa_thickness, 0, 0]) {
|
|
|
+ hinge();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- module base_object() {
|
|
|
- height = vesa_hinge_height - vesa_connector_margin;
|
|
|
-
|
|
|
- linear_extrude(height = height, center = center) {
|
|
|
- difference() {
|
|
|
- base_shape();
|
|
|
- mounting_screws();
|
|
|
- }
|
|
|
- }
|
|
|
+ translate([vesa_width / 3, 0, 0]) {
|
|
|
+ double_hinge();
|
|
|
}
|
|
|
|
|
|
- module threads() {
|
|
|
- translate([0, 0, vesa_hinge_height - vesa_connector_margin]) {
|
|
|
- vesa_thread();
|
|
|
- }
|
|
|
+ translate([-vesa_width / 3, 0, 0]) {
|
|
|
+ double_hinge();
|
|
|
+ }
|
|
|
|
|
|
- translate([0, 0, 0]) {
|
|
|
- vesa_thread(false);
|
|
|
+ module corner_regulation() {
|
|
|
+ move = [
|
|
|
+ 0,
|
|
|
+ vesa_rounding * 2 - vesa_height / 3,
|
|
|
+ vesa_thickness / 2
|
|
|
+ ];
|
|
|
+
|
|
|
+ translate(move) {
|
|
|
+ rotate([0, 90, 0]) {
|
|
|
+ cylinder(
|
|
|
+ r = vesa_base_screw / 2,
|
|
|
+ h = vesa_width + vesa_frame_thickness,
|
|
|
+ center = true
|
|
|
+ );
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
render() {
|
|
|
difference() {
|
|
|
- radius = vesa_hinge_screw / 2;
|
|
|
- move_x = vesa_connector_length / 2 - vesa_hinge_depth / 2 + radius;
|
|
|
- correct = vesa_hinge_height - vesa_connector_margin;
|
|
|
- center_correct = center ? -correct / 2 : 0;
|
|
|
-
|
|
|
base_object();
|
|
|
-
|
|
|
- translate([move_x, 0, center_correct]) {
|
|
|
- threads();
|
|
|
- }
|
|
|
+ corner_regulation();
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
- translate([-move_x, 0, center_correct]) {
|
|
|
- threads();
|
|
|
- }
|
|
|
+module vesa_thread() {
|
|
|
+ radius = vesa_thread_diameter / 2;
|
|
|
+ top_radius = vesa_thread_top_diameter / 2;
|
|
|
|
|
|
- first_cable_x = move_x
|
|
|
- - vesa_cable_hole / 1.5
|
|
|
- - vesa_thread_top_radius;
|
|
|
+ cylinder(r = radius, h = vesa_thread_thickness);
|
|
|
+ cylinder(r = top_radius, h = vesa_thread_top_thickness);
|
|
|
+}
|
|
|
|
|
|
- cable_z = vesa_cable_hole / 1.5;
|
|
|
+module vesa_factor() {
|
|
|
+ module circle_corner(position = [0, 0]) {
|
|
|
+ translate(position) {
|
|
|
+ circle(r = vesa_rounding);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- translate([first_cable_x , 0, cable_z]) {
|
|
|
- rotate([90, 0, 0]) {
|
|
|
- cylinder(
|
|
|
- r = vesa_cable_hole / 2,
|
|
|
- h = vesa_hinge_height,
|
|
|
- center = true
|
|
|
- );
|
|
|
- }
|
|
|
- }
|
|
|
+ module square_corner(position = [0, 0]) {
|
|
|
+ translate(position) {
|
|
|
+ square(vesa_rounding * 2, center = true);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- translate([0 , 0, cable_z]) {
|
|
|
- rotate([90, 0, 0]) {
|
|
|
- cylinder(
|
|
|
- r = vesa_cable_hole / 2,
|
|
|
- h = vesa_hinge_height,
|
|
|
- center = true
|
|
|
- );
|
|
|
- }
|
|
|
- }
|
|
|
+ module difference_circle_corner(position = [0, 0], angle = 0) {
|
|
|
+ translate(position) {
|
|
|
+ rotate(angle * 90) {
|
|
|
+ render() {
|
|
|
+ difference() {
|
|
|
+ square_corner();
|
|
|
+ circle_corner();
|
|
|
|
|
|
- translate([-first_cable_x , 0, cable_z]) {
|
|
|
- rotate([90, 0, 0]) {
|
|
|
- cylinder(
|
|
|
- r = vesa_cable_hole / 2,
|
|
|
- h = vesa_hinge_height,
|
|
|
- center = true
|
|
|
- );
|
|
|
+ translate([0, -vesa_rounding]) {
|
|
|
+ square([vesa_rounding, vesa_rounding]);
|
|
|
+ }
|
|
|
+
|
|
|
+ translate([-vesa_rounding, 0]) {
|
|
|
+ square([vesa_rounding * 2, vesa_rounding]);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-}
|
|
|
-
|
|
|
-module vesa_wall_hinge_object() {
|
|
|
- module wall_base_shape() {
|
|
|
- move_x = vesa_wall_width / 2 - vesa_rounding;
|
|
|
- move_y = vesa_wall_height / 2 - vesa_rounding;
|
|
|
- rounding = vesa_rounding;
|
|
|
|
|
|
+ top_x = vesa_width / 3 - vesa_thickness / 3;
|
|
|
+ top_left = [top_x, vesa_height / 2 - vesa_frame_thickness];
|
|
|
+ top_right = [-top_left.x, top_left.y];
|
|
|
+ round_top_left = [top_left.x, top_left.y - vesa_frame_thickness];
|
|
|
+ round_top_right = [top_right.x, top_right.y - vesa_frame_thickness];
|
|
|
+
|
|
|
+ module top_shape() {
|
|
|
hull() {
|
|
|
- translate([move_x, move_y]) {
|
|
|
- circle(r = rounding);
|
|
|
- }
|
|
|
+ square_corner(top_left);
|
|
|
+ square_corner(top_right);
|
|
|
+ circle_corner(round_top_left);
|
|
|
+ circle_corner(round_top_right);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- translate([-move_x, move_y]) {
|
|
|
- circle(r = rounding);
|
|
|
- }
|
|
|
+ top_center = [0, vesa_height / 2 - vesa_frame_thickness * 4];
|
|
|
+ bottom_center = [0, vesa_frame_thickness * 4 - vesa_height / 3];
|
|
|
|
|
|
- translate([move_x, -move_y]) {
|
|
|
- circle(r = rounding);
|
|
|
+ module center_shape() {
|
|
|
+ hull() {
|
|
|
+ translate(top_center) {
|
|
|
+ square(vesa_frame_thickness * 4, center = true);
|
|
|
}
|
|
|
|
|
|
- translate([-move_x, -move_y]) {
|
|
|
- circle(r = rounding);
|
|
|
+ translate(bottom_center) {
|
|
|
+ square(vesa_frame_thickness * 4, center = true);
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- module wall_holes() {
|
|
|
- move_x = (
|
|
|
- vesa_wall_width
|
|
|
- - (vesa_wall_width % wall_holes_space)
|
|
|
- ) / 2;
|
|
|
-
|
|
|
- move_y = (
|
|
|
- vesa_wall_height
|
|
|
- - (vesa_wall_height % wall_holes_space)
|
|
|
- ) / 2;
|
|
|
-
|
|
|
- for (count_x = [-move_x : wall_holes_space : move_x]) {
|
|
|
- for (count_y = [-move_y : wall_holes_space : move_y]) {
|
|
|
- translate([count_x, count_y]) {
|
|
|
- circle(r = hook_mounting_hole / 2);
|
|
|
- }
|
|
|
- }
|
|
|
+ correct = vesa_frame_thickness * 2;
|
|
|
+ bottom_left = [correct + vesa_rounding, vesa_rounding - correct];
|
|
|
+ bottom_right = [-bottom_left.x, bottom_left.y];
|
|
|
+ top_left = [bottom_left.x, correct - vesa_rounding * 2];
|
|
|
+ top_right = [-bottom_left.x, top_left.y];
|
|
|
+
|
|
|
+ translate(bottom_center) {
|
|
|
+ difference_circle_corner(bottom_left, 0);
|
|
|
+ difference_circle_corner(bottom_right, 1);
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- module wall_shape() {
|
|
|
- difference() {
|
|
|
- wall_base_shape();
|
|
|
- wall_holes();
|
|
|
+ translate(top_center) {
|
|
|
+ difference_circle_corner(top_left, 3);
|
|
|
+ difference_circle_corner(top_right, 2);
|
|
|
}
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- module wall_object() {
|
|
|
- linear_extrude(height = vesa_hinge_thickness) {
|
|
|
- wall_shape();
|
|
|
+ bottom_y = bottom_center.y - vesa_frame_thickness * 2 - vesa_rounding * 2;
|
|
|
+ bottom_left = [vesa_width / 2, bottom_y];
|
|
|
+ bottom_right = [-bottom_left.x, bottom_left.y];
|
|
|
+
|
|
|
+ module bottom_shape() {
|
|
|
+ hull() {
|
|
|
+ circle_corner([bottom_left.x, bottom_left.y + vesa_rounding]);
|
|
|
+ circle_corner([bottom_left.x, bottom_left.y - vesa_rounding]);
|
|
|
+
|
|
|
+ circle_corner([bottom_right.x, bottom_right.y + vesa_rounding]);
|
|
|
+ circle_corner([bottom_right.x, bottom_right.y - vesa_rounding]);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- union() {
|
|
|
- vesa_hinge_object();
|
|
|
- wall_object();
|
|
|
+ module base_object() {
|
|
|
+ linear_extrude(height = vesa_thickness) {
|
|
|
+ top_shape();
|
|
|
+ center_shape();
|
|
|
+ bottom_shape();
|
|
|
+ }
|
|
|
}
|
|
|
-}
|
|
|
|
|
|
-module vesa_corner_base_object(move = false) {
|
|
|
- radius = vesa_hinge_full_height() / 2;
|
|
|
- move_x = vesa_hinge_height / 3;
|
|
|
+ module corner_regulation() {
|
|
|
+ move = [
|
|
|
+ 0,
|
|
|
+ vesa_rounding * 2 - vesa_height / 3,
|
|
|
+ vesa_thickness / 2
|
|
|
+ ];
|
|
|
+
|
|
|
+ translate(move) {
|
|
|
+ rotate([0, 90, 0]) {
|
|
|
+ cylinder(
|
|
|
+ r = vesa_base_screw / 2,
|
|
|
+ h = vesa_width + vesa_frame_thickness,
|
|
|
+ center = true
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ size = [
|
|
|
+ vesa_thickness,
|
|
|
+ vesa_thickness * 1.5,
|
|
|
+ vesa_thickness
|
|
|
+ ];
|
|
|
+
|
|
|
+ position_x = vesa_width / 2
|
|
|
+ - vesa_frame_thickness
|
|
|
+ + vesa_thickness / 2 / 1.5;
|
|
|
+
|
|
|
+ translate([position_x, 0, 0]) {
|
|
|
+ cube(size, center = true);
|
|
|
+ }
|
|
|
|
|
|
- rotate([90, 0, 90]) {
|
|
|
- linear_extrude(height = vesa_corner_thickness, center = true) {
|
|
|
- difference() {
|
|
|
- hull() {
|
|
|
- translate([0, radius / 2]) {
|
|
|
- square([radius * 2, radius], center = true);
|
|
|
- }
|
|
|
+ translate([-position_x, 0, 0]) {
|
|
|
+ cube(size, center = true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ render() {
|
|
|
+ difference() {
|
|
|
+ base_object();
|
|
|
+ corner_regulation();
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- circle(r = radius);
|
|
|
- }
|
|
|
-
|
|
|
- circle(r = vesa_hinge_screw / 2);
|
|
|
-
|
|
|
- if (move) {
|
|
|
- difference() {
|
|
|
- size = radius - vesa_hinge_screw;
|
|
|
- move = (size + vesa_hinge_screw) * 2;
|
|
|
-
|
|
|
- circle(r = size + vesa_hinge_screw / 2);
|
|
|
- circle(r = size - vesa_hinge_screw / 2);
|
|
|
-
|
|
|
- translate([0, move / 4]) {
|
|
|
- square([move, move / 2], center = true);
|
|
|
+ module monitor_hinge(x) {
|
|
|
+ position_z = vesa_thickness - vesa_frame_thickness / 2;
|
|
|
+ translate([x, top_left.y + vesa_frame_thickness, position_z]) {
|
|
|
+ rotate([0, 90, 180]) {
|
|
|
+ vesa_monitor_hinge();
|
|
|
+
|
|
|
+ translate([0, vesa_frame_thickness / 2, 0]) {
|
|
|
+ linear_extrude(height = vesa_thickness, center = true) {
|
|
|
+ difference() {
|
|
|
+ circle(r = vesa_frame_thickness / 2);
|
|
|
+ translate([0, -vesa_frame_thickness / 4]) {
|
|
|
+ size = [
|
|
|
+ vesa_frame_thickness,
|
|
|
+ vesa_frame_thickness / 2
|
|
|
+ ];
|
|
|
+
|
|
|
+ square(size, center = true);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- } else {
|
|
|
- translate([0, radius - vesa_hinge_screw]) {
|
|
|
- circle(r = vesa_hinge_screw / 2);
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ module main_hinge(y) {
|
|
|
+ translate([0, y, -vesa_frame_thickness]) {
|
|
|
+ rotate([90, 0, 0]) {
|
|
|
+ vesa_main_hinge();
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
-}
|
|
|
|
|
|
-module vesa_corner_hinge_object() {
|
|
|
- radius = vesa_hinge_full_height() / 2;
|
|
|
- move_x = vesa_hinge_width / 3;
|
|
|
+ monitor_hinge(top_left.x + vesa_thickness / 3);
|
|
|
+ monitor_hinge(top_right.x - vesa_thickness / 3);
|
|
|
+
|
|
|
+ main_hinge(vesa_height / 4 + vesa_frame_thickness);
|
|
|
+ main_hinge(-vesa_height / 4 + vesa_frame_thickness);
|
|
|
|
|
|
- module corner_object() {
|
|
|
- vesa_corner_base_object();
|
|
|
+ if (vesa_width >= 100) {
|
|
|
+ main_hinge(vesa_frame_thickness);
|
|
|
}
|
|
|
+}
|
|
|
|
|
|
- union() {
|
|
|
- vesa_hinge_object();
|
|
|
-
|
|
|
- translate([move_x, 0, -radius]) {
|
|
|
- corner_object();
|
|
|
- }
|
|
|
+module vesa_wall() {
|
|
|
+ module base_shape() {
|
|
|
+ difference() {
|
|
|
+ vesa_rsquare(vesa_wall_width, vesa_wall_height);
|
|
|
|
|
|
- translate([-move_x, 0, -radius]) {
|
|
|
- corner_object();
|
|
|
+ inside_width = vesa_wall_width - vesa_frame_thickness * 2;
|
|
|
+ inside_height = vesa_wall_height - vesa_frame_thickness * (3 + 3);
|
|
|
+
|
|
|
+ vesa_rsquare(inside_width, inside_height);
|
|
|
}
|
|
|
- }
|
|
|
-}
|
|
|
|
|
|
-module vesa_plate_corner_object() {
|
|
|
- module vesa_plate_base_shape() {
|
|
|
- move_x = vesa_width / 2 - vesa_rounding + vesa_margin;
|
|
|
- move_y = vesa_height / 2 - vesa_rounding + vesa_margin;
|
|
|
- rounding = vesa_rounding;
|
|
|
-
|
|
|
- hull() {
|
|
|
- translate([move_x, move_y]) {
|
|
|
- circle(r = rounding);
|
|
|
- }
|
|
|
+ square([vesa_frame_thickness * 2, vesa_wall_height], center = true);
|
|
|
+ }
|
|
|
|
|
|
- translate([move_x, -move_y]) {
|
|
|
- circle(r = rounding);
|
|
|
+ module shape() {
|
|
|
+ difference() {
|
|
|
+ base_shape();
|
|
|
+
|
|
|
+ width = vesa_wall_width - vesa_wall_width % wall_holes_space;
|
|
|
+ height = vesa_wall_height - vesa_wall_height % wall_holes_space;
|
|
|
+
|
|
|
+ for (count_y = [-height / 2 : wall_holes_space : height / 2]) {
|
|
|
+ for (count_x = [-width / 2 : wall_holes_space : width / 2]) {
|
|
|
+ translate([count_x, count_y]) {
|
|
|
+ circle(r = hook_mounting_hole / 2);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- translate([-move_x, move_y]) {
|
|
|
- circle(r = rounding);
|
|
|
- }
|
|
|
+ module base_object() {
|
|
|
+ linear_extrude(height = vesa_thickness) {
|
|
|
+ shape();
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- translate([-move_x, -move_y]) {
|
|
|
- circle(r = rounding);
|
|
|
+ module base_hinge(y) {
|
|
|
+ translate([0, y, vesa_frame_thickness * 2 + vesa_thickness]) {
|
|
|
+ rotate([270, 0, 0]) {
|
|
|
+ vesa_main_hinge();
|
|
|
+ }
|
|
|
+
|
|
|
+ add_size = [
|
|
|
+ vesa_frame_thickness * 2,
|
|
|
+ vesa_thickness,
|
|
|
+ vesa_frame_thickness
|
|
|
+ ];
|
|
|
+
|
|
|
+ translate([0, 0, -vesa_frame_thickness * 1.5]) {
|
|
|
+ cube(add_size, center = true);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- module vesa_plate_shape() {
|
|
|
- radius = vesa_screw / 2;
|
|
|
- move_x = vesa_width / 2;
|
|
|
- move_y = vesa_height / 2;
|
|
|
+ module hinge(y) {
|
|
|
+ base_hinge(y - vesa_thickness);
|
|
|
+ base_hinge(y + vesa_thickness);
|
|
|
+ }
|
|
|
|
|
|
- difference() {
|
|
|
- vesa_plate_base_shape();
|
|
|
+ base_object();
|
|
|
+
|
|
|
+ hinge(0);
|
|
|
+ hinge(-vesa_height / 4);
|
|
|
+ hinge(vesa_height / 4);
|
|
|
+}
|
|
|
|
|
|
- translate([move_x, move_y]) {
|
|
|
- circle(r = radius);
|
|
|
- }
|
|
|
+function vesa_corner_regulation_size() = [
|
|
|
+ vesa_corner_regulation_space * (vesa_corner_regulation_count - 1),
|
|
|
+ vesa_thickness
|
|
|
+];
|
|
|
|
|
|
- translate([-move_x, move_y]) {
|
|
|
- circle(r = radius);
|
|
|
- }
|
|
|
-
|
|
|
- translate([move_x, -move_y]) {
|
|
|
- circle(r = radius);
|
|
|
+module vesa_corner_regulation() {
|
|
|
+ move_x = vesa_corner_regulation_size().x / 2;
|
|
|
+
|
|
|
+ module base_shape() {
|
|
|
+ hull() {
|
|
|
+ translate([move_x, 0]) {
|
|
|
+ circle(r = vesa_thickness / 2);
|
|
|
}
|
|
|
-
|
|
|
- translate([-move_x, -move_y]) {
|
|
|
- circle(r = radius);
|
|
|
+
|
|
|
+ translate([-move_x, 0]) {
|
|
|
+ circle(r = vesa_thickness / 2);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- module vesa_plate_object() {
|
|
|
- height = max(vesa_hinge_thickness, vesa_plate_thickness);
|
|
|
- correct = vesa_hinge_thickness - height;
|
|
|
-
|
|
|
- translate([0, 0, correct - height]) {
|
|
|
- linear_extrude(height = height) {
|
|
|
- vesa_plate_shape();
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- union() {
|
|
|
- vesa_plate_object();
|
|
|
-
|
|
|
- translate([0, 0, vesa_hinge_full_height() / 2]) {
|
|
|
- rotate([180, 0, 0]) {
|
|
|
- vesa_corner_base_object(true);
|
|
|
+ module shape() {
|
|
|
+ difference() {
|
|
|
+ base_shape();
|
|
|
+
|
|
|
+ for (count = [-move_x : vesa_corner_regulation_space : move_x]) {
|
|
|
+ translate([count, 0]) {
|
|
|
+ circle(r = vesa_base_screw / 2);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-}
|
|
|
-
|
|
|
|
|
|
+ linear_extrude(height = vesa_thickness, center = true) {
|
|
|
+ shape();
|
|
|
+ }
|
|
|
+}
|