1
0
mirror of https://github.com/nophead/NopSCADlib.git synced 2025-09-04 12:45:30 +02:00

Compare commits

...

29 Commits

Author SHA1 Message Date
Chris Palmer
7b3d7fab55 Fixed some more colour spellings 2020-03-29 21:36:11 +01:00
Chris Palmer
654571a70e Colour now always spelt colour except the call to color(). 2020-03-29 20:39:17 +01:00
Chris Palmer
e8abcde52f Removed the height parameter from linear_extrude 2020-03-29 20:18:57 +01:00
Chris Palmer
390957fdd0 Added MT3608 and TP4065 PCBs.
Perfboards now have their own row in the test to shorten the picture.
2020-03-28 10:54:06 +00:00
Chris Palmer
bde8cbe7a6 Added cutout for trimpot10. 2020-03-28 10:51:43 +00:00
Chris Palmer
fbe8533a42 Added function to get the height of pcb carriers. 2020-03-27 17:30:35 +00:00
Chris Palmer
a9c2f854c6 Can now have rectangular lands on PCB holes. 2020-03-27 17:29:50 +00:00
Chris Palmer
6187d90c57 Added 10 turn trimpots 2020-03-27 17:28:20 +00:00
Chris Palmer
65f320141d Added printed carriers for MT3608 and TP4056 modules. 2020-03-26 22:33:05 +00:00
Chris Palmer
d367e743da Image churn due to change of computer. 2020-03-24 17:30:10 +00:00
Chris Palmer
3a4305f5ca Nuts can now have non-standard pitch, toggle switch nut pitch fixed. 2020-03-24 17:29:29 +00:00
Chris Palmer
a7dde2d4e2 Fixed short thread bug although threads should not be that short. 2020-03-24 17:28:10 +00:00
Chris Palmer
56390bf8dd Updated big picture 2020-03-24 17:27:33 +00:00
Chris Palmer
53f0bbcd6e Fixed long SCS_bearing blocks to use two short bearings and added circlips. 2020-03-24 17:24:08 +00:00
Chris Palmer
f2ec3e71f4 Added circlips. 2020-03-24 17:22:32 +00:00
Chris Palmer
c1b5bd1b87 Added seal lip to linear_bearings. 2020-03-24 17:20:59 +00:00
Chris Palmer
268c066965 Added documentation for platters and panels in usage.md. 2020-03-15 21:11:15 +00:00
Chris Palmer
fd8712d6bf Updated images and readme. 2020-03-15 17:35:21 +00:00
Chris Palmer
b6a32b6b41 Fixed square nut threads. 2020-03-15 17:16:28 +00:00
Chris Palmer
0738893510 Merge branch 'square-nuts' of https://github.com/FLamparski/NopSCADlib into FLamparski-square-nuts 2020-03-15 17:06:15 +00:00
Filip Wieland
849bc479cc Adds DIN 562 square nuts 2020-03-15 17:01:48 +00:00
Chris
86d7e0f124 Merge pull request #66 from FLamparski/fix-windows-paths-with-spaces
Fix handling of (Windows) paths with spaces
2020-03-15 16:34:58 +00:00
Filip Wieland
c897060726 Fix handling of Windows paths with spaces 2020-03-15 16:25:18 +00:00
Chris Palmer
b2c2fc668b Added descriptions to doc_scripts.py and gallery.py. 2020-03-15 16:11:27 +00:00
Chris Palmer
4914f90994 Now ensures project scad dir searched first. 2020-03-12 22:56:56 +00:00
Chris Palmer
2210396234 Now uses the dependencies to locate modules for printed parts and assemblies. 2020-03-12 22:47:27 +00:00
Chris Palmer
2eef050f60 Missing bracket. 2020-03-11 23:11:34 +00:00
Chris Palmer
23a64f238d Added usage messages to all the scripts and documented multiple configuration
projects.
2020-03-11 23:09:03 +00:00
Chris Palmer
a8422a6aa6 Updated main image 2020-03-07 22:16:53 +00:00
132 changed files with 1027 additions and 418 deletions

View File

@@ -233,3 +233,33 @@ Vitamins are only ever previewed, so they are optimised to draw quickly in F5 an
In OpenCSG 3D difference and intersection are relatively slow and the negative volumes interfere with nearby objects when they are composed into assemblies. For this reason as much
as possible is done by unioning primitives and extruded 2D shapes. Any 3D differences or intersections are wrapped in ```render()``` so that CGAL will compute a polyhedron
that is cached and reused. This will be very slow the first time it renders but very fast afterwards.
### Panels and Platters
The ```stls``` and ```dxfs``` scripts produce a file for each part but often it is desirable to print or route collections of parts laid out together.
This can be done by adding scad files to folders called ```platters``` for STL files and ```panels``` for DXF files.
These can aggregate and lay out parts by including ```NopSCADlib/core.scad``` and using modules ```use_stl(name)``` and ```use_dxf(name)```.
These modules import the already generated singular STL and DXF files, so they are relatively fast. The name does not include the suffix.
The scad files typically also need to include other files from the project to get the dimensions of the parts to calculate their positions.
The composite part files have the same name as the scad file that generates them, with the suffix changed to ```.stl``` or ```.dxf```.
The generated files are placed in ```stls/printed``` and ```dxfs/routed```.
Any parts that are not covered by the platters / panels are copied into the ```printed``` / ```routed``` directories, so that they contain everything to be made.
### Multiple configurations
Some parametric designs might have several configurations, for example a 3D printer with different size options. If several configurations need to be supported at the
same time multiple sets of BOMS, STLS and DXFs need to be generated in separate diectories. NopSCADlib supports this by having multiple configuration files named
```config_<target_name>.scad```. All the scripts take an optional first parameter that selects one of these config files by specifying ```target_name```.
The target config file is selected by generating ```target.scad``` that includes ```config_<target_name>.scad```.
The rest of the project includes ```target.scad``` to use the configuration.
Additionally all the generated file directories (assemblies, bom, stls, dxfs, etc.) are placed in a sub-directory called ```<target_name>```.
### Other libraries
The build scripts need to be able to locate the source files where the modules to generate the STL files and assemblies reside. They will search all the scad files
in the project plus any ```printed``` directories outside the project. This covers the printed parts in NopSCADlib but also allows other libraries of printed parts.
Other libraries of vitamins and utilities can be used provided they follow the same convensions of NopSCADlib. The build scripts don't need to search those.

View File

@@ -51,7 +51,7 @@ $fa = 6;
$fs = extrusion_width / 2;
function round_to_layer(z) = ceil(z / layer_height) * layer_height;
// Some additional named colors
// Some additional named colours
grey20 = [0.2, 0.2, 0.2];
grey30 = [0.3, 0.3, 0.3];
grey40 = [0.4, 0.4, 0.4];

Binary file not shown.

Before

Width:  |  Height:  |  Size: 784 KiB

After

Width:  |  Height:  |  Size: 774 KiB

View File

@@ -29,6 +29,7 @@ use <tests/blowers.scad>
use <tests/bulldogs.scad>
use <tests/buttons.scad>
use <tests/cable_strips.scad>
use <tests/circlips.scad>
use <tests/components.scad>
use <tests/d_connectors.scad>
use <tests/displays.scad>
@@ -147,20 +148,20 @@ translate([x5, cable_grommets_y + 250])
translate([950, 600])
box_test();
translate([890, 730])
translate([890, 750])
printed_boxes();
translate([850, 1260])
translate([850, 1330])
bbox_test();
inserts_y = 0;
nuts_y = inserts_y + 20;
washers_y = nuts_y + 100;
washers_y = nuts_y + 120;
screws_y = washers_y + 120;
o_rings_y = screws_y + 130;
springs_y = o_rings_y + 20;
circlips_y = screws_y + 160;
springs_y = circlips_y + 20;
o_rings_y = springs_y;
sealing_strip_y = springs_y + 20;
tubings_y = sealing_strip_y + 20;
pillars_y = tubings_y + 20;
@@ -170,8 +171,8 @@ hot_ends_y = pulleys_y + 60;
linear_bearings_y = hot_ends_y + 50;
sheets_y = linear_bearings_y + 100;
pcbs_y = sheets_y + 40;
displays_y = pcbs_y + 150;
fans_y = displays_y + 100;
displays_y = pcbs_y + 170;
fans_y = displays_y + 80;
transformers_y = fans_y + 120;
psus_y = transformers_y + 190;
@@ -190,10 +191,13 @@ translate([x0, washers_y])
translate([x0, screws_y])
screws();
translate([x0, circlips_y])
circlips();
translate([x0, o_rings_y])
o_rings();
translate([x0, springs_y])
translate([x0 + 20, springs_y])
springs();
translate([x0 + 50, sealing_strip_y])
@@ -208,7 +212,7 @@ translate([x0, pillars_y])
translate([x0, leadnuts_y ])
leadnuts();
translate([x0 + 80, leadnuts_y])
translate([x0 + 60, leadnuts_y])
ball_bearings();
translate([x0, pulleys_y])
@@ -376,7 +380,7 @@ translate([x4 + 150, belts_y + 58]) {
translate([x4, rails_y + 130])
rails();
translate([900, fans_y + 50])
translate([800, fans_y + 50])
cable_strips();
translate([x4, kp_pillow_blocks_y])

View File

@@ -129,7 +129,7 @@ module box_corner_profile(type) { //! Generates the corner profile STL for 3D pr
length = box_height(type) - 2 * box_margin(type);
difference() {
linear_extrude(height = length, center = true, convexity = 5)
linear_extrude(length, center = true, convexity = 5)
box_corner_profile_2D(type);
for(z = [-1, 1])
@@ -148,24 +148,24 @@ module box_corner_profile_section(type, section, sections) { //! Generates inter
difference() {
union() {
linear_extrude(height = h, convexity = 5)
linear_extrude(h, convexity = 5)
box_corner_profile_2D(type);
if(!last_section) // male end always at the top
translate_z(section_length - 1)
for(i = [0 : 1], offset = i * layer_height)
linear_extrude(height = overlap + 1 - offset)
linear_extrude(overlap + 1 - offset)
offset(1 + offset - layer_height)
offset(-overlap_wall - 1)
box_corner_profile_2D(type);
}
if(section > 0)
translate_z(last_section ? h : 0) { // female at bottom unless last section
linear_extrude(height = 2 * (overlap + layer_height), center = true, convexity = 5)
linear_extrude(2 * (overlap + layer_height), center = true, convexity = 5)
offset(-overlap_wall)
box_corner_profile_2D(type);
linear_extrude(height = 2 * layer_height, center = true, convexity = 5)
linear_extrude(2 * layer_height, center = true, convexity = 5)
offset(-overlap_wall + layer_height)
box_corner_profile_2D(type);
}
@@ -223,7 +223,7 @@ module box_bezel(type, bottom) { //! Generates top and bottom bezel STLs
// slots for side panels
//
translate_z(-box_profile_overlap(type))
linear_extrude(height = 2 * box_profile_overlap(type), center = true)
linear_extrude(2 * box_profile_overlap(type), center = true)
for(i = [-1, 1]) {
translate([i * (box_width(type) / 2 + t / 2 - sheet_slot_clearance / 2), 0])
square([t, box_depth(type) - 2 * box_corner_gap(type)], center = true);
@@ -240,7 +240,7 @@ module box_bezel(type, bottom) { //! Generates top and bottom bezel STLs
// leave plastic over the corner profiles
//
translate_z(-box_profile_overlap(type) - 1)
linear_extrude(height = box_profile_overlap(type) + box_corner_gap(type) + 2)
linear_extrude(box_profile_overlap(type) + box_corner_gap(type) + 2)
union() {
difference() {
square([box_width(type) - 2 * box_inset(type),
@@ -273,7 +273,7 @@ module box_bezel_section(type, bottom, rows, cols, x, y) { //! Generates interlo
end_clearance = 0.5;
module male() {
rotate([90, 0, 90])
linear_extrude(height = dowel_length - 2 * end_clearance, center = true)
linear_extrude(dowel_length - 2 * end_clearance, center = true)
difference() {
union() {
h = dh - layer_height;

View File

@@ -59,7 +59,7 @@ module ribbon_grommet(ways, thickness) { //! Generate the STL for a printed ribb
union() {
for(side = [-1, 1])
translate_z(side * (width - wall) / 2)
linear_extrude(height = wall, center = true, convexity = 5)
linear_extrude(wall, center = true, convexity = 5)
difference() {
hull() {
translate([-length / 2, 0])
@@ -73,7 +73,7 @@ module ribbon_grommet(ways, thickness) { //! Generate the STL for a printed ribb
square([slot_length, slot_height]);
}
linear_extrude(height = width -1, center = true)
linear_extrude(width -1, center = true)
difference() {
ribbon_grommet_hole(ways, expand = false, h = 0);
@@ -170,14 +170,14 @@ module mouse_grommet(r, thickness) { //! Make the STL for a mouse grommet
union() {
for(side = [-1, 1])
translate_z(side * (width - wall) / 2)
linear_extrude(height = wall, center = true)
linear_extrude(wall, center = true)
difference() {
mouse_grommet_hole(r, z = r + wall, h = 0, expand = wall + overlap);
translate([0, wall])
mouse_grommet_hole(r, h = 0, expand = 0);
}
linear_extrude(height = width - 1, center = true)
linear_extrude(width - 1, center = true)
difference() {
mouse_grommet_hole(r, h = 0, z = r + wall, expand = wall);

View File

@@ -18,12 +18,14 @@
//
//
//! Adapts ESP12 module to 0.1" grid. See <https://hydraraptor.blogspot.com/2018/04/esp-12-module-breakout-adaptor.html>.
//! Adapts ESP12 modules and various small PCBs to 0.1" grid. See <https://hydraraptor.blogspot.com/2018/04/esp-12-module-breakout-adaptor.html>.
//
$extrusion_width = 0.5;
include <../utils/core/core.scad>
function carrier_height() = 3; //! Height of PCB carrier
module ESP12F_carrier_stl() { //! Generate the STL for an ESP12 carrier
stl("ESP12F_carrier");
pins = 8;
@@ -33,7 +35,7 @@ module ESP12F_carrier_stl() { //! Generate the STL for an ESP12 carrier
hole2 = pitch2 - 3 * extrusion_width;
length1 = (pins - 1) * pitch1 + hole + squeezed_wall * 2;
length2 = (pins - 1) * pitch2 + hole + squeezed_wall * 2;
height = 3;
height = carrier_height();
wpitch1 = (pins - 1) * pitch1;
wpitch2 = ceil(wpitch1 / 2.54) * 2.54;
@@ -61,3 +63,71 @@ module ESP12F_carrier_stl() { //! Generate the STL for an ESP12 carrier
}
}
}
module TP4056_carrier_stl() { //! Generate the STL for an TP4056 carrier, two required
stl("TP4056_carrier");
pitch = 2.54;
outer_pitch = 13.9;
inner_pitch = 7.54;
hole = pitch - 3 * extrusion_width;
pins = 6;
length1 = outer_pitch + hole + squeezed_wall * 2;
length2 = (pins - 1) * pitch + hole + squeezed_wall * 2;
height = carrier_height();
width = hole + squeezed_wall * 2;
spacing = inch(0.9);
difference() {
hull() {
translate_z(height - eps / 2)
cube([width, length1, eps], center = true);
translate_z(eps / 2)
cube([width, length2, eps], center = true);
}
for(i = [0 : pins - 1])
let(x = [-outer_pitch / 2, - inner_pitch / 2, 0, 0, inner_pitch / 2, outer_pitch / 2][i])
if(x)
hull() {
translate([0, x, height])
cube([hole, hole, eps], center = true);
translate([0, i * pitch - (pins - 1) * pitch / 2])
cube([hole, hole, eps], center = true);
}
}
}
module MT3608_carrier_stl() { //! Generate the STL for an MT3608 carrier, two required
stl("MT3608_carrier");
pcb_width = 17;
w_pitch_top = 6.81;
w_pitch_bot = inch(0.3);
l_pitch_top = 30.855;
l_pitch_bot = inch(1.2);
hole = 1;
height = carrier_height();
wall = 2 * extrusion_width;
width = hole + 2 * wall;
offset = (l_pitch_top - l_pitch_bot) / 2;
difference() {
hull() {
translate([offset, 0, height - eps / 2])
rounded_rectangle([width, pcb_width - 2, eps], 1);
translate_z(eps / 2)
rounded_rectangle([width, pcb_width - 2, eps], 1);
}
for(side = [-1, 1])
hull() {
translate([offset, side * w_pitch_top / 2, height])
cube([hole, hole, eps], center = true);
translate([0, side * w_pitch_bot / 2])
cube([hole, hole, eps], center = true);
}
}
}

View File

@@ -60,7 +60,7 @@ module door_hinge(door_thickness) { //! Generates STL fo
union() {
rotate([90, 0, 0])
linear_extrude(height = width, center = true)
linear_extrude(width, center = true)
difference() {
hull() {
translate([dia / 2, thickness + door_thickness / 2])
@@ -76,7 +76,7 @@ module door_hinge(door_thickness) { //! Generates STL fo
translate([dia / 2, thickness + door_thickness / 2])
teardrop(r = screw_clearance_radius(pin_screw), h = 0);
}
linear_extrude(height = thickness)
linear_extrude(thickness)
difference() {
hull() {
translate([0, -width / 2])
@@ -108,7 +108,7 @@ module door_hinge_stat_stl() { //! Generates the STL for the stationary part
stl("door_hinge_stat");
union() {
linear_extrude(height = thickness)
linear_extrude(thickness)
difference() {
rounded_square([stat_length, stat_width], rad);
@@ -117,7 +117,7 @@ module door_hinge_stat_stl() { //! Generates the STL for the stationary part
}
rotate([90, 0, 0])
linear_extrude(height = stat_width, center = true)
linear_extrude(stat_width, center = true)
difference() {
hull() {
translate([0, dia / 2 + stat_clearance])

View File

@@ -81,7 +81,7 @@ module fixing_block(screw = def_screw) { //! Generate the STL
difference() {
union() {
linear_extrude(height = fb_height, convexity = 5)
linear_extrude(fb_height, convexity = 5)
difference() {
hull() {
for(side = [-1, 1]) {

View File

@@ -82,7 +82,7 @@ module hinge_male(type, female = false) { //! The half with the stationary
teardrop_r = kr / cos(22.5); // The corner on the teardrop
inset = sqrt(sqr(teardrop_r + gap) - sqr(kr - t)) - kr;
linear_extrude(height =t)
linear_extrude(t)
difference() {
hull() {
for(side = [-1, 1])
@@ -102,7 +102,7 @@ module hinge_male(type, female = false) { //! The half with the stationary
rotate([90, 0, -90])
for(z = [0 : (female ? fn : mn) - 1])
translate_z(-dir * w / 2 + z * dir * pitch + (female ? -fw - mw - gap : 0))
linear_extrude(height = female ? fw : mw)
linear_extrude(female ? fw : mw)
difference() {
hull() {
rotate(180)

View File

@@ -56,7 +56,7 @@ module foot(type = foot) { //! Generate STL
circle4n(r);
}
}
linear_extrude(height = t)
linear_extrude(t)
difference() {
circle(r1 + eps);
@@ -116,7 +116,7 @@ module insert_foot(type = insert_foot) { //! Generate STL for foot with insert
}
}
}
linear_extrude(height = h2 + eps)
linear_extrude(h2 + eps)
difference() {
circle(r5 + eps);

View File

@@ -62,7 +62,7 @@ module pcb_mount_ring()
}
module pcb_mount_washer_stl() //! A plastic washer to clamp a PCB
linear_extrude(height = washer_thickness)
linear_extrude(washer_thickness)
pcb_mount_ring();
module pcb_mount(pcb, height = 5, washers = true) { //! Make the STL of a pcb mount for the specified PCB.
@@ -85,10 +85,10 @@ module pcb_mount(pcb, height = 5, washers = true) { //! Make the STL of a pcb mo
cube([pillar_x_pitch(pcb) - 2 * wall, frame_w, frame_t], center = true);
pcb_mount_screw_positions(pcb)
linear_extrude(height = height)
linear_extrude(height)
pcb_mount_ring();
linear_extrude(height = height + pcb_thickness(pcb) - layer_height)
linear_extrude(height + pcb_thickness(pcb) - layer_height)
difference() {
pcb_mount_screw_positions(pcb)
pcb_mount_ring();

View File

@@ -129,7 +129,7 @@ module pbox_base(type) { //! Generate the STL for the base
t = pbox_base(type);
difference() {
union() {
linear_extrude(height = t)
linear_extrude(t)
offset(base_outset - 0.2)
pbox_inner_shape(type);
@@ -157,7 +157,7 @@ module pbox(type) { //! Generate the STL for the main case
difference() {
union() {
linear_extrude(height = total_height)
linear_extrude(total_height)
offset(wall / 2) pbox_mid_shape(type);
if($children > 2)
@@ -166,11 +166,11 @@ module pbox(type) { //! Generate the STL for the main case
difference() {
translate_z(top_thickness)
union() {
linear_extrude(height = height + eps)
linear_extrude(height + eps)
offset(-wall / 2) pbox_mid_shape(type);
translate_z(height) // Recess for the base
linear_extrude(height = total_height - height)
linear_extrude(total_height - height)
offset(base_outset)
pbox_inner_shape(type);
}
@@ -181,11 +181,11 @@ module pbox(type) { //! Generate the STL for the main case
rounded_rectangle([pbox_width(type) + 2 * outset, pbox_depth(type) + 2 * outset, ledge_h], 1, center = false);
hull() {
linear_extrude(height = ledge_h + eps)
linear_extrude(ledge_h + eps)
offset(ledge_inset)
pbox_inner_shape(type);
linear_extrude(height = eps)
linear_extrude(eps)
offset(ledge_outset)
pbox_inner_shape(type);
}

View File

@@ -113,21 +113,21 @@ module psu_shroud(type, cable_d, name, cables = 1) { //! Generate the STL file f
translate([centre_x, -centre_y]) {
rounded_rectangle([depth - eps, width - eps, top], rad, center = false);
linear_extrude(height = height)
linear_extrude(height)
difference() {
shape();
translate([depth / 2, width / 2 - 5])
square([2 * (depth - extent + terminal_clearance), 10], center = true);
}
linear_extrude(height = height - terminal_block_height(tb) - psu_terminal_block_z(type) - terminal_clearance)
linear_extrude(height - terminal_block_height(tb) - psu_terminal_block_z(type) - terminal_clearance)
shape();
}
// cable slots
for(i = [0 : 1 : cables - 1])
translate([centre_x - depth / 2 + wall / 2, -centre_y + (i - cables / 2 + 0.5) * psu_shroud_cable_pitch(cable_d), height / 2])
rotate([90, 0, 90])
linear_extrude(height = wall, center = true)
linear_extrude(wall, center = true)
difference() {
square([cable_d + eps, height], center = true);

View File

@@ -48,7 +48,7 @@ module screw_knob(screw) { //! Generate the STL for a knob to fit the specified
rotate(45)
circle(r = nut_trap_radius(screw_nut(screw)), $fn = 6);
}
linear_extrude(height = knob_thickness, convexity = 3)
linear_extrude(knob_thickness, convexity = 3)
difference() {
polygon(points = [for(a = [0 : 359]) [wave(a) * sin(a), wave(a) * cos(a)]]);

View File

@@ -52,12 +52,12 @@ module socket_box(type) { //! Generate STL of the backbox for the specified sock
insert_hole_radius = insert_hole_radius(insert);
difference() {
linear_extrude(height = height, convexity = 5)
linear_extrude(height, convexity = 5)
face_plate(type);
difference() {
translate_z(base_thickness)
linear_extrude(height = height, convexity = 5)
linear_extrude(height, convexity = 5)
offset(-wall) offset(1) face_plate(type);
for(side = [-1, 1])

View File

@@ -73,7 +73,7 @@ module ssr_shroud(type, cable_d, name) { //! Generate the STL file for a spec
translate([center_x, 0]) {
rounded_rectangle([depth - eps, width - eps, top], rad, center = false);
linear_extrude(height = height) difference() {
linear_extrude(height) difference() {
round(or = wall / 2 - eps, ir = 0) difference() {
rounded_square([depth, width], rad);
@@ -91,7 +91,7 @@ module ssr_shroud(type, cable_d, name) { //! Generate the STL file for a spec
for(side = [-1, 1])
translate([cable_x, side * (width / 2 - wall / 2), height / 2])
rotate([90, 0, 0])
linear_extrude(height = wall, center = true)
linear_extrude(wall, center = true)
difference() {
square([cable_d + eps, height], center = true);

View File

@@ -77,7 +77,7 @@ module strap(length, type = strap) { //! Generate the STL for the rubber strap
len = length - 2 * (wall + clearance);
w = strap_width(type);
linear_extrude(height = strap_thickness(type), convexity = 3)
linear_extrude(strap_thickness(type), convexity = 3)
difference() {
rounded_square([len, w], w / 2 - eps);
@@ -119,12 +119,12 @@ module strap_end(type = strap) { //! Generate the STL for end piece
}
union() {
linear_extrude(height = z1)
linear_extrude(z1)
with_hole()
outer();
translate_z(z1)
linear_extrude(height = strap_height(type) - z1)
linear_extrude(strap_height(type) - z1)
difference() {
outer();
@@ -137,11 +137,11 @@ module strap_end(type = strap) { //! Generate the STL for end piece
}
}
linear_extrude(height = strap_height(type) - layer_height)
linear_extrude(strap_height(type) - layer_height)
with_hole()
strap_boss_shape(type);
linear_extrude(height = z2)
linear_extrude(z2)
with_hole()
offset(cnc_bit_r)
offset(-step - cnc_bit_r)

164
readme.md
View File

@@ -25,21 +25,21 @@ See [usage](docs/usage.md) for requirements, installation instructions and a usa
<tr><td> <a href = "#Bulldogs">Bulldogs</a> </td><td> <a href = "#Light_strips">Light_strips</a> </td><td> <a href = "#SCS_bearing_blocks">SCS_bearing_blocks</a> </td><td> <a href = "#Corner_block">Corner_block</a> </td><td> <a href = "#Hanging_hole">Hanging_hole</a> </td><td> <a href = "#Rounded_rectangle">Rounded_rectangle</a> </td></tr>
<tr><td> <a href = "#Buttons">Buttons</a> </td><td> <a href = "#Linear_bearings">Linear_bearings</a> </td><td> <a href = "#SK_brackets">SK_brackets</a> </td><td> <a href = "#Door_hinge">Door_hinge</a> </td><td> <a href = "#Layout">Layout</a> </td><td> <a href = "#Sphere">Sphere</a> </td></tr>
<tr><td> <a href = "#Cable_strips">Cable_strips</a> </td><td> <a href = "#Mains_sockets">Mains_sockets</a> </td><td> <a href = "#SSRs">SSRs</a> </td><td> <a href = "#Door_latch">Door_latch</a> </td><td> <a href = "#Maths">Maths</a> </td><td> <a href = "#Teardrops">Teardrops</a> </td></tr>
<tr><td> <a href = "#Components">Components</a> </td><td> <a href = "#Meter">Meter</a> </td><td> <a href = "#Screws">Screws</a> </td><td> <a href = "#Fan_guard">Fan_guard</a> </td><td> <a href = "#Offset">Offset</a> </td><td></td></tr>
<tr><td> <a href = "#D_connectors">D_connectors</a> </td><td> <a href = "#Microswitches">Microswitches</a> </td><td> <a href = "#Sealing_strip">Sealing_strip</a> </td><td> <a href = "#Fixing_block">Fixing_block</a> </td><td> <a href = "#Quadrant">Quadrant</a> </td><td></td></tr>
<tr><td> <a href = "#Displays">Displays</a> </td><td> <a href = "#Microview">Microview</a> </td><td> <a href = "#Sheets">Sheets</a> </td><td> <a href = "#Flat_hinge">Flat_hinge</a> </td><td> <a href = "#Round">Round</a> </td><td></td></tr>
<tr><td> <a href = "#Extrusion_brackets">Extrusion_brackets</a> </td><td> <a href = "#Modules">Modules</a> </td><td> <a href = "#Spades">Spades</a> </td><td> <a href = "#Foot">Foot</a> </td><td> <a href = "#Rounded_cylinder">Rounded_cylinder</a> </td><td></td></tr>
<tr><td> <a href = "#Extrusions">Extrusions</a> </td><td> <a href = "#Nuts">Nuts</a> </td><td> <a href = "#Spools">Spools</a> </td><td> <a href = "#Handle">Handle</a> </td><td> <a href = "#Rounded_polygon">Rounded_polygon</a> </td><td></td></tr>
<tr><td> <a href = "#Fans">Fans</a> </td><td> <a href = "#O_ring">O_ring</a> </td><td> <a href = "#Springs">Springs</a> </td><td> <a href = "#PCB_mount">PCB_mount</a> </td><td> <a href = "#Sector">Sector</a> </td><td></td></tr>
<tr><td> <a href = "#Fuseholder">Fuseholder</a> </td><td> <a href = "#Opengrab">Opengrab</a> </td><td> <a href = "#Stepper_motors">Stepper_motors</a> </td><td> <a href = "#PSU_shroud">PSU_shroud</a> </td><td> <a href = "#Sweep">Sweep</a> </td><td></td></tr>
<tr><td> <a href = "#Geared_steppers">Geared_steppers</a> </td><td> <a href = "#PCB">PCB</a> </td><td> <a href = "#Toggles">Toggles</a> </td><td> <a href = "#Printed_box">Printed_box</a> </td><td> <a href = "#Thread">Thread</a> </td><td></td></tr>
<tr><td> <a href = "#Green_terminals">Green_terminals</a> </td><td> <a href = "#PCBs">PCBs</a> </td><td> <a href = "#Transformers">Transformers</a> </td><td> <a href = "#Ribbon_clamp">Ribbon_clamp</a> </td><td> <a href = "#Tube">Tube</a> </td><td></td></tr>
<tr><td> <a href = "#Hot_ends">Hot_ends</a> </td><td> <a href = "#PSUs">PSUs</a> </td><td> <a href = "#Tubings">Tubings</a> </td><td> <a href = "#SSR_shroud">SSR_shroud</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#Hygrometer">Hygrometer</a> </td><td> <a href = "#Pillars">Pillars</a> </td><td> <a href = "#Variacs">Variacs</a> </td><td> <a href = "#Screw_knob">Screw_knob</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#IECs">IECs</a> </td><td> <a href = "#Pin_headers">Pin_headers</a> </td><td> <a href = "#Veroboard">Veroboard</a> </td><td> <a href = "#Socket_box">Socket_box</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#Inserts">Inserts</a> </td><td> <a href = "#Pulleys">Pulleys</a> </td><td> <a href = "#Washers">Washers</a> </td><td> <a href = "#Strap_handle">Strap_handle</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#Jack">Jack</a> </td><td></td><td> <a href = "#Wire">Wire</a> </td><td></td><td></td><td></td></tr>
<tr><td></td><td></td><td> <a href = "#Zipties">Zipties</a> </td><td></td><td></td><td></td></tr>
<tr><td> <a href = "#Circlips">Circlips</a> </td><td> <a href = "#Meter">Meter</a> </td><td> <a href = "#Screws">Screws</a> </td><td> <a href = "#Fan_guard">Fan_guard</a> </td><td> <a href = "#Offset">Offset</a> </td><td></td></tr>
<tr><td> <a href = "#Components">Components</a> </td><td> <a href = "#Microswitches">Microswitches</a> </td><td> <a href = "#Sealing_strip">Sealing_strip</a> </td><td> <a href = "#Fixing_block">Fixing_block</a> </td><td> <a href = "#Quadrant">Quadrant</a> </td><td></td></tr>
<tr><td> <a href = "#D_connectors">D_connectors</a> </td><td> <a href = "#Microview">Microview</a> </td><td> <a href = "#Sheets">Sheets</a> </td><td> <a href = "#Flat_hinge">Flat_hinge</a> </td><td> <a href = "#Round">Round</a> </td><td></td></tr>
<tr><td> <a href = "#Displays">Displays</a> </td><td> <a href = "#Modules">Modules</a> </td><td> <a href = "#Spades">Spades</a> </td><td> <a href = "#Foot">Foot</a> </td><td> <a href = "#Rounded_cylinder">Rounded_cylinder</a> </td><td></td></tr>
<tr><td> <a href = "#Extrusion_brackets">Extrusion_brackets</a> </td><td> <a href = "#Nuts">Nuts</a> </td><td> <a href = "#Spools">Spools</a> </td><td> <a href = "#Handle">Handle</a> </td><td> <a href = "#Rounded_polygon">Rounded_polygon</a> </td><td></td></tr>
<tr><td> <a href = "#Extrusions">Extrusions</a> </td><td> <a href = "#O_ring">O_ring</a> </td><td> <a href = "#Springs">Springs</a> </td><td> <a href = "#PCB_mount">PCB_mount</a> </td><td> <a href = "#Sector">Sector</a> </td><td></td></tr>
<tr><td> <a href = "#Fans">Fans</a> </td><td> <a href = "#Opengrab">Opengrab</a> </td><td> <a href = "#Stepper_motors">Stepper_motors</a> </td><td> <a href = "#PSU_shroud">PSU_shroud</a> </td><td> <a href = "#Sweep">Sweep</a> </td><td></td></tr>
<tr><td> <a href = "#Fuseholder">Fuseholder</a> </td><td> <a href = "#PCB">PCB</a> </td><td> <a href = "#Toggles">Toggles</a> </td><td> <a href = "#Printed_box">Printed_box</a> </td><td> <a href = "#Thread">Thread</a> </td><td></td></tr>
<tr><td> <a href = "#Geared_steppers">Geared_steppers</a> </td><td> <a href = "#PCBs">PCBs</a> </td><td> <a href = "#Transformers">Transformers</a> </td><td> <a href = "#Ribbon_clamp">Ribbon_clamp</a> </td><td> <a href = "#Tube">Tube</a> </td><td></td></tr>
<tr><td> <a href = "#Green_terminals">Green_terminals</a> </td><td> <a href = "#PSUs">PSUs</a> </td><td> <a href = "#Tubings">Tubings</a> </td><td> <a href = "#SSR_shroud">SSR_shroud</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#Hot_ends">Hot_ends</a> </td><td> <a href = "#Pillars">Pillars</a> </td><td> <a href = "#Variacs">Variacs</a> </td><td> <a href = "#Screw_knob">Screw_knob</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#Hygrometer">Hygrometer</a> </td><td> <a href = "#Pin_headers">Pin_headers</a> </td><td> <a href = "#Veroboard">Veroboard</a> </td><td> <a href = "#Socket_box">Socket_box</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#IECs">IECs</a> </td><td> <a href = "#Pulleys">Pulleys</a> </td><td> <a href = "#Washers">Washers</a> </td><td> <a href = "#Strap_handle">Strap_handle</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#Inserts">Inserts</a> </td><td></td><td> <a href = "#Wire">Wire</a> </td><td></td><td></td><td></td></tr>
<tr><td> <a href = "#Jack">Jack</a> </td><td></td><td> <a href = "#Zipties">Zipties</a> </td><td></td><td></td><td></td></tr>
</table>
---
@@ -385,6 +385,48 @@ When the sides are constrained then a circular model is more accurate.
| 3 | ```cable_strip(20, 25, 100, 30)``` | Polypropylene strip 189mm x 24mm x 0.8mm |
<a href="#top">Top</a>
---
<a name="Circlips"></a>
## Circlips
Circlips aka tapered retaining rings.
[vitamins/circlips.scad](vitamins/circlips.scad) Object definitions.
[vitamins/circlip.scad](vitamins/circlip.scad) Implementation.
[tests/circlips.scad](tests/circlips.scad) Code for this example.
### Properties
| Function | Description |
|:--- |:--- |
| ```circlip_a(type)``` | Size of the lugs |
| ```circlip_b(type)``` | Widest part of the taper |
| ```circlip_d1(type)``` | Nominal OD, i.e. diameter of tube |
| ```circlip_d2(type)``` | Groove diameter, i.e. OD when installed |
| ```circlip_d3(type)``` | Relaxed OD when not installed |
| ```circlip_d5(type)``` | Plier hole diameter |
| ```circlip_thickness(type)``` | Thickness |
### Modules
| Module | Description |
|:--- |:--- |
| ```internal_circlip(type, open = 0)``` | Draw specified internal circlip, open = 0, for nominal size installed, 1 for relaxed uninstalled, -1 for squeezed to install |
![circlips](tests/png/circlips.png)
### Vitamins
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 3 | ```circlip(circlip_12i)``` | Circlip internal 12mm |
| 3 | ```circlip(circlip_15i)``` | Circlip internal 15mm |
| 3 | ```circlip(circlip_19i)``` | Circlip internal 19mm |
| 3 | ```circlip(circlip_21i)``` | Circlip internal 21mm |
| 3 | ```circlip(circlip_28i)``` | Circlip internal 28mm |
<a href="#top">Top</a>
---
@@ -1687,8 +1729,12 @@ If a nut is given a child then it gets placed on its top surface.
### Properties
| Function | Description |
|:--- |:--- |
| ```nut_pitch(type)``` | Pitch if not standard metric course thread |
| ```nut_radius(type)``` | Radius across the corners |
| ```nut_size(type)``` | Diameter of the corresponding screw |
| ```nut_square_size(type)``` | Diameter of the corresponding screw |
| ```nut_square_thickness(type)``` | Thickness of the square nut |
| ```nut_square_width(type)``` | Width of the square nut |
| ```nut_trap_depth(type)``` | Depth of nut trap |
| ```nut_washer(type)``` | Corresponding washer |
@@ -1705,6 +1751,7 @@ If a nut is given a child then it gets placed on its top surface.
|:--- |:--- |
| ```nut(type, nyloc = false, brass = false, nylon = false)``` | Draw specified nut |
| ```nut_and_washer(type, nyloc)``` | Draw nut with corresponding washer |
| ```nut_square(type, brass = false, nylon = false)``` | Draw specified square nut |
| ```nut_trap(screw, nut, depth = 0, horizontal = false, supported = false, h = 200)``` | Make a nut trap |
| ```wingnut(type)``` | Draw a wingnut |
@@ -1723,18 +1770,23 @@ If a nut is given a child then it gets placed on its top surface.
| 1 | ```nut(M3_nut)``` | Nut M3 x 2.4mm |
| 1 | ```nut(M3_nut, brass = true)``` | Nut M3 x 2.4mm brass |
| 1 | ```nut(M3_nut, nyloc = true)``` | Nut M3 x 2.4mm nyloc |
| 1 | ```nut(M3nS_thin_nut)``` | Nut M3nS 5.5 x 1.8mm |
| 1 | ```sliding_t_nut(M4_hammer_nut)``` | Nut M4 hammer |
| 1 | ```sliding_t_nut(M4_sliding_t_nut)``` | Nut M4 sliding T |
| 1 | ```nut(M4_nut)``` | Nut M4 x 3.2mm |
| 1 | ```nut(M4_nut, nyloc = true)``` | Nut M4 x 3.2mm nyloc |
| 1 | ```nut(M4nS_thin_nut)``` | Nut M4nS 7 x 2.2mm |
| 1 | ```sliding_t_nut(M5_sliding_t_nut)``` | Nut M5 sliding T |
| 1 | ```nut(M5_nut)``` | Nut M5 x 4mm |
| 1 | ```nut(M5_nut, nyloc = true)``` | Nut M5 x 4mm nyloc |
| 1 | ```nut(M5nS_thin_nut)``` | Nut M5nS 8 x 2.7mm |
| 1 | ```nut(M6_half_nut)``` | Nut M6 x 3mm |
| 1 | ```nut(M6_nut)``` | Nut M6 x 5mm |
| 1 | ```nut(M6_nut, nyloc = true)``` | Nut M6 x 5mm nyloc |
| 1 | ```nut(M6nS_thin_nut)``` | Nut M6nS 10 x 3.2mm |
| 1 | ```nut(M8_nut)``` | Nut M8 x 6.5mm |
| 1 | ```nut(M8_nut, nyloc = true)``` | Nut M8 x 6.5mm nyloc |
| 1 | ```nut(M8nS_thin_nut)``` | Nut M8nS 13 x 4mm |
| 1 | ```washer(M6_washer)``` | Washer M6 x 12.5mm x 1.5mm |
| 1 | ```wingnut(M4_wingnut)``` | Wingnut M4 |
@@ -1853,7 +1905,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| Module | Description |
|:--- |:--- |
| ```barrel_jack(cutout = false)``` | Draw barrel power jack |
| ```buzzer(height, diameter, colour)``` | Draw PCB buzzer with specified height, diameter and color |
| ```buzzer(height, diameter, colour)``` | Draw PCB buzzer with specified height, diameter and colour |
| ```chip(length, width, thickness, colour, cutout = false)``` | Draw a coloured cube to represent a chip, or other rectangular component |
| ```flat_flex(cutout = false)``` | Draw flat flexistrip connector as used on RPI0 |
| ```flex(cutout = false)``` | Draw flexistrip connector |
@@ -1871,7 +1923,9 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| ```pcb_screw_positions(type)``` | Positions children at the mounting hole positions |
| ```pcb_spacer(screw, height, wall = 1.8, taper = 0)``` | Generate STL for PCB spacer |
| ```rj45(cutout = false)``` | Draw RJ45 Ethernet connector |
| ```standoff(h, d, h2, d2)``` | Draw a standoff |
| ```terminal_35(ways, colour = "blue")``` | Draw 3.5mm terminal block |
| ```trimpot10(vertical, cutout = false)``` | Draw a ten turn trimpot |
| ```uSD(size, cutout = false)``` | Draw uSD socket |
| ```usb_Ax1(cutout = false)``` | Draw USB type A single socket |
| ```usb_Ax2(cutout = false)``` | Draw USB type A dual socket |
@@ -1937,7 +1991,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| Module | Description |
|:--- |:--- |
| ```barrel_jack(cutout = false)``` | Draw barrel power jack |
| ```buzzer(height, diameter, colour)``` | Draw PCB buzzer with specified height, diameter and color |
| ```buzzer(height, diameter, colour)``` | Draw PCB buzzer with specified height, diameter and colour |
| ```chip(length, width, thickness, colour, cutout = false)``` | Draw a coloured cube to represent a chip, or other rectangular component |
| ```flat_flex(cutout = false)``` | Draw flat flexistrip connector as used on RPI0 |
| ```flex(cutout = false)``` | Draw flexistrip connector |
@@ -1955,7 +2009,9 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| ```pcb_screw_positions(type)``` | Positions children at the mounting hole positions |
| ```pcb_spacer(screw, height, wall = 1.8, taper = 0)``` | Generate STL for PCB spacer |
| ```rj45(cutout = false)``` | Draw RJ45 Ethernet connector |
| ```standoff(h, d, h2, d2)``` | Draw a standoff |
| ```terminal_35(ways, colour = "blue")``` | Draw 3.5mm terminal block |
| ```trimpot10(vertical, cutout = false)``` | Draw a ten turn trimpot |
| ```uSD(size, cutout = false)``` | Draw uSD socket |
| ```usb_Ax1(cutout = false)``` | Draw USB type A single socket |
| ```usb_Ax2(cutout = false)``` | Draw USB type A dual socket |
@@ -1977,6 +2033,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| 1 | ```pcb(EnviroPlus)``` | Enviro+ |
| 1 | ```pcb(ExtruderPCB)``` | Extruder connection PCB |
| 1 | ```pcb(Keyes5p1)``` | Keyes5.1 Arduino Uno expansion board |
| 1 | ```pcb(MT3608)``` | MT3608 boost converter module |
| 1 | ```pcb(Melzi)``` | Melzi electronics |
| 4 | | Micro SD card |
| 1 | ```molex_254(2)``` | Molex KK header 2 way |
@@ -1996,15 +2053,20 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| 1 | ```pcb(RAMPSEndstop)``` | RAMPS Endstop Switch |
| 1 | ```pcb(RPI3)``` | Raspberry Pi 3 |
| 1 | ```pcb(RPI0)``` | Raspberry Pi Zero |
| 16 | ```screw(M2_cap_screw, 25)``` | Screw M2 cap x 25mm |
| 12 | ```screw(M2_cap_screw, 16)``` | Screw M2 cap x 16mm |
| 4 | ```screw(M2_cap_screw, 20)``` | Screw M2 cap x 20mm |
| 2 | ```screw(M2p5_cap_screw, 16)``` | Screw M2.5 cap x 16mm |
| 12 | ```screw(M2p5_cap_screw, 20)``` | Screw M2.5 cap x 20mm |
| 4 | ```screw(M2p5_cap_screw, 20)``` | Screw M2.5 cap x 20mm |
| 4 | ```screw(M2p5_cap_screw, 25)``` | Screw M2.5 cap x 25mm |
| 4 | ```screw(M2p5_cap_screw, 30)``` | Screw M2.5 cap x 30mm |
| 4 | ```screw(M2p5_pan_screw, 20)``` | Screw M2.5 pan x 20mm |
| 8 | ```screw(M2p5_pan_screw, 25)``` | Screw M2.5 pan x 25mm |
| 4 | ```screw(M2p5_pan_screw, 35)``` | Screw M2.5 pan x 35mm |
| 8 | ```screw(M3_cap_screw, 30)``` | Screw M3 cap x 30mm |
| 12 | ```screw(M2p5_pan_screw, 25)``` | Screw M2.5 pan x 25mm |
| 4 | ```screw(M3_cap_screw, 16)``` | Screw M3 cap x 16mm |
| 4 | ```screw(M3_cap_screw, 30)``` | Screw M3 cap x 30mm |
| 4 | ```screw(M3_cap_screw, 35)``` | Screw M3 cap x 35mm |
| 12 | ```screw(M4_cap_screw, 35)``` | Screw M4 cap x 35mm |
| 8 | ```screw(M4_cap_screw, 30)``` | Screw M4 cap x 30mm |
| 4 | ```screw(M4_cap_screw, 35)``` | Screw M4 cap x 35mm |
| 1 | ```pcb(TP4056)``` | TP4056 Li-lon Battery charger module |
| 3 | ```terminal_35(2)``` | Terminal block 2 way 3.5mm |
| 2 | ```green_terminal(gt_2p54, 4)``` | Terminal block 4 way 0.1" |
| 1 | | USB A to Mini B lead |
@@ -2017,24 +2079,24 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
### Printed
| Qty | Filename |
| ---:|:--- |
| 4 | pcb_spacer20140.stl |
| 4 | pcb_spacer20150.stl |
| 4 | pcb_spacer20160.stl |
| 4 | pcb_spacer20170.stl |
| 4 | pcb_spacer2060.stl |
| 4 | pcb_spacer2070.stl |
| 4 | pcb_spacer2080.stl |
| 4 | pcb_spacer2090.stl |
| 4 | pcb_spacer25100.stl |
| 4 | pcb_spacer25110_2.stl |
| 4 | pcb_spacer25120_2.stl |
| 4 | pcb_spacer25110.stl |
| 4 | pcb_spacer25120.stl |
| 4 | pcb_spacer25130_2.stl |
| 4 | pcb_spacer25240.stl |
| 2 | pcb_spacer2550.stl |
| 4 | pcb_spacer2580.stl |
| 4 | pcb_spacer2590.stl |
| 4 | pcb_spacer30180.stl |
| 4 | pcb_spacer30190.stl |
| 4 | pcb_spacer30230.stl |
| 4 | pcb_spacer25140_2.stl |
| 4 | pcb_spacer25150_2.stl |
| 4 | pcb_spacer25170.stl |
| 2 | pcb_spacer2570.stl |
| 4 | pcb_spacer30160.stl |
| 4 | pcb_spacer30210.stl |
| 4 | pcb_spacer3050.stl |
| 4 | pcb_spacer40180.stl |
| 4 | pcb_spacer40190.stl |
| 4 | pcb_spacer40200.stl |
| 4 | pcb_spacer40210.stl |
| 4 | pcb_spacer40220.stl |
<a href="#top">Top</a>
@@ -2325,10 +2387,10 @@ Linear rails with carriages.
### Modules
| Module | Description |
|:--- |:--- |
| ```carriage(type, rail, end_color = grey20, wiper_color = grey20)``` | Draw the specified carriage |
| ```carriage(type, rail, end_colour = grey20, wiper_colour = grey20)``` | Draw the specified carriage |
| ```carriage_hole_positions(type)``` | Position children over screw holes |
| ```rail(type, length)``` | Draw the specified rail |
| ```rail_assembly(type, length, pos, carriage_end_color = grey20, carriage_wiper_color = grey20)``` | Rail and carriage assembly |
| ```rail_assembly(type, length, pos, carriage_end_colour = grey20, carriage_wiper_colour = grey20)``` | Rail and carriage assembly |
| ```rail_hole_positions(type, length, first = 0, screws = 100, both_ends = true)``` | Position children over screw holes |
| ```rail_screws(type, length, thickness, screws = 100)``` | Place screws in the rail |
@@ -2607,10 +2669,12 @@ SCSnUU and SCSnLUU bearing blocks
| ```scs_bearing(type)``` | Linear bearing used |
| ```scs_block_center_height(type)``` | Height of the center of the block |
| ```scs_block_side_height(type)``` | Height of the side of the block, this determines the minimum screw length |
| ```scs_circlip(type)``` | Circlip used |
| ```scs_hole_offset(type)``` | Offset of bearing hole from base of block |
| ```scs_screw(type)``` | Screw type |
| ```scs_screw_separation_x(type)``` | Screw separation in X direction |
| ```scs_screw_separation_z(type)``` | Screw separation in Z direction |
| ```scs_spacer(type)``` | Spacer used in long bearings |
### Functions
| Function | Description |
@@ -2685,7 +2749,7 @@ The "Soft" parameter can be used to determinesif the sheet material needs machin
* If soft, wood screws will be used, with a pilot hole.
* If not soft, either tapped holes or a clearance hole and nuts will be used to retain screws.
The "Color" parameter is a quad-array: [R, G, B, Alpha], or can be a named color, see [OpenSCAD_User_Manual](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/The_OpenSCAD_Language#color).
The "Colour" parameter is a quad-array: [R, G, B, Alpha], or can be a named colour, see [OpenSCAD_User_Manual](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/The_OpenSCAD_Language#color).
For speed sheets should be modelled in 2D by subtracting holes from 2D templates made by ```sheet_2D()``` and then extruded to 3D with ```render_2D_sheet()```.
Note that modules that drill holes will return a 2D object if ```h``` is set to 0 to facilitate this.
@@ -2707,8 +2771,8 @@ Note that modules that drill holes will return a 2D object if ```h``` is set to
### Modules
| Module | Description |
|:--- |:--- |
| ```render_2D_sheet(type, color = false)``` | Extrude a 2D sheet template and give it the correct colour |
| ```render_sheet(type, color = false)``` | Render a sheet in the correct colour after holes have been subtracted |
| ```render_2D_sheet(type, colour = false)``` | Extrude a 2D sheet template and give it the correct colour |
| ```render_sheet(type, colour = false)``` | Render a sheet in the correct colour after holes have been subtracted |
| ```sheet(type, w, d, corners = [0, 0, 0, 0])``` | Draw specified sheet |
| ```sheet_2D(type, w, d, corners = [0, 0, 0, 0])``` | 2D sheet template with specified size and optionally rounded corners |
@@ -3428,7 +3492,7 @@ Just a BOM entry at the moment and cable bundle size functions for holes, plus c
| ```cable_tie_holes(cable_r, h = 100)``` | Holes to thread a ziptie through a panel to make a cable tie. |
| ```mouse_hole(cable, h = 100, teardrop = false)``` | A mouse hole to allow a panel to go over a wire bundle. |
| ```ribbon_cable(ways, length)``` | Add ribbon cable to the BOM |
| ```wire(color, strands, length, strand = 0.2)``` | Add stranded wire to the BOM |
| ```wire(colour, strands, length, strand = 0.2)``` | Add stranded wire to the BOM |
![wire](tests/png/wire.png)
@@ -3735,17 +3799,24 @@ of conductive panels, an extra layer of insulation.
---
<a name="Carriers"></a>
## Carriers
Adapts ESP12 module to 0.1" grid. See <https://hydraraptor.blogspot.com/2018/04/esp-12-module-breakout-adaptor.html>.
Adapts ESP12 modules and various small PCBs to 0.1" grid. See <https://hydraraptor.blogspot.com/2018/04/esp-12-module-breakout-adaptor.html>.
[printed/carriers.scad](printed/carriers.scad) Implementation.
[tests/carriers.scad](tests/carriers.scad) Code for this example.
### Functions
| Function | Description |
|:--- |:--- |
| ```carrier_height()``` | Height of PCB carrier |
### Modules
| Module | Description |
|:--- |:--- |
| ```ESP12F_carrier_stl()``` | Generate the STL for an ESP12 carrier |
| ```MT3608_carrier_stl()``` | Generate the STL for an MT3608 carrier, two required |
| ```TP4056_carrier_stl()``` | Generate the STL for an TP4056 carrier, two required |
![carriers](tests/png/carriers.png)
@@ -3753,6 +3824,8 @@ Adapts ESP12 module to 0.1" grid. See <https://hydraraptor.blogspot.com/2018/04/
| Qty | Filename |
| ---:|:--- |
| 1 | ESP12F_carrier.stl |
| 1 | MT3608_carrier.stl |
| 1 | TP4056_carrier.stl |
<a href="#top">Top</a>
@@ -4836,6 +4909,7 @@ Maths utilities for manipulating vectors and matrices.
| ```euler(R)``` | Convert a rotation matrix to a Euler rotation vector. |
| ```identity(n, x = 1)``` | Construct an arbitrary size identity matrix |
| ```reverse(v)``` | Reverse a vector |
| ```rot3_z(a)``` | Generate a 3x3 matrix to rotate around z |
| ```rotate(a, v)``` | Generate a 4x4 rotation matrix, ```a``` can be a vector of three angles or a single angle around ```z```, or around axis ```v``` |
| ```scale(v)``` | Generate a 4x4 matrix that scales by ```v```, which can be a vector of xyz factors or a scalar to scale all axes equally |
| ```transform(v, m)``` | Apply 4x4 transform to a 3 vector by extending it and cropping it again |

View File

@@ -189,8 +189,12 @@ def parse_bom(file = "openscad.log", name = None):
print(line[:-1])
return main
def usage():
print("\nusage:\n\tbom [target_config] [<accessory_name>_assembly] - Generate BOMs for a project or an accessory to a project.")
sys.exit(1)
def boms(target = None, assembly = None):
bom_dir = set_config(target) + "bom"
bom_dir = set_config(target, usage) + "bom"
if assembly:
bom_dir += "/accessories"
if not os.path.isdir(bom_dir):
@@ -217,7 +221,7 @@ def boms(target = None, assembly = None):
#
# Run openscad
#
openscad.run("-D","$bom=2","-D","$preview=true","-o", "openscad.echo", bom_maker_name)
openscad.run("-D","$bom=2","-D","$preview=true","-o", "openscad.echo", "-d", bom_dir + "/bom.deps", bom_maker_name)
os.remove(bom_maker_name)
print("Generating bom ...", end=" ")
@@ -239,11 +243,24 @@ def boms(target = None, assembly = None):
print("done")
if __name__ == '__main__':
args = len(sys.argv)
if args > 1:
if args > 2:
boms(sys.argv[1], sys.argv[2])
if len(sys.argv) > 3: usage()
if len(sys.argv) == 3:
target, assembly = sys.argv[1], sys.argv[2]
else:
boms(sys.argv[1])
if len(sys.argv) == 2:
if sys.argv[1][-9:] == "_assembly":
target, assembly = None, sys.argv[1]
else:
boms();
target, assembly = sys.argv[1], None
else:
target, assembly = None, None
if assembly:
if assembly[-9:] != "_assembly": usage()
try:
boms(target, assembly)
except Exception as e:
print(str(e))
sys.exit(1)

View File

@@ -113,5 +113,5 @@ if __name__ == '__main__':
if len(sys.argv) == 2:
canonicalise(sys.argv[1])
else:
print("usage: c14n_stl file")
print("\nusage:\n\t c14n_stl file - Canonicalise an STL file created by OpenSCAD.")
sys.exit(1)

View File

@@ -17,6 +17,7 @@
# If not, see <https://www.gnu.org/licenses/>.
#
import os
from set_config import source_dir
def mtime(file):
if os.path.isfile(file):
@@ -32,7 +33,7 @@ def read_deps(dname):
deps = []
for line in lines:
if line.startswith('\t'):
dep = line[1 : -1].rstrip(' \\')
dep = line[1 : -1].rstrip(' \\').replace('\\ ', ' ')
if not os.path.basename(dep) in ['stl.scad', 'dxf.scad', 'svf.scad', 'png.scad', 'target.scad']:
deps.append(dep)
return deps
@@ -48,3 +49,18 @@ def check_deps(target, dname):
if mtime(dep) > target_mtime:
return dep + ' changed'
return None
def source_dirs(bom_dir):
dirs = set()
lib_dirs = set()
deps = read_deps(bom_dir + '/bom.deps')
cwd = os.getcwd().replace('\\', '/')
for dep in deps:
dir = os.path.dirname(dep)
if dir.startswith(cwd):
dirs.add(dir[len(cwd) + 1:])
else:
if dir.endswith('/printed'):
lib_dirs.add(dir)
dirs.remove(source_dir)
return [source_dir] + sorted(dirs) + sorted(lib_dirs)

View File

@@ -26,6 +26,7 @@ from __future__ import print_function
import os
from tests import do_cmd
import argparse
dir = 'scripts'
@@ -74,4 +75,5 @@ They should work with both Python 2 and Python 3.
if __name__ == '__main__':
argparse.ArgumentParser(description='Generate scripts/readme.md and make html versions of that and doc/usage.md').parse_args()
doc_scripts()

View File

@@ -30,14 +30,14 @@ import times
from deps import *
import json
def bom_to_parts(target_dir, part_type, assembly = None):
def bom_to_parts(bom_dir, part_type, assembly = None):
#
# Make a list of all the parts in the BOM
#
part_files = []
bom = assembly + '.txt' if assembly else "bom.txt"
suffix = ".dxf" if part_type == 'svg' else '.' + part_type
with open(target_dir + "/../bom/" + bom, "rt") as f:
with open(bom_dir + '/' + bom, "rt") as f:
for line in f.readlines():
words = line.split()
if words:
@@ -46,13 +46,24 @@ def bom_to_parts(target_dir, part_type, assembly = None):
part_files.append(last_word[:-4] + '.' + part_type)
return part_files
def usage(t):
print("\nusage:\n\t%ss [target_config] [<name1>.%s] ... [<nameN>.%s] - Generate specified %s files or all if none specified." % ( t, t, t, t.upper()))
sys.exit(1)
def make_parts(target, part_type, parts = None):
#
# Check list of parts is the correct type
#
if parts:
for p in parts:
if not p.endswith('.' + part_type): usage(part_type)
#
# Make the target directory
#
top_dir = set_config(target)
top_dir = set_config(target, lambda: usage(part_type))
target_dir = top_dir + part_type + 's'
deps_dir = top_dir + "deps"
bom_dir = top_dir + "bom"
if not os.path.isdir(target_dir):
os.makedirs(target_dir)
if not os.path.isdir(deps_dir):
@@ -64,7 +75,7 @@ def make_parts(target, part_type, parts = None):
if parts:
targets = list(parts) #copy the list so we dont modify the list passed in
else:
targets = bom_to_parts(target_dir, part_type)
targets = bom_to_parts(bom_dir, part_type)
for file in os.listdir(target_dir):
if file.endswith('.' + part_type):
if not file in targets:
@@ -83,12 +94,11 @@ def make_parts(target, part_type, parts = None):
#
# Find all the scad files
#
lib_dirs = [path + '/' + lib + '/printed' for path in os.environ['OPENSCADPATH'].split(os.pathsep) for lib in sorted(os.listdir(path))]
module_suffix = '_dxf' if part_type == 'svg' else '_' + part_type
for dir in [source_dir, source_dir + '/printed'] + lib_dirs:
if os.path.isdir(dir):
for dir in source_dirs(bom_dir):
if targets and os.path.isdir(dir):
for filename in os.listdir(dir):
if filename[-5:] == ".scad":
if targets and filename[-5:] == ".scad":
#
# find any modules ending in _<part_type>
#
@@ -138,9 +148,6 @@ def make_parts(target, part_type, parts = None):
#
if targets:
for part in targets:
if part[-4:] != '.' + part_type:
print(part, "is not a", part_type, "file")
else:
print("Could not find a module called", part[:-4] + module_suffix, "to make", part)
sys.exit(1)
usage(part_type)
times.print_times()

View File

@@ -30,6 +30,7 @@ import re
from shutil import copyfile
from tests import update_image
import sys
import argparse
project_dirs = ['../..', 'examples']
target_dir = 'gallery'
@@ -39,7 +40,6 @@ def gallery(force):
if not os.path.isdir(target_dir):
os.makedirs(target_dir)
paths = sorted([pdir + '/' + i for pdir in project_dirs for i in os.listdir(pdir) if os.path.isdir(pdir + '/' + i + '/assemblies')], key = lambda s: os.path.basename(s))
with open(output_name, 'wt') as output_file:
print("# A gallery of projects made with NopSCADlib", file = output_file)
@@ -78,4 +78,8 @@ def gallery(force):
if __name__ == '__main__':
init()
gallery(force = len(sys.argv) > 1 and sys.argv[1] == '-f')
parser = argparse.ArgumentParser(description='Creates a galley of projects by copying the top level image and description to gallery/readme.md.')
parser.add_argument("-f", help = "run make_all in each project to force update", action="store_true")
args = parser.parse_args()
gallery(force = args.f)

View File

@@ -27,9 +27,17 @@ from bom import boms
from render import render
from views import views
from plateup import plateup
from set_config import set_config
def usage():
print("\nusage:\n\tmake_all [target_config] - Make all the manufacturing files and readme for a project.")
sys.exit(1)
if __name__ == '__main__':
if len(sys.argv) > 2: usage()
target = None if len(sys.argv) == 1 else sys.argv[1]
set_config(target, usage)
boms(target)
for part in ['stl', 'dxf']:
make_parts(target, part)

View File

@@ -25,9 +25,15 @@ import sys
from plateup import plateup
def usage():
print("\nusage:\n\tpanels [target_config] - Aggregate DXF files for routing together.")
sys.exit(1)
if __name__ == '__main__':
if len(sys.argv) > 2: usage()
if len(sys.argv) > 1:
target = sys.argv[1]
else:
target = None
plateup(target, 'dxf')
plateup(target, 'dxf', usage)

View File

@@ -31,11 +31,11 @@ from shutil import copyfile
source_dirs = { "stl" : "platters", "dxf" : "panels" }
target_dirs = { "stl" : "printed", "dxf" : "routed" }
def plateup(target, part_type):
def plateup(target, part_type, usage = None):
#
# Make the target directory
#
top_dir = set_config(target)
top_dir = set_config(target, usage)
parts_dir = top_dir + part_type + 's'
target_dir = parts_dir + '/' + target_dirs[part_type]
source_dir = top_dir + source_dirs[part_type]

View File

@@ -25,9 +25,15 @@ import sys
from plateup import plateup
def usage():
print("\nusage:\n\tplatters [target_config] - Aggregate STL files for printing together.")
sys.exit(1)
if __name__ == '__main__':
if len(sys.argv) > 2: usage()
if len(sys.argv) > 1:
target = sys.argv[1]
else:
target = None
plateup(target, 'stl')
plateup(target, 'stl', usage)

View File

@@ -30,17 +30,23 @@ from tests import do_cmd, update_image, colour_scheme, background
from deps import mtime
from colorama import init
def usage():
print("\nusage:\n\trender [target_config] - Render images of the stl and dxf files.");
sys.exit(1)
def render(target, type):
#
# Make the target directory
#
target_dir = set_config(target) + type + 's'
top_dir = set_config(target, usage)
target_dir = top_dir + type + 's'
bom_dir = top_dir + 'bom'
if not os.path.isdir(target_dir):
os.makedirs(target_dir)
#
# Find all the parts
#
parts = bom_to_parts(target_dir, type)
parts = bom_to_parts(bom_dir, type)
#
# Remove unused png files
#
@@ -71,6 +77,7 @@ def render(target, type):
if __name__ == '__main__':
init()
if len(sys.argv) > 2: usage()
target = sys.argv[1] if len(sys.argv) > 1 else None
render(target, 'stl')
render(target, 'dxf')

View File

@@ -45,20 +45,27 @@ def valid_targets_string():
return result
def set_config(target):
def set_config(target, usage = None):
if target and target[:1] == '-' and usage: usage()
targets = valid_targets()
if not target:
if not targets:
return ""
print("Must specify a configuration: " + valid_targets_string())
if usage:
usage()
sys.exit(1)
if not targets:
print("Not a muli-configuration project (no config_<target>.scad files found)")
if usage:
usage()
sys.exit(1)
if not target in targets:
print(target + " is not a configuration, avaliable configurations are: " + valid_targets_string())
if usage:
usage()
sys.exit(1)
fname = source_dir + "/target.scad"
@@ -75,10 +82,13 @@ def set_config(target):
f. write(text);
return target + "/"
def usage():
print("\nusage:\n\tset_config config_name")
sys.exit(1)
if __name__ == '__main__':
args = len(sys.argv)
if args == 2:
set_config(sys.argv[1])
set_config(sys.argv[1], usage)
else:
print("usage: set_config config_name")
sys.exit(1)
usage()

View File

@@ -85,6 +85,10 @@ def depluralise(name):
def is_plural(name):
return name != depluralise(name)
def usage():
print("\nusage:\n\ttests [test_name1] ... [test_nameN] - Run specified tests or all tests in none specified.");
sys.exit(1)
def tests(tests):
scad_dir = "tests"
deps_dir = scad_dir + "/deps"
@@ -96,6 +100,7 @@ def tests(tests):
doc_name = "readme.md"
index = {}
bodies = {}
done = []
times.read_times()
options.check_options(deps_dir)
#
@@ -114,6 +119,7 @@ def tests(tests):
for scad in scads:
base_name = scad[:-5]
if not tests or base_name in tests:
done.append(base_name)
print(base_name)
cap_name = base_name[0].capitalize() + base_name[1:]
base_name = base_name.lower()
@@ -234,6 +240,14 @@ def tests(tests):
body += ['\n<a href="#top">Top</a>']
body += ["\n---"]
for test in done:
if test in tests:
tests.remove(test)
if tests:
for test in tests:
print(Fore.MAGENTA + "Could not find a test called", test, Fore.WHITE)
usage()
with open(doc_name, "wt") as doc_file:
print('# NopSCADlib', file = doc_file)
print('''\
@@ -279,4 +293,6 @@ See [usage](docs/usage.md) for requirements, installation instructions and a usa
do_cmd('codespell -L od readme.md'.split())
if __name__ == '__main__':
for arg in sys.argv[1:]:
if arg[:1] == '-': usage()
tests(sys.argv[1:])

View File

@@ -97,12 +97,16 @@ def titalise(name):
cap_next = c == ' '
return result
def usage():
print("\nusage:\n\t views [target_config] [<name1>_assembly] ... [<nameN>_assembly] - Create assembly images and readme.")
sys.exit(1)
def views(target, do_assemblies = None):
done_assemblies = []
#
# Make the target directory
#
top_dir = set_config(target)
top_dir = set_config(target, usage)
target_dir = top_dir + 'assemblies'
deps_dir = top_dir + "deps"
bom_dir = top_dir + "bom"
@@ -133,8 +137,7 @@ def views(target, do_assemblies = None):
# Find all the scad files
#
main_blurb = None
lib_dirs = [path + '/' + lib + '/printed' for path in os.environ['OPENSCADPATH'].split(os.pathsep) for lib in sorted(os.listdir(path))]
for dir in [source_dir, source_dir + '/printed'] + lib_dirs:
for dir in source_dirs(bom_dir):
if os.path.isdir(dir):
for filename in os.listdir(dir):
if filename.endswith('.scad'):
@@ -396,4 +399,7 @@ if __name__ == '__main__':
else:
target, assemblies = None, sys.argv[1:]
for a in assemblies:
if a[-9:] != "_assembly": usage()
views(target, assemblies)

View File

@@ -98,6 +98,8 @@ test_pcb = ["TestPCB", "Test PCB",
[ 12, 444, 0, "2p54socket", 8, 1, undef, undef, undef, "red" ],
[ 10, 470, 0, "standoff", 5, 4.5, 12.5, 2.54],
[ 6, 480, 180, "uSD", [12, 11.5, 1.4]],
[ 20, -5, 180, "trimpot10"],
[ 20, -15, 0, "trimpot10", true],
],
// accessories
[]

View File

@@ -21,11 +21,16 @@ include <../vitamins/pcbs.scad>
use <../utils/layout.scad>
module pcbs()
module pcbs() {
layout([for(p = pcbs) pcb_width(p)], 10)
translate([0, pcb_length(pcbs[$i]) / 2])
rotate(90)
pcb_assembly(pcbs[$i], 5 + $i, 3);
translate([0, 120])
layout([for(p = perfboards) pcb_length(p)], 10)
translate([0, -pcb_width(perfboards[$i]) / 2])
pcb_assembly(perfboards[$i], 5 + $i, 3);
}
if($preview)
pcbs();

View File

@@ -19,7 +19,16 @@
include <../utils/core/core.scad>
use <../printed/carriers.scad>
module carriers()
module carriers() {
color(pp1_colour) ESP12F_carrier_stl();
translate([0, 15])
rotate(90)
color(pp1_colour) TP4056_carrier_stl();
translate([0, 25])
rotate(90)
color(pp1_colour) MT3608_carrier_stl();
}
carriers();

40
tests/circlips.scad Normal file
View File

@@ -0,0 +1,40 @@
//
// NopSCADlib Copyright Chris Palmer 2020
// nop.head@gmail.com
// hydraraptor.blogspot.com
//
// This file is part of NopSCADlib.
//
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
// GNU General Public License as published by the Free Software Foundation, either version 3 of
// the License, or (at your option) any later version.
//
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along with NopSCADlib.
// If not, see <https://www.gnu.org/licenses/>.
//
include <../core.scad>
use <../utils/layout.scad>
include <../vitamins/circlips.scad>
module circlips(all = false)
layout([for(c = circlips) circlip_d3(c)], 10, false) let(c = circlips[$i]) {
gap = circlip_d3(c) + 2;
internal_circlip(c, 1);
if(all) {
translate([0, gap])
internal_circlip(c, 0);
translate([0, 2 * gap])
internal_circlip(c, -1);
}
}
if($preview)
circlips(true);

View File

@@ -26,14 +26,13 @@ module resistors()
resistor(resistors[$i]);
module al_clad_resistors()
layout([for(a = al_clad_resistors) al_clad_width(a)])
layout([for(a = al_clad_resistors) al_clad_width(a)], 5, true)
rotate(90)
al_clad_resistor_assembly(al_clad_resistors[$i], 4.7)
screw(al_clad_hole(al_clad_resistors[$i]) > 3 ? M3_pan_screw : M2p5_pan_screw, 16);
module thermal_cutouts()
layout([for(t = thermal_cutouts) tc_length(t)])
layout([for(t = thermal_cutouts) tc_length(t)], 5, true)
thermal_cutout(thermal_cutouts[$i]);
module components() {
@@ -42,7 +41,7 @@ module components() {
translate([0, 50])
TO220("Generic TO220 package");
translate([30, 50])
translate([50, 50])
panel_USBA();
translate([0,80])

View File

@@ -20,7 +20,7 @@ include <../global_defs.scad>
use <../utils/dogbones.scad>
module dogbones() {
#linear_extrude(height = eps)
#linear_extrude(eps)
dogbone_square([10, 20]);
#translate([15, 0])

View File

@@ -20,7 +20,7 @@
include <../utils/core/core.scad>
module globals() {
linear_extrude(height = eps) {
linear_extrude(eps) {
semi_circle(r = 10);
translate([30, 0])

View File

@@ -22,7 +22,7 @@ use <../utils/layout.scad>
diams = [3, 7, 5, 11];
module layouts() {
linear_extrude(height = eps)
linear_extrude(eps)
layout(diams, gap = 1)
circle(d = diams[$i]);
}

View File

@@ -61,6 +61,19 @@ module nuts() {
if(n == M4_nut)
sliding_t_nut(M4_hammer_nut);
}
translate([0, 100]) {
if(n == M3_nut)
nut_square(M3nS_thin_nut);
if(n == M4_nut)
nut_square(M4nS_thin_nut);
if(n == M5_nut)
nut_square(M5nS_thin_nut);
if(n == M6_nut)
nut_square(M6nS_thin_nut);
if(n == M8_nut)
nut_square(M8nS_thin_nut);
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 54 KiB

BIN
tests/png/circlips.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 KiB

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 KiB

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 106 KiB

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 143 KiB

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 160 KiB

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 111 KiB

After

Width:  |  Height:  |  Size: 111 KiB

View File

@@ -34,7 +34,7 @@ module polyholes() {
children();
}
color(pp1_colour) linear_extrude(height = 3, center = true)
color(pp1_colour) linear_extrude(3, center = true)
difference() {
square([100, 27]);

View File

@@ -22,7 +22,7 @@ use <../utils/quadrant.scad>
module quadrants() {
linear_extrude(height = eps)
linear_extrude(eps)
quadrant(10, 4);
}

View File

@@ -28,14 +28,14 @@ module shape()
}
module rounds() {
linear_extrude(height = eps)
linear_extrude(eps)
round(or = 4, ir = 2)
shape();
translate([50, 0])
round_3D(or = 4, ir = 2, chamfer_base = true, $fn = 16)
linear_extrude(height = 40, center = true)
linear_extrude(40, center = true)
shape();
}

View File

@@ -22,7 +22,7 @@ use <../utils/rounded_cylinder.scad>
module rounded_cylinders() {
linear_extrude(height = eps)
linear_extrude(eps)
rounded_corner(10, 20, 3, 5);
translate([30, 10])

View File

@@ -46,7 +46,7 @@ module rounded_polygons() {
length = rounded_polygon_length(profile, tangents);
rotate([70, 0, 315])
linear_extrude(height = eps)
linear_extrude(eps)
rounded_polygon(profile, tangents);
translate([0, -10])

View File

@@ -20,7 +20,7 @@
include <../utils/core/core.scad>
module rounded_rectangles() {
linear_extrude(height = eps)
linear_extrude(eps)
rounded_square([30, 20], 3);
translate([40, 0])

View File

@@ -22,7 +22,7 @@ use <../utils/sector.scad>
module sectors() {
linear_extrude(height = eps)
linear_extrude(eps)
sector(50, 45, 180);
}

View File

@@ -23,7 +23,7 @@ module teardrops() {
color(pp1_colour)
rotate([90, 0, -45])
difference() {
linear_extrude(height = 3) {
linear_extrude(3) {
difference() {
square([80, 40]);

View File

@@ -22,7 +22,7 @@ use <../utils/tube.scad>
module tubes() {
linear_extrude(height = eps)
linear_extrude(eps)
ring(10, 8);
translate([50, 10])

View File

@@ -56,7 +56,7 @@ module wires() {
color(pp1_colour) {
rotate([90, 0, 90])
linear_extrude(height = thickness)
linear_extrude(thickness)
difference() {
translate([-w / 2, 0])
square([w, h]);
@@ -65,7 +65,7 @@ module wires() {
}
translate_z(-thickness)
linear_extrude(height = thickness)
linear_extrude(thickness)
difference() {
translate([thickness -d, -w / 2])
square([d, w]);

View File

@@ -26,7 +26,7 @@ include <../utils/core/core.scad>
module label(str, scale = 0.25, valign = "baseline", halign = "left") //! Draw text that always faces the camera
color("black")
%rotate($vpr != [0, 0, 0] ? $vpr : [70, 0, 315])
linear_extrude(height = eps)
linear_extrude(eps)
scale(scale)
text(str, valign = valign, halign = halign);

View File

@@ -43,7 +43,7 @@ module ellipse(xr, yr) scale([1, yr / xr]) circle4n(xr);
module extrude_if(h, center = true) //! Extrudes 2D object to 3D when ```h``` is nonzero, otherwise leaves it 2D
if(h)
linear_extrude(height = h, center = center, convexity = 2) // 3D
linear_extrude(h, center = center, convexity = 2) // 3D
children();
else
children(); // 2D

View File

@@ -28,6 +28,6 @@ module rounded_square(size, r, center = true) //! Like ```square()``` but with w
module rounded_rectangle(size, r, center = true, xy_center = true) //! Like ```cube()``` but corners rounded in XY plane and separate centre options for xy and z.
{
linear_extrude(height = size[2], center = center)
linear_extrude(size[2], center = center)
rounded_square([size[0], size[1]], r, xy_center);
}

View File

@@ -47,7 +47,7 @@ module hanging_hole(z, ir, h = 100, h2 = 100) { //! Hole radius ```ir``` hanging
difference() {
translate_z(-below)
linear_extrude(height = below + 2 * layer_height)
linear_extrude(below + 2 * layer_height)
children();
rotate(infill_angle)

View File

@@ -56,6 +56,13 @@ function rotate(a, v) = //! Generate a 4x4 rotation matrix, ```a``` can be a vec
[ 0, 0, 0, 1]
];
function rot3_z(a) = //! Generate a 3x3 matrix to rotate around z
let(c = cos(a),
s = sin(a))
[ [ c, -s, 0],
[ s, c, 0],
[ 0, 0, 1] ];
function scale(v) = let(s = is_list(v) ? v : [v, v, v]) //! Generate a 4x4 matrix that scales by ```v```, which can be a vector of xyz factors or a scalar to scale all axes equally
[
[s.x, 0, 0, 0],

View File

@@ -79,7 +79,7 @@ module thread(dia, pitch, length, profile, center = true, top = -1, bot = -1, st
sides = r2sides4n(r);
step_angle = 360 / sides;
segs = ceil(turns * sides);
leadin = ceil(sides / starts);
leadin = min(ceil(sides / starts), floor(turns * sides / 2));
final = floor(turns * sides) - leadin;
path = [for(i = [0 : segs],
R = i < leadin && bot < 0 ? r + dir * (h - h * i / leadin)

View File

@@ -29,5 +29,5 @@ module ring(or, ir) //! Create a ring with specified external and internal radii
}
module tube(or, ir, h, center = true) //! Create a tube with specified external and internal radii and height ```h```
linear_extrude(height = h, center = center, convexity = 5)
linear_extrude(h, center = center, convexity = 5)
ring(or, ir);

View File

@@ -44,7 +44,7 @@ module ball_bearing(type) { //! Draw a ball bearing
id = bb_bore(type);
module tube(od, id, h)
linear_extrude(height = h, center = true, convexity = 5)
linear_extrude(h, center = true, convexity = 5)
difference() {
circle(d = od);
circle(d = id);

View File

@@ -75,7 +75,7 @@ module battery(type) { //! Draw a battery
if(battery_usb_offset(type))
translate([battery_diameter(type) / 2, 0, len / 2 - battery_usb_offset(type) + h / 2])
rotate([-90, 0, 90])
linear_extrude(height = l + 1)
linear_extrude(l + 1)
offset(delta = t)
D();
}
@@ -87,14 +87,14 @@ module battery(type) { //! Draw a battery
if(battery_usb_offset(type))
translate([battery_diameter(type) / 2 - 1, 0, len / 2 - battery_usb_offset(type) + h / 2])
rotate([-90, 0, 90]) {
linear_extrude(height = l)
linear_extrude(l)
difference() {
offset(t) D();
D();
}
translate_z(l - 1)
linear_extrude(height = 1)
linear_extrude(1)
D();
}
@@ -132,7 +132,7 @@ module battery_contact(type, pos = true) { //! Draw a positive or negative batte
translate([0, -h / 2, t])
rotate([90, 0, 0])
linear_extrude(height = t)
linear_extrude(t)
difference() {
hull() {
translate([-tw / 2, -1])

View File

@@ -62,7 +62,7 @@ module belt(type, points, gap = 0, gap_pt = undef, belt_colour = grey20, tooth_c
square([gap, thickness + eps], center = true);
color(belt_colour)
linear_extrude(height = width, center = true)
linear_extrude(width, center = true)
difference() {
offset(thickness - belt_pitch_height(type)) shape();
offset(-belt_pitch_height(type) + belt_tooth_height(type)) shape();
@@ -70,7 +70,7 @@ module belt(type, points, gap = 0, gap_pt = undef, belt_colour = grey20, tooth_c
}
color(tooth_colour)
linear_extrude(height = width, center = true)
linear_extrude(width, center = true)
difference() {
offset(-belt_pitch_height(type) + belt_tooth_height(type)) shape();
offset(-belt_pitch_height(type)) shape();

View File

@@ -72,7 +72,7 @@ module blower(type) { //! Draw specified blower
color(fan_colour) {
// screw lugs
linear_extrude(height = blower_lug(type), center = false)
linear_extrude(blower_lug(type), center = false)
for(hole = blower_screw_holes(type))
difference() {
hull() {
@@ -94,7 +94,7 @@ module blower(type) { //! Draw specified blower
*%square([length, width]);
// base
linear_extrude(height = blower_base(type))
linear_extrude(blower_base(type))
difference() {
shape();
@@ -102,7 +102,7 @@ module blower(type) { //! Draw specified blower
circle(d = 2);
}
// sides
linear_extrude(height = depth)
linear_extrude(depth)
difference() {
shape();
@@ -112,7 +112,7 @@ module blower(type) { //! Draw specified blower
// top
translate_z(depth -blower_top(type))
linear_extrude(height = blower_top(type))
linear_extrude(blower_top(type))
difference() {
shape();

View File

@@ -34,7 +34,7 @@ function cable_strip_thickness() = cable_strip_thickness;
use <../utils/bezier.scad>
use <../utils/sweep.scad>
cable_strip_color = "green";
cable_strip_colour = "green";
function cable_strip_control_points(depth, min_z, pos) = let(z = min(min_z, min_z + pos))
[
@@ -62,7 +62,7 @@ module bezier_cable_strip(ways, depth, length, below, extra, pos = 0) { //! Draw
path = [v[0] + extra_v, each bezier_path(v, steps), v[3] + extra_v];
color(cable_strip_color)
color(cable_strip_colour)
translate_z(-extra)
sweep(path, rectangle_points(width, thickness));
*echo(cable_strip_lengh = length);
@@ -89,7 +89,7 @@ module cable_strip(ways, depth, travel, extra = 15, pos = 0) { //! Draw a cable
vitamin(str("cable_strip(", ways, ", ", depth, ", ", travel, arg(extra, 15), "): Polypropylene strip ", total, "mm x ", w, "mm x ", thickness, "mm"));
color(cable_strip_color) linear_extrude(height = w, center = true, convexity = 4)
color(cable_strip_colour) linear_extrude(w, center = true, convexity = 4)
difference() {
union() {
translate([-bottom, radius])
@@ -142,7 +142,7 @@ module elliptical_cable_strip(ways, p1, p2, pmax, extra = 15) {
[delta[2] / delta[0], 0, 1, delta[2] / 2],
[0, 0, 0, 1] ])
color(cable_strip_color) linear_extrude(height = w, center = true, convexity = 4)
color(cable_strip_colour) linear_extrude(w, center = true, convexity = 4)
difference() {
union() {
square([(a + thickness) * 2, extra * 2], center = true);

90
vitamins/circlip.scad Normal file
View File

@@ -0,0 +1,90 @@
//
// NopSCADlib Copyright Chris Palmer 2020
// nop.head@gmail.com
// hydraraptor.blogspot.com
//
// This file is part of NopSCADlib.
//
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
// GNU General Public License as published by the Free Software Foundation, either version 3 of
// the License, or (at your option) any later version.
//
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along with NopSCADlib.
// If not, see <https://www.gnu.org/licenses/>.
//
//
//! Circlips aka tapered retaining rings.
//
include <../utils/core/core.scad>
include <../utils/sector.scad>
include <../utils/round.scad>
include <../utils/maths.scad>
function circlip_d1(type) = type[1]; //! Nominal OD, i.e. diameter of tube
function circlip_d2(type) = type[2]; //! Groove diameter, i.e. OD when installed
function circlip_d3(type) = type[3]; //! Relaxed OD when not installed
function circlip_thickness(type) = type[4]; //! Thickness
function circlip_a(type) = type[5]; //! Size of the lugs
function circlip_b(type) = type[6]; //! Widest part of the taper
function circlip_d5(type) = type[7]; //! Plier hole diameter
circlip_colour = grey20;
closed_angle = 25;
module internal_circlip(type, open = 0) { //! Draw specified internal circlip, open = 0, for nominal size installed, 1 for relaxed uninstalled, -1 for squeezed to install
d1 = circlip_d1(type);
vitamin(str("circlip(", type[0], "): Circlip internal ", d1, "mm"));
d3 = circlip_d3(type);
d2 = circlip_d2(type);
a = circlip_a(type);
b = circlip_b(type);
d5 = circlip_d5(type);
od = lookup(open, [[-1, d1], [0, d2], [1, d3]]);
or = od / 2;
c = (d3 - d1);
angle = (od - d1) / d1 * 360 + closed_angle;
tab_angle = 360 * a / PI / od;
p = [0, -or + b / 2, 1] * rot3_z(angle / 2 + tab_angle);
pitch = (or - a / 2);
y_offset = (sqr(p.x) + sqr(p.y) - sqr(or - b)) / (or - b - p.y) / 2;
ir = or - b + y_offset;
color(circlip_colour)
linear_extrude(circlip_thickness(type), center = true)
round((a - d5) / 5)
union() {
difference() {
circle(or);
translate([0, -y_offset])
circle(ir);
sector(d3 / 2 + 1, 270 - angle / 2 - tab_angle, 270 + angle / 2 + tab_angle);
}
for(side = [-1, 1])
intersection() {
circle(or);
rotate(side * (angle + tab_angle) / 2)
difference() {
hull() {
translate([0, -pitch])
circle(d = a);
translate([0, -pitch - a])
circle(d = 1.5 * a);
}
translate([0, -pitch])
circle(d = d5);
}
}
}
}

28
vitamins/circlips.scad Normal file
View File

@@ -0,0 +1,28 @@
//
// NopSCADlib Copyright Chris Palmer 2020
// nop.head@gmail.com
// hydraraptor.blogspot.com
//
// This file is part of NopSCADlib.
//
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
// GNU General Public License as published by the Free Software Foundation, either version 3 of
// the License, or (at your option) any later version.
//
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along with NopSCADlib.
// If not, see <https://www.gnu.org/licenses/>.
//
// d1 d2 d3 s a b d5
circlip_12i = ["circlip_12i", 12, 12.5, 13.0, 1.0, 3.4, 1.7, 1.5];
circlip_15i = ["circlip_15i", 15, 15.7, 16.2, 1.0, 3.7, 2.0, 1.7];
circlip_19i = ["circlip_19i", 19, 20.0, 20.5, 1.0, 4.1, 2.2, 2.0];
circlip_21i = ["circlip_21i", 21, 22.0, 22.5, 1.0, 4.2, 2.4, 2.0];
circlip_28i = ["circlip_28i", 28, 29.4, 30.1, 1.2, 4.8, 2.9, 2.0];
circlips = [circlip_12i, circlip_15i, circlip_19i, circlip_21i, circlip_28i];
use <circlip.scad>

View File

@@ -147,7 +147,7 @@ module al_clad_resistor(type, value, leads = true) { //! Draw an aluminium clad
color("silver") {
rotate([90, 0, 90])
linear_extrude(height = length, center = true)
linear_extrude(length, center = true)
hull() {
translate([0, al_clad_height(type) / 2])
intersection() {
@@ -158,7 +158,7 @@ module al_clad_resistor(type, value, leads = true) { //! Draw an aluminium clad
translate([0, thickness / 2])
square([body, thickness], center = true);
}
linear_extrude(height = thickness)
linear_extrude(thickness)
difference() {
for(end = [-1, 1])
translate([end * (length - tab) / 2, end * (width - width / 2) / 2])
@@ -176,7 +176,7 @@ module al_clad_resistor(type, value, leads = true) { //! Draw an aluminium clad
for(end = [-1, 1])
translate([end * (al_clad_wire_length(type) - terminal_l) / 2, 0, height / 2])
rotate([90, 0, 0])
linear_extrude(height = terminal_t, center = true) difference() {
linear_extrude(terminal_t, center = true) difference() {
square([terminal_l, terminal_h], center = true);
circle(r = 1);
@@ -226,7 +226,7 @@ module TO220(description, leads = 3, lead_length = 16) { //! Draw a TO220 packa
translate([0, -length + hole_y]) {
color("silver") {
linear_extrude(height = TO220_thickness())
linear_extrude(TO220_thickness())
difference() {
translate([-width / 2, inset])
square([width, length - inset]);
@@ -305,7 +305,7 @@ module panel_USBA() { //! Draw a panel mount USBA connector
vflip() {
color("dimgrey") {
linear_extrude(height = thickness)
linear_extrude(thickness)
difference() {
hull()
for(side = [-1, 1])
@@ -345,14 +345,14 @@ module panel_USBA() { //! Draw a panel mount USBA connector
}
translate_z(height3)
linear_extrude(height = l - height3)
linear_extrude(l - height3)
difference() {
rounded_square([length2, width], r = r1);
square([w - flange_t, h - flange_t], center = true);
}
linear_extrude(height = height3)
linear_extrude(height3)
difference() {
rounded_square([length2, width], r = r1);
@@ -363,7 +363,7 @@ module panel_USBA() { //! Draw a panel mount USBA connector
*cube([12, 4.5, 32], center = true);
color("silver") {
linear_extrude(height = l)
linear_extrude(l)
difference() {
square([w, h], center = true);
@@ -373,7 +373,7 @@ module panel_USBA() { //! Draw a panel mount USBA connector
translate_z(l - flange_t / 2)
cube([w, h, flange_t], center = true);
linear_extrude(height = flange_t)
linear_extrude(flange_t)
difference() {
union() {
square([h_flange_l, h + 2 * h_flange_h], center = true);
@@ -418,7 +418,7 @@ module thermal_cutout(type) { //! Draw specified thermal cutout
spade = spade6p4;
color("silver") {
linear_extrude(height = tc_thickness(type))
linear_extrude(tc_thickness(type))
difference() {
hull()
for(side = [-1, 1])

View File

@@ -23,9 +23,9 @@
include <../utils/core/core.scad>
use <../utils/thread.scad>
d_pillar_color = grey90;
d_plug_shell_color = grey80;
d_plug_insulator_color = grey20;
d_pillar_colour = grey90;
d_plug_shell_colour = grey80;
d_plug_insulator_colour = grey20;
function d_flange_length(type) = type[1]; //! Length of the flange
function d_lengths(type) = type[2]; //! Lengths of the D for plug and socket
@@ -56,20 +56,20 @@ module d_pillar() { //! Draw a pillar for a D-connector
translate_z(-screw_length)
if(show_threads)
male_metric_thread(screw, pitch, screw_length, false, top = 0, colour = d_pillar_color);
male_metric_thread(screw, pitch, screw_length, false, top = 0, colour = d_pillar_colour);
else
color(d_pillar_color)
color(d_pillar_colour)
cylinder(d = screw, h = screw_length + 1);
color(d_pillar_color) {
linear_extrude(height = height)
color(d_pillar_colour) {
linear_extrude(height)
difference() {
circle(r = rad, $fn = 6);
circle(d = screw);
}
}
if(show_threads)
female_metric_thread(screw, pitch, height, false, colour = d_pillar_color);
female_metric_thread(screw, pitch, height, false, colour = d_pillar_colour);
}
module d_plug(type, socket = false, pcb = false, idc = false) { //! Draw specified D plug, which can be IDC, PCB or plain solder bucket
@@ -106,8 +106,8 @@ module d_plug(type, socket = false, pcb = false, idc = false) { //! Draw specifi
//
// Shell
//
color(d_plug_shell_color) {
linear_extrude(height = d_flange_thickness(type))
color(d_plug_shell_colour) {
linear_extrude( d_flange_thickness(type))
difference() {
rounded_square([flange_length, flange_width], 2);
@@ -115,7 +115,7 @@ module d_plug(type, socket = false, pcb = false, idc = false) { //! Draw specifi
circle(hole_r);
}
linear_extrude(height = front_height, convexity = 5)
linear_extrude(front_height, convexity = 5)
difference() {
D(d_length, d_width, 2.5);
D(d_length - 2 * dwall, d_width - 2 * dwall, 2.5 - dwall);
@@ -123,21 +123,21 @@ module d_plug(type, socket = false, pcb = false, idc = false) { //! Draw specifi
if(!idc)
rotate([0,180,0])
linear_extrude(height = back_height, convexity = 5)
linear_extrude(back_height, convexity = 5)
D(d_lengths(type)[0] + 2 * dwall, d_widths(type)[0] + 2 * dwall, 2.5 + dwall);
}
//
// Insulator
//
color(d_plug_insulator_color) {
color(d_plug_insulator_colour) {
translate_z(d_flange_thickness(type) + eps)
rotate([0, 180, 0])
linear_extrude(height = back_height + 1 + d_flange_thickness(type), convexity = 5)
linear_extrude(back_height + 1 + d_flange_thickness(type), convexity = 5)
D(d_length - dwall, d_width - dwall, 2.5 - dwall/2);
if(socket)
linear_extrude(height = front_height - eps, convexity = 5)
linear_extrude(front_height - eps, convexity = 5)
difference() {
D(d_length - dwall, d_width - dwall, 2.5 - dwall/2);
@@ -169,11 +169,11 @@ module d_plug(type, socket = false, pcb = false, idc = false) { //! Draw specifi
if(pcb)
rotate([0, 180, 0]) {
linear_extrude(height = back_height + 1 + 4.5)
linear_extrude(back_height + 1 + 4.5)
pin_positions()
circle(r = 0.75 / 2, $fn = 12);
linear_extrude(height = back_height + 1 + 1)
linear_extrude(back_height + 1 + 1)
pin_positions()
circle(r = 0.75, $fn = 12);
}
@@ -183,7 +183,7 @@ module d_plug(type, socket = false, pcb = false, idc = false) { //! Draw specifi
pin_positions()
rotate(180 + ($i % 2) * 180)
render() difference() {
linear_extrude(height = 8)
linear_extrude(8)
difference() {
circle(1);

View File

@@ -80,10 +80,10 @@ module fan(type) { //! Draw specified fan, origin in the centre
if(middle > 0) {
for(z = [-1, 1])
translate_z(z * (depth - thickness) / 2)
linear_extrude(height = thickness, center = true)
linear_extrude(thickness, center = true)
shape();
linear_extrude(height = middle, center = true)
linear_extrude(middle, center = true)
difference() {
shape();
difference() {
@@ -100,13 +100,13 @@ module fan(type) { //! Draw specified fan, origin in the centre
}
}
else
linear_extrude(height = depth, center = true)
linear_extrude(depth, center = true)
shape();
// Blades
blade_ir = fan_hub(type) / 2 - 1;
blade_len = fan_bore(type) / 2 - 0.75 - blade_ir;
linear_extrude(height = depth - 1, center = true, convexity = 4, twist = -30, slices = round(depth / 2))
linear_extrude(depth - 1, center = true, convexity = 4, twist = -30, slices = round(depth / 2))
for(i = [0 : fan_blades(type) - 1])
rotate((360 * i) / fan_blades(type))
translate([blade_ir, -1.5 / 2])

View File

@@ -68,7 +68,7 @@ module fuseholder(thickness) { //! Fuseholder with nut in place for specified pa
color(colour) {
tube(or = nut_d / 2, ir = thread_d / 2, h = nut_flange_t, center = false);
linear_extrude(height = nut_t)
linear_extrude(nut_t)
difference() {
circle(d = nut_d, $fn = 6);
@@ -87,7 +87,7 @@ module fuseholder(thickness) { //! Fuseholder with nut in place for specified pa
cylinder(r = 5, h = flange_t - 1);
linear_extrude(height = flange_t)
linear_extrude(flange_t)
difference() {
circle(r = 5);
@@ -96,7 +96,7 @@ module fuseholder(thickness) { //! Fuseholder with nut in place for specified pa
vflip() {
if(!show_threads)
linear_extrude(height = thread)
linear_extrude(thread)
intersection() {
circle(d = thread_d - 0.3);
@@ -127,7 +127,7 @@ module fuseholder(thickness) { //! Fuseholder with nut in place for specified pa
for(side = [-1, 1])
translate([side * contact_slot_d / 2, 0, contact_slot_z])
rotate([0, -70, 90 - side * 90])
linear_extrude(height = contact_t, center = true) difference() {
linear_extrude(contact_t, center = true) difference() {
hull() {
square([eps, contact_w], center = true);

View File

@@ -61,7 +61,7 @@ module geared_stepper(type) { //! Draw the specified geared stepper
cylinder(d = gs_boss_d(type), h = 2 * gs_boss_h(type), center = true);
linear_extrude(height = gs_lug_t(type))
linear_extrude(gs_lug_t(type))
difference() {
hull()
geared_stepper_screw_positions(type)
@@ -78,7 +78,7 @@ module geared_stepper(type) { //! Draw the specified geared stepper
color(brass) {
d = gs_shaft_d(type);
h = gs_shaft_length(type);
linear_extrude(height = h)
linear_extrude(h)
intersection() {
circle(d = d);
@@ -95,7 +95,7 @@ module geared_stepper(type) { //! Draw the specified geared stepper
h2 = gs_bulge2_h(type);
translate([0, - offset, h1 + 1 - h2])
linear_extrude(height = h2)
linear_extrude(h2)
round(0.5)
intersection() {
circle(gs_bulge2_d(type));

View File

@@ -80,7 +80,7 @@ module green_terminal(type, ways, skip = [], colour = "lime") { //! Draw green t
color(colour) {
rotate([90, 0, 0])
linear_extrude(height = pitch, center = true, convexity = 5)
linear_extrude(pitch, center = true, convexity = 5)
polygon(points = [ // Vertical section
[y + depth / 2, 0],
[y + depth / 2, ledge_height / 2 - box_h1 / 2],
@@ -105,7 +105,7 @@ module green_terminal(type, ways, skip = [], colour = "lime") { //! Draw green t
]);
translate([y2, 0, ledge_height / 2 + box_h2 / 2]) // Screw socket
linear_extrude(height = height - ledge_height / 2 - box_h2 / 2)
linear_extrude(height - ledge_height / 2 - box_h2 / 2)
difference() {
square([screw_r * 2 + 0.1, pitch], center = true);
@@ -113,7 +113,7 @@ module green_terminal(type, ways, skip = [], colour = "lime") { //! Draw green t
}
linear_extrude(height = ledge_height)
linear_extrude(ledge_height)
intersection() {
horizontal_section();
@@ -121,7 +121,7 @@ module green_terminal(type, ways, skip = [], colour = "lime") { //! Draw green t
square([10, 10]);
}
linear_extrude(height = back)
linear_extrude(back)
intersection() {
horizontal_section();
@@ -131,7 +131,7 @@ module green_terminal(type, ways, skip = [], colour = "lime") { //! Draw green t
if(tube_h)
translate([y2, 0, height])
linear_extrude(height = tube_h - height)
linear_extrude(tube_h - height)
intersection() {
ring(or = top / 2, ir = screw_r);
@@ -149,7 +149,7 @@ module green_terminal(type, ways, skip = [], colour = "lime") { //! Draw green t
cylinder(r = screw_r, h = slot_depth);
translate_z(screw_top - slot_depth) // screw head
linear_extrude(height = slot_depth)
linear_extrude(slot_depth)
difference() {
circle(screw_r);
@@ -158,7 +158,7 @@ module green_terminal(type, ways, skip = [], colour = "lime") { //! Draw green t
}
translate([box_back, 0, ledge_height / 2]) {
rotate([0, 90, 0])
linear_extrude(height = box_front - box_back)
linear_extrude(box_front - box_back)
difference() {
square([box_h2, box_w2], center = true);

View File

@@ -69,7 +69,7 @@ module hygrometer() { //! Draw a hygrometer
cylinder(d = apperture_d, h = eps);
color("black")
linear_extrude(height = 0.2, center = true) {
linear_extrude(0.2, center = true) {
translate([0, 3])
text("20_4", font = "7 segment", valign = "bottom", halign = "center", size = apperture_d / 6);

View File

@@ -137,7 +137,7 @@ module iec(type) { //! Draw specified IEC connector
color(grey20) {
// Flange
flange_t = iec_flange_t(type);
linear_extrude(height = flange_t)
linear_extrude(flange_t)
difference() {
hull() {
rounded_square([iec_flange_w(type), iec_flange_h(type)], iec_flange_r(type));
@@ -164,7 +164,7 @@ module iec(type) { //! Draw specified IEC connector
}
// Bezel
translate_z(iec_flange_t(type))
linear_extrude(height = iec_bezel_t(type))
linear_extrude(iec_bezel_t(type))
difference() {
rounded_square([iec_bezel_w(type), iec_bezel_h(type)], iec_bezel_r(type));
@@ -174,7 +174,7 @@ module iec(type) { //! Draw specified IEC connector
// Body
h = socket_d - iec_flange_t(type) - iec_bezel_t(type);
translate_z(-h)
linear_extrude(height = h)
linear_extrude(h)
difference() {
body_shape();
@@ -182,7 +182,7 @@ module iec(type) { //! Draw specified IEC connector
}
// Back
translate_z(-iec_depth(type))
linear_extrude(height = iec_depth(type) - h)
linear_extrude(iec_depth(type) - h)
body_shape();
}
if(!iec_male(type))

View File

@@ -108,10 +108,10 @@ module insert_boss(type, z, wall = 2 * extrusion_width) { //! Make a boss to tak
hull()
poly_ring(or, ir);
linear_extrude(height = z)
linear_extrude(z)
poly_ring(or, ir);
linear_extrude(height = z - insert_hole_length(type))
linear_extrude(z - insert_hole_length(type))
difference() {
shape();
@@ -119,7 +119,7 @@ module insert_boss(type, z, wall = 2 * extrusion_width) { //! Make a boss to tak
}
if(z > insert_hole_length(type) + 2 * layer_height)
linear_extrude(height = 2 * layer_height) // cap the end if room
linear_extrude(2 * layer_height) // cap the end if room
shape();
}
@@ -143,7 +143,7 @@ module insert_lug(insert, wall, counter_bore = 0, extension = 0, corner_r = 0, f
}
translate_z(-boss_h)
linear_extrude(height = boss_h)
linear_extrude(boss_h)
difference() {
shape();
@@ -152,7 +152,7 @@ module insert_lug(insert, wall, counter_bore = 0, extension = 0, corner_r = 0, f
// insert boss counter_bore
translate_z(-boss_h2) {
linear_extrude(height = counter_bore + eps)
linear_extrude(counter_bore + eps)
difference() {
shape();
@@ -162,7 +162,7 @@ module insert_lug(insert, wall, counter_bore = 0, extension = 0, corner_r = 0, f
// support cone
if(flying)
hull() {
linear_extrude(height = eps)
linear_extrude(eps)
shape();
translate([boss_r + extension - wall - eps, 0, - (2 * boss_r + extension - wall)])

View File

@@ -206,7 +206,7 @@ module post_4mm(colour, thickness, display_colour = false) { //! Draw a 4mm bind
nut_t = 2.3;
color(silver)
linear_extrude(height = nut_t) difference() {
linear_extrude(nut_t) difference() {
circle(d = 6.3 / cos(30), $fn = 6);
circle(d = thread_d);
@@ -229,7 +229,7 @@ module post_4mm(colour, thickness, display_colour = false) { //! Draw a 4mm bind
cylinder(d = d, h = base_h);
translate_z(-collar_t)
linear_extrude(height = base_h) {
linear_extrude(base_h) {
circle(post_4mm_hole_radius - 0.1);
spigot();
@@ -284,7 +284,7 @@ module post_4mm(colour, thickness, display_colour = false) { //! Draw a 4mm bind
explode(-15)
color(actual_colour) {
translate_z(-thickness - base_h) {
linear_extrude(height = base_h)
linear_extrude(base_h)
difference() {
circle(d = d);

View File

@@ -52,7 +52,7 @@ module heater_block(type, resistor, thermistor) {
color(brass) {
render() difference() {
rotate([90, 0, 0])
linear_extrude(height = heater_width(type), center = true) difference() {
linear_extrude(heater_width(type), center = true) difference() {
square([heater_length(type), h], center = true);
translate([resistor_x(type), 0])

View File

@@ -25,7 +25,7 @@ use <../utils/tube.scad>
use <washer.scad>
use <ball_bearing.scad>
kp_pillow_block_color = grey70;
kp_pillow_block_colour = grey70;
function kp_diameter(type) = type[1]; //! Rod hole diameter
function kp_hole_offset(type) = type[2]; //! Rod hole offset
@@ -50,7 +50,7 @@ module kp_pillow_block(type) { //! Draw the KP pillow block
b = type[11];
bolthole_radius = type[12];
color(kp_pillow_block_color)
color(kp_pillow_block_colour)
translate([0, -H, 0]) {
fillet = 1;
squareSizeX = (L - H0) / 2 + fillet;

View File

@@ -71,17 +71,17 @@ module LDR(type, lead_length = 3) { //! Draw an LDR, can specify the lead length
t = ldr_thickness(type);
color("white")
linear_extrude(height = t - 0.4)
linear_extrude(t - 0.4)
shape();
color("orange")
translate_z(t - 0.4)
linear_extrude(height = 0.1)
linear_extrude(0.1)
shape();
color([0.9, 0.9, 0.9])
translate_z(t - 0.3)
linear_extrude(height = 0.1)
linear_extrude(0.1)
difference() {
offset(-serpentine_t())
shape();
@@ -100,6 +100,6 @@ module LDR(type, lead_length = 3) { //! Draw an LDR, can specify the lead length
}
color([1, 1, 1, 0.25])
translate_z(t - 0.3 + eps)
linear_extrude(height = 0.3)
linear_extrude(0.3)
shape();
}

View File

@@ -64,7 +64,7 @@ module leadnut(type) { //! Draw specified leadnut
thread(bore_d, lead, h, thread_profile(pitch / 2, pitch * 0.366, 30), false, starts = lead / pitch, female = true, solid = false);
translate_z(leadnut_flange_offset(type))
linear_extrude(height = leadnut_flange_t(type))
linear_extrude(leadnut_flange_t(type))
difference() {
circle(d = leadnut_flange_dia(type));

View File

@@ -40,7 +40,7 @@ module led(type, colour = "red", lead = 5) { //! Draw specified LED with desired
rotate_extrude()
rounded_corner(r = d / 2, h = led_height(type), r2 = d / 2);
linear_extrude(height = led_rim_t(type))
linear_extrude(led_rim_t(type))
difference() {
circle(d = led_rim_dia(type));

View File

@@ -85,7 +85,7 @@ module light_strip(type, segs = undef) { //! Draw specified light strip, segs ca
color("silver")
rotate([90, 0, 90])
linear_extrude(height = l, center = true)
linear_extrude(l, center = true)
polygon([
[ x1, 0], [ x1, d], [ x2, d], [ x3, y5], [ x3, y4], [ x2, y4],
[ x2, y3], [ x3, y3], [ x3, y2], [ x2, y2], [ x2, y1],
@@ -99,42 +99,42 @@ module light_strip(type, segs = undef) { //! Draw specified light strip, segs ca
translate_z(y4) {
color("white")
linear_extrude(height = 1.6)
linear_extrude(1.6)
led_positions()
square([5, 5], center = true);
color("yellow")
linear_extrude(height = 1.6 + eps)
linear_extrude(1.6 + eps)
led_positions()
circle(d = 3.5);
color("silver")
linear_extrude(height = 0.8)
linear_extrude(0.8)
led_positions()
for(side = [-1,1], end = [-1:1])
translate([side * 2.2, end * 1.6])
square([1, 0.9], center = true);
color("black")
linear_extrude(height = 0.1)
linear_extrude(0.1)
segment_positions(segments - 1)
translate([segment_length, 0])
square([0.2, a], center = true);
color("silver")
linear_extrude(height = 0.15)
linear_extrude(0.15)
segment_positions()
for(end = [-1, 1], side = [-1, 1])
translate([end * (segment_length / 2 - 1.25) + segment_length / 2, side * 2.5])
square(2.5, center = true);
color("silver")
linear_extrude(height = 0.55)
linear_extrude(0.55)
resistor_positions()
square([3.2, 1.5], center = true);
color("black")
linear_extrude(height = 0.55 + eps)
linear_extrude(0.55 + eps)
resistor_positions()
square([2.1, 1.5 + 2 * eps], center = true);
@@ -152,7 +152,7 @@ function light_strip_clip_length(light) = light_strip_clip_slot(light) + 2 * wal
function light_strip_clip_width(light) = light_strip_depth(light) + 2 * wall; //! Outside width
module light_strip_clip(light) { //! Make a clip to go over the strip to be incorporated into a bracket
linear_extrude(height = light_strip_clip_depth(light), convexity = 2)
linear_extrude(light_strip_clip_depth(light), convexity = 2)
difference() {
translate([-light_strip_clip_length(light) / 2, -wall])
square([light_strip_clip_length(light), light_strip_clip_width(light)]);

View File

@@ -26,7 +26,7 @@ use <../utils/tube.scad>
bearing_colour = grey70;
groove_colour = grey60;
seal_colour = grey20;
seal_colour = grey30;
function bearing_length(type) = type[1]; //! Total length
@@ -61,5 +61,10 @@ module linear_bearing(type) { //! Draw specified linear bearing
color(bearing_colour) translate_z(offset+gs) tube(or = or, ir = casing_ir, h = offset, center = false);
}
}
color(seal_colour) tube(or = casing_ir, ir = bearing_rod_dia(type) / 2, h = length - 0.5);
rod_r = bearing_rod_dia(type) / 2;
color(seal_colour)
tube(or = casing_ir, ir = rod_r + eps, h = length - 0.5);
color(seal_colour * 0.8)
tube(or = rod_r * 1.12, ir = rod_r, h = length);
}

View File

@@ -87,10 +87,10 @@ module mains_socket(type) { //! Draw specified 13A socket
color("white") render() difference() {
hull() {
linear_extrude(height = eps)
linear_extrude(eps)
face_plate(type);
linear_extrude(height = height)
linear_extrude(height)
offset(-(mains_socket_width(type) - mains_socket_top_w(type)) / 2)
face_plate(type);
}
@@ -105,7 +105,7 @@ module mains_socket(type) { //! Draw specified 13A socket
}
// Hollow out the back
difference() {
linear_extrude(height = height - mains_socket_t(type))
linear_extrude(height - mains_socket_t(type))
offset(-mains_socket_t(type))
face_plate(type);

View File

@@ -56,7 +56,7 @@ module meter(type = led_meter, colour = "red", value = "888", display_colour = f
color("green")
translate_z(meter_height(type))
linear_extrude(height = meter_pcb_thickness(type))
linear_extrude(meter_pcb_thickness(type))
difference() {
union() {
square([meter_pcb_length(type), meter_pcb_width(type)], center = true);
@@ -68,7 +68,7 @@ module meter(type = led_meter, colour = "red", value = "888", display_colour = f
}
color(display_colour ? display_colour : colour)
linear_extrude(height = 0.2, center = true)
linear_extrude(0.2, center = true)
mirror([1,0,0])
text(value, font = "7 segment", valign = "center", halign = "center", size = meter_width(type) - 2, spacing = 1.2);
}
@@ -102,14 +102,14 @@ module meter_bezel(type = led_meter) { //! Generate the STL for the meter bezel
h = meter_height(type);
union() {
linear_extrude(height = h)
linear_extrude(h)
difference() {
rounded_square([l + 2 * wall, w + 2 * wall], rad);
square([l + 2 * clearance, w + 2 * clearance], center = true);
}
linear_extrude(height = flange_t)
linear_extrude(flange_t)
difference() {
rounded_square([l + 2 * wall + 2 * overlap, w + 2 * wall + 2 * overlap], rad + overlap);

View File

@@ -22,7 +22,7 @@
//
include <../utils/core/core.scad>
microswitch_contact_color = brass;
microswitch_contact_colour = brass;
function microswitch_thickness(type) = type[2]; //! Body thickness
function microswitch_width(type) = type[3]; //! Body width
@@ -63,7 +63,7 @@ module microswitch(type) { //! Draw specified microswitch
d = microswitch_button_t(type);
color(microswitch_body_clr(type))
linear_extrude(height = microswitch_thickness(type), center = true)
linear_extrude(microswitch_thickness(type), center = true)
difference() { // main body
rounded_square([microswitch_length(type), microswitch_width(type)], microswitch_radius(type));
@@ -73,7 +73,7 @@ module microswitch(type) { //! Draw specified microswitch
color(microswitch_button_clr(type)) // orange button
translate(microswitch_button_pos(type) - [0, d / 2])
linear_extrude(height = microswitch_button_w(type), center = true)
linear_extrude(microswitch_button_w(type), center = true)
hull() {
circle(d = d);
@@ -81,7 +81,7 @@ module microswitch(type) { //! Draw specified microswitch
circle(d = d);
}
color(microswitch_contact_color) // yellow contacts
color(microswitch_contact_colour) // yellow contacts
for(pos = microswitch_legs(type))
translate(pos) {
leg = microswitch_leg(type);
@@ -89,7 +89,7 @@ module microswitch(type) { //! Draw specified microswitch
if(vertical)
rotate([0, 90, 0])
linear_extrude(height = leg.x, center = true)
linear_extrude(leg.x, center = true)
difference() {
square([leg.z, leg.y], center = true);
@@ -99,7 +99,7 @@ module microswitch(type) { //! Draw specified microswitch
}
else
rotate([90, 0, 0])
linear_extrude(height = leg.y, center = true)
linear_extrude(leg.y, center = true)
difference() {
square([leg.x, leg.z], center = true);

Some files were not shown because too many files have changed in this diff Show More