Compare commits
39 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
4ceb6bd863 | ||
|
e0df0f31a5 | ||
|
664d04ad93 | ||
|
78b8c2031e | ||
|
2001de2408 | ||
|
64fb562f58 | ||
|
bf163587fa | ||
|
1238dba90a | ||
|
f40a7d19a9 | ||
|
a054eb8216 | ||
|
05edd923b8 | ||
|
b58a59dab7 | ||
|
6b6ffb2b74 | ||
|
1e30ad24e8 | ||
|
dc715ff2b7 | ||
|
c57c202e31 | ||
|
26bfe96614 | ||
|
fa49ae09fa | ||
|
974457eabd | ||
|
2cc3c6ec7c | ||
|
633843d45e | ||
|
1a472c8ed5 | ||
|
f44d9ae424 | ||
|
4f0c443c8e | ||
|
ecd534b577 | ||
|
aec72118fa | ||
|
0d828f8f7f | ||
|
28c36a4e96 | ||
|
1ddfb35bda | ||
|
235caa4101 | ||
|
6a9af0af8a | ||
|
f066b1b8ae | ||
|
4be7b2f0ea | ||
|
3cc3c52b54 | ||
|
7f1634ef06 | ||
|
34c8c31cae | ||
|
a6a08088d9 | ||
|
06443a558b | ||
|
bcf9fb38df |
1
.gitignore
vendored
@@ -11,3 +11,4 @@ options.json
|
||||
times.txt
|
||||
*_diff.png
|
||||
*.echo
|
||||
cmd_times.txt
|
||||
|
57
CHANGELOG.md
@@ -3,6 +3,63 @@
|
||||
This changelog is generated by `changelog.py` using manually added semantic version tags to classify commits as breaking changes, additions or fixes.
|
||||
|
||||
|
||||
#### [v20.10.2](https://github.com/nophead/NopSCADlib/releases/tag/v20.10.2 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v20.10.1...v20.10.2 "diff with v20.10.1")
|
||||
* 2022-07-16 [`664d04a`](https://github.com/nophead/NopSCADlib/commit/664d04ad93c28c2614d5991e2b8dfa78964f6a99 "show commit") [C.](# "Chris") Now logs the time taken to run non OpenSCAD commands in `cmd_times.txt`
|
||||
|
||||
#### [v20.10.1](https://github.com/nophead/NopSCADlib/releases/tag/v20.10.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v20.10.0...v20.10.1 "diff with v20.10.0")
|
||||
* 2022-06-30 [`f44d9ae`](https://github.com/nophead/NopSCADlib/commit/f44d9ae424f407baa4f8b5187819b43b30800257 "show commit") [M.B.](# "Martin Budden") Made includes relative in `bldc_motors`.
|
||||
|
||||
* 2022-07-15 [`1238dba`](https://github.com/nophead/NopSCADlib/commit/1238dba90ac5c48ba01abb9e7926a064353489de "show commit") [C.](# "Chris") Updated readme.
|
||||
|
||||
* 2022-06-22 [`aec7211`](https://github.com/nophead/NopSCADlib/commit/aec72118fac218ca033264fa7b28db2bff7db10a "show commit") [M.B.](# "Martin Budden") Fixed typos.
|
||||
|
||||
### [v20.10.0](https://github.com/nophead/NopSCADlib/releases/tag/v20.10.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v20.9.0...v20.10.0 "diff with v20.9.0")
|
||||
* 2022-07-04 [`b58a59d`](https://github.com/nophead/NopSCADlib/commit/b58a59dab70bb414dd90dc5a9055d6bf3b4f6144 "show commit") [C.](# "Chris") Updated images and readme.
|
||||
|
||||
* 2022-07-04 [`6b6ffb2`](https://github.com/nophead/NopSCADlib/commit/6b6ffb2b74cc89ffecbcad7c304c3c4f047a8805 "show commit") [C.](# "Chris") Added SOICs to tests.
|
||||
|
||||
* 2022-07-04 [`1e30ad2`](https://github.com/nophead/NopSCADlib/commit/1e30ad24e802dc6e075fd73185551202101d4793 "show commit") [C.](# "Chris") Added `smd_soic` to `pcb_component()`.
|
||||
|
||||
* 2022-07-04 [`dc715ff`](https://github.com/nophead/NopSCADlib/commit/dc715ff2b70ae98615ee43750f3bb7613b481f7b "show commit") [C.](# "Chris") Tweaked SOIC text size.
|
||||
|
||||
* 2022-07-04 [`c57c202`](https://github.com/nophead/NopSCADlib/commit/c57c202e31c70351f38ef6299c60b0deb54bd296 "show commit") [M.](# "MS3FGX") Adjust lead sizing
|
||||
|
||||
* 2022-07-02 [`26bfe96`](https://github.com/nophead/NopSCADlib/commit/26bfe96614741206c8da6d126edfa9eb5326cb8f "show commit") [M.](# "MS3FGX") Add SOIC SMD Package
|
||||
|
||||
### [v20.9.0](https://github.com/nophead/NopSCADlib/releases/tag/v20.9.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v20.8.0...v20.9.0 "diff with v20.8.0")
|
||||
* 2022-07-02 [`2cc3c6e`](https://github.com/nophead/NopSCADlib/commit/2cc3c6ec7c9d8ee285d49111559d40fb2a3112e1 "show commit") [C.](# "Chris") Updated images and readme.
|
||||
|
||||
* 2022-07-02 [`633843d`](https://github.com/nophead/NopSCADlib/commit/633843d45eacd42619581a4619752700e1cd687b "show commit") [C.](# "Chris") Added LED1206 example to PCB test.
|
||||
|
||||
* 2022-07-02 [`1a472c8`](https://github.com/nophead/NopSCADlib/commit/1a472c8ed549e230f7df93989f3e1db729b4b281 "show commit") [M.](# "MS3FGX") Add 1206 SMD LED
|
||||
|
||||
### [v20.8.0](https://github.com/nophead/NopSCADlib/releases/tag/v20.8.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v20.7.0...v20.8.0 "diff with v20.7.0")
|
||||
* 2022-06-23 [`ecd534b`](https://github.com/nophead/NopSCADlib/commit/ecd534b5773928b9987023bd4370f661cc750fbd "show commit") [C.P.](# "Chris Palmer") Added `NEMA_connection_pos()`.
|
||||
Changed motor wire colours and tweaked wire position and size,
|
||||
|
||||
### [v20.7.0](https://github.com/nophead/NopSCADlib/releases/tag/v20.7.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v20.6.1...v20.7.0 "diff with v20.6.1")
|
||||
* 2022-06-21 [`28c36a4`](https://github.com/nophead/NopSCADlib/commit/28c36a4e966cceccbbdc330cf9a6fdeaa0283889 "show commit") [C.P.](# "Chris Palmer") `rounded_polygon()` now copes with the degenerate case when tangents intersect to form a sharp corner with no arc.
|
||||
Added an `offset()` function with some limitations.
|
||||
|
||||
#### [v20.6.1](https://github.com/nophead/NopSCADlib/releases/tag/v20.6.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v20.6.0...v20.6.1 "diff with v20.6.0")
|
||||
* 2022-06-21 [`6a9af0a`](https://github.com/nophead/NopSCADlib/commit/6a9af0af8aef68978b8be248810d07c85150341b "show commit") [C.P.](# "Chris Palmer") Updates images
|
||||
|
||||
* 2022-06-21 [`a6a0808`](https://github.com/nophead/NopSCADlib/commit/a6a08088d986dbcbc4d01c06e0475176ec8bc76f "show commit") [M.B.](# "Martin Budden") Fixed dimensions of E1515 extrusion.
|
||||
|
||||
* 2022-06-21 [`bcf9fb3`](https://github.com/nophead/NopSCADlib/commit/bcf9fb38dfabaf93508a380b85b12e3b23f28cf8 "show commit") [M.B.](# "Martin Budden") Fixed typos.
|
||||
|
||||
* 2022-06-21 [`06443a5`](https://github.com/nophead/NopSCADlib/commit/06443a558b407292a1e73f60c24cc90ec618d511 "show commit") [M.B.](# "Martin Budden") Standardised setting of imgsize in scripts.
|
||||
|
||||
### [v20.6.0](https://github.com/nophead/NopSCADlib/releases/tag/v20.6.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v20.5.1...v20.6.0 "diff with v20.5.1")
|
||||
* 2022-06-14 [`18f3d43`](https://github.com/nophead/NopSCADlib/commit/18f3d43780d7e083fc3b21290db2049fb4364a46 "show commit") [C.P.](# "Chris Palmer") Added convexity parameter to `clip()`.
|
||||
|
||||
#### [v20.5.1](https://github.com/nophead/NopSCADlib/releases/tag/v20.5.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v20.5.0...v20.5.1 "diff with v20.5.0")
|
||||
* 2022-06-14 [`eda88cc`](https://github.com/nophead/NopSCADlib/commit/eda88cc8d75eb4c0cb59b368b4e2ad3db2115834 "show commit") [C.P.](# "Chris Palmer") Fixed `vero()` constructor documentation.
|
||||
Fixed missing space in veroboard vitamin description.
|
||||
|
||||
* 2022-06-14 [`630268d`](https://github.com/nophead/NopSCADlib/commit/630268d71a0b478c28b6bde2a7c3ff9074c7a8fb "show commit") [C.P.](# "Chris Palmer") Changed `screw_knob()` facets to be suitable for 3D printing.
|
||||
Fixed `knob_height()` so it can take a screw as a type.
|
||||
|
||||
### [v20.5.0](https://github.com/nophead/NopSCADlib/releases/tag/v20.5.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v20.4.0...v20.5.0 "diff with v20.4.0")
|
||||
* 2022-05-31 [`cc5654d`](https://github.com/nophead/NopSCADlib/commit/cc5654d7d756287f5311e35104003f38a4a94475 "show commit") [C.](# "Chris") Added `usb_miniA()`.
|
||||
|
||||
|
BIN
libtest.png
Before Width: | Height: | Size: 985 KiB After Width: | Height: | Size: 984 KiB |
@@ -111,8 +111,8 @@ module hinge_male(type, female = false) { //! The half with the stationary
|
||||
rotate(180)
|
||||
teardrop(r = kr, h = 0);
|
||||
|
||||
translate([-kr - 1, -kr])
|
||||
square(1);
|
||||
translate([-kr - inset - eps, -kr])
|
||||
square([eps, t]);
|
||||
}
|
||||
teardrop_plus(r = pr + (female ? gap : 0), h = 0);
|
||||
}
|
||||
|
@@ -44,7 +44,7 @@ function knob_height(type) = //! Total height of the knob
|
||||
screw_knob_stem_h(type) + screw_knob_flange_t(type);
|
||||
|
||||
module screw_knob(type) { //! Generate the STL for a knob to fit the specified hex screw
|
||||
type = !is_list(type[0]) ? screw_knob(type) : type; // Allow just the screw to be specified for backwards compatability
|
||||
type = !is_list(type[0]) ? screw_knob(type) : type; // Allow just the screw to be specified for backwards compatibility
|
||||
screw = screw_knob_screw(type);
|
||||
wall = screw_knob_wall(type);
|
||||
trap_r = nut_trap_radius(screw_nut(screw));
|
||||
|
20
readme.md
@@ -2440,12 +2440,16 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| 1 | `ax_res(res1_8, 1e+6, tol = 1)` | Resistor 1e+6 Ohms 1% 0.125W |
|
||||
| 1 | `smd_led(LED0603, orange)` | SMD LED 0603 orange |
|
||||
| 1 | `smd_led(LED0805, red)` | SMD LED 0805 red |
|
||||
| 1 | `smd_led(LED1206, blue)` | SMD LED 1306 blue |
|
||||
| 1 | `smd_capacitor(CAP0603)` | SMD capacitor 0603 |
|
||||
| 1 | `smd_capacitor(CAP0805)` | SMD capacitor 0805 |
|
||||
| 1 | `smd_capacitor(CAP1206)` | SMD capacitor 1206 |
|
||||
| 1 | `smd_resistor(RES0603, 1K)` | SMD resistor 0603 1K 0.1W |
|
||||
| 1 | `smd_resistor(RES0805, 1K)` | SMD resistor 0805 1K 0.125W |
|
||||
| 1 | `smd_resistor(RES1206, 1K)` | SMD resistor 1206 1K 0.25W |
|
||||
| 1 | `smd_soic(SOIC16)` | SOIC16 package ICL323 |
|
||||
| 1 | `smd_soic(SOIC18)` | SOIC18 package PIC18F88 |
|
||||
| 1 | `smd_soic(SOIC8)` | SOIC8 package M34063 |
|
||||
| 1 | `smd_sot(SOT223)` | SOT223 package LM117 |
|
||||
| 1 | `smd_sot(SOT23)` | SOT23 package 2N7000 |
|
||||
| 1 | `square_button(button_4p5mm)` | Square button 4.5mm |
|
||||
@@ -3643,6 +3647,12 @@ Surface mount components for PCBs.
|
||||
| `smd_res_end_cap(type)` | End cap width |
|
||||
| `smd_res_power(type)` | Power rating in Watts |
|
||||
| `smd_res_size(type)` | Body length, width and height |
|
||||
| `smd_soic_lead_pitch(type)` | Lead pitch |
|
||||
| `smd_soic_lead_size(type)` | Lead width, foot depth, lead thickness |
|
||||
| `smd_soic_lead_span(type)` | Total span of leads |
|
||||
| `smd_soic_lead_z(type)` | Top of lead frame from top |
|
||||
| `smd_soic_size(type)` | Body length, width and height |
|
||||
| `smd_soic_z(type)` | Height above PCB surface |
|
||||
| `smd_sot_lead_pitch(type)` | Lead pitch |
|
||||
| `smd_sot_lead_size(type)` | Lead width, foot depth, lead thickness |
|
||||
| `smd_sot_lead_span(type)` | Total span of leads |
|
||||
@@ -3664,6 +3674,7 @@ Surface mount components for PCBs.
|
||||
| `smd_capacitor(type, height, value = undef)` | Draw an SMD capacitor with specified height |
|
||||
| `smd_led(type, colour, cutout)` | Draw an SMD LED with specified `colour` |
|
||||
| `smd_resistor(type, value)` | Draw an SMD resistor with specified value |
|
||||
| `smd_soic(type, value)` | Draw an SMD SOIC |
|
||||
| `smd_sot(type, value)` | Draw an SMD transistor |
|
||||
|
||||

|
||||
@@ -3673,12 +3684,16 @@ Surface mount components for PCBs.
|
||||
| ---:|:--- |:---|
|
||||
| 1 | `smd_led(LED0603, green)` | SMD LED 0603 green |
|
||||
| 1 | `smd_led(LED0805, blue)` | SMD LED 0805 blue |
|
||||
| 1 | `smd_led(LED1206, red)` | SMD LED 1306 red |
|
||||
| 1 | `smd_capacitor(CAP0603)` | SMD capacitor 0603 |
|
||||
| 1 | `smd_capacitor(CAP0805)` | SMD capacitor 0805 |
|
||||
| 1 | `smd_capacitor(CAP1206)` | SMD capacitor 1206 |
|
||||
| 1 | `smd_resistor(RES0603, 1R0)` | SMD resistor 0603 1R0 0.1W |
|
||||
| 1 | `smd_resistor(RES0805, 10M)` | SMD resistor 0805 10M 0.125W |
|
||||
| 1 | `smd_resistor(RES1206, 100K)` | SMD resistor 1206 100K 0.25W |
|
||||
| 1 | `smd_soic(SOIC16)` | SOIC16 package SOIC16 |
|
||||
| 1 | `smd_soic(SOIC18)` | SOIC18 package SOIC18 |
|
||||
| 1 | `smd_soic(SOIC8)` | SOIC8 package SOIC8 |
|
||||
| 1 | `smd_sot(SOT223)` | SOT223 package FZT851 |
|
||||
| 1 | `smd_sot(SOT23)` | SOT23 package 2N7000 |
|
||||
|
||||
@@ -3887,6 +3902,7 @@ NEMA stepper motor model.
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `NEMA_big_hole(type)` | Clearance hole for the big boss |
|
||||
| `NEMA_connection_pos(type, jst_connector = false)` | Position of the wires or the connector |
|
||||
| `NEMA_holes(type)` | Screw positions for for loop |
|
||||
|
||||
### Modules
|
||||
@@ -6608,6 +6624,8 @@ Because the tangents need to be calculated to find the length these can be calcu
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `circle_tangent(p1, p2)` | Compute the clockwise tangent between two circles represented as [x,y,r] |
|
||||
| `line_intersection(l0, l1)` | Return the point where two 2D lines intersect or undef if they don't. |
|
||||
| `offset(points, offset)` | Offset a 2D polygon, breaks for concave shapes and negative offsets if the offset is more than half the smallest feature size. |
|
||||
| `rounded_polygon(points, _tangents = undef)` | Return the rounded polygon from the point list, can pass the tangent list to save it being calculated |
|
||||
| `rounded_polygon_arcs(points, tangents)` | Compute the arcs at the points, for each point [angle, rotate_angle, length] |
|
||||
| `rounded_polygon_length(points, tangents)` | Calculate the length given the point list and the list of tangents computed by `rounded_polygon_tangents` |
|
||||
@@ -6696,7 +6714,7 @@ Each vertex, apart from the first and the last, has an associated radius and the
|
||||
| `rounded_path_vertices(path)` | Show the unrounded version of a rounded_path for debug |
|
||||
| `segmented_path(path, min_segment)` | Add points to a path to enforce a minimum segment length |
|
||||
| `skin_faces(points, npoints, facets, loop, offset = 0)` | Create the mesh for the swept volume without end caps |
|
||||
| `spiral_paths(path, n, r, twists, start_angle)` | Create a new paths which sprial around the given path. Use for making twisted cables |
|
||||
| `spiral_paths(path, n, r, twists, start_angle)` | Create a new paths which spiral around the given path. Use for making twisted cables |
|
||||
| `sweep(path, profile, loop = false, twist = 0)` | Generate the point list and face list of the swept volume |
|
||||
|
||||
### Modules
|
||||
|
@@ -157,7 +157,7 @@ if __name__ == '__main__':
|
||||
break
|
||||
j += 1
|
||||
|
||||
# Print verson info
|
||||
# Print version info
|
||||
print('%s [%s](%s "show release") %s %s' % ('#' * (level + 1), ver, url + '/releases/tag/' + ver, type, diff), file = file)
|
||||
|
||||
# Print commits excluding merges
|
||||
|
@@ -26,7 +26,7 @@ from set_config import *
|
||||
from exports import bom_to_parts
|
||||
import os
|
||||
import openscad
|
||||
from tests import do_cmd, update_image, colour_scheme, background
|
||||
from tests import do_cmd, update_image, colour_scheme, background, image_size
|
||||
from deps import mtime
|
||||
from colorama import init
|
||||
import json
|
||||
@@ -95,7 +95,7 @@ def render(target, type):
|
||||
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
|
||||
openscad.run("-o", tmp_name, png_maker_name, colour_scheme, "--projection=p", "--imgsize=4096,4096", cam, render, "--autocenter", "--viewall", "-d", dummy_deps_name)
|
||||
openscad.run("-o", tmp_name, png_maker_name, colour_scheme, "--projection=p", image_size, cam, render, "--autocenter", "--viewall", "-d", dummy_deps_name)
|
||||
do_cmd(("magick "+ tmp_name + " -trim -resize 280x280 -background %s -gravity Center -extent 280x280 -bordercolor %s -border 10 %s"
|
||||
% (background, background, tmp_name)).split())
|
||||
update_image(tmp_name, png_name)
|
||||
|
@@ -57,13 +57,13 @@ def set_config(target, usage = None):
|
||||
sys.exit(1)
|
||||
|
||||
if not targets:
|
||||
print("Not a muli-configuration project (no config_<target>.scad files found)")
|
||||
print("Not a multi-configuration project (no config_<target>.scad files found)")
|
||||
if usage:
|
||||
usage()
|
||||
sys.exit(1)
|
||||
|
||||
if not target in targets:
|
||||
print(target + " is not a configuration, avaliable configurations are: " + valid_targets_string())
|
||||
print(target + " is not a configuration, available configurations are: " + valid_targets_string())
|
||||
if usage:
|
||||
usage()
|
||||
sys.exit(1)
|
||||
|
@@ -36,8 +36,7 @@ from blurb import *
|
||||
from colorama import Fore
|
||||
from tmpdir import *
|
||||
|
||||
w = 4096
|
||||
h = w
|
||||
image_size = "--imgsize=4096,4096"
|
||||
threshold = 20 # Image comparison allowed number of different pixels
|
||||
fuzz = 5 # Image comparison allowed percentage error in pixel value
|
||||
|
||||
@@ -48,7 +47,12 @@ def do_cmd(cmd, output = sys.stdout):
|
||||
for arg in cmd:
|
||||
print(arg, end = " ")
|
||||
print()
|
||||
return subprocess.call(cmd, stdout = output, stderr = output)
|
||||
t = time.time()
|
||||
rv = subprocess.call(cmd, stdout = output, stderr = output)
|
||||
elapsed = time.time() - t
|
||||
with open("cmd_times.txt", 'at') as f:
|
||||
print(cmd[0], cmd[-1], elapsed, file = f)
|
||||
return rv
|
||||
|
||||
def compare_images(a, b, c):
|
||||
if not os.path.isfile(b):
|
||||
@@ -119,7 +123,7 @@ def tests(tests):
|
||||
libtest = True
|
||||
lib_blurb = scrape_blurb(scad_name)
|
||||
if not os.path.isfile(png_name):
|
||||
openscad.run(scad_name, "-o", png_name, colour_scheme, "--projection=p", "--imgsize=%d,%d" % (w, h), "--camera=0,0,0,50,0,340,500", "--autocenter", "--viewall");
|
||||
openscad.run(scad_name, "-o", png_name, colour_scheme, "--projection=p", image_size, "--camera=0,0,0,50,0,340,500", "--autocenter", "--viewall");
|
||||
do_cmd(["magick", png_name, "-trim", "-resize", "1280", "-bordercolor", background, "-border", "10", png_name])
|
||||
else:
|
||||
#
|
||||
@@ -240,7 +244,7 @@ def tests(tests):
|
||||
print(changed)
|
||||
t = time.time()
|
||||
tmp_name = tmp_dir + '/tmp.png'
|
||||
openscad.run_list([scad_name, "-o", tmp_name] + options.list() + ["-D$bom=2", colour_scheme, "--projection=p", "--imgsize=%d,%d" % (w, h), "--camera=0,0,0,70,0,315,500", "--autocenter", "--viewall", "-d", dname]);
|
||||
openscad.run_list([scad_name, "-o", tmp_name] + options.list() + ["-D$bom=2", colour_scheme, "--projection=p", image_size, "--camera=0,0,0,70,0,315,500", "--autocenter", "--viewall", "-d", dname]);
|
||||
times.add_time(scad_name, t)
|
||||
do_cmd(["magick", tmp_name, "-trim", "-resize", "1000x600", "-bordercolor", background, "-border", "10", tmp_name])
|
||||
update_image(tmp_name, png_name)
|
||||
|
@@ -25,7 +25,7 @@
|
||||
from __future__ import print_function
|
||||
from set_config import *
|
||||
import openscad
|
||||
from tests import do_cmd, update_image, colour_scheme, background
|
||||
from tests import do_cmd, update_image, colour_scheme, background, image_size
|
||||
import time
|
||||
import times
|
||||
import options
|
||||
@@ -223,7 +223,7 @@ def views(target, do_assemblies = None):
|
||||
target_def = ['-D$target="%s"' % target] if target else []
|
||||
cwd_def = ['-D$cwd="%s"' % os.getcwd().replace('\\', '/')]
|
||||
view_def = ['--viewall', '--autocenter'] if not (zoomed & (1 << explode)) else ['--camera=0,0,0,55,0,25,140']
|
||||
openscad.run_list(["-o", tmp_name, png_maker_name] + options.list() + target_def + cwd_def + view_def + ["-D$pose=1", "-D$explode=%d" % explode, colour_scheme, "--projection=p", "--imgsize=4096,4096", "-d", dname]);
|
||||
openscad.run_list(["-o", tmp_name, png_maker_name] + options.list() + target_def + cwd_def + view_def + ["-D$pose=1", "-D$explode=%d" % explode, colour_scheme, "--projection=p", image_size, "-d", dname]);
|
||||
times.add_time(png_name, t)
|
||||
do_cmd(["magick", tmp_name, "-trim", "-resize", "1004x1004", "-bordercolor", background, "-border", "10", tmp_name])
|
||||
update_image(tmp_name, png_name)
|
||||
|
@@ -61,6 +61,7 @@ test_pcb = ["test_pcb", "Test PCB",
|
||||
[
|
||||
[ 20, -5, 180, "trimpot10"],
|
||||
[ 20, -15, 90, "trimpot10", true],
|
||||
[ 7, 2, 90, "smd_led", LED1206, "blue"],
|
||||
[ 10, 2, 90, "smd_led", LED0805, "red"],
|
||||
[ 13, 2, 90, "smd_led", LED0603, "orange"],
|
||||
[ 16, 2, 90, "smd_res", RES1206, "1K"],
|
||||
@@ -114,7 +115,6 @@ test_pcb = ["test_pcb", "Test PCB",
|
||||
[ 60, 3, 0, "flex"],
|
||||
[ 50, 15, -90, "flat_flex"],
|
||||
[ 40, 15, -90, "flat_flex", true],
|
||||
[ 60, 35, 0, "D_plug", DCONN9],
|
||||
|
||||
[ 50, 50, 0, "molex_hdr", 2],
|
||||
[ 50, 60, 0, "jst_xh", 2],
|
||||
@@ -139,8 +139,11 @@ test_pcb = ["test_pcb", "Test PCB",
|
||||
[ 55, 170, 0, "button_4p5mm"],
|
||||
[ 50, 185, 0, "microswitch", small_microswitch],
|
||||
[ 52, 200, 0, "pcb", 11, TMC2130 ],
|
||||
[ 80, 200, 0, "pdip", 24, "27C32", true, inch(0.6) ],
|
||||
[ 80, 170, 0, "pdip", 8, "NE555" ],
|
||||
[ 80, 210, 0, "pdip", 24, "27C32", true, inch(0.6) ],
|
||||
[ 80, 180, 0, "pdip", 8, "NE555" ],
|
||||
[ 80, 166, -90, "smd_soic", SOIC18, "PIC18F88"],
|
||||
[ 71, 166, -90, "smd_soic", SOIC16, "ICL323"],
|
||||
[ 64, 166, -90, "smd_soic", SOIC8, "M34063"],
|
||||
[ 80, 150, 0, "chip", 10, 5, 1, grey(20)],
|
||||
|
||||
[ 52, 206, 0, "2p54socket", 8, 1 ],
|
||||
@@ -148,7 +151,8 @@ test_pcb = ["test_pcb", "Test PCB",
|
||||
[ 50, 220, 0, "standoff", 5, 4.5, 12.5, 2.54],
|
||||
[ 50, 240, 0, "potentiometer"],
|
||||
[ 75, 240, 0, "potentiometer", KY_040_encoder, 8],
|
||||
[ 30, 85, -90, "7seg", WT5011BSR, 2],
|
||||
[ 30, 85, -90, "7seg", WT5011BSR, 2],
|
||||
[ 30, 55, -90, "D_plug", DCONN9],
|
||||
],
|
||||
// accessories
|
||||
[]
|
||||
|
@@ -38,6 +38,12 @@ module smds() {
|
||||
layout([for(s = smd_sots) smd_sot_size(s).x], 1)
|
||||
let(s = smd_sots[$i])
|
||||
smd_sot(s, ["2N7000", "FZT851"][$i]);
|
||||
|
||||
translate([0, 20])
|
||||
layout([for(s = smd_soics) smd_soic_size(s).x], 1)
|
||||
let(s = smd_soics[$i])
|
||||
smd_soic(s, s[0]);
|
||||
|
||||
}
|
||||
|
||||
if($preview)
|
||||
|
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 74 KiB |
Before Width: | Height: | Size: 152 KiB After Width: | Height: | Size: 152 KiB |
Before Width: | Height: | Size: 184 KiB After Width: | Height: | Size: 184 KiB |
Before Width: | Height: | Size: 114 KiB After Width: | Height: | Size: 182 KiB |
Before Width: | Height: | Size: 103 KiB After Width: | Height: | Size: 103 KiB |
@@ -16,18 +16,28 @@
|
||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||
// If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
show_connection_pos = false;
|
||||
|
||||
/* [Hidden] */
|
||||
include <../core.scad>
|
||||
include <../vitamins/stepper_motors.scad>
|
||||
|
||||
use <../utils/layout.scad>
|
||||
|
||||
has_connector = [NEMA17_27, NEMA17_40, NEMA17_40L280, NEMA8_30, NEMA8_30BH];
|
||||
|
||||
module stepper_motors()
|
||||
layout([for(s = stepper_motors) NEMA_width(s)], 5, no_offset = false) let(m = stepper_motors[$i]) {
|
||||
rotate(180)
|
||||
NEMA(m, 0, in([NEMA17_27, NEMA17_40, NEMA17_40L280, NEMA8_30, NEMA8_30BH], m));
|
||||
rotate(180) {
|
||||
NEMA(m, 0, in(has_connector, m) ? true : show_connection_pos ? undef : false);
|
||||
|
||||
translate_z(4)
|
||||
NEMA_screws(m, M3_pan_screw, n = $i - 2, earth = $i > 6 ? undef : $i - 3);
|
||||
if(show_connection_pos)
|
||||
translate(NEMA_connection_pos(m, in(has_connector, m)))
|
||||
sphere();
|
||||
|
||||
translate_z(4)
|
||||
NEMA_screws(m, M3_pan_screw, n = $i - 2, earth = $i > 6 ? undef : $i - 3);
|
||||
}
|
||||
}
|
||||
|
||||
if($preview)
|
||||
|
@@ -33,7 +33,7 @@ function circle_tangent(p1, p2) = //! Compute the clockwise tangent between two
|
||||
dx = p2.x - p1.x,
|
||||
dy = p2.y - p1.y,
|
||||
d = sqrt(dx * dx + dy * dy),
|
||||
theta = atan2(dy, dx) + acos((r1 - r2) / d),
|
||||
theta = assert(d, str("points conicident ", p1)) atan2(dy, dx) + acos((r1 - r2) / d),
|
||||
v = [cos(theta), sin(theta)]
|
||||
)[ p1 + r1 * v, p2 + r2 * v ];
|
||||
|
||||
@@ -72,24 +72,52 @@ function rounded_polygon_length(points, tangents) = //! Calculate the length giv
|
||||
arcs = rounded_polygon_arcs(points, tangents)
|
||||
) sumv( map( concat(tangents, arcs), function(e) e[2] ) );
|
||||
|
||||
function line_intersection(l0, l1) = //! Return the point where two 2D lines intersect or undef if they don't.
|
||||
assert(Len(l0) == 2 && Len(l1) == 2, "Two 2D vectors expected")
|
||||
let(
|
||||
p0 = l0[0], p1 = l0[1], p2 = l1[0], p3 = l1[1],
|
||||
v1 = p1 - p0,
|
||||
v2 = p3 - p2,
|
||||
v3 = p0 - p2,
|
||||
det = v1.x * v2.y - v2.x * v1.y,
|
||||
s = det ? (-v1.y * v3.x + v1.x * v3.y) / det : inf,
|
||||
t = det ? ( v2.x * v3.y - v2.y * v3.x) / det : inf
|
||||
) s >= 0 && s <= 1 && t >= 0 && t <= 1 ? p0 + t * v1 : undef;
|
||||
|
||||
function rounded_polygon(points, _tangents = undef) = //! Return the rounded polygon from the point list, can pass the tangent list to save it being calculated
|
||||
let(
|
||||
len = len(points),
|
||||
tangents = _tangents ? _tangents : rounded_polygon_tangents(points),
|
||||
arcs = rounded_polygon_arcs(points, tangents)
|
||||
) [for(i = [0 : len - 1], last = (i - 1 + len) % len, R = points[i][2]) each [
|
||||
vec2(tangents[last][1]), // End of last tangent
|
||||
if(R) // If rounded
|
||||
let(r = abs(R), // Get radius
|
||||
n = r2sides4n(r), // Decide number of vertices
|
||||
step = 360 / n, // Angular step
|
||||
arc = arcs[i], // Get corner arc details
|
||||
start = ceil(arc[1] / step + eps), // Starting index
|
||||
end = floor((arc[0] + arc[1]) / step - eps), // Ending index
|
||||
c = vec2(points[i]) // Centre of arc
|
||||
) for(j = R > 0 ? [end : -1 : start] : [start : 1 : end], a = j * step) c + r * [cos(a), sin(a)], // Points on the arc
|
||||
vec2(tangents[i][0])] // Start of next tangent
|
||||
) [for(i = [0 : len - 1], last = (i - 1 + len) % len)
|
||||
let(
|
||||
t0 = vec2(tangents[last]),
|
||||
t1 = vec2(tangents[i]),
|
||||
p = line_intersection(t0, t1), // Do the tangents cross?
|
||||
R = points[i][2]
|
||||
)
|
||||
if(!is_undef(p)) // Tangents intersect, so just add the intersection point
|
||||
p
|
||||
else
|
||||
each [ // Else link the two tangent ends with an arc
|
||||
t0[1], // End of last tangent
|
||||
if(R) // If rounded
|
||||
let(r = abs(R), // Get radius
|
||||
n = r2sides4n(r), // Decide number of vertices
|
||||
step = 360 / n, // Angular step
|
||||
arc = arcs[i], // Get corner arc details
|
||||
start = ceil(arc[1] / step + eps), // Starting index
|
||||
end = floor((arc[0] + arc[1]) / step - eps), // Ending index
|
||||
c = vec2(points[i]) // Centre of arc
|
||||
) for(j = R > 0 ? [end : -1 : start] : [start : 1 : end], a = j * step)
|
||||
c + r * [cos(a), sin(a)], // Points on the arc
|
||||
if(R)
|
||||
t1[0], // Start of next tangent
|
||||
]
|
||||
];
|
||||
|
||||
function offset(points, offset) = //! Offset a 2D polygon, breaks for concave shapes and negative offsets if the offset is more than half the smallest feature size.
|
||||
rounded_polygon([for(p = points) [p.x, p.y, offset]]);
|
||||
|
||||
module rounded_polygon(points, _tangents = undef) //! Draw the rounded polygon from the point list, can pass the tangent list to save it being calculated
|
||||
polygon(rounded_polygon(points, _tangents), convexity = len(points));
|
||||
|
@@ -127,8 +127,8 @@ function sweep_transforms(path, loop = false, twist = 0) =
|
||||
i = i + 1,
|
||||
rot = i < len ? rotate_from_to(tangents[i - 1], tangents[i]) * rot : undef) rot],
|
||||
|
||||
missmatch = loop ? calculate_twist(rotations[0], rotations[last]) : 0,
|
||||
rotation = missmatch + twist
|
||||
mismatch = loop ? calculate_twist(rotations[0], rotations[last]) : 0,
|
||||
rotation = mismatch + twist
|
||||
)
|
||||
[for(i = [0 : last])
|
||||
let(za = rotation * lengths[i] / length)
|
||||
@@ -239,7 +239,7 @@ function segmented_path(path, min_segment) = [ //! Add points to a path to enfo
|
||||
path[len(path) - 1]
|
||||
];
|
||||
|
||||
function spiral_paths(path, n, r, twists, start_angle) = let( //! Create a new paths which sprial around the given path. Use for making twisted cables
|
||||
function spiral_paths(path, n, r, twists, start_angle) = let( //! Create a new paths which spiral around the given path. Use for making twisted cables
|
||||
segment = twists ? path_length(path) / twists / r2sides(2 * r) : inf,
|
||||
transforms = sweep_transforms(segmented_path(path, segment), twist = 360 * twists)
|
||||
) [for(i = [0 : n - 1]) let(initial = [r, 0, 0, 1] * rotate(start_angle + i * 360 / n)) [for(t = transforms) initial * t]];
|
||||
|
@@ -20,11 +20,11 @@
|
||||
//
|
||||
//! Brushless DC electric motor
|
||||
//
|
||||
include <NopSCADlib/core.scad>
|
||||
include <../utils/core/core.scad>
|
||||
|
||||
use <NopSCADlib/vitamins/rod.scad>
|
||||
use <NopSCADlib/utils/thread.scad>
|
||||
use <NopSCADlib/utils/tube.scad>
|
||||
use <rod.scad>
|
||||
use <../utils/thread.scad>
|
||||
use <../utils/tube.scad>
|
||||
|
||||
|
||||
function BLDC_diameter(type) = type[1]; //! Diameter of motor
|
||||
|
@@ -20,7 +20,7 @@
|
||||
// Extrusion
|
||||
//
|
||||
// W H d1 d2 sq cw cwi t st f recess
|
||||
E1515 = [ "E1515", 15, 15, -2.5, 0, 5.7, 3.4, 5.7, 1.1, 1.1, 0.5, false ];
|
||||
E1515 = [ "E1515", 15, 15, -3.3, 0, 5.5, 6.2, 9.5, 1.0, 0.9, 0.5, false ];
|
||||
E2020 = [ "E2020", 20, 20, -4.2, -3, 8, 6, 12.0, 2, 2, 1, false ];
|
||||
E2020t = [ "E2020t",20, 20, -5.0, -3, 7.8, 6.2, 11.0, 1.8, 1.5, 1.5, [7.2, 0.5] ];
|
||||
E2040 = [ "E2040", 20, 40, -4.2, -3, 8, 6, 12.0, 2, 2, 1, false ];
|
||||
|
@@ -1134,6 +1134,7 @@ module pcb_component(comp, cutouts = false, angle = undef) { //! Draw pcb compon
|
||||
if(show(comp, "smd_res")) smd_resistor(comp[4], comp[5]);
|
||||
if(show(comp, "smd_cap")) smd_capacitor(comp[4], comp[5], param(6, undef));
|
||||
if(show(comp, "smd_sot")) smd_sot(comp[4], comp[5]);
|
||||
if(show(comp, "smd_soic")) smd_soic(comp[4], comp[5]);
|
||||
if(show(comp, "vero_pin")) vero_pin(param(4, false));
|
||||
if(show(comp, "terminal")) terminal_block(comp[5], comp[4]);
|
||||
if(show(comp, "text")) color("white") linear_extrude(eps) resize([comp[4], comp[5]]) text(comp[6], font = param(7, "Liberation Mono"), valign = "center", halign = "center");
|
||||
|
@@ -178,3 +178,53 @@ module smd_sot(type, value) { //! Draw an SMD transistor
|
||||
text(value, halign = "center", valign = "center");
|
||||
|
||||
}
|
||||
|
||||
function smd_soic_size(type) = type[1]; //! Body length, width and height
|
||||
function smd_soic_z(type) = type[2]; //! Height above PCB surface
|
||||
function smd_soic_lead_z(type) = type[3]; //! Top of lead frame from top
|
||||
function smd_soic_lead_pitch(type) = type[4]; //! Lead pitch
|
||||
function smd_soic_lead_span(type) = type[5]; //! Total span of leads
|
||||
function smd_soic_lead_size(type) = type[6]; //! Lead width, foot depth, lead thickness
|
||||
|
||||
module smd_soic(type, value) { //! Draw an SMD SOIC
|
||||
vitamin(str("smd_soic(", type[0], "): ", type[0], " package ", value));
|
||||
|
||||
size = smd_soic_size(type);
|
||||
z0 = smd_soic_z(type);
|
||||
z2 = z0 + size.z;
|
||||
z1 = z2 - smd_soic_lead_z(type);
|
||||
slant = 5; //! 5 degree body draft angle
|
||||
pitch = smd_soic_lead_pitch(type);
|
||||
span = (smd_soic_lead_span(type) / 2);
|
||||
leads = floor(size.x / pitch) + 1;
|
||||
ls = smd_soic_lead_size(type);
|
||||
|
||||
r = ls.z;
|
||||
gullwing = rounded_path([[0, 0, ls.z / 2], [0, ls.y - ls.z, ls.z / 2], r, [0, ls.y -ls.z + z1 - ls.z, z1 - ls.z / 2], r, [0, span / 2, z1 - ls.z / 2]], $fn = 32);
|
||||
|
||||
color(grey(20))
|
||||
hull()
|
||||
for(z = [z0, z1, z2], inset = abs(z - z1) * tan(slant))
|
||||
translate_z(z)
|
||||
cube([size.x - 2 * inset, size.y - 2 * inset, eps], center = true);
|
||||
|
||||
color(silver) {
|
||||
for(i = [0 : leads - 1]) {
|
||||
translate([i * pitch - size.x / 2 + (size.x - (leads - 1) * pitch) / 2, -span])
|
||||
sweep(gullwing, rectangle_points(ls.x, ls.z));
|
||||
|
||||
rotate(180)
|
||||
translate([0, -span / 2])
|
||||
translate([i * pitch - size.x / 2 + (size.x - (leads - 1) * pitch) / 2, -span / 2])
|
||||
sweep(gullwing, rectangle_points(ls.x, ls.z));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
color("white")
|
||||
translate_z(z0 + size.z)
|
||||
linear_extrude(eps)
|
||||
resize([size.x * 0.9, size.y / 2])
|
||||
text(value, halign = "center", valign = "center");
|
||||
|
||||
}
|
||||
|
@@ -23,8 +23,9 @@
|
||||
|
||||
LED0603 = ["LED0603", [1.6, 0.8, 0.18], [1.0, 0.8, 0.42]];
|
||||
LED0805 = ["LED0805", [2.0, 1.25, 0.46], [1.4, 1.25, 0.54]];
|
||||
LED1206 = ["LED1206", [3.2, 1.6, 0.5], [2.0, 1.6, .6]];
|
||||
|
||||
smd_leds = [LED0603, LED0805];
|
||||
smd_leds = [LED0603, LED0805, LED1206];
|
||||
|
||||
RES0603 = ["RES0603", [1.6, 0.8, 0.45], 0.3, 1/10];
|
||||
RES0805 = ["RES0805", [2.0, 1.2, 0.45], 0.4, 1/8];
|
||||
@@ -43,4 +44,10 @@ SOT223 = ["SOT223", [6.5, 3.5, 1.6], 0.05, 0.89, 2.3, 7.0, [0.7, 0.95, 0.25], 3]
|
||||
|
||||
smd_sots = [SOT23, SOT223];
|
||||
|
||||
SOIC8 = ["SOIC8", [4.90, 3.90, 1.25], 0.10, 0.66, 1.27, 6.00, [0.31, .50, 0.20]];
|
||||
SOIC16 = ["SOIC16", [9.90, 3.90, 1.25], 0.10, 0.66, 1.27, 6.00, [0.31, .50, 0.20]];
|
||||
SOIC18 = ["SOIC18", [11.40, 7.50, 2.00], 0.10, 1.20, 1.27, 10.30, [0.31, .50, 0.20]];
|
||||
|
||||
smd_soics = [SOIC8, SOIC16, SOIC18];
|
||||
|
||||
use <smd.scad>
|
||||
|
@@ -51,6 +51,18 @@ stepper_body_colour = grey(20);
|
||||
stepper_cap_colour = grey(50);
|
||||
stepper_machined_colour = grey(90);
|
||||
|
||||
function NEMA_connection_pos(type, jst_connector = false) = let( //! Position of the wires or the connector
|
||||
side = NEMA_width(type),
|
||||
length = NEMA_length(type),
|
||||
cap = NEMA_cap_heights(type)[1],
|
||||
hdr = NEMA_end_connector(type) ? jst_zh_header : jst_ph_header,
|
||||
socket_size = hdr_box_size(hdr),
|
||||
end_conn_inset = socket_size.y - 2
|
||||
)
|
||||
jst_connector ? NEMA_end_connector(type) ? [0, side / 2 + hdr_y_offset(hdr) + socket_size.y / 2 - end_conn_inset, -length]
|
||||
: [0, side / 2 + socket_size.z, hdr_y_offset(hdr) - socket_size.y / 2 - length + cap]
|
||||
: [0, side / 2, -length + cap / 2];
|
||||
|
||||
module NEMA_outline(type) //! 2D outline
|
||||
intersection() {
|
||||
side = NEMA_width(type);
|
||||
@@ -185,14 +197,14 @@ module NEMA(type, shaft_angle = 0, jst_connector = false) { //! Draw specified N
|
||||
not_on_bom()
|
||||
leadscrew(shaft_rad * 2, shaft.x + length + shaft2, shaft.y, shaft.z, center = false);
|
||||
|
||||
if(!jst_connector)
|
||||
if(jst_connector == false)
|
||||
translate([0, side / 2, -length + cap / 2])
|
||||
rotate([90, 0, 0])
|
||||
for(i = [0 : 3])
|
||||
rotate(225 + i * 90)
|
||||
color(["red", "blue","green","black"][i])
|
||||
translate([1, 0, 0])
|
||||
cylinder(r = 1.5 / 2, h = 12, center = true);
|
||||
color(["red", "green", "black", "blue"][i])
|
||||
translate([1.48 / sqrt(2), 0, 0])
|
||||
cylinder(d = 1.48, h = 12, center = true);
|
||||
}
|
||||
|
||||
module NEMA_screw_positions(type, n = 4) { //! Positions children at the screw holes
|
||||
|