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

Compare commits

...

23 Commits

Author SHA1 Message Date
Chris Palmer
5be14f5e89 Fixed bug updating the times file when case changes.
First column split of vitamins now at J.
2020-04-13 18:02:03 +01:00
Chris Palmer
efff17dfc7 Ball bearing chamfer less and 6808 hub corrected. 2020-04-11 23:46:37 +01:00
Chris Palmer
ac4a5500a9 Added chamfers and made hub and rim properties of ball_bearings. 2020-04-11 17:29:02 +01:00
Chris
6b90a7aac8 Merge pull request #72 from ledvinap/patch-1
nut_radius is needed for screw_boss_diameter
2020-04-10 12:51:39 +01:00
Chris Palmer
3c3d72f366 Merge branch 'master' of https://github.com/nophead/NopSCADlib 2020-04-10 12:41:41 +01:00
Chris Palmer
dbcab8377f LEDs can now be placed on PCBs. 2020-04-10 12:41:05 +01:00
Chris Palmer
11d96d37e1 LEDs can not be placed on PCBs. 2020-04-10 12:39:46 +01:00
Petr Ledvina
40843b421f nut_radius is needed for screw_boss_diameter
using `include <NopSCADlib/lib.scad>` in main file fails in `screw_boss_diameter`:
`WARNING: Ignoring unknown function 'nut_radius', in file ../../../sw/OpenSCAD/libraries/NopSCADlib/vitamins/screw.scad, line 41.`

Maybe my library usage is wrong, I did not investigate further ...
2020-04-09 20:33:59 +02:00
Chris Palmer
cc8f4d3bd3 Tweaked test PCB layout 2020-04-09 18:33:59 +01:00
Chris Palmer
69d6fc8bf0 PCB test now shorter and wider for better view. 2020-04-09 17:35:49 +01:00
Chris Palmer
01b1e2e84d Added WD2002SJ Buck Boost DC-DC converter PCB 2020-04-08 20:53:19 +01:00
Chris Palmer
cb64cadb92 Added gterm508. 2020-04-08 19:52:35 +01:00
Chris Palmer
b57b50d2b0 Added yet another type of green terminal that is blue. 2020-04-08 19:38:52 +01:00
Chris Palmer
8f282775a4 Fixed green terminal pin centering. 2020-04-08 19:15:38 +01:00
Chris Palmer
bf833b0452 Fixed some typos 2020-04-08 19:13:06 +01:00
Chris Palmer
52011fd6f7 Renders of dxfs now use the sheet colour. 2020-04-07 22:07:28 +01:00
Chris Palmer
9da8634769 Bom generation now calls openscad with --hardwarnings to stop ASAP. 2020-04-07 19:36:38 +01:00
Chris Palmer
147ff9b24f Added alpha parameter to stl_colour() 2020-04-07 17:02:10 +01:00
Chris Palmer
b4379907a2 Updated gallery 2020-04-06 16:21:58 +01:00
Chris Palmer
3be88f6517 Some more stl_colours. 2020-04-06 15:02:50 +01:00
Chris Palmer
d42f99e437 stl_colour() now used in tests and examples. 2020-04-06 10:27:17 +01:00
Chris Palmer
65455930f8 Reverted incorrect use of stl_colour(). 2020-04-05 18:51:21 +01:00
Chris Palmer
7e0c5fdb6e Renders of STLs are now the correct colour. Fixes #71 2020-04-05 16:18:24 +01:00
69 changed files with 431 additions and 241 deletions

View File

@@ -164,7 +164,7 @@ This is achieved by having a pair of modules: -
module handle_assembly() pose([225, 0, 150], [0, 0, 14]) //! Printed part with inserts in place
assembly("handle") {
translate_z(handle_height())
color(pp1_colour) vflip() handle_stl();
stl_colour(pp1_colour) vflip() handle_stl();
handle_screw_positions()
vflip()

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

After

Width:  |  Height:  |  Size: 137 KiB

View File

@@ -1,67 +1,119 @@
[
{
"name": "base_assembly",
"big": null,
"count": 1,
"assemblies": {},
"vitamins": {
"insert(F1BM3): Heatfit insert M3": 2
"insert(F1BM3): Heatfit insert M3": {
"count": 2
}
},
"printed": {
"socket_box.stl": 1
"socket_box.stl": {
"count": 1,
"colour": "dimgrey"
}
},
"routed": {}
},
{
"name": "feet_assembly",
"big": null,
"count": 1,
"assemblies": {
"base_assembly": 1
},
"vitamins": {
"washer(M3_washer): Washer M3 x 7mm x 0.5mm": 8,
"screw(M3_dome_screw, 10): Screw M3 dome x 10mm": 4,
"nut(M3_nut, nyloc = true): Nut M3 x 2.4mm nyloc": 4
"washer(M3_washer): Washer M3 x 7mm x 0.5mm": {
"count": 8
},
"screw(M3_dome_screw, 10): Screw M3 dome x 10mm": {
"count": 4
},
"nut(M3_nut, nyloc = true): Nut M3 x 2.4mm nyloc": {
"count": 4
}
},
"printed": {
"foot.stl": 4
"foot.stl": {
"count": 4,
"colour": "darkorange"
}
},
"routed": {}
},
{
"name": "mains_in_assembly",
"big": null,
"count": 1,
"assemblies": {
"feet_assembly": 1
},
"vitamins": {
": Wire green & yellow 30/0.25mm strands, length 150mm - not shown": 1,
": Wire blue 30/0.25mm strands, length 150mm - not shown": 1,
": Wire brown 30/0.25mm strands, length 150mm - not shown": 2,
"tubing(HSHRNK32): Heatshrink sleeving ID 3.2mm x 15mm - not shown": 3,
"iec(IEC_inlet_atx): IEC inlet for ATX": 1,
"screw(M3_cs_cap_screw, 12): Screw M3 cs cap x 12mm": 2,
"washer(M3_washer): Washer M3 x 7mm x 0.5mm": 2,
"nut(M3_nut, nyloc = true): Nut M3 x 2.4mm nyloc": 2
": Wire green & yellow 30/0.25mm strands, length 150mm - not shown": {
"count": 1
},
": Wire blue 30/0.25mm strands, length 150mm - not shown": {
"count": 1
},
": Wire brown 30/0.25mm strands, length 150mm - not shown": {
"count": 2
},
"tubing(HSHRNK32): Heatshrink sleeving ID 3.2mm x 15mm - not shown": {
"count": 3
},
"iec(IEC_inlet_atx): IEC inlet for ATX": {
"count": 1
},
"screw(M3_cs_cap_screw, 12): Screw M3 cs cap x 12mm": {
"count": 2
},
"washer(M3_washer): Washer M3 x 7mm x 0.5mm": {
"count": 2
},
"nut(M3_nut, nyloc = true): Nut M3 x 2.4mm nyloc": {
"count": 2
}
},
"printed": {},
"routed": {}
},
{
"name": "main_assembly",
"big": null,
"count": 1,
"assemblies": {
"mains_in_assembly": 1
},
"vitamins": {
": Wire green & yellow 30/0.25mm strands, length 150mm - not shown": 1,
": Wire blue 30/0.25mm strands, length 150mm - not shown": 1,
"tubing(HSHRNK32): Heatshrink sleeving ID 3.2mm x 15mm - not shown": 5,
": Ferrule for 1.5mm^2 wire - not shown": 3,
"mains_socket(Contactum): Mains socket 13A": 1,
"screw(M3_cs_cap_screw, 20): Screw M3 cs cap x 20mm": 2,
"jack_4mm_shielded(\"blue\", 3, \"royalblue\"): 4mm shielded jack socket blue": 2,
"jack_4mm_shielded(\"brown\", 3, \"sienna\"): 4mm shielded jack socket brown": 1,
"jack_4mm_shielded(\"green\", 3): 4mm shielded jack socket green": 2
": Wire green & yellow 30/0.25mm strands, length 150mm - not shown": {
"count": 1
},
": Wire blue 30/0.25mm strands, length 150mm - not shown": {
"count": 1
},
"tubing(HSHRNK32): Heatshrink sleeving ID 3.2mm x 15mm - not shown": {
"count": 5
},
": Ferrule for 1.5mm^2 wire - not shown": {
"count": 3
},
"mains_socket(Contactum): Mains socket 13A": {
"count": 1
},
"screw(M3_cs_cap_screw, 20): Screw M3 cs cap x 20mm": {
"count": 2
},
"jack_4mm_shielded(\"blue\", 3, \"royalblue\"): 4mm shielded jack socket blue": {
"count": 2
},
"jack_4mm_shielded(\"brown\", 3, \"sienna\"): 4mm shielded jack socket brown": {
"count": 1
},
"jack_4mm_shielded(\"green\", 3): 4mm shielded jack socket green": {
"count": 2
}
},
"printed": {},
"routed": {}

View File

@@ -173,7 +173,7 @@ module socket_box_stl() {
//
module base_assembly()
assembly("base") {
color(pp1_colour) render() /*clip(ymax = 0)*/ socket_box_stl();
stl_colour(pp1_colour) render() /*clip(ymax = 0)*/ socket_box_stl();
mains_socket_hole_positions(socket)
translate_z(height)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 179 KiB

After

Width:  |  Height:  |  Size: 179 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 280 KiB

After

Width:  |  Height:  |  Size: 280 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 287 KiB

After

Width:  |  Height:  |  Size: 286 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 205 KiB

After

Width:  |  Height:  |  Size: 242 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 207 KiB

After

Width:  |  Height:  |  Size: 215 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 198 KiB

After

Width:  |  Height:  |  Size: 199 KiB

View File

@@ -84,7 +84,7 @@ Mains isolated and variable supply with metering.
<a name="TOP"></a>
## SunBot
A solar tracker to keep solar powerbanks pointing at the sun.
A solar tracker to keep a solar panel pointing at the sun.
![](SunBot.png)

View File

@@ -40,7 +40,6 @@ include <vitamins/inserts.scad>
include <vitamins/kp_pillow_blocks.scad>
include <vitamins/ldrs.scad>
include <vitamins/leadnuts.scad>
include <vitamins/leds.scad>
include <vitamins/light_strips.scad>
include <vitamins/mains_sockets.scad>
include <vitamins/modules.scad>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 775 KiB

After

Width:  |  Height:  |  Size: 784 KiB

View File

@@ -165,8 +165,8 @@ o_rings_y = springs_y;
sealing_strip_y = springs_y + 20;
tubings_y = sealing_strip_y + 20;
pillars_y = tubings_y + 20;
leadnuts_y = pillars_y + 40;
pulleys_y = leadnuts_y +40;
ball_bearings_y = pillars_y + 40;
pulleys_y = ball_bearings_y +40;
hot_ends_y = pulleys_y + 60;
linear_bearings_y = hot_ends_y + 50;
sheets_y = linear_bearings_y + 100;
@@ -209,10 +209,7 @@ translate([x0, tubings_y])
translate([x0, pillars_y])
pillars();
translate([x0, leadnuts_y ])
leadnuts();
translate([x0 + 60, leadnuts_y])
translate([x0, ball_bearings_y])
ball_bearings();
translate([x0, pulleys_y])
@@ -252,7 +249,8 @@ translate([x0, psus_y]) {
}
zipties_y = 0;
bulldogs_y = zipties_y + 40;
bulldogs_y = zipties_y + 30;
leadnuts_y = bulldogs_y + 50;
translate([x1, zipties_y])
zipties();
@@ -260,6 +258,10 @@ translate([x1, zipties_y])
translate([x1, bulldogs_y])
bulldogs();
translate([x1, leadnuts_y])
leadnuts();
leds_y = 0;
carriers_y = leds_y + 40;
spades_y = carriers_y + 40;

View File

@@ -33,7 +33,7 @@ assembly("box") {
y = [-1,-1,1,1][corner];
translate([x * (box_width(type) / 2 + 25 * exploded()), y * (box_depth(type) / 2 + 25 * exploded())])
rotate(corner * 90) {
color(pp2_colour) render()
stl_colour(pp2_colour) render()
box_corner_profile(type);
translate([box_hole_inset(type), box_hole_inset(type)])
@@ -50,7 +50,7 @@ assembly("box") {
translate_z(z * (box_height(type) / 2 - box_corner_gap(type) + 50 * exploded()))
rotate([z * 90 - 90, 0, 0])
if(bezels && (z > 0 ? top : base))
color(pp1_colour) render() box_bezel(type, z < 0);
stl_colour(pp1_colour) render() box_bezel(type, z < 0);
translate_z(z * (box_height(type) / 2 + sheet_thickness + 50 * exploded()))
box_screw_hole_positions(type)

View File

@@ -133,12 +133,12 @@ module round_grommet_hole(diameter, h = 100) //! Make a hole for a round grommet
drill(corrected_radius(diameter / 2) + wall + clearance, h);
module round_grommet_assembly(diameter, thickness, od = undef) {
color(pp1_colour)
stl_colour(pp1_colour)
translate_z(wall)
vflip()
round_grommet_top(diameter, thickness, od);
color(pp2_colour)
stl_colour(pp2_colour)
translate_z(-thickness)
vflip()
round_grommet_bottom(diameter, od);
@@ -188,7 +188,7 @@ module mouse_grommet(r, thickness) { //! Make the STL for a mouse grommet
}
module mouse_grommet_assembly(r, thickness)
color(pp1_colour)
stl_colour(pp1_colour)
rotate([-90, 0, 0])
mouse_grommet(r, thickness);

View File

@@ -120,7 +120,7 @@ module corner_block_assembly(screw = def_screw, name = false) //! The printed bl
assembly(str("corner_block_M", 20 * screw_radius(screw))) {
insert = screw_insert(screw);
color(name ? pp2_colour : pp1_colour)
stl_colour(name ? pp2_colour : pp1_colour)
render() corner_block(screw, name) children();
corner_block_h_holes(screw)

View File

@@ -141,7 +141,7 @@ module door_hinge_assembly(top, door_thickness = 6) { //! The moving assembly th
translate([0, pin_y - (thickness + door_thickness / 2), dir * width / 2]) {
rotate([90, 0, 180])
color(pp2_colour) door_hinge(door_thickness);
stl_colour(pp2_colour) door_hinge(door_thickness);
rotate([90, 0, 0])
door_hinge_hole_positions()
@@ -165,7 +165,7 @@ module door_hinge_static_assembly(top, sheet_thickness = 3) { //! The stationary
translate([pin_x, 0, -dir * (stat_width / 2 + washer_thickness(screw_washer(pin_screw)))])
rotate([90, 0, 0]) {
color(pp1_colour) door_hinge_stat_stl();
stl_colour(pp1_colour) door_hinge_stat_stl();
door_hinge_stat_hole_positions() {
screw_and_washer(stat_screw, stat_screw_length);

View File

@@ -65,7 +65,7 @@ module door_latch_assembly(sheet_thickness = 3) { //! The assembly for a specifi
translate([0, -height - washer_thickness(washer)])
rotate([-90, 0, 0]) {
color(pp1_colour) render() door_latch_stl();
stl_colour(pp1_colour) render() door_latch_stl();
translate_z(nut_trap_depth)
vflip()

View File

@@ -109,7 +109,7 @@ module fixing_block_assembly(screw = def_screw) pose([55, 180, 25], [0, 4.8, 4.8
assembly(str("fixing_block_M", 20 * screw_radius(screw))) {
translate_z(fixing_block_height(screw))
rotate([0, 180, 0])
color(pp1_colour) render() fixing_block(screw);
stl_colour(pp1_colour) render() fixing_block(screw);
insert = screw_insert(screw);

View File

@@ -133,17 +133,17 @@ assembly(str("hinge_", type[0])) { //! Assembled hinge
vitamin(str(": Hinge pin ", w, " x ", 2 * hr, "mm"));
color(pp1_colour) hinge_male(type);
stl_colour(pp1_colour) hinge_male(type);
translate([0, -kr, kr]) {
rotate([0, 90, 0])
explode(w + 10)
color("silver") cylinder(r = hr , h = w, center = true);
stl_colour("silver") cylinder(r = hr , h = w, center = true);
rotate([-angle, 0, 0])
translate([0, -kr, -kr])
rotate(180)
color(pp2_colour) hinge_female(type);
stl_colour(pp2_colour) hinge_female(type);
}
}

View File

@@ -73,7 +73,7 @@ module foot_assembly(t = 0, type = foot, flip = false) { //! Assembly with faste
screw_length = screw_longer_than(foot_thickness(type) + t + 2 * washer_thickness(washer) + nut_thickness(nut, true) - squeeze);
vflip() explode(15, true) {
color(pp4_colour) foot(type);
stl_colour(pp4_colour) foot(type);
if(t)
explode(15, true)
@@ -136,7 +136,7 @@ assembly("insert_foot") {
insert = screw_insert(screw);
vflip()
color(pp1_colour) insert_foot(type);
stl_colour(pp4_colour) insert_foot(type);
translate_z(-foot_thickness(type))
insert(insert);

View File

@@ -83,7 +83,7 @@ module handle_stl() { //! generate the STL
module handle_assembly() pose([225, 0, 150], [0, 0, 14]) //! Printed part with inserts in place
assembly("handle") {
translate_z(handle_height())
color(pp1_colour) vflip() handle_stl();
stl_colour(pp1_colour) vflip() handle_stl();
handle_screw_positions()
vflip()

View File

@@ -101,7 +101,7 @@ module pcb_mount_assembly(pcb, thickness, height = 5) { //! A PCB mount assembly
translate_z(height)
pcb(pcb);
color(pp1_colour) pcb_mount(pcb, washers = false);
stl_colour(pp1_colour) pcb_mount(pcb, washers = false);
washer = screw_washer(screw);
nut = screw_nut(screw);
@@ -110,7 +110,7 @@ module pcb_mount_assembly(pcb, thickness, height = 5) { //! A PCB mount assembly
pcb_mount_screw_positions(pcb) {
translate_z(height + t) {
color(pp2_colour) pcb_mount_washer_stl();
stl_colour(pp2_colour) pcb_mount_washer_stl();
translate_z(washer_thickness)
screw(screw, screw_length);

View File

@@ -221,7 +221,7 @@ module pbox_base_screws(type, thickness = 0) //! Place the screws and
pbox_screw_positions(type) {
foot = pbox_foot(type);
if(foot)
color(pp4_colour)
stl_colour(pp4_colour)
foot(foot);
translate_z(foot ? foot_thickness(foot) : thickness)

View File

@@ -147,7 +147,7 @@ assembly(str("PSU_shroud_", name)) {
translate_z(psu_shroud_height(type))
vflip()
color(pp1_colour) psu_shroud(type, cable_d, name, cables);
stl_colour(pp1_colour) psu_shroud(type, cable_d, name, cables);
psu_shroud_hole_positions(type)
vflip()

View File

@@ -83,7 +83,7 @@ module ribbon_clamp_assembly(ways) pose([55, 180, 25]) //! Printed part with in
assembly(str("ribbon_clamp_", ways)) {
h = ribbon_clamp_height();
color(pp1_colour) render()
stl_colour(pp1_colour) render()
translate_z(h) vflip() ribbon_clamp(ways);
ribbon_clamp_hole_positions(ways)

View File

@@ -62,7 +62,7 @@ module screw_knob_assembly(screw, length) //! Assembly with the screw in place
assembly(str("screw_knob_M", 20 * screw_radius(screw), "_", length)) {
translate_z(knob_height)
vflip()
color(pp1_colour) screw_knob(screw);
stl_colour(pp1_colour) screw_knob(screw);
translate_z(knob_height - knob_nut_trap_depth(screw))
rotate(-45)

View File

@@ -92,7 +92,7 @@ assembly(str("socket_box_", type[0])) {
screw = mains_socket_screw(type);
insert = screw_insert(screw);
color(pp1_colour) render() socket_box(type);
stl_colour(pp1_colour) render() socket_box(type);
mains_socket_hole_positions(type)
translate_z(height)

View File

@@ -111,7 +111,7 @@ assembly(str("SSR_shroud_", name)) {
translate_z(ssr_shroud_height(type))
vflip()
color(pp1_colour) ssr_shroud(type, cable_d, name);
stl_colour(pp1_colour) ssr_shroud(type, cable_d, name);
ssr_shroud_hole_positions(type)
insert(insert);
@@ -135,7 +135,7 @@ module ssr_shroud_fastened_assembly(type, cable_d, thickness, name) //! Assembly
*translate_z(cable_d / 2)
rotate([90, 0, 0])
color(grey20)
stl_colour(grey20)
cylinder(d = cable_d, h = 20, center = true);
}
}

View File

@@ -160,7 +160,7 @@ module strap_end(type = strap) { //! Generate the STL for end piece
//
module strap_end_assembly(type = strap)
assembly("strap_end") {
color(pp1_colour)
stl_colour(pp1_colour)
strap_end(type);
translate_z(strap_height(type) + strap_key(type))
@@ -175,7 +175,7 @@ module strap_assembly(length, type = strap) { //! Assembly with screws in place
screw_length = screw_shorter_than(washer_thickness(washer) + washer_thickness(penny) + insert_length(insert) + panel_clearance + counterbore);
color(pp4_colour) strap(length, type);
stl_colour(pp4_colour) strap(length, type);
strap_screw_positions(length, type)
translate_z(strap_height(type))

View File

@@ -65,14 +65,11 @@ Also single bearing balls are modelled as just a silver sphere and a BOM entry.
| ```bb_bore(type)``` | Internal diameter |
| ```bb_colour(type)``` | Shield colour, "silver" for metal |
| ```bb_diameter(type)``` | External diameter |
| ```bb_hub(type)``` | Inner rim thickness guesstimate |
| ```bb_name(type)``` | Part code without shield type suffix |
| ```bb_rim(type)``` | Outer rim thickness guesstimate |
| ```bb_width(type)``` | Width |
### Functions
| Function | Description |
|:--- |:--- |
| ```bb_rim(type)``` | Inner and outer rim thickness |
### Modules
| Module | Description |
|:--- |:--- |
@@ -88,7 +85,8 @@ Also single bearing balls are modelled as just a silver sphere and a BOM entry.
| 1 | ```ball_bearing(BB6200)``` | Ball bearing 6200-2RS 10mm x 30mm x 9mm |
| 1 | ```ball_bearing(BB6201)``` | Ball bearing 6201-2RS 12mm x 32mm x 10mm |
| 1 | ```ball_bearing(BB624)``` | Ball bearing 624-2RS 4mm x 13mm x 5mm |
| 4 | ``` bearing_ball(3)``` | Steel ball 3mm |
| 1 | ```ball_bearing(BB6808)``` | Ball bearing 6808-2RS 40mm x 52mm x 7mm |
| 5 | ``` bearing_ball(3)``` | Steel ball 3mm |
<a href="#top">Top</a>
@@ -892,6 +890,7 @@ Parametric green terminal blocks
| ```gt_back_depth(type)``` | Back ledge depth |
| ```gt_back_height(type)``` | Height at the back |
| ```gt_box_h(type)``` | Height of the cable entry box |
| ```gt_box_setback(type)``` | How far the contact box is set back from the front |
| ```gt_box_w(type)``` | Width inside the cable entry box |
| ```gt_depth(type)``` | Total front to back depth |
| ```gt_front_depth(type)``` | Front ledge depth |
@@ -903,7 +902,7 @@ Parametric green terminal blocks
| ```gt_top(type)``` | Depth at the top |
| ```gt_tube_h(type)``` | Height of optional tubes around the screws |
| ```gt_y_offset(type)``` | Offset of the pins from centre of the depth |
| ```gt_y_offset2(type)``` | Offset of the pins screws from the screws |
| ```gt_y_offset2(type)``` | Offset of the pins from the screws |
### Modules
| Module | Description |
@@ -916,8 +915,9 @@ Parametric green terminal blocks
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 1 | ```green_terminal(gt_6p35, 2)``` | Terminal block 2 way 0.25" |
| 1 | ```green_terminal(gt_3p5, 3)``` | Terminal block 3 way 3.5mm |
| 1 | ```green_terminal(gt_2p54, 4)``` | Terminal block 4 way 0.1" |
| 1 | ```green_terminal(gt_5p08, 3)``` | Terminal block 3 way 0.2" |
| 1 | ```green_terminal(gt_3p5, 4)``` | Terminal block 4 way 3.5mm |
| 1 | ```green_terminal(gt_2p54, 5)``` | Terminal block 5 way 0.1" |
<a href="#top">Top</a>
@@ -1937,6 +1937,33 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
### Vitamins
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 1 | ```box_header(2p54header, 4, 2, smt = 0)``` | Box header 4 x 2 |
| 1 | ```d_plug(DCONN9, pcb = true)``` | D-type 9 way PCB mount plug |
| 1 | ```hdmi(hdmi_full)``` | HDMI socket |
| 1 | ```idc_transition(2p54header, 5)``` | IDC transition header 5 x 2 |
| 1 | ```led(LED10mm, "yellow")``` | LED 10 mm yellow |
| 1 | ```led(LED3mm)``` | LED 3 mm red |
| 1 | ```led(LED5mm, "orange")``` | LED 5 mm orange |
| 1 | ```microswitch(small_microswitch)``` | Microswitch DM1-00P-110-3 |
| 1 | ```hdmi(hdmi_mini)``` | Mini HDMI socket |
| 1 | ```molex_254(2)``` | Molex KK header 2 way |
| 1 | ```pin_header(2p54header, 4, 1, smt = 0)``` | Pin header 4 x 1 |
| 1 | ```pin_header(2p54header, 5, 1, smt = undef)``` | Pin header 5 x 1 |
| 1 | ```pin_socket(2p54header, 4, 1, right_angle = undef, height = undef, smt = undef)``` | Pin socket 4 x 1 |
| 1 | ```pin_socket(2p54header, 6, 1)``` | Pin socket 6 x 1 |
| 1 | ```pin_socket(2p54header, 8, 1)``` | Pin socket 8 x 1 |
| 1 | ```pin_socket(2p54header, 8, 1, right_angle = undef, height = undef, smt = undef)``` | Pin socket 8 x 1 |
| 1 | ```square_button(button_6mm)``` | Square button 6mm |
| 1 | ```pcb(TMC2130)``` | TMC2130 |
| 1 | ```green_terminal(gt_5p08, 2)``` | Terminal block 2 way 0.2" |
| 2 | ```green_terminal(gt_6p35, 2)``` | Terminal block 2 way 0.25" |
| 1 | ```green_terminal(gt_5x17, 2)``` | Terminal block 2 way 5mm |
| 2 | ```green_terminal(gt_2p54, 3)``` | Terminal block 3 way 0.1" |
| 1 | ```terminal_35(3)``` | Terminal block 3 way 3.5mm |
| 1 | ```green_terminal(gt_5x11, 3)``` | Terminal block 3 way 5mm |
| 1 | ```green_terminal(gt_5x17, 3)``` | Terminal block 3 way 5mm |
| 2 | ```green_terminal(gt_3p5, 4)``` | Terminal block 4 way 3.5mm |
| 1 | ```terminal_35(4)``` | Terminal block 4 way 3.5mm |
| 1 | ```pcb(TestPCB)``` | Test PCB |
@@ -2029,7 +2056,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| 1 | ```d_plug(DCONN15, pcb = true)``` | D-type 15 way PCB mount plug |
| 1 | ```pcb(DuetE)``` | Duet 2 Ethernet electronics |
| 1 | ```pcb(Duex2)``` | Duex2 expansion board |
| 1 | ```pcb(Duex5)``` | Duex5 expasnion board |
| 1 | ```pcb(Duex5)``` | Duex5 expansion board |
| 1 | ```pcb(EnviroPlus)``` | Enviro+ |
| 1 | ```pcb(ExtruderPCB)``` | Extruder connection PCB |
| 1 | ```pcb(Keyes5p1)``` | Keyes5.1 Arduino Uno expansion board |
@@ -2040,7 +2067,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| 1 | ```molex_254(3)``` | Molex KK header 3 way |
| 16 | ```nut(M2_nut, nyloc = true)``` | Nut M2 x 1.6mm nyloc |
| 30 | ```nut(M2p5_nut, nyloc = true)``` | Nut M2.5 x 2.2mm nyloc |
| 12 | ```nut(M3_nut, nyloc = true)``` | Nut M3 x 2.4mm nyloc |
| 16 | ```nut(M3_nut, nyloc = true)``` | Nut M3 x 2.4mm nyloc |
| 12 | ```nut(M4_nut, nyloc = true)``` | Nut M4 x 3.2mm nyloc |
| 1 | ```pcb(PI_IO)``` | PI_IO V2 |
| 1 | ```pcb(PSU12V1A)``` | PSU 12V 1A |
@@ -2062,17 +2089,18 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| 4 | ```screw(M2p5_pan_screw, 20)``` | Screw M2.5 pan x 20mm |
| 12 | ```screw(M2p5_pan_screw, 25)``` | Screw M2.5 pan x 25mm |
| 4 | ```screw(M3_cap_screw, 16)``` | Screw M3 cap x 16mm |
| 4 | ```screw(M3_cap_screw, 30)``` | Screw M3 cap x 30mm |
| 8 | ```screw(M3_cap_screw, 30)``` | Screw M3 cap x 30mm |
| 4 | ```screw(M3_cap_screw, 35)``` | Screw M3 cap x 35mm |
| 8 | ```screw(M4_cap_screw, 30)``` | Screw M4 cap x 30mm |
| 4 | ```screw(M4_cap_screw, 35)``` | Screw M4 cap x 35mm |
| 4 | ```screw(M4_cap_screw, 30)``` | Screw M4 cap x 30mm |
| 8 | ```screw(M4_cap_screw, 35)``` | Screw M4 cap x 35mm |
| 1 | ```pcb(TP4056)``` | TP4056 Li-lon Battery charger module |
| 3 | ```terminal_35(2)``` | Terminal block 2 way 3.5mm |
| 2 | ```green_terminal(gt_2p54, 4)``` | Terminal block 4 way 0.1" |
| 1 | | USB A to Mini B lead |
| 1 | ```pcb(WD2002SJ)``` | WD2002SJ Buck Boost DC-DC converter |
| 16 | ```washer(M2_washer)``` | Washer M2 x 5mm x 0.3mm |
| 30 | ```washer(M2p5_washer)``` | Washer M2.5 x 5.9mm x 0.5mm |
| 12 | ```washer(M3_washer)``` | Washer M3 x 7mm x 0.5mm |
| 16 | ```washer(M3_washer)``` | Washer M3 x 7mm x 0.5mm |
| 12 | ```washer(M4_washer)``` | Washer M4 x 9mm x 0.8mm |
| 1 | ```pcb(ZC_A0591)``` | ZC-A0591 ULN2003 driver PCB |
@@ -2089,14 +2117,15 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| 4 | pcb_spacer25130_2.stl |
| 4 | pcb_spacer25140_2.stl |
| 4 | pcb_spacer25150_2.stl |
| 4 | pcb_spacer25170.stl |
| 4 | pcb_spacer25180.stl |
| 2 | pcb_spacer2570.stl |
| 4 | pcb_spacer30160.stl |
| 4 | pcb_spacer30210.stl |
| 4 | pcb_spacer30170.stl |
| 4 | pcb_spacer30220.stl |
| 4 | pcb_spacer3050.stl |
| 4 | pcb_spacer40180.stl |
| 4 | pcb_spacer40190.stl |
| 4 | pcb_spacer40200.stl |
| 4 | pcb_spacer40210.stl |
<a href="#top">Top</a>
@@ -5171,8 +5200,8 @@ Simple tube or ring
---
<a name="BOM"></a>
## BOM
Bill Of Materials generation via echo and the ```bom.py``` script. Also handles exploded assembly views and posing. Assembly instructions can precede the module
definition that makes the assembly.
Bill Of Materials generation via echo and the ```bom.py``` script. Also handles exploded assembly views and posing.
Assembly instructions can precede the module definition that makes the assembly.
Assembly views shown in the instructions can be large or small and this is deduced by looking at the size of the printed parts involved and if any routed
parts are used.
@@ -5209,6 +5238,7 @@ The resulting flat BOM is shown but heirachical BOMs are also generated for real
| ```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_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. |
| ```vitamin(description)``` | Describe a vitamin for the BOM entry and precede it with a module call that creates it, eg. "wigit(42): Type 42 widget" |
![bom](tests/png/bom.png)

View File

@@ -46,6 +46,16 @@ def find_scad_file(mname):
return filename
return None
class Part:
def __init__(self, args):
self.count = 1
for arg in args:
arg = arg.replace('true', 'True').replace('false', 'False').replace('undef', 'None')
exec('self.' + arg)
def data(self):
return self.__dict__
class BOM:
def __init__(self, name):
self.name = name
@@ -65,12 +75,17 @@ class BOM:
"big" : self.big,
"count" : self.count,
"assemblies" : assemblies,
"vitamins" : self.vitamins,
"printed" : self.printed,
"routed" : self.routed
"vitamins" : {v : self.vitamins[v].data() for v in self.vitamins},
"printed" : {p : self.printed[p].data() for p in self.printed},
"routed" : {r : self.routed[r].data() for r in self.routed}
}
def add_part(self, s):
args = []
match = re.match(r'^(.*?\.stl|.*?\.dxf)\((.*)\)$', s) #look for name.stl(...) or name.dxf(...)
if match:
s = match.group(1)
args = [match.group(2)]
if s[-4:] == ".stl":
parts = self.printed
else:
@@ -79,9 +94,9 @@ class BOM:
else:
parts = self.vitamins
if s in parts:
parts[s] += 1
parts[s].count += 1
else:
parts[s] = 1
parts[s] = Part(args)
def add_assembly(self, ass, args = []):
if ass in self.assemblies:
@@ -126,10 +141,10 @@ class BOM:
for ass in sorted(self.assemblies):
bom = self.assemblies[ass]
if part in bom.vitamins:
file.write("%2d|" % bom.vitamins[part])
file.write("%2d|" % bom.vitamins[part].count)
else:
file.write(" |")
print("%3d" % self.vitamins[part], description, file=file)
print("%3d" % self.vitamins[part].count, description, file=file)
if self.printed:
if self.vitamins:
@@ -140,10 +155,10 @@ class BOM:
for ass in sorted(self.assemblies):
bom = self.assemblies[ass]
if part in bom.printed:
file.write("%2d|" % bom.printed[part])
file.write("%2d|" % bom.printed[part].count)
else:
file.write(" |")
print("%3d" % self.printed[part], part, file=file)
print("%3d" % self.printed[part].count, part, file=file)
if self.routed:
print(file=file)
@@ -153,10 +168,10 @@ class BOM:
for ass in sorted(self.assemblies):
bom = self.assemblies[ass]
if part in bom.routed:
file.write("%2d|" % bom.routed[part])
file.write("%2d|" % bom.routed[part].count)
else:
file.write(" |")
print("%3d" % self.routed[part], part, file=file)
print("%3d" % self.routed[part].count, part, file=file)
if self.assemblies:
print(file=file)
@@ -233,7 +248,7 @@ def boms(target = None, assembly = None):
#
# Run openscad
#
openscad.run("-D","$bom=2","-D","$preview=true","-o", "openscad.echo", "-d", bom_dir + "/bom.deps", bom_maker_name)
openscad.run("-D", "$bom=2", "-D", "$preview=true", "--hardwarnings", "-o", "openscad.echo", "-d", bom_dir + "/bom.deps", bom_maker_name)
os.remove(bom_maker_name)
print("Generating bom ...", end=" ")

View File

@@ -29,6 +29,7 @@ import openscad
from tests import do_cmd, update_image, colour_scheme, background
from deps import mtime
from colorama import init
import json
def usage():
print("\nusage:\n\trender [target_config] - Render images of the stl and dxf files.");
@@ -48,6 +49,20 @@ def render(target, type):
#
parts = bom_to_parts(bom_dir, type)
#
# Read the json bom to get the colours
#
bom_file = bom_dir + "/bom.json"
with open(bom_file) as json_file:
flat_bom = json.load(json_file)
things = { 'stl' : 'printed', 'dxf' : 'routed' }[type]
colours = {}
for ass in flat_bom:
for part in ass[things]:
obj = ass[things][part]
if "colour" in obj:
colours[part] = obj["colour"]
#
# Remove unused png files
#
for file in os.listdir(target_dir):
@@ -55,7 +70,9 @@ def render(target, type):
if not file[:-4] + '.' + type in parts:
print("Removing %s" % file)
os.remove(target_dir + '/' + file)
#
# Render the parts
#
for part in parts:
part_file = target_dir + '/' + part
png_name = target_dir + '/' + part[:-4] + '.png'
@@ -64,10 +81,16 @@ def render(target, type):
#
if mtime(part_file) > mtime(png_name):
png_maker_name = "png.scad"
pp1 = [0, 146/255, 0]
colour = pp1
if part in colours:
colour = colours[part]
if not '[' in colour:
colour = '"' + colour + '"'
with open(png_maker_name, "w") as f:
f.write('color([0, 146/255, 0]) import("%s");\n' % part_file)
f.write('color(%s) import("%s");\n' % (colour, part_file))
cam = "--camera=0,0,0,70,0,315,500" if type == 'stl' else "--camera=0,0,0,0,0,0,500"
render = "--preview" if type == 'stl' else "--render"
render = "--preview" if type == 'stl' or colour != pp1 else "--render"
tmp_name = 'tmp.png'
openscad.run(colour_scheme, "--projection=p", "--imgsize=4096,4096", cam, render, "--autocenter", "--viewall", "-o", tmp_name, png_maker_name);
do_cmd(("magick "+ tmp_name + " -trim -resize 280x280 -background %s -gravity Center -extent 280x280 -bordercolor %s -border 10 %s"

View File

@@ -147,7 +147,7 @@ def tests(tests):
print("Can't find implementation!")
continue
vsplit = "AKR" + chr(ord('Z') + 1)
vsplit = "AJR" + chr(ord('Z') + 1)
vtype = locations[0][1]
types = [vtype + ' ' + vsplit[i] + '-' + chr(ord(vsplit[i + 1]) - 1) for i in range(len(vsplit) - 1)] + [loc[1] for loc in locations[1 :]]
if type == vtype:
@@ -201,7 +201,7 @@ def tests(tests):
dname = deps_name(deps_dir, scad.lower())
oldest = png_name if mtime(png_name) < mtime(bom_name) else bom_name
changed = check_deps(oldest, dname)
changed = times.check_have_time(changed, scad_name.lower())
changed = times.check_have_time(changed, scad_name)
changed = options.have_changed(changed, oldest)
if changed:
print(changed)
@@ -232,9 +232,10 @@ def tests(tests):
j = name.find(']]') + 2
name = name.replace(name[i : j], '[ ... ]')
desc = vit[1]
body += ['| %3d | %s | %s |' % (things[item], name, desc)]
body += ['| %3d | %s | %s |' % (things[item]["count"], name, desc)]
else:
body += ['| %3d | %s |' % (things[item], name)]
count = things[item] if thing == 'assemblies' else things[item]["count"]
body += ['| %3d | %s |' % (count, name)]
body += ['']
body += ['\n<a href="#top">Top</a>']

View File

@@ -48,6 +48,8 @@ def check_have_time(changed, name):
return changed
def add_time(name, start):
if name.lower() in times:
del times[name.lower()]
times[name] = round(time.time() - start, 3)
def print_times():

View File

@@ -248,9 +248,9 @@ def views(target, do_assemblies = None):
for t in types:
for thing in ass[t]:
if thing in things[t]:
things[t][thing] += ass[t][thing]
things[t][thing] += ass[t][thing]["count"]
else:
things[t][thing] = ass[t][thing]
things[t][thing] = ass[t][thing]["count"]
for ass in flat_bom:
name = titalise(ass["name"][:-9]).replace(' ','&nbsp;')
print('| <span style="writing-mode: vertical-rl; text-orientation: mixed;">%s</span> ' % name, file = doc_file, end = '')
@@ -265,7 +265,7 @@ def views(target, do_assemblies = None):
print(('| ' * len(flat_bom) + '| | **%s** |') % heading, file = doc_file)
for thing in sorted(things[t], key = lambda s: s.split(":")[-1]):
for ass in flat_bom:
count = ass[t][thing] if thing in ass[t] else 0
count = ass[t][thing]["count"] if thing in ass[t] else 0
print('| %s ' % pad(count if count else '.', 2, 1), file = doc_file, end = '')
name = ass["name"]
if name in totals:
@@ -301,7 +301,7 @@ def views(target, do_assemblies = None):
print("|Qty|Description|", file = doc_file)
print("|---:|:----------|", file = doc_file)
for v in sorted(vitamins, key = lambda s: s.split(":")[-1]):
print("|%d|%s|" % (vitamins[v], v.split(":")[1]), file = doc_file)
print("|%d|%s|" % (vitamins[v]["count"], v.split(":")[1]), file = doc_file)
print("\n", file = doc_file)
printed = ass["printed"]
@@ -310,7 +310,7 @@ def views(target, do_assemblies = None):
keys = sorted(list(printed.keys()))
for i in range(len(keys)):
p = keys[i]
print('%s %d x %s |' % ('\n|' if not (i % 3) else '', printed[p], p), file = doc_file, end = '')
print('%s %d x %s |' % ('\n|' if not (i % 3) else '', printed[p]["count"], 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)
@@ -326,7 +326,7 @@ def views(target, do_assemblies = None):
keys = sorted(list(routed.keys()))
for i in range(len(keys)):
r = keys[i]
print('%s %d x %s |' % ('\n|' if not (i % 3) else '', routed[r], r), file = doc_file, end = '')
print('%s %d x %s |' % ('\n|' if not (i % 3) else '', routed[r]["count"], 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)

View File

@@ -67,7 +67,7 @@ module widgit_dxf() {
//! * Push the insert into the base with a soldering iron heated to 200&deg;C
module widgit_base_assembly()
assembly("widgit_base") {
color(pp1_colour)
stl_colour(pp1_colour)
widgit_stl();
translate_z(height)

View File

@@ -19,11 +19,12 @@
include <../core.scad>
include <../vitamins/microswitches.scad>
include <../vitamins/d_connectors.scad>
include <../vitamins/leds.scad>
use <../vitamins/pcb.scad>
gt_5x17 = ["gt_5x17", 5, 10, 17, 5, 11, 0.4, 9, 2,1.5, 1, 3, 6, 0, 0, 0];
gt_5x11 = ["gt_5x11", 5, 8, 11, 5, 7, 0.4, 7, 1.5,1.5, 1,2.5, 6, 0, 0, 0];
gt_5x17 = ["gt_5x17", 5, 10, 17, 5, 11, 0.4, 9, 2,1.5, 1, 3, 6, 0.5, 0, 0, 0];
gt_5x11 = ["gt_5x11", 5, 8, 11, 5, 7, 0.4, 7, 1.5,1.5, 1,2.5, 6, 0.5, 0, 0, 0];
TMC2130HeatSinkColor = "DeepSkyBlue";
TMC2130 = ["TMC2130", "TMC2130",
@@ -44,62 +45,72 @@ TMC2130 = ["TMC2130", "TMC2130",
];
test_pcb = ["TestPCB", "Test PCB",
50, 500, 1.6, // length, width, thickness
100, 250, 1.6, // length, width, thickness
3, // Corner radius
2.75, // Mounting hole diameter
6, // Pad around mounting hole
5.5, // Pad around mounting hole
"green",// Color
false, // True if the parts should be separate BOM items
true, // True if the parts should be separate BOM items
// hole offsets
[ [3, 3], [3, -3], [-3, 3], [-3, -3] ],
// components
[
[ 20, -5, 180, "trimpot10"],
[ 20, -15, 0, "trimpot10", true],
[ 10, 10, 0, "2p54header", 4, 1],
[ 25, 10, 0, "2p54header", 5, 1, undef, "blue" ],
[ 10, 20, 0, "2p54boxhdr", 4, 2],
[ 10, 30, 0, "2p54socket", 6, 1],
[ 25, 30, 0, "2p54socket", 4, 1, undef, undef, undef, "red" ],
[ 10, 40, 0, "chip", 10, 5, 1, grey20],
[ 10, 60, 180, "rj45"],
[ 8, 80, 180, "usb_A"],
[ 8, 100, 180, "usb_Ax2"],
[ 3, 120, 180, "usb_uA"],
[ 5, 50, 0, "led", LED3mm, "red"],
[ 12, 50, 0, "led", LED5mm, "orange"],
[ 25, 50, 0, "led", LED10mm, "yellow"],
[ 10, 65, 180, "rj45"],
[ 8, 85, 180, "usb_A"],
[ 8, 105, 180, "usb_Ax2"],
[ 3, 125, 180, "usb_uA"],
[ 8, 140, 180, "usb_B"],
[ 10, 160, 0, "buzzer"],
[ 25, 160, 0, "buzzer", 4.5, 8.5],
[ 10, 175, 0, "potentiometer"],
[ 30, 175, 0, "potentiometer", 7, 8],
[ 5, 160, 0, "buzzer", 4.5, 8.5],
[ 20, 160, 0, "buzzer"],
[ 8, 190, 180, "jack"],
[ 6, 200, 180, "barrel_jack"],
[ 5, 220, 180, "hdmi"],
[ 3, 240, 180, "mini_hdmi"],
[ 10, 250, 0, "flex"],
[ 10, 265, 0, "flat_flex"],
[ 10, 280, 0, "D_plug", DCONN9],
[ 10, 300, 0, "molex_hdr", 2],
[ 10, 310, 0, "jst_xh", 2],
[ 10, 320, 180, "term254", 3],
[ 20, 320, 180, "term254", 3, undef, grey20],
[ 10, 340, 180, "gterm35", 4, [1,2]],
[ 20, 340, 180, "gterm35", 4, [1,2], "red"],
[ 30, 340, 180, "gterm", gt_5x11, 3],
[ 10, 360, 180, "gterm635", 2],
[ 25, 360, 180, "gterm635", 2, undef, "blue"],
[ 40, 360, 180, "gterm", gt_5x17, 2, undef, grey20],
[ 40, 340, 180, "gterm", gt_5x17, 3, [1], "red"],
[ 10, 380, 180, "term35", 4],
[ 20, 380, 180, "term35", 3, "lime"],
[ 10, 400, 0, "transition", 5],
[ 10, 410, 0, "block", 10, 5, 8, "orange"],
[ 10, 420, 0, "button_6mm"],
[ 10, 435, 0, "microswitch", small_microswitch],
[ 12, 450, 0, "pcb", 11, TMC2130 ],
[ 12, 456, 0, "2p54socket", 8, 1 ],
[ 12, 444, 0, "2p54socket", 8, 1, undef, undef, undef, "red" ],
[ 10, 470, 0, "standoff", 5, 4.5, 12.5, 2.54],
[ 6, 480, 180, "uSD", [12, 11.5, 1.4]],
[ 20, -5, 180, "trimpot10"],
[ 20, -15, 0, "trimpot10", true],
[ 5, 218, 180, "hdmi"],
[ 3, 235, 180, "mini_hdmi"],
[ 6, 175, 180, "uSD", [12, 11.5, 1.4]],
[ 60, 3, 0, "flex"],
[ 50, 15, 0, "flat_flex"],
[ 60, 35, 0, "D_plug", DCONN9],
[ 50, 50, 0, "molex_hdr", 2],
[ 50, 60, 0, "jst_xh", 2],
[ 50, 70, 180, "term254", 3],
[ 63, 70, 180, "term254", 3, undef, grey20],
[ 75, 70, 180, "gterm508",2, undef, "blue"],
[ 50, 90, 180, "gterm35", 4, [1,2]],
[ 63, 90, 180, "gterm35", 4, [1,2], "red"],
[ 75, 90, 180, "gterm", gt_5x11, 3],
[ 90, 90, 180, "gterm", gt_5x17, 3, [1], "red"],
[ 55, 110, 180, "gterm635", 2],
[ 75, 110, 180, "gterm635", 2, undef, "blue"],
[ 90, 110, 180, "gterm", gt_5x17, 2, undef, grey20],
[ 50, 130, 180, "term35", 4],
[ 70, 130, 180, "term35", 3, "lime"],
[ 50, 150, 0, "transition", 5],
[ 50, 160, 0, "block", 10, 5, 8, "orange"],
[ 50, 170, 0, "button_6mm"],
[ 50, 185, 0, "microswitch", small_microswitch],
[ 52, 200, 0, "pcb", 11, TMC2130 ],
[ 52, 206, 0, "2p54socket", 8, 1 ],
[ 52, 194, 0, "2p54socket", 8, 1, undef, undef, undef, "red" ],
[ 50, 220, 0, "standoff", 5, 4.5, 12.5, 2.54],
[ 50, 240, 0, "potentiometer"],
[ 75, 240, 0, "potentiometer", 7, 8],
],
// accessories
[]

View File

@@ -22,14 +22,14 @@ use <../printed/cable_grommets.scad>
module cable_grommets() {
rotate(90)
color(pp1_colour) ribbon_grommet(20, 3);
stl_colour(pp1_colour) ribbon_grommet(20, 3);
translate([20, 0])
round_grommet_assembly(6, 3);
translate([40, 0])
rotate(90)
color(pp1_colour) mouse_grommet(5, 3);
stl_colour(pp1_colour) mouse_grommet(5, 3);
}
if($preview)

View File

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

View File

@@ -24,6 +24,6 @@ use <../utils/layout.scad>
module fan_guards()
layout([for(f = fans) fan_width(f)], 10)
color(pp1_colour) fan_guard(fans[$i], spokes = fan_width(fans[$i]) > 60 ? 8 : 4);
stl_colour(pp1_colour) fan_guard(fans[$i], spokes = fan_width(fans[$i]) > 60 ? 8 : 4);
fan_guards();

View File

@@ -27,7 +27,7 @@ module inserts() {
translate([10 * i, 0])
insert(inserts[i]);
color(pp1_colour)
stl_colour(pp1_colour)
translate([len(inserts) * 10, 0]) {
insert_lug(inserts[0], 2, 1);

View File

@@ -29,7 +29,7 @@ module light_strips()
for(end = [-1, 1])
translate([end * (light_strip_cut_length(light, segs) / 2 - d / 2), 0])
rotate([90, 0, 90])
color(pp1_colour) render()
stl_colour(pp1_colour) render()
translate_z(-d / 2)
light_strip_clip(light);
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 KiB

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 151 KiB

After

Width:  |  Height:  |  Size: 150 KiB

View File

@@ -34,7 +34,7 @@ module polyholes() {
children();
}
color(pp1_colour) linear_extrude(3, center = true)
stl_colour(pp1_colour) linear_extrude(3, center = true)
difference() {
square([100, 27]);
@@ -52,7 +52,7 @@ module polyholes() {
sizes = [1.5, 2, 3, 4];
for(i = [0 : len(sizes) - 1])
translate([i * 10, -10]) {
color(pp1_colour)
stl_colour(pp1_colour)
poly_tube(ir = ir, or = cir + sizes[i] * extrusion_width, h = 1);
rod(2 * ir, 3);

View File

@@ -93,7 +93,7 @@ module box1_base_stl()
module box1_assembly()
assembly("box1") {
color(pp1_colour) render() box1_case_stl();
stl_colour(pp1_colour) render() box1_case_stl();
pbox_inserts(box1);
@@ -142,7 +142,7 @@ module box2_base_stl()
module box2_assembly()
assembly("box2") {
color(pp1_colour) render() box2_case_stl();
stl_colour(pp1_colour) render() box2_case_stl();
pbox_inserts(box2);

View File

@@ -20,7 +20,7 @@
include <../utils/core/core.scad>
module teardrops() {
color(pp1_colour)
stl_colour(pp1_colour)
rotate([90, 0, -45])
difference() {
linear_extrude(3) {

View File

@@ -54,7 +54,7 @@ module wires() {
%cylinder(r = bundle_r, h = wire_l - 10, center = true);
}
color(pp1_colour) {
stl_colour(pp1_colour) {
rotate([90, 0, 90])
linear_extrude(thickness)
difference() {

View File

@@ -18,8 +18,8 @@
//
//
//! Bill Of Materials generation via echo and the ```bom.py``` script. Also handles exploded assembly views and posing. Assembly instructions can precede the module
//! definition that makes the assembly.
//! Bill Of Materials generation via echo and the ```bom.py``` script. Also handles exploded assembly views and posing.
//! Assembly instructions can precede the module definition that makes the assembly.
//!
//! Assembly views shown in the instructions can be large or small and this is deduced by looking at the size of the printed parts involved and if any routed
//! parts are used.
@@ -101,14 +101,26 @@ module assembly(name, big = undef) { //! Name an assembly that will appear on
echo(str("~}", name, "_assembly"));
}
module 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.
$stl_colour = colour;
color(colour, alpha)
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())
echo(str("~", name, ".stl"));
if(bom_mode()) {
colour = is_undef($stl_colour) ? pp1_colour : $stl_colour;
echo(str("~", name, ".stl(colour='", colour, "')"));
}
}
module dxf(name) { //! Name a dxf that will appear on the BOM, there needs to a module named ```<name>_dxf``` to make it
if(bom_mode())
echo(str("~", name, ".dxf"));
if(bom_mode()) {
if(is_undef($dxf_colour))
echo(str("~", name, ".dxf"));
else
echo(str("~", name, ".dxf(colour='", $dxf_colour, "')"));
}
}
function value_string(value) = is_string(value) ? str("\"", value, "\"") : str(value); //! Convert ```value``` to a string or quote it if it is already a string

View File

@@ -26,36 +26,51 @@
//! Also single bearing balls are modelled as just a silver sphere and a BOM entry.
//
include <../utils/core/core.scad>
include <../utils/tube.scad>
function bb_name(type) = type[0]; //! Part code without shield type suffix
function bb_bore(type) = type[1]; //! Internal diameter
function bb_diameter(type) = type[2]; //! External diameter
function bb_width(type) = type[3]; //! Width
function bb_colour(type) = type[4]; //! Shield colour, "silver" for metal
function bb_rim(type) = bb_diameter(type) / 10; //! Inner and outer rim thickness
function bb_rim(type) = type[5]; //! Outer rim thickness guesstimate
function bb_hub(type) = type[6]; //! Inner rim thickness guesstimate
module ball_bearing(type) { //! Draw a ball bearing
shield = bb_colour(type);
suffix = shield == "silver" ? "ZZ " : "-2RS ";
vitamin(str("ball_bearing(BB", bb_name(type), "): Ball bearing ", bb_name(type), suffix, bb_bore(type), "mm x ", bb_diameter(type), "mm x ", bb_width(type), "mm"));
rim = bb_rim(type);
hub = bb_hub(type);
h = bb_width(type);
od = bb_diameter(type);
id = bb_bore(type);
module tube(od, id, h)
linear_extrude(h, center = true, convexity = 5)
difference() {
circle(d = od);
circle(d = id);
}
or = bb_diameter(type) / 2;
ir = bb_bore(type) / 2;
color("silver") {
tube(od, od - rim, h);
tube(id + rim, id, h);
$fn = 360;
rim_chamfer = rim / 6;
rotate_extrude()
hull() {
translate([or - rim / 2, 0])
square([rim, h - 2 * rim_chamfer], center = true);
translate([or - rim / 2 - rim_chamfer, 0])
square([rim - rim_chamfer, h], center = true);
}
hub_chamfer = hub / 6;
rotate_extrude()
hull() {
translate([ir + hub / 2, 0])
square([hub, h - 2 * hub_chamfer], center = true);
translate([ir + hub / 2 + hub_chamfer, 0])
square([hub - hub_chamfer, h], center = true);
}
}
color(shield) tube(od - rim, id + rim, h - 1);
color(shield) tube(or - rim - eps, ir + hub + eps, h - 1);
if($children)
translate_z(bb_width(type) / 2)

View File

@@ -16,11 +16,11 @@
// You should have received a copy of the GNU General Public License along with NopSCADlib.
// If not, see <https://www.gnu.org/licenses/>.
//
BB624 = ["624", 4, 13, 5, "blue"]; // 624 ball bearing for idlers
BB608 = ["608", 8, 22, 7, "OrangeRed"]; // 608 bearings for wades
BB6200 = ["6200", 10, 30, 9, "black"]; // 6200 bearings for KP pillow blocks
BB6201 = ["6201", 12, 32, 10, "black"]; // 6201 bearings for KP pillow blocks
ball_bearings = [BB624, BB608, BB6200, BB6201];
BB624 = ["624", 4, 13, 5, "blue", 1.2, 1.2]; // 624 ball bearing for idlers
BB608 = ["608", 8, 22, 7, "OrangeRed", 1.4, 2.0]; // 608 bearings for wades
BB6200 = ["6200", 10, 30, 9, "black", 2.3, 3.6]; // 6200 bearings for KP pillow blocks
BB6201 = ["6201", 12, 32, 10, "black", 2.4, 3.7]; // 6201 bearings for KP pillow blocks
BB6808 = ["6808", 40, 52, 7, "black", 1.5, 1.6];
ball_bearings = [BB624, BB608, BB6200, BB6201, BB6808];
use <ball_bearing.scad>

View File

@@ -35,9 +35,10 @@ function gt_screw_r(type) = type[9]; //! Screw head radius
function gt_front_t(type) = type[10]; //! Thickness of frame around the front aperture
function gt_box_w(type) = type[11]; //! Width inside the cable entry box
function gt_box_h(type) = type[12]; //! Height of the cable entry box
function gt_y_offset(type) = type[13]; //! Offset of the pins from centre of the depth
function gt_y_offset2(type) = type[14]; //! Offset of the pins screws from the screws
function gt_tube_h(type) = type[15]; //! Height of optional tubes around the screws
function gt_box_setback(type) = type[13]; //! How far the contact box is set back from the front
function gt_y_offset(type) = type[14]; //! Offset of the pins from centre of the depth
function gt_y_offset2(type) = type[15]; //! Offset of the pins from the screws
function gt_tube_h(type) = type[16]; //! Height of optional tubes around the screws
module green_terminal(type, ways, skip = [], colour = "lime") { //! Draw green terminal blocks, skip can be used to remove pins.
pitch = gt_pitch(type);
@@ -60,7 +61,7 @@ module green_terminal(type, ways, skip = [], colour = "lime") { //! Draw green t
box_h2 = gt_box_h(type);
y = gt_y_offset(type);
y2 = gt_y_offset2(type);
box_front = y + depth / 2 - 2;
box_front = y + depth / 2 - gt_box_setback(type);
box_back = y - depth / 2 + 1;
module horizontal_section()
@@ -141,37 +142,37 @@ module green_terminal(type, ways, skip = [], colour = "lime") { //! Draw green t
}
if(!skip)
color("silver") {
slot_depth = 1;
screw_top = height - 0.5;
pin_l = 3.3;
translate([y2, 0]) {
translate_z(screw_top - 2 * slot_depth) // screw head
cylinder(r = screw_r, h = slot_depth);
slot_depth = 1;
screw_top = height - 0.5;
pin_l = 3.3;
translate([y2, 0]) {
translate_z(screw_top - 2 * slot_depth) // screw head
cylinder(r = screw_r, h = slot_depth);
translate_z(screw_top - slot_depth) // screw head
linear_extrude(slot_depth)
difference() {
circle(screw_r);
translate_z(screw_top - slot_depth) // screw head
linear_extrude(slot_depth)
difference() {
circle(screw_r);
square([10, screw_r / 4], center = true);
}
}
translate([box_back, 0, ledge_height / 2]) {
rotate([0, 90, 0])
linear_extrude(box_front - box_back)
difference() {
square([box_h2, box_w2], center = true);
square([box_h2 - 0.1, box_w2 - 0.1], center = true);
}
cube([1, box_w2, box_h2], center = true); // terminal back
}
translate_z(-pin_l)
cube([0.44, 0.75, pin_l]); // pin
square([10, screw_r / 4], center = true);
}
}
translate([box_back, 0, ledge_height / 2]) {
rotate([0, 90, 0])
linear_extrude(box_front - box_back)
difference() {
square([box_h2, box_w2], center = true);
square([box_h2 - 0.1, box_w2 - 0.1], center = true);
}
cube([1, box_w2, box_h2], center = true); // terminal back
}
translate_z(-pin_l / 2)
cube([0.44, 0.75, pin_l], center = true); // pin
}
}
for(i = [0: ways - 1])
translate([0, i * pitch - width / 2 + pitch / 2])

View File

@@ -19,17 +19,19 @@
// Green terminal blocks
//
// f b y y
// h h f h b s f o o
// p d e e d e d c r f f t
// i e i i e i e r o b b f f u
// t p g t g p g p e n o o s s b
// c t h o h t h t w t x x e t e
// h h t p t h t h r t w h t 2 h
gt_2p54 = ["gt_2p54", 2.54, 6.6, 10, 3, 6, 0.4, 6.4, 1, 1, 0.2, 2, 2, 0, 0, 0];
gt_3p5 = ["gt_3p5", 3.5, 7.3, 8.5, 4, 5, 0.4, 4, 0, 1.35, 0.4, 1.8, 2, 0, 0, 0];
gt_6p35 = ["gt_6p35", 6.35, 12.6, 17.4, 6.8, 12, 0.4, 11, 2, 2.7, 0.8, 3.4, 4.2, 1.8, 1.1, 21.4];
// f b b y y
// h h f h b s f o o o
// p d e e d e d c r x f f t
// i e i i e i e r o b b f f u
// t p g t g p g p e n o o s s s b
// c t h o h t h t w t x x b e t e
// h h t p t h t h r t w h t 2 h
//
gt_2p54 = ["gt_2p54", 2.54, 6.6, 10, 3, 6, 0.4, 6.4, 1, 1, 0.2, 2, 2, 2, 0, 0, 0];
gt_3p5 = ["gt_3p5", 3.5, 7.3, 8.5, 4, 5, 0.4, 4, 0, 1.35, 0.4, 1.8, 2, 2, 0, 0, 0];
gt_5p08 = ["gt_5p08", 5.08, 7.9, 10, 5.0, 7, 0.0, 6.8, 1.45, 1.95, 0.5, 4.0, 5.4, 0.5, 0, 0, 0];
gt_6p35 = ["gt_6p35", 6.35, 12.6, 17.4, 6.8, 12, 0.4, 11, 2, 2.7, 0.8, 3.4, 4.2, 2, 1.8, 1.1, 21.4];
green_terminals = [gt_2p54, gt_3p5, gt_6p35];
green_terminals = [gt_2p54, gt_3p5, gt_5p08, gt_6p35];
use <green_terminal.scad>

View File

@@ -49,7 +49,7 @@ module led(type, colour = "red", lead = 5) { //! Draw specified LED with desired
}
}
color("silver")
for(side = [-1, 1], len = lead - side)
for(side = [-1, 1], len = lead - (lead < 3 ? 0 : side))
translate([side * led_pitch(type) / 2, 0, -len / 2])
vflip()
cube([led_lead_t(type), led_lead_t(type), len], center = true);

View File

@@ -33,6 +33,7 @@ use <../utils/dogbones.scad>
use <../utils/thread.scad>
use <../utils/tube.scad>
use <d_connector.scad>
use <led.scad>
function pcb_name(type) = type[1]; //! Description
function pcb_length(type) = type[2]; //! Length
@@ -808,6 +809,7 @@ module pcb_component(comp, cutouts = false, angle = undef) { //! Draw pcb compon
if(show(comp, "term254")) if(!cutouts) green_terminal(gt_2p54,comp[4], comp[5], param(6,"lime"));
if(show(comp, "gterm")) if(!cutouts) green_terminal(comp[4], comp[5], comp[6], param(7,"lime"));
if(show(comp, "gterm35")) if(!cutouts) green_terminal(gt_3p5, comp[4], comp[5], param(6,"lime"));
if(show(comp, "gterm508")) if(!cutouts) green_terminal(gt_5p08, comp[4], comp[5], param(6,"lime"));
if(show(comp, "gterm635")) if(!cutouts) green_terminal(gt_6p35, comp[4], comp[5], param(6,"lime"));
if(show(comp, "term35")) if(!cutouts) terminal_35(comp[4], param(5,"blue"));
if(show(comp, "transition")) if(!cutouts) idc_transition(2p54header, comp[4], comp[5]);
@@ -820,6 +822,7 @@ module pcb_component(comp, cutouts = false, angle = undef) { //! Draw pcb compon
if(show(comp, "standoff")) if(!cutouts) standoff(comp[4], comp[5], comp[6], comp[7]);
if(show(comp, "uSD")) uSD(comp[4], cutouts);
if(show(comp, "trimpot10")) trimpot10(param(4, false), cutouts);
if(show(comp, "led")) led(comp[4], comp[5], 2.6);
}
}
@@ -988,7 +991,7 @@ module pcb_assembly(type, height, thickness) { //! Draw PCB assembly with spaces
translate_z(height + pcb_thickness(type))
screw(screw, screw_length);
color(pp1_colour)
stl_colour(pp1_colour)
if(taper)
pcb_spacer(screw, height, taper = 2);
else

View File

@@ -18,6 +18,8 @@
//
include <microswitches.scad>
include <d_connectors.scad>
include <leds.scad>
//
// l w t r h l c b h
// e i h a o a o o o
@@ -177,7 +179,7 @@ Duex2 = ["Duex2", "Duex2 expansion board",
],
[]];
Duex5 = ["Duex5", "Duex5 expasnion board",
Duex5 = ["Duex5", "Duex5 expansion board",
123, 100, 1.6, 0, 4.2, 0, "#2140BE", false, [[-4, 4], [-4, -4], [4, -4],[4, 4]],
concat(Duex2[11], [
[ 61.5, -81.2, 0, "chip", 10, 10, 2],
@@ -324,7 +326,15 @@ PI_IO = ["PI_IO", "PI_IO V2", 35.56, 25.4, 1.6, 0, 0, 0, "green", tru
], []];
ZC_A0591 = ["ZC_A0591", "ZC-A0591 ULN2003 driver PCB", 35, 32, 1.6, 0, 2.5, 0, "green", false, [[2.25, 3.25], [-2.25, 3.25], [2.25, -3.25], [-2.25, -3.25] ],
[], [], [], [], M2p5_pan_screw];
[ [ 12.25, 8.3, -90, "jst_xh", 5],
[ -6.5, 10, 0, "2p54header", 1, 4],
[-14, -4.5, 0, "2p54header", 4, 1],
[ 5.5, 6, 0, "led", LED3mm, [1,1,1, 0.5]],
[ 5.5, 10.5, 0, "led", LED3mm, [1,1,1, 0.5]],
[ 5.5, 15, 0, "led", LED3mm, [1,1,1, 0.5]],
[ 5.5, 19.5, 0, "led", LED3mm, [1,1,1, 0.5]],
], [], [], [], M2p5_pan_screw];
MT3608 = ["MT3608", "MT3608 boost converter module", 37, 17, 1.2, 2, 1.5, [5, 3], "#2140BE", false, [[3.0725, 5.095], [3.0725, -5.095], [-3.0725, 5.095], [-3.0725, -5.095]],
@@ -337,6 +347,16 @@ TP4056 = ["TP4056", "TP4056 Li-lon Battery charger module", 26.2, 17.5, 1.0, 0,
]];
WD2002SJ = ["WD2002SJ", "WD2002SJ Buck Boost DC-DC converter", 78, 47, 1.6, 0, 3.2, 0, "#2140BE", false, [[4,4], [-4,4], [-4,-4], [4,-4]],
[ [ 39, -20.5, 0, "-chip", 63, 41, 4, "silver"],
[ -4, 12, 0, "gterm508", 2, [], "blue"],
[ 4, 12, 180, "gterm508", 2, [], "blue"],
[ -25.5, 3.1, 0, "trimpot10", true],
[ 30.5, 3.1, 0, "trimpot10", true],
[ 41.5, 3.1, 0, "trimpot10", true],
],
[]];
PERF80x20 = ["PERF80x20", "Perfboard 80 x 20mm", 80, 20, 1.6, 0, 2.3, 0, "green", true, [[2,2],[-2,2],[2,-2],[-2,-2]], [], [], [5.87, 3.49]];
PERF70x50 = ["PERF70x50", "Perfboard 70 x 50mm", 70, 50, 1.6, 0, 2.3, 0, "green", true, [[2,2],[-2,2],[2,-2],[-2,-2]], [], [], [5.87, 3.49]];
@@ -362,7 +382,7 @@ RAMPSEndstop = ["RAMPSEndstop", "RAMPS Endstop Switch",
[]];
pcbs = [TP4056, MT3608, RAMPSEndstop, ExtruderPCB, PI_IO, ZC_A0591, RPI0, EnviroPlus, ArduinoUno3, ArduinoLeonardo, Keyes5p1, PSU12V1A, RPI3, DuetE, Duex2, Duex5, Melzi];
pcbs = [TP4056, MT3608, RAMPSEndstop, ExtruderPCB, PI_IO, ZC_A0591, RPI0, EnviroPlus, ArduinoUno3, ArduinoLeonardo, Keyes5p1, PSU12V1A, WD2002SJ, RPI3, DuetE, Duex2, Duex5, Melzi];
perfboards = [PERF74x51, PERF70x50, PERF60x40, PERF70x30, PERF80x20];

View File

@@ -23,6 +23,7 @@
include <../utils/core/core.scad>
use <washer.scad>
use <nut.scad>
use <../utils/rounded_cylinder.scad>
use <../utils/thread.scad>
include <inserts.scad>

View File

@@ -83,6 +83,7 @@ module render_sheet(type, colour = false) //! Render a sheet in the correct colo
render() children();
module render_2D_sheet(type, colour = false) //! Extrude a 2D sheet template and give it the correct colour
color(colour ? colour : sheet_colour(type))
linear_extrude(sheet_thickness(type), center = true)
children();
let($dxf_colour = colour ? colour : sheet_colour(type))
color($dxf_colour)
linear_extrude(sheet_thickness(type), center = true)
children();

View File

@@ -162,7 +162,7 @@ assembly(vero_assembly(type)) {
else
screw_and_washer(screw, screw_length);
color(pp1_colour) pcb_spacer(screw, height);
stl_colour(pp1_colour) pcb_spacer(screw, height);
translate_z(-thickness)
vflip()

View File

@@ -122,7 +122,7 @@ module printed_washer(type, name = false) { //! Create printed washer
t = round_to_layer(washer_thickness(type));
or = washer_radius(type);
ir = washer_id(type) / 2;
color(pp1_colour)
stl_colour(pp1_colour)
linear_extrude(t, center = false, convexity = 2)
poly_ring(or, ir);