1
0
mirror of https://github.com/nophead/NopSCADlib.git synced 2025-08-05 23:17:26 +02:00

Merge branch 'martinbudden-spelling_corrections'

This commit is contained in:
Chris Palmer
2021-06-17 15:58:32 +01:00
29 changed files with 39 additions and 39 deletions

View File

@@ -54,7 +54,7 @@ function bbox(screw, sheets, base_sheet, top_sheet, span, size, name = "bbox", s
[ screw, sheets, base_sheet, top_sheet, span, size.x, size.y, size.z, name, skip_blocks, star_washers ]; [ screw, sheets, base_sheet, top_sheet, span, size.x, size.y, size.z, name, skip_blocks, star_washers ];
function bbox_volume(type) = bbox_width(type) * bbox_depth(type) * bbox_height(type) / 1000000; //! Internal volume in litres function bbox_volume(type) = bbox_width(type) * bbox_depth(type) * bbox_height(type) / 1000000; //! Internal volume in litres
function bbox_area(type) = let(w = bbox_width(type), d = bbox_depth(type), h = bbox_height(type)) //! Internal surdface area in m^2 function bbox_area(type) = let(w = bbox_width(type), d = bbox_depth(type), h = bbox_height(type)) //! Internal surface area in m^2
2 * (w * d + w * h + d * h) / 1000000; 2 * (w * d + w * h + d * h) / 1000000;
module bbox_shelf_blank(type) { //! 2D template for a shelf module bbox_shelf_blank(type) { //! 2D template for a shelf

View File

@@ -45,7 +45,7 @@ function door_hinge_stat_screw() = stat_screw; //! Screw use to fas
function door_hinge_stat_width() = stat_width; //! Width of the stationary part function door_hinge_stat_width() = stat_width; //! Width of the stationary part
function door_hinge_stat_length() = stat_length; //! Length of the stationary part function door_hinge_stat_length() = stat_length; //! Length of the stationary part
module door_hinge_hole_positions(dir = 0) { //! Position chidren at the door hole positions module door_hinge_hole_positions(dir = 0) { //! Position children at the door hole positions
hole_pitch = width - 10; hole_pitch = width - 10;
for(side = [-1, 1]) for(side = [-1, 1])

View File

@@ -57,7 +57,7 @@ module door_latch_stl() { //! Generates the STL for the printed part
} }
} }
module door_latch_assembly(sheet_thickness = 3) { //! The assembly for a specified sheet thickess module door_latch_assembly(sheet_thickness = 3) { //! The assembly for a specified sheet thickness
washer = screw_washer(screw); washer = screw_washer(screw);
nut = screw_nut(screw); nut = screw_nut(screw);

View File

@@ -20,7 +20,7 @@
// //
//! Parametric cable drag chain to limit the bend radius of a cable run. //! Parametric cable drag chain to limit the bend radius of a cable run.
//! //!
//! Each link has a maximum bend angle of 45°, so the mininium radius is proportional to the link length. //! Each link has a maximum bend angle of 45°, so the minimum radius is proportional to the link length.
//! //!
//! The travel property is how far it can move in each direction, i.e. half the maximum travel if the chain is mounted in the middle of the travel. //! The travel property is how far it can move in each direction, i.e. half the maximum travel if the chain is mounted in the middle of the travel.
//! //!

View File

@@ -17,7 +17,7 @@
// If not, see <https://www.gnu.org/licenses/>. // If not, see <https://www.gnu.org/licenses/>.
// //
//! Pintable fan finger guard to match the specified fan. To be `include`d, not `use`d. //! Printable fan finger guard to match the specified fan. To be `include`d, not `use`d.
//! //!
//! The ring spacing as well as the number of spokes can be specified, if zero a gasket is generated instead of a guard. //! The ring spacing as well as the number of spokes can be specified, if zero a gasket is generated instead of a guard.
// //

View File

@@ -40,7 +40,7 @@ function hinge_knuckles(type) = type[6]; //! How many knuckles
function hinge_screw(type) = type[7]; //! Screw type to mount it function hinge_screw(type) = type[7]; //! Screw type to mount it
function hinge_screws(type) = type[8]; //! How many screws function hinge_screws(type) = type[8]; //! How many screws
function hinge_clearance(type) = type[9]; //! Clearance between knuckles function hinge_clearance(type) = type[9]; //! Clearance between knuckles
function hinge_margin(type) = type[10]; //! How far to keep the screws from the knuckes function hinge_margin(type) = type[10]; //! How far to keep the screws from the knuckles
function flat_hinge(name, size, pin_d, knuckle_d, knuckles, screw, screws, clearance, margin) = //! Construct the property list for a flat hinge. function flat_hinge(name, size, pin_d, knuckle_d, knuckles, screw, screws, clearance, margin) = //! Construct the property list for a flat hinge.
[name, size.x, size.y, size.z, pin_d, knuckle_d, knuckles, screw, screws, clearance, margin]; [name, size.x, size.y, size.z, pin_d, knuckle_d, knuckles, screw, screws, clearance, margin];
@@ -73,7 +73,7 @@ module hinge_male(type, female = false) { //! The half with the stationary
assert(kr > pr, "knuckle diameter must be bigger than the pin diameter"); assert(kr > pr, "knuckle diameter must be bigger than the pin diameter");
n = hinge_knuckles(type); n = hinge_knuckles(type);
assert(n >= 3, "must be at least three knuckes"); assert(n >= 3, "must be at least three knuckles");
mn = ceil(n / 2); // Male knuckles mn = ceil(n / 2); // Male knuckles
fn = floor(n / 2); // Female knuckles fn = floor(n / 2); // Female knuckles
gap = hinge_clearance(type); gap = hinge_clearance(type);

View File

@@ -17,7 +17,7 @@
# If not, see <https://www.gnu.org/licenses/>. # If not, see <https://www.gnu.org/licenses/>.
# #
# Set command line options from enviroment variables and check if they have changed # Set command line options from environment variables and check if they have changed
import json, os, deps import json, os, deps
from colorama import Fore, init from colorama import Fore, init

View File

@@ -82,7 +82,7 @@ def bom_to_assemblies(bom_dir, bounds_map):
return [assembly["name"] for assembly in flat_bom] return [assembly["name"] for assembly in flat_bom]
def eop(doc_file, last = False, first = False): def eop(doc_file, last = False, first = False):
print('<span></span>', file = doc_file) # An invisable marker for page breaks because markdown takes much longer if the document contains a div print('<span></span>', file = doc_file) # An invisible marker for page breaks because markdown takes much longer if the document contains a div
if not first: if not first:
print('[Top](#TOP)', file = doc_file) print('[Top](#TOP)', file = doc_file)
if not last: if not last:

View File

@@ -26,7 +26,7 @@
// //
module teardrop(h, r, center = true, truncate = true, chamfer = 0, chamfer_both_ends = true, plus = false) { //! For making horizontal holes that don't need support material, set `truncate = false` to make traditional RepRap teardrops that don't even need bridging module teardrop(h, r, center = true, truncate = true, chamfer = 0, chamfer_both_ends = true, plus = false) { //! For making horizontal holes that don't need support material, set `truncate = false` to make traditional RepRap teardrops that don't even need bridging
module teardrop_2d(r, truncate) { module teardrop_2d(r, truncate) {
er = layer_height / 2 - eps; // Extrustion edge radius er = layer_height / 2 - eps; // Extrusion edge radius
R = plus ? r + er : r; // Corrected radius R = plus ? r + er : r; // Corrected radius
offset = plus ? -er : 0; // Offset inwards offset = plus ? -er : 0; // Offset inwards
hull() hull()

View File

@@ -135,4 +135,4 @@ function involute_worm_profile(m, pa = 20, clearance = undef) = //! Calculate wo
let(tooth = involute_rack_tooth_profile(m), let(tooth = involute_rack_tooth_profile(m),
pitch = PI * m, pitch = PI * m,
y_min = min([for(p = tooth) p.y]) y_min = min([for(p = tooth) p.y])
) [for(p = tooth) [p.x - pitch / 2, p.y - y_min, 0]]; // Offset to be positive in y, centred in x and add 0 z ordintate ) [for(p = tooth) [p.x - pitch / 2, p.y - y_min, 0]]; // Offset to be positive in y, centred in x and add 0 z coordinate

View File

@@ -18,7 +18,7 @@
// //
// //
//! Utility to generate a polhedron by sweeping a 2D profile along a 3D path and utilities for generating paths. //! Utility to generate a polyhedron by sweeping a 2D profile along a 3D path and utilities for generating paths.
//! //!
//! The initial orientation is the Y axis of the profile points towards the initial center of curvature, Frenet-Serret style. //! The initial orientation is the Y axis of the profile points towards the initial center of curvature, Frenet-Serret style.
//! Subsequent rotations use the minimum rotation method. //! Subsequent rotations use the minimum rotation method.

View File

@@ -69,7 +69,7 @@ module woven_tube(or, ir, h, center= true, colour = grey(30), colour2, warp = 2,
} }
} }
module rectangular_tube(size, center = true, thickness = 1, fillet = 0.5) { //! Create a retangular tube with filleted corners module rectangular_tube(size, center = true, thickness = 1, fillet = 0.5) { //! Create a rectangular tube with filleted corners
extrude_if(size.z, center = center) extrude_if(size.z, center = center)
difference() { difference() {
rounded_square([size.x, size.y], fillet); rounded_square([size.x, size.y], fillet);

View File

@@ -19,21 +19,21 @@
// //
//! Models timing belt running in a path over toothed or smooth pulleys and calculates an accurate length. //! Models timing belt running in a path over toothed or smooth pulleys and calculates an accurate length.
//! Only models 2D paths, belt may twist to support crossed belt core XY and other designes where the belt twists! //! Only models 2D paths, belt may twist to support crossed belt core XY and other designs where the belt twists!
//! //!
//! By default the path is a closed loop. An open loop can be specified by specifying `open=true`, and in that case the start and end points are not connected, leaving the loop open. //! By default the path is a closed loop. An open loop can be specified by specifying `open=true`, and in that case the start and end points are not connected, leaving the loop open.
//! //!
//! To get a 180 degree twist of the loop, you can use the `twist` argument. `Twist` can be a single number, and in that case the belt will twist after //! To get a 180 degree twist of the loop, you can use the `twist` argument. `Twist` can be a single number, and in that case the belt will twist after
//! the position with that number. Alternatively `twist` can be a list of boolean values with a boolean for each position; the belt will then twist after //! the position with that number. Alternatively `twist` can be a list of boolean values with a boolean for each position; the belt will then twist after
//! the position that have a `true` value in the `twist` list. If the path is specified with pulley/idler types, then you can use `auto_twist=true`; in //! the position that have a `true` value in the `twist` list. If the path is specified with pulley/idler types, then you can use `auto_twist=true`; in
//! that case the belt will automatically twist so the back of the belt always runs against idlers and the tooth side runs against pullies. If you use //! that case the belt will automatically twist so the back of the belt always runs against idlers and the tooth side runs against pulleys. If you use
//! `open=true` then you might also use `start_twist=true` to let the belt start the part with the back side out. //! `open=true` then you might also use `start_twist=true` to let the belt start the part with the back side out.
//! //!
//! The path must be specified as a list of positions. Each position should be either a vector with `[x, y, pulley]` or `[x, y, r]`. A pully is a type from //! The path must be specified as a list of positions. Each position should be either a vector with `[x, y, pulley]` or `[x, y, r]`. A pulley is a type from
//! `pulleys.scad`, and correct radius and angle will automatically be calculated. Alternatively a radius can be specified directly. //! `pulleys.scad`, and correct radius and angle will automatically be calculated. Alternatively a radius can be specified directly.
//! //!
//! To make the back of the belt run against a smooth pulley on the outside of the loop specify a negative pitch radius. //! To make the back of the belt run against a smooth pulley on the outside of the loop specify a negative pitch radius.
//! Alternativley you can just specify smooth pulleys in the path, and it will then happen automatically. //! Alternatively you can just specify smooth pulleys in the path, and it will then happen automatically.
//! //!
//! Individual teeth are not drawn, instead they are represented by a lighter colour. //! Individual teeth are not drawn, instead they are represented by a lighter colour.
// //
@@ -60,7 +60,7 @@ module belt(type, points, belt_colour = grey(20), tooth_colour = grey(50), open
info = _belt_points_info(type, points, open, twist, auto_twist, start_twist); info = _belt_points_info(type, points, open, twist, auto_twist, start_twist);
dotwist = info[0]; // array of booleans, true if a twist happen after the position dotwist = info[0]; // array of booleans, true if a twist happen after the position
twisted = info[1]; // array of booleans, true if the belt is twisted at the position twisted = info[1]; // array of booleans, true if the belt is twisted at the position
pointsx = info[2]; // array of [x,y,r], r is negative if left-angle (points may have pulleys as third element, but pointsx have radi) pointsx = info[2]; // array of [x,y,r], r is negative if left-angle (points may have pulleys as third element, but pointsx have radii)
tangents = info[3]; tangents = info[3];
arcs = info[4]; arcs = info[4];
length = ceil(_belt_length(info, open) / pitch) * pitch; length = ceil(_belt_length(info, open) / pitch) * pitch;

View File

@@ -20,7 +20,7 @@
// //
//! A strip of polypropylene used with ribbon cable to make a cable flexible in one direction only. //! A strip of polypropylene used with ribbon cable to make a cable flexible in one direction only.
//! //!
//! Modelled with a Bezier spline, which is not quite the same as a minimum energy curve but very close, epecially //! Modelled with a Bezier spline, which is not quite the same as a minimum energy curve but very close, especially
//! near the extreme positions, where the model needs to be accurate. //! near the extreme positions, where the model needs to be accurate.
//! //!
//! When the sides are constrained then a circular model is more accurate. //! When the sides are constrained then a circular model is more accurate.

View File

@@ -25,7 +25,7 @@ use <pcb.scad>
function camera_pcb(type) = type[2]; //! The PCB part of the camera function camera_pcb(type) = type[2]; //! The PCB part of the camera
function camera_lens_offset(type) = type[3]; //! Offset of the lens center from the PCB centre function camera_lens_offset(type) = type[3]; //! Offset of the lens center from the PCB centre
function camera_lens(type) = type[4]; //! Stack of lens parts, can be round, rectanular or rounded rectangular, with optional tapered aperture function camera_lens(type) = type[4]; //! Stack of lens parts, can be round, rectangular or rounded rectangular, with optional tapered aperture
function camera_connector_pos(type) = type[5]; //! The flex connector block for the camera itself's position function camera_connector_pos(type) = type[5]; //! The flex connector block for the camera itself's position
function camera_connector_size(type)= type[6]; //! The flex connector block for the camera itself's size function camera_connector_size(type)= type[6]; //! The flex connector block for the camera itself's size

View File

@@ -18,7 +18,7 @@
// //
// //
//! LCD dispays. //! LCD displays.
// //
include <../utils/core/core.scad> include <../utils/core/core.scad>

View File

@@ -53,7 +53,7 @@ LCDS7282BPCB = ["", "", 85, 36, 1.65, 0, 2.56, 0, "green", false, [[-2.5, -2.5],
[]]; []];
LCDS7282B = ["LCDS7282B", "LCD display S-7282B", 73.6, 28.7, 9.6, LCDS7282BPCB, LCDS7282B = ["LCDS7282B", "LCD display S-7282B", 73.6, 28.7, 9.6, LCDS7282BPCB,
[-2.5, 0, 0], // pcb offst [-2.5, 0, 0], // pcb offset
[[-64.5 / 2, -14.5 / 2], [64.5 / 2, 14.5 / 2, 0.6]], // aperture [[-64.5 / 2, -14.5 / 2], [64.5 / 2, 14.5 / 2, 0.6]], // aperture
[], // touch screen [], // touch screen
0, // thread length 0, // thread length

View File

@@ -21,7 +21,7 @@
//! LED strip lights that can be cut to size. //! LED strip lights that can be cut to size.
//! //!
//! The definitions are for the full length but they can be cut to size by specifying how many segments, //! The definitions are for the full length but they can be cut to size by specifying how many segments,
//! which can by calcuated using `light_strip_segments(type, max_length)`. //! which can by calculated using `light_strip_segments(type, max_length)`.
//! //!
//! The `light_strip_clip()` module makes a clip to go around the light that can be incorporated into a printed bracket to hold it. //! The `light_strip_clip()` module makes a clip to go around the light that can be incorporated into a printed bracket to hold it.
// //

View File

@@ -18,9 +18,9 @@
// //
// //
//! Nicodrone OpenGrab V3 electro-permananet magnet, see <https://nicadrone.com/products/epm-v3>. //! Nicodrone OpenGrab V3 electro-permanent magnet, see <https://nicadrone.com/products/epm-v3>.
//! //!
//! A permanent magnet that can be magnatized and de-magnatized electronically. //! A permanent magnet that can be magnetized and de-magnetized electronically.
// //
include <../utils/core/core.scad> include <../utils/core/core.scad>
use <../utils/thread.scad> use <../utils/thread.scad>

View File

@@ -23,7 +23,7 @@
//! Notes on the DSN_VC288: //! Notes on the DSN_VC288:
//! //!
//! * The tabs aren't modelled because they can be fully retracted if the PCB is removed. //! * The tabs aren't modelled because they can be fully retracted if the PCB is removed.
//! * The current connector isn't moddelled as it is awkwardly tall. I remove it and solder wires instead. //! * The current connector isn't modelled as it is awkwardly tall. I remove it and solder wires instead.
// //
include <../utils/core/core.scad> include <../utils/core/core.scad>

View File

@@ -45,7 +45,7 @@ function pcb_thickness(type) = type[4]; //! Thickness
function pcb_radius(type) = type[5]; //! Corner radius function pcb_radius(type) = type[5]; //! Corner radius
function pcb_hole_d(type) = type[6]; //! Mounting hole diameter function pcb_hole_d(type) = type[6]; //! Mounting hole diameter
function pcb_land_d(type) = type[7]; //! Pad around mounting hole function pcb_land_d(type) = type[7]; //! Pad around mounting hole
function pcb_colour(type) = type[8]; //! Colour of the subtrate function pcb_colour(type) = type[8]; //! Colour of the substrate
function pcb_parts_on_bom(type) = type[9]; //! True if the parts should be separate BOM items function pcb_parts_on_bom(type) = type[9]; //! True if the parts should be separate BOM items
function pcb_holes(type) = type[10]; //! List of hole positions function pcb_holes(type) = type[10]; //! List of hole positions
function pcb_components(type) = type[11]; //! List of components function pcb_components(type) = type[11]; //! List of components
@@ -72,7 +72,7 @@ function pcb_coord(type, p) = let(l = pcb_length(type), w = pcb_width(type)) //!
[(p.x >= 0 ? p.x : l + p.x) - l / 2, [(p.x >= 0 ? p.x : l + p.x) - l / 2,
(p.y >= 0 ? p.y : w + p.y) - w / 2]; (p.y >= 0 ? p.y : w + p.y) - w / 2];
module pcb_hole_positions(type, all = true) { // Positition children at the hole positions, including holes not used for screws module pcb_hole_positions(type, all = true) { // Position children at the hole positions, including holes not used for screws
holes = pcb_holes(type); holes = pcb_holes(type);
for($i = [0 : 1 : len(holes) - 1]) { for($i = [0 : 1 : len(holes) - 1]) {

View File

@@ -246,7 +246,7 @@ module psu(type) { //! Draw a power supply
} }
} }
} }
// Special case for lighting type PSUs with teminals at the end // Special case for lighting type PSUs with terminals at the end
terminals = psu_terminals(type); terminals = psu_terminals(type);
if(terminals) { if(terminals) {
ft = psu_face_thickness(faces[f_front]); ft = psu_face_thickness(faces[f_front]);

View File

@@ -114,7 +114,7 @@ S_300_12 = [
[// f_top, top [// f_top, top
[],// holes [],// holes
0.5,// thickness 0.5,// thickness
[],// coutouts [],// cutouts
false,// grill false,// grill
[215/2 - 47.5, 115/2 - 37.5, fan50x15], [215/2 - 47.5, 115/2 - 37.5, fan50x15],
[],//iec [],//iec

View File

@@ -36,7 +36,7 @@ function pulley_hub_length(type) = type[7]; //! Hub length
function pulley_bore(type) = type[8]; //! Bore diameter for shaft function pulley_bore(type) = type[8]; //! Bore diameter for shaft
function pulley_flange_dia(type) = type[9]; //! Flange diameter function pulley_flange_dia(type) = type[9]; //! Flange diameter
function pulley_flange_thickness(type) = type[10]; //! Flange thickness function pulley_flange_thickness(type) = type[10]; //! Flange thickness
function pulley_screw_length(type) = type[11]; //! Grup screw length function pulley_screw_length(type) = type[11]; //! Grub screw length
function pulley_screw_z(type) = type[12]; //! Grub screw position function pulley_screw_z(type) = type[12]; //! Grub screw position
function pulley_screw(type) = type[13]; //! Grub screw type function pulley_screw(type) = type[13]; //! Grub screw type
function pulley_screws(type) = type[14]; //! Number of grub screws function pulley_screws(type) = type[14]; //! Number of grub screws

View File

@@ -36,7 +36,7 @@ function ringterm_screw(type) = type[7]; //! Screw type
function ringterm_crimp_length(type) = type[8]; //! If non-zero the length of the crimp tube function ringterm_crimp_length(type) = type[8]; //! If non-zero the length of the crimp tube
function ringterm_extent(type) = ringterm_length(type) / sqrt(2); //! Space to leave function ringterm_extent(type) = ringterm_length(type) / sqrt(2); //! Space to leave
module ring_terminal(type) { //! Draw specifeid ring terminal module ring_terminal(type) { //! Draw specified ring terminal
screw = ringterm_screw(type); screw = ringterm_screw(type);
d = 2 * screw_radius(screw); d = 2 * screw_radius(screw);
crimp = ringterm_crimp_length(type); crimp = ringterm_crimp_length(type);

View File

@@ -20,7 +20,7 @@
// //
//! Steel rods and studding with chamfered ends. //! Steel rods and studding with chamfered ends.
//! //!
//! These items are sysmtrical, so by default the origin is in the centre but it can be changed to the bottom. //! These items are symmetrical, so by default the origin is in the centre but it can be changed to the bottom.
// //
include <../utils/core/core.scad> include <../utils/core/core.scad>
use <../utils/thread.scad> use <../utils/thread.scad>

View File

@@ -20,7 +20,7 @@
// //
//! Sheet materials. Rectangular with optional rounded corners. Negative radii make a chamfer. //! Sheet materials. Rectangular with optional rounded corners. Negative radii make a chamfer.
//! //!
//! The "Soft" parameter can be used to determinesif the sheet material needs machine screws or wood screws, e.g.: //! The "Soft" parameter can be used to determine if the sheet material needs machine screws or wood screws, e.g.:
//! //!
//! * If soft, wood screws will be used, with a pilot hole. //! * If soft, wood screws will be used, with a pilot hole.
//! * If not soft, either tapped holes or a clearance hole and nuts will be used to retain screws. //! * If not soft, either tapped holes or a clearance hole and nuts will be used to retain screws.
@@ -40,8 +40,8 @@ function sheet_thickness(type) = type[2]; //! Thickness
function sheet_colour(type) = type[3]; //! Colour function sheet_colour(type) = type[3]; //! Colour
function sheet_is_soft(type) = type[4]; //! Is soft enough for wood screws function sheet_is_soft(type) = type[4]; //! Is soft enough for wood screws
function sheet_is_woven(type) = !is_undef(type[5]); //! Is a woven sheet, eg carbon fiber function sheet_is_woven(type) = !is_undef(type[5]); //! Is a woven sheet, eg carbon fiber
function sheet_warp(type) = type[5]; //! Wovern sheet warp function sheet_warp(type) = type[5]; //! Woven sheet warp
function sheet_weft(type) = type[6]; //! Wovern sheet weft function sheet_weft(type) = type[6]; //! Woven sheet weft
function sheet_colour2(type) = type[7]; //! Second colour for a woven sheet function sheet_colour2(type) = type[7]; //! Second colour for a woven sheet
module corner(r) { module corner(r) {

View File

@@ -29,7 +29,7 @@ soft_washer_colour = grey(20);
hard_washer_colour = grey(80); hard_washer_colour = grey(80);
star_washer_colour = brass; star_washer_colour = brass;
function washer_size(type) = type[1]; //! Noiminal size function washer_size(type) = type[1]; //! Nominal size
function washer_diameter(type) = type[2]; //! External diameter function washer_diameter(type) = type[2]; //! External diameter
function washer_thickness(type) = type[3]; //! Thickness function washer_thickness(type) = type[3]; //! Thickness
function washer_soft(type) = type[4]; //! True if rubber function washer_soft(type) = type[4]; //! True if rubber

View File

@@ -35,7 +35,7 @@ module ziptie(type, r = 5, t = 0) //! Draw specified ziptie wrapped around radiu
latch = ziptie_latch(type); latch = ziptie_latch(type);
lx = latch.x / 2; lx = latch.x / 2;
zt = ziptie_thickness(type); zt = ziptie_thickness(type);
cr = zt; // sharp corner raduus cr = zt; // sharp corner radius
z = r + t - cr; z = r + t - cr;
x = r - cr; x = r - cr;
inside_corners = t ? [ [0, 0, r], [-x, z, cr], [x, z, cr] ] : []; inside_corners = t ? [ [0, 0, r], [-x, z, cr], [x, z, cr] ] : [];