Compare commits
42 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
80eb5ebc43 | ||
|
d15cf6cf35 | ||
|
2769c3714c | ||
|
185bb8d6a9 | ||
|
eddebc65a2 | ||
|
915ceea296 | ||
|
5a14c55ca5 | ||
|
ca9cc97b2a | ||
|
652c5d1a26 | ||
|
3830836519 | ||
|
9c5014b73d | ||
|
5c289bb7f5 | ||
|
3211fe1f19 | ||
|
c8f1b808cf | ||
|
917f404c59 | ||
|
99ff256847 | ||
|
3d370ccf72 | ||
|
bd94182ff1 | ||
|
86df9a34d6 | ||
|
9758112e05 | ||
|
b46f49a5ce | ||
|
330c09f4d4 | ||
|
c2a56367eb | ||
|
f16dc84792 | ||
|
c065855b90 | ||
|
edc7e17437 | ||
|
7546203b03 | ||
|
a9b501a2d2 | ||
|
126343d5af | ||
|
1692fcc811 | ||
|
5c4fe8bfb9 | ||
|
33ac3820b0 | ||
|
6a58d37f77 | ||
|
029abc0cf8 | ||
|
4b018eb9ad | ||
|
3715585002 | ||
|
5d0eda87e4 | ||
|
ad963afb8d | ||
|
dbf8e6c7ae | ||
|
7d281cbcdd | ||
|
f1a651a2d2 | ||
|
fdbe0c7a9e |
1
.gitignore
vendored
@@ -12,3 +12,4 @@ times.txt
|
||||
*_diff.png
|
||||
*.echo
|
||||
cmd_times.txt
|
||||
*.gco
|
||||
|
60
CHANGELOG.md
@@ -3,6 +3,66 @@
|
||||
This changelog is generated by `changelog.py` using manually added semantic version tags to classify commits as breaking changes, additions or fixes.
|
||||
|
||||
|
||||
### [v21.39.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.39.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.38.1...v21.39.0 "diff with v21.38.1")
|
||||
* 2025-07-01 [`915ceea`](https://github.com/nophead/NopSCADlib/commit/915ceea296aa54e8432c98ac01d527d214740953 "show commit") [C.P.](# "Chris Palmer") Updated images and readme.
|
||||
|
||||
* 2025-06-28 [`5a14c55`](https://github.com/nophead/NopSCADlib/commit/5a14c55ca5fc064c0ca04f1f4058bac25f2a65be "show commit") [E.F.](# "Elliot Foster") Add the Mellow Fly D5 PCB
|
||||
|
||||
#### [v21.38.1](https://github.com/nophead/NopSCADlib/releases/tag/v21.38.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v21.38.0...v21.38.1 "diff with v21.38.0")
|
||||
* 2025-05-16 [`9c5014b`](https://github.com/nophead/NopSCADlib/commit/9c5014b73d51d5071259fb7df814b8a62016d214 "show commit") [C.P.](# "Chris Palmer") Updated examples.
|
||||
|
||||
* 2025-05-11 [`5c289bb`](https://github.com/nophead/NopSCADlib/commit/5c289bb7f566f3eebd8ad061645abb6dddb6ef97 "show commit") [P.](# "pcremades") `[Fix]` Fix route to svgs
|
||||
|
||||
* 2025-05-09 [`3211fe1`](https://github.com/nophead/NopSCADlib/commit/3211fe1f19f8d2a9ea090c8232f65ddad379cd26 "show commit") [P.](# "pcremades") `[Feature]` Add link to `DXFs/SVGs` files in documentation
|
||||
|
||||
* 2025-04-15 [`99ff256`](https://github.com/nophead/NopSCADlib/commit/99ff25684756ccf1ec86fd8538a03172e6ce62e9 "show commit") [C.P.](# "Chris Palmer") Fixed example link.
|
||||
|
||||
### [v21.38.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.38.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.37.1...v21.38.0 "diff with v21.37.1")
|
||||
* 2025-04-15 [`bd94182`](https://github.com/nophead/NopSCADlib/commit/bd94182ff1ca85df7b667fc6985defb779846252 "show commit") [C.P.](# "Chris Palmer") Added simple Gridfinity generator and examples.
|
||||
|
||||
* 2025-04-15 [`86df9a3`](https://github.com/nophead/NopSCADlib/commit/86df9a34d641511a84026eaf0b3191437e4692be "show commit") [C.P.](# "Chris Palmer") Added chamfer test file.
|
||||
|
||||
* 2025-04-15 [`9758112`](https://github.com/nophead/NopSCADlib/commit/9758112e05d02c9cf156828ecd47b7770b602628 "show commit") [C.P.](# "Chris Palmer") Added `chamfer_hole()` utility module.
|
||||
|
||||
#### [v21.37.1](https://github.com/nophead/NopSCADlib/releases/tag/v21.37.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v21.37.0...v21.37.1 "diff with v21.37.0")
|
||||
* 2025-04-14 [`7546203`](https://github.com/nophead/NopSCADlib/commit/7546203b0377930a75a45e2943af296dc1758dca "show commit") [R.S.](# "Robert Schiele") positional parameters should not follow named parameters
|
||||
|
||||
* Some versions of OpenSCAD (like the latest official release `2021.01` get
|
||||
confused if positional parameters follow named parameters. So let's use
|
||||
named parameters after the first named one was used.
|
||||
|
||||
### [v21.37.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.37.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.36.0...v21.37.0 "diff with v21.36.0")
|
||||
* 2025-04-15 [`edc7e17`](https://github.com/nophead/NopSCADlib/commit/edc7e174370ac8dcd6d4a78b31640347ab266f60 "show commit") [C.P.](# "Chris Palmer") Included `pcbs.scad` in `displays.scad`.
|
||||
Moved `I2C_LCD_Backpack` from `tiny_pcbs` to pcbs to prevent connector clash.
|
||||
Updated images and readme.
|
||||
|
||||
* 2025-04-22 [`917f404`](https://github.com/nophead/NopSCADlib/commit/917f404c591350d8b1821e9cc6422c9bdbf24b22 "show commit") [P.](# "pcremades") `[Feature]` Add link to STL files in documentation
|
||||
|
||||
* 2025-04-11 [`a9b501a`](https://github.com/nophead/NopSCADlib/commit/a9b501a2d2ce242c181c2cd5f5d1f86ba7150eec "show commit") [P.](# "pcremades") Added a 1602 LCD with I2C module
|
||||
|
||||
* 2025-04-11 [`126343d`](https://github.com/nophead/NopSCADlib/commit/126343d5af75a2aa458db112305a62b953e23694 "show commit") [P.](# "pcremades") Added a I2C TWI SPI Serial Interface for 1602 LCD
|
||||
|
||||
* 2025-04-11 [`1692fcc`](https://github.com/nophead/NopSCADlib/commit/1692fcc8116c9a0926231a95d0207a0085c814c5 "show commit") [P.](# "pcremades") Added `1/4"` square trimpot to `pcb.scad`
|
||||
|
||||
### [v21.36.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.36.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.35.6...v21.36.0 "diff with v21.35.6")
|
||||
* 2025-04-09 [`33ac382`](https://github.com/nophead/NopSCADlib/commit/33ac3820b0df87df05d7c2dbb3d553e2aafa6828 "show commit") [C.P.](# "Chris Palmer") Added `pose_stl()` module because `pose()` only works for assembly views.
|
||||
|
||||
#### [v21.35.6](https://github.com/nophead/NopSCADlib/releases/tag/v21.35.6 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v21.35.5...v21.35.6 "diff with v21.35.5")
|
||||
* 2025-03-30 [`5d0eda8`](https://github.com/nophead/NopSCADlib/commit/5d0eda87e44a70fdbed51407a43555a637e064f9 "show commit") [D.T.](# "Daniel Trnka") `barrel_jack:` added cutout
|
||||
|
||||
#### [v21.35.5](https://github.com/nophead/NopSCADlib/releases/tag/v21.35.5 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v21.35.4...v21.35.5 "diff with v21.35.4")
|
||||
* 2025-04-01 [`3715585`](https://github.com/nophead/NopSCADlib/commit/3715585002ba56681103103faddd043b1553d095 "show commit") [C.P.](# "Chris Palmer") Made `pose()` work on STL renders to match the documentation.
|
||||
|
||||
#### [v21.35.4](https://github.com/nophead/NopSCADlib/releases/tag/v21.35.4 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v21.35.3...v21.35.4 "diff with v21.35.3")
|
||||
* 2025-03-23 [`fdbe0c7`](https://github.com/nophead/NopSCADlib/commit/fdbe0c7a9eba96823683b8e1161bc160bd63231e "show commit") [J.R.](# "Jeroen Roos") Change variable names that start with a digit
|
||||
|
||||
* Change names of variables from `2a` and `2c` to `ax2` (a times 2) and
|
||||
`cx2`, because variable names starting with a digit are deprecated in
|
||||
OpenSCAD.
|
||||
|
||||
#### [v21.35.3](https://github.com/nophead/NopSCADlib/releases/tag/v21.35.3 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v21.35.2...v21.35.3 "diff with v21.35.2")
|
||||
* 2025-03-27 [`9f9aa67`](https://github.com/nophead/NopSCADlib/commit/9f9aa6723eff9b7439e17758406e9f8e409828ee "show commit") [C.P.](# "Chris Palmer") Third attempt to fix dimension image.
|
||||
|
||||
#### [v21.35.2](https://github.com/nophead/NopSCADlib/releases/tag/v21.35.2 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v21.35.1...v21.35.2 "diff with v21.35.1")
|
||||
* 2025-03-27 [`6b6704b`](https://github.com/nophead/NopSCADlib/commit/6b6704b823291119697bf4993eddb3f2e6873875 "show commit") [C.P.](# "Chris Palmer") Second attempt to fix dimension image.
|
||||
|
||||
|
Before Width: | Height: | Size: 265 KiB After Width: | Height: | Size: 264 KiB |
Before Width: | Height: | Size: 326 KiB After Width: | Height: | Size: 324 KiB |
Before Width: | Height: | Size: 57 KiB After Width: | Height: | Size: 57 KiB |
Before Width: | Height: | Size: 336 KiB After Width: | Height: | Size: 334 KiB |
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 58 KiB |
Before Width: | Height: | Size: 126 KiB After Width: | Height: | Size: 125 KiB |
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 132 KiB After Width: | Height: | Size: 129 KiB |
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 201 KiB After Width: | Height: | Size: 201 KiB |
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 36 KiB |
Before Width: | Height: | Size: 249 KiB After Width: | Height: | Size: 248 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 125 KiB After Width: | Height: | Size: 124 KiB |
Before Width: | Height: | Size: 185 KiB After Width: | Height: | Size: 185 KiB |
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 234 KiB After Width: | Height: | Size: 234 KiB |
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
Before Width: | Height: | Size: 236 KiB After Width: | Height: | Size: 235 KiB |
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 218 KiB After Width: | Height: | Size: 217 KiB |
@@ -17,11 +17,13 @@
|
||||
"printed": {
|
||||
"fan_duct.stl": {
|
||||
"count": 1,
|
||||
"colour": "darkorange"
|
||||
"colour": "darkorange",
|
||||
"camera": "0,0,0,70,0,315,500"
|
||||
},
|
||||
"enviro_plus_case_base.stl": {
|
||||
"count": 1,
|
||||
"colour": "grey"
|
||||
"colour": "grey",
|
||||
"camera": "0,0,0,70,0,315,500"
|
||||
}
|
||||
},
|
||||
"routed": {}
|
||||
@@ -67,10 +69,10 @@
|
||||
"smd_resistor(RES0805, 3K3): SMD resistor 0805 3K3 0.125W": {
|
||||
"count": 1
|
||||
},
|
||||
"smd_capacitor(CAP1206): SMD capacitor 1206 10uF": {
|
||||
"smd_capacitor(CAP1206, value = \"10uF\"): SMD capacitor 1206 10uF": {
|
||||
"count": 1
|
||||
},
|
||||
"smd_sot(SOT223): SOT223 package FZT851": {
|
||||
"smd_sot(SOT223, \"FZT851\"): SOT223 package FZT851": {
|
||||
"count": 1
|
||||
}
|
||||
},
|
||||
@@ -115,15 +117,18 @@
|
||||
"printed": {
|
||||
"enviro_plus_case.stl": {
|
||||
"count": 1,
|
||||
"colour": "grey"
|
||||
"colour": "grey",
|
||||
"camera": "0,0,0,70,0,315,500"
|
||||
},
|
||||
"bulkhead.stl": {
|
||||
"count": 1,
|
||||
"colour": "[0.862745, 0.0784314, 0.235294]"
|
||||
"colour": "[0.862745, 0.0784314, 0.235294]",
|
||||
"camera": "0,0,0,70,0,315,500"
|
||||
},
|
||||
"foot.stl": {
|
||||
"count": 3,
|
||||
"colour": "darkorange"
|
||||
"colour": "darkorange",
|
||||
"camera": "0,0,0,70,0,315,500"
|
||||
}
|
||||
},
|
||||
"routed": {}
|
||||
|
@@ -72,7 +72,7 @@ Environmental monitor using Enviro+ sensor board and a Raspberry Pi Zero.
|
||||
|
||||
### 3D Printed parts
|
||||
|
||||
| 1 x enviro_plus_case_base.stl | 1 x fan_duct.stl |
|
||||
| 1 x [enviro_plus_case_base.stl](stls/enviro_plus_case_base.stl) | 1 x [fan_duct.stl](stls/fan_duct.stl) |
|
||||
|---|---|
|
||||
|  | 
|
||||
|
||||
@@ -190,7 +190,7 @@ It converts the PWM signal on GPI4 to a stead DC voltage so that the fan doesn't
|
||||
|
||||
### 3D Printed parts
|
||||
|
||||
| 1 x bulkhead.stl | 1 x enviro_plus_case.stl | 3 x foot.stl |
|
||||
| 1 x [bulkhead.stl](stls/bulkhead.stl) | 1 x [enviro_plus_case.stl](stls/enviro_plus_case.stl) | 3 x [foot.stl](stls/foot.stl) |
|
||||
|---|---|---|
|
||||
|  |  | 
|
||||
|
||||
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
BIN
examples/Gridfinity/assemblies/main_assembled.png
Normal file
After Width: | Height: | Size: 126 KiB |
BIN
examples/Gridfinity/assemblies/main_assembled_tn.png
Normal file
After Width: | Height: | Size: 25 KiB |
BIN
examples/Gridfinity/assemblies/main_assembly.png
Normal file
After Width: | Height: | Size: 126 KiB |
BIN
examples/Gridfinity/assemblies/main_assembly_tn.png
Normal file
After Width: | Height: | Size: 25 KiB |
0
examples/Gridfinity/bom/bom.csv
Normal file
|
49
examples/Gridfinity/bom/bom.json
Normal file
@@ -0,0 +1,49 @@
|
||||
[
|
||||
{
|
||||
"name": "main_assembly",
|
||||
"big": null,
|
||||
"ngb": false,
|
||||
"zoomed": 0,
|
||||
"count": 1,
|
||||
"assemblies": {},
|
||||
"vitamins": {},
|
||||
"printed": {
|
||||
"lathe_tool_stand.stl": {
|
||||
"count": 1,
|
||||
"colour": "[0, 0.572549, 0]",
|
||||
"camera": "0,0,0,70,0,315,500"
|
||||
},
|
||||
"MT2_stand.stl": {
|
||||
"count": 1,
|
||||
"colour": "[0, 0.572549, 0]",
|
||||
"camera": "0,0,0,70,0,315,500"
|
||||
},
|
||||
"chuck_stand.stl": {
|
||||
"count": 1,
|
||||
"colour": "[0, 0.572549, 0]",
|
||||
"camera": "0,0,0,70,0,315,500"
|
||||
},
|
||||
"chuck_jaw_bin.stl": {
|
||||
"count": 1,
|
||||
"colour": "[0, 0.572549, 0]",
|
||||
"camera": "0,0,0,70,0,315,500"
|
||||
},
|
||||
"1x1_bin.stl": {
|
||||
"count": 1,
|
||||
"colour": "[0, 0.572549, 0]",
|
||||
"camera": "0,0,0,70,0,315,500"
|
||||
},
|
||||
"123_block_stand.stl": {
|
||||
"count": 1,
|
||||
"colour": "[0, 0.572549, 0]",
|
||||
"camera": "0,0,0,70,0,315,500"
|
||||
},
|
||||
"faceplate_stand.stl": {
|
||||
"count": 1,
|
||||
"colour": "[0, 0.572549, 0]",
|
||||
"camera": "0,0,0,70,0,315,500"
|
||||
}
|
||||
},
|
||||
"routed": {}
|
||||
}
|
||||
]
|
15
examples/Gridfinity/bom/bom.txt
Normal file
@@ -0,0 +1,15 @@
|
||||
M
|
||||
a
|
||||
i
|
||||
n
|
||||
Printed:
|
||||
1| 1 123_block_stand.stl
|
||||
1| 1 1x1_bin.stl
|
||||
1| 1 MT2_stand.stl
|
||||
1| 1 chuck_jaw_bin.stl
|
||||
1| 1 chuck_stand.stl
|
||||
1| 1 faceplate_stand.stl
|
||||
1| 1 lathe_tool_stand.stl
|
||||
|
||||
Assemblies:
|
||||
1 main_assembly
|
9
examples/Gridfinity/bom/main_assembly.txt
Normal file
@@ -0,0 +1,9 @@
|
||||
main_assembly:
|
||||
Printed:
|
||||
1 123_block_stand.stl
|
||||
1 1x1_bin.stl
|
||||
1 MT2_stand.stl
|
||||
1 chuck_jaw_bin.stl
|
||||
1 chuck_stand.stl
|
||||
1 faceplate_stand.stl
|
||||
1 lathe_tool_stand.stl
|
64
examples/Gridfinity/readme.md
Normal file
@@ -0,0 +1,64 @@
|
||||
<a name="TOP"></a>
|
||||
# Gridfinity
|
||||
Gridfinity examples
|
||||
|
||||

|
||||
|
||||
<span></span>
|
||||
|
||||
---
|
||||
## Table of Contents
|
||||
1. [Parts list](#Parts_list)
|
||||
1. [Main Assembly](#main_assembly)
|
||||
|
||||
<span></span>
|
||||
[Top](#TOP)
|
||||
|
||||
---
|
||||
<a name="Parts_list"></a>
|
||||
## Parts list
|
||||
| <span style="writing-mode: vertical-rl; text-orientation: mixed;">Main</span> | <span style="writing-mode: vertical-rl; text-orientation: mixed;">TOTALS</span> | |
|
||||
|---:|---:|:---|
|
||||
| | | **3D printed parts** |
|
||||
| 1 | 1 | 123_block_stand.stl |
|
||||
| 1 | 1 | 1x1_bin.stl |
|
||||
| 1 | 1 | MT2_stand.stl |
|
||||
| 1 | 1 | chuck_jaw_bin.stl |
|
||||
| 1 | 1 | chuck_stand.stl |
|
||||
| 1 | 1 | faceplate_stand.stl |
|
||||
| 1 | 1 | lathe_tool_stand.stl |
|
||||
| 7 | 7 | Total 3D printed parts count |
|
||||
|
||||
<span></span>
|
||||
[Top](#TOP)
|
||||
|
||||
---
|
||||
<a name="main_assembly"></a>
|
||||
## Main Assembly
|
||||
### 3D Printed parts
|
||||
|
||||
| 1 x [123_block_stand.stl](stls/123_block_stand.stl) | 1 x [1x1_bin.stl](stls/1x1_bin.stl) | 1 x [MT2_stand.stl](stls/MT2_stand.stl) |
|
||||
|---|---|---|
|
||||
|  |  | 
|
||||
|
||||
|
||||
| 1 x [chuck_jaw_bin.stl](stls/chuck_jaw_bin.stl) | 1 x [chuck_stand.stl](stls/chuck_stand.stl) | 1 x [faceplate_stand.stl](stls/faceplate_stand.stl) |
|
||||
|---|---|---|
|
||||
|  |  | 
|
||||
|
||||
|
||||
| 1 x [lathe_tool_stand.stl](stls/lathe_tool_stand.stl) |
|
||||
|---|
|
||||
| 
|
||||
|
||||
|
||||
|
||||
### Assembly instructions
|
||||

|
||||
|
||||
Show all the Gridfinity parts
|
||||
|
||||

|
||||
|
||||
<span></span>
|
||||
[Top](#TOP)
|
58
examples/Gridfinity/scad/123_block_stand.scad
Normal file
@@ -0,0 +1,58 @@
|
||||
include <NopSCADlib/core.scad>
|
||||
|
||||
use <NopSCADlib/printed/gridfinity.scad>
|
||||
use <NopSCADlib/utils/maths.scad>
|
||||
use <NopSCADlib/utils/chamfer.scad>
|
||||
|
||||
tool_size = 8;
|
||||
|
||||
box = gridfinity_bin("123_block_stand", 2, 2, 5);
|
||||
|
||||
123_block = inch([3, 1, 2]);
|
||||
|
||||
102040_block = [20, 10, 40];
|
||||
|
||||
blocks = [123_block, 123_block, 102040_block];
|
||||
|
||||
box_mm = gridfinity_bin_size_mm(box);
|
||||
wall = 1.75;
|
||||
bwall = 1;
|
||||
clearance = 0.5;
|
||||
|
||||
gap = (box_mm.y - sumv([for(b = blocks) b.y])) / (len(blocks) + 1);
|
||||
|
||||
module holes() {
|
||||
let($b = blocks[0])
|
||||
translate([0, box_mm.y / 2 - gap - $b.y / 2])
|
||||
children();
|
||||
|
||||
let($b = blocks[1])
|
||||
translate([0, box_mm.y / 2 - gap - blocks[0].y - gap - $b.y / 2])
|
||||
children();
|
||||
|
||||
for(side = [-1, 1])
|
||||
let($b = blocks[2])
|
||||
translate([side * (blocks[2].x + 2 * gap) / 2,
|
||||
box_mm.y / 2 - gap - blocks[0].y - gap - blocks[1].y - gap - blocks[2].y / 2 ])
|
||||
children();
|
||||
}
|
||||
|
||||
module 123_block_stand_stl()
|
||||
gridfinity_bin(box) union() {
|
||||
holes() {
|
||||
translate_z(gridfinity_base_z() + bwall + $b.z / 2 + eps)
|
||||
cube([$b.x + clearance, $b.y + clearance, $b.z + 2 * eps], true);
|
||||
|
||||
chamfer = 1;
|
||||
translate_z(box_mm.z)
|
||||
chamfer_hole(chamfer)
|
||||
square([$b.x + clearance, $b.y + clearance], true);
|
||||
}
|
||||
translate_z(gridfinity_base_z() + bwall)
|
||||
difference() {
|
||||
rounded_rectangle([box_mm.x - 2 * wall, box_mm.y - 2 * wall, box_mm.z - gridfinity_base_z() - bwall - wall], gridfinity_corner_r() - wall);
|
||||
|
||||
holes()
|
||||
rounded_rectangle([$b.x + clearance + 2 * wall, $b.y + clearance + 2 * wall, 100], wall, center = true);
|
||||
}
|
||||
}
|
9
examples/Gridfinity/scad/1x1_bin.scad
Normal file
@@ -0,0 +1,9 @@
|
||||
include <NopSCADlib/core.scad>
|
||||
|
||||
use <NopSCADlib/printed/gridfinity.scad>
|
||||
|
||||
box = gridfinity_bin("1x1_bin", 1, 1, 5);
|
||||
|
||||
module 1x1_bin_stl()
|
||||
gridfinity_bin(box)
|
||||
gridfinity_partition(box, 1, 1);
|
80
examples/Gridfinity/scad/MT2_stand.scad
Normal file
@@ -0,0 +1,80 @@
|
||||
//
|
||||
// Stand for MT2 taper lathe tools
|
||||
//
|
||||
include <NopSCADlib/core.scad>
|
||||
use <NopSCADlib/utils/maths.scad>
|
||||
use <NopSCADlib/utils/chamfer.scad>
|
||||
|
||||
use <NopSCADlib/printed/gridfinity.scad>
|
||||
|
||||
box = gridfinity_bin("MT2_stand", 4, 2, 8);
|
||||
|
||||
box_mm = gridfinity_bin_size_mm(box);
|
||||
wall = 1.75;
|
||||
bwall = 1;
|
||||
|
||||
|
||||
diameters1 = [43, 47, 64];
|
||||
d2 = 20;
|
||||
|
||||
clearance = 1;
|
||||
clearance2 = 4;
|
||||
|
||||
MT2_base = 5; // smaller diameters
|
||||
MT2_D1 = 15; // diameter at the bottom of the taper at base height
|
||||
MT2_half_angle = 1.4302777777777778;
|
||||
|
||||
hole_depth = box_mm.z - gridfinity_base_z() - bwall;
|
||||
MT2_r1 = MT2_D1 / 2;
|
||||
MT2_r2 = MT2_r1 + (hole_depth - MT2_base) * tan(MT2_half_angle);
|
||||
|
||||
gap = (box_mm.x - sumv(diameters1) - 2 * clearance) / (len(diameters1) - 1);
|
||||
gap2 = 18;
|
||||
|
||||
module MT2_socket() {
|
||||
clearance = 0.3;
|
||||
|
||||
translate_z(-hole_depth) {
|
||||
poly_cylinder(MT2_r1 + clearance / 2, MT2_base + eps);
|
||||
|
||||
translate_z(MT2_base)
|
||||
hull() {
|
||||
poly_cylinder(MT2_r1 + clearance / 2, eps);
|
||||
|
||||
translate_z(hole_depth - MT2_base)
|
||||
poly_cylinder(MT2_r2 + clearance / 2, eps);
|
||||
}
|
||||
}
|
||||
chamfer_hole(1)
|
||||
poly_circle(MT2_r2 + clearance / 2);
|
||||
}
|
||||
|
||||
function pos(i) = [clearance + sumv(slice(diameters1, 0, i)) + i * gap + diameters1[i] / 2 - box_mm.x / 2, box_mm.y / 2 - clearance - diameters1[i] / 2, box_mm.z];
|
||||
function pos2(i) = [clearance2 + i * gap2 + (i + 0.5) * d2 - box_mm.x / 2, -box_mm.y / 2 + clearance2 + d2 / 2, box_mm.z];
|
||||
|
||||
module holes()
|
||||
for(i = [0 : len(diameters1) - 1]) {
|
||||
translate(pos(i))
|
||||
children();
|
||||
|
||||
translate(pos2(i))
|
||||
children();
|
||||
}
|
||||
|
||||
module MT2_stand_stl()
|
||||
gridfinity_bin(box) union() {
|
||||
holes()
|
||||
MT2_socket();
|
||||
|
||||
translate_z(gridfinity_base_z() + bwall)
|
||||
difference() {
|
||||
rounded_rectangle([box_mm.x - 2 * wall, box_mm.y - 2 * wall, box_mm.z - gridfinity_base_z() - bwall - wall], gridfinity_corner_r() - wall);
|
||||
|
||||
holes()
|
||||
cylinder(r = MT2_r2 + wall, h = 200, center = true);
|
||||
|
||||
for(x = [-box_mm.x / 2 : 20 : box_mm.x /2])
|
||||
translate([x, 0])
|
||||
cube([squeezed_wall, 200, 200], center = true);
|
||||
}
|
||||
}
|
36
examples/Gridfinity/scad/chuck_jaw_bin.scad
Normal file
@@ -0,0 +1,36 @@
|
||||
include <NopSCADlib/core.scad>
|
||||
use <NopSCADlib/utils/chamfer.scad>
|
||||
|
||||
use <NopSCADlib/printed/gridfinity.scad>
|
||||
|
||||
box = gridfinity_bin("chuck_jaw_bin", 1, 1, 5);
|
||||
|
||||
box_mm = gridfinity_bin_size_mm(box);
|
||||
|
||||
bwall = 1;
|
||||
|
||||
length = 37;
|
||||
width = 34;
|
||||
|
||||
|
||||
z_bot = gridfinity_base_z() + bwall;
|
||||
|
||||
depth = box_mm.z - z_bot;
|
||||
|
||||
module chuck_jaw_bin_stl()
|
||||
gridfinity_bin(box)
|
||||
translate_z(box_mm.z) {
|
||||
cube([length, width, depth * 2], true);
|
||||
|
||||
chamfer = 1;
|
||||
|
||||
chamfer_hole(chamfer)
|
||||
square([length, width], true);
|
||||
|
||||
*hull() {
|
||||
rounded_rectangle([length + 2 * chamfer, width + 2 * chamfer, eps], chamfer);
|
||||
|
||||
translate_z(-chamfer + eps / 2)
|
||||
cube([length, width, eps], true);
|
||||
}
|
||||
}
|
52
examples/Gridfinity/scad/chuck_stand.scad
Normal file
@@ -0,0 +1,52 @@
|
||||
include <NopSCADlib/core.scad>
|
||||
|
||||
use <NopSCADlib/printed/gridfinity.scad>
|
||||
use <NopSCADlib/utils/chamfer.scad>
|
||||
|
||||
box = gridfinity_bin("chuck_stand", 2, 2, 5);
|
||||
|
||||
box_mm = gridfinity_bin_size_mm(box);
|
||||
|
||||
bwall = 1;
|
||||
|
||||
chuck_d = 80;
|
||||
ring_od = 50;
|
||||
ring_id = 40;
|
||||
ring_h = 4;
|
||||
|
||||
hole_pitch = (60 + 72.5) / 2;
|
||||
hole_d = (72.5 - 60) / 2;
|
||||
hole_depth = 15;
|
||||
clearance = 0.5;
|
||||
chamfer = 1;
|
||||
|
||||
z_bot = gridfinity_base_z() + bwall;
|
||||
|
||||
module chuck_stand_stl()
|
||||
gridfinity_bin(box) union() {
|
||||
translate_z(z_bot) {
|
||||
for(a = [0 : 30 : 330])
|
||||
rotate(a)
|
||||
translate([0, hole_pitch / 2]) {
|
||||
poly_cylinder(hole_d / 2 + clearance / 2, h = 100);
|
||||
|
||||
translate_z(hole_depth)
|
||||
chamfer_hole(chamfer)
|
||||
poly_circle(hole_d / 2 + clearance / 2);
|
||||
}
|
||||
|
||||
translate_z(hole_depth) {
|
||||
poly_cylinder(r = chuck_d / 2 + clearance / 2, h = 100);
|
||||
|
||||
poly_tube(or = ring_od / 2 + clearance, ir = ring_id / 2 - clearance, h = 2 * ring_h, center = true);
|
||||
|
||||
chamfer_hole(chamfer)
|
||||
poly_circle(ring_od / 2 + clearance);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
translate_z(box_mm.z)
|
||||
chamfer_hole(chamfer)
|
||||
poly_circle(r = chuck_d / 2 + clearance / 2);
|
||||
}
|
56
examples/Gridfinity/scad/faceplate_stand.scad
Normal file
@@ -0,0 +1,56 @@
|
||||
include <NopSCADlib/core.scad>
|
||||
|
||||
use <NopSCADlib/printed/gridfinity.scad>
|
||||
use <NopSCADlib/utils/maths.scad>
|
||||
use <NopSCADlib/utils/chamfer.scad>
|
||||
|
||||
tool_size = 8;
|
||||
|
||||
box = gridfinity_bin("faceplate_stand", 3, 1, 5);
|
||||
|
||||
faceplate = [112, 16, 17];
|
||||
sanding_disc = [69, 6.7, 14.5];
|
||||
|
||||
discs = [faceplate, sanding_disc];
|
||||
|
||||
box_mm = gridfinity_bin_size_mm(box);
|
||||
wall = 1.8;
|
||||
bwall = 1;
|
||||
clearance = 0.5;
|
||||
|
||||
gap = (box_mm.y - sumv([for(b = discs) b.z])) / (len(discs) + 1);
|
||||
|
||||
module holes() {
|
||||
for(i = [0 : len(discs) - 1]) let($d = discs[i])
|
||||
translate([0, box_mm.y / 2 - gap - (i ? discs[0].z + gap : 0) - $d.z / 2])
|
||||
children();
|
||||
}
|
||||
|
||||
module faceplate_stand_stl()
|
||||
gridfinity_bin(box) union() {
|
||||
holes() {
|
||||
$fa = 1;
|
||||
r = $d.x / 2 + clearance / 2;
|
||||
z = gridfinity_base_z() + bwall + r;
|
||||
translate_z(z)
|
||||
rotate([90, 0, 0])
|
||||
teardrop_plus(r = r, h = $d.y + clearance, center = true);
|
||||
|
||||
chamfer = 1;
|
||||
h = z - box_mm.z + wall;
|
||||
translate_z(box_mm.z)
|
||||
chamfer_hole(chamfer)
|
||||
square([2 * sqrt(sqr(r) - sqr(h)), $d.y + clearance], true);
|
||||
}
|
||||
difference() {
|
||||
translate_z(gridfinity_base_z() + bwall)
|
||||
rounded_rectangle([box_mm.x - 2 * wall, box_mm.y - 2 * wall, box_mm.z - gridfinity_base_z() - bwall - wall], gridfinity_corner_r() - wall);
|
||||
|
||||
holes() {
|
||||
r = $d.x / 2 + clearance / 2;
|
||||
translate_z(gridfinity_base_z() + bwall + r)
|
||||
rotate([90, 0, 0])
|
||||
teardrop_plus(r = r + wall, h = $d.y + clearance + 2 * wall);
|
||||
}
|
||||
}
|
||||
}
|
45
examples/Gridfinity/scad/lathe_tool_stand.scad
Normal file
@@ -0,0 +1,45 @@
|
||||
include <NopSCADlib/core.scad>
|
||||
|
||||
use <NopSCADlib/printed/gridfinity.scad>
|
||||
use <NopSCADlib/utils/chamfer.scad>
|
||||
|
||||
tool_size = 8;
|
||||
|
||||
rows = 2;
|
||||
cols = 5;
|
||||
spacing = 8;
|
||||
|
||||
hole = tool_size + 0.2;
|
||||
|
||||
tool_pitch = hole + spacing;
|
||||
|
||||
box = gridfinity_bin("lathe_tool_stand", 2, 1, 5);
|
||||
|
||||
module holes()
|
||||
for(x = [0 : cols - 1], y = [0 : rows - 1])
|
||||
translate([x - (cols -1) / 2, y - (rows - 1) / 2] * tool_pitch)
|
||||
children();
|
||||
|
||||
box_mm = gridfinity_bin_size_mm(box);
|
||||
wall = 1.75;
|
||||
bwall = 1;
|
||||
|
||||
module lathe_tool_stand_stl()
|
||||
gridfinity_bin(box) union() {
|
||||
translate_z(box_mm.z)
|
||||
holes() {
|
||||
cube([hole, hole, 2 * (box_mm.z - gridfinity_base_z() - bwall)], true);
|
||||
|
||||
chamfer = 1;
|
||||
chamfer_hole(chamfer)
|
||||
square([hole, hole], true);
|
||||
}
|
||||
|
||||
translate_z(gridfinity_base_z() + bwall)
|
||||
difference() {
|
||||
rounded_rectangle([box_mm.x - 2 * wall, box_mm.y - 2 * wall, box_mm.z - gridfinity_base_z() - bwall - wall], gridfinity_corner_r() - wall);
|
||||
|
||||
holes()
|
||||
rounded_rectangle([hole + 2 * wall, hole + 2 * wall, 100], wall, center = true);
|
||||
}
|
||||
}
|
42
examples/Gridfinity/scad/main.scad
Normal file
@@ -0,0 +1,42 @@
|
||||
//
|
||||
//! Gridfinity examples
|
||||
//
|
||||
include <NopSCADlib/core.scad>
|
||||
|
||||
use <lathe_tool_stand.scad>
|
||||
use <MT2_stand.scad>
|
||||
use <chuck_stand.scad>
|
||||
use <chuck_jaw_bin.scad>
|
||||
use <1x1_bin.scad>
|
||||
use <123_block_stand.scad>
|
||||
use <faceplate_stand.scad>
|
||||
|
||||
|
||||
//! Show all the Gridfinity parts
|
||||
module main_assembly()
|
||||
assembly("main") {
|
||||
$manifold = true;
|
||||
|
||||
lathe_tool_stand_stl();
|
||||
|
||||
translate([42, 63])
|
||||
MT2_stand_stl();
|
||||
|
||||
translate([42 * 2, -42 / 2])
|
||||
chuck_stand_stl();
|
||||
|
||||
translate([-21, -42])
|
||||
chuck_jaw_bin_stl();
|
||||
|
||||
translate([21, -42])
|
||||
1x1_bin_stl();
|
||||
|
||||
translate([42 * 4, -42 / 2])
|
||||
123_block_stand_stl();
|
||||
|
||||
translate([42 * 6.5, 0])
|
||||
faceplate_stand_stl();
|
||||
}
|
||||
|
||||
|
||||
main_assembly();
|
BIN
examples/Gridfinity/stls/123_block_stand.png
Normal file
After Width: | Height: | Size: 15 KiB |
19882
examples/Gridfinity/stls/123_block_stand.stl
Normal file
BIN
examples/Gridfinity/stls/1x1_bin.png
Normal file
After Width: | Height: | Size: 14 KiB |
18734
examples/Gridfinity/stls/1x1_bin.stl
Normal file
BIN
examples/Gridfinity/stls/MT2_stand.png
Normal file
After Width: | Height: | Size: 14 KiB |
53622
examples/Gridfinity/stls/MT2_stand.stl
Normal file
BIN
examples/Gridfinity/stls/chuck_jaw_bin.png
Normal file
After Width: | Height: | Size: 14 KiB |
4006
examples/Gridfinity/stls/chuck_jaw_bin.stl
Normal file
BIN
examples/Gridfinity/stls/chuck_stand.png
Normal file
After Width: | Height: | Size: 16 KiB |
40434
examples/Gridfinity/stls/chuck_stand.stl
Normal file
BIN
examples/Gridfinity/stls/faceplate_stand.png
Normal file
After Width: | Height: | Size: 15 KiB |
20470
examples/Gridfinity/stls/faceplate_stand.stl
Normal file
BIN
examples/Gridfinity/stls/lathe_tool_stand.png
Normal file
After Width: | Height: | Size: 16 KiB |
26434
examples/Gridfinity/stls/lathe_tool_stand.stl
Normal file
Before Width: | Height: | Size: 96 KiB After Width: | Height: | Size: 96 KiB |
Before Width: | Height: | Size: 108 KiB After Width: | Height: | Size: 107 KiB |
Before Width: | Height: | Size: 104 KiB After Width: | Height: | Size: 104 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 137 KiB After Width: | Height: | Size: 137 KiB |
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 27 KiB |
Before Width: | Height: | Size: 200 KiB After Width: | Height: | Size: 200 KiB |
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 123 KiB After Width: | Height: | Size: 122 KiB |
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 134 KiB After Width: | Height: | Size: 134 KiB |
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
@@ -14,7 +14,8 @@
|
||||
"printed": {
|
||||
"socket_box.stl": {
|
||||
"count": 1,
|
||||
"colour": "dimgrey"
|
||||
"colour": "dimgrey",
|
||||
"camera": "0,0,0,70,0,315,500"
|
||||
}
|
||||
},
|
||||
"routed": {}
|
||||
@@ -42,7 +43,8 @@
|
||||
"printed": {
|
||||
"foot.stl": {
|
||||
"count": 4,
|
||||
"colour": "darkorange"
|
||||
"colour": "darkorange",
|
||||
"camera": "0,0,0,70,0,315,500"
|
||||
}
|
||||
},
|
||||
"routed": {}
|
||||
|
@@ -70,7 +70,7 @@ Earth leakage can be measured Canadian CSA style by disconnected the neutral lin
|
||||
|
||||
### 3D Printed parts
|
||||
|
||||
| 1 x socket_box.stl |
|
||||
| 1 x [socket_box.stl](stls/socket_box.stl) |
|
||||
|---|
|
||||
| 
|
||||
|
||||
@@ -100,7 +100,7 @@ Earth leakage can be measured Canadian CSA style by disconnected the neutral lin
|
||||
|
||||
### 3D Printed parts
|
||||
|
||||
| 4 x foot.stl |
|
||||
| 4 x [foot.stl](stls/foot.stl) |
|
||||
|---|
|
||||
| 
|
||||
|
||||
|
Before Width: | Height: | Size: 8.6 KiB After Width: | Height: | Size: 8.7 KiB |
3
lib.scad
@@ -23,7 +23,7 @@
|
||||
include <core.scad>
|
||||
|
||||
include <vitamins/psus.scad>
|
||||
include <vitamins/pcbs.scad>
|
||||
include <vitamins/displays.scad> // Includes pcbs.scad
|
||||
|
||||
include <vitamins/antennas.scad>
|
||||
include <vitamins/batteries.scad>
|
||||
@@ -34,7 +34,6 @@ include <vitamins/box_sections.scad>
|
||||
include <vitamins/bulldogs.scad>
|
||||
include <vitamins/cameras.scad>
|
||||
include <vitamins/components.scad>
|
||||
include <vitamins/displays.scad>
|
||||
include <vitamins/extrusions.scad>
|
||||
include <vitamins/extrusion_brackets.scad>
|
||||
include <vitamins/fastons.scad>
|
||||
|
BIN
libtest.png
Before Width: | Height: | Size: 1018 KiB After Width: | Height: | Size: 1.0 MiB |
12
libtest.scad
@@ -25,7 +25,7 @@
|
||||
//! STL files for all the printed parts, DXF files for CNC routed parts in a project and a manual containing assembly
|
||||
//! instructions and exploded views by scraping markdown embedded in OpenSCAD comments, [see scripts](scripts/readme.md).
|
||||
//!
|
||||
//! A simple example project can be found [here](examples/MainsBreakOutBox/readme.md).
|
||||
//! A simple example project can be found [here](examples/MainsBreakOutBox/readme.md) and more complex examples [here](examples).
|
||||
//!
|
||||
//! For more examples of what it can make see the [gallery](gallery/readme.md).
|
||||
//!
|
||||
@@ -68,6 +68,7 @@ use <tests/fastons.scad>
|
||||
use <tests/fuseholder.scad>
|
||||
use <tests/gear_motors.scad>
|
||||
use <tests/geared_steppers.scad>
|
||||
use <tests/gridfinity.scad>
|
||||
use <tests/hot_ends.scad>
|
||||
use <tests/IECs.scad>
|
||||
use <tests/inserts.scad>
|
||||
@@ -204,7 +205,11 @@ pocket_y = handle_y + 70;
|
||||
translate([x5 + 65, pocket_y])
|
||||
pocket_handles();
|
||||
|
||||
hinge_y = pocket_y + 100;
|
||||
gridfinity_y = pocket_y + 100;
|
||||
translate([950, gridfinity_y])
|
||||
gridfinity_test();
|
||||
|
||||
hinge_y = gridfinity_y + 100;
|
||||
translate([x5, hinge_y]) {
|
||||
door_hinges()
|
||||
door_latches();
|
||||
@@ -221,7 +226,6 @@ box_y = pbox_y + 150;
|
||||
translate([950, box_y])
|
||||
box_test();
|
||||
|
||||
|
||||
inserts_y = 0;
|
||||
nuts_y = inserts_y + 20;
|
||||
washers_y = nuts_y + 160;
|
||||
@@ -469,7 +473,7 @@ translate([x3 + 10, hot_ends_y])
|
||||
translate([x2, panel_meters_y])
|
||||
panel_meters();
|
||||
|
||||
translate([x2, extrusions_y])
|
||||
translate([x2 - 15, extrusions_y])
|
||||
extrusions();
|
||||
|
||||
translate([x2, box_sections_y])
|
||||
|
104
printed/gridfinity.scad
Normal file
@@ -0,0 +1,104 @@
|
||||
//
|
||||
// NopSCADlib Copyright Chris Palmer 2024
|
||||
// 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/>.
|
||||
//
|
||||
|
||||
//
|
||||
//! Generate storage bins compatible with Zack Freedman's Gridfinity design, see <https://www.youtube.com/watch?v=ra_9zU-mnl8&t=37s>
|
||||
//!
|
||||
//! Based on <https://gridfinity.xyz/specification>
|
||||
//!
|
||||
//! More examples [here](examples/Gridfinity).
|
||||
//
|
||||
include <../core.scad>
|
||||
use <../utils/rounded_cylinder.scad>
|
||||
|
||||
pitch = 42;
|
||||
z_step = 7;
|
||||
width = 41.5;
|
||||
|
||||
foot_w = 37.2;
|
||||
foot_h = 1.8;
|
||||
|
||||
lower_chamfer = 0.8;
|
||||
upper_chamfer = 2.15;
|
||||
|
||||
corner_r = 7.5 / 2;
|
||||
foot_r = 3.2 / 2;
|
||||
chamfer_r = 1.6 / 2;
|
||||
|
||||
function gridfinity_bin(name, grid_x, grid_y, grid_z) = [name, [grid_x, grid_y, grid_z], lower_chamfer]; //! Constructor
|
||||
|
||||
function gridfinity_bin_name(type) = type[0]; //! Name for the STL file
|
||||
function gridfinity_bin_size(type) = type[1]; //! Size in grid units
|
||||
|
||||
function gridfinity_base_z() = foot_h + lower_chamfer + upper_chamfer; //! height of base
|
||||
function gridfinity_corner_r() = corner_r; //! Outside corner radius
|
||||
|
||||
function gridfinity_bin_size_mm(type) = //! Overall size of the bin
|
||||
let(s = gridfinity_bin_size(type))
|
||||
[(s.x - 1) * pitch + width, (s.y - 1) * pitch + width, s.z * z_step];
|
||||
|
||||
module gridfinity_bin(type) { //! Create a gridfinity bin, bits to cut out are passed as a child
|
||||
size = gridfinity_bin_size(type);
|
||||
w1 = width - 2 * (lower_chamfer + upper_chamfer);
|
||||
w2 = width - 2 * upper_chamfer;
|
||||
|
||||
stl(gridfinity_bin_name(type)) {
|
||||
translate([-(size.x - 1) / 2 * pitch, -(size.y - 1) / 2 * pitch])
|
||||
for(x = [0 : size.x - 1], y = [0 : size.y - 1])
|
||||
translate([x * pitch, y * pitch]) {
|
||||
hull() {
|
||||
rounded_rectangle([w1, w1, eps], chamfer_r);
|
||||
|
||||
translate_z(lower_chamfer)
|
||||
rounded_rectangle([w2, w2, foot_h + eps], foot_r);
|
||||
}
|
||||
|
||||
hull() {
|
||||
translate_z(lower_chamfer + foot_h)
|
||||
rounded_rectangle([w2, w2, foot_h + eps], foot_r);
|
||||
|
||||
translate_z(lower_chamfer + foot_h + upper_chamfer)
|
||||
rounded_rectangle([width, width, eps], corner_r);
|
||||
}
|
||||
}
|
||||
|
||||
difference() {
|
||||
base_z = gridfinity_base_z();
|
||||
translate_z(base_z)
|
||||
rounded_rectangle([(size.x - 1) * pitch + width, (size.y - 1) * pitch + width, size.z * z_step - base_z], corner_r);
|
||||
|
||||
if($children)
|
||||
children(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module gridfinity_partition(type, cols = 1, rows = 1, wall = 1.6, iwall = squeezed_wall, bwall = 1, corner_r = 4) { //! Passed as child to hollow out specified partitions
|
||||
size = gridfinity_bin_size_mm(type);
|
||||
wx = (size.x - 2 * wall - (cols - 1) * iwall) / cols;
|
||||
wy = (size.y - 2 * wall - (rows - 1) * iwall) / rows;
|
||||
h = size.z - gridfinity_base_z() - bwall;
|
||||
|
||||
for(x = [0 : cols - 1], y = [0 : rows - 1])
|
||||
translate([-size.x / 2 + wall + x * (wx + iwall) + wx / 2,
|
||||
-size.y / 2 + wall + y * (wy + iwall) + wy / 2,
|
||||
size.z + eps])
|
||||
vflip()
|
||||
rounded_top_rectangle([wx, wy, h + eps], corner_r, corner_r);
|
||||
}
|
189
readme.md
@@ -6,7 +6,7 @@ There are also Python scripts to generate Bills of Materials (BOMs),
|
||||
STL files for all the printed parts, DXF files for CNC routed parts in a project and a manual containing assembly
|
||||
instructions and exploded views by scraping markdown embedded in OpenSCAD comments, [see scripts](scripts/readme.md).
|
||||
|
||||
A simple example project can be found [here](examples/MainsBreakOutBox/readme.md).
|
||||
A simple example project can be found [here](examples/MainsBreakOutBox/readme.md) and more complex examples [here](examples).
|
||||
|
||||
For more examples of what it can make see the [gallery](gallery/readme.md).
|
||||
|
||||
@@ -24,32 +24,32 @@ A list of changes classified as breaking, additions or fixes is maintained in [C
|
||||
<tr><td> <a href = "#7_segments">7_segments</a> </td><td> <a href = "#iecs">IECs</a> </td><td> <a href = "#radials">Radials</a> </td><td> <a href = "#box">Box</a> </td><td> <a href = "#annotation">Annotation</a> </td><td> <a href = "#bom">BOM</a> </td></tr>
|
||||
<tr><td> <a href = "#antennas">Antennas</a> </td><td> <a href = "#inserts">Inserts</a> </td><td> <a href = "#rails">Rails</a> </td><td> <a href = "#butt_box">Butt_box</a> </td><td> <a href = "#bezier">Bezier</a> </td><td> <a href = "#clip">Clip</a> </td></tr>
|
||||
<tr><td> <a href = "#axials">Axials</a> </td><td> <a href = "#jack">Jack</a> </td><td> <a href = "#ring_terminals">Ring_terminals</a> </td><td> <a href = "#cable_clip">Cable_clip</a> </td><td> <a href = "#catenary">Catenary</a> </td><td> <a href = "#global">Global</a> </td></tr>
|
||||
<tr><td> <a href = "#bldc_motors">BLDC_motors</a> </td><td> <a href = "#ldrs">LDRs</a> </td><td> <a href = "#rockers">Rockers</a> </td><td> <a href = "#cable_grommets">Cable_grommets</a> </td><td> <a href = "#core_xy">Core_xy</a> </td><td> <a href = "#polyholes">Polyholes</a> </td></tr>
|
||||
<tr><td> <a href = "#ball_bearings">Ball_bearings</a> </td><td> <a href = "#led_meters">LED_meters</a> </td><td> <a href = "#rod">Rod</a> </td><td> <a href = "#camera_housing">Camera_housing</a> </td><td> <a href = "#dimension">Dimension</a> </td><td> <a href = "#rounded_rectangle">Rounded_rectangle</a> </td></tr>
|
||||
<tr><td> <a href = "#batteries">Batteries</a> </td><td> <a href = "#leds">LEDs</a> </td><td> <a href = "#rod_ends">Rod_ends</a> </td><td> <a href = "#carriers">Carriers</a> </td><td> <a href = "#dogbones">Dogbones</a> </td><td> <a href = "#sphere">Sphere</a> </td></tr>
|
||||
<tr><td> <a href = "#bearing_blocks">Bearing_blocks</a> </td><td> <a href = "#leadnuts">Leadnuts</a> </td><td> <a href = "#sbr_rails">SBR_rails</a> </td><td> <a href = "#corner_block">Corner_block</a> </td><td> <a href = "#fillet">Fillet</a> </td><td> <a href = "#teardrops">Teardrops</a> </td></tr>
|
||||
<tr><td> <a href = "#belts">Belts</a> </td><td> <a href = "#light_strips">Light_strips</a> </td><td> <a href = "#sk_brackets">SK_brackets</a> </td><td> <a href = "#door_hinge">Door_hinge</a> </td><td> <a href = "#gears">Gears</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#blowers">Blowers</a> </td><td> <a href = "#linear_bearings">Linear_bearings</a> </td><td> <a href = "#smds">SMDs</a> </td><td> <a href = "#door_latch">Door_latch</a> </td><td> <a href = "#hanging_hole">Hanging_hole</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#box_sections">Box_sections</a> </td><td> <a href = "#magnets">Magnets</a> </td><td> <a href = "#ssrs">SSRs</a> </td><td> <a href = "#drag_chain">Drag_chain</a> </td><td> <a href = "#horiholes">Horiholes</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#bulldogs">Bulldogs</a> </td><td> <a href = "#mains_sockets">Mains_sockets</a> </td><td> <a href = "#screws">Screws</a> </td><td> <a href = "#fan_guard">Fan_guard</a> </td><td> <a href = "#layout">Layout</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#buttons">Buttons</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 = "#maths">Maths</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#cable_strips">Cable_strips</a> </td><td> <a href = "#microview">Microview</a> </td><td> <a href = "#servo_motors">Servo_motors</a> </td><td> <a href = "#flat_hinge">Flat_hinge</a> </td><td> <a href = "#offset">Offset</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#cameras">Cameras</a> </td><td> <a href = "#modules">Modules</a> </td><td> <a href = "#shaft_couplings">Shaft_couplings</a> </td><td> <a href = "#foot">Foot</a> </td><td> <a href = "#pcb_utils">PCB_utils</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#circlips">Circlips</a> </td><td> <a href = "#nuts">Nuts</a> </td><td> <a href = "#sheets">Sheets</a> </td><td> <a href = "#handle">Handle</a> </td><td> <a href = "#quadrant">Quadrant</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#components">Components</a> </td><td> <a href = "#o_ring">O_ring</a> </td><td> <a href = "#spades">Spades</a> </td><td> <a href = "#knob">Knob</a> </td><td> <a href = "#round">Round</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#dip">DIP</a> </td><td> <a href = "#opengrab">Opengrab</a> </td><td> <a href = "#spools">Spools</a> </td><td> <a href = "#led_bezel">LED_bezel</a> </td><td> <a href = "#rounded_cylinder">Rounded_cylinder</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#d_connectors">D_connectors</a> </td><td> <a href = "#pcb">PCB</a> </td><td> <a href = "#springs">Springs</a> </td><td> <a href = "#pcb_mount">PCB_mount</a> </td><td> <a href = "#rounded_polygon">Rounded_polygon</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#displays">Displays</a> </td><td> <a href = "#pcbs">PCBs</a> </td><td> <a href = "#stepper_motors">Stepper_motors</a> </td><td> <a href = "#psu_shroud">PSU_shroud</a> </td><td> <a href = "#rounded_triangle">Rounded_triangle</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#extrusion_brackets">Extrusion_brackets</a> </td><td> <a href = "#psus">PSUs</a> </td><td> <a href = "#swiss_clips">Swiss_clips</a> </td><td> <a href = "#pocket_handle">Pocket_handle</a> </td><td> <a href = "#sector">Sector</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#extrusions">Extrusions</a> </td><td> <a href = "#panel_meters">Panel_meters</a> </td><td> <a href = "#terminals">Terminals</a> </td><td> <a href = "#press_fit">Press_fit</a> </td><td> <a href = "#splines">Splines</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#fans">Fans</a> </td><td> <a href = "#photo_interrupters">Photo_interrupters</a> </td><td> <a href = "#toggles">Toggles</a> </td><td> <a href = "#printed_box">Printed_box</a> </td><td> <a href = "#sweep">Sweep</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#fastons">Fastons</a> </td><td> <a href = "#pillars">Pillars</a> </td><td> <a href = "#transformers">Transformers</a> </td><td> <a href = "#printed_pulleys">Printed_pulleys</a> </td><td> <a href = "#thread">Thread</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#fuseholder">Fuseholder</a> </td><td> <a href = "#pillow_blocks">Pillow_blocks</a> </td><td> <a href = "#ttracks">Ttracks</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 = "#gear_motors">Gear_motors</a> </td><td> <a href = "#pin_headers">Pin_headers</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 = "#geared_steppers">Geared_steppers</a> </td><td> <a href = "#potentiometers">Potentiometers</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 = "#green_terminals">Green_terminals</a> </td><td> <a href = "#pulleys">Pulleys</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 = "#ht_pipes">HT_pipes</a> </td><td></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 = "#hot_ends">Hot_ends</a> </td><td></td><td> <a href = "#wire">Wire</a> </td><td></td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#bldc_motors">BLDC_motors</a> </td><td> <a href = "#ldrs">LDRs</a> </td><td> <a href = "#rockers">Rockers</a> </td><td> <a href = "#cable_grommets">Cable_grommets</a> </td><td> <a href = "#chamfer">Chamfer</a> </td><td> <a href = "#polyholes">Polyholes</a> </td></tr>
|
||||
<tr><td> <a href = "#ball_bearings">Ball_bearings</a> </td><td> <a href = "#led_meters">LED_meters</a> </td><td> <a href = "#rod">Rod</a> </td><td> <a href = "#camera_housing">Camera_housing</a> </td><td> <a href = "#core_xy">Core_xy</a> </td><td> <a href = "#rounded_rectangle">Rounded_rectangle</a> </td></tr>
|
||||
<tr><td> <a href = "#batteries">Batteries</a> </td><td> <a href = "#leds">LEDs</a> </td><td> <a href = "#rod_ends">Rod_ends</a> </td><td> <a href = "#carriers">Carriers</a> </td><td> <a href = "#dimension">Dimension</a> </td><td> <a href = "#sphere">Sphere</a> </td></tr>
|
||||
<tr><td> <a href = "#bearing_blocks">Bearing_blocks</a> </td><td> <a href = "#leadnuts">Leadnuts</a> </td><td> <a href = "#sbr_rails">SBR_rails</a> </td><td> <a href = "#corner_block">Corner_block</a> </td><td> <a href = "#dogbones">Dogbones</a> </td><td> <a href = "#teardrops">Teardrops</a> </td></tr>
|
||||
<tr><td> <a href = "#belts">Belts</a> </td><td> <a href = "#light_strips">Light_strips</a> </td><td> <a href = "#sk_brackets">SK_brackets</a> </td><td> <a href = "#door_hinge">Door_hinge</a> </td><td> <a href = "#fillet">Fillet</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#blowers">Blowers</a> </td><td> <a href = "#linear_bearings">Linear_bearings</a> </td><td> <a href = "#smds">SMDs</a> </td><td> <a href = "#door_latch">Door_latch</a> </td><td> <a href = "#gears">Gears</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#box_sections">Box_sections</a> </td><td> <a href = "#magnets">Magnets</a> </td><td> <a href = "#ssrs">SSRs</a> </td><td> <a href = "#drag_chain">Drag_chain</a> </td><td> <a href = "#hanging_hole">Hanging_hole</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#bulldogs">Bulldogs</a> </td><td> <a href = "#mains_sockets">Mains_sockets</a> </td><td> <a href = "#screws">Screws</a> </td><td> <a href = "#fan_guard">Fan_guard</a> </td><td> <a href = "#horiholes">Horiholes</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#buttons">Buttons</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 = "#layout">Layout</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#cable_strips">Cable_strips</a> </td><td> <a href = "#microview">Microview</a> </td><td> <a href = "#servo_motors">Servo_motors</a> </td><td> <a href = "#flat_hinge">Flat_hinge</a> </td><td> <a href = "#maths">Maths</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#cameras">Cameras</a> </td><td> <a href = "#modules">Modules</a> </td><td> <a href = "#shaft_couplings">Shaft_couplings</a> </td><td> <a href = "#foot">Foot</a> </td><td> <a href = "#offset">Offset</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#circlips">Circlips</a> </td><td> <a href = "#nuts">Nuts</a> </td><td> <a href = "#sheets">Sheets</a> </td><td> <a href = "#gridfinity">Gridfinity</a> </td><td> <a href = "#pcb_utils">PCB_utils</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#components">Components</a> </td><td> <a href = "#o_ring">O_ring</a> </td><td> <a href = "#spades">Spades</a> </td><td> <a href = "#handle">Handle</a> </td><td> <a href = "#quadrant">Quadrant</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#dip">DIP</a> </td><td> <a href = "#opengrab">Opengrab</a> </td><td> <a href = "#spools">Spools</a> </td><td> <a href = "#knob">Knob</a> </td><td> <a href = "#round">Round</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#d_connectors">D_connectors</a> </td><td> <a href = "#pcb">PCB</a> </td><td> <a href = "#springs">Springs</a> </td><td> <a href = "#led_bezel">LED_bezel</a> </td><td> <a href = "#rounded_cylinder">Rounded_cylinder</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#displays">Displays</a> </td><td> <a href = "#pcbs">PCBs</a> </td><td> <a href = "#stepper_motors">Stepper_motors</a> </td><td> <a href = "#pcb_mount">PCB_mount</a> </td><td> <a href = "#rounded_polygon">Rounded_polygon</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#extrusion_brackets">Extrusion_brackets</a> </td><td> <a href = "#psus">PSUs</a> </td><td> <a href = "#swiss_clips">Swiss_clips</a> </td><td> <a href = "#psu_shroud">PSU_shroud</a> </td><td> <a href = "#rounded_triangle">Rounded_triangle</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#extrusions">Extrusions</a> </td><td> <a href = "#panel_meters">Panel_meters</a> </td><td> <a href = "#terminals">Terminals</a> </td><td> <a href = "#pocket_handle">Pocket_handle</a> </td><td> <a href = "#sector">Sector</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#fans">Fans</a> </td><td> <a href = "#photo_interrupters">Photo_interrupters</a> </td><td> <a href = "#toggles">Toggles</a> </td><td> <a href = "#press_fit">Press_fit</a> </td><td> <a href = "#splines">Splines</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#fastons">Fastons</a> </td><td> <a href = "#pillars">Pillars</a> </td><td> <a href = "#transformers">Transformers</a> </td><td> <a href = "#printed_box">Printed_box</a> </td><td> <a href = "#sweep">Sweep</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#fuseholder">Fuseholder</a> </td><td> <a href = "#pillow_blocks">Pillow_blocks</a> </td><td> <a href = "#ttracks">Ttracks</a> </td><td> <a href = "#printed_pulleys">Printed_pulleys</a> </td><td> <a href = "#thread">Thread</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#gear_motors">Gear_motors</a> </td><td> <a href = "#pin_headers">Pin_headers</a> </td><td> <a href = "#tubings">Tubings</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 = "#geared_steppers">Geared_steppers</a> </td><td> <a href = "#potentiometers">Potentiometers</a> </td><td> <a href = "#variacs">Variacs</a> </td><td> <a href = "#ssr_shroud">SSR_shroud</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#green_terminals">Green_terminals</a> </td><td> <a href = "#pulleys">Pulleys</a> </td><td> <a href = "#veroboard">Veroboard</a> </td><td> <a href = "#screw_knob">Screw_knob</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#ht_pipes">HT_pipes</a> </td><td></td><td> <a href = "#washers">Washers</a> </td><td> <a href = "#socket_box">Socket_box</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#hot_ends">Hot_ends</a> </td><td></td><td> <a href = "#wire">Wire</a> </td><td> <a href = "#strap_handle">Strap_handle</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#hygrometer">Hygrometer</a> </td><td></td><td> <a href = "#zipties">Zipties</a> </td><td></td><td></td><td></td></tr>
|
||||
</table>
|
||||
|
||||
@@ -1106,7 +1106,7 @@ LCD displays.
|
||||
| 1 | `display(BigTreeTech_TFT35v3_0)` | BigTreeTech TFT35 v3.0 |
|
||||
| 1 | `display(HDMI5)` | HDMI display 5" |
|
||||
| 1 | `display(TFT128x160)` | LCD TFT ST7735 display 128x160 |
|
||||
| 1 | `display(LCD1602A)` | LCD display 1602A |
|
||||
| 2 | `display(LCD1602A)` | LCD display 1602A |
|
||||
| 1 | `display(LCD2004A)` | LCD display 2004A |
|
||||
| 1 | `display(LCDS7282B)` | LCD display S-7282B |
|
||||
| 1 | `display(SSD1963_4p3)` | LCD display SSD1963 4.3" |
|
||||
@@ -1210,24 +1210,26 @@ Aluminium extrusion.
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| `extrusion(type, length, center = true, cornerHole = false)` | Draw the specified extrusion |
|
||||
| `extrusion(type, length, center = true, cornerHole = true)` | Draw the specified extrusion |
|
||||
|
||||

|
||||
|
||||
### Vitamins
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 1 | `extrusion(E1515, 80)` | Extrusion E1515 x 80mm |
|
||||
| 1 | `extrusion(E2020, 80)` | Extrusion E2020 x 80mm |
|
||||
| 1 | `extrusion(E2020t, 80)` | Extrusion E2020t x 80mm |
|
||||
| 1 | `extrusion(E2040, 80)` | Extrusion E2040 x 80mm |
|
||||
| 1 | `extrusion(E2060, 80)` | Extrusion E2060 x 80mm |
|
||||
| 1 | `extrusion(E2080, 80)` | Extrusion E2080 x 80mm |
|
||||
| 1 | `extrusion(E1515, 80, cornerHole = true)` | Extrusion E1515 x 80mm |
|
||||
| 1 | `extrusion(E2020, 80, cornerHole = true)` | Extrusion E2020 x 80mm |
|
||||
| 1 | `extrusion(E2020t, 80, cornerHole = true)` | Extrusion E2020t x 80mm |
|
||||
| 1 | `extrusion(E2040, 80, cornerHole = true)` | Extrusion E2040 x 80mm |
|
||||
| 1 | `extrusion(E2060, 80, cornerHole = true)` | Extrusion E2060 x 80mm |
|
||||
| 1 | `extrusion(E2080, 80, cornerHole = true)` | Extrusion E2080 x 80mm |
|
||||
| 1 | `extrusion(E3030, 80, cornerHole = true)` | Extrusion E3030 x 80mm |
|
||||
| 1 | `extrusion(E3060, 80, cornerHole = true)` | Extrusion E3060 x 80mm |
|
||||
| 1 | `extrusion(E4040, 80, cornerHole = true)` | Extrusion E4040 x 80mm |
|
||||
| 1 | `extrusion(E4040t, 80, cornerHole = true)` | Extrusion E4040t x 80mm |
|
||||
| 1 | `extrusion(E4080, 80, cornerHole = true)` | Extrusion E4080 x 80mm |
|
||||
| 1 | `extrusion(Makerbeam, 80, cornerHole = true)` | Extrusion Makerbeam x 80mm |
|
||||
| 1 | `extrusion(MakerbeamXL, 80, cornerHole = true)` | Extrusion MakerbeamXL x 80mm |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -3000,12 +3002,14 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| 1 | `pcb(EnviroPlus)` | Enviro+ |
|
||||
| 1 | `pcb(ExtruderPCB)` | Extruder connection PCB - not shown |
|
||||
| 1 | `pcb(HW803_1WAY_RELAY)` | HW-803 5V 1 way relay module |
|
||||
| 1 | `pcb(I2C_LCD_Backpack)` | I2C / SPI character LCD backpack |
|
||||
| 1 | `pcb(KY_040)` | KY-040 rotart encoder breakout |
|
||||
| 1 | `pcb(Keyes5p1)` | Keyes5.1 Arduino Uno expansion board - not shown |
|
||||
| 1 | `pcb(L9110S)` | L9110S 2-Channel motor driver module |
|
||||
| 1 | `pcb(LIPO_fuel_gauge)` | LIPO fuel gauge |
|
||||
| 1 | `pcb(MP1584EN)` | MP1584EN 3A buck converter |
|
||||
| 1 | `pcb(MT3608)` | MT3608 boost converter module |
|
||||
| 1 | `pcb(MELLOW_FLY_D5)` | Mellow FLY D5 |
|
||||
| 1 | `pcb(Melzi)` | Melzi electronics - not shown |
|
||||
| 6 | | Micro SD card |
|
||||
| 1 | | Micro SD card - not shown |
|
||||
@@ -3014,7 +3018,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| 1 | `molex_254(3)` | Molex KK header 3 way - not shown |
|
||||
| 20 | `nut(M2_nut, nyloc = true)` | Nut M2 x 1.6mm nyloc |
|
||||
| 38 | `nut(M2p5_nut, nyloc = true)` | Nut M2.5 x 2.2mm nyloc |
|
||||
| 48 | `nut(M3_nut, nyloc = true)` | Nut M3 x 2.4mm nyloc |
|
||||
| 52 | `nut(M3_nut, nyloc = true)` | Nut M3 x 2.4mm nyloc |
|
||||
| 8 | `nut(M4_nut, nyloc = true)` | Nut M4 x 3.2mm nyloc |
|
||||
| 1 | `pcb(OPZ2)` | Orange Pi Zero 2 |
|
||||
| 1 | `pcb(PI_IO)` | PI_IO V2 - not shown |
|
||||
@@ -3038,17 +3042,17 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| 4 | `screw(M2_cap_screw, 25)` | Screw M2 cap x 25mm |
|
||||
| 2 | `screw(M2p5_cap_screw, 20)` | Screw M2.5 cap x 20mm |
|
||||
| 8 | `screw(M2p5_cap_screw, 30)` | Screw M2.5 cap x 30mm |
|
||||
| 8 | `screw(M2p5_cap_screw, 35)` | Screw M2.5 cap x 35mm |
|
||||
| 4 | `screw(M2p5_cap_screw, 40)` | Screw M2.5 cap x 40mm |
|
||||
| 4 | `screw(M2p5_cap_screw, 35)` | Screw M2.5 cap x 35mm |
|
||||
| 8 | `screw(M2p5_cap_screw, 40)` | Screw M2.5 cap x 40mm |
|
||||
| 4 | `screw(M2p5_dome_screw, 25)` | Screw M2.5 dome x 25mm |
|
||||
| 4 | `screw(M2p5_pan_screw, 20)` | Screw M2.5 pan x 20mm |
|
||||
| 8 | `screw(M2p5_pan_screw, 30)` | Screw M2.5 pan x 30mm |
|
||||
| 19 | `screw(M3_cap_screw, 16)` | Screw M3 cap x 16mm |
|
||||
| 13 | `screw(M3_cap_screw, 20)` | Screw M3 cap x 20mm |
|
||||
| 4 | `screw(M2p5_pan_screw, 30)` | Screw M2.5 pan x 30mm |
|
||||
| 4 | `screw(M2p5_pan_screw, 35)` | Screw M2.5 pan x 35mm |
|
||||
| 18 | `screw(M3_cap_screw, 16)` | Screw M3 cap x 16mm |
|
||||
| 18 | `screw(M3_cap_screw, 20)` | Screw M3 cap x 20mm |
|
||||
| 5 | `screw(M3_cap_screw, 25)` | Screw M3 cap x 25mm |
|
||||
| 11 | `screw(M3_cap_screw, 35)` | Screw M3 cap x 35mm |
|
||||
| 4 | `screw(M4_cap_screw, 20)` | Screw M4 cap x 20mm |
|
||||
| 4 | `screw(M4_cap_screw, 25)` | Screw M4 cap x 25mm |
|
||||
| 8 | `screw(M4_cap_screw, 25)` | Screw M4 cap x 25mm |
|
||||
| 1 | `pcb(XIAO)` | Seeeduino XIAO |
|
||||
| 1 | `pcb(9DOF_stick)` | Sparkfun 9 degrees of freedom IMU |
|
||||
| 1 | `pcb(TP4056)` | TP4056 Li-lon Battery charger module |
|
||||
@@ -3059,7 +3063,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| 1 | `pcb(WD2002SJ)` | WD2002SJ Buck Boost DC-DC converter |
|
||||
| 20 | `washer(M2_washer)` | Washer M2 x 5mm x 0.3mm |
|
||||
| 38 | `washer(M2p5_washer)` | Washer M2.5 x 5.9mm x 0.5mm |
|
||||
| 48 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
|
||||
| 52 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
|
||||
| 8 | `washer(M4_washer)` | Washer M4 x 9mm x 0.8mm |
|
||||
| 1 | `pcb(ZC_A0591)` | ZC-A0591 ULN2003 driver PCB |
|
||||
|
||||
@@ -3067,30 +3071,32 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| Qty | Filename |
|
||||
| ---:|:--- |
|
||||
| 4 | pcb_spacer20100.stl |
|
||||
| 4 | pcb_spacer20150.stl |
|
||||
| 4 | pcb_spacer20160.stl |
|
||||
| 4 | pcb_spacer2070.stl |
|
||||
| 4 | pcb_spacer2080.stl |
|
||||
| 4 | pcb_spacer2090.stl |
|
||||
| 2 | pcb_spacer25110.stl |
|
||||
| 4 | pcb_spacer25140.stl |
|
||||
| 4 | pcb_spacer25180.stl |
|
||||
| 4 | pcb_spacer25150.stl |
|
||||
| 4 | pcb_spacer25190.stl |
|
||||
| 4 | pcb_spacer25200_2.stl |
|
||||
| 4 | pcb_spacer25200.stl |
|
||||
| 4 | pcb_spacer25210_2.stl |
|
||||
| 4 | pcb_spacer25250.stl |
|
||||
| 4 | pcb_spacer25220_2.stl |
|
||||
| 4 | pcb_spacer25260.stl |
|
||||
| 4 | pcb_spacer25270.stl |
|
||||
| 4 | pcb_spacer25280.stl |
|
||||
| 4 | pcb_spacer2580.stl |
|
||||
| 5 | pcb_spacer30130.stl |
|
||||
| 4 | pcb_spacer30220.stl |
|
||||
| 1 | pcb_spacer30130.stl |
|
||||
| 4 | pcb_spacer30140.stl |
|
||||
| 4 | pcb_spacer30230.stl |
|
||||
| 3 | pcb_spacer30240.stl |
|
||||
| 4 | pcb_spacer30240.stl |
|
||||
| 3 | pcb_spacer30250.stl |
|
||||
| 10 | pcb_spacer3050.stl |
|
||||
| 9 | pcb_spacer3060.stl |
|
||||
| 8 | pcb_spacer3060.stl |
|
||||
| 9 | pcb_spacer3070.stl |
|
||||
| 4 | pcb_spacer3080.stl |
|
||||
| 5 | pcb_spacer3080.stl |
|
||||
| 4 | pcb_spacer3090.stl |
|
||||
| 4 | pcb_spacer40100.stl |
|
||||
| 4 | pcb_spacer4090.stl |
|
||||
| 4 | pcb_spacer40110.stl |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -4299,8 +4305,8 @@ SK shaft support brackets
|
||||
### Vitamins
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 2 | `extrusion(E2020, 20)` | Extrusion E2020 x 20mm |
|
||||
| 2 | `extrusion(E3030, 20)` | Extrusion E3030 x 20mm |
|
||||
| 2 | `extrusion(E2020, 20, cornerHole = true)` | Extrusion E2020 x 20mm |
|
||||
| 2 | `extrusion(E3030, 20, cornerHole = true)` | Extrusion E3030 x 20mm |
|
||||
| 2 | `sliding_t_nut(M4_hammer_nut)` | Nut M4 hammer |
|
||||
| 2 | `sliding_t_nut(M4_sliding_t_nut)` | Nut M4 sliding T |
|
||||
| 2 | `sliding_t_nut(M5_sliding_t_nut)` | Nut M5 sliding T |
|
||||
@@ -6279,6 +6285,49 @@ inserts don't grip well in rubber.
|
||||
| 1 | insert_foot_assembly |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="gridfinity"></a>
|
||||
## Gridfinity
|
||||
Generate storage bins compatible with Zack Freedman's Gridfinity design, see <https://www.youtube.com/watch?v=ra_9zU-mnl8&t=37s>
|
||||
|
||||
Based on <https://gridfinity.xyz/specification>
|
||||
|
||||
More examples [here](examples/Gridfinity).
|
||||
|
||||
[printed/gridfinity.scad](printed/gridfinity.scad) Implementation.
|
||||
|
||||
[tests/gridfinity.scad](tests/gridfinity.scad) Code for this example.
|
||||
|
||||
### Properties
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `gridfinity_bin_name(type)` | Name for the STL file |
|
||||
| `gridfinity_bin_size(type)` | Size in grid units |
|
||||
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `gridfinity_base_z()` | height of base |
|
||||
| `gridfinity_bin(name, grid_x, grid_y, grid_z)` | Constructor |
|
||||
| `gridfinity_bin_size_mm(type)` | Overall size of the bin |
|
||||
| `gridfinity_corner_r()` | Outside corner radius |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| `gridfinity_bin(type)` | Create a gridfinity bin, bits to cut out are passed as a child |
|
||||
| `gridfinity_partition(type, cols = 1, rows = 1, wall = 1.6, iwall = squeezed_wall, bwall = 1, corner_r = 4)` | Passed as child to hollow out specified partitions |
|
||||
|
||||

|
||||
|
||||
### Printed
|
||||
| Qty | Filename |
|
||||
| ---:|:--- |
|
||||
| 1 | chuck_stand.stl |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
@@ -7179,6 +7228,27 @@ The coordinates of the lowest point on the curve can be retrieved by calling `ca
|
||||

|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="chamfer"></a>
|
||||
## Chamfer
|
||||
45 degree chamfer the entrance to holes.
|
||||
|
||||
If the hole shape is concave then it must be described as a list of 2D convex children.
|
||||
|
||||
[utils/chamfer.scad](utils/chamfer.scad) Implementation.
|
||||
|
||||
[tests/chamfer.scad](tests/chamfer.scad) Code for this example.
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| `chamfer_hole(depth = 1)` | Chamfer a hole given a 2D outline as a child |
|
||||
|
||||

|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
@@ -7847,6 +7917,8 @@ The `pose()` module allows assembly views in the readme to be posed differently
|
||||
* To get the parameter values make the GUI window square, pose the view with the mouse and then copy the viewport parameters from the Edit menu and paste them into the pose invocation.
|
||||
* Two `pose()` modules can be chained to allow different poses for exploded and assembled views.
|
||||
|
||||
The `pose_stl()` module allows an STL child to be posed for its rendered image used in the readme for the project.
|
||||
|
||||
[utils/core/bom.scad](utils/core/bom.scad) Implementation.
|
||||
|
||||
[tests/BOM.scad](tests/BOM.scad) Code for this example.
|
||||
@@ -7870,8 +7942,9 @@ The `pose()` module allows assembly views in the readme to be posed differently
|
||||
| `no_explode()` | Prevent children being exploded |
|
||||
| `no_pose()` | Force children not to be posed even if parent is |
|
||||
| `not_on_bom(on = false)` | Specify the following child parts are not on the BOM, for example when they are on a PCB that comes assembled |
|
||||
| `pose(a = [55, 0, 25], t = [0, 0, 0], exploded = undef, d = undef)` | Pose an STL or assembly for rendering to png by specifying rotation `a`, translation `t` and optionally `d`, `exploded = true for` just the exploded view or `false` for unexploded only. |
|
||||
| `pose(a = [55, 0, 25], t = [0, 0, 0], exploded = undef, d = undef)` | Pose an assembly for rendering to png by specifying rotation `a`, translation `t` and optionally `d`, `exploded = true for` just the exploded view or `false` for unexploded only. |
|
||||
| `pose_hflip(exploded = undef)` | Pose an STL or assembly for rendering to png by flipping around the Y axis, `exploded = true for` just the exploded view or `false` for unexploded only. |
|
||||
| `pose_stl(a = [70, 0, 315], t = [0, 0, 0], d = 500)` | Pose an STL for its render, `a`, `t`, & `d` are camera parameters. |
|
||||
| `pose_vflip(exploded = undef)` | Pose an STL or assembly for rendering to png by flipping around the X axis, `exploded = true for` just the exploded view or `false` for unexploded only. |
|
||||
| `stl(name)` | Name an stl that will appear on the BOM, there needs to a module named `<name>_stl` to make it |
|
||||
| `stl_colour(colour = pp1_colour, alpha = 1)` | Colour an stl where it is placed in an assembly. `alpha` can be used to make it appear transparent. |
|
||||
|
@@ -69,7 +69,10 @@ class Part:
|
||||
self.count = 1
|
||||
for arg in args:
|
||||
arg = arg.replace('true', 'True').replace('false', 'False').replace('undef', 'None')
|
||||
exec('self.' + arg)
|
||||
try:
|
||||
exec('self.' + arg)
|
||||
except:
|
||||
print(arg)
|
||||
|
||||
def data(self):
|
||||
return self.__dict__
|
||||
@@ -107,7 +110,7 @@ class BOM:
|
||||
match = re.match(r'^(.*?\.stl|.*?\.dxf|.*?\.svg)\((.*)\)$', s) #look for name.stl(...), name.dxf(...) or name.svg(...)
|
||||
if match:
|
||||
s = match.group(1)
|
||||
args = [match.group(2)]
|
||||
args = match.group(2).split('|')
|
||||
if s[-4:] == ".stl":
|
||||
parts = self.printed
|
||||
else:
|
||||
|
@@ -61,11 +61,14 @@ def render(target, type):
|
||||
|
||||
things = { 'stl' : 'printed', 'dxf' : 'routed', 'svg' : 'routed' }[type]
|
||||
colours = {}
|
||||
cameras = {}
|
||||
for ass in flat_bom:
|
||||
for part in ass[things]:
|
||||
obj = ass[things][part]
|
||||
if "colour" in obj:
|
||||
colours[part] = obj["colour"]
|
||||
if "camera" in obj:
|
||||
cameras[part] = obj["camera"]
|
||||
#
|
||||
# Remove unused png files
|
||||
#
|
||||
@@ -87,13 +90,16 @@ def render(target, type):
|
||||
png_maker_name = tmp_dir + "/png.scad"
|
||||
pp1 = [0, 146/255, 0]
|
||||
colour = pp1
|
||||
camera = "0,0,0,70,0,315,500"
|
||||
if part in cameras:
|
||||
camera = cameras[part]
|
||||
if part in colours:
|
||||
colour = colours[part]
|
||||
if not '[' in colour:
|
||||
colour = '"' + colour + '"'
|
||||
with open(png_maker_name, "w") as f:
|
||||
f.write('color(%s) import("%s");\n' % (colour, reltmp(part_file, target)))
|
||||
cam = "--camera=0,0,0,70,0,315,500" if type == 'stl' else "--camera=0,0,0,0,0,0,500"
|
||||
cam = "--camera=" + camera if type == 'stl' else "--camera=0,0,0,0,0,0,500"
|
||||
render = "--preview" if type == 'stl' or colour != pp1 else "--render"
|
||||
tmp_name = tmp_dir + '/' + part[:-4] + '.png'
|
||||
dummy_deps_name = tmp_dir + '/tmp.deps' # work around for OpenSCAD issue #3879
|
||||
|
@@ -353,7 +353,7 @@ def views(target, do_assemblies = None):
|
||||
print('### 3D Printed parts', file = doc_file)
|
||||
keys = sorted(list(printed.keys()))
|
||||
for i, p in enumerate(keys):
|
||||
print('%s %d x %s |' % ('\n|' if not (i % 3) else '', printed[p]["count"], p), file = doc_file, end = '')
|
||||
print('%s %d x [%s](stls/%s) |' % ('\n|' if not (i % 3) else '', printed[p]["count"], p, p), file = doc_file, end = '')
|
||||
if (i % 3) == 2 or i == len(printed) - 1:
|
||||
n = (i % 3) + 1
|
||||
print('\n|%s' % ('---|' * n), file = doc_file)
|
||||
@@ -368,7 +368,10 @@ def views(target, do_assemblies = None):
|
||||
print("### CNC Routed parts", file = doc_file)
|
||||
keys = sorted(list(routed.keys()))
|
||||
for i, r in enumerate(keys):
|
||||
print('%s %d x %s |' % ('\n|' if not (i % 3) else '', routed[r]["count"], r), file = doc_file, end = '')
|
||||
if(r.endswith('dxf')):
|
||||
print('%s %d x [%s](dxfs/%s) |' % ('\n|' if not (i % 3) else '', routed[r]["count"], r, r), file = doc_file, end = '')
|
||||
elif(r.endswith('svg')):
|
||||
print('%s %d x [%s](svgs/%s) |' % ('\n|' if not (i % 3) else '', routed[r]["count"], r, r), file = doc_file, end = '')
|
||||
if (i % 3) == 2 or i == len(routed) - 1:
|
||||
n = (i % 3) + 1
|
||||
print('\n|%s' % ('---|' * n), file = doc_file)
|
||||
@@ -379,7 +382,7 @@ def views(target, do_assemblies = None):
|
||||
elif (part[-4:] == ".svg"):
|
||||
print('|  %s' % (part, part.replace('.svg','.png'), '|\n' if j == j - 1 else ''), end = '', file = doc_file)
|
||||
else:
|
||||
print("Unkown file type ", part[-4:], " for file ", part)
|
||||
print("Unknown file type ", part[-4:], " for file ", part)
|
||||
print('\n', file = doc_file)
|
||||
print('\n', file = doc_file)
|
||||
|
||||
|
@@ -22,7 +22,7 @@ use <../utils/layout.scad>
|
||||
include <../vitamins/leds.scad>
|
||||
|
||||
module leds()
|
||||
layout(echoit([for(l = LEDs) max(led_diameter(l))]), 5)
|
||||
layout([for(l = LEDs) max(led_diameter(l))], 5)
|
||||
led(LEDs[$i], ["green", "blue", "red", "orange"][$i % 4]);
|
||||
|
||||
if($preview)
|
||||
|
37
tests/chamfer.scad
Normal file
@@ -0,0 +1,37 @@
|
||||
//
|
||||
// NopSCADlib Copyright Chris Palmer 2025
|
||||
// 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/chamfer.scad>
|
||||
|
||||
module chamfer() {
|
||||
difference() {
|
||||
h = 1;
|
||||
rounded_rectangle([20, 20, h], 2);
|
||||
|
||||
translate_z(h)
|
||||
chamfer_hole(h + eps) {
|
||||
circle(2);
|
||||
|
||||
translate([-1, 0])
|
||||
square([2, 5]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
chamfer();
|
@@ -161,7 +161,7 @@ module coreXY_motor_in_back_test2() {
|
||||
lower_drive_pulley_offset = [20, 5];
|
||||
|
||||
|
||||
coreXY(coreXY_GT2_20_16, size, pos, separation, x_gap = 0, plain_idler_offset = [20, 0], upper_drive_pulley_offset, lower_drive_pulley_offset, show_pulleys = true, left_lower = false, motor_back = true);
|
||||
coreXY(coreXY_GT2_20_16, size, pos, separation, x_gap = 0, plain_idler_offset = [20, 0], upper_drive_pulley_offset = upper_drive_pulley_offset, lower_drive_pulley_offset = lower_drive_pulley_offset, show_pulleys = true, left_lower = false, motor_back = true);
|
||||
|
||||
translate (
|
||||
[ size.x - separation.x/2 - lower_drive_pulley_offset.x
|
||||
|
@@ -35,10 +35,10 @@ module extrusions()
|
||||
rotate(90)
|
||||
layout(heights, gap)
|
||||
rotate(-90)
|
||||
extrusion(list[$i], 80, cornerHole = extrusion_width(list[$i]) > 20);
|
||||
extrusion(list[$i], 80);
|
||||
}
|
||||
else
|
||||
extrusion(e, 80, cornerHole = extrusion_width(e) > 20);
|
||||
extrusion(e, 80);
|
||||
|
||||
if ($preview)
|
||||
extrusions();
|
||||
|
76
tests/gridfinity.scad
Normal file
@@ -0,0 +1,76 @@
|
||||
//
|
||||
// NopSCADlib Copyright Chris Palmer 2025
|
||||
// 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>
|
||||
|
||||
include <../printed/gridfinity.scad>
|
||||
|
||||
use <NopSCADlib/utils/chamfer.scad>
|
||||
|
||||
box = gridfinity_bin("chuck_stand", 2, 2, 5);
|
||||
|
||||
box_mm = gridfinity_bin_size_mm(box);
|
||||
|
||||
bwall = 1;
|
||||
|
||||
chuck_d = 80;
|
||||
ring_od = 50;
|
||||
ring_id = 40;
|
||||
ring_h = 4;
|
||||
|
||||
hole_pitch = (60 + 72.5) / 2;
|
||||
hole_d = (72.5 - 60) / 2;
|
||||
hole_depth = 15;
|
||||
clearance = 0.5;
|
||||
chamfer = 1;
|
||||
|
||||
z_bot = gridfinity_base_z() + bwall;
|
||||
|
||||
module chuck_stand_stl()
|
||||
gridfinity_bin(box) union() {
|
||||
translate_z(z_bot) {
|
||||
for(a = [0 : 30 : 330])
|
||||
rotate(a)
|
||||
translate([0, hole_pitch / 2]) {
|
||||
poly_cylinder(hole_d / 2 + clearance / 2, h = 100);
|
||||
|
||||
translate_z(hole_depth)
|
||||
chamfer_hole(chamfer)
|
||||
poly_circle(hole_d / 2 + clearance / 2);
|
||||
}
|
||||
|
||||
translate_z(hole_depth) {
|
||||
poly_cylinder(r = chuck_d / 2 + clearance / 2, h = 100);
|
||||
|
||||
poly_tube(or = ring_od / 2 + clearance, ir = ring_id / 2 - clearance, h = 2 * ring_h, center = true);
|
||||
|
||||
chamfer_hole(chamfer)
|
||||
poly_circle(ring_od / 2 + clearance);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
translate_z(box_mm.z)
|
||||
chamfer_hole(chamfer)
|
||||
poly_circle(r = chuck_d / 2 + clearance / 2);
|
||||
}
|
||||
|
||||
module gridfinity_test()
|
||||
stl_colour(pp1_colour) chuck_stand_stl();
|
||||
|
||||
gridfinity_test();
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 63 KiB |
BIN
tests/png/chamfer.png
Normal file
After Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 68 KiB |
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 77 KiB |
BIN
tests/png/gridfinity.png
Normal file
After Width: | Height: | Size: 68 KiB |
Before Width: | Height: | Size: 237 KiB After Width: | Height: | Size: 241 KiB |
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 75 KiB |
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 49 KiB |
38
utils/chamfer.scad
Normal file
@@ -0,0 +1,38 @@
|
||||
//
|
||||
// NopSCADlib Copyright Chris Palmer 2024
|
||||
// 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/>.
|
||||
//
|
||||
|
||||
//
|
||||
//! 45 degree chamfer the entrance to holes.
|
||||
//!
|
||||
//! If the hole shape is concave then it must be described as a list of 2D convex children.
|
||||
//
|
||||
include <core/core.scad>
|
||||
|
||||
module chamfer_hole(depth = 1) { //! Chamfer a hole given a 2D outline as a child
|
||||
for(i = [0 : $children - 1])
|
||||
hull() {
|
||||
linear_extrude(eps)
|
||||
offset(depth)
|
||||
children(i);
|
||||
|
||||
translate_z(-depth)
|
||||
linear_extrude(eps)
|
||||
children(i);
|
||||
}
|
||||
}
|
@@ -41,6 +41,8 @@
|
||||
//! * If the `d` parameter is set to specify the camera distance then the normal `viewall` and `autocenter` options are suppressed allowing a small section to be zoomed in to fill the view.
|
||||
//! * To get the parameter values make the GUI window square, pose the view with the mouse and then copy the viewport parameters from the Edit menu and paste them into the pose invocation.
|
||||
//! * Two `pose()` modules can be chained to allow different poses for exploded and assembled views.
|
||||
//!
|
||||
//! The `pose_stl()` module allows an STL child to be posed for its rendered image used in the readme for the project.
|
||||
//
|
||||
function bom_mode(n = 1) = (is_undef($bom) ? 0 : $bom) >= n && (is_undef($on_bom) || $on_bom); //! Current BOM mode, 0 = none, 1 = printed and routed parts and assemblies, 2 includes vitamins as well
|
||||
function exploded() = is_undef($exploded_parent) ? is_undef($explode) ? 0 : $explode : 0; //! Returns the value of `$explode` if it is defined, else `0`
|
||||
@@ -73,7 +75,7 @@ module explode(d, explode_children = false, offset = [0,0,0], show_line = true)
|
||||
module no_pose() //! Force children not to be posed even if parent is
|
||||
let($posed = true, $zoomed = undef) children();
|
||||
|
||||
module pose(a = [55, 0, 25], t = [0, 0, 0], exploded = undef, d = undef) //! Pose an STL or assembly for rendering to png by specifying rotation `a`, translation `t` and optionally `d`, `exploded = true for` just the exploded view or `false` for unexploded only.
|
||||
module pose(a = [55, 0, 25], t = [0, 0, 0], exploded = undef, d = undef) //! Pose an assembly for rendering to png by specifying rotation `a`, translation `t` and optionally `d`, `exploded = true for` just the exploded view or `false` for unexploded only.
|
||||
let($zoomed = is_undef(d)
|
||||
? is_undef($zoomed)
|
||||
? undef
|
||||
@@ -136,10 +138,15 @@ module stl_colour(colour = pp1_colour, alpha = 1) { //! Colour an stl where it i
|
||||
children();
|
||||
}
|
||||
|
||||
module pose_stl(a = [70, 0, 315], t = [0, 0, 0], d = 500) //! Pose an STL for its render, `a`, `t`, & `d` are camera parameters.
|
||||
let($stl_camera = str(t.x, ",", t.y, ",", t.z, ",", a.x, ",", a.y, ",", a.z, ",", d))
|
||||
children();
|
||||
|
||||
module stl(name) { //! Name an stl that will appear on the BOM, there needs to a module named `<name>_stl` to make it
|
||||
if(bom_mode() && is_undef($in_stl)) {
|
||||
colour = is_undef($stl_colour) ? pp1_colour : $stl_colour;
|
||||
echo(str("~", name, ".stl(colour='", colour, "')"));
|
||||
camera = is_undef($stl_camera) ? "0,0,0,70,0,315,500" : $stl_camera;
|
||||
echo(str("~", name, ".stl(colour='", colour, "'| camera='", camera, "')" ));
|
||||
}
|
||||
if($children)
|
||||
if(is_undef($pose))
|
||||
|