1
0
mirror of https://github.com/nophead/NopSCADlib.git synced 2025-09-06 21:30:38 +02:00

Compare commits

...

46 Commits

Author SHA1 Message Date
Chris Palmer
330c09f4d4 Merge branch 'schiele-corexy_fix' 2025-04-15 11:41:21 +01:00
Chris Palmer
c2a56367eb Merge branch 'corexy_fix' of https://github.com/schiele/NopSCADlib into schiele-corexy_fix 2025-04-15 11:35:27 +01:00
Chris Palmer
f16dc84792 Updated changelog. 2025-04-15 11:34:43 +01:00
Chris Palmer
c065855b90 Merge branch 'pcremades-master' 2025-04-15 11:32:22 +01:00
Chris Palmer
edc7e17437 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-15 11:31:46 +01:00
Robert Schiele
7546203b03 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.
2025-04-15 07:00:19 +02:00
pcremades
a9b501a2d2 Added a 1602 LCD with I2C module 2025-04-11 11:54:48 -03:00
pcremades
126343d5af Added a I2C TWI SPI Serial Interface for 1602 LCD 2025-04-11 11:39:59 -03:00
pcremades
1692fcc811 Added 1/4" square trimpot to pcb.scad 2025-04-11 11:27:14 -03:00
Chris Palmer
5c4fe8bfb9 Updated changelog. 2025-04-09 23:31:10 +01:00
Chris Palmer
33ac3820b0 Added pose_stl() module because pose() only works for assembly views. 2025-04-09 23:29:00 +01:00
Chris Palmer
6a58d37f77 Updated changelog. 2025-04-01 09:57:15 +01:00
Chris Palmer
029abc0cf8 Merge branch 'trnila-barrel_jack_cutout' 2025-04-01 09:45:06 +01:00
Chris Palmer
4b018eb9ad Merge branch 'barrel_jack_cutout' of https://github.com/trnila/NopSCADlib into trnila-barrel_jack_cutout 2025-04-01 09:33:43 +01:00
Chris Palmer
3715585002 Made pose() work on STL renders to match the documentation. 2025-04-01 09:32:00 +01:00
Daniel Trnka
5d0eda87e4 barrel_jack: added cutout 2025-03-30 23:19:42 +02:00
Chris Palmer
ad963afb8d Updated changelog. 2025-03-27 12:25:55 +00:00
Chris Palmer
dbf8e6c7ae Merge branch 'jeroenrnl-VariableNamesWithDigitsDeprecated' 2025-03-27 12:24:15 +00:00
Chris Palmer
7d281cbcdd Merge branch 'VariableNamesWithDigitsDeprecated' of https://github.com/jeroenrnl/NopSCADlib into jeroenrnl-VariableNamesWithDigitsDeprecated 2025-03-27 12:01:05 +00:00
Chris Palmer
f1a651a2d2 Updated changelog. 2025-03-27 02:00:24 +00:00
Chris Palmer
9f9aa6723e Third attempt to fix dimension image. 2025-03-27 01:59:05 +00:00
Chris Palmer
83d2d511e3 Updated changelog. 2025-03-27 01:57:19 +00:00
Chris Palmer
6b6704b823 Second attempt to fix dimension image. 2025-03-27 01:56:05 +00:00
Chris Palmer
946a3bea1c Updated changelog. 2025-03-27 01:39:25 +00:00
Chris Palmer
117fb626e7 Fixed dimension example image address. 2025-03-27 01:38:09 +00:00
Chris Palmer
0382bad566 Updated changelog. 2025-03-27 01:27:09 +00:00
Chris Palmer
b572325a8f Merge branch 'AlexVerschoot-dimensions' 2025-03-27 00:50:47 +00:00
Chris Palmer
6dc82045ff Shortened the module comments by factoring out the parameter discriptions.
Added the nut example picture.
Fixed nut picture placement.
Updated images and readme.
2025-03-27 00:50:21 +00:00
Jeroen Roos
fdbe0c7a9e 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.
2025-03-23 10:45:33 +01:00
Chris Palmer
9c7e8a99c7 Merge branch 'dimensions' of https://github.com/AlexVerschoot/NopSCADlib into AlexVerschoot-dimensions 2025-03-22 23:07:20 +00:00
Alex Verschoot
c50f95a203 added some documentation to the nut 2025-03-22 21:43:54 +01:00
Alex Verschoot
49bd6e0a04 added negative offsets to test 2025-03-22 15:00:20 +01:00
Alex Verschoot
921843cc09 made negative offset work as expected (go to the opposite side, and use min instead of max on ccordinates) 2025-03-22 14:58:12 +01:00
Alex Verschoot
c17cc1321b Changed the module comments style 2025-03-19 21:42:34 +01:00
Alex Verschoot
9862b3c3a3 typos 2025-03-16 18:50:51 +01:00
Alex Verschoot
e87e19aa18 removed center from experiment 2025-03-16 18:43:26 +01:00
Alex Verschoot
4f68935b5b some cleanup 2025-03-16 18:23:15 +01:00
Alex Verschoot
8992cce7a6 added argument for text size, and improve auto size 2025-03-15 22:19:12 +01:00
Alex Verschoot
106666ec49 simplified the math to use rotates instead, added examples, and allowed the user to choose witch plane the x,y and z dimensions are in 2025-03-15 21:28:33 +01:00
Alex Verschoot
f731f0fe98 added a function to rotate around the dim axis 2025-03-13 22:53:21 +01:00
Alex Verschoot
3a62198183 replaced the new math functions with rotate and transform 2025-03-13 22:37:53 +01:00
Alex Verschoot
0123885711 Improved text alligment 2025-03-07 22:07:53 +01:00
Alex Verschoot
b166ec47dd Remove old commented code from dimension.scad 2025-03-02 23:07:17 +01:00
Alex Verschoot
6467de5fac Update maths.scad 2025-03-02 23:01:20 +01:00
Alex Verschoot
dc683ed701 added dimensions 2025-03-02 20:18:17 +01:00
Chris Palmer
99d6c2f891 Updated changelog. 2025-02-22 12:20:23 +00:00
22 changed files with 538 additions and 53 deletions

View File

@@ -3,6 +3,89 @@
This changelog is generated by `changelog.py` using manually added semantic version tags to classify commits as breaking changes, additions or fixes.
### [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-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.
#### [v21.35.1](https://github.com/nophead/NopSCADlib/releases/tag/v21.35.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v21.35.0...v21.35.1 "diff with v21.35.0")
* 2025-03-27 [`117fb62`](https://github.com/nophead/NopSCADlib/commit/117fb626e7023ca92339947a0f84a8aee5c6429e "show commit") [C.P.](# "Chris Palmer") Fixed dimension example image address.
### [v21.35.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.35.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.34.0...v21.35.0 "diff with v21.34.0")
* 2025-03-27 [`6dc8204`](https://github.com/nophead/NopSCADlib/commit/6dc82045fffeca383381724abb6d70d7025b2ae5 "show commit") [C.P.](# "Chris Palmer") Shortened the module comments by factoring out the parameter descriptions.
Added the nut example picture.
Fixed nut picture placement.
Updated images and readme.
* 2025-03-22 [`c50f95a`](https://github.com/nophead/NopSCADlib/commit/c50f95a203ead9070407fbae7d1247a00938b255 "show commit") [A.V.](# "Alex Verschoot") added some documentation to the nut
* 2025-03-22 [`49bd6e0`](https://github.com/nophead/NopSCADlib/commit/49bd6e0a04885cf5cad7655aee038e16dc0a7e15 "show commit") [A.V.](# "Alex Verschoot") added negative offsets to test
* 2025-03-22 [`921843c`](https://github.com/nophead/NopSCADlib/commit/921843cc09e7ae2953090c30e7d5b9c644e3b966 "show commit") [A.V.](# "Alex Verschoot") made negative offset work as expected (go to the opposite side, and use min instead of max on coordinates)
* 2025-03-19 [`c17cc13`](https://github.com/nophead/NopSCADlib/commit/c17cc1321bcd06af439519435734f6e0eb8f5d43 "show commit") [A.V.](# "Alex Verschoot") Changed the module comments style
* 2025-03-16 [`9862b3c`](https://github.com/nophead/NopSCADlib/commit/9862b3c3a347fac5bb355b1d62a02bdc0970221b "show commit") [A.V.](# "Alex Verschoot") typos
* 2025-03-16 [`e87e19a`](https://github.com/nophead/NopSCADlib/commit/e87e19aa182acee64e3d47c282c81b7ef495bf81 "show commit") [A.V.](# "Alex Verschoot") removed `center` from experiment
* 2025-03-16 [`4f68935`](https://github.com/nophead/NopSCADlib/commit/4f68935b5b56b7405eb6c1e0fae5845e8f800489 "show commit") [A.V.](# "Alex Verschoot") some cleanup
* 2025-03-15 [`8992cce`](https://github.com/nophead/NopSCADlib/commit/8992cce7a62d2fec956aae64236ba19dc340603f "show commit") [A.V.](# "Alex Verschoot") added argument for text size, and improve auto size
* 2025-03-15 [`106666e`](https://github.com/nophead/NopSCADlib/commit/106666ec493f6b088ee398b276e8734d0790a451 "show commit") [A.V.](# "Alex Verschoot") simplified the math to use rotates instead, added examples, and allowed the user to choose witch plane the x,y and z dimensions are in
* 2025-03-13 [`f731f0f`](https://github.com/nophead/NopSCADlib/commit/f731f0fe98a3a3d975c34cd85ac4f618c2f1bf6b "show commit") [A.V.](# "Alex Verschoot") added a function to rotate around the dim axis
* 2025-03-13 [`3a62198`](https://github.com/nophead/NopSCADlib/commit/3a62198183b6a1dce74479ae44e00b4d5e690431 "show commit") [A.V.](# "Alex Verschoot") replaced the new math functions with rotate and transform
* 2025-03-07 [`0123885`](https://github.com/nophead/NopSCADlib/commit/012388571185c674293ba17de39e0db59a775ff4 "show commit") [A.V.](# "Alex Verschoot") Improved text alligment
* 2025-03-02 [`b166ec4`](https://github.com/nophead/NopSCADlib/commit/b166ec47dd7e34e6798c1287d0ce8612a84e9be1 "show commit") [A.V.](# "Alex Verschoot") Remove old commented code from `dimension.scad`
* 2025-03-02 [`6467de5`](https://github.com/nophead/NopSCADlib/commit/6467de5facdc2a5b6ccdbdbe32f703ba3faa70f4 "show commit") [A.V.](# "Alex Verschoot") Update `maths.scad`
* 2025-03-02 [`dc683ed`](https://github.com/nophead/NopSCADlib/commit/dc683ed701b016a1c79800db2ed41aed9cf8cac6 "show commit") [A.V.](# "Alex Verschoot") added dimensions
### [v21.34.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.34.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.33.0...v21.34.0 "diff with v21.33.0")
* 2025-02-22 [`8623572`](https://github.com/nophead/NopSCADlib/commit/862357279a98c9511e2db166585065c660eb331d "show commit") [C.P.](# "Chris Palmer") Updated images and readme.
* 2025-02-16 [`0b8ad93`](https://github.com/nophead/NopSCADlib/commit/0b8ad93dc5c1ed89c6525e846c02f756bfbe9b2b "show commit") [A.V.](# "Alex Verschoot") made the test cases work with the motor in the back
* 2025-02-16 [`3889040`](https://github.com/nophead/NopSCADlib/commit/38890400ac03c64635674412e621236ab28f0314 "show commit") [A.V.](# "Alex Verschoot") added new test cases for motor in the back
* 2025-02-15 [`9974c03`](https://github.com/nophead/NopSCADlib/commit/9974c03fc9c1ca0f67ce27fa5ea5f69c94d416ba "show commit") [A.V.](# "Alex Verschoot") improved the comments
* 2025-02-15 [`0208965`](https://github.com/nophead/NopSCADlib/commit/0208965684441bb2022fe2b513aa8ee28ce22f41 "show commit") [A.V.](# "Alex Verschoot") added an option to emplace the motor in the back
### [v21.33.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.33.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.32.1...v21.33.0 "diff with v21.32.1")
* 2025-01-22 [`8458e43`](https://github.com/nophead/NopSCADlib/commit/8458e432fcb472c0b2f7c880f9c06ea7d4f7511f "show commit") [C.P.](# "Chris Palmer") Updated images and readme.

BIN
docs/sliding_t_nut.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@@ -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>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1018 KiB

After

Width:  |  Height:  |  Size: 1022 KiB

105
readme.md
View File

@@ -25,26 +25,26 @@ A list of changes classified as breaking, additions or fixes is maintained in [C
<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 = "#dogbones">Dogbones</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 = "#fillet">Fillet</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 = "#gears">Gears</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 = "#hanging_hole">Hanging_hole</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 = "#horiholes">Horiholes</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 = "#layout">Layout</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 = "#maths">Maths</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 = "#offset">Offset</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 = "#pcb_utils">PCB_utils</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 = "#quadrant">Quadrant</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 = "#round">Round</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 = "#rounded_cylinder">Rounded_cylinder</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_polygon">Rounded_polygon</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_triangle">Rounded_triangle</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 = "#sector">Sector</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 = "#splines">Splines</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 = "#sweep">Sweep</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 = "#thread">Thread</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 = "#tube">Tube</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></td><td></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>
@@ -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" |
@@ -2460,6 +2460,10 @@ Default is steel but can be drawn as brass or nylon. A utility for making nut tr
If a nut is given a child then it gets placed on its top surface.
The following diagram shows you the parameters for drawing a sliding_t_nut:
![](docs/sliding_t_nut.png)
[vitamins/nuts.scad](vitamins/nuts.scad) Object definitions.
[vitamins/nut.scad](vitamins/nut.scad) Implementation.
@@ -2996,6 +3000,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| 1 | `pcb(EnviroPlus)` | Enviro+ |
| 1 | `pcb(ExtruderPCB)` | Extruder connection PCB - 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 |
@@ -3034,11 +3039,12 @@ 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 |
| 4 | `screw(M2p5_pan_screw, 30)` | Screw M2.5 pan x 30mm |
| 4 | `screw(M2p5_pan_screw, 35)` | Screw M2.5 pan x 35mm |
| 19 | `screw(M3_cap_screw, 16)` | Screw M3 cap x 16mm |
| 13 | `screw(M3_cap_screw, 20)` | Screw M3 cap x 20mm |
| 5 | `screw(M3_cap_screw, 25)` | Screw M3 cap x 25mm |
@@ -3063,24 +3069,25 @@ 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 |
| 9 | pcb_spacer3070.stl |
@@ -7242,6 +7249,35 @@ allows flexible positioning of the motors.
| 6 | `NEMA(NEMA17_40)` | Stepper motor NEMA17 x 40mm (5x20 shaft) |
<a href="#top">Top</a>
---
<a name="dimension"></a>
## Dimension
Modules for adding dimensions to assembly views.
![](docs/sliding_t_nut_small.png)
* If `text` is empty, will display the measured distance.
* `offset` will determine how much space is between the measured point and the dimension.
* `thickness` is the thickness of the lines, and size of the arrows, if 0, will use 0.5% of the length of the dim.
* `text_size` will determine the size of the text, if 0, will use percentage of the length of the dim.
[utils/dimension.scad](utils/dimension.scad) Implementation.
[tests/dimension.scad](tests/dimension.scad) Code for this example.
### Modules
| Module | Description |
|:--- |:--- |
| `dimension(startpoint, endpoint, text = "", thickness = 0, text_size = 0 , rot_around_dim = 0)` | Creates a 3D dimension between two points. |
| `dimension_x(startpoint, endpoint, offset = 1, text = "", thickness = 0, text_size = 0 , plane = "xy")` | Creates a dimension in the x direction. Plane options : xy, xz |
| `dimension_y(startpoint, endpoint, offset = 1, text = "", thickness = 0, text_size = 0 , plane = "xy")` | Creates a dimension in the y direction. Plane options : xy, yz |
| `dimension_z(startpoint, endpoint, offset = 1, text = "", thickness = 0, text_size = 0 , plane = "xz")` | Creates a dimension in the z direction. Plane options : xz, yz |
![dimension](tests/png/dimension.png)
<a href="#top">Top</a>
---
@@ -7814,6 +7850,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.
@@ -7837,8 +7875,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. |

View File

@@ -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:

View File

@@ -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

View File

@@ -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

79
tests/dimension.scad Normal file
View File

@@ -0,0 +1,79 @@
//
// 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 <../utils/core/core.scad>
use <../utils/dimension.scad>
module dimensions_3d_xy() {
dimension([0,0,0], [10,10,0], "", 0.2);
dimension([0,0,0], [10,-10,0], "", 0.2);
dimension([0,0,0], [-10,10,0], "");
dimension([0,0,0], [-10,-10,0], "");
dimension([0,0,0], [0,10,0], "");
dimension([0,0,0], [0,-10,0], "");
dimension([0,0,0], [10,0,0], "",rot_around_dim=0);
dimension([0,0,0], [-10,0,0], "", rot_around_dim=90);
}
module dimensions_3d_xyz() {
dimension([0,0,0], [10,10,10], "");
dimension([0,0,0], [10,-10,10], "");
dimension([0,0,0], [-10,10,10], "");
dimension([0,0,0], [-10,-10,10], "");
dimension([0,0,0], [10,10,-10], "");
dimension([0,0,0], [10,-10,-10], "");
dimension([0,0,0], [-10,10,-10], "");
dimension([0,0,0], [-10,-10,-10], "", rot_around_dim=45);
dimension([0,0,0], [-3,0,10], "");
dimension([0,0,0], [0,0,-10], "");
dimension([0,0,0], [0,2,10], "");
dimension([0,0,0], [0,2,-10], "");
}
module dimension_1d_x() {
dimension_x([12,0,0], [18,0,0]);
dimension_x([12,5,0], [18,10,0], offset = -1);
dimension_x([12,0,-5], [18,0,0], plane= "xz");
dimension_x([12,5,0], [18,10,5]);
}
module dimension_1d_y() {
dimension_y([12,0,0], [12,-5,0]);
dimension_y([12,-8,0], [18,-10,0]);
dimension_y([12,-5,0], [18,-10,5], offset = -1, plane= "yz");
}
module dimension_1d_z() {
dimension_z([20,0,5], [20,0,0]);
dimension_z([20,0,10], [20,0,0]);
dimension_z([20,0,0], [20,10,10],plane= "yz");
}
if($preview)
dimensions_3d_xy();
dimensions_3d_xyz();
dimension_1d_x();
dimension_1d_y();
dimension_1d_z();

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 63 KiB

BIN
tests/png/dimension.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 237 KiB

After

Width:  |  Height:  |  Size: 234 KiB

View File

@@ -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))

View File

@@ -272,13 +272,13 @@ module coreXY(type, size, pos, separation, x_gap = 0, plain_idler_offset = [0, 0
// lower belt
hflip(!left_lower)
explode(25)
coreXY_half(type, size, [size.x - pos.x - separation.x/2 - (left_lower ? x_gap : 0), pos.y], separation.y, x_gap, plain_idler_offset, [-lower_drive_pulley_offset.x, lower_drive_pulley_offset.y], show_pulleys, lower_belt = true, hflip = true, motor_back);
coreXY_half(type, size, [size.x - pos.x - separation.x/2 - (left_lower ? x_gap : 0), pos.y], separation.y, x_gap, plain_idler_offset, [-lower_drive_pulley_offset.x, lower_drive_pulley_offset.y], show_pulleys, lower_belt = true, hflip = true, motor_back = motor_back);
// upper belt
translate([separation.x, 0, separation.z])
hflip(left_lower)
explode(25)
coreXY_half(type, size, [pos.x + separation.x/2 + (left_lower ? x_gap : 0), pos.y], separation.y, x_gap, plain_idler_offset, upper_drive_pulley_offset, show_pulleys, lower_belt = false, hflip = false, motor_back);
coreXY_half(type, size, [pos.x + separation.x/2 + (left_lower ? x_gap : 0), pos.y], separation.y, x_gap, plain_idler_offset, upper_drive_pulley_offset, show_pulleys, lower_belt = false, hflip = false, motor_back = motor_back);
}
}

174
utils/dimension.scad Normal file
View File

@@ -0,0 +1,174 @@
//
// 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/>.
//
//
//! Modules for adding dimensions to assembly views.
//!
//! ![](docs/sliding_t_nut_small.png)
//!
//! * If `text` is empty, will display the measured distance.
//! * `offset` will determine how much space is between the measured point and the dimension.
//! * `thickness` is the thickness of the lines, and size of the arrows, if 0, will use 0.5% of the length of the dim.
//! * `text_size` will determine the size of the text, if 0, will use percentage of the length of the dim.
include <../utils/core/core.scad>
include <../utils/maths.scad>
module dimension(startpoint, endpoint, text = "", thickness = 0, text_size = 0 , rot_around_dim = 0) { //! Creates a 3D dimension between two points.
// Compute vector between points
direction = endpoint - startpoint;
length = norm(direction);
midpoint = (startpoint + endpoint) / 2;
thickness = (thickness == 0? length/200:thickness);
// Ensure nonzero values for calculations
dir_xy = norm([direction.x, direction.y]);
// Compute rotation angles
azimuth = atan2(direction.y, direction.x);
elevation = -atan2(direction.z, dir_xy);
//end triangle size
etr_width = thickness *10;
etr_height = thickness *4;
// Draw measurement line as a thin cylinder
translate(midpoint)
rotate([0, elevation, azimuth])
rotate([0, 90, 0])
resize([thickness, thickness, length - etr_width+0.01 ])
cube(center = true);
//do some vector calculations
dir = (length > 0) ? (direction / length) * thickness * 4 : [1, 0, 0];
// Draw endpoint markers
translate(startpoint)
rotate([0, elevation, azimuth])
rotate([rot_around_dim,0,0])
translate([0,0,-thickness/2])
linear_extrude(thickness)
polygon([[etr_width, etr_height/2],[0,0],[etr_width, -etr_height/2]],[[0,1,2]]);
translate(endpoint)
rotate([0, elevation, azimuth])
rotate([rot_around_dim,0,0])
translate([0,0,-thickness/2])
linear_extrude(thickness)
polygon([[-etr_width, etr_height/2],[0,0],[-etr_width, -etr_height/2]],[[0,1,2]]);
// Draw the text/distance
translate(midpoint)
rotate([0, elevation, azimuth])
rotate([rot_around_dim,0,0])
translate([0,thickness,-thickness/2])
linear_extrude(thickness)
text(text == "" ? str(length) : text, size = (text_size == 0? length/15:text_size), valign = "bottom", halign = "center");
}
module dimension_x(startpoint, endpoint, offset = 1, text = "", thickness = 0, text_size = 0 , plane = "xy") { //! Creates a dimension in the x direction. Plane options : xy, xz
length = norm(endpoint - startpoint);
thickness = (thickness == 0? length/200:thickness);
y = offset > 0 ? max(startpoint.y, endpoint.y) + (plane=="xy"?offset:0) : min(startpoint.y, endpoint.y) + (plane=="xy"?offset:0);
z = offset > 0 ? max(startpoint.z, endpoint.z) + (plane=="xz"?offset:0) : min(startpoint.z, endpoint.z) + (plane=="xz"?offset:0);
dimension([startpoint.x, y, z], [endpoint.x, y, z], text, thickness, text_size, rot_around_dim=(plane=="xz"?90:0));
v1= [startpoint.x, y, z]-startpoint;
h1 = norm(v1);
axis1 = cross([0,0,1], v1);
angle1 = atan2(norm(axis1), v1.z);
translate(startpoint)
rotate(angle1, axis1)
cylinder( h= h1+thickness*2, d=thickness);
v2= [endpoint.x, y, z]-endpoint;
h2 = norm(v2);
axis2 = cross([0,0,1], v2);
angle2 = atan2(norm(axis2), v2.z);
translate(endpoint)
rotate(angle2, axis2)
cylinder( h= h2+thickness*2, d=thickness);
}
module dimension_y(startpoint, endpoint, offset = 1, text = "", thickness = 0, text_size = 0 , plane = "xy") { //! Creates a dimension in the y direction. Plane options : xy, yz
length = norm(endpoint - startpoint);
thickness = (thickness == 0? length/200:thickness);
x = offset > 0 ? max(startpoint.x, endpoint.x) + (plane=="xy"?offset:0) : min(startpoint.x, endpoint.x) + (plane=="xy"?offset:0);
z = offset > 0 ? max(startpoint.z, endpoint.z) + (plane=="yz"?offset:0) : min(startpoint.z, endpoint.z) + (plane=="yz"?offset:0);
dimension([x, startpoint.y, z], [x, endpoint.y, z], text, thickness, text_size, rot_around_dim=(plane=="yz"?90:0));
v1= [x, startpoint.y, z]-startpoint;
h1 = norm(v1);
axis1 = cross([0,0,1], v1);
angle1 = atan2(norm(axis1), v1.z);
translate(startpoint)
rotate(angle1, axis1)
rotate([offset>0?0:180,0,0])
cylinder( h= h1+thickness*2, d=thickness);
v2= [x, endpoint.y, z]-endpoint;
h2 = norm(v2);
axis2 = cross([0,0,1], v2);
angle2 = atan2(norm(axis2), v2.z);
translate(endpoint)
rotate(angle2, axis2)
rotate([offset>0?0:180,0,0])
cylinder( h= h2+thickness*2, d=thickness);
}
module dimension_z(startpoint, endpoint, offset = 1, text = "", thickness = 0, text_size = 0 , plane = "xz") { //! Creates a dimension in the z direction. Plane options : xz, yz
length = norm(endpoint - startpoint);
thickness = (thickness == 0? length/200:thickness);
x = offset > 0 ? max(startpoint.x, endpoint.x) + (plane=="xz"?offset:0) : min(startpoint.x, endpoint.x) + (plane=="xz"?offset:0);
y = offset > 0 ? max(startpoint.y, endpoint.y) + (plane=="yz"?offset:0) : min(startpoint.y, endpoint.y) + (plane=="yz"?offset:0);
dimension([x, y, startpoint.z], [x, y, endpoint.z], text, thickness, text_size, rot_around_dim=(plane=="xz"?90:0));
v1= [x, y, startpoint.z]-startpoint;
h1 = norm(v1);
axis1 = cross([0,0,1], v1);
angle1 = atan2(norm(axis1), v1.z);
translate(startpoint)
rotate(angle1, axis1)
cylinder( h= h1+thickness*2, d=thickness);
v2= [x, y, endpoint.z]-endpoint;
h2 = norm(v2);
axis2 = cross([0,0,1], v2);
angle2 = atan2(norm(axis2), v2.z);
translate(endpoint)
rotate(angle2, axis2)
cylinder( h= h2+thickness*2, d=thickness);
}

View File

@@ -164,13 +164,13 @@ function xor(a,b) = (a && !b) || (!a && b); //! Logical exclusive OR
function cuberoot(x)= sign(x)*abs(x)^(1/3);
function quadratic_real_roots(a, b, c) = //! Returns real roots of a quadratic equation, biggest first. Returns empty list if no real roots
let(2a = 2 * a,
2c = 2 * c,
det = b^2 - 2a * 2c
let(ax2 = 2 * a,
cx2 = 2 * c,
det = b^2 - ax2 * cx2
) det < 0 ? [] :
let(r = sqrt(det),
x1 = b < 0 ? 2c / (-b + r) : (-b - r) / 2a,
x2 = b < 0 ? (-b + r) / 2a : 2c / (-b - r)
x1 = b < 0 ? cx2 / (-b + r) : (-b - r) / ax2,
x2 = b < 0 ? (-b + r) / ax2 : cx2 / (-b - r)
) [x2, x1];
function cubic_real_roots(a, b, c, d) = //! Returns real roots of cubic equation

View File

@@ -17,6 +17,8 @@
// If not, see <https://www.gnu.org/licenses/>.
//
include <pcbs.scad>
HDMI5PCB = pcb("", "", [121.11, 77.93, 1.65], hole_d = 2.2, colour = "mediumblue",
holes = [[4.6, 4.9], [4.6, -3.73], [97.69, -3.73], [97.69, 4.9]],
components = [
@@ -46,6 +48,17 @@ LCD1602APCB = pcb("", "", [80, 36, 1.65], hole_d = 2.9, land_d = 5, colour = "gr
]
);
LCD1602APCBI2C = pcb("", "", [80, 36, 1.65], hole_d = 2.9, land_d = 5, colour = "green",
holes = [[-2.5, -2.5], [-2.5, 2.5], [2.5, 2.5], [2.5, -2.5]],
components = [
[-27.05, - 2.5, 0, "2p54header", 16, 1],
[ -27.05, -10.0, 0, "pcb", 3, I2C_LCD_Backpack],
],
grid = [
52.95 - inch(0.75), 36 - 2.5, 16, 1, silver, inch(0.1), inch(0.1),
]
);
LCD1602A = ["LCD1602A", "LCD display 1602A", 71.3, 24.3, 7.0, LCD1602APCB,
[0, 0, 0], // pcb offst
[[-64.5 / 2, -14.5 / 2], [64.5 / 2, 14.5 / 2, 0.6]], // aperture
@@ -54,6 +67,14 @@ LCD1602A = ["LCD1602A", "LCD display 1602A", 71.3, 24.3, 7.0, LCD1602APCB,
[], // clearance need for the ts ribbon
];
LCD1602AI2C = ["LCD1602A", "LCD display 1602A", 71.3, 24.3, 7.0, LCD1602APCBI2C,
[0, 0, 0], // pcb offst
[[-64.5 / 2, -14.5 / 2], [64.5 / 2, 14.5 / 2, 0.6]], // aperture
[], // touch screen
0, // thread length
[], // clearance need for the ts ribbon
];
LCD2004APCB = pcb("", "", [98, 60, 1.65], hole_d = 2.9, land_d = 5, colour = "green",
holes = [[-2.5, -2.5], [-2.5, 2.5], [2.5, 2.5], [2.5, -2.5]],
components = [
@@ -167,6 +188,6 @@ BigTreeTech_TFT35v3_0 = ["BigTreeTech_TFT35v3_0", "BigTreeTech TFT35 v3.0",
];
displays = [HDMI5, SSD1963_4p3, LCD2004A, BigTreeTech_TFT35v3_0, LCD1602A, LCDS7282B, TFT128x160];
displays = [HDMI5, SSD1963_4p3, LCD2004A, BigTreeTech_TFT35v3_0, LCD1602A, LCD1602AI2C, LCDS7282B, TFT128x160];
use <display.scad>

View File

@@ -21,6 +21,10 @@
//! Default is steel but can be drawn as brass or nylon. A utility for making nut traps included.
//!
//! If a nut is given a child then it gets placed on its top surface.
//!
//! The following diagram shows you the parameters for drawing a sliding_t_nut:
//!
//! ![](docs/sliding_t_nut.png)
//
include <../utils/core/core.scad>
use <washer.scad>

View File

@@ -650,9 +650,11 @@ module barrel_jack(cutout = false) { //! Draw barrel power jack
contact_d = 2;
contact_w = 4;
inset = 1;
if(cutout)
;
else {
if(cutout) {
rotate([0, 90, 0])
translate([-bore_h, 0])
cylinder(d = bore_d + panel_clearance, h = 100);
} else {
color(grey(20)) rotate([0, 90, 0]) {
linear_extrude(l, center = true) {
difference() {
@@ -1095,6 +1097,56 @@ module trimpot10(vertical, cutout = false) { //! Draw a ten turn trimpot
}
}
//! Draw a 1/4" square trimpot (https://ar.mouser.com/datasheet/2/54/3362-776956.pdf)
module trimpot3362() {
l = 6.60;
w = 6.99;
h = 4.88;
foot_w = 0.38;
foot_h = 0.38;
screw_h = 0;
screw_d = 2.25;
slot_w = 0.6;
slot_h = 0.8;
module adjust(){
d = 2.77;
width = 0.64;
deep = 0.89;
color("white"){
difference(){
cylinder(d=d, h=2*deep, center=true);
translate([0, 0, deep-deep/2+0.01])
cube([d, width, deep], center=true);
translate([0, 0, deep-deep/2+0.01]) rotate([0, 0, 90])
cube([d, width, deep], center=true);
}
}
}
color("#2CA1FD") {
difference(){
translate([0, 0, foot_h / 2 + h / 2])
cube([w, l, h - foot_h], center = true);
translate_z(h-0.88) hull() adjust();
//Grub
for(ang=[-30:30:210])
rotate([0, 0, ang])
translate([2.77/2+0.46, 0, h]) cube([1, 0.3, 0.3], center=true);
}
for(x = [-1, 1], y = [1, -1])
translate([x * (w - foot_w) / 2, y * (l - foot_w) / 2, h / 2])
cube([foot_w, foot_w, h], center = true);
for(x = [-1, 1])
translate([x*(w/2-1), -l/2, h/2+foot_h/2])
cube([0.7, 0.7, h-foot_h], center=true);
}
translate([0, 0, h-0.89]) adjust();
}
module block(size, colour, makes_cutout, cutouts, r = 0, rtop = 0) //! Draw a coloured cube to represent a random PCB component
if(cutouts) {
if(makes_cutout)
@@ -1179,6 +1231,7 @@ module pcb_component(comp, cutouts = false, angle = undef) { //! Draw pcb compon
if(show(comp, "jst_ph")) jst_xh_header(jst_ph_header, comp[4], param(5, false), param(6, false), param(7, undef));
if(show(comp, "jst_zh")) jst_xh_header(jst_zh_header, comp[4], param(5, false), param(6, false), param(7, undef));
if(show(comp, "potentiometer")) let(pot = param(4, BTT_encoder)) translate_z(pot_size(pot).z) vflip() potentiometer(pot, shaft_length = param(5, undef));
if(show(comp, "trimpot3362")) trimpot3362();
if(show(comp, "buzzer")) buzzer(param(4, 9), param(5, 12), param(6, grey(20)));
if(show(comp, "smd_250V_fuse")) smd_250V_fuse(comp[4], comp[5]);
if(show(comp, "smd_res")) smd_resistor(comp[4], comp[5]);

View File

@@ -1296,11 +1296,28 @@ tiny_buck = pcb("tiny_buck", "Ultra Small 3A buck regulator", [20, 11, 1.6],
grid = [inch(0.05), 11 / 2 - inch(0.15), 1, 4, "silver", 0, inch(0.1)]
);
I2C_LCD_Backpack = let(size=[42, 19, 1.2])
pcb("I2C_LCD_Backpack", "I2C / SPI character LCD backpack",
size = size, //size
colour = "black",
components = [[size[0]-2, -size[1]/2, 90, "2p54header", 4, 1, false, undef, true],
[2, size[1]-8.5, 270, "2p54header", 2, 1, false, false, true],
[size[0]/2, size[1]/2, 90, "smd_soic", SOIC16, "PCF8574"],
[size[0]*3/4, 11, 0, "trimpot3362"],
// Silkscreen
[size[0]*3/4+6, size[1]-5.8, 0, "text", 3, 1, "GND", "Liberation Sans:style=Bold"],
[size[0]*3/4+6, size[1]-5.8-2.54, 0, "text", 3, 1, "VCC", "Liberation Sans:style=Bold"],
[size[0]*3/4+6, size[1]-5.8-2.54*2, 0, "text", 3, 1, "SDA", "Liberation Sans:style=Bold"],
[size[0]*3/4+6, size[1]-5.8-2.54*3, 0, "text", 3, 1, "SCL", "Liberation Sans:style=Bold"]
],
grid = [2, size[1]-2, 16, 1, silver, inch(0.1), inch(0.9)]
);
tiny_pcbs = [ESP_201, ESP_01M, XIAO, ESP_12F, MP1584EN, ESP_01,tiny_buck, LIPO_fuel_gauge, 9DOF_stick];
big_pcbs = [BTT_RELAY_V1_2, BTT_SKR_MINI_E3_V2_0, BTT_SKR_E3_TURBO, BTT_SKR_V1_4_TURBO, DuetE, Duex5];
pcbs = [KY_040, TP4056, L9110S, ZC_A0591, RCWL0516, MT3608,RAMPSEndstop, ArduinoNano, HW803_1WAY_RELAY, Feather405, RPI_Pico,
pcbs = [KY_040, TP4056, L9110S, ZC_A0591, RCWL0516, MT3608,RAMPSEndstop, ArduinoNano, I2C_LCD_Backpack, HW803_1WAY_RELAY, Feather405, RPI_Pico,
ESP32_DOIT_V1, BlackPill, RPI0, EnviroPlus, ArduinoUno3, ArduinoLeonardo, WD2002SJ, OPZ2, PanelDue_v3, RPI3A, RPI3, RPI4];
pcbs_not_shown = [Melzi, Duex2, PSU12V1A, Keyes5p1, PI_IO, ExtruderPCB];