Compare commits
10 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
a2d98f9d3a | ||
|
30c67e742b | ||
|
2506e5aa31 | ||
|
1f313aa4ac | ||
|
63a4271c4c | ||
|
0edf3a2f75 | ||
|
efb1153e22 | ||
|
a3b27a736e | ||
|
8540e04a10 | ||
|
4c6a2b177f |
19
CHANGELOG.md
@@ -3,6 +3,25 @@
|
||||
This changelog is generated by `changelog.py` using manually added semantic version tags to classify commits as breaking changes, additions or fixes.
|
||||
|
||||
|
||||
### [v21.14.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.14.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.13.1...v21.14.0 "diff with v21.13.1")
|
||||
* 2024-02-18 [`63a4271`](https://github.com/nophead/NopSCADlib/commit/63a4271c4c1bc97e93e67e8178515be1cfda9e43 "show commit") [C.P.](# "Chris Palmer") Updated libtest image.
|
||||
|
||||
* 2024-02-18 [`0edf3a2`](https://github.com/nophead/NopSCADlib/commit/0edf3a2f75d729aa663836878d278226e7bd8094 "show commit") [C.P.](# "Chris Palmer") Cable clips can now handle up to 9 wires, have the nut and bolt flipped or use an insert.
|
||||
`cable_radius()` now handles cables with up to 20 wires.
|
||||
`cable_bundle()` and `cable_bundle_positions()` now handle bundles up to 9 wires.
|
||||
Added `cable_merge()`.
|
||||
|
||||
#### [v21.13.1](https://github.com/nophead/NopSCADlib/releases/tag/v21.13.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v21.13.0...v21.13.1 "diff with v21.13.0")
|
||||
* 2024-02-10 [`8540e04`](https://github.com/nophead/NopSCADlib/commit/8540e04a10d83be4ff454fa8999614e5137dd0ab "show commit") [C.P.](# "Chris Palmer") Metal hex pillars now chamfered.
|
||||
|
||||
### [v21.13.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.13.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.12.0...v21.13.0 "diff with v21.12.0")
|
||||
* 2024-02-10 [`7947810`](https://github.com/nophead/NopSCADlib/commit/79478104d6b3a8673ae405606d2576ad98c4e90e "show commit") [C.P.](# "Chris Palmer") Dome option added to nut to draw acorn nuts.
|
||||
Chamfers added to nuts and hex head screws when manifold is used.
|
||||
|
||||
* 2024-02-10 [`38196e9`](https://github.com/nophead/NopSCADlib/commit/38196e9f78f07d0f9a4eca0355cc6e99f29332fb "show commit") [C.P.](# "Chris Palmer") Mods to allow the manifold experimental option to be used.
|
||||
|
||||
* 2024-02-05 [`9666c01`](https://github.com/nophead/NopSCADlib/commit/9666c018a0a99be8d24a2454a4c1448b09f83af0 "show commit") [C.P.](# "Chris Palmer") Made sheet overridable in `box_base_blank()`.
|
||||
|
||||
### [v21.12.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.12.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.11.0...v21.12.0 "diff with v21.11.0")
|
||||
* 2024-02-05 [`38988ba`](https://github.com/nophead/NopSCADlib/commit/38988bacfa41dea19408b19cf06f134e51338ab0 "show commit") [C.P.](# "Chris Palmer") Updated images.
|
||||
|
||||
|
BIN
libtest.png
Before Width: | Height: | Size: 977 KiB After Width: | Height: | Size: 975 KiB |
@@ -228,7 +228,8 @@ inserts_y = 0;
|
||||
nuts_y = inserts_y + 20;
|
||||
washers_y = nuts_y + 140;
|
||||
screws_y = washers_y + 120;
|
||||
circlips_y = screws_y + 180;
|
||||
threaded_inserts_y = screws_y + 180;
|
||||
circlips_y = threaded_inserts_y + 30;
|
||||
springs_y = circlips_y + 20;
|
||||
o_rings_y = springs_y;
|
||||
sealing_strip_y = springs_y + 20;
|
||||
@@ -258,6 +259,9 @@ translate([x0, nuts_y])
|
||||
translate([x0, washers_y])
|
||||
washers();
|
||||
|
||||
translate([x0, threaded_inserts_y])
|
||||
threaded_inserts();
|
||||
|
||||
translate([x0, screws_y])
|
||||
screws();
|
||||
|
||||
|
@@ -18,100 +18,129 @@
|
||||
//
|
||||
|
||||
//
|
||||
//! Cable clips to order. Can be for one or two cables of different sizes.
|
||||
//! Cable clips to order. Can be for one or two cables of different sizes. Can use an insert and a screw from below or a screw and nut either way up.
|
||||
//
|
||||
include <../core.scad>
|
||||
use <../vitamins/wire.scad>
|
||||
use <../utils/fillet.scad>
|
||||
use <../vitamins/insert.scad>
|
||||
|
||||
wall = 2;
|
||||
|
||||
function cable_clip_width(screw) = max(wall + 2 * screw_clearance_radius(screw) + wall, washer_diameter(screw_washer(screw))); //! Width given the `screw`.
|
||||
function cable_clip_height(cable) = cable_height(cable) + wall; //! Height given the `cable`.
|
||||
function cable_clip_extent(screw, cable) = screw_clearance_radius(screw) + wall + cable_width(cable) + wall; //! How far it extends from the screw.
|
||||
function cable_clip_offset(screw, cable) = screw_clearance_radius(screw) + wall + cable_width(cable) / 2; //! The offset of the cable from the screw
|
||||
function cable_clip_insert(screw, insert = true) = //! Insert type for clip, given screw.
|
||||
is_list(insert) ? insert : insert ? screw_insert(screw, true) : false;
|
||||
|
||||
module single_cable_clip(screw, cable, h = 0) {
|
||||
screw_dia = 2 * screw_clearance_radius(screw);
|
||||
height = cable_clip_width(screw);
|
||||
depth = h ? h : cable_height(cable) + wall;
|
||||
function cable_clip_width(screw, insert = false) = //! Width given the `screw` and possibly insert.
|
||||
let(insert = cable_clip_insert(screw, insert))
|
||||
insert ? 2 * (insert_hole_radius(insert) + wall) :
|
||||
max(wall + 2 * screw_clearance_radius(screw) + wall, washer_diameter(screw_washer(screw)));
|
||||
|
||||
function cable_clip_height(cable, screw = false, insert = false) = //! Height given the `cable`.
|
||||
let(insert = cable_clip_insert(screw, insert))
|
||||
max(cable_height(cable) + wall, insert ? insert_hole_length(insert) + 1 : 0);
|
||||
|
||||
function cable_clip_extent(screw, cable, insert = false) = cable_clip_width(screw, insert) / 2 + cable_width(cable) + wall; //! How far it extends from the screw.
|
||||
function cable_clip_offset(screw, cable, insert = false) = cable_clip_width(screw, insert) / 2 + cable_width(cable) / 2; //! The offset of the cable from the screw.
|
||||
|
||||
module single_cable_clip(screw, cable, h = 0, insert = false) {
|
||||
insert = cable_clip_insert(screw, insert);
|
||||
height = cable_clip_width(screw, insert);
|
||||
depth = h ? h : cable_clip_height(cable, screw, insert);
|
||||
w = cable_width(cable);
|
||||
width = wall + w + wall + screw_dia + wall;
|
||||
hole_x = wall + w + wall + screw_dia / 2;
|
||||
width = wall + w + height;
|
||||
hole_x = wall + w + height / 2;
|
||||
rad = min(wall + cable_wire_size(cable) / 2, depth / 2);
|
||||
r = extrusion_width - eps;
|
||||
translate([-hole_x, 0]) difference() {
|
||||
linear_extrude(height)
|
||||
difference() {
|
||||
hull() {
|
||||
rounded_square([width, 1], r, center = false);
|
||||
|
||||
translate([width - 1, 0])
|
||||
rounded_square([1, depth], r, center = false);
|
||||
|
||||
translate([rad, depth - rad])
|
||||
circle(r = rad);
|
||||
}
|
||||
|
||||
translate([wall + cable_width(cable) / 2, 0]) {
|
||||
translate([-hole_x, 0])
|
||||
difference() {
|
||||
linear_extrude(height)
|
||||
difference() {
|
||||
hull() {
|
||||
for(p = cable_bundle_positions(cable))
|
||||
translate(p)
|
||||
circle(d = cable_wire_size(cable));
|
||||
rounded_square([width, 1], r, center = false);
|
||||
|
||||
square([w, eps], center = true);
|
||||
translate([width - 1, 0])
|
||||
rounded_square([1, depth], r, center = false);
|
||||
|
||||
translate([rad, depth - rad])
|
||||
circle(r = rad);
|
||||
}
|
||||
|
||||
translate([wall + cable_width(cable) / 2, 0]) {
|
||||
hull() {
|
||||
for(p = cable_bundle_positions(cable))
|
||||
translate(p)
|
||||
circle(d = cable_wire_size(cable));
|
||||
|
||||
square([w, eps], center = true);
|
||||
}
|
||||
for(side = [-1, 1])
|
||||
translate([side * w / 2, 0])
|
||||
hflip(side < 0)
|
||||
fillet(r = r, h = 0);
|
||||
}
|
||||
for(side = [-1, 1])
|
||||
translate([side * w / 2, 0])
|
||||
hflip(side < 0)
|
||||
fillet(r = r, h = 0);
|
||||
}
|
||||
}
|
||||
|
||||
translate([hole_x, depth / 2, height / 2])
|
||||
rotate([90,0,0])
|
||||
teardrop_plus(h = depth + 1, r = screw_dia / 2, center = true);
|
||||
}
|
||||
translate([hole_x, depth, height / 2])
|
||||
rotate([90, 0, 0])
|
||||
if(insert)
|
||||
insert_hole(insert, 10, horizontal = true);
|
||||
else
|
||||
teardrop_plus(h = 2 * depth + 1, r = screw_clearance_radius(screw), center = true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
module double_cable_clip(screw, cable1, cable2) {
|
||||
h = max(cable_clip_height(cable1), cable_clip_height(cable2));
|
||||
module double_cable_clip(screw, cable1, cable2, insert = false) {
|
||||
h = max(cable_clip_height(cable1, screw, insert), cable_clip_height(cable2, screw, insert));
|
||||
union() {
|
||||
single_cable_clip(screw, cable1, h);
|
||||
single_cable_clip(screw, cable1, h, insert);
|
||||
|
||||
mirror([1,0,0]) single_cable_clip(screw, cable2, h);
|
||||
mirror([1,0,0]) single_cable_clip(screw, cable2, h, insert);
|
||||
}
|
||||
}
|
||||
|
||||
module cable_clip(screw, cable1, cable2 = 0) { //! Create the STL for a single cable or two cable clip
|
||||
function clip_str(screw) = str("cable_clip_", screw_radius(screw) * 20);
|
||||
module cable_clip(screw, cable1, cable2 = 0, insert = false) { //! Create the STL for a single cable or two cable clip
|
||||
function clip_str(screw) = str("cable_clip_", screw_radius(screw) * 20, insert ? "I" : "");
|
||||
function cable_str(cable) = str("_", cable_wires(cable), "_", round(cable_wire_size(cable) * 10));
|
||||
|
||||
if(cable2) {
|
||||
stl(str(clip_str(screw), cable_str(cable1), cable_str(cable2)));
|
||||
|
||||
double_cable_clip(screw, cable1, cable2);
|
||||
double_cable_clip(screw, cable1, cable2, insert);
|
||||
}
|
||||
else {
|
||||
stl(str(clip_str(screw), cable_str(cable1)));
|
||||
|
||||
single_cable_clip(screw, cable1);
|
||||
single_cable_clip(screw, cable1, h = 0, insert = insert);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
module cable_clip_assembly(screw, thickness, cable1, cable2 = 0) { //! Cable clip with the fasteners
|
||||
height = max(cable_clip_height(cable1), cable2 ? cable_clip_height(cable2) : 0);
|
||||
module cable_clip_assembly(screw, thickness, cable1, cable2 = 0, flip = false, insert = false) { //! Cable clip with the fasteners
|
||||
flip = flip || insert; // Screw must be below if using an insert
|
||||
insert = cable_clip_insert(screw, insert);
|
||||
height = max(cable_clip_height(cable1, screw, insert), cable2 ? cable_clip_height(cable2, screw, insert) : 0);
|
||||
|
||||
stl_colour(pp1_colour) render()
|
||||
translate([0, cable_clip_width(screw) / 2]) rotate([90, 0, 0])
|
||||
cable_clip(screw, cable1, cable2);
|
||||
translate([0, cable_clip_width(screw, insert) / 2])
|
||||
rotate([90, 0, 0])
|
||||
cable_clip(screw, cable1, cable2, insert);
|
||||
|
||||
nut = screw_nut(screw);
|
||||
screw_len = screw_length(screw, height + thickness, 2, nyloc = !insert, insert = insert);
|
||||
translate_z(height)
|
||||
screw_and_washer(screw, screw_length(screw, height + thickness, 2, nyloc = true));
|
||||
if(flip)
|
||||
if(insert)
|
||||
insert(insert);
|
||||
else
|
||||
nut_and_washer(nut, true);
|
||||
else
|
||||
screw_and_washer(screw, screw_len);
|
||||
|
||||
translate_z(-thickness)
|
||||
vflip()
|
||||
nut_and_washer(screw_nut(screw), true);
|
||||
if(flip)
|
||||
screw_and_washer(screw, screw_len, insert);
|
||||
else
|
||||
nut_and_washer(nut, true);
|
||||
}
|
||||
|
43
readme.md
@@ -1703,6 +1703,8 @@ Heatfit threaded inserts. Can be pushed into thermoplastics using a soldering ir
|
||||
| `insert_ring2_d(type)` | Diameter of the middle ring |
|
||||
| `insert_ring3_d(type)` | Diameter of the bottom ring |
|
||||
| `insert_screw_diameter(type)` | Screw size |
|
||||
| `threaded_insert_chamfer(type)` | Size of the chamfer for threaded inserts |
|
||||
| `threaded_insert_pitch(type)` | Pitch of the outer thread for threaded inserts |
|
||||
|
||||
### Functions
|
||||
| Function | Description |
|
||||
@@ -1718,6 +1720,7 @@ Heatfit threaded inserts. Can be pushed into thermoplastics using a soldering ir
|
||||
| `insert_boss(type, z, wall = 2 * extrusion_width)` | Make a boss to take an insert |
|
||||
| `insert_hole(type, counterbore = 0, horizontal = false)` | Make a hole to take an insert, `counterbore` is the extra length for the screw |
|
||||
| `insert_lug(insert, wall, counter_bore = 0, extension = 0, corner_r = 0, flying = true)` | Make a flying insert lug, see [ssr_shroud](#Ssr_shroud) |
|
||||
| `threaded_insert(type)` | Draw specified threaded insert, for use in wood |
|
||||
|
||||

|
||||
|
||||
@@ -1732,6 +1735,14 @@ Heatfit threaded inserts. Can be pushed into thermoplastics using a soldering ir
|
||||
| 1 | `insert(CNCKM4)` | Heatfit insert M4 x 4mm |
|
||||
| 1 | `insert(F1BM4)` | Heatfit insert M4 x 8.2mm |
|
||||
| 2 | `insert(CNCKM5)` | Heatfit insert M5 x 5.8mm |
|
||||
| 1 | `threaded_insert(M10x25)` | Threaded insert M10 x 25mm |
|
||||
| 1 | `threaded_insert(M12x30)` | Threaded insert M12 x 30mm |
|
||||
| 1 | `threaded_insert(M16x30)` | Threaded insert M16 x 30mm |
|
||||
| 1 | `threaded_insert(M3x8)` | Threaded insert M3 x 8mm |
|
||||
| 1 | `threaded_insert(M4x10)` | Threaded insert M4 x 10mm |
|
||||
| 1 | `threaded_insert(M5x12)` | Threaded insert M5 x 12mm |
|
||||
| 1 | `threaded_insert(M6x15)` | Threaded insert M6 x 15mm |
|
||||
| 1 | `threaded_insert(M8x18)` | Threaded insert M8 x 18mm |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -3010,6 +3021,7 @@ Threaded pillars. Each end can be male or female.
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `pillar_bot_thread(type)` | Bottom thread length, + for male, - for female |
|
||||
| `pillar_chamfered(type)` | True if pillar is chamfered |
|
||||
| `pillar_height(type)` | Body height |
|
||||
| `pillar_i_colour(type)` | Colour of the inner part |
|
||||
| `pillar_id(type)` | Inner diameter of metal part |
|
||||
@@ -4967,6 +4979,7 @@ Utilities for adding wires to the BOM and optionally drawing them and cable bund
|
||||
| `cable_bundle_positions(cable)` | Positions of wires in a bundle to go through a cable strip |
|
||||
| `cable_height(cable)` | Height in flat clip |
|
||||
| `cable_is_ribbon(cable)` | Is a ribbon cable? |
|
||||
| `cable_merge(cable1, cable2)` | Combine the wires of two cables |
|
||||
| `cable_radius(cable)` | Radius of a bundle of wires, see <http://mathworld.wolfram.com/CirclePacking.html>. |
|
||||
| `cable_tlen(cable)` | Twisted cable twist length |
|
||||
| `cable_twisted_radius(cable)` | Approximate radius of a cable when twisted |
|
||||
@@ -5270,7 +5283,7 @@ fixing_blocks along the sides.
|
||||
---
|
||||
<a name="cable_clip"></a>
|
||||
## Cable_clip
|
||||
Cable clips to order. Can be for one or two cables of different sizes.
|
||||
Cable clips to order. Can be for one or two cables of different sizes. Can use an insert and a screw from below or a screw and nut either way up.
|
||||
|
||||
[printed/cable_clip.scad](printed/cable_clip.scad) Implementation.
|
||||
|
||||
@@ -5279,35 +5292,41 @@ Cable clips to order. Can be for one or two cables of different sizes.
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `cable_clip_extent(screw, cable)` | How far it extends from the screw. |
|
||||
| `cable_clip_height(cable)` | Height given the `cable`. |
|
||||
| `cable_clip_offset(screw, cable)` | The offset of the cable from the screw |
|
||||
| `cable_clip_width(screw)` | Width given the `screw`. |
|
||||
| `cable_clip_extent(screw, cable, insert = false)` | How far it extends from the screw. |
|
||||
| `cable_clip_height(cable, screw = false, insert = false)` | Height given the `cable`. |
|
||||
| `cable_clip_insert(screw, insert = true)` | Insert type for clip, given screw. |
|
||||
| `cable_clip_offset(screw, cable, insert = false)` | The offset of the cable from the screw. |
|
||||
| `cable_clip_width(screw, insert = false)` | Width given the `screw` and possibly insert. |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| `cable_clip(screw, cable1, cable2 = 0)` | Create the STL for a single cable or two cable clip |
|
||||
| `cable_clip_assembly(screw, thickness, cable1, cable2 = 0)` | Cable clip with the fasteners |
|
||||
| `cable_clip(screw, cable1, cable2 = 0, insert = false)` | Create the STL for a single cable or two cable clip |
|
||||
| `cable_clip_assembly(screw, thickness, cable1, cable2 = 0, flip = false, insert = false)` | Cable clip with the fasteners |
|
||||
|
||||

|
||||
|
||||
### Vitamins
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 2 | `insert(CNCKM3)` | Heatfit insert M3 x 3mm |
|
||||
| 5 | `nut(M3_nut, nyloc = true)` | Nut M3 x 2.4mm nyloc |
|
||||
| 2 | `screw(M3_dome_screw, 12)` | Screw M3 dome x 12mm |
|
||||
| 3 | `screw(M3_dome_screw, 16)` | Screw M3 dome x 16mm |
|
||||
| 10 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
|
||||
| 2 | `screw(M3_dome_screw, 10)` | Screw M3 dome x 10mm |
|
||||
| 1 | `screw(M3_dome_screw, 12)` | Screw M3 dome x 12mm |
|
||||
| 4 | `screw(M3_dome_screw, 16)` | Screw M3 dome x 16mm |
|
||||
| 12 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
|
||||
| 2 | `star_washer(M3_washer)` | Washer star M3 x 0.5mm |
|
||||
|
||||
### Printed
|
||||
| Qty | Filename |
|
||||
| ---:|:--- |
|
||||
| 1 | cable_clip_30_10_13.stl |
|
||||
| 1 | cable_clip_30I_10_13.stl |
|
||||
| 1 | cable_clip_30I_5_14_6_14.stl |
|
||||
| 1 | cable_clip_30_1_14_2_14.stl |
|
||||
| 1 | cable_clip_30_1_60.stl |
|
||||
| 1 | cable_clip_30_3_14_4_14.stl |
|
||||
| 1 | cable_clip_30_5_14_6_14.stl |
|
||||
| 1 | cable_clip_30_7_14_8_14.stl |
|
||||
| 1 | cable_clip_30_9_14.stl |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
|
@@ -169,6 +169,9 @@ if __name__ == '__main__':
|
||||
|
||||
# Print commits excluding merges
|
||||
|
||||
if not c.comment.startswith('Merge branch') and not c.comment.startswith('Merge pull') and not re.match(r'U.?.ated ch.*log.*', c.comment):
|
||||
if not c.comment.startswith('Merge branch') \
|
||||
and not c.comment.startswith('Merge pull') \
|
||||
and not re.match(r'U.?.ated ch.*log.*', c.comment) \
|
||||
and not re.match(r'Changelog updated.*', c.comment):
|
||||
print('* %s [`%s`](%s "show commit") %s %s\n' % (c.date, c.hash[:7], url + '/commit/' + c.hash, initials(c.author), fixup_comment(c.comment, url)), file = file)
|
||||
do_cmd(('codespell -w -L od ' + filename).split())
|
||||
|
@@ -50,4 +50,5 @@ module pcbs() {
|
||||
pcb(p);
|
||||
}
|
||||
if($preview)
|
||||
pcbs();
|
||||
let($show_threads = false)
|
||||
pcbs();
|
||||
|
@@ -25,20 +25,20 @@ use <../vitamins/wire.scad>
|
||||
sheet_thickness = 3;
|
||||
|
||||
cables = [
|
||||
for(i = [1 : 6]) [i, 1.4], [1, 6], 0, [10, inch(0.05), true], 0
|
||||
[10, inch(0.05), true], 0, for(i = [1 : 9]) [i, 1.4], 0, [1, 6], 0,
|
||||
];
|
||||
|
||||
screw = M3_dome_screw;
|
||||
|
||||
|
||||
module cable_clips() {
|
||||
for(i = [0 : ceil(len(cables) / 2) - 1])
|
||||
translate([i * 25, 0]) {
|
||||
cable1 = cables[2 * i];
|
||||
cable2 = cables[2 * i + 1];
|
||||
|
||||
for(i = [0 : ceil(len(cables) / 2) - 1]) {
|
||||
cable1 = cables[2 * i];
|
||||
cable2 = cables[2 * i + 1];
|
||||
translate([i * 21 + (!cable2 ? cable_clip_offset(screw, cable1) / 2 : 0), 0]) {
|
||||
insert = in([0, 3], i);
|
||||
if($preview) {
|
||||
cable_clip_assembly(screw, sheet_thickness, cable1, cable2);
|
||||
cable_clip_assembly(screw, sheet_thickness, cable1, cable2, insert = insert, flip = i == 1);
|
||||
|
||||
for(j = [0 : 1])
|
||||
let(cable = cables[2 * i + j])
|
||||
@@ -46,14 +46,15 @@ module cable_clips() {
|
||||
let(positions = cable_bundle_positions(cable))
|
||||
for(i = [0 : len(positions) - 1])
|
||||
let(p = positions[i])
|
||||
translate([p.x + [-1, 1][j] * cable_clip_offset(screw, cable), 0, p.y])
|
||||
translate([p.x + [-1, 1][j] * cable_clip_offset(screw, cable, insert = insert), 0, p.y])
|
||||
rotate([90, 0, 0])
|
||||
color([grey(20), "blue", "red", "orange", "yellow", "green", "brown", "purple", "grey", "white"][i])
|
||||
cylinder(d = cable_wire_size(cable), h = 30, center = true);
|
||||
}
|
||||
else
|
||||
cable_clip(screw, cable1, cable2);
|
||||
cable_clip(screw, cable1, cable2, insert = insert);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cable_clips();
|
||||
|
@@ -22,7 +22,6 @@ use <../utils/layout.scad>
|
||||
include <../vitamins/inserts.scad>
|
||||
|
||||
module inserts() {
|
||||
|
||||
for(i = [0: len(inserts) -1])
|
||||
translate([10 * i, 5])
|
||||
insert(inserts[i]);
|
||||
@@ -32,7 +31,6 @@ module inserts() {
|
||||
insert(short_inserts[i]);
|
||||
|
||||
|
||||
|
||||
stl_colour(pp1_colour)
|
||||
translate([len(inserts) * 10, 0]) {
|
||||
insert_lug(inserts[0], 2, 1);
|
||||
@@ -42,6 +40,17 @@ module inserts() {
|
||||
}
|
||||
}
|
||||
|
||||
module threaded_inserts()
|
||||
for(i = [0: len(threaded_inserts) -1]) {
|
||||
d = insert_hole_radius(threaded_inserts[i]);
|
||||
translate([(10 + d) * i, 0])
|
||||
threaded_insert(threaded_inserts[i]);
|
||||
}
|
||||
|
||||
if($preview)
|
||||
let($show_threads = true)
|
||||
let($show_threads = true) {
|
||||
inserts();
|
||||
|
||||
translate([0, 20])
|
||||
threaded_inserts();
|
||||
}
|
||||
|
Before Width: | Height: | Size: 127 KiB After Width: | Height: | Size: 131 KiB |
Before Width: | Height: | Size: 146 KiB After Width: | Height: | Size: 145 KiB |
Before Width: | Height: | Size: 118 KiB After Width: | Height: | Size: 118 KiB |
Before Width: | Height: | Size: 138 KiB After Width: | Height: | Size: 151 KiB |
Before Width: | Height: | Size: 244 KiB After Width: | Height: | Size: 244 KiB |
Before Width: | Height: | Size: 105 KiB After Width: | Height: | Size: 107 KiB |
@@ -23,6 +23,7 @@
|
||||
include <../utils/core/core.scad>
|
||||
use <../utils/thread.scad>
|
||||
use <../utils/pcb_utils.scad>
|
||||
use <nut.scad>
|
||||
|
||||
d_pillar_colour = grey(90);
|
||||
d_plug_shell_colour = grey(80);
|
||||
@@ -62,17 +63,13 @@ module d_pillar() { //! Draw a pillar for a D-connector
|
||||
color(d_pillar_colour)
|
||||
cylinder(d = screw, h = screw_length + 1);
|
||||
|
||||
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_colour);
|
||||
draw_nut(rad * 2, screw, height, pitch, d_pillar_colour, show_threads);
|
||||
|
||||
color(d_pillar_colour)
|
||||
cylinder(d = screw + eps, h = 1);
|
||||
}
|
||||
|
||||
|
||||
module d_plug_D(length, width, rad) { //! D plug D shape
|
||||
d = width / 2 - rad;
|
||||
offset = d * sin(10);
|
||||
|
@@ -32,6 +32,9 @@ function insert_barrel_d(type) = type[5]; //! Diameter of the main bar
|
||||
function insert_ring1_h(type) = type[6]; //! Height of the top and middle rings
|
||||
function insert_ring2_d(type) = type[7]; //! Diameter of the middle ring
|
||||
function insert_ring3_d(type) = type[8]; //! Diameter of the bottom ring
|
||||
function threaded_insert_pitch(type) = type[9]; //! Pitch of the outer thread for threaded inserts
|
||||
function threaded_insert_chamfer(type) = type[10]; //! Size of the chamfer for threaded inserts
|
||||
|
||||
|
||||
function insert_hole_length(type) = round_to_layer(insert_length(type)); //! Length of the insert rounded to layer height
|
||||
|
||||
@@ -46,6 +49,14 @@ function insert_nose_length(type, d) = let( //! The length before the second rin
|
||||
|
||||
module insert(type) { //! Draw specified insert
|
||||
length = insert_length(type);
|
||||
|
||||
vitamin(str("insert(", type[0], "): Heatfit insert M", insert_screw_diameter(type), " x ", length, "mm"));
|
||||
|
||||
base_insert(type);
|
||||
}
|
||||
|
||||
module base_insert(type) {
|
||||
length = insert_length(type);
|
||||
ring1_h = insert_ring1_h(type);
|
||||
|
||||
chamfer1 = (insert_ring2_d(type) - insert_barrel_d(type)) / 2;
|
||||
@@ -53,7 +64,6 @@ module insert(type) { //! Draw specified insert
|
||||
ring2_h = ring1_h + chamfer1;
|
||||
gap = (length - ring1_h - ring2_h - chamfer2) / 3;
|
||||
|
||||
vitamin(str("insert(", type[0], "): Heatfit insert M", insert_screw_diameter(type), " x ", length, "mm"));
|
||||
$fn = 64;
|
||||
thread_d = insert_screw_diameter(type);
|
||||
explode(20, offset = [0, 0, -length]) translate_z(eps) vflip() {
|
||||
@@ -186,3 +196,54 @@ module insert_lug(insert, wall, counter_bore = 0, extension = 0, corner_r = 0, f
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
module threaded_insert(type) { //! Draw specified threaded insert, for use in wood
|
||||
d2 = insert_outer_d(type);
|
||||
d3 = insert_barrel_d(type);
|
||||
pitch = threaded_insert_pitch(type);
|
||||
|
||||
profile = thread_profile((d2 - d3) /2 , 0, 60);
|
||||
socket = insert_screw_diameter(type) / cos(30) / 2;
|
||||
length = insert_length(type);
|
||||
|
||||
r=insert_barrel_d(type) / 2;
|
||||
z=threaded_insert_chamfer(type);
|
||||
|
||||
thread_l = insert_length(type) - z; // - insert_ring1_h(type);
|
||||
|
||||
|
||||
|
||||
|
||||
vitamin(str("threaded_insert(", type[0], "): Threaded insert M", insert_screw_diameter(type), " x ", length, "mm"));
|
||||
union() {
|
||||
color(silver)
|
||||
difference() {
|
||||
base_insert(type);
|
||||
translate_z(-socket/2 + 0.01)
|
||||
cylinder(r=socket, $fn = 6, h=socket/2);
|
||||
|
||||
// chamfer the end
|
||||
rotate_extrude(convexity = 3)
|
||||
polygon([
|
||||
[r - z, -length],
|
||||
[r + 0.1, - length],
|
||||
[r + 0.1, - length + z + 0.1]
|
||||
]);
|
||||
}
|
||||
|
||||
translate_z(-thread_l/2)
|
||||
thread(insert_barrel_d(type),
|
||||
pitch,
|
||||
thread_l,
|
||||
profile,
|
||||
center = true,
|
||||
top = 1,
|
||||
bot = -1,
|
||||
starts = 1,
|
||||
solid = false,
|
||||
female = false,
|
||||
colour = silver);
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -39,8 +39,23 @@ CNCKM3 = [ "CNCKM3", 3.0, 4.6, 4.0, 3, 3.65, 0.7, 4.4, 3.9 ];
|
||||
CNCKM4 = [ "CNCKM4", 4.0, 6.3, 5.6, 4, 5.15, 1.0, 6.0, 5.55];
|
||||
CNCKM5 = [ "CNCKM5", 5.8, 7.1, 6.4, 5, 6.0, 1.6, 6.8, 6.33];
|
||||
|
||||
// Measurements according to DIN 7965
|
||||
//
|
||||
// If you want to add an additional length, it should be sufficient copy one with the same
|
||||
// M size and change the name (2x) and the first number column (l), all others are dependent
|
||||
// on the M size.
|
||||
// l, d2, d5, d, d3, h, d3, d3, P1 (h), z
|
||||
M3x8 = [ "M3x8", 8, 6, 5, 3, 4.5, 0.5, 4.5, 4.5, 2, 0.6];
|
||||
M4x10 = [ "M4x10", 10, 8, 6.5, 4, 5.5, 0.5, 5.5, 5.5, 2.5, 0.6];
|
||||
M5x12 = [ "M5x12", 12, 10, 8.5, 5, 7.5, 0.5, 7.5, 7.5, 3.5, 0.8];
|
||||
M6x15 = [ "M6x15", 15, 12, 10.5, 6, 9.5, 0.5, 9.5, 9.5, 4, 1];
|
||||
M8x18 = [ "M8x18", 18, 16, 14.5, 8, 12.5, 0.5, 12.5, 12.5, 5, 1];
|
||||
M10x25 = [ "M10x25", 25, 18.5, 17, 10, 15, 0.5, 15, 15, 5, 1.6];
|
||||
M12x30 = [ "M12x30", 30, 22, 20, 12, 18, 0.5, 18, 18, 5, 1.6];
|
||||
M16x30 = [ "M16x30", 30, 25, 22.5, 16, 20.5, 0.5, 20.5, 20.5, 5, 1.6];
|
||||
|
||||
inserts = [ F1BM2, F1BM2p5, F1BM3, F1BM4, CNCKM5 ];
|
||||
short_inserts = [ F1BM2, CNCKM2p5, CNCKM3, CNCKM4, CNCKM5 ];
|
||||
threaded_inserts = [ M3x8, M4x10, M5x12, M6x15, M8x18, M10x25, M12x30, M16x30 ];
|
||||
|
||||
use <insert.scad>
|
||||
|
@@ -22,6 +22,7 @@
|
||||
//
|
||||
include <../utils/core/core.scad>
|
||||
use <../utils/thread.scad>
|
||||
use <nut.scad>
|
||||
|
||||
function pillar_name(type) = type[1]; //! Name of part
|
||||
function pillar_thread(type) = type[2]; //! Thread diameter
|
||||
@@ -34,6 +35,7 @@ function pillar_o_colour(type) = type[8]; //! Colour of the outer part
|
||||
function pillar_i_colour(type) = type[9]; //! Colour of the inner part
|
||||
function pillar_top_thread(type) = type[10]; //! Top thread length, + for male, - for female
|
||||
function pillar_bot_thread(type) = type[11]; //! Bottom thread length, + for male, - for female
|
||||
function pillar_chamfered(type) = type[12]; //! True if pillar is chamfered
|
||||
|
||||
module pillar(type) { //! Draw specified pillar
|
||||
function sex(thread) = thread > 0 ? "M" : "F";
|
||||
@@ -67,12 +69,15 @@ module pillar(type) { //! Draw specified pillar
|
||||
color(thread_colour)
|
||||
cylinder(h = top_thread_l, d = thread_d);
|
||||
|
||||
color(pillar_i_colour(type)) {
|
||||
linear_extrude(height)
|
||||
difference() {
|
||||
circle(d = pillar_id(type), $fn = fn(pillar_ifn(type)));
|
||||
circle(d = thread_d);
|
||||
}
|
||||
color(thread_colour) {
|
||||
if(pillar_chamfered(type))
|
||||
draw_nut(pillar_id(type), thread_d, height, 0, thread_colour, false);
|
||||
else
|
||||
linear_extrude(height)
|
||||
difference() {
|
||||
circle(d = pillar_id(type), $fn = fn(pillar_ifn(type)));
|
||||
circle(d = thread_d);
|
||||
}
|
||||
|
||||
top = height + min(top_thread_l, 0);
|
||||
bot = -min(bot_thread_l, 0);
|
||||
@@ -85,10 +90,10 @@ module pillar(type) { //! Draw specified pillar
|
||||
if(top_thread_l < 0)
|
||||
translate_z(height)
|
||||
vflip()
|
||||
female_metric_thread(thread_d, pitch, -top_thread_l, false, colour = thread_colour);
|
||||
female_metric_thread(thread_d, pitch, -top_thread_l, bot = 1, false, colour = thread_colour);
|
||||
|
||||
if(bot_thread_l < 0)
|
||||
female_metric_thread(thread_d, pitch, -bot_thread_l, false, colour = thread_colour);
|
||||
female_metric_thread(thread_d, pitch, -bot_thread_l, false, bot = 1, colour = thread_colour);
|
||||
}
|
||||
|
||||
if(pillar_od(type) > pillar_id(type))
|
||||
|
@@ -20,23 +20,23 @@
|
||||
//
|
||||
// Nylon pillars
|
||||
//
|
||||
// n t h o i o i o i b t
|
||||
// a h e d d f f
|
||||
// m r i n n c c t t
|
||||
// e e g o o h h
|
||||
// a h l l r r
|
||||
// d t o o e e
|
||||
// u u a a
|
||||
// d r r d d
|
||||
//
|
||||
M2x16_brass_pillar = ["M2x16_brass_pillar", "nurled", 2, 16, 3.17, 3.17, 0, 0, brass, brass, 3,-3];
|
||||
M3x6_hex_pillar = ["M3x6_hex_pillar", "hex", 3, 6, 5/cos(30), 5/cos(30), 6, 6, brass, brass, -5, 6];
|
||||
M3x13_hex_pillar = ["M3x13_hex_pillar", "hex", 3, 13, 5/cos(30), 5/cos(30), 6, 6, "silver", silver, -6, 6];
|
||||
M3x20_hex_pillar = ["M3x20_hex_pillar", "hex", 3, 20, 5/cos(30), 5/cos(30), 6, 6, "silver", silver, -8, 8];
|
||||
M3x20_nylon_pillar = ["M3x20_nylon_pillar", "nylon", 3, 20, 8, 5/cos(30), 0, 6, "white", brass, -6, 6];
|
||||
M4x17_nylon_pillar = ["M4x17_nylon_pillar", "nylon", 4, 20, 8, 5/cos(30), 0, 6, "white", brass, -6, 6];
|
||||
M3x20_nylon_hex_pillar = ["M3x20_nylon_hex_pillar", "hex nylon", 3, 20, 8/cos(30), 8/cos(30), 6, 6, grey(20), grey(20), -6, 6];
|
||||
M3x10_nylon_hex_pillar = ["M3x10_nylon_hex_pillar", "hex nylon", 3, 10,5.5/cos(30),5.5/cos(30),6, 6, grey(20), grey(20), -6, 6];
|
||||
// n t h o i o i o i b t c
|
||||
// a h e d d f f h
|
||||
// m r i n n c c t t a
|
||||
// e e g o o h h m
|
||||
// a h l l r r f
|
||||
// d t o o e e e
|
||||
// u u a a r
|
||||
// d r r d d e
|
||||
// d
|
||||
M2x16_brass_pillar = ["M2x16_brass_pillar", "nurled", 2, 16, 3.17, 3.17, 0, 0, brass, brass, 3,-3, false];
|
||||
M3x6_hex_pillar = ["M3x6_hex_pillar", "hex", 3, 6, 5/cos(30), 5/cos(30), 6, 6, brass, brass, -5, 6, true];
|
||||
M3x13_hex_pillar = ["M3x13_hex_pillar", "hex", 3, 13, 5/cos(30), 5/cos(30), 6, 6, "silver", silver, -6, 6, true];
|
||||
M3x20_hex_pillar = ["M3x20_hex_pillar", "hex", 3, 20, 5/cos(30), 5/cos(30), 6, 6, "silver", silver, -8, 8, true];
|
||||
M3x20_nylon_pillar = ["M3x20_nylon_pillar", "nylon", 3, 20, 8, 5/cos(30), 0, 6, "white", brass, -6, 6, false];
|
||||
M4x17_nylon_pillar = ["M4x17_nylon_pillar", "nylon", 4, 20, 8, 5/cos(30), 0, 6, "white", brass, -6, 6, false];
|
||||
M3x20_nylon_hex_pillar = ["M3x20_nylon_hex_pillar", "hex nylon", 3, 20, 8/cos(30), 8/cos(30), 6, 6, grey(20), grey(20), -6, 6, false];
|
||||
M3x10_nylon_hex_pillar = ["M3x10_nylon_hex_pillar", "hex nylon", 3, 10,5.5/cos(30),5.5/cos(30),6, 6, grey(20), grey(20), -6, 6, false];
|
||||
|
||||
|
||||
pillars = [M2x16_brass_pillar, M3x6_hex_pillar, M3x13_hex_pillar, M3x20_hex_pillar, M3x20_nylon_pillar, M4x17_nylon_pillar, M3x10_nylon_hex_pillar, M3x20_nylon_hex_pillar];
|
||||
|
@@ -44,23 +44,62 @@ function cable_is_ribbon(cable) = len(cable) > 2 && cable[2]; //! Is a ribbon ca
|
||||
function cable_wire_colours(cable) = assert(len(cable[3]) >= cable_wires(cable)) cable[3]; //! Individual wire colours
|
||||
function cable_tlen(cable) = cable[4]; //! Twisted cable twist length
|
||||
function cable(wires, size, colours, ribbon = false, tlen = 25) = [wires, size, ribbon, colours, tlen]; //! Cable constructor
|
||||
function cable_merge(cable1, cable2) = //! Combine the wires of two cables
|
||||
assert(cable_wire_size(cable1) == cable_wire_size(cable2))
|
||||
assert(cable_is_ribbon(cable1) == cable_is_ribbon(cable2))
|
||||
cable(cable_wires(cable1) + cable_wires(cable2),
|
||||
cable_wire_size(cable1),
|
||||
concat(cable_wire_colours(cable1), cable_wire_colours(cable1)),
|
||||
cable_is_ribbon(cable1));
|
||||
|
||||
// numbers from http://mathworld.wolfram.com/CirclePacking.html
|
||||
function cable_radius(cable) = [0, 1, 2, 2.15, 2.41, 2.7, 3, 3, 3.3][cable_wires(cable)] * cable_wire_size(cable) / 2; //! Radius of a bundle of wires, see <http://mathworld.wolfram.com/CirclePacking.html>.
|
||||
// numbers from https://en.wikipedia.org/wiki/Circle_packing_in_a_circle
|
||||
function cable_radius(cable) = [ //! Radius of a bundle of wires, see <http://mathworld.wolfram.com/CirclePacking.html>.
|
||||
0, 1, 2,
|
||||
2.154, // 3
|
||||
2.414, // 4
|
||||
2.701, // 5
|
||||
3, // 6
|
||||
3, // 7
|
||||
3.304, // 8
|
||||
3.613, // 9
|
||||
3.813, // 10
|
||||
3.923, // 11
|
||||
4.029, // 12
|
||||
4.236, // 13
|
||||
4.328, // 14
|
||||
4.521, // 15
|
||||
4.615, // 16
|
||||
4.792, // 17
|
||||
4.863, // 18
|
||||
4.863, // 19
|
||||
5.122, // 20
|
||||
][cable_wires(cable)] * cable_wire_size(cable) / 2;
|
||||
|
||||
function wire_hole_radius(cable) = ceil(4 * cable_radius(cable) + 1) / 4; //! Radius of a hole to accept a bundle of wires, rounded up to standard metric drill size
|
||||
|
||||
function cable_bundle(cable) = //! Dimensions of the bounding rectangle of a bundle of wires in a flat cable clip
|
||||
(cable_is_ribbon(cable) ? [cable_wires(cable), 1] :
|
||||
[[0,0], [1,1], [2,1], [2, 1 + sin(60)], [2,2], [3, 1 + sin(60)], [3,2]][cable_wires(cable)]) * cable_wire_size(cable);
|
||||
[[0, 0], // 0
|
||||
[1, 1], // 1
|
||||
[2, 1], // 2
|
||||
[2, 1 + sin(60)], // 3
|
||||
[2, 2], // 4
|
||||
[3, 1 + sin(60)], // 5
|
||||
[3, 2], // 6
|
||||
[4, 1 + sin(60)], // 7
|
||||
[3, 2 + sin(60)], // 8
|
||||
[3, 3]
|
||||
][cable_wires(cable)]) * cable_wire_size(cable);
|
||||
|
||||
function cable_bundle_positions(cable) = let( //! Positions of wires in a bundle to go through a cable strip
|
||||
wires = cable_wires(cable),
|
||||
bottom = cable_is_ribbon(cable) ? wires : wires < 3 ? wires : ceil(wires / 2),
|
||||
top = wires - bottom
|
||||
bottom = cable_is_ribbon(cable) ? wires : wires < 3 ? wires : wires <= 7 ? ceil(wires / 2) : min(wires, 3),
|
||||
middle = min(wires - bottom, 3),
|
||||
top = wires - bottom - middle
|
||||
)
|
||||
[for(i = [0 : 1 : bottom - 1]) [i - (bottom - 1) / 2, 0.5],
|
||||
for(i = [top - 1 : -1 : 0]) [i - (top - 1) / 2, top == bottom ? 1.5 : 0.5 + sin(60)]
|
||||
[for(i = [0 : 1 : bottom - 1]) [i - (bottom - 1) / 2, 0.5],
|
||||
for(i = [middle - 1 : -1 : 0]) [i - (middle - 1) / 2, middle == bottom ? 1.5 : 0.5 + sin(60)],
|
||||
for(i = [0 : 1 : top - 1]) [i - [0.5, 0.5, 1][top - 1], top == middle ? 2.5 : 1.5 + sin(60)]
|
||||
] * cable_wire_size(cable);
|
||||
|
||||
function cable_width(cable) = cable_bundle(cable).x; //! Width in flat clip
|
||||
|