diff -Nru pcb-rnd-3.1.0/Changelog pcb-rnd-3.1.1/Changelog --- pcb-rnd-3.1.0/Changelog 2023-02-04 16:53:50.000000000 +0000 +++ pcb-rnd-3.1.1/Changelog 2023-05-24 02:43:23.000000000 +0000 @@ -1,3 +1,144 @@ +pcb-rnd 3.1.1 (r37572) +~~~~~~~~~~~~~~~~~~~~~~ + [asm] + -Fix: ignore subcircuits of extended objects + + [cam] + -Fix: doc_png exports bottom side with flip_y enabled for proper layer ordering + -Add: doc_eps job to export colored top and bottom in eps for documentation purposes + -Add: doc_ps job, similar to doc_png and doc_eps + -Add: doc_ps draws copper faded and silk solid for readability + -Add: cam job for Advanced Circuits, as reported by Bdale + + [ch_endpoint] + -Fix: remove endpoint indications (on first subsequent redraw) when tool is switched to a non-indicating one + + [core] + -Fix: pixmap transformation: avoid sign swap in rotation + -Fix: scale pixmaps before rotation to keep their aspect if it's not 1.000 + -Fix: find.c vs. disjoint padstacks: set all-copper-conn'd for multi-copper padstacks only if the hole that connects them are plated + -Fix: find.c vs. disjoint padstacks: don't require plated hole for the single-copper (smd) case + -Fix: find.c: skip checking bloated up pstk against polygon for isc if clearance is larger than bloat and there's no thermal connecting them (works around line approximation false positive isc) + -Fix: find.c: switch over from geometric rat-end connection find to (more precise) anchor based when rat anchors are avaliable; this means the rat line is connected only to the two objects it was mapped for; fixes the bug when two nointconn lines touch at endpoint from where a rat also starts and by geometry the rat shorts to two nointconn lines making an internal connection against the user's will + -Fix: typo: check if rat rtree exists (not padstack rtree) before looking into the rat rtree + -Fix: when removing a layer, all layers are renumbered; shift the thermal bits (indexed by layer index) in each padstack so thermals remain on the same layer after the re-indexing + -Fix: allow idpath data address of buffer#n to end in / + -Fix: idpath data address lookup: boundary check on the buffer array + -Fix: pcb_idpath2obj_in() should be able to return object from buffer if the path refers to a buffer; provide an _only() variant that excludes the buffer + -Fix: draw code used the wrong field for applying gui xform, causing conditional jump on uninitialized value + -Fix: when converting string to thermal bits, accept NULL as empty string + -Add: initialize new conf node rc.path.dotdir so users can refer to their own config easier + -Add: hid_cam: support for global opt flip_x and flip_y so that bottom side layer order can be rendered correctly + -Add: low level cam support for force_nonepty (creates output file even if layer group is empty, overriding the export plugins normal decision, in case the plugin cooperates) + + [dialogs] + -Fix: reapply filter after a refresh to avoid gui inconsistency between the filter entry and the tree displayed + -Fix: library window: refresh button shouldn't crash when filter entry is empty + -Fix: library window on parametric edit: when the parametric footprint fails to produce a valid help text, don't override the filter with NULL string (causes segf) + -Fix: typo in load file name filter name (should be rp, not rs) + -Fix: Save() syntax should mention the extra, optional path argument where it is available + -Add: library window: refine filter text tooltip: mention regex and case-insensitive + -Add: padstack dialog instance tab displays logical layer id (for reference and to ease debugging) + -Add: open dialog: file name filtering widget when opening a board + + [doc] + -Add: gtk4 and sch-rnd formats in datasheet + -Add: document new openscad export features + -Add: mention gmail is not supported + -Add: link in route-rnd + -Add: FAQ item about high DPI screen icon_scale + -Add: document cam's global option flip_x and flip_y and force_nonempty option + -Add: sch-rnd on the bridges drawing and Ringdove listing + -Add: install resources/ when installing doc + -Update: conf tree docs generated with the centralzied tool (removing excess pcb-rnd from titles) + -Update: dotdir node in conf tree doc + -Update: user manual: prefer sch-rnd over gschem + -Update: use nlnet logo for the link + + [export_bom] + -Fix: ignore subcircuits of extended objects + + [export_fidocadj] + -Fix: ignore subcircuits of extended objects + + [export_gerber] + -Add: let cam override "layer group is empty" decision + + [export_ipdcd356] + -Fix: ignore subcircuits of extended objects + + [export_oldconn] + -Fix: ignore subcircuits of extended objects + + [export_openscad] + -Fix: don't hardwire pcb_ prefix in generated scad script, read it from a global var so later it can be changed + -Add: export option 'prefix' to change module names to allow multiple exports to be used in a single large project + -Add: do not hardwire board thickness 1.6mm but use the standard thickness query between top and bottom copper + -Add: support for openscad-origin (object attribute) to set 0;0 of the board on the x;y plane + + [export_ps] + -Fix: restore config after the export so that forced conf sets (like flips) are reverted + -Add: set librnd's ps_faded before rendering a layer, depending on xform->layer_faded + -Add: let cam override "layer group is empty" decision in both ps end eps + -Add: --enable-flip in eps to respect flip_x and flip_y + + [export_stl] + -Fix: ignore subcircuits of extended objects + -Fix: initialize triangulation pool large enough to host cutout coords as well + -Fix: use rtree search for cutout objects so that ones from subcircuits are picked up as well + -Fix: remove temporary cutout polygons before uninitializing the cutout poly vector + -Fix: separate export options into per format arrays so file names and other settings are remembered separately when exporting from the GUI + + [export_xy] + -Fix: ignore subcircuits of extended objects + -Fix: get the format enum initialized when called from the export() action + -Add: make enum values (format template names) available for --help + + [exprot_png] + -Fix: don't override onsolder-rendering in cam mode, let the cam rule decide + + [footprint] + -Add: openscad: 1008, 1210, 1806, 1825, 2706 SMD model + -Add: openscad: SOT143, SOT223, SOT25, SOT26, SOT323, SOT232D SMD model + -Add: openscad: SOT325, SOT325, SOT23, SOT89, SC90, SOD110, SOD80, SOD87 SMD model + -Add: openscad: SC70_3 uses SOT323 package model + -Add: openscad: SC70-4 3D model + -Add: openscad: SOD80 3D model compatible with minimelf + -Add: openscad: SOD106A, MPAK 3D model + -Add: openscad: 3 and 5 mm LEDs, TO92, TO39(-3), TO18, OSC14_8 + -Add: openscad: HC49*, HC51, TO220*, TO126, TO251, TO247, TO264 + -Add: openscad: MULTIWATT*, HEPTAWATT, PENTAWATT + -Add: openscad: 3D model for 6x6 mm tactile switch + -Add: openscad: BNC, DC power jack, DSUB connectors + + [menu] + -Add: hotkey {f f s} for import (fetch) schematics + + [oldactions] + -Fix: ignore subcircuits of extended objects when listing rotations + + [propedit] + -Fix: relative set on geo fields is not mistaken for absolute set + -Add: pressing enter in the value input of the "new attribute" dialog should be the same as clicking on ok + -Add: propset(rename/a/oldname, newname) renames the attribute (in an undoable way) keeping its value + + [query] + -Fix: query() action syntax includes the optional scope argument + + [renumber] + -Fix: ignore subcircuits of extended objects + + [tests] + -Fix: filter out pup soft uninit warning to reduce noise + -Fix: strflags: wront printf format for unsigned long int in hex + -Fix: uniq_name: wrong array index integer width for printf %d + -Fix: cam refs: 0 is written as 0.000 in current code + -Add: test board for different disjoint padstack-padstack touches for find.c + + [tool_std] + -Fix: arrow tool timer drops current click timing if the board got unloaded (or switched) meanwhile, to avoid operating on invalid or background board + + pcb-rnd 3.1.0 (r37222) ~~~~~~~~~~~~~~~~~~~~~~ [asm] diff -Nru pcb-rnd-3.1.0/debian/changelog pcb-rnd-3.1.1/debian/changelog --- pcb-rnd-3.1.0/debian/changelog 2023-02-08 06:45:32.000000000 +0000 +++ pcb-rnd-3.1.1/debian/changelog 2023-05-24 17:33:43.000000000 +0000 @@ -1,3 +1,9 @@ +pcb-rnd (3.1.1-1) unstable; urgency=medium + + * new upstream version + + -- Bdale Garbee Wed, 24 May 2023 11:33:43 -0600 + pcb-rnd (3.1.0-1) unstable; urgency=medium * new upstream version diff -Nru pcb-rnd-3.1.0/doc/conf/tree/appearance_color.html pcb-rnd-3.1.1/doc/conf/tree/appearance_color.html --- pcb-rnd-3.1.0/doc/conf/tree/appearance_color.html 2022-08-13 12:52:56.000000000 +0000 +++ pcb-rnd-3.1.1/doc/conf/tree/appearance_color.html 2023-04-27 08:00:34.000000000 +0000 @@ -1,5 +1,5 @@ -

pcb-rnd conf tree

+

conf tree

subtree: appearance/color

node name type flags description diff -Nru pcb-rnd-3.1.0/doc/conf/tree/appearance.html pcb-rnd-3.1.1/doc/conf/tree/appearance.html --- pcb-rnd-3.1.0/doc/conf/tree/appearance.html 2022-08-13 12:52:56.000000000 +0000 +++ pcb-rnd-3.1.1/doc/conf/tree/appearance.html 2023-04-27 08:00:34.000000000 +0000 @@ -1,5 +1,5 @@ -

pcb-rnd conf tree

+

conf tree

subtree: appearance

node name type flags description diff -Nru pcb-rnd-3.1.0/doc/conf/tree/appearance_messages.html pcb-rnd-3.1.1/doc/conf/tree/appearance_messages.html --- pcb-rnd-3.1.0/doc/conf/tree/appearance_messages.html 2020-04-28 16:09:42.000000000 +0000 +++ pcb-rnd-3.1.1/doc/conf/tree/appearance_messages.html 2023-04-27 08:00:34.000000000 +0000 @@ -1,5 +1,5 @@ -

pcb-rnd conf tree

+

conf tree

subtree: appearance/messages

node name type flags description diff -Nru pcb-rnd-3.1.0/doc/conf/tree/appearance_misc.html pcb-rnd-3.1.1/doc/conf/tree/appearance_misc.html --- pcb-rnd-3.1.0/doc/conf/tree/appearance_misc.html 2020-04-28 16:09:42.000000000 +0000 +++ pcb-rnd-3.1.1/doc/conf/tree/appearance_misc.html 2023-04-27 08:00:34.000000000 +0000 @@ -1,5 +1,5 @@ -

pcb-rnd conf tree

+

conf tree

subtree: appearance/misc

node name type flags description diff -Nru pcb-rnd-3.1.0/doc/conf/tree/appearance_padstack.html pcb-rnd-3.1.1/doc/conf/tree/appearance_padstack.html --- pcb-rnd-3.1.0/doc/conf/tree/appearance_padstack.html 2020-04-28 16:09:42.000000000 +0000 +++ pcb-rnd-3.1.1/doc/conf/tree/appearance_padstack.html 2023-04-27 08:00:34.000000000 +0000 @@ -1,5 +1,5 @@ -

pcb-rnd conf tree

+

conf tree

subtree: appearance/padstack

node name type flags description diff -Nru pcb-rnd-3.1.0/doc/conf/tree/appearance_subc.html pcb-rnd-3.1.1/doc/conf/tree/appearance_subc.html --- pcb-rnd-3.1.0/doc/conf/tree/appearance_subc.html 2020-04-28 16:09:42.000000000 +0000 +++ pcb-rnd-3.1.1/doc/conf/tree/appearance_subc.html 2023-04-27 08:00:34.000000000 +0000 @@ -1,5 +1,5 @@ -

pcb-rnd conf tree

+

conf tree

subtree: appearance/subc

node name type flags description diff -Nru pcb-rnd-3.1.0/doc/conf/tree/design_drc_disable.html pcb-rnd-3.1.1/doc/conf/tree/design_drc_disable.html --- pcb-rnd-3.1.0/doc/conf/tree/design_drc_disable.html 2020-07-03 12:39:31.000000000 +0000 +++ pcb-rnd-3.1.1/doc/conf/tree/design_drc_disable.html 2023-04-27 08:00:34.000000000 +0000 @@ -1,5 +1,5 @@ -

pcb-rnd conf tree

+

conf tree

subtree: design/drc_disable

node name type flags description diff -Nru pcb-rnd-3.1.0/doc/conf/tree/design_drc.html pcb-rnd-3.1.1/doc/conf/tree/design_drc.html --- pcb-rnd-3.1.0/doc/conf/tree/design_drc.html 2020-07-03 12:39:31.000000000 +0000 +++ pcb-rnd-3.1.1/doc/conf/tree/design_drc.html 2023-04-27 08:00:34.000000000 +0000 @@ -1,5 +1,5 @@ -

pcb-rnd conf tree

+

conf tree

subtree: design/drc

node name type flags description diff -Nru pcb-rnd-3.1.0/doc/conf/tree/design.html pcb-rnd-3.1.1/doc/conf/tree/design.html --- pcb-rnd-3.1.0/doc/conf/tree/design.html 2021-04-09 09:30:10.000000000 +0000 +++ pcb-rnd-3.1.1/doc/conf/tree/design.html 2023-04-27 08:00:34.000000000 +0000 @@ -1,5 +1,5 @@ -

pcb-rnd conf tree

+

conf tree

subtree: design

node name type flags description diff -Nru pcb-rnd-3.1.0/doc/conf/tree/design_thermal.html pcb-rnd-3.1.1/doc/conf/tree/design_thermal.html --- pcb-rnd-3.1.0/doc/conf/tree/design_thermal.html 2020-07-03 12:39:31.000000000 +0000 +++ pcb-rnd-3.1.1/doc/conf/tree/design_thermal.html 2023-04-27 08:00:34.000000000 +0000 @@ -1,5 +1,5 @@ -

pcb-rnd conf tree

+

conf tree

subtree: design/thermal

node name type flags description diff -Nru pcb-rnd-3.1.0/doc/conf/tree/editor.html pcb-rnd-3.1.1/doc/conf/tree/editor.html --- pcb-rnd-3.1.0/doc/conf/tree/editor.html 2022-11-20 07:56:54.000000000 +0000 +++ pcb-rnd-3.1.1/doc/conf/tree/editor.html 2023-04-27 08:00:34.000000000 +0000 @@ -1,5 +1,5 @@ -

pcb-rnd conf tree

+

conf tree

subtree: editor

node name type flags description diff -Nru pcb-rnd-3.1.0/doc/conf/tree/editor_selection.html pcb-rnd-3.1.1/doc/conf/tree/editor_selection.html --- pcb-rnd-3.1.0/doc/conf/tree/editor_selection.html 2020-04-28 16:09:42.000000000 +0000 +++ pcb-rnd-3.1.1/doc/conf/tree/editor_selection.html 2023-04-27 08:00:34.000000000 +0000 @@ -1,5 +1,5 @@ -

pcb-rnd conf tree

+

conf tree

subtree: editor/selection

node name type flags description diff -Nru pcb-rnd-3.1.0/doc/conf/tree/import_alien_format.html pcb-rnd-3.1.1/doc/conf/tree/import_alien_format.html --- pcb-rnd-3.1.0/doc/conf/tree/import_alien_format.html 2021-01-16 03:37:01.000000000 +0000 +++ pcb-rnd-3.1.1/doc/conf/tree/import_alien_format.html 2023-04-27 08:00:34.000000000 +0000 @@ -1,5 +1,5 @@ -

pcb-rnd conf tree

+

conf tree

subtree: import/alien_format

node name type flags description diff -Nru pcb-rnd-3.1.0/doc/conf/tree/import_footprint_placement.html pcb-rnd-3.1.1/doc/conf/tree/import_footprint_placement.html --- pcb-rnd-3.1.0/doc/conf/tree/import_footprint_placement.html 2020-04-28 16:09:42.000000000 +0000 +++ pcb-rnd-3.1.1/doc/conf/tree/import_footprint_placement.html 2023-04-27 08:00:34.000000000 +0000 @@ -1,5 +1,5 @@ -

pcb-rnd conf tree

+

conf tree

subtree: import/footprint_placement

node name type flags description diff -Nru pcb-rnd-3.1.0/doc/conf/tree/import_footprint_removal.html pcb-rnd-3.1.1/doc/conf/tree/import_footprint_removal.html --- pcb-rnd-3.1.0/doc/conf/tree/import_footprint_removal.html 2020-07-03 12:44:44.000000000 +0000 +++ pcb-rnd-3.1.1/doc/conf/tree/import_footprint_removal.html 2023-04-27 08:00:34.000000000 +0000 @@ -1,5 +1,5 @@ -

pcb-rnd conf tree

+

conf tree

subtree: import/footprint_removal

node name type flags description diff -Nru pcb-rnd-3.1.0/doc/conf/tree/rc.html pcb-rnd-3.1.1/doc/conf/tree/rc.html --- pcb-rnd-3.1.0/doc/conf/tree/rc.html 2022-10-27 05:48:06.000000000 +0000 +++ pcb-rnd-3.1.1/doc/conf/tree/rc.html 2023-04-27 08:00:34.000000000 +0000 @@ -1,5 +1,5 @@ -

pcb-rnd conf tree

+

conf tree

subtree: rc

node name type flags description @@ -27,5 +27,4 @@
save_final_fallback_fmt rnd_cfn_string 0 when a new file is created (by running pcb-rnd with the file name) there won't be a known format; pcb-rnd will guess from the file name (extension) but eventhat may fail. This format is the final fallback that'll be used if no other guessing mechanism worked. The user can override this by save as.
save_fp_fmt rnd_cfn_string 0 when saving a buffer element/subcircuit, prefer this format by default
web_browser rnd_cfn_string 0 command line to a web browser (useful for accessing external resources, e.g. order pcb web services) -
have_regex rnd_cfn_boolean 0 whether we have regex compiled in
diff -Nru pcb-rnd-3.1.0/doc/conf/tree/rc_path.html pcb-rnd-3.1.1/doc/conf/tree/rc_path.html --- pcb-rnd-3.1.0/doc/conf/tree/rc_path.html 2022-08-13 12:52:56.000000000 +0000 +++ pcb-rnd-3.1.1/doc/conf/tree/rc_path.html 2023-04-27 08:00:34.000000000 +0000 @@ -1,5 +1,5 @@ -

pcb-rnd conf tree

+

conf tree

subtree: rc/path

node name type flags description @@ -8,4 +8,5 @@
bin rnd_cfn_string 0 e.g. /usr/bin
share rnd_cfn_string 0 e.g. /usr/share/pcb-rnd
design rnd_cfn_string 0 directory path of the current design, or if the current design doesn't have a file name yet +
dotdir rnd_cfn_string 0 user's config dir, normally ~/.pcb-rnd
diff -Nru pcb-rnd-3.1.0/doc/conf/tree/temp.html pcb-rnd-3.1.1/doc/conf/tree/temp.html --- pcb-rnd-3.1.0/doc/conf/tree/temp.html 2022-08-13 12:52:56.000000000 +0000 +++ pcb-rnd-3.1.1/doc/conf/tree/temp.html 2023-04-27 08:00:34.000000000 +0000 @@ -1,5 +1,5 @@ -

pcb-rnd conf tree

+

conf tree

subtree: temp

node name type flags description diff -Nru pcb-rnd-3.1.0/doc/contact.html pcb-rnd-3.1.1/doc/contact.html --- pcb-rnd-3.1.0/doc/contact.html 2021-10-27 02:14:56.000000000 +0000 +++ pcb-rnd-3.1.1/doc/contact.html 2023-02-18 03:38:11.000000000 +0000 @@ -27,7 +27,7 @@

Contact the project

Please subscribe to the mailing list by sending "subscribe" to -pcb-rnd list.repo.hu or join IRC for +pcb-rnd list.repo.hu (does not work with gmail) or join IRC for live chat (CET daytime) with other users and developers. @@ -36,7 +36,7 @@ Join IRC for live chat (CET daytime) and look for Igor2.

-Via email: pcbrnd igor2.repo.hu. +Via email: pcbrnd igor2.repo.hu (does not work with gmail) +
diff -Nru pcb-rnd-3.1.0/doc/datasheet.html pcb-rnd-3.1.1/doc/datasheet.html --- pcb-rnd-3.1.0/doc/datasheet.html 2021-12-14 04:29:20.000000000 +0000 +++ pcb-rnd-3.1.1/doc/datasheet.html 2023-02-08 06:27:07.000000000 +0000 @@ -82,7 +82,7 @@ File formats:
Import netlist
- Accel ASCII netlists + footprint info
calay (netlists + footprint info)
flat netlist from EDIF
freepcb netlist + footprint info
gEDA/gschem (netlist + footprint info, running gnetlist)
import ltspice .net and .asc (netlist and footprint info)
flat .edf (netlist+footprint, produced by Mentor Graphics Design Capture)
pcb-rnd action script (netlist + footprint info)
schematics import by running a commandline
netlist import by running a commandline
gEDA netlist (plain text, no footprint info)
Orcad PCB II (netlist + footprint info)
PADS ascii (.asc, netlists + footprint info)
Protel netlists 2.0 + footprint info
tinycad .net (netlists + footprint info)
eeschema netlist and footprint info
tEDAx netlist (any version) + Accel ASCII netlists + footprint info
calay (netlists + footprint info)
flat netlist from EDIF
freepcb netlist + footprint info
gEDA/gschem (netlist + footprint info, running gnetlist)
import ltspice .net and .asc (netlist and footprint info)
flat .edf (netlist+footprint, produced by Mentor Graphics Design Capture)
pcb-rnd action script (netlist + footprint info)
schematics import by running a commandline
netlist import by running a commandline
gEDA netlist (plain text, no footprint info)
Orcad PCB II (netlist + footprint info)
PADS ascii (.asc, netlists + footprint info)
Protel netlists 2.0 + footprint info
sch-rnd sheet (netlist + footprint info, running sch-rnd)
sch-rnd project (netlist + footprint info, running sch-rnd)
Ringdove project (netlist + footprint info, running sch-rnd)
tinycad .net (netlists + footprint info)
eeschema netlist and footprint info
tEDAx netlist (any version)
File formats:
Import misc @@ -116,7 +116,7 @@
UI options - gtk2, lesstif (motif), batch (automated processing) + gtk2, gtk4, lesstif (motif), batch (automated processing)
configurable menus, keyboard and mouse actions
footprint library diff -Nru pcb-rnd-3.1.0/doc/developer/packaging/Changelog pcb-rnd-3.1.1/doc/developer/packaging/Changelog --- pcb-rnd-3.1.0/doc/developer/packaging/Changelog 2023-01-11 03:37:11.000000000 +0000 +++ pcb-rnd-3.1.1/doc/developer/packaging/Changelog 2023-05-18 03:00:49.000000000 +0000 @@ -1,10 +1,26 @@ How to get a release candidate tarball in /tmp: - ver=3.1.0 + ver=3.1.1 cd /tmp svn export svn://repo.hu/pcb-rnd/trunk pcb-rnd-$ver tar -cf pcb-rnd-$ver.tar pcb-rnd-$ver +Packaging changes between 3.1.1 and 3.1.0 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +A. changes that probably don't need action + +1. a lot more files are installed in the docdir: the whole resources/ + dir, making installed doc more self-contained (mostly due to logo graphics) + +2. a lot more files are installed in the footprint dir: openscad scripts for + 3d models of the static footprints + +B. changes that probably DO need action + +(none) + + Packaging changes between 3.1.0 and 3.0.6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff -Nru pcb-rnd-3.1.0/doc/faq.html pcb-rnd-3.1.1/doc/faq.html --- pcb-rnd-3.1.0/doc/faq.html 2021-10-27 02:14:56.000000000 +0000 +++ pcb-rnd-3.1.1/doc/faq.html 2023-03-06 15:57:02.000000000 +0000 @@ -124,5 +124,14 @@
  • librnd is installed from source to a non-standard installation prefix, e.g. installation in home directory or /opt; see INSTALL.librnd.txt for the extra steps this setup requires +

    6. GUI

    +

    +

    6.1. icons too small

    +

    +If you use a high DPI screen and icon buttons (e.g. in the top left toolbar) +and icons are too small but text buttons and text labels are properly sized, +you need to configure plugins/hid_gtk/icon_scale to 2 or 3, preferrably on +user role and then restart pcb-rnd. + diff -Nru pcb-rnd-3.1.0/doc/index.html pcb-rnd-3.1.1/doc/index.html --- pcb-rnd-3.1.0/doc/index.html 2022-09-06 06:08:55.000000000 +0000 +++ pcb-rnd-3.1.1/doc/index.html 2023-05-12 11:03:55.000000000 +0000 @@ -41,12 +41,12 @@

  • Version Control svn://svn.repo.hu/pcb-rnd/trunk    (mirrors)
    Download source releases | binary releases (windows) -
    Comments, feedback, patches live chat with the developer
    or contact the lead developer
    Mailing list: pcb-rnd list.repo.hu (send a mail with subject: subscribe; may fail with gmail) (archives) (privacy policy) +
    Comments, feedback, patches live chat with the developer
    or contact the lead developer
    Mailing list: pcb-rnd list.repo.hu (send a mail with subject: subscribe; does not work with gmail) (archives) (privacy policy)
    Contribution and support How to join or contribute
    We are looking for help and sponsoration/donation. -
    A major supporter is NLnet -
    Do you have a feature request? +

    A major supporter is NLnet +

    Do you have a feature request?

    Key features editor for multilayer Printed Circuit Boards @@ -91,7 +91,9 @@

    RiNgDove is an EDA suite that includes: +

    a schematics editor: sch-rnd

    a PCB editor: pcb-rnd +

    a PCB autorouter: route-rnd

    a CAM viewer: camv-rnd

    a software lib: librnd

    or all in one: suite diff -Nru pcb-rnd-3.1.0/doc/Makefile pcb-rnd-3.1.1/doc/Makefile --- pcb-rnd-3.1.0/doc/Makefile 2022-11-22 04:54:54.000000000 +0000 +++ pcb-rnd-3.1.1/doc/Makefile 2023-05-12 11:06:45.000000000 +0000 @@ -26,6 +26,7 @@ $(SCCBOX) mkdir -p "$(DOCDIR)" cd man && $(MAKE) install cd user && $(MAKE) install + cd resources && $(MAKE) install cd tutorials && $(MAKE) install cd security && $(MAKE) install cd conf && $(MAKE) install @@ -35,6 +36,7 @@ linstall: cd man && $(MAKE) linstall cd user && $(MAKE) linstall + cd resources && $(MAKE) linstall cd tutorials && $(MAKE) linstall cd security && $(MAKE) linstall cd conf && $(MAKE) linstall @@ -44,6 +46,7 @@ uninstall: cd man && $(MAKE) uninstall cd user && $(MAKE) uninstall + cd resources && $(MAKE) uninstall cd tutorials && $(MAKE) uninstall cd security && $(MAKE) uninstall cd conf && $(MAKE) uninstall diff -Nru pcb-rnd-3.1.0/doc/news.html pcb-rnd-3.1.1/doc/news.html --- pcb-rnd-3.1.0/doc/news.html 2022-11-02 02:56:59.000000000 +0000 +++ pcb-rnd-3.1.1/doc/news.html 2023-02-08 03:08:35.000000000 +0000 @@ -31,12 +31,19 @@

    + 2023-02-08 +
    + release: 3.1.0 +
    + Release 3.1.0 available: librnd API upgrades; requires librnd 4.0.0 + +
    2022-11-02
    release: 3.0.6
    Release 3.0.6 available: feature release -
    2022-07-20 diff -Nru pcb-rnd-3.1.0/doc/resources/logo_nlnet.svg pcb-rnd-3.1.1/doc/resources/logo_nlnet.svg --- pcb-rnd-3.1.0/doc/resources/logo_nlnet.svg 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/doc/resources/logo_nlnet.svg 2023-05-12 11:03:55.000000000 +0000 @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru pcb-rnd-3.1.0/doc/resources/Makefile pcb-rnd-3.1.1/doc/resources/Makefile --- pcb-rnd-3.1.0/doc/resources/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/doc/resources/Makefile 2023-05-12 16:22:30.000000000 +0000 @@ -0,0 +1,24 @@ +ROOT=../.. +RESDIR=$(DOCDIR)/resources + +all: + +install_all: + $(SCCBOX) mkdir -p $(RESDIR) + $(SCCBOX) $(HOW) -d *.png *.svg *.jpg $(RESDIR) + +install: + $(MAKE) install_all HOW="install -f -d" + +linstall: + $(MAKE) install_all HOW="install -f -l -d" + +uninstall: + $(MAKE) install_all HOW="install -u" + +clean: + +distclean: + + +include $(ROOT)/Makefile.conf diff -Nru pcb-rnd-3.1.0/doc/TODO pcb-rnd-3.1.1/doc/TODO --- pcb-rnd-3.1.0/doc/TODO 2023-02-08 02:56:12.000000000 +0000 +++ pcb-rnd-3.1.1/doc/TODO 2023-05-22 13:18:07.000000000 +0000 @@ -1,51 +1,32 @@ 0. old, still waiting for ack 1. For the upcoming release =============================================================================== ++ BUG: debian packaging: sort control file so diff'ing is easier; propagate the change to all projects [report: Bdale] 2. For later releases =============================================================================== -- FEATURE: expose DOTDIR (~/.pcb-rnd, as ./configured) in the conf tree in so $(rc.path.user_dotdir) would work [report: Ade] -- FEATURE: load file name filter, see sch-rnd r5872 [report: Igor2] -- FEATURE: doc_ps cam export job, see bug_files/TODO/doc_ps.diff [report: aron] - - BUG: ps cam export multiple layers into a single file re-exports scale for each group, making second group unreadably small -- FEATURE: propedit attribute edit popup: the enter key should click ok [report: Igor2] -- FEATURE: 3d export upgrades [report: Igor2] - - be able to specify 0;0 coord for the export, useful for multi-board asm - - be able to change name prefix, useful for multi-board asm - - test attribute based, openscad-specific no-export - - PCB thickness in openscad - - debug why trace rendering is so slow with round cap in openscad -- BUG: propedit: place a text, select it, propedit(selection, geo), choose x, untick the abs checlbox, enter 1 mil, apply -> set absolute, not relative [report: Igor2, Evan] -- BUG: bug_files/TODO/disj.rp: disjoint padstack when {c f} on the blue line [report: Igor2] -- BUG: draw a line, arrow tool, hover -> editopoint marks; swtich tools using hotkey while hovering over the line -> editopoint marks are not removed [report: Igor2] -- BUG: pcb_pixmap_alloc_insert_transformed() breaks above 90 and below 0 deg; use propedit to rotate a long narrow pixmap like doc/resources/header_600.png [report: Igor2] -- BUG: cam export: doc_png bottom side is drawn looking from the top -> copper is over silk; figure how to flip in cam [report: aron] -- BUG: bug_files/TODO/emptyfab.rp, -x cam gerber:JLC_PCB emptyfab.rp -> no .fab file; layer is considered empty because draw_fab is a side effect [report: Bdale] -- BUG: bug_files/TODO/derive.rp, edit pstk proto, add mask shape, derive -> derived polygon is broken (invalid coords) [report: Scott] +- DOC: pool node on how to use pixmap for breadboading +- BUG: poly-as-drawn mode doesn't draw the edges of poly holes [report: aron] +- BUG: footprint edit mode: convert selected to padstack fails with the wrong error message [report: bdale] - BUG: bug_files/TODO/uc.rp, drag&drop move selected twice then {u c} -> valgrind log! [report: aron] - - happens when subc is removed from pcb_removelist - - subc line is probably added but not removed from pcb_removelist's rtrees + -> happens when subc is removed from pcb_removelist + -> subc line is probably added but not removed from pcb_removelist's rtrees +- FEATURE: openscad export: option to set/change $fn (default to 0, which should mean don't set, for compatibility) [report: Erich] +- FEATURE: openscad export: option to set/change fillet=0|1 for SMD/reflowed devices [report: Erich] +- FEATURE: openscad export: option to set/change unmasked copper colour to depict tinning/HASL/ENIG etc.. [report: Erich] +- CLEANUP: remove inline, use RND_INLINE - check src_3rd as well (librnd5 critical) +- BUG: export_stl: before counting points, merge all the cutout polygons into one to avoid buggy exports due to overlapping/embedded cutouts; see bug_files/TODO/stl_olap.stl [report: keantoken] + - BUG: via-on-via triggers an assert, see bug_files/TODO/stl-vv.rp [report: Majenko] - BUG: bug_files/TODO/ppc_full.*: poly-clear-poly should respect full-poly flag and apply all islands only if full-poly is set -- BUG: thermal: bug_files/TODO/thermal.lht: remove an intern layer group the double click poly -> thermal is lost [report: cuvoodoo] - - we should display layer IDs somewhere: useful for debugging and for the user for query() - - same bug: DRC: removing bottom-power unrelated layer without any objects turns insufficient overlap into net to close to other net in bug_files/TODO/overlap3.lht [report: cuvoodoo] -> changes thermal on the via - - pcb_layer_move_delete_() doesn't do anything to update thermals - - see swap_one_thermal() on how to fix this - - probably won't break on new layers or layer moves as those won't change LIDs of existing layers -- BUG: erratic intnoconn {c r} behaviour. See intnoconn-test.rs, exported intnoconn-test-net.net and intnoconn-test.rp using imported net. load the .rp and use {c r}. note shorts flagged by intnoconn sections. move resistor from layout margins onto layout area and use {c r}. shorts no longer found. Seems to be a failure to allocate intnoconn groups to terminals outside the layout area when there is more than one of the same subc using an intnoconn group. Does not happen with intnoconn-test2.rp which uses different coil subcs; see also intnoconn-test-net2.rp; also identical coils but with different intnoconn group numbers seem to behave properly [report: Erich] -- BUG: multiple coils in intnoconn-bug.rp using intnoconn-bug-actual.net reflecting partion of circuit intnoconn-bug.rs should behave like intnoconn-net-desired.net. shorts being declared with no connections apparent. Coils use different intonoconn groups, and different UIDs to no avail [report: Erich] - -> the bug is that the rat line end falling at the endpoint of the line at the boundary of two intnoconn sections shorts the two sections - BUG?: enforce style clearance doesn't work with middle-line rubber band move, see bug_files/TODO/drag.rs [report: Majenko] -> may be a non-bug, if we take this as a line move operation (doesn't enforce) - DEL: remove c-pcb support in favor of the more generic external autorouter plugin - CLEANUP: rewrite query's parent_net_len_found_cb() to collect objects in a tree (from->to objects, at most 2 'to' objects from a single 'from'); use slab allocation for tree elems; see bug_files/revp.lht: {n l o} on the long horizontal line causes zig-zagging map that a single segment reverse won't fix; also revise pads ascii write with this [report: cuvoodoo] -- CLEANUP/FEATURE: new breadboard - - FEATURE: gfx rotated pixmap scale -> uneven x/y scale can not be done while rendering; change the API so the x/y aspect change is done in software during the rotation (pcb_pixmap_alloc_insert_transformed) and only an even x/y scale is done during rendering (ghid_draw_pixmap) - - DOC: pool node on how to use pixmap for breadboading - CLEANUP: TODO27: undo's removed list shouldn't depend on object IDs but probably remove list index because IDs are not unique if we want our operations to retrain IDs. Repro: shift-click subc replace twice, then undo; or drag&drop move selected object and undo [report: Igor2] - CLEANUP/BUG: undo operation while drawing a multiple segment line doesn't change segment attached to the crosshair [report:wojciechk8] - tool_line.c depends on pcb_undo()'s return value; can be fixed only when the old undo system is removed - CLEANUP: think over how to handle subc selection: selecting all parts automatically is bad for propedit; bug_files/subcsel.bug [report: Wojciech] - BUG: propedit adding/deleting attributes inconsistency; search depth problem (see TODO#28) bug_files/subcsel.bug [report: Ade] + - BUG: select a subc, propedit selection: padstacks are counted twice (e.g. for lid/thermal) [report: gpaubert] - CLEANUP: layer order from data - build a list of layers rendered, in the order of rendering while drawing layer groups; maybe use gdl and move the group to the end and use a terminator item; get pcb_search_obj_by_location_() to use this list for ordering - BUG?: Far-side silk text can be selected and moved when the mouse is over front-side subcircuit. (but this is what we had with elements too! -> rewrite search.c to be a 'script' config) bug_files/farsilk.lht [report: Ade] @@ -63,6 +44,8 @@ - BUG: lhtpers indentation: bug_files/lhtpers_ins/; breakpoint in pers_table.c:34 and debug why the newline is getting in [report: Igor2] - FEATURE: lihata board v9: - replace board/size with the bbox representation +- BUG: start pcb-rnd with bug_files/TODO/poly-segfault.rp. shift click second polygon to have both polygons selected. :polycombine(), click on remaining polygon {u u}, segfault ensues. Pair of polygons generated by drawing one polygon with polygon tool, then selecting it, copy to buffer, {bml} and pasting mirrored duplicate. [report: Erich]. +- BUG: start pcb-rnd. switch to mm units. select 0.01 grid size. Draw polygon from (1.9,1.9) to (10.95,1.9) to (10.95,7.3) to (1.9,2.3. Save layout. Inspect lihata .rp to find contour: { 74.80314961mil; 74.80314961mil },{ 431.1023622mil; 74.80314961mil },{ 431.1023622mil; 287.4015748mil },{ 74.80314961mil; 90.5511811mil }. [report: Erich] - BUG: I/O bugs: - eagle: - BUG: xml: eagle XML import fails on polygon import reported by miloh, test file pcb-rnd-aux poly_selfi/eagle_polygon_crash.brd [report: erich], due to input file containing an invalid polygon: a self intersecting poly in line 156 - consider handling "width"? @@ -74,9 +57,19 @@ 3. Long term =============================================================================== - multi: merge sch-rnd r4718 for proper multiboard support later -- BUG: in poly lib rewrite: bug_files/Poly_rewrite/polyclpoly.lht: excess clearing into the corner of the outer poly; move the line a bit and it tends to disappear ml=3493 [report: gpaubert] -- BUG: in poly lib rewrite: bug_files/Poly_rewrite/phatch.lht: maybe {m d t} and PolyHatch(0, c) -> poly offseting bug on sharp corners ml=4159 [report: Majenko] -- BUG: in poly lib rewrite: bug_files/Poly_rewrite/intersect.* (thin hair gerber bug) [report: cuvoodoo] +- poly lib rewrite: + - BUG: bug_files/Poly_rewrite/polyclpoly.lht: excess clearing into the corner of the outer poly; move the line a bit and it tends to disappear ml=3493 [report: gpaubert] + - BUG: bug_files/Poly_rewrite/phatch.lht: maybe {m d t} and PolyHatch(0, c) -> poly offseting bug on sharp corners ml=4159 [report: Majenko] + - BUG: bug_files/Poly_rewrite/intersect.* (thin hair gerber bug) [report: cuvoodoo] + - BUG: bug_files/line-arc-del-assert.rp load layout, delete right most vertical, line, poly validity assert ensues [report: Erich] + - BUG: bug_files/line-arc-del-assert.rp load layout, delete bottom most horizontal line, note strange clipping that shorts across adjacent arc [report: Erich] + - BUG: bug_files/line-arc-del-assert.rp load layout, delete bottom most arc, note strange clipping that across where arc used to be [report: Erich] + - BUG: bug_files/TODO/derive.rp, edit pstk proto, add mask shape, derive -> derived polygon is broken (invalid coords) [report: Scott] + -> happens because of colinear neighbor edges becoming redundant points in a subsequent iteration + -> simpler test file: bug_files/Poly_rewrite/offs1.rp, line 211, two vetices on the bottom side of the triangle + -> simpler reprodtion: just grow the coper shape by 10 mil + -> fix: in rnd_polo_offs() remove all redudnant vertices and subsequent vertices with the same norm in a loop before the main loop + -> this in turn needs rnd_polo_offs() to modify num_pts, which should be a pointer maybe - FEATURE: "thermal recipe" so a padstack thermal can be put in a padstack or subc and it is changed with the layer binding [report: jg] - FEATURE: netlist2: bug_files/ratside.txt optional rats constraints [report: Vuokko] - FEATURE: openems mesher: do not ignore padstack copper [report: Evan] @@ -99,5 +92,6 @@ 4. Low prio =============================================================================== - BUG: elliptic: gtk2_gl: RTT/arc_sizes.lht - elliptical arc corner case render bug [report: Wed] - BUG: elliptic: RTT/arc_sizes.lht - unable to move arcs which have different width and height [report: Ade] - rewrite pcb_is_point_on_arc() elliptical case at the bottom +- BUG: if foo() v0 exists in ~/.pcb-rnd/footprint and foo() v1 exists in ~/pcblib the tree view in the left paane of {w l} will load foo() v0 in ~/.pcb-rnd even if foo() v1 under ~/pcblib is being selected in the GUI with a mouse click. GUI selection fail. [report: Erich] - FEATURE: DRC should warn for thin poly hair - FEATURE: scconfig: menuconfig and a config file for scconfig: requires a more declarative dependency handling system -> being done in scconfig2 diff -Nru pcb-rnd-3.1.0/doc/user/03_data/index.html pcb-rnd-3.1.1/doc/user/03_data/index.html --- pcb-rnd-3.1.0/doc/user/03_data/index.html 2021-06-14 08:00:36.000000000 +0000 +++ pcb-rnd-3.1.1/doc/user/03_data/index.html 2023-04-27 08:04:33.000000000 +0000 @@ -16,7 +16,7 @@ of legacy and contemporary software.

    The user can import a variety of non-layout data sources commonly used in EDA -flow. Schematics from gschem or kicad, netlists, reference images, tinyCAD, +flow. Schematics from sch-rnd or gschem or kicad, netlists, reference images, tinyCAD, and more are available to the user.

    3.1. Board

    diff -Nru pcb-rnd-3.1.0/doc/user/06_feature/cam/index.html pcb-rnd-3.1.1/doc/user/06_feature/cam/index.html --- pcb-rnd-3.1.0/doc/user/06_feature/cam/index.html 2020-04-04 15:09:11.000000000 +0000 +++ pcb-rnd-3.1.1/doc/user/06_feature/cam/index.html 2023-03-10 12:27:57.000000000 +0000 @@ -40,6 +40,9 @@
  • okempty-group: warning suppression: do not warn when none of the layer groups referenced for an outfile exists (outfile can not be created or will be empty)
  • okempty-content: warning suppression: do not warn when all layer groups for an outfile were empty (outfile is normally created and valid, but is empty as no object got exported)
  • okempty: shorthand that enables both okempty-group and okempty-content +
  • flip_x: set conf node editor/view/flip_x (x coords are mirrored) +
  • flip_y: set conf node editor/view/flip_y (y coords are mirrored) +
  • force_nonempty: export even if groups i empty and the exporter would normally not export empty groups
  • layergrp: one or more layer group addresses separated by comma (syntax is documented in layer addressing appendix.) diff -Nru pcb-rnd-3.1.0/doc/user/07_io/3_1_export_openscad/index.html pcb-rnd-3.1.1/doc/user/07_io/3_1_export_openscad/index.html --- pcb-rnd-3.1.0/doc/user/07_io/3_1_export_openscad/index.html 2020-10-12 03:16:06.000000000 +0000 +++ pcb-rnd-3.1.1/doc/user/07_io/3_1_export_openscad/index.html 2023-02-08 12:30:03.000000000 +0000 @@ -29,6 +29,7 @@
  • subcircuit (3d) models (optional) +

    7.2.1.1 Subcircuit 3d models

    Subcircuit models are loaded from external files referenced from the subcircuit in the pcb-rnd board file. Model files are searched recursively under the @@ -61,3 +62,43 @@ module name in the same line, { in the following line. One instance of each model is copied into the output file so that the resulting openscad script has no external reference and is self-contained. + +

    7.2.1.2 no export objects

    +

    +If an object shall not be exported to openscad, add the attribute +noexport:openscad to it with value 1. This will omit +the object only from the openscad export. Any drawing object can be omitted. + +

    7.2.1.3 namespace

    +

    +By default all exported module names are prefixed by pcb_. When the openscad +scripts of multiple boards are included in a complex project this would cause +conflicts because of matching module names. This can be fixed by specifying +a unique prefix on export using the prefix export option for each board. + +

    7.2.1.4 board thickness

    +

    +The openscad exporter respects standard layer group thickness attributes when +calculating board body thickness: it sums all insulating layers between +top and bottom copper. Copper/silk/mask layer thickness is not respected +because they would normally be too thin for reasonable openscad rendering. +

    +If board thickness can not be determined, a fallback default value of 1.6mm +is used. + +

    7.2.1.5 board origin

    +

    +When exporing a board that would be part of a bigger 3d model it is important +to be able to position the board properly in openscad. Normally the origin +(0;0 coordinate of the openscad board model) will be the bottom left corner of +the board's bounding box (when the board is looked down at from the top). +

    +In many situations the board could be better positioned by an object, typically +by a padstack (hole). This can be done by taking a drawing object and +adding the openscad-origin attribute to it with the value of 1. +When such an object is present on the board, the center point of the object +is used as the openscad origin and the board model is translated so that +the center point of the object is at 0;0. +

    +If there are multiple openscad-origin objects present on the board, one is +picked randomly. diff -Nru pcb-rnd-3.1.0/doc/user/09_appendix/action_reference.html pcb-rnd-3.1.1/doc/user/09_appendix/action_reference.html --- pcb-rnd-3.1.0/doc/user/09_appendix/action_reference.html 2022-09-29 11:12:01.000000000 +0000 +++ pcb-rnd-3.1.1/doc/user/09_appendix/action_reference.html 2023-05-09 03:36:22.000000000 +0000 @@ -13,7 +13,7 @@ @@ -79,6 +79,7 @@ + @@ -87,7 +88,7 @@ - + @@ -171,6 +172,7 @@ + @@ -236,7 +238,7 @@ - + @@ -253,6 +255,7 @@ + @@ -296,7 +299,7 @@ - + @@ -339,7 +342,7 @@ - + @@ -350,7 +353,7 @@ - + @@ -385,13 +388,36 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru pcb-rnd-3.1.0/doc/user/09_appendix/bridges.svg pcb-rnd-3.1.1/doc/user/09_appendix/bridges.svg --- pcb-rnd-3.1.0/doc/user/09_appendix/bridges.svg 2021-12-14 04:15:40.000000000 +0000 +++ pcb-rnd-3.1.1/doc/user/09_appendix/bridges.svg 2023-04-27 08:10:24.000000000 +0000 @@ -16,8 +16,8 @@ pcb-rnd output-only - - input-output + + input-output input-only @@ -59,7 +59,7 @@ LTSpice - Lepton EDAgschem + Lepton EDA (any)netlist @@ -94,6 +94,8 @@ Mentorhyperlynx PADSASCII + + sch-rnd Eagle(board,lib) @@ -106,10 +108,6 @@ svg STL(3d) - - dxf(2D CAD) - - excellon(drill) XYtemplated @@ -118,6 +116,10 @@ BOM g-code(mill) + + dxf(2D CAD) + + excellon(drill) openscad(3D CAD) @@ -134,32 +136,54 @@ pro(3d) statstatistics + + + svg + + + importschematics importschematics importnetlist + + + DRCspec + + + importnetlist importschematics - - importschematics - - - board + + + ASCII board + + + importschematics + + + board netlistpads/subcs + + + .xy + importschematics - - - board + + importPCB + + + bin board importschematics - - - ASCII board + + + board importschematics @@ -167,131 +191,109 @@ .grb, .cnc - - importnetlist + + + xml.lbr + + + importnetlist text - - importnetlist - - - DRU + + + board importlines/arcs - - - bin board + + + stl - - importschematics + + + importschematics importschematics - - - board + + + board importschematics - - - .xy + + + ps - - - xml.lbr + + + importfootprint + + + DRU - - importPCB amf - importschematics + IPC356D - + + DSN + + + + schematics + + + + board + importschematics - - tEDAxroute* - - - board - + projector - + importnetlist - - - stl - - - - board + + + + schematics lihata - - importschematics - - DSN - + + tEDAxroute* board - - - ps - - - importfootprint - - - footprint - - - - postscript - - - - - - schematics - - - - footprints-expr - - boards-expr - - - svg + + + board - - - etest + + + postscript @@ -301,17 +303,21 @@ boardlegacy - - - DRCspec + + + footprint footprint - - - board + + + footprints-expr + + + + etest diff -Nru pcb-rnd-3.1.0/doc/user/09_appendix/dialogs.html pcb-rnd-3.1.1/doc/user/09_appendix/dialogs.html --- pcb-rnd-3.1.0/doc/user/09_appendix/dialogs.html 2022-07-07 06:48:40.000000000 +0000 +++ pcb-rnd-3.1.1/doc/user/09_appendix/dialogs.html 2023-04-27 08:11:28.000000000 +0000 @@ -11,6 +11,8 @@

    pcb-rnd User Manual: Appendix

    List of GUI dialog boxes

    + +
    -This is pcb-rnd 3.0.6-dev (svn r36663) an interactive printed circuit board editor from the Ringdove EDA suite compiled using librnd version 3.2.0 running with librnd version 3.2.0 , Revision: 36844 +This is pcb-rnd 3.1.1-dev (svn r37226) an interactive printed circuit board editor from the Ringdove EDA suite compiled using librnd version 4.0.2-dev running with librnd version 4.0.2-dev , Revision: 37492
    Action Description Syntax Plugin
    AboutPresent the about boxAbout()dialogs plugin
    ClrFlagClears flags on objects.ClrFlag(Object|Selected|SelectedObjects, flag)
    ClrFlag(SelectedLines|SelectedPins|SelectedVias, flag)
    ClrFlag(SelectedPads|SelectedTexts|SelectedNames, flag)
    ClrFlag(SelectedElements, flag)
    flag = thermal | join
    CommandDisplays the command line input in the status area.Command()lib_hid_common plugin
    confPerform various operations on the configuration tree.conf(set, path, value, [role], [policy]) - change a config setting to an absolute value
    conf(delta, path, value, [role], [policy]) - change a config setting by a delta value (numerics-only)
    conf(toggle, path, [role]) - invert boolean value of a flag; if no role given, overwrite the highest prio config
    conf(reset, role) - reset the in-memory lihata of a role
    conf(iseq, path, value) - returns whether the value of a conf item matches value (for menu checked's)
    confgetReturn conf node value or property from the merged in-memory/native storage. Returns nil if node is unset (for value query) or not found. Intended for scripting.ConfGet(path, [value]) - return the value of a conf node; units, colors and lists are returned as string.
    ConfGet(path, desc) - return the human readable description
    ConfGet(path, ArraySize) - number of elements
    ConfGet(path, ReadOnly) - returns 1 if node is read-only, 0 otherwise
    ConfGet(path, ConfRev) - conf (merge) rev number the value last changed
    ConnectionSearches connections of the object at the cursor position.Connection(Find|ResetLinesAndPolygons|ResetPinsAndVias|Reset)
    constraintConfigure or remove a drawing constraintconstraint(type, off)
    constraint(type, value, [value...])
    ddraft plugin
    cpcbExecuted external autorouter cpcb to route the board or parts of the boardcpcb(board|selected, [command])cpcb plugin
    Cursor (RND)Move the cursor.Cursor(Type,DeltaUp,DeltaRight,Units)
    CycleDragCycle through which object is being draggedCycleDrag()
    d1debug action for developmentd1()diag plugin
    dadManipulate Dynamic Attribute Dialogsdad(dlgname, new) - create new dialog
    dad(dlgname, label, text) - append a label widget
    dad(dlgname, button, text) - append a button widget
    dad(dlgname, button_closes, label, retval, ...) - standard close buttons
    dad(dlgname, enum, choices) - append an enum (combo box) widget; choices is a tab separated list
    dad(dlgname, bool) - append an checkbox widget (default off)
    dad(dlgname, integer|real|coord, min, max) - append an input field
    dad(dlgname, string) - append a single line text input field
    dad(dlgname, default, val) - set the default value of a widet while creating the dialog
    dad(dlgname, help, tooltip) - set the help (tooltip) text for the current widget
    dad(dlgname, progress) - append a progress bar (set to 0)
    dad(dlgname, preview, cb_act_prefix, minsize_x, minsize_y, [ctx]) - append a preview with a viewbox of 10*10mm, minsize in pixels
    dad(dlgname, tree, cols, istree, [header]) - append tree-table widget; header is like enum values
    dad(dlgname, tree_append, row, cells) - append after row (0 means last item of the root); cells is like enum values; returns a row pointer
    dad(dlgname, tree_append_under, row, cells) - append at the end of the list under row (0 means last item of the root); cells is like enum values; returns a row pointer
    dad(dlgname, tree_insert, row, cells) - insert before row (0 means first item of the root); cells is like enum values; returns a row pointer
    dad(dlgname, begin_hbox) - begin horizontal box
    dad(dlgname, begin_vbox) - begin vertical box
    dad(dlgname, begin_hpane) - begin horizontal paned box
    dad(dlgname, begin_vpane) - begin vertical paned box
    dad(dlgname, begin_table, cols) - begin table layout box
    dad(dlgname, begin_tabbed, tabnames) - begin a view with tabs; tabnames are like choices in an enum; must have as many children widgets as many names it has
    dad(dlgname, end) - end the last begin
    dad(dlgname, flags, flg1, flg2, ...) - change the flags of the last created widget
    dad(dlgname, onchange, action) - set the action to be called on widget change
    dad(dlgname, run, title) - present dlgname as a non-modal dialog
    dad(dlgname, run_modal, title) - present dlgname as a modal dialog
    dad(dlgname, exists) - returns wheter the named dialog exists (0 or 1)
    dad(dlgname, set, widgetID, val) - changes the value of a widget in a running dialog
    dad(dlgname, get, widgetID, [unit]) - return the current value of a widget
    lib_hid_common plugin
    dadManipulate Dynamic Attribute Dialogsdad(dlgname, new) - create new dialog
    dad(dlgname, label, text) - append a label widget
    dad(dlgname, button, text) - append a button widget
    dad(dlgname, button_closes, label, retval, ...) - standard close buttons
    dad(dlgname, enum, choices) - append an enum (combo box) widget; choices is a tab separated list
    dad(dlgname, bool) - append an checkbox widget (default off)
    dad(dlgname, integer|real|coord, min, max) - append an input field
    dad(dlgname, string) - append a single line text input field
    dad(dlgname, default, val) - set the default value of a widet while creating the dialog
    dad(dlgname, help, tooltip) - set the help (tooltip) text for the current widget
    dad(dlgname, progress) - append a progress bar (set to 0)
    dad(dlgname, preview, cb_act_prefix, minsize_x, minsize_y, [ctx]) - append a preview with a viewbox of 10*10mm, minsize in pixels
    dad(dlgname, tree, cols, istree, [header]) - append tree-table widget; header is like enum values
    dad(dlgname, tree_append, row, cells) - append after row (0 means last item of the root); cells is like enum values; returns a row pointer
    dad(dlgname, tree_append_under, row, cells) - append at the end of the list under row (0 means last item of the root); cells is like enum values; returns a row pointer
    dad(dlgname, tree_insert, row, cells) - insert before row (0 means first item of the root); cells is like enum values; returns a row pointer
    dad(dlgname, begin_hbox) - begin horizontal box
    dad(dlgname, begin_vbox) - begin vertical box
    dad(dlgname, begin_hpane) - begin horizontal paned box
    dad(dlgname, begin_vpane) - begin vertical paned box
    dad(dlgname, begin_table, cols) - begin table layout box
    dad(dlgname, begin_tabbed, tabnames) - begin a view with tabs; tabnames are like choices in an enum; must have as many children widgets as many names it has
    dad(dlgname, end) - end the last begin
    dad(dlgname, flags, flg1, flg2, ...) - change the flags of the last created widget
    dad(dlgname, onchange, action) - set the action to be called on widget change
    dad(dlgname, run, title) - present dlgname as a non-modal dialog
    dad(dlgname, run_modal, title) - present dlgname as a modal dialog
    dad(dlgname, exists) - returns wheter the named dialog exists (0 or 1)
    dad(dlgname, set, widgetID, val) - changes the value of a widget in a running dialog
    dad(dlgname, get, widgetID, [unit]) - return the current value of a widget
    dad(dlgname, iterate) - runs a global GUI iteration (event dispatch, redraw)
    dad(dlgname, raise) - pops up window in front
    dad(dlgname, close) - close the dialog (and return 0 from modal run)
    lib_hid_common plugin
    ddraftEnter 2d drafting CLI mode or execute commandddraft([command])ddraft plugin
    DebugDebug action.Debug(...)oldactions plugin
    DebugXYDebug action, with coordinatesDebugXY(...)oldactions plugin
    fpasExecute a script one-liner using a specific languageOneliner(lang, script)script plugin
    fp_rehashFlush the library index; rescan all library search paths and rebuild the library index. Useful if there are changes in the library during a pcb-rnd session.fp_rehash()
    FreeRotateBufferRotates the current paste buffer contents by the specified angle. The
    angle is given in degrees. If no angle is given, the user is prompted
    for one.
    FreeRotateBuffer([Angle])
    FsdSimpleFile selection dialog, simplified API; for meaning of the arguments, see the HID API doc.FsdSimple(title, descr, default_file, default_ext, history_tag, [read])lib_hid_common plugin
    FsdTestCentral, DAD based File Selection Dialog demoFsdTest()lib_hid_common plugin
    FullScreenHide widgets to get edit area full screenFullScreen(on|off|toggle)
    GetMarkReturn mark properties in numeric form.GetMark(active|user_placed|x|y)act_read
    LoadFpcbnlFromLoads the specified freepcb netlist.LoadFpcbnlFrom(filename)fpcb_nl importer
    LoadFromLoad layout data from a file.LoadFrom(Layout|LayoutToBuffer|SubcToBuffer|Netlist|Revert,filename[,format])
    LoadHpglFromLoads the specified hpgl plot file to the current bufferLoadHpglFrom(filename)hpgl importer
    LoadhypFromLoads the specified Hyperlynx file.LoadhypFrom(filename[, "debug"]...)hyp importer
    LoadhypFromLoads the specified Hyperlynx file.LoadhypFrom(filename)hyp importer
    LoadIpc356FromLoads the specified IPC356-D netlistLoadIpc356From(filename, [nonet], [nopad], [nosubc])ipcd356 importer
    LoadLtspiceFromLoads the specified ltspice .net and .asc file - the netlist must be mentor netlist.LoadLtspiceFrom(filename)ltspice importer
    LoadMentorFromLoads the specified Mentor Graphics Design Capture schematics flat .edf file.LoadMentorFrom(filename)mentor_sch importer
    LoadVendorFromLoads the specified vendor lihata file. If second argument is "yes" or "pure", load in pure mode without side effects: do not reset or apply, only incrementally load.LoadVendorFrom(filename, [yes|no])vendor drill mapping
    LogManages the central, in-memory log.Log(clear, [fromID, [toID])
    Log(export, [filename, [text|lihata])
    LogDialogOpen the log dialog.LogDialog()lib_hid_common plugin
    LogGuiLog() action GUI sectionLogGui(export, [filename, [text|lihata])
    luaExecute a script one-liner using a specific languageOneliner(lang, script)script plugin
    mLoads a layout into the current buffer.m [name]shand_cmd plugin
    ManagePluginsManage plugins dialog.ManagePlugins()lib_hid_common plugin
    paralDraw a line perpendicular to another lineperp()ddraft plugin
    pasExecute a script one-liner using a specific languageOneliner(lang, script)script plugin
    PasteBufferVarious operations on the paste buffer.PasteBuffer(AddSelected|MoveSelected|Clear|1..PCB_MAX_BUFFER)
    PasteBuffer(Rotate, 1..3)
    PasteBuffer(Convert|Restore|Mirror)
    PasteBuffer(ToLayout, X, Y, units)
    PasteBuffer(ToLayout, crosshair)
    PasteBuffer(Save, Filename, [format], [force])
    PasteBuffer(SaveAll, Filename, [format])
    PasteBuffer(LoadAll, Filename)
    PasteBuffer(Push)
    PasteBuffer(Pop)
    PasteBuffer(GetSource, [1..PCB_MAX_BUFFER])
    PCBChangedTells the GUI that the whole PCB has changed. The optional "revert"parameter can be used as a hint to the GUI that the same design is beingreloaded, and that it might keep some viewport settingsPCBChanged([revert])oldactions plugin
    PCBChangedTells the GUI that the whole PCB has changed. The "revert"parameter is deprecated but kept for compatibility and is ignored.PCBChanged([revert])oldactions plugin
    PcbDeleteAlias to Delete()
    pcbsplitSplit objects (idpath or idpath list) with cutting edges (idpath or idpath list), returning the idpath list of the newly created objectsPcbSplit(cutting_edges, objs)ddraft plugin
    pcb_acosscript plugin
    propeditpropedit(object[:id]|layer[:id]|layergrp[:id]|pcb|subc|selection|selected)propedit
    propgetReturn the named property of scope or all selected objects to/by value. Scope is documented at PropEdit().propget([scope], name, [stattype])propedit
    propprintPrint a property map of objects matching the scope. Scope is documented at PropEdit().PropPrint([scope])propedit
    propsetChange the named property of scope or all selected objects to/by value. Scope is documented at PropEdit().propset([scope], name, value)propedit
    propsetChange the named property of scope or all selected objects to/by value. Scope is documented at PropEdit(). Existing attributes can be renamed to value by using a name rename/a/old_name, where old_name is the current name of the attribute.propset([scope], name, value)propedit
    proptoggleToggle the named property of scope or all selected objects, assuming the property is boolean. Scope is documented at PropEdit(). If create is true, non-existing attributes are created as true.proptoggle([scope], name, [create])propedit
    pstklibPresent the padstack library dialog on board padstacks or the padstacks of a subcircuitpstklib([auto|board|subcid|object], [retpid, [preselect]])dialogs plugin
    PstkNewCreate a padstack. For now data must be "pcb". glob_clearance=0 turns off global clearance. Returns the idpath of the new object or 0 on error.PstkNew([noundo,] data, protoID, x, y, glob_clearance, flags)act_draw
    pythonExecute a script one-liner using a specific languageOneliner(lang, script)script plugin
    q!Quits the application without confirming.q!shand_cmd plugin
    qQuits the application after confirming.qshand_cmd plugin
    queryPerform various queries on PCB data.query(dump, expr) - dry run: compile and dump an expression
    query(eval|evalidp, expr) - compile and evaluate an expression and print a list of results on stdout
    query(count, expr) - compile and evaluate an expression and return the number of matched objects (-1 on error)
    query(select|unselect|view, expr) - select or unselect or build a view of objects matching an expression
    query(setflag:flag|unsetflag:flag, expr) - set or unset a named flag on objects matching an expression
    query(append, idplist, expr) - compile and run expr and append the idpath of resulting objects on idplist
    query plugin
    queryPerform various queries on PCB data.query(dump, expr) - dry run: compile and dump an expression
    query(eval|evalidp, expr, [scope]) - compile and evaluate an expression and print a list of results on stdout
    query(count, expr, [scope]) - compile and evaluate an expression and return the number of matched objects (-1 on error)
    query(select|unselect|view, expr, [scope]) - select or unselect or build a view of objects matching an expression
    query(setflag:flag|unsetflag:flag, expr, [scope]) - set or unset a named flag on objects matching an expression
    query(append, idplist, expr, [scope]) - compile and run expr and append the idpath of resulting objects on idplist
    query plugin
    QueryCalcNetLenCalculates the network length by netname; returns an error message string or a positive coord with the lengthQueryCalcNetLen(netname)query plugin
    QueryCompileFieldWith "compile": precompiles textual field name to field ID; with "free": frees the memory allocated for a previously precompiled fieldID.QueryCompileField(compile, fieldname)
    QueryCompileField(free, fieldID)
    query plugin
    QueryObjReturn the value of a field of an object, addressed by the object's idpath and the field's name or precompiled ID. Returns NIL on error.QueryObj(idpath, [.fieldname|fieldID])query plugin
    rnd_toolbar_initFor ringdove apps: initialize the toolbar.lib_hid_common plugin
    rnd_toolbar_uninitFor ringdove apps: uninitialize the toolbar.lib_hid_common plugin
    rnd_zoomChange zoom level (relative, absolute, window, ...)Zoom()
    Zoom([+|-|=]factor)
    Zoom(x1, y1, x2, y2)
    Zoom(?)
    Zoom(get)
    lib_hid_common plugin
    Rotate90Rotates the object under the crosshair by 90 degree steps.pcb_move_obj(steps)
    Rotate90Rotates the object under the crosshair by 90 degree steps.Rotate90(steps)
    roundrectGenerate a rectangle with round cornersroundrect([where,] width[;height] [,rx[;ry] [,rotation [,cornstyle [,roundness]]]])shape plugin
    RouteStyleWithout second argument: copies the indicated routing style into the current pen; with second argument sets or gets a field of the routing style.RouteStyle(style_id|style_name|@current, [set|get|del], [trace-thickness|trace-clearance|text-thickness|text-scale|font|via-proto|name], [value]])
    RouteStyle(new, [name])
    RouteStylesChangedTells the GUI that the routing styles have changed.RouteStylesChanged()oldactions plugin
    rubyExecute a script one-liner using a specific languageOneliner(lang, script)script plugin
    sSaves layout data.s [name]
    w [name]
    shand_cmd plugin
    SaveSave layout data to a user-selected file.Save()
    Save(Layout|LayoutAs)
    Save(AllConnections|AllUnusedPins|ElementConnections)
    Save(PasteBuffer)
    Save(DialogByPattern, pcb|footprint|font|buffer, none|board|fp, prompt, [default_pattern])
    dialogs plugin
    SafeFsclearerrSame as clearerr(3)SafeFsclearerr(f)
    SafeFsFcloseCloses a file previously open using SafeFsFopen()SafeFsFclose(f)
    SafeFsFeofReturns 1 if file has reached EOF, 0 otherwiseSafeFsFeof(f)
    SafeFsFerrorReturns 1 if file had errors, 0 otherwiseSafeFsFerror(f)
    SafeFsFgetsReads and returns a line from f (open with SafeFsFopen()). Stops reading after maxlen (subsequent call will continue reading the same line). Returns nil on error or eof or empty line. Maxlen is 64k by default. Note: string heap allocation is made for maxlen.SafeFsFgets(f, [maxlen])
    SafeFsFileMtimeReturn the last modification time of a file, from Epoch, or -1 on error.SafeFsFileMtime(path)
    SafeFsFileSizeReturn the size of a file in bytes, or -1 on error.SafeFsFileSize(path)
    SafeFsFopenOpens a file using fopen, returns FILE *. If mode is not specified, r is assumed. Returns nil on error.SafeFsFopen(path, [mode])
    SafeFsFputsWrites str to file f (previously opne with SafeFsFopen))SafeFsFputs(f, str)
    SafeFsFreadReads and returns at most len bytes from a file (open with SafeFsFopen()). Returns nil on error or eof or empty line.SafeFsFread(f, len)
    SafeFsFreadSepReads characters that are either all non-seps or all seps. Reads at most maxlen bytes. Returns the string read or nil on eof or error. Seps is a string that contains every separator character. Maxlen is 64k by default.SafeFsFreadSep(f, seps, [maxlen])
    SafeFsFseekSame as fseek(3); whence is a string, one of set, cur or end not specified (set is used when not specified)SafeFsFseek(f, offs, [whence])
    SafeFsFtellSame as ftell(3).SafeFsFtell(f)
    SafeFsIsDirReturn 1 if path exists and is a directory, else return 0.SafeFsIsDir(path)
    SafeFsMkdirMkdir a file from the file system. If mode is a string, it is converted from octal. Return value is the same as mkdir(2)'sSafeFsMkdir(path, mode)
    SafeFsPathSepReturn the system dependet path separator character (normally slash).SafeFsPathSep(path)
    SafeFsReadFileReads a text file into one long string, returned, but at most maxlen bytes. If maxlen is not specified, 64k is used. Returns nil on error or empty file.SafeFsReadFile(path, [maxlen])
    SafeFsRealPathReturns the realpath(3) of path, or NULL on error.SafeFsRealPath(path)
    SafeFsRemoveRemove an object from the file system. Return value is the same as remove(3)'sSafeFsRemove(path)
    SafeFsRenameRename an object on the file system. Return value is the same as rename(2)'sSafeFsRename(old_path, new_path)
    SafeFsRewindSame as rewind(3)SafeFsRewind(f)
    SafeFsSystemRuns cmdline with a shell using librnd safe_fs. Return value is the same integer as system()'sSafeFsSystem(cmdline)
    SafeFsUnlinkUnlink a file from the file system. Return value is the same as unlink(2)'sSafeFsUnlink(path)
    SaveSave layout data to a user-selected file.Save()
    Save(Layout)
    Save(LayoutAs, [path])
    Save(AllConnections|AllUnusedPins|ElementConnections, [path])
    Save(PasteBuffer, [path])
    Save(DialogByPattern, pcb|footprint|font|buffer, none|board|fp, prompt, [default_pattern])
    dialogs plugin
    SaveFontToSave PCB font to a fileSaveFontTo([file, id])
    SaveLibSaves all subcircuits to a library file or directory from a board or buffer.SaveLib(file|dir, board|buffer, [filename], [fmt])
    SavePatchSave netlist patch for back annotation.SavePatch(filename)
    ID @@ -27,7 +29,6 @@
    camCAM exportcam()src_plugins/cam/cam_gui.cdoes not yet work in lesstif
    constraintDrawing constraintsconstraint()src_plugins/ddraft/constraint_gui.c 
    aboutAbout pcb-rndabout()src_plugins/dialogs/dlg_about.clesstif: needs to be resized to at least 600 pixels high -
    exportn/an/asrc_plugins/dialogs/dlg_export.c 
    flagsEdit flagsFlagEdit()src_plugins/dialogs/dlg_flag_edit.c 
    fontselFont selectionFontSel()src_plugins/dialogs/dlg_fontsel.c 
    fpmapChoose footprintn/asrc_plugins/dialogs/dlg_fpmap.c  @@ -58,7 +59,7 @@
    route_styleEdit route stylen/asrc_plugins/lib_hid_pcbui/routest_dlg.c 
    poly_hatchPolygon hatchhatch(interactive)src_plugins/lib_polyhelp/polyhelp.c 
    orderOrder PCBn/asrc_plugins/order/order_dlg.c  -
    pcbway_quotePCBWay: quoten/asrc_plugins/order_pcbway/pcbway.c  +
    pcbway_quotePCBWay: quoten/asrc_plugins/order_pcbway/quote.c 
    propeditProperty editorpropedit()src_plugins/propedit/propdlg.c 
    searchpcb-rnd searchn/asrc_plugins/query/dlg_search.c 
    search_exprpcb-rnd search expressionn/asrc_plugins/query/dlg_search_edit.c  diff -Nru pcb-rnd-3.1.0/doc/user/09_appendix/src/bridges.txt pcb-rnd-3.1.1/doc/user/09_appendix/src/bridges.txt --- pcb-rnd-3.1.0/doc/user/09_appendix/src/bridges.txt 2021-12-14 04:15:40.000000000 +0000 +++ pcb-rnd-3.1.1/doc/user/09_appendix/src/bridges.txt 2023-04-27 08:10:24.000000000 +0000 @@ -1,7 +1,7 @@ - *io--------------------------------------------------------+ - |[kica ] [gpcb ] [hyp_] [gsch] [ alti ] [dsn_ ]| - | [ tedax ] [pads] [fido] [prtl] [eagl] | - +----------------------------------------------------------+ + *io------------------------------------------------------------+ + | [kica ] [gpcb ] [hyp_] [gsch] [ alti ] [dsn_ ]| + |[schr] [ tedax ] [pads] [fido] [prtl] [eagl] | + +--------------------------------------------------------------+ *inp----+ *hid--------+ |[eesc ]| *pcbrnd----------------------------------------------------------+ |[batch ] | |[mucs ]| | | | | @@ -83,7 +83,7 @@ label mucs PCB\nautorouter [lept] - label Lepton EDA\ngschem + label Lepton EDA [ltsp] label LTSpice @@ -143,6 +143,9 @@ [gsch] label gEDA\ngschem +[schr] + label sch-rnd + [kica] label kicad\npcbnew @@ -367,6 +370,9 @@ <-> gsch.s pcbrnd label schematics +<-> schr.s pcbrnd + label schematics + <-> gpcb.s-0.2 pcbrnd label board diff -Nru pcb-rnd-3.1.0/footprint/connector/BNC_LAY.fp pcb-rnd-3.1.1/footprint/connector/BNC_LAY.fp --- pcb-rnd-3.1.0/footprint/connector/BNC_LAY.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/connector/BNC_LAY.fp 2023-05-09 11:50:56.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = right angle BNC + openscad = BNC_LAY.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/connector/BNC_LAY.scad pcb-rnd-3.1.1/footprint/connector/BNC_LAY.scad --- pcb-rnd-3.1.0/footprint/connector/BNC_LAY.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/connector/BNC_LAY.scad 2023-05-12 15:47:12.000000000 +0000 @@ -0,0 +1,159 @@ +// Model for generic BNC connector through hole package +// +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_bnc_lay(pin_descent = 2.5) +{ + overall_length = 34.7; + body_length = 13.97; + body_width = 14.50; + body_height = 14.84; + threaded_collar = 8.9; + connector_length = 20.9; + body_offset = 0.78; + socket_centre_height = 7.42 + body_offset; + pin_diameter = 0.74; + pin_spacing = 2.54; + mounting_pin_dia = 2.0; + mounting_pin_spacing = 10.16; + mounting_pin_setback = 7.37; + pin_setback = body_length-1.35; + + module pin() { + pin_straight = pin_descent+body_offset+socket_centre_height-pin_diameter*2; + translate([0,0,pin_straight-pin_descent]) + color([0.7,0.7,0.7]) + rotate([0,180,0]) + union() { + cylinder(r=pin_diameter/2, h=pin_straight); + translate([-3*pin_diameter/2,0,0]) + rotate([90,0,0]) + rotate_extrude(angle=-90, convexity=10) + translate([3*pin_diameter/2,0,0]) + circle(r=pin_diameter/2); + } + } + + module connector_body() { + //connector body proper + color([0.8,0.8,0.8]) { + // outer tube + difference() { + union() { + // outer metal connector proper + translate([0,0,0]) + cylinder(r=4.85, h = connector_length); + // side lugs x2 + translate([-5.55,0,connector_length -4.25]) + rotate([0,90,0]) + cylinder(r=1, h = 1); + translate([4.55,0,connector_length -4.25]) + rotate([0,90,0]) + cylinder(r=1, h = 1); + } + // inner major cavity + translate([0,0,0]) + cylinder(r=4.4, h = 85); + } + // inner tube and pin receptacle + difference() { + cylinder(r=2.36, h = connector_length - 3.6); + cylinder(r=0.66, h = connector_length); + } + } + } + + module plastic_body() { + // centre pin + color([0.8,0.8, 0.8]) + translate([-body_length/2+4,0,0.4]) + rotate([0,-90,0]) + cylinder(r=1.0, h = 2.0); + // insulating cylinder + color([1,1,1]) + translate([-body_length/2+4,0,0.4]) + rotate([0,-90,0]) + cylinder(r=3.5, h = 1.6); + // basic feet, cubical shape and threaded section + color([0.3,0.3,0.3]) { + difference () { + union() { + // four standoffs + translate([-body_length/2+1,-body_width/2+1,-body_height/2-body_offset]) + cylinder(r=1, h = 1); + translate([body_length/2-1,body_width/2-1,-body_height/2-body_offset]) + cylinder(r=1, h = 1); + translate([body_length/2-1,-body_width/2+1,-body_height/2-body_offset]) + cylinder(r=1, h = 1); + translate([-body_length/2+1,body_width/2-1,-body_height/2-body_offset]) + cylinder(r=1, h = 1); + // threaded collar + translate([-body_length/2,0,0]) + rotate([0,90,0]) + cylinder(r=5.94, h = threaded_collar + body_length); + // body + cube([body_length,body_width,body_height],true); + } + // apperture at the back of the body for pins + translate([-body_length/2,0,0]) + cube([5.5,15,5.5],true); + translate([-body_length/2,0,-5]) + cube([5.5,6.5,15],true); + translate([-body_length/2+4,0,0]) + rotate([0,-90,0]) + cylinder(r=4, h = 5); + } + } + } + module mounting_pins() { + // mechanical mounting pins x2 + color([0.7,0.7,0.7]) { + translate([mounting_pin_setback-2.27, mounting_pin_spacing/2,-pin_descent]) + cylinder(r=mounting_pin_dia/2, h=pin_descent+body_offset); + translate([mounting_pin_setback-2.27, -mounting_pin_spacing/2,-pin_descent]) + cylinder(r=mounting_pin_dia/2, h=pin_descent+body_offset); + } + } + + rotate([0,0,90]) + union () { + translate([body_length/2 - (body_length-pin_setback),0,body_height/2+body_offset]) + plastic_body(); + translate([overall_length-body_offset-connector_length,0,socket_centre_height]) + rotate([0,90,0]) + connector_body(); + translate ([0,pin_spacing,0]) + pin(); + pin(); + mounting_pins(); + } +} + diff -Nru pcb-rnd-3.1.0/footprint/connector/DB15F.fp pcb-rnd-3.1.1/footprint/connector/DB15F.fp --- pcb-rnd-3.1.0/footprint/connector/DB15F.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/connector/DB15F.fp 2023-05-10 07:29:24.000000000 +0000 @@ -2,6 +2,8 @@ ha:subc.5 { ha:attributes { footprint = DSUB connector, female/male + openscad = DSUB.scad + openscad-param = {pins=15,gender=1,rotation=90} } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/connector/DB15M.fp pcb-rnd-3.1.1/footprint/connector/DB15M.fp --- pcb-rnd-3.1.0/footprint/connector/DB15M.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/connector/DB15M.fp 2023-05-10 07:29:24.000000000 +0000 @@ -2,6 +2,8 @@ ha:subc.5 { ha:attributes { footprint = DSUB connector, female/male + openscad = DSUB.scad + openscad-param = {pins=15,gender=0,rotation=270} } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/connector/DB25F.fp pcb-rnd-3.1.1/footprint/connector/DB25F.fp --- pcb-rnd-3.1.0/footprint/connector/DB25F.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/connector/DB25F.fp 2023-05-10 07:29:24.000000000 +0000 @@ -2,6 +2,8 @@ ha:subc.5 { ha:attributes { footprint = DSUB connector, female/male + openscad = DSUB.scad + openscad-param = {pins=25,gender=1,rotation=90} } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/connector/DB25M.fp pcb-rnd-3.1.1/footprint/connector/DB25M.fp --- pcb-rnd-3.1.0/footprint/connector/DB25M.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/connector/DB25M.fp 2023-05-10 07:29:24.000000000 +0000 @@ -2,6 +2,8 @@ ha:subc.5 { ha:attributes { footprint = DSUB connector, female/male + openscad = DSUB.scad + openscad-param = {pins=25,gender=0,rotation=270} } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/connector/DB37F.fp pcb-rnd-3.1.1/footprint/connector/DB37F.fp --- pcb-rnd-3.1.0/footprint/connector/DB37F.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/connector/DB37F.fp 2023-05-10 07:29:24.000000000 +0000 @@ -2,6 +2,8 @@ ha:subc.5 { ha:attributes { footprint = DSUB connector, female/male + openscad = DSUB.scad + openscad-param = {pins=37,gender=1,rotation=90} } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/connector/DB37M.fp pcb-rnd-3.1.1/footprint/connector/DB37M.fp --- pcb-rnd-3.1.0/footprint/connector/DB37M.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/connector/DB37M.fp 2023-05-10 07:29:24.000000000 +0000 @@ -2,6 +2,8 @@ ha:subc.5 { ha:attributes { footprint = DSUB connector, female/male + openscad = DSUB.scad + openscad-param = {pins=37,gender=0,rotation=270} } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/connector/DB9F.fp pcb-rnd-3.1.1/footprint/connector/DB9F.fp --- pcb-rnd-3.1.0/footprint/connector/DB9F.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/connector/DB9F.fp 2023-05-10 07:29:24.000000000 +0000 @@ -2,6 +2,8 @@ ha:subc.5 { ha:attributes { footprint = DSUB connector, female/male + openscad = DSUB.scad + openscad-param = {pins=9,gender=1,rotation=90} } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/connector/DB9M.fp pcb-rnd-3.1.1/footprint/connector/DB9M.fp --- pcb-rnd-3.1.0/footprint/connector/DB9M.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/connector/DB9M.fp 2023-05-10 07:29:24.000000000 +0000 @@ -2,6 +2,8 @@ ha:subc.5 { ha:attributes { footprint = DSUB connector, female/male + openscad = DSUB.scad + openscad-param = {pins=9,gender=0,rotation=180} } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/connector/DSUB.scad pcb-rnd-3.1.1/footprint/connector/DSUB.scad --- pcb-rnd-3.1.0/footprint/connector/DSUB.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/connector/DSUB.scad 2023-05-12 15:47:12.000000000 +0000 @@ -0,0 +1,255 @@ +// Model for generic DSUB PCB mounted through hole connectors +// openscad = DSUB.scad +// openscad-param = {pins=9,gender=0,rotation=0} +// +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_dsub(pins=9,gender=1,rotation=90,pin_descent=2.5) +{ + +// body_width = 1.378603*pins + 18.48503; +// hex-socket-spacing = 1.375055*pins + 12.66131; +// male_shroud_width = 1.374157*pins + 4.593115; +// female_shroud_width = 1.374579*pins + 3.999058; + + body_width = 1.379*pins + 18.485; + hex_socket_spacing = 1.375*pins + 12.661; + male_shroud_width = 1.374*pins + 4.593; + female_shroud_width = 1.375*pins + 3.999; + m_radius = 2.5908; + f_radius = 2.2860; + + shroud_depth = 6; + shroud_opening_height_male = 8.36; + plug_height_female = 7.9; + delta_m = tan(10)*(shroud_opening_height_male-2*m_radius); + delta_f = tan(10)*(plug_height_female-2*f_radius); + + overall_depth = 18.4; + face_height = 12.5; + base_face_thickness = 2.5; + rounding = 1; + + pin_diameter = 0.7; + + mounting_hole_dia = 3.3; + mounting_hole_setback = 9.52; + mounting_pin_thickness = 0.7; + mounting_pin_descent=3.8; + + pin_row_spacing = 2.84; + pin_spacing = 2.7432; + pin_setback1 = 8.08; + pin_setback2 = pin_setback1 + pin_row_spacing; + + module pin() { + color([0.7,0.7,0.7]) + translate([0,0,-pin_descent]) + cylinder(r=pin_diameter/2, h=pin_descent); + } + + module board_lock_pin() { + translate([0,mounting_pin_thickness/2,0]) + rotate([90,0,0]) + linear_extrude(height=mounting_pin_thickness) + polygon([[-mounting_hole_dia/2,base_face_thickness],[-mounting_hole_dia/2,-1.6],[-mounting_pin_descent/2,-mounting_pin_descent/2],[-0.5,-mounting_pin_descent],[-0.5,0],[0.5,0],[0.5,-mounting_pin_descent,],[mounting_pin_descent/2,-mounting_pin_descent/2],[mounting_hole_dia/2,-1.6],[mounting_hole_dia/2,base_face_thickness]]); + } + + module raw_F_plug() { + // origin centred plug + translate([-female_shroud_width/2,-plug_height_female/2,0]) + union() { + linear_extrude(height=shroud_depth) + polygon([[f_radius,plug_height_female], +[female_shroud_width-f_radius,plug_height_female], +[female_shroud_width,plug_height_female-f_radius],//approx +[female_shroud_width-delta_f,f_radius], +[female_shroud_width-delta_f-f_radius,0], +[delta_f+f_radius,0], +[delta_f,f_radius], +[0,plug_height_female-f_radius]]); + translate([f_radius,plug_height_female-f_radius,0]) + cylinder(r=f_radius,h=shroud_depth); + translate([f_radius+delta_f,f_radius,0]) + cylinder(r=f_radius,h=shroud_depth); + translate([female_shroud_width-delta_f-f_radius,f_radius,0]) + cylinder(r=f_radius,h=shroud_depth); + translate([female_shroud_width-f_radius,plug_height_female-f_radius,0]) + cylinder(r=f_radius,h=shroud_depth); + } + } + + module F_plug() { + // face plate cenntred plug + translate([body_width/2,face_height/2,base_face_thickness]) + raw_F_plug(); + } + + module M_plug() { + translate([body_width/2,face_height/2,base_face_thickness]) + difference(){ + scale([(male_shroud_width-2*(shroud_opening_height_male-plug_height_female))/female_shroud_width, shroud_opening_height_male/plug_height_female,1]) + raw_F_plug(); + scale([0.95,0.95,1.1]) + raw_F_plug(); + } + } + + module face_pin() { + color([0.7,0.7,0.7]) + translate([body_width/2,face_height/2,base_face_thickness]) + rotate([0,0,90]) + cylinder(r=pin_diameter/2, h=shroud_depth+0.1); + } + + module place_face_pins(){ + //bottom row + bottom_row_num = floor(pins/2); + top_row_num = pins - bottom_row_num; + for (i = [0:(bottom_row_num-1)]) { + translate([(i-(bottom_row_num-1)/2)*pin_spacing,-pin_row_spacing/2,0]) + face_pin(); + } + // top row + for (i = [0:top_row_num-1]) + translate([(i-(top_row_num-1)/2)*pin_spacing,pin_row_spacing/2,0]) + face_pin(); + } + + module connector_body() { + //connector body proper + color([0.3,0.3,0.3]) { + translate([-body_width/2,0,0]) + difference() { + //base plate + union() { + linear_extrude(height = base_face_thickness) + polygon([[0,0],[body_width,0], + [body_width,overall_depth-rounding], + [body_width-rounding,overall_depth], + [rounding,overall_depth],[0,overall_depth-rounding]]); + translate([rounding,overall_depth-rounding,0]) + cylinder(r=rounding, h=base_face_thickness); + translate([body_width-rounding,overall_depth-rounding,0]) + cylinder(r=rounding, h=base_face_thickness); + } + // mounting holes + translate([body_width/2-hex_socket_spacing/2,mounting_hole_setback,-base_face_thickness]) + cylinder(r=mounting_hole_dia /2, h=base_face_thickness*3); + translate([body_width/2+hex_socket_spacing /2,mounting_hole_setback ,-base_face_thickness]) + cylinder(r=mounting_hole_dia/2, h=base_face_thickness*3); + } + // pin enclosure + translate([0,overall_depth/2,(shroud_opening_height_male+base_face_thickness)/2]) + cube([-body_width+hex_socket_spacing*2,overall_depth,shroud_opening_height_male+base_face_thickness],true); + } + // front face + translate([-body_width/2,base_face_thickness,0]) + rotate([90,0,0]) + union() { + color([0.3,0.3,0.3]) { + linear_extrude(height = base_face_thickness) + polygon([[0,0],[body_width,0], + [body_width,face_height-rounding], + [body_width-rounding,face_height], + [rounding,face_height],[0,face_height-rounding]]); + translate([rounding,face_height-rounding,0]) + cylinder(r=rounding, h=base_face_thickness); + translate([body_width-rounding,face_height-rounding,0]) + cylinder(r=rounding, h=base_face_thickness); + if (gender == 0) { + M_plug(); + } else { + F_plug(); + } + } + place_face_pins(); + } + // mounting hole lock pins + color([0.7,0.7,0.7]) { + translate([-hex_socket_spacing/2,mounting_hole_setback,0]) + board_lock_pin(); + translate([hex_socket_spacing/2,mounting_hole_setback ,0]) + board_lock_pin(); + translate([hex_socket_spacing/2-mounting_hole_dia/2,base_face_thickness,base_face_thickness]) + cube([mounting_hole_dia,mounting_hole_setback- base_face_thickness+mounting_pin_thickness/2,mounting_pin_thickness], false); + translate([-hex_socket_spacing/2-mounting_hole_dia/2,base_face_thickness,base_face_thickness]) + cube([mounting_hole_dia,mounting_hole_setback- base_face_thickness+mounting_pin_thickness/2,mounting_pin_thickness], false); + } + + // front face mounting_nuts * 2 + color([0.7,0.7,0.7]) { + translate([-hex_socket_spacing/2,-base_face_thickness,face_height/2]) + rotate([-90,0,0]) + difference() { + cylinder(r=2.844, h=4.8, $fn=6); + translate([0,0,-0.1]) + cylinder(r=1.4424, h=5.0); + } + translate([hex_socket_spacing/2,-base_face_thickness,face_height/2]) + rotate([-90,0,0]) + difference() { + cylinder(r=2.844, h=4.8, $fn=6); + translate([0,0,-0.1]) + cylinder(r=1.4424, h=5.0); + } + } + } + + module place_pcb_pins() { + //front row + front_row_num = floor(pins/2); + back_row_num = pins - front_row_num; + for (i = [0:(front_row_num-1)]) { + translate([(i-(front_row_num-1)/2)*pin_spacing,pin_setback1,0]) + pin(); + } + // rear row + for (i = [0:back_row_num-1]) + translate([(i-(back_row_num-1)/2)*pin_spacing,pin_setback2,0]) + pin(); + } + + rotate([0,0,rotation]) { + back_row_num = pins - floor(pins/2); + // legacy footprint origins do not coincide with pin number one exactly in y direction + fp_offset_y = 0.1524-pin_setback2; + // pin numbering in M is mirror of F footprint + fp_offset_x = (1-gender)*(back_row_num-1)/2*pin_spacing + (0-gender)*(back_row_num-1)/2*pin_spacing; + + translate([fp_offset_x,fp_offset_y,0]) + union () { + connector_body(); + place_pcb_pins(); + } + } +} + diff -Nru pcb-rnd-3.1.0/footprint/connector/pwrjack.fp pcb-rnd-3.1.1/footprint/connector/pwrjack.fp --- pcb-rnd-3.1.0/footprint/connector/pwrjack.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/connector/pwrjack.fp 2023-05-09 13:34:08.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = power jack + openscad = pwrjack.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/connector/pwrjack.scad pcb-rnd-3.1.1/footprint/connector/pwrjack.scad --- pcb-rnd-3.1.0/footprint/connector/pwrjack.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/connector/pwrjack.scad 2023-05-12 15:47:12.000000000 +0000 @@ -0,0 +1,101 @@ +// Model for generic DC power jack, defaults to 2.1mm pin +// openscad-param= {centre_pin_dia=2.X} +// +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_pwrjack(centre_pin_dia = 2.1,pin_descent=2.5) +{ + pin_thickness = 0.3; + pin1_width = 2.8; + pin23_width = 2.0; + pin_spacing = 7; + + body_width = 8.8; + body_length = 13.2; + body_height = 10.9; + body_front_lip = 3.3; + axis_height = 6.5; + + opening = 6.3; + + module pin1() { + cube([pin1_width,pin_thickness,axis_height+pin_descent],false); + } + + module pin2() { + cube([pin23_width,pin_thickness,axis_height+pin_descent],false); + } + + module pin3() { + cube([pin23_width,pin_thickness,pin_descent+0.05],false); + } + + module body() { + color([0.3,0.3,0.3]) + difference () { + union() { + translate([0,body_length/2,axis_height/2]) + cube([body_width,body_length,axis_height], true); + translate([0,body_length-body_front_lip/2,body_height/2]) + cube([body_width,body_front_lip,body_height], true); + translate([0,0,axis_height]) + rotate([-90,0,0]) + cylinder(r=body_width/2, h=body_length); + } + translate([0,body_front_lip,axis_height]) + rotate([-90,0,0]) + cylinder(r=opening /2, h=body_length); + } + color([0.8,0.8,0.8]) { + translate([0,-pin_thickness,axis_height]) + rotate([-90,0,0]) + cylinder(r=centre_pin_dia/2, h=body_length+pin_thickness); + translate([0,0,axis_height]) + rotate([90,0,0]) + cylinder(r=2, h=pin_thickness); + } + } + + rotate([0,0,-90]) + union() { + body(); + color([0.9, 0.9, 0.9]) { + translate([-pin1_width/2,-pin_thickness+0.01,-pin_descent]) + pin1(); + translate([-pin23_width/2,pin_spacing,-pin_descent]) + pin3(); + translate([-body_width/2,pin_spacing/2-pin23_width/2,-pin_descent]) + rotate([0,0,90]) + pin2(); + } + } +} + diff -Nru pcb-rnd-3.1.0/footprint/smd/01005.scad pcb-rnd-3.1.1/footprint/smd/01005.scad --- pcb-rnd-3.1.0/footprint/smd/01005.scad 2019-04-21 16:17:02.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/01005.scad 2023-05-11 10:57:00.000000000 +0000 @@ -1,5 +1,48 @@ -module part_01005(len=0.4, width=0.2, height=0.13, pad_len=0.1) +module part_01005(len=0.4, width=0.2, height=0.13, pad_len=0.1, fillet=0) { + module fillet() { + fillet_height = height/3; + fillet_width = pad_len/3; + overall_width = fillet_width + width; + overall_length = pad_len + fillet_width; + + translate([-pad_len/2,0,-height/2]) { + fillet_points = [ + [0,overall_width/2,0], // 0 + [overall_length,overall_width/2,0], // 1 + [overall_length,-overall_width/2,0], // 2 + [0,-overall_width/2,0], // 3 + [0,width/2+fillet_width/2,fillet_height/3], // 4 + [pad_len+fillet_width/2,width/2+fillet_width/2,fillet_height/3], // 5 + [pad_len+fillet_width/2,-width/2-fillet_width/2,fillet_height/3], // 6 + [0,-width/2-fillet_width/2,fillet_height/3], // 7 + [0,width/2+fillet_width/6,2*fillet_height/3], // 8 + [pad_len+fillet_width/6,width/2+fillet_width/6,2*fillet_height/3], // 9 + [pad_len+fillet_width/6,-width/2-fillet_width/6,2*fillet_height/3], // 10 + [0,-width/2-fillet_width/6,2*fillet_height/3], // 11 + [0,width/2,fillet_height], // 12 + [pad_len,width/2,fillet_height], // 13 + [pad_len,-width/2,fillet_height], // 14 + [0,-width/2,fillet_height]]; // 15 + + fillet_faces = [ + [0,4,8,12,15,11,7,3], // 0 + [0,1,5,4], // 1 + [1,2,6,5], // 2 + [7,6,2,3], // 3 + [4,5,9,8], // 4 + [5,6,10,9],// 5 + [10,6,7,11],// 6 + [8,9,13,12],// 7 + [9,10,14,13],// 8 + [15,14,10,11],// 9 + [12,13,14,15],// 10 + [3,2,1,0]];// 11 + + polyhedron(fillet_points, fillet_faces); + } + } + union() { translate([0,0,height/2]) { // body @@ -7,12 +50,17 @@ cube([len-2*pad_len,width,height], center=true); // terminals color([0.8,0.8,0.8]) { - translate([+len/2-pad_len/2, 0, 0]) - cube([pad_len, width, height], center=true); - } - color([0.8,0.8,0.8]) { - translate([-len/2+pad_len/2, 0, 0]) + translate([+len/2-pad_len/2, 0, 0]) { cube([pad_len, width, height], center=true); + if (fillet) + fillet(); + } + translate([-len/2+pad_len/2, 0, 0]) { + cube([pad_len, width, height], center=true); + if (fillet) + rotate([0,0,180]) + fillet(); + } } } } diff -Nru pcb-rnd-3.1.0/footprint/smd/0201.scad pcb-rnd-3.1.1/footprint/smd/0201.scad --- pcb-rnd-3.1.0/footprint/smd/0201.scad 2019-04-21 16:17:02.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/0201.scad 2023-05-11 10:57:00.000000000 +0000 @@ -1,5 +1,48 @@ -module part_0201(len=0.6, width=0.3, height=0.23, pad_len=0.15) +module part_0201(len=0.6, width=0.3, height=0.23, pad_len=0.15, fillet=0) { + module fillet() { + fillet_height = height/3; + fillet_width = pad_len/3; + overall_width = fillet_width + width; + overall_length = pad_len + fillet_width; + + translate([-pad_len/2,0,-height/2]) { + fillet_points = [ + [0,overall_width/2,0], // 0 + [overall_length,overall_width/2,0], // 1 + [overall_length,-overall_width/2,0], // 2 + [0,-overall_width/2,0], // 3 + [0,width/2+fillet_width/2,fillet_height/3], // 4 + [pad_len+fillet_width/2,width/2+fillet_width/2,fillet_height/3], // 5 + [pad_len+fillet_width/2,-width/2-fillet_width/2,fillet_height/3], // 6 + [0,-width/2-fillet_width/2,fillet_height/3], // 7 + [0,width/2+fillet_width/6,2*fillet_height/3], // 8 + [pad_len+fillet_width/6,width/2+fillet_width/6,2*fillet_height/3], // 9 + [pad_len+fillet_width/6,-width/2-fillet_width/6,2*fillet_height/3], // 10 + [0,-width/2-fillet_width/6,2*fillet_height/3], // 11 + [0,width/2,fillet_height], // 12 + [pad_len,width/2,fillet_height], // 13 + [pad_len,-width/2,fillet_height], // 14 + [0,-width/2,fillet_height]]; // 15 + + fillet_faces = [ + [0,4,8,12,15,11,7,3], // 0 + [0,1,5,4], // 1 + [1,2,6,5], // 2 + [7,6,2,3], // 3 + [4,5,9,8], // 4 + [5,6,10,9],// 5 + [10,6,7,11],// 6 + [8,9,13,12],// 7 + [9,10,14,13],// 8 + [15,14,10,11],// 9 + [12,13,14,15],// 10 + [3,2,1,0]];// 11 + + polyhedron(fillet_points, fillet_faces); + } + } + union() { translate([0,0,height/2]) { // body @@ -7,14 +50,18 @@ cube([len-2*pad_len,width,height], center=true); // terminals color([0.8,0.8,0.8]) { - translate([+len/2-pad_len/2, 0, 0]) - cube([pad_len, width, height], center=true); - } - color([0.8,0.8,0.8]) { - translate([-len/2+pad_len/2, 0, 0]) + translate([+len/2-pad_len/2, 0, 0]) { cube([pad_len, width, height], center=true); + if (fillet) + fillet(); + } + translate([-len/2+pad_len/2, 0, 0]) { + cube([pad_len, width, height], center=true); + if (fillet) + rotate([0,0,180]) + fillet(); + } } } } } - diff -Nru pcb-rnd-3.1.0/footprint/smd/0402.scad pcb-rnd-3.1.1/footprint/smd/0402.scad --- pcb-rnd-3.1.0/footprint/smd/0402.scad 2019-04-21 16:17:02.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/0402.scad 2023-05-11 10:57:00.000000000 +0000 @@ -1,5 +1,79 @@ -module part_0402(len=1.0, width=0.5, height=0.35, pad_len=0.25) +// Model for 0402 package +// +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// +module part_0402(len=1.0, width=0.5, height=0.35, pad_len=0.25, fillet=0) { + module fillet() { + fillet_height = height/3; + fillet_width = pad_len/3; + overall_width = fillet_width + width; + overall_length = pad_len + fillet_width; + + translate([-pad_len/2,0,-height/2]) { + fillet_points = [ + [0,overall_width/2,0], // 0 + [overall_length,overall_width/2,0], // 1 + [overall_length,-overall_width/2,0], // 2 + [0,-overall_width/2,0], // 3 + [0,width/2+fillet_width/2,fillet_height/3], // 4 + [pad_len+fillet_width/2,width/2+fillet_width/2,fillet_height/3], // 5 + [pad_len+fillet_width/2,-width/2-fillet_width/2,fillet_height/3], // 6 + [0,-width/2-fillet_width/2,fillet_height/3], // 7 + [0,width/2+fillet_width/6,2*fillet_height/3], // 8 + [pad_len+fillet_width/6,width/2+fillet_width/6,2*fillet_height/3], // 9 + [pad_len+fillet_width/6,-width/2-fillet_width/6,2*fillet_height/3], // 10 + [0,-width/2-fillet_width/6,2*fillet_height/3], // 11 + [0,width/2,fillet_height], // 12 + [pad_len,width/2,fillet_height], // 13 + [pad_len,-width/2,fillet_height], // 14 + [0,-width/2,fillet_height]]; // 15 + + fillet_faces = [ + [0,4,8,12,15,11,7,3], // 0 + [0,1,5,4], // 1 + [1,2,6,5], // 2 + [7,6,2,3], // 3 + [4,5,9,8], // 4 + [5,6,10,9],// 5 + [10,6,7,11],// 6 + [8,9,13,12],// 7 + [9,10,14,13],// 8 + [15,14,10,11],// 9 + [12,13,14,15],// 10 + [3,2,1,0]];// 11 + + polyhedron(fillet_points, fillet_faces); + } + } + union() { translate([0,0,height/2]) { // body @@ -7,14 +81,18 @@ cube([len-2*pad_len,width,height], center=true); // terminals color([0.8,0.8,0.8]) { - translate([+len/2-pad_len/2, 0, 0]) - cube([pad_len, width, height], center=true); - } - color([0.8,0.8,0.8]) { - translate([-len/2+pad_len/2, 0, 0]) + translate([+len/2-pad_len/2, 0, 0]) { cube([pad_len, width, height], center=true); + if (fillet) + fillet(); + } + translate([-len/2+pad_len/2, 0, 0]) { + cube([pad_len, width, height], center=true); + if (fillet) + rotate([0,0,180]) + fillet(); + } } } } } - diff -Nru pcb-rnd-3.1.0/footprint/smd/0603.scad pcb-rnd-3.1.1/footprint/smd/0603.scad --- pcb-rnd-3.1.0/footprint/smd/0603.scad 2019-04-21 16:17:02.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/0603.scad 2023-05-11 10:57:00.000000000 +0000 @@ -1,5 +1,80 @@ -module part_0603(len=1.6, width=0.8, height=0.45, pad_len=0.3) +// Model for 0603 package +// +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_0603(len=1.6, width=0.8, height=0.45, pad_len=0.3, fillet=0) { + module fillet() { + fillet_height = height/3; + fillet_width = pad_len/3; + overall_width = fillet_width + width; + overall_length = pad_len + fillet_width; + + translate([-pad_len/2,0,-height/2]) { + fillet_points = [ + [0,overall_width/2,0], // 0 + [overall_length,overall_width/2,0], // 1 + [overall_length,-overall_width/2,0], // 2 + [0,-overall_width/2,0], // 3 + [0,width/2+fillet_width/2,fillet_height/3], // 4 + [pad_len+fillet_width/2,width/2+fillet_width/2,fillet_height/3], // 5 + [pad_len+fillet_width/2,-width/2-fillet_width/2,fillet_height/3], // 6 + [0,-width/2-fillet_width/2,fillet_height/3], // 7 + [0,width/2+fillet_width/6,2*fillet_height/3], // 8 + [pad_len+fillet_width/6,width/2+fillet_width/6,2*fillet_height/3], // 9 + [pad_len+fillet_width/6,-width/2-fillet_width/6,2*fillet_height/3], // 10 + [0,-width/2-fillet_width/6,2*fillet_height/3], // 11 + [0,width/2,fillet_height], // 12 + [pad_len,width/2,fillet_height], // 13 + [pad_len,-width/2,fillet_height], // 14 + [0,-width/2,fillet_height]]; // 15 + + fillet_faces = [ + [0,4,8,12,15,11,7,3], // 0 + [0,1,5,4], // 1 + [1,2,6,5], // 2 + [7,6,2,3], // 3 + [4,5,9,8], // 4 + [5,6,10,9],// 5 + [10,6,7,11],// 6 + [8,9,13,12],// 7 + [9,10,14,13],// 8 + [15,14,10,11],// 9 + [12,13,14,15],// 10 + [3,2,1,0]];// 11 + + polyhedron(fillet_points, fillet_faces); + } + } + union() { translate([0,0,height/2]) { // body @@ -7,14 +82,18 @@ cube([len-2*pad_len,width,height], center=true); // terminals color([0.8,0.8,0.8]) { - translate([+len/2-pad_len/2, 0, 0]) - cube([pad_len, width, height], center=true); - } - color([0.8,0.8,0.8]) { - translate([-len/2+pad_len/2, 0, 0]) + translate([+len/2-pad_len/2, 0, 0]) { cube([pad_len, width, height], center=true); + if (fillet) + fillet(); + } + translate([-len/2+pad_len/2, 0, 0]) { + cube([pad_len, width, height], center=true); + if (fillet) + rotate([0,0,180]) + fillet(); + } } } } } - diff -Nru pcb-rnd-3.1.0/footprint/smd/0805.scad pcb-rnd-3.1.1/footprint/smd/0805.scad --- pcb-rnd-3.1.0/footprint/smd/0805.scad 2019-04-21 16:17:02.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/0805.scad 2023-05-11 10:57:00.000000000 +0000 @@ -1,5 +1,80 @@ -module part_0805(len=2, width=1.2, height=0.5, pad_len=0.4) +// Model for 0805 package +// +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_0805(len=2, width=1.2, height=0.5, pad_len=0.4, fillet=0) { + module fillet() { + fillet_height = height/3; + fillet_width = pad_len/3; + overall_width = fillet_width + width; + overall_length = pad_len + fillet_width; + + translate([-pad_len/2,0,-height/2]) { + fillet_points = [ + [0,overall_width/2,0], // 0 + [overall_length,overall_width/2,0], // 1 + [overall_length,-overall_width/2,0], // 2 + [0,-overall_width/2,0], // 3 + [0,width/2+fillet_width/2,fillet_height/3], // 4 + [pad_len+fillet_width/2,width/2+fillet_width/2,fillet_height/3], // 5 + [pad_len+fillet_width/2,-width/2-fillet_width/2,fillet_height/3], // 6 + [0,-width/2-fillet_width/2,fillet_height/3], // 7 + [0,width/2+fillet_width/6,2*fillet_height/3], // 8 + [pad_len+fillet_width/6,width/2+fillet_width/6,2*fillet_height/3], // 9 + [pad_len+fillet_width/6,-width/2-fillet_width/6,2*fillet_height/3], // 10 + [0,-width/2-fillet_width/6,2*fillet_height/3], // 11 + [0,width/2,fillet_height], // 12 + [pad_len,width/2,fillet_height], // 13 + [pad_len,-width/2,fillet_height], // 14 + [0,-width/2,fillet_height]]; // 15 + + fillet_faces = [ + [0,4,8,12,15,11,7,3], // 0 + [0,1,5,4], // 1 + [1,2,6,5], // 2 + [7,6,2,3], // 3 + [4,5,9,8], // 4 + [5,6,10,9],// 5 + [10,6,7,11],// 6 + [8,9,13,12],// 7 + [9,10,14,13],// 8 + [15,14,10,11],// 9 + [12,13,14,15],// 10 + [3,2,1,0]];// 11 + + polyhedron(fillet_points, fillet_faces); + } + } + union() { translate([0,0,height/2]) { // body @@ -7,12 +82,17 @@ cube([len-2*pad_len,width,height], center=true); // terminals color([0.8,0.8,0.8]) { - translate([+len/2-pad_len/2, 0, 0]) - cube([pad_len, width, height], center=true); - } - color([0.8,0.8,0.8]) { - translate([-len/2+pad_len/2, 0, 0]) + translate([+len/2-pad_len/2, 0, 0]) { cube([pad_len, width, height], center=true); + if (fillet) + fillet(); + } + translate([-len/2+pad_len/2, 0, 0]) { + cube([pad_len, width, height], center=true); + if (fillet) + rotate([0,0,180]) + fillet(); + } } } } diff -Nru pcb-rnd-3.1.0/footprint/smd/1008.fp pcb-rnd-3.1.1/footprint/smd/1008.fp --- pcb-rnd-3.1.0/footprint/smd/1008.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/1008.fp 2023-05-06 10:19:42.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = 1008 Standard SMT resistor, capacitor etc + openscad = 1008.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/smd/1008.scad pcb-rnd-3.1.1/footprint/smd/1008.scad --- pcb-rnd-3.1.0/footprint/smd/1008.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/1008.scad 2023-05-11 10:57:00.000000000 +0000 @@ -0,0 +1,112 @@ +// Model for 1008 package +// +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_1008(body_len=2.5, width=2.0, height=2.0, pad_len=0.5, pad_width=1.4, pad_height=1.8, fillet=0) +{ + module fillet() { + fillet_height = pad_height/3; + fillet_width = pad_len/3; + overall_width = fillet_width + pad_width; + overall_length = pad_len + fillet_width; + + translate([-pad_len/2,0,-pad_height/2]) { + fillet_points = [ + [0,overall_width/2,0], // 0 + [overall_length,overall_width/2,0], // 1 + [overall_length,-overall_width/2,0], // 2 + [0,-overall_width/2,0], // 3 + [0,pad_width/2+fillet_width/2,fillet_height/3], // 4 + [pad_len+fillet_width/2,pad_width/2+fillet_width/2,fillet_height/3], // 5 + [pad_len+fillet_width/2,-pad_width/2-fillet_width/2,fillet_height/3], // 6 + [0,-pad_width/2-fillet_width/2,fillet_height/3], // 7 + [0,pad_width/2+fillet_width/6,2*fillet_height/3], // 8 + [pad_len+fillet_width/6,pad_width/2+fillet_width/6,2*fillet_height/3], // 9 + [pad_len+fillet_width/6,-pad_width/2-fillet_width/6,2*fillet_height/3], // 10 + [0,-pad_width/2-fillet_width/6,2*fillet_height/3], // 11 + [0,pad_width/2,fillet_height], // 12 + [pad_len,pad_width/2,fillet_height], // 13 + [pad_len,-pad_width/2,fillet_height], // 14 + [0,-pad_width/2,fillet_height]]; // 15 + + fillet_faces = [ + [0,4,8,12,15,11,7,3], // 0 + [0,1,5,4], // 1 + [1,2,6,5], // 2 + [7,6,2,3], // 3 + [4,5,9,8], // 4 + [5,6,10,9],// 5 + [10,6,7,11],// 6 + [8,9,13,12],// 7 + [9,10,14,13],// 8 + [15,14,10,11],// 9 + [12,13,14,15],// 10 + [3,2,1,0]];// 11 + + polyhedron(fillet_points, fillet_faces); + } + } + + union() { + translate([0,0,height/2+(height-pad_height)]) { + // body + color([0.1,0.1,0.1]) + cube([body_len-pad_len,width,height], center=true); + } + + translate([0,0,pad_height/2]) { + // terminals + color([0.8,0.8,0.8]) { + translate([+body_len/2-pad_len/2, 0, 0]) + cube([pad_len, pad_width, pad_height], center=true); + translate([-body_len/2+pad_len/2, 0, 0]) + cube([pad_len, pad_width, pad_height], center=true); + } + } + + translate([0,0,pad_height/2]) { + // terminals + color([0.8,0.8,0.8]) { + translate([+body_len/2-pad_len/2, 0, 0]) { + cube([pad_len, pad_width, pad_height], center=true); + if (fillet) + fillet(); + } + translate([-body_len/2+pad_len/2, 0, 0]) { + cube([pad_len, pad_width, pad_height], center=true); + if (fillet) + rotate([0,0,180]) + fillet(); + } + } + } + } +} diff -Nru pcb-rnd-3.1.0/footprint/smd/1206.scad pcb-rnd-3.1.1/footprint/smd/1206.scad --- pcb-rnd-3.1.0/footprint/smd/1206.scad 2019-04-21 16:17:02.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/1206.scad 2023-05-11 10:57:00.000000000 +0000 @@ -1,5 +1,80 @@ -module part_1206(len=3.2, width=1.6, height=0.6, pad_len=0.5) +// Model for 1206 package +// +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_1206(len=3.2, width=1.6, height=0.6, pad_len=0.5,fillet=0) { + module fillet() { + fillet_height = height/3; + fillet_width = pad_len/3; + overall_width = fillet_width + width; + overall_length = pad_len + fillet_width; + + translate([-pad_len/2,0,-height/2]) { + fillet_points = [ + [0,overall_width/2,0], // 0 + [overall_length,overall_width/2,0], // 1 + [overall_length,-overall_width/2,0], // 2 + [0,-overall_width/2,0], // 3 + [0,width/2+fillet_width/2,fillet_height/3], // 4 + [pad_len+fillet_width/2,width/2+fillet_width/2,fillet_height/3], // 5 + [pad_len+fillet_width/2,-width/2-fillet_width/2,fillet_height/3], // 6 + [0,-width/2-fillet_width/2,fillet_height/3], // 7 + [0,width/2+fillet_width/6,2*fillet_height/3], // 8 + [pad_len+fillet_width/6,width/2+fillet_width/6,2*fillet_height/3], // 9 + [pad_len+fillet_width/6,-width/2-fillet_width/6,2*fillet_height/3], // 10 + [0,-width/2-fillet_width/6,2*fillet_height/3], // 11 + [0,width/2,fillet_height], // 12 + [pad_len,width/2,fillet_height], // 13 + [pad_len,-width/2,fillet_height], // 14 + [0,-width/2,fillet_height]]; // 15 + + fillet_faces = [ + [0,4,8,12,15,11,7,3], // 0 + [0,1,5,4], // 1 + [1,2,6,5], // 2 + [7,6,2,3], // 3 + [4,5,9,8], // 4 + [5,6,10,9],// 5 + [10,6,7,11],// 6 + [8,9,13,12],// 7 + [9,10,14,13],// 8 + [15,14,10,11],// 9 + [12,13,14,15],// 10 + [3,2,1,0]];// 11 + + polyhedron(fillet_points, fillet_faces); + } + } + union() { translate([0,0,height/2]) { // body @@ -7,14 +82,18 @@ cube([len-2*pad_len,width,height], center=true); // terminals color([0.8,0.8,0.8]) { - translate([+len/2-pad_len/2, 0, 0]) - cube([pad_len, width, height], center=true); - } - color([0.8,0.8,0.8]) { - translate([-len/2+pad_len/2, 0, 0]) + translate([+len/2-pad_len/2, 0, 0]) { cube([pad_len, width, height], center=true); + if (fillet) + fillet(); + } + translate([-len/2+pad_len/2, 0, 0]) { + cube([pad_len, width, height], center=true); + if (fillet) + rotate([0,0,180]) + fillet(); + } } } } } - diff -Nru pcb-rnd-3.1.0/footprint/smd/1210.fp pcb-rnd-3.1.1/footprint/smd/1210.fp --- pcb-rnd-3.1.0/footprint/smd/1210.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/1210.fp 2023-05-06 10:20:18.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = 1210 Standard SMT resistor, capacitor etc + openscad = 1210.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/smd/1210.scad pcb-rnd-3.1.1/footprint/smd/1210.scad --- pcb-rnd-3.1.0/footprint/smd/1210.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/1210.scad 2023-05-11 10:57:00.000000000 +0000 @@ -0,0 +1,99 @@ +// Model for 1210 package +// +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_1210(len=3.2, width=2.55, height=1.3, pad_len=0.5, fillet=0) +{ + module fillet() { + fillet_height = height/3; + fillet_width = pad_len/3; + overall_width = fillet_width + width; + overall_length = pad_len + fillet_width; + + translate([-pad_len/2,0,-height/2]) { + fillet_points = [ + [0,overall_width/2,0], // 0 + [overall_length,overall_width/2,0], // 1 + [overall_length,-overall_width/2,0], // 2 + [0,-overall_width/2,0], // 3 + [0,width/2+fillet_width/2,fillet_height/3], // 4 + [pad_len+fillet_width/2,width/2+fillet_width/2,fillet_height/3], // 5 + [pad_len+fillet_width/2,-width/2-fillet_width/2,fillet_height/3], // 6 + [0,-width/2-fillet_width/2,fillet_height/3], // 7 + [0,width/2+fillet_width/6,2*fillet_height/3], // 8 + [pad_len+fillet_width/6,width/2+fillet_width/6,2*fillet_height/3], // 9 + [pad_len+fillet_width/6,-width/2-fillet_width/6,2*fillet_height/3], // 10 + [0,-width/2-fillet_width/6,2*fillet_height/3], // 11 + [0,width/2,fillet_height], // 12 + [pad_len,width/2,fillet_height], // 13 + [pad_len,-width/2,fillet_height], // 14 + [0,-width/2,fillet_height]]; // 15 + + fillet_faces = [ + [0,4,8,12,15,11,7,3], // 0 + [0,1,5,4], // 1 + [1,2,6,5], // 2 + [7,6,2,3], // 3 + [4,5,9,8], // 4 + [5,6,10,9],// 5 + [10,6,7,11],// 6 + [8,9,13,12],// 7 + [9,10,14,13],// 8 + [15,14,10,11],// 9 + [12,13,14,15],// 10 + [3,2,1,0]];// 11 + + polyhedron(fillet_points, fillet_faces); + } + } + + union() { + translate([0,0,height/2]) { + // body + color([0.1,0.1,0.1]) + cube([len-2*pad_len,width,height], center=true); + // terminals + color([0.8,0.8,0.8]) { + translate([+len/2-pad_len/2, 0, 0]) { + cube([pad_len, width, height], center=true); + if (fillet) + fillet(); + } + translate([-len/2+pad_len/2, 0, 0]) { + cube([pad_len, width, height], center=true); + if (fillet) + rotate([0,0,180]) + fillet(); + } + } + } + } +} diff -Nru pcb-rnd-3.1.0/footprint/smd/1806.fp pcb-rnd-3.1.1/footprint/smd/1806.fp --- pcb-rnd-3.1.0/footprint/smd/1806.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/1806.fp 2023-05-06 10:20:43.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = 1806 Standard SMT resistor, capacitor etc + openscad = 1806.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/smd/1806.scad pcb-rnd-3.1.1/footprint/smd/1806.scad --- pcb-rnd-3.1.0/footprint/smd/1806.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/1806.scad 2023-05-11 10:57:00.000000000 +0000 @@ -0,0 +1,99 @@ +// Model for 1806 package +// +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_1806(len=4.5, width=1.6, height=1.6, pad_len=0.5, fillet=0) +{ + module fillet() { + fillet_height = height/3; + fillet_width = pad_len/3; + overall_width = fillet_width + width; + overall_length = pad_len + fillet_width; + + translate([-pad_len/2,0,-height/2]) { + fillet_points = [ + [0,overall_width/2,0], // 0 + [overall_length,overall_width/2,0], // 1 + [overall_length,-overall_width/2,0], // 2 + [0,-overall_width/2,0], // 3 + [0,width/2+fillet_width/2,fillet_height/3], // 4 + [pad_len+fillet_width/2,width/2+fillet_width/2,fillet_height/3], // 5 + [pad_len+fillet_width/2,-width/2-fillet_width/2,fillet_height/3], // 6 + [0,-width/2-fillet_width/2,fillet_height/3], // 7 + [0,width/2+fillet_width/6,2*fillet_height/3], // 8 + [pad_len+fillet_width/6,width/2+fillet_width/6,2*fillet_height/3], // 9 + [pad_len+fillet_width/6,-width/2-fillet_width/6,2*fillet_height/3], // 10 + [0,-width/2-fillet_width/6,2*fillet_height/3], // 11 + [0,width/2,fillet_height], // 12 + [pad_len,width/2,fillet_height], // 13 + [pad_len,-width/2,fillet_height], // 14 + [0,-width/2,fillet_height]]; // 15 + + fillet_faces = [ + [0,4,8,12,15,11,7,3], // 0 + [0,1,5,4], // 1 + [1,2,6,5], // 2 + [7,6,2,3], // 3 + [4,5,9,8], // 4 + [5,6,10,9],// 5 + [10,6,7,11],// 6 + [8,9,13,12],// 7 + [9,10,14,13],// 8 + [15,14,10,11],// 9 + [12,13,14,15],// 10 + [3,2,1,0]];// 11 + + polyhedron(fillet_points, fillet_faces); + } + } + + union() { + translate([0,0,height/2]) { + // body + color([0.1,0.1,0.1]) + cube([len-2*pad_len,width,height], center=true); + // terminals + color([0.8,0.8,0.8]) { + translate([+len/2-pad_len/2, 0, 0]) { + cube([pad_len, width, height], center=true); + if (fillet) + fillet(); + } + translate([-len/2+pad_len/2, 0, 0]) { + cube([pad_len, width, height], center=true); + if (fillet) + rotate([0,0,180]) + fillet(); + } + } + } + } +} diff -Nru pcb-rnd-3.1.0/footprint/smd/1825.fp pcb-rnd-3.1.1/footprint/smd/1825.fp --- pcb-rnd-3.1.0/footprint/smd/1825.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/1825.fp 2023-05-06 10:21:12.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = 1825 Standard SMT resistor, capacitor etc + openscad = 1825.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/smd/1825.scad pcb-rnd-3.1.1/footprint/smd/1825.scad --- pcb-rnd-3.1.0/footprint/smd/1825.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/1825.scad 2023-05-11 10:57:00.000000000 +0000 @@ -0,0 +1,99 @@ +// Model for 1825 package +// +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_1825(len=4.5, width=6.4, height=1.6, pad_len=0.6, fillet=0) +{ + module fillet() { + fillet_height = height/3; + fillet_width = pad_len/3; + overall_width = fillet_width + width; + overall_length = pad_len + fillet_width; + + translate([-pad_len/2,0,-height/2]) { + fillet_points = [ + [0,overall_width/2,0], // 0 + [overall_length,overall_width/2,0], // 1 + [overall_length,-overall_width/2,0], // 2 + [0,-overall_width/2,0], // 3 + [0,width/2+fillet_width/2,fillet_height/3], // 4 + [pad_len+fillet_width/2,width/2+fillet_width/2,fillet_height/3], // 5 + [pad_len+fillet_width/2,-width/2-fillet_width/2,fillet_height/3], // 6 + [0,-width/2-fillet_width/2,fillet_height/3], // 7 + [0,width/2+fillet_width/6,2*fillet_height/3], // 8 + [pad_len+fillet_width/6,width/2+fillet_width/6,2*fillet_height/3], // 9 + [pad_len+fillet_width/6,-width/2-fillet_width/6,2*fillet_height/3], // 10 + [0,-width/2-fillet_width/6,2*fillet_height/3], // 11 + [0,width/2,fillet_height], // 12 + [pad_len,width/2,fillet_height], // 13 + [pad_len,-width/2,fillet_height], // 14 + [0,-width/2,fillet_height]]; // 15 + + fillet_faces = [ + [0,4,8,12,15,11,7,3], // 0 + [0,1,5,4], // 1 + [1,2,6,5], // 2 + [7,6,2,3], // 3 + [4,5,9,8], // 4 + [5,6,10,9],// 5 + [10,6,7,11],// 6 + [8,9,13,12],// 7 + [9,10,14,13],// 8 + [15,14,10,11],// 9 + [12,13,14,15],// 10 + [3,2,1,0]];// 11 + + polyhedron(fillet_points, fillet_faces); + } + } + + union() { + translate([0,0,height/2]) { + // body + color([0.1,0.1,0.1]) + cube([len-2*pad_len,width,height], center=true); + // terminals + color([0.8,0.8,0.8]) { + translate([+len/2-pad_len/2, 0, 0]) { + cube([pad_len, width, height], center=true); + if (fillet) + fillet(); + } + translate([-len/2+pad_len/2, 0, 0]) { + cube([pad_len, width, height], center=true); + if (fillet) + rotate([0,0,180]) + fillet(); + } + } + } + } +} diff -Nru pcb-rnd-3.1.0/footprint/smd/2706.fp pcb-rnd-3.1.1/footprint/smd/2706.fp --- pcb-rnd-3.1.0/footprint/smd/2706.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/2706.fp 2023-05-06 10:29:28.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = 2706 Standard SMT resistor, capacitor etc + openscad = 2706.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/smd/2706.scad pcb-rnd-3.1.1/footprint/smd/2706.scad --- pcb-rnd-3.1.0/footprint/smd/2706.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/2706.scad 2023-05-11 10:57:00.000000000 +0000 @@ -0,0 +1,99 @@ +// Model for 2706 package +// +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_2706(len=6.8, width=1.6, height=1.6, pad_len=0.7, fillet=0) +{ + module fillet() { + fillet_height = height/3; + fillet_width = pad_len/3; + overall_width = fillet_width + width; + overall_length = pad_len + fillet_width; + + translate([-pad_len/2,0,-height/2]) { + fillet_points = [ + [0,overall_width/2,0], // 0 + [overall_length,overall_width/2,0], // 1 + [overall_length,-overall_width/2,0], // 2 + [0,-overall_width/2,0], // 3 + [0,width/2+fillet_width/2,fillet_height/3], // 4 + [pad_len+fillet_width/2,width/2+fillet_width/2,fillet_height/3], // 5 + [pad_len+fillet_width/2,-width/2-fillet_width/2,fillet_height/3], // 6 + [0,-width/2-fillet_width/2,fillet_height/3], // 7 + [0,width/2+fillet_width/6,2*fillet_height/3], // 8 + [pad_len+fillet_width/6,width/2+fillet_width/6,2*fillet_height/3], // 9 + [pad_len+fillet_width/6,-width/2-fillet_width/6,2*fillet_height/3], // 10 + [0,-width/2-fillet_width/6,2*fillet_height/3], // 11 + [0,width/2,fillet_height], // 12 + [pad_len,width/2,fillet_height], // 13 + [pad_len,-width/2,fillet_height], // 14 + [0,-width/2,fillet_height]]; // 15 + + fillet_faces = [ + [0,4,8,12,15,11,7,3], // 0 + [0,1,5,4], // 1 + [1,2,6,5], // 2 + [7,6,2,3], // 3 + [4,5,9,8], // 4 + [5,6,10,9],// 5 + [10,6,7,11],// 6 + [8,9,13,12],// 7 + [9,10,14,13],// 8 + [15,14,10,11],// 9 + [12,13,14,15],// 10 + [3,2,1,0]];// 11 + + polyhedron(fillet_points, fillet_faces); + } + } + + union() { + translate([0,0,height/2]) { + // body + color([0.1,0.1,0.1]) + cube([len-2*pad_len,width,height], center=true); + // terminals + color([0.8,0.8,0.8]) { + translate([+len/2-pad_len/2, 0, 0]) { + cube([pad_len, width, height], center=true); + if (fillet) + fillet(); + } + translate([-len/2+pad_len/2, 0, 0]) { + cube([pad_len, width, height], center=true); + if (fillet) + rotate([0,0,180]) + fillet(); + } + } + } + } +} diff -Nru pcb-rnd-3.1.0/footprint/smd/DO214.fp pcb-rnd-3.1.1/footprint/smd/DO214.fp --- pcb-rnd-3.1.0/footprint/smd/DO214.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/DO214.fp 2023-05-07 05:02:54.000000000 +0000 @@ -2,6 +2,8 @@ ha:subc.5 { ha:attributes { footprint = DO214 SMT diode (pin 1 is cathode) + openscad-param="AB" + openscad = DO214.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/smd/DO214.scad pcb-rnd-3.1.1/footprint/smd/DO214.scad --- pcb-rnd-3.1.0/footprint/smd/DO214.scad 2020-09-13 05:02:03.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/DO214.scad 2023-05-12 15:12:37.000000000 +0000 @@ -30,12 +30,54 @@ // in any way. // -module part_do214 (var) +module part_do214 (var, fillet=0) { + module fillet(pad_len=Tl-L, pad_width=Tw, pad_height= H/4) { + fillet_height = pad_height/3; + fillet_width = pad_len/3; + overall_width = fillet_width + pad_width; + overall_length = pad_len + fillet_width; + + translate([-pad_len/2,0,0]) { + fillet_points = [ + [0,overall_width/2,0], // 0 + [overall_length,overall_width/2,0], // 1 + [overall_length,-overall_width/2,0], // 2 + [0,-overall_width/2,0], // 3 + [0,pad_width/2+fillet_width/2,fillet_height/3], // 4 + [pad_len+fillet_width/2,pad_width/2+fillet_width/2,fillet_height/3], // 5 + [pad_len+fillet_width/2,-pad_width/2-fillet_width/2,fillet_height/3], // 6 + [0,-pad_width/2-fillet_width/2,fillet_height/3], // 7 + [0,pad_width/2+fillet_width/6,2*fillet_height/3], // 8 + [pad_len+fillet_width/6,pad_width/2+fillet_width/6,2*fillet_height/3], // 9 + [pad_len+fillet_width/6,-pad_width/2-fillet_width/6,2*fillet_height/3], // 10 + [0,-pad_width/2-fillet_width/6,2*fillet_height/3], // 11 + [0,pad_width/2,fillet_height], // 12 + [pad_len,pad_width/2,fillet_height], // 13 + [pad_len,-pad_width/2,fillet_height], // 14 + [0,-pad_width/2,fillet_height]]; // 15 + + fillet_faces = [ + [0,4,8,12,15,11,7,3], // 0 + [0,1,5,4], // 1 + [1,2,6,5], // 2 + [7,6,2,3], // 3 + [4,5,9,8], // 4 + [5,6,10,9],// 5 + [10,6,7,11],// 6 + [8,9,13,12],// 7 + [9,10,14,13],// 8 + [15,14,10,11],// 9 + [12,13,14,15],// 10 + [3,2,1,0]];// 11 + + polyhedron(fillet_points, fillet_faces); + } + } + module impl (L, W, H, P, Tw, Th) { delta = 1e-3 ; - $fn = 30 ; module lead (P, Tw, Th) color ([0.9, 0.9, 0.9]) @@ -88,6 +130,17 @@ translate ([L/2+P, 0, 0]) mirror ([1, 0, 0]) lead (P, Tw, Th) ; + + if (fillet) { + color ([0.8, 0.8, 0.8]) { + translate ([L/2+P/2, 0, 0]) + fillet(pad_len=P, pad_width=Tw, pad_height= H/4); + translate ([-L/2-P/2, 0, 0]) + rotate([0,0,180]) + fillet(pad_len=P, pad_width=Tw, pad_height= H/4); + } + } + } variants = [ "AA", "AB", "AC" ] ; @@ -102,3 +155,4 @@ impl (L[idx], W[idx], H[idx], (Tl[idx]-L[idx]) / 2, Tw[idx], H[idx]/2) ; } + diff -Nru pcb-rnd-3.1.0/footprint/smd/minimelf.fp pcb-rnd-3.1.1/footprint/smd/minimelf.fp --- pcb-rnd-3.1.0/footprint/smd/minimelf.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/minimelf.fp 2023-05-06 15:29:50.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = minimelf + openscad = SOD80.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/smd/MPAK.fp pcb-rnd-3.1.1/footprint/smd/MPAK.fp --- pcb-rnd-3.1.0/footprint/smd/MPAK.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/MPAK.fp 2023-05-06 16:29:28.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = MPAK + openscad = MPAK.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/smd/MPAK.scad pcb-rnd-3.1.1/footprint/smd/MPAK.scad --- pcb-rnd-3.1.0/footprint/smd/MPAK.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/MPAK.scad 2023-05-12 15:36:01.000000000 +0000 @@ -0,0 +1,130 @@ +// Model for MPAK package +// +// Copyright (C) 2017,2020 Tibor 'Igor2' Palinkas +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_mpak(fillet=0) +{ + + module fillet(pad_width=0.45, pad_len=1.1, pad_height= 0.2) { + fillet_height = pad_height/3; + fillet_width = pad_len/3; + overall_width = fillet_width + pad_width; + overall_length = pad_len + fillet_width; + + translate([-pad_len/2,0,0]) { + fillet_points = [ + [0,overall_width/2,0], // 0 + [overall_length,overall_width/2,0], // 1 + [overall_length,-overall_width/2,0], // 2 + [0,-overall_width/2,0], // 3 + [0,pad_width/2+fillet_width/2,fillet_height/3], // 4 + [pad_len+fillet_width/2,pad_width/2+fillet_width/2,fillet_height/3], // 5 + [pad_len+fillet_width/2,-pad_width/2-fillet_width/2,fillet_height/3], // 6 + [0,-pad_width/2-fillet_width/2,fillet_height/3], // 7 + [0,pad_width/2+fillet_width/6,2*fillet_height/3], // 8 + [pad_len+fillet_width/6,pad_width/2+fillet_width/6,2*fillet_height/3], // 9 + [pad_len+fillet_width/6,-pad_width/2-fillet_width/6,2*fillet_height/3], // 10 + [0,-pad_width/2-fillet_width/6,2*fillet_height/3], // 11 + [0,pad_width/2,fillet_height], // 12 + [pad_len,pad_width/2,fillet_height], // 13 + [pad_len,-pad_width/2,fillet_height], // 14 + [0,-pad_width/2,fillet_height]]; // 15 + + fillet_faces = [ + [0,4,8,12,15,11,7,3], // 0 + [0,1,5,4], // 1 + [1,2,6,5], // 2 + [7,6,2,3], // 3 + [4,5,9,8], // 4 + [5,6,10,9],// 5 + [10,6,7,11],// 6 + [8,9,13,12],// 7 + [9,10,14,13],// 8 + [15,14,10,11],// 9 + [12,13,14,15],// 10 + [3,2,1,0]];// 11 + + polyhedron(fillet_points, fillet_faces); + } + } + + module mpak_() + { + // pin prototype + module pin(length, height, thick) + { + linear_extrude(height=thick) + scale([length, -2*height, 1]) + polygon([[0.3400,0.0000],[0.3900,0.0100],[0.4300,0.0300],[0.4600,0.0600],[0.4789,0.0908],[0.6279,0.8307],[0.6500,0.8600],[0.6900,0.8900],[0.7300,0.9000],[1.0000,0.9000],[1.0000,1.0000],[0.6700,1.0012],[0.6100,0.9900],[0.5600,0.9600],[0.5300,0.9200],[0.5200,0.9000],[0.3721,0.1693],[0.3500,0.1400],[0.3100,0.1100],[0.2700,0.1000],[0.0000,0.1000],[0.0000,0.0000]]); + } + + rotate([90,0,-90]) scale([1.0,1.0,1.0])translate([-5.6, 0.4, - 6.35 + 1.25]) { + // body + color([0.1,0.1,0.1]) + linear_extrude(height=6.35) + polygon([[-4.2,0.25],[-4.2,4.0],[4.2,4.0],[4.2,0.25]]); + + color([0.9, 0.9, 0.9]) { + translate([3.6,2.0,1.27-0.45/2]) + pin(2.6, 1.2, 0.45); + translate([3.6,2.0,2.54-0.45/2]) + pin(2.6, 1.2, 0.45); + translate([3.6,2.0,3.81-0.45/2]) + pin(2.6, 1.2, 0.45); + translate([3.6,2.0,5.08-0.45/2]) + pin(2.6, 1.2, 0.45); + translate([-3.6,2.0,3.17-3.18/2]) + pin(-2.6, 1.2, 3.18); + } + } + } + + if (fillet) { + color([0.9, 0.9, 0.9]) { + fillet(); + translate([0,1.28,0]) + fillet(); + translate([0,2.56,0]) + fillet(); + translate([0,3.83,0]) + fillet(); + translate([-11.3,1.95,0]) + rotate([0,0,180]) + fillet(3.2); + } + } + + // match rotation with stock footprint's + rotate([0,0,90]) + mpak_(); +} + diff -Nru pcb-rnd-3.1.0/footprint/smd/SC70_3.fp pcb-rnd-3.1.1/footprint/smd/SC70_3.fp --- pcb-rnd-3.1.0/footprint/smd/SC70_3.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/SC70_3.fp 2023-05-06 15:19:59.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = SC70_3 SMT transistor, 3 pins + openscad = SOT323.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/smd/SC70_4.fp pcb-rnd-3.1.1/footprint/smd/SC70_4.fp --- pcb-rnd-3.1.0/footprint/smd/SC70_4.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/SC70_4.fp 2023-05-06 15:20:54.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = SC70_4 SMT transistor, 4 pins + openscad = SC70_4.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/smd/SC70_4.scad pcb-rnd-3.1.1/footprint/smd/SC70_4.scad --- pcb-rnd-3.1.0/footprint/smd/SC70_4.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/SC70_4.scad 2023-05-12 15:36:01.000000000 +0000 @@ -0,0 +1,129 @@ +// Model for SC70-4 package +// +// Copyright (C) 2017,2020 Tibor 'Igor2' Palinkas +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_sc70_4(fillet=0) +{ + + module fillet(pad_len=0.3, pad_width=0.3, pad_height= 0.2) { + fillet_height = pad_height/3; + fillet_width = pad_len/3; + overall_width = fillet_width + pad_width; + overall_length = pad_len + fillet_width; + + translate([-pad_len/2,0,0]) { + fillet_points = [ + [0,overall_width/2,0], // 0 + [overall_length,overall_width/2,0], // 1 + [overall_length,-overall_width/2,0], // 2 + [0,-overall_width/2,0], // 3 + [0,pad_width/2+fillet_width/2,fillet_height/3], // 4 + [pad_len+fillet_width/2,pad_width/2+fillet_width/2,fillet_height/3], // 5 + [pad_len+fillet_width/2,-pad_width/2-fillet_width/2,fillet_height/3], // 6 + [0,-pad_width/2-fillet_width/2,fillet_height/3], // 7 + [0,pad_width/2+fillet_width/6,2*fillet_height/3], // 8 + [pad_len+fillet_width/6,pad_width/2+fillet_width/6,2*fillet_height/3], // 9 + [pad_len+fillet_width/6,-pad_width/2-fillet_width/6,2*fillet_height/3], // 10 + [0,-pad_width/2-fillet_width/6,2*fillet_height/3], // 11 + [0,pad_width/2,fillet_height], // 12 + [pad_len,pad_width/2,fillet_height], // 13 + [pad_len,-pad_width/2,fillet_height], // 14 + [0,-pad_width/2,fillet_height]]; // 15 + + fillet_faces = [ + [0,4,8,12,15,11,7,3], // 0 + [0,1,5,4], // 1 + [1,2,6,5], // 2 + [7,6,2,3], // 3 + [4,5,9,8], // 4 + [5,6,10,9],// 5 + [10,6,7,11],// 6 + [8,9,13,12],// 7 + [9,10,14,13],// 8 + [15,14,10,11],// 9 + [12,13,14,15],// 10 + [3,2,1,0]];// 11 + + polyhedron(fillet_points, fillet_faces); + } + } + + module sc70_4_() + { + // pin prototype + module pin(length, height, thick) + { + linear_extrude(height=thick) + scale([length, -2*height, 1]) + polygon([[0.3400,0.0000],[0.3900,0.0100],[0.4300,0.0300],[0.4600,0.0600],[0.4789,0.0908],[0.6279,0.8307],[0.6500,0.8600],[0.6900,0.8900],[0.7300,0.9000],[1.0000,0.9000],[1.0000,1.0000],[0.6700,1.0012],[0.6100,0.9900],[0.5600,0.9600],[0.5300,0.9200],[0.5200,0.9000],[0.3721,0.1693],[0.3500,0.1400],[0.3100,0.1100],[0.2700,0.1000],[0.0000,0.1000],[0.0000,0.0000]]); + } + + rotate([90,0,-90]) scale([1.13,1.13,1.0]) translate([-0.9, 0.4, -2.0 + 0.35]) { + // body + color([0.1,0.1,0.1]) + linear_extrude(height=2.0) + polygon([[-0.55,0.18],[-0.50,0.53],[0.50,0.53],[0.55,0.18],[0.45,-0.35],[-0.45,-0.35]]); + + // 3 pins + color([0.9, 0.9, 0.9]) { + translate([0.43,0.4,0.35-0.3/2]) + pin(0.6, 0.4, 0.4); + translate([0.43,0.4,1.65-0.3/2]) + pin(0.6, 0.4, 0.3); + + translate([-0.43,0.4,0.35-0.3/2]) + pin(-0.6, 0.4, 0.3); + translate([-0.43,0.4,1.65-0.3/2]) + pin(-0.6, 0.4, 0.3); + } + } + } + + if (fillet) { + color([0.9, 0.9, 0.9]) { + fillet(); + translate([0,1.4-0.3/2,0]) + fillet(pad_width=0.41); + translate([-2.03,0,0]) + rotate([0,0,180]) + fillet(); + translate([-2.03,1.45-0.3/2,0]) + rotate([0,0,180]) + fillet(); + } + } + + // match rotation with stock footprint's + rotate([0,0,90]) + sc70_4_(); +} + diff -Nru pcb-rnd-3.1.0/footprint/smd/SC90.fp pcb-rnd-3.1.1/footprint/smd/SC90.fp --- pcb-rnd-3.1.0/footprint/smd/SC90.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/SC90.fp 2023-05-06 13:16:03.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = SC90 SMT transistor, 3 pins + openscad = SC90.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/smd/SC90.scad pcb-rnd-3.1.1/footprint/smd/SC90.scad --- pcb-rnd-3.1.0/footprint/smd/SC90.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/SC90.scad 2023-05-12 15:36:01.000000000 +0000 @@ -0,0 +1,126 @@ +// Model for SC90 package +// +// Copyright (C) 2017,2020 Tibor 'Igor2' Palinkas +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_sc90(fillet=0) +{ + + module fillet(pad_len=0.2, pad_width=0.2, pad_height= 0.15) { + fillet_height = pad_height/3; + fillet_width = pad_len/3; + overall_width = fillet_width + pad_width; + overall_length = pad_len + fillet_width; + + translate([-pad_len/2,0,0]) { + fillet_points = [ + [0,overall_width/2,0], // 0 + [overall_length,overall_width/2,0], // 1 + [overall_length,-overall_width/2,0], // 2 + [0,-overall_width/2,0], // 3 + [0,pad_width/2+fillet_width/2,fillet_height/3], // 4 + [pad_len+fillet_width/2,pad_width/2+fillet_width/2,fillet_height/3], // 5 + [pad_len+fillet_width/2,-pad_width/2-fillet_width/2,fillet_height/3], // 6 + [0,-pad_width/2-fillet_width/2,fillet_height/3], // 7 + [0,pad_width/2+fillet_width/6,2*fillet_height/3], // 8 + [pad_len+fillet_width/6,pad_width/2+fillet_width/6,2*fillet_height/3], // 9 + [pad_len+fillet_width/6,-pad_width/2-fillet_width/6,2*fillet_height/3], // 10 + [0,-pad_width/2-fillet_width/6,2*fillet_height/3], // 11 + [0,pad_width/2,fillet_height], // 12 + [pad_len,pad_width/2,fillet_height], // 13 + [pad_len,-pad_width/2,fillet_height], // 14 + [0,-pad_width/2,fillet_height]]; // 15 + + fillet_faces = [ + [0,4,8,12,15,11,7,3], // 0 + [0,1,5,4], // 1 + [1,2,6,5], // 2 + [7,6,2,3], // 3 + [4,5,9,8], // 4 + [5,6,10,9],// 5 + [10,6,7,11],// 6 + [8,9,13,12],// 7 + [9,10,14,13],// 8 + [15,14,10,11],// 9 + [12,13,14,15],// 10 + [3,2,1,0]];// 11 + + polyhedron(fillet_points, fillet_faces); + } + } + + module sc90_() + { + // pin prototype + module pin(length, height, thick) + { + linear_extrude(height=thick) + scale([length, -2*height, 1]) + polygon([[0.3400,0.0000],[0.3900,0.0100],[0.4300,0.0300],[0.4600,0.0600],[0.4789,0.0908],[0.6279,0.8307],[0.6500,0.8600],[0.6900,0.8900],[0.7300,0.9000],[1.0000,0.9000],[1.0000,1.0000],[0.6700,1.0012],[0.6100,0.9900],[0.5600,0.9600],[0.5300,0.9200],[0.5200,0.9000],[0.3721,0.1693],[0.3500,0.1400],[0.3100,0.1100],[0.2700,0.1000],[0.0000,0.1000],[0.0000,0.0000]]); + } + + rotate([90,0,-90]) scale([1.13,1.13,1.0]) translate([-0.625, 0.0, -1.28]) { + // body + color([0.1,0.1,0.1]) + linear_extrude(height=1.6) + polygon([[-0.3,0.1],[-0.4,0.7],[0.4,0.7],[0.3,0.1]]); + + // 3 pins + color([0.9, 0.9, 0.9]) { + translate([0.21,0.5,0.3-0.2/2]) + pin(0.5, 0.25, 0.2); + translate([0.21,0.5,1.3-0.2/2]) + pin(0.5, 0.25, 0.2); + + translate([-0.21,0.5,0.8-0.3/2]) + pin(-0.5, 0.25, 0.3); + + } + } + } + + if (fillet) { + color([0.9, 0.9, 0.9]) { + translate([0,-0.02,0]) + fillet(); + translate([0,1.08-0.2/2,0]) + fillet(); + translate([-1.41,0.63-0.3/2,0]) + rotate([0,0,180]) + fillet(pad_width=0.3); + } + } + + // match rotation with stock footprint's + rotate([0,0,90]) + sc90_(); +} + diff -Nru pcb-rnd-3.1.0/footprint/smd/SOD106A.fp pcb-rnd-3.1.1/footprint/smd/SOD106A.fp --- pcb-rnd-3.1.0/footprint/smd/SOD106A.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/SOD106A.fp 2023-05-06 15:48:28.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = SOD106A SMT diode (pin 1 is cathode) + openscad = SOD106A.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/smd/SOD106A.scad pcb-rnd-3.1.1/footprint/smd/SOD106A.scad --- pcb-rnd-3.1.0/footprint/smd/SOD106A.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/SOD106A.scad 2023-05-11 14:43:31.000000000 +0000 @@ -0,0 +1,139 @@ +// Model for SOD106A package +// +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_SOD106A(body_len=4.4, width=2.6, height=2.2, pad_len=1.15, pad_width=1.5, pad_height=1.65, fillet=0) +{ + module fillet() { + fillet_height = pad_height/3; + fillet_width = pad_len/3; + overall_width = fillet_width + pad_width; + overall_length = pad_len + fillet_width; + + translate([-pad_len/2,0,-pad_height/2]) { + fillet_points = [ + [0,overall_width/2,0], // 0 + [overall_length,overall_width/2,0], // 1 + [overall_length,-overall_width/2,0], // 2 + [0,-overall_width/2,0], // 3 + [0,pad_width/2+fillet_width/2,fillet_height/3], // 4 + [pad_len+fillet_width/2,pad_width/2+fillet_width/2,fillet_height/3], // 5 + [pad_len+fillet_width/2,-pad_width/2-fillet_width/2,fillet_height/3], // 6 + [0,-pad_width/2-fillet_width/2,fillet_height/3], // 7 + [0,pad_width/2+fillet_width/6,2*fillet_height/3], // 8 + [pad_len+fillet_width/6,pad_width/2+fillet_width/6,2*fillet_height/3], // 9 + [pad_len+fillet_width/6,-pad_width/2-fillet_width/6,2*fillet_height/3], // 10 + [0,-pad_width/2-fillet_width/6,2*fillet_height/3], // 11 + [0,pad_width/2,fillet_height], // 12 + [pad_len,pad_width/2,fillet_height], // 13 + [pad_len,-pad_width/2,fillet_height], // 14 + [0,-pad_width/2,fillet_height]]; // 15 + + fillet_faces = [ + [0,4,8,12,15,11,7,3], // 0 + [0,1,5,4], // 1 + [1,2,6,5], // 2 + [7,6,2,3], // 3 + [4,5,9,8], // 4 + [5,6,10,9],// 5 + [10,6,7,11],// 6 + [8,9,13,12],// 7 + [9,10,14,13],// 8 + [15,14,10,11],// 9 + [12,13,14,15],// 10 + [3,2,1,0]];// 11 + + polyhedron(fillet_points, fillet_faces); + } + } + + union() { + translate([0,width/2,0]) + rotate([90,0,0]) + color([0.1,0.1,0.1]) + scale([0.89,1,1]) + linear_extrude(height=width) + polygon([ + [1.4478,0.5842], + [1.61036,0.35306], + [2.4765,0.24892], + [2.64414,1.45796], + [2.64414,1.64846], + [2.53492,1.64846], + [2.45872,2.032], + [2.44856,2.05740], + [2.43486,2.07772], + [2.42062,2.09550], + [2.40284,2.11074], + [2.37744,2.12598], + [2.35966,2.13360], + [2.33426,2.13868], + [-2.33426,2.13868], + [-2.35966,2.13360], + [-2.37744,2.12598], + [-2.40284,2.11074], + [-2.42062,2.09550], + [-2.43486,2.07772], + [-2.44856,2.05740], + [-2.45872,2.032], + [-2.53492,1.64846], + [-2.64414,1.64846], + [-2.64414,1.45796], + [-2.4765,0.24892], + [-1.61036,0.35306], + [-1.4478,0.5842] + ]); + + translate([0,0,pad_height/2]) { + // terminals + color([0.8,0.8,0.8]) { + translate([+body_len/2-pad_len/5, 0, 0]) { + cube([pad_len, pad_width, pad_height], center=true); + if (fillet) + fillet(); + } + translate([-body_len/2+pad_len/5, 0, 0]) { + cube([pad_len, pad_width, pad_height], center=true); + if (fillet) + rotate([0,0,180]) + fillet(); + } + } + } + + translate([0,0,pad_height/2]) { + color([0.95,0.95,0.95]) { + translate([-body_len/2.3+pad_len/2, 0, height/2+0.2]) + cube([pad_len/3, pad_width, 0.1], center=true); + } + } + } +} diff -Nru pcb-rnd-3.1.0/footprint/smd/SOD110.fp pcb-rnd-3.1.1/footprint/smd/SOD110.fp --- pcb-rnd-3.1.0/footprint/smd/SOD110.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/SOD110.fp 2023-05-06 13:55:33.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = SOD110 SMT diode (pin 1 is cathode) + openscad = SOD110.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/smd/SOD110.scad pcb-rnd-3.1.1/footprint/smd/SOD110.scad --- pcb-rnd-3.1.0/footprint/smd/SOD110.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/SOD110.scad 2023-05-11 14:43:31.000000000 +0000 @@ -0,0 +1,108 @@ +// Model for SOD110 package +// +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_SOD110(body_len=2.0, width=1.3, height=1.5, pad_len=0.5, pad_width=1.0, pad_height=1.6, fillet=0) +{ + module fillet() { + fillet_height = pad_height/3; + fillet_width = pad_len/3; + overall_width = fillet_width + pad_width; + overall_length = pad_len + fillet_width; + + translate([-pad_len/2,0,-pad_height/2]) { + fillet_points = [ + [0,overall_width/2,0], // 0 + [overall_length,overall_width/2,0], // 1 + [overall_length,-overall_width/2,0], // 2 + [0,-overall_width/2,0], // 3 + [0,pad_width/2+fillet_width/2,fillet_height/3], // 4 + [pad_len+fillet_width/2,pad_width/2+fillet_width/2,fillet_height/3], // 5 + [pad_len+fillet_width/2,-pad_width/2-fillet_width/2,fillet_height/3], // 6 + [0,-pad_width/2-fillet_width/2,fillet_height/3], // 7 + [0,pad_width/2+fillet_width/6,2*fillet_height/3], // 8 + [pad_len+fillet_width/6,pad_width/2+fillet_width/6,2*fillet_height/3], // 9 + [pad_len+fillet_width/6,-pad_width/2-fillet_width/6,2*fillet_height/3], // 10 + [0,-pad_width/2-fillet_width/6,2*fillet_height/3], // 11 + [0,pad_width/2,fillet_height], // 12 + [pad_len,pad_width/2,fillet_height], // 13 + [pad_len,-pad_width/2,fillet_height], // 14 + [0,-pad_width/2,fillet_height]]; // 15 + + fillet_faces = [ + [0,4,8,12,15,11,7,3], // 0 + [0,1,5,4], // 1 + [1,2,6,5], // 2 + [7,6,2,3], // 3 + [4,5,9,8], // 4 + [5,6,10,9],// 5 + [10,6,7,11],// 6 + [8,9,13,12],// 7 + [9,10,14,13],// 8 + [15,14,10,11],// 9 + [12,13,14,15],// 10 + [3,2,1,0]];// 11 + + polyhedron(fillet_points, fillet_faces); + } + } + + union() { + translate([0,0,height/2+(pad_height-height)/2]) { + // body + color([0.1,0.1,0.1]) + cube([body_len-pad_len,width,height], center=true); + } + translate([0,0,pad_height/2]) { + // terminals + color([0.8,0.8,0.8]) { + translate([+body_len/2-pad_len/2, 0, 0]) { + cube([pad_len, pad_width, pad_height], center=true); + if (fillet) + fillet(); + } + translate([-body_len/2+pad_len/2, 0, 0]) { + cube([pad_len, pad_width, pad_height], center=true); + if (fillet) + rotate([0,0,180]) + fillet(); + } + } + } + // stripe + translate([0,0,pad_height/2]) { + color([0.95,0.95,0.95]) { + translate([-body_len/4+pad_len/2, 0, pad_height/2-0.05]) + cube([pad_len/3, pad_width, 0.1], center=true); + } + } + } +} diff -Nru pcb-rnd-3.1.0/footprint/smd/SOD123.scad pcb-rnd-3.1.1/footprint/smd/SOD123.scad --- pcb-rnd-3.1.0/footprint/smd/SOD123.scad 2020-09-13 05:02:03.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/SOD123.scad 2023-05-11 14:43:31.000000000 +0000 @@ -30,10 +30,8 @@ // in any way. // -module part_sod123() +module part_sod123(fillet=0) { - $fn = 30 ; - A = 1.35 ; D = 1.8 ; E = 2.84 ; @@ -43,7 +41,57 @@ L = 0.25 ; b = 0.71 ; l2 = 0.15 ; + + body_len=E; + width=D; + height=A; + pad_len=L; + pad_width=b; + pad_height= c; + module fillet() { + fillet_height = pad_height/3; + fillet_width = pad_len/3; + overall_width = fillet_width + pad_width; + overall_length = pad_len + fillet_width; + + translate([-pad_len/2,0,-pad_height/2]) { + fillet_points = [ + [0,overall_width/2,0], // 0 + [overall_length,overall_width/2,0], // 1 + [overall_length,-overall_width/2,0], // 2 + [0,-overall_width/2,0], // 3 + [0,pad_width/2+fillet_width/2,fillet_height/3], // 4 + [pad_len+fillet_width/2,pad_width/2+fillet_width/2,fillet_height/3], // 5 + [pad_len+fillet_width/2,-pad_width/2-fillet_width/2,fillet_height/3], // 6 + [0,-pad_width/2-fillet_width/2,fillet_height/3], // 7 + [0,pad_width/2+fillet_width/6,2*fillet_height/3], // 8 + [pad_len+fillet_width/6,pad_width/2+fillet_width/6,2*fillet_height/3], // 9 + [pad_len+fillet_width/6,-pad_width/2-fillet_width/6,2*fillet_height/3], // 10 + [0,-pad_width/2-fillet_width/6,2*fillet_height/3], // 11 + [0,pad_width/2,fillet_height], // 12 + [pad_len,pad_width/2,fillet_height], // 13 + [pad_len,-pad_width/2,fillet_height], // 14 + [0,-pad_width/2,fillet_height]]; // 15 + + fillet_faces = [ + [0,4,8,12,15,11,7,3], // 0 + [0,1,5,4], // 1 + [1,2,6,5], // 2 + [7,6,2,3], // 3 + [4,5,9,8], // 4 + [5,6,10,9],// 5 + [10,6,7,11],// 6 + [8,9,13,12],// 7 + [9,10,14,13],// 8 + [15,14,10,11],// 9 + [12,13,14,15],// 10 + [3,2,1,0]];// 11 + + polyhedron(fillet_points, fillet_faces); + } + } + module lead() color ([0.9, 0.9, 0.9]) { @@ -67,13 +115,21 @@ translate ([He/2 - E/2 - He/2, -D/2, 0]) cube ([E, D, A]) ; - translate ([-He/2, 0, 0]) - lead() ; - - translate ([He/2, 0, 0]) - mirror ([1, 0, 0]) - lead() ; - + translate ([-He/2, 0, 0]) + lead() ; + translate ([He/2, 0, 0]) + mirror ([1, 0, 0]) + lead() ; + if (fillet) { + color ([0.8, 0.8, 0.8]) { + translate([+body_len/2+3*pad_len/2, 0, pad_height/2]) + fillet(); + translate([-body_len/2-3*pad_len/2, 0, pad_height/2]) + rotate([0,0,180]) + fillet(); + } + } + color ([0.5, 0.5, 0.5]) intersection() { diff -Nru pcb-rnd-3.1.0/footprint/smd/SOD323.scad pcb-rnd-3.1.1/footprint/smd/SOD323.scad --- pcb-rnd-3.1.0/footprint/smd/SOD323.scad 2020-09-13 05:02:03.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/SOD323.scad 2023-05-11 14:43:31.000000000 +0000 @@ -30,10 +30,58 @@ // in any way. // -module part_sod323() +module part_sod323(fillet=0) { - $fn = 30 ; + body_len=1.8; + width=1.2; + height=1.35; + pad_len=0.25; + pad_width=0.35; + pad_height= 0.15; + module fillet() { + fillet_height = pad_height/3; + fillet_width = pad_len/3; + overall_width = fillet_width + pad_width; + overall_length = pad_len + fillet_width; + + translate([-pad_len/2,0,-pad_height/2]) { + fillet_points = [ + [0,overall_width/2,0], // 0 + [overall_length,overall_width/2,0], // 1 + [overall_length,-overall_width/2,0], // 2 + [0,-overall_width/2,0], // 3 + [0,pad_width/2+fillet_width/2,fillet_height/3], // 4 + [pad_len+fillet_width/2,pad_width/2+fillet_width/2,fillet_height/3], // 5 + [pad_len+fillet_width/2,-pad_width/2-fillet_width/2,fillet_height/3], // 6 + [0,-pad_width/2-fillet_width/2,fillet_height/3], // 7 + [0,pad_width/2+fillet_width/6,2*fillet_height/3], // 8 + [pad_len+fillet_width/6,pad_width/2+fillet_width/6,2*fillet_height/3], // 9 + [pad_len+fillet_width/6,-pad_width/2-fillet_width/6,2*fillet_height/3], // 10 + [0,-pad_width/2-fillet_width/6,2*fillet_height/3], // 11 + [0,pad_width/2,fillet_height], // 12 + [pad_len,pad_width/2,fillet_height], // 13 + [pad_len,-pad_width/2,fillet_height], // 14 + [0,-pad_width/2,fillet_height]]; // 15 + + fillet_faces = [ + [0,4,8,12,15,11,7,3], // 0 + [0,1,5,4], // 1 + [1,2,6,5], // 2 + [7,6,2,3], // 3 + [4,5,9,8], // 4 + [5,6,10,9],// 5 + [10,6,7,11],// 6 + [8,9,13,12],// 7 + [9,10,14,13],// 8 + [15,14,10,11],// 9 + [12,13,14,15],// 10 + [3,2,1,0]];// 11 + + polyhedron(fillet_points, fillet_faces); + } + } + module lead() color ([0.9, 0.9, 0.9]) { @@ -54,25 +102,33 @@ } module case() - translate ([-0.9, -0.7, 0]) - cube ([1.8, 1.4, 1.35]) ; + translate ([-0.9, -0.7, 0]) + cube ([1.8, 1.4, 1.35]) ; - translate ([-0.5-0.9, 0, 0]) - lead() ; - - mirror ([1, 0, 0]) - translate ([-0.5-0.9, 0, 0]) - lead() ; - - color ([0.5, 0.5, 0.5]) - intersection() - { - translate ([-0.7, -5, -5]) - cube ([0.3, 10, 10]) ; + translate ([-0.5-0.9, 0, 0]) + lead() ; + mirror ([1, 0, 0]) + translate ([-0.5-0.9, 0, 0]) + lead() ; + if(fillet) { + color ([0.8, 0.8, 0.8]) { + translate([+body_len/2+3*pad_len/2, 0, pad_height/2]) + fillet(); + translate([-body_len/2-3*pad_len/2, 0, pad_height/2]) + rotate([0,0,180]) + fillet(); + } + } - scale (1.002) - case() ; - } + color ([0.5, 0.5, 0.5]) + intersection() + { + translate ([-0.7, -5, -5]) + cube ([0.3, 10, 10]) ; + + scale (1.002) + case() ; + } color ([0.3, 0.3, 0.3]) case() ; diff -Nru pcb-rnd-3.1.0/footprint/smd/SOD80.fp pcb-rnd-3.1.1/footprint/smd/SOD80.fp --- pcb-rnd-3.1.0/footprint/smd/SOD80.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/SOD80.fp 2023-05-06 14:42:36.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = SOD80 SMT diode (pin 1 is cathode) + openscad = SOD80.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/smd/SOD80.scad pcb-rnd-3.1.1/footprint/smd/SOD80.scad --- pcb-rnd-3.1.0/footprint/smd/SOD80.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/SOD80.scad 2023-05-11 14:43:31.000000000 +0000 @@ -0,0 +1,121 @@ +// Model for SOD80 package +// +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module package_sod80(fillet=0) { + body_len=2.8; + width=1.46; + height=1.46; + pad_len=0.35; + pad_width=1.0; + pad_height= 1.48; + + module fillet() { + fillet_height = pad_height/3; + fillet_width = pad_len/3; + overall_width = fillet_width + pad_width; + overall_length = pad_len + fillet_width; + + translate([-pad_len/2,0,-pad_height/2]) { + fillet_points = [ + [0,overall_width/2,0], // 0 + [overall_length,overall_width/2,0], // 1 + [overall_length,-overall_width/2,0], // 2 + [0,-overall_width/2,0], // 3 + [0,pad_width/2+fillet_width/2,fillet_height/3], // 4 + [pad_len+fillet_width/2,pad_width/2+fillet_width/2,fillet_height/3], // 5 + [pad_len+fillet_width/2,-pad_width/2-fillet_width/2,fillet_height/3], // 6 + [0,-pad_width/2-fillet_width/2,fillet_height/3], // 7 + [0,pad_width/2+fillet_width/6,2*fillet_height/3], // 8 + [pad_len+fillet_width/6,pad_width/2+fillet_width/6,2*fillet_height/3], // 9 + [pad_len+fillet_width/6,-pad_width/2-fillet_width/6,2*fillet_height/3], // 10 + [0,-pad_width/2-fillet_width/6,2*fillet_height/3], // 11 + [0,pad_width/2,fillet_height], // 12 + [pad_len,pad_width/2,fillet_height], // 13 + [pad_len,-pad_width/2,fillet_height], // 14 + [0,-pad_width/2,fillet_height]]; // 15 + + fillet_faces = [ + [0,4,8,12,15,11,7,3], // 0 + [0,1,5,4], // 1 + [1,2,6,5], // 2 + [7,6,2,3], // 3 + [4,5,9,8], // 4 + [5,6,10,9],// 5 + [10,6,7,11],// 6 + [8,9,13,12],// 7 + [9,10,14,13],// 8 + [15,14,10,11],// 9 + [12,13,14,15],// 10 + [3,2,1,0]];// 11 + + polyhedron(fillet_points, fillet_faces); + } + } + + // r[adius], h[eight], [rou]n[d] + module rounded_cylinder(r,h,n) { + rotate_extrude(convexity=1) { + offset(r=n) offset(delta=-n) square([r,h]); + square([n,h]); + } + } + + translate([-1.575,0,0.8]) { + if(fillet) { + color([0.8,0.8,0.8]) { + translate([+body_len+pad_len, 0, -0.06]) + fillet(); + translate([0, 0, -0.06]) + rotate([0,0,180]) + fillet(); + } + } + rotate([0,90,0]) { + union () { + color([1,0.1,0.1]) { + translate([0,0,0.35/2]) + rounded_cylinder(r=0.73,h=2.8,n=0.2); + } + color([0.1,0.1,0.1]) { + translate([0,0,0.7]) + cylinder(r=0.74, h=0.35); + } + color([0.8,0.8,0.8]) { + translate([0,0,-0.35/2]) + cylinder(r=0.8, h=0.35); + translate([0,0,0.35/2 + 2.8]) + cylinder(r=0.8, h=0.35); + } + } + } + } +} diff -Nru pcb-rnd-3.1.0/footprint/smd/SOD87.fp pcb-rnd-3.1.1/footprint/smd/SOD87.fp --- pcb-rnd-3.1.0/footprint/smd/SOD87.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/SOD87.fp 2023-05-06 14:56:07.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = SOD87 SMT diode (pin 1 is cathode) + openscad = SOD87.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/smd/SOD87.scad pcb-rnd-3.1.1/footprint/smd/SOD87.scad --- pcb-rnd-3.1.0/footprint/smd/SOD87.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/SOD87.scad 2023-05-11 14:43:31.000000000 +0000 @@ -0,0 +1,122 @@ +// Model for SOD87 package +// +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module package_sod87(fillet=0) { + body_len=2.9; + width=1.9; + height=1.9; + pad_len=0.3; + pad_width=1.0; + pad_height= 2.05; + + module fillet() { + fillet_height = pad_height/3; + fillet_width = pad_len/3; + overall_width = fillet_width + pad_width; + overall_length = pad_len + fillet_width; + + translate([-pad_len/2,0,-pad_height/2]) { + fillet_points = [ + [0,overall_width/2,0], // 0 + [overall_length,overall_width/2,0], // 1 + [overall_length,-overall_width/2,0], // 2 + [0,-overall_width/2,0], // 3 + [0,pad_width/2+fillet_width/2,fillet_height/3], // 4 + [pad_len+fillet_width/2,pad_width/2+fillet_width/2,fillet_height/3], // 5 + [pad_len+fillet_width/2,-pad_width/2-fillet_width/2,fillet_height/3], // 6 + [0,-pad_width/2-fillet_width/2,fillet_height/3], // 7 + [0,pad_width/2+fillet_width/6,2*fillet_height/3], // 8 + [pad_len+fillet_width/6,pad_width/2+fillet_width/6,2*fillet_height/3], // 9 + [pad_len+fillet_width/6,-pad_width/2-fillet_width/6,2*fillet_height/3], // 10 + [0,-pad_width/2-fillet_width/6,2*fillet_height/3], // 11 + [0,pad_width/2,fillet_height], // 12 + [pad_len,pad_width/2,fillet_height], // 13 + [pad_len,-pad_width/2,fillet_height], // 14 + [0,-pad_width/2,fillet_height]]; // 15 + + fillet_faces = [ + [0,4,8,12,15,11,7,3], // 0 + [0,1,5,4], // 1 + [1,2,6,5], // 2 + [7,6,2,3], // 3 + [4,5,9,8], // 4 + [5,6,10,9],// 5 + [10,6,7,11],// 6 + [8,9,13,12],// 7 + [9,10,14,13],// 8 + [15,14,10,11],// 9 + [12,13,14,15],// 10 + [3,2,1,0]];// 11 + + polyhedron(fillet_points, fillet_faces); + } + } + + // r[adius], h[eight], [rou]n[d] + module rounded_cylinder(r,h,n) { + rotate_extrude(convexity=1) { + offset(r=n) offset(delta=-n) square([r,h]); + square([n,h]); + } + } + + translate([-1.575,0,1.025]) { + if(fillet) { + color([0.8,0.8,0.8]) { + translate([+body_len+pad_len, 0, 0]) + fillet(); + translate([0, 0, 0]) + rotate([0,0,180]) + fillet(); + } + } + rotate([0,90,0]) { + union () { + color([1,0.1,0.1]) { + translate([0,0,0.3/2]) + rounded_cylinder(r=0.95,h=2.9,n=0.2); + } + color([0.1,0.1,0.1]) { + translate([0,0,0.7]) + cylinder(r=0.96, h=0.35); + } + color([0.8,0.8,0.8]) { + translate([0,0,-0.3/2]) + cylinder(r=1.025, h=0.3); + + translate([0,0,0.3/2 + 2.9]) + cylinder(r=1.025, h=0.3); + } + } + } + } +} diff -Nru pcb-rnd-3.1.0/footprint/smd/SOT143.fp pcb-rnd-3.1.1/footprint/smd/SOT143.fp --- pcb-rnd-3.1.0/footprint/smd/SOT143.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/SOT143.fp 2023-05-06 10:34:18.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = SOT143 SMT transistor, 4 pins + openscad = SOT143.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/smd/SOT143.scad pcb-rnd-3.1.1/footprint/smd/SOT143.scad --- pcb-rnd-3.1.0/footprint/smd/SOT143.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/SOT143.scad 2023-05-12 15:36:01.000000000 +0000 @@ -0,0 +1,133 @@ +// Model for SOT143 package +// +// Copyright (C) 2017,2020 Tibor 'Igor2' Palinkas +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + + +module part_sot143(fillet=0) +{ + module fillet(pad_len=0.35, pad_width=0.4, pad_height= 0.1) { + fillet_height = pad_height/3; + fillet_width = pad_len/3; + overall_width = fillet_width + pad_width; + overall_length = pad_len + fillet_width; + + translate([-pad_len/2,0,0]) { + fillet_points = [ + [0,overall_width/2,0], // 0 + [overall_length,overall_width/2,0], // 1 + [overall_length,-overall_width/2,0], // 2 + [0,-overall_width/2,0], // 3 + [0,pad_width/2+fillet_width/2,fillet_height/3], // 4 + [pad_len+fillet_width/2,pad_width/2+fillet_width/2,fillet_height/3], // 5 + [pad_len+fillet_width/2,-pad_width/2-fillet_width/2,fillet_height/3], // 6 + [0,-pad_width/2-fillet_width/2,fillet_height/3], // 7 + [0,pad_width/2+fillet_width/6,2*fillet_height/3], // 8 + [pad_len+fillet_width/6,pad_width/2+fillet_width/6,2*fillet_height/3], // 9 + [pad_len+fillet_width/6,-pad_width/2-fillet_width/6,2*fillet_height/3], // 10 + [0,-pad_width/2-fillet_width/6,2*fillet_height/3], // 11 + [0,pad_width/2,fillet_height], // 12 + [pad_len,pad_width/2,fillet_height], // 13 + [pad_len,-pad_width/2,fillet_height], // 14 + [0,-pad_width/2,fillet_height]]; // 15 + + fillet_faces = [ + [0,4,8,12,15,11,7,3], // 0 + [0,1,5,4], // 1 + [1,2,6,5], // 2 + [7,6,2,3], // 3 + [4,5,9,8], // 4 + [5,6,10,9],// 5 + [10,6,7,11],// 6 + [8,9,13,12],// 7 + [9,10,14,13],// 8 + [15,14,10,11],// 9 + [12,13,14,15],// 10 + [3,2,1,0]];// 11 + + polyhedron(fillet_points, fillet_faces); + } + } + + module sot143_() + { + // pin prototype + module pin(length, height, thick) + { + linear_extrude(height=thick) + scale([length, -height, 1]) + polygon([[0.3400,0.0000],[0.3900,0.0100],[0.4300,0.0300],[0.4600,0.0600],[0.4789,0.0908],[0.6279,0.8307],[0.6500,0.8600],[0.6900,0.8900],[0.7300,0.9000],[1.0000,0.9000],[1.0000,1.0000],[0.6700,1.0012],[0.6100,0.9900],[0.5600,0.9600],[0.5300,0.9200],[0.5200,0.9000],[0.3721,0.1693],[0.3500,0.1400],[0.3100,0.1100],[0.2700,0.1000],[0.0000,0.1000],[0.0000,0.0000]]); + } + + rotate([90,0,-90]) scale([1.13,1.13,1.0]) translate([-0.9, 0.4, -2.1 - 0.43/2]) { + // body + color([0.1,0.1,0.1]) + linear_extrude(height=2.9) + polygon([[-0.6,0],[-0.45,0.53],[0.45,0.53],[0.6,0],[0.45,-0.35],[-0.45,-0.35]]); + + // 3 pins + color([0.9, 0.9, 0.9]) { + translate([0.35,0,0.5-0.43/2]) + pin(0.7, 0.4, 0.43); + + translate([0.35,0,2.3-0.85*3/4]) + pin(0.7, 0.4, 0.85); + + translate([-0.35,0,0.5-0.43/2]) + pin(-0.7, 0.4, 0.43); + + translate([-0.35,0,2.3-0.43/2]) + pin(-0.7, 0.4, 0.43); + + } + } + } + + if (fillet) { + color([0.9, 0.9, 0.9]) { + translate([0,0.45-0.45/2,0]) + fillet(pad_width=0.84); + translate([0,1.81,0]) + fillet(); + translate([-2.03,0.02,0]) + rotate([0,0,180]) + fillet(); + translate([-2.03,1.81,0]) + rotate([0,0,180]) + fillet(); + } + } + + // match rotation with stock footprint's + rotate([0,0,90]) + sot143_(); +} + diff -Nru pcb-rnd-3.1.0/footprint/smd/SOT223.fp pcb-rnd-3.1.1/footprint/smd/SOT223.fp --- pcb-rnd-3.1.0/footprint/smd/SOT223.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/SOT223.fp 2023-05-06 10:35:05.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = SOT223 SMT transistor, 4 pins + openscad = SOT223.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/smd/SOT223.scad pcb-rnd-3.1.1/footprint/smd/SOT223.scad --- pcb-rnd-3.1.0/footprint/smd/SOT223.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/SOT223.scad 2023-05-12 15:36:01.000000000 +0000 @@ -0,0 +1,130 @@ +// Model for SOT223 package +// +// Copyright (C) 2017,2020 Tibor 'Igor2' Palinkas +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + + +module part_sot223(fillet=0) +{ + + module fillet(pad_len=0.7, pad_width=0.6, pad_height= 0.2) { + fillet_height = pad_height/3; + fillet_width = pad_len/3; + overall_width = fillet_width + pad_width; + overall_length = pad_len + fillet_width; + + translate([-pad_len/2,0,0]) { + fillet_points = [ + [0,overall_width/2,0], // 0 + [overall_length,overall_width/2,0], // 1 + [overall_length,-overall_width/2,0], // 2 + [0,-overall_width/2,0], // 3 + [0,pad_width/2+fillet_width/2,fillet_height/3], // 4 + [pad_len+fillet_width/2,pad_width/2+fillet_width/2,fillet_height/3], // 5 + [pad_len+fillet_width/2,-pad_width/2-fillet_width/2,fillet_height/3], // 6 + [0,-pad_width/2-fillet_width/2,fillet_height/3], // 7 + [0,pad_width/2+fillet_width/6,2*fillet_height/3], // 8 + [pad_len+fillet_width/6,pad_width/2+fillet_width/6,2*fillet_height/3], // 9 + [pad_len+fillet_width/6,-pad_width/2-fillet_width/6,2*fillet_height/3], // 10 + [0,-pad_width/2-fillet_width/6,2*fillet_height/3], // 11 + [0,pad_width/2,fillet_height], // 12 + [pad_len,pad_width/2,fillet_height], // 13 + [pad_len,-pad_width/2,fillet_height], // 14 + [0,-pad_width/2,fillet_height]]; // 15 + + fillet_faces = [ + [0,4,8,12,15,11,7,3], // 0 + [0,1,5,4], // 1 + [1,2,6,5], // 2 + [7,6,2,3], // 3 + [4,5,9,8], // 4 + [5,6,10,9],// 5 + [10,6,7,11],// 6 + [8,9,13,12],// 7 + [9,10,14,13],// 8 + [15,14,10,11],// 9 + [12,13,14,15],// 10 + [3,2,1,0]];// 11 + + polyhedron(fillet_points, fillet_faces); + } + } + + module sot223_() + { + // pin prototype + module pin(length, height, thick) + { + linear_extrude(height=thick) + scale([length, -height, 1]) + polygon([[0.3400,0.0000],[0.3900,0.0100],[0.4300,0.0300],[0.4600,0.0600],[0.4789,0.0908],[0.6279,0.8307],[0.6500,0.8600],[0.6900,0.8900],[0.7300,0.9000],[1.0000,0.9000],[1.0000,1.0000],[0.6700,1.0012],[0.6100,0.9900],[0.5600,0.9600],[0.5300,0.9200],[0.5200,0.9000],[0.3721,0.1693],[0.3500,0.1400],[0.3100,0.1100],[0.2700,0.1000],[0.0000,0.1000],[0.0000,0.0000]]); + } + + rotate([90,0,-90]) scale([1.13,1.13,1.0]) translate([2.75, 0.75, -0.85]) { + // body + color([0.1,0.1,0.1]) + linear_extrude(height=6.5) + polygon([[-1.75,0],[-1.55,0.9],[1.55,0.9],[1.75,0],[1.55,-0.7],[-1.55,-0.7]]); + + // 3 pins + color([0.9, 0.9, 0.9]) { + translate([-1.4,0,0.85-0.7/2]) + pin(-1.7, 0.75, 0.7); + + translate([-1.4,0,3.15-0.7/2]) + pin(-1.7, 0.75, 0.7); + translate([-1.4,0,5.45-0.7/2]) + pin(-1.7, 0.75, 0.7); + + translate([1.4,0,3.15-3.0/2]) + pin(1.7, 0.75, 3.0); + } + } + } + + if (fillet) { + color([0.9, 0.9, 0.9]) { + fillet(); + translate([0,2.3,0]) + fillet(); + translate([0,4.6,0]) + fillet(); + translate([-6.3,2.29,0]) + rotate([0,0,180]) + fillet(pad_width=3.0); + } + } + + // match rotation with stock footprint's + rotate([0,0,270]) + sot223_(); +} + diff -Nru pcb-rnd-3.1.0/footprint/smd/SOT23.scad pcb-rnd-3.1.1/footprint/smd/SOT23.scad --- pcb-rnd-3.1.0/footprint/smd/SOT23.scad 2020-09-13 05:39:11.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/SOT23.scad 2023-05-12 15:36:01.000000000 +0000 @@ -30,8 +30,52 @@ // in any way. // -module sot23() -{ +module part_sot23(fillet=0) +{ + + module fillet(pad_len=0.23, pad_width=0.43,pad_height= 0.1) { + fillet_height = pad_height/3; + fillet_width = pad_len/3; + overall_width = fillet_width + pad_width; + overall_length = pad_len + fillet_width; + + translate([-pad_len/2,0,0]) { + fillet_points = [ + [0,overall_width/2,0], // 0 + [overall_length,overall_width/2,0], // 1 + [overall_length,-overall_width/2,0], // 2 + [0,-overall_width/2,0], // 3 + [0,pad_width/2+fillet_width/2,fillet_height/3], // 4 + [pad_len+fillet_width/2,pad_width/2+fillet_width/2,fillet_height/3], // 5 + [pad_len+fillet_width/2,-pad_width/2-fillet_width/2,fillet_height/3], // 6 + [0,-pad_width/2-fillet_width/2,fillet_height/3], // 7 + [0,pad_width/2+fillet_width/6,2*fillet_height/3], // 8 + [pad_len+fillet_width/6,pad_width/2+fillet_width/6,2*fillet_height/3], // 9 + [pad_len+fillet_width/6,-pad_width/2-fillet_width/6,2*fillet_height/3], // 10 + [0,-pad_width/2-fillet_width/6,2*fillet_height/3], // 11 + [0,pad_width/2,fillet_height], // 12 + [pad_len,pad_width/2,fillet_height], // 13 + [pad_len,-pad_width/2,fillet_height], // 14 + [0,-pad_width/2,fillet_height]]; // 15 + + fillet_faces = [ + [0,4,8,12,15,11,7,3], // 0 + [0,1,5,4], // 1 + [1,2,6,5], // 2 + [7,6,2,3], // 3 + [4,5,9,8], // 4 + [5,6,10,9],// 5 + [10,6,7,11],// 6 + [8,9,13,12],// 7 + [9,10,14,13],// 8 + [15,14,10,11],// 9 + [12,13,14,15],// 10 + [3,2,1,0]];// 11 + + polyhedron(fillet_points, fillet_faces); + } + } + module sot23_() { // pin prototype @@ -42,7 +86,7 @@ polygon([[0.3400,0.0000],[0.3900,0.0100],[0.4300,0.0300],[0.4600,0.0600],[0.4789,0.0908],[0.6279,0.8307],[0.6500,0.8600],[0.6900,0.8900],[0.7300,0.9000],[1.0000,0.9000],[1.0000,1.0000],[0.6700,1.0012],[0.6100,0.9900],[0.5600,0.9600],[0.5300,0.9200],[0.5200,0.9000],[0.3721,0.1693],[0.3500,0.1400],[0.3100,0.1100],[0.2700,0.1000],[0.0000,0.1000],[0.0000,0.0000]]); } - rotate([90,0,-90]) scale([1.13,1.13,1.13]) translate([-0.9, 0.4, -2.1 - 0.43/2]) { + rotate([90,0,-90]) scale([1.13,1.13,1.0]) translate([-0.9, 0.4, -2.25 - 0.43/2]) { // body color([0.1,0.1,0.1]) linear_extrude(height=2.9) @@ -50,10 +94,10 @@ // 3 pins color([0.9, 0.9, 0.9]) { - translate([0.5,0,0.5-0.43/2]) + translate([0.5,0,0.4594-0.43/2]) pin(0.5, 0.4, 0.43); - translate([0.5,0,2.3-0.43/2]) + translate([0.5,0,2.4406-0.43/2]) pin(0.5, 0.4, 0.43); translate([-0.5,0,1.45-0.43/2]) @@ -61,8 +105,21 @@ } } } + + if (fillet) { + color([0.9, 0.9, 0.9]) { + translate([0,0.02,0]) + fillet(); + translate([0,2.0,0]) + fillet(); + translate([-2.03,1.01,0]) + rotate([0,0,180]) + fillet(); + } + } // match rotation with stock footprint's rotate([0,0,90]) sot23_(); } + diff -Nru pcb-rnd-3.1.0/footprint/smd/SOT23.stl pcb-rnd-3.1.1/footprint/smd/SOT23.stl --- pcb-rnd-3.1.0/footprint/smd/SOT23.stl 2021-12-11 15:35:32.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/SOT23.stl 2023-05-06 10:58:13.000000000 +0000 @@ -1,1990 +1,1990 @@ solid OpenSCAD_Model facet normal 0 1 -0 outer loop - vertex 0.113 2.2939 6.89697e-06 - vertex -0.039561 2.2939 0.0452166 - vertex 0.113 2.2939 0.0452166 + vertex 0.113 2.2206 6.89697e-06 + vertex -0.039561 2.2206 0.0452166 + vertex 0.113 2.2206 0.0452166 endloop endfacet facet normal -0 1 0 outer loop - vertex -0.107358 2.2939 0.00452441 - vertex -0.039561 2.2939 0.0452166 - vertex -0.0734597 2.2939 -0.000527618 + vertex -0.107358 2.2206 0.00452441 + vertex -0.039561 2.2206 0.0452166 + vertex -0.0734597 2.2206 -0.000527618 endloop endfacet facet normal -0 1 0 outer loop - vertex -0.135601 2.2939 0.0180942 - vertex -0.039561 2.2939 0.0452166 - vertex -0.107358 2.2939 0.00452441 + vertex -0.135601 2.2206 0.0180942 + vertex -0.039561 2.2206 0.0452166 + vertex -0.107358 2.2206 0.00452441 endloop endfacet facet normal 0 1 0 outer loop - vertex -0.039561 2.2939 0.0452166 - vertex -0.152551 2.2939 0.0361643 - vertex -0.158206 2.2939 0.0452166 + vertex -0.039561 2.2206 0.0452166 + vertex -0.152551 2.2206 0.0361643 + vertex -0.158206 2.2206 0.0452166 endloop endfacet facet normal 0 1 0 outer loop - vertex -0.039561 2.2939 0.0452166 - vertex 0.113 2.2939 6.89697e-06 - vertex -0.0734597 2.2939 -0.000527618 + vertex -0.039561 2.2206 0.0452166 + vertex 0.113 2.2206 6.89697e-06 + vertex -0.0734597 2.2206 -0.000527618 endloop endfacet facet normal 0 1 0 outer loop - vertex -0.039561 2.2939 0.0452166 - vertex -0.135601 2.2939 0.0180942 - vertex -0.152551 2.2939 0.0361643 + vertex -0.039561 2.2206 0.0452166 + vertex -0.135601 2.2206 0.0180942 + vertex -0.152551 2.2206 0.0361643 endloop endfacet facet normal 0 1 0 outer loop - vertex -0.259902 2.2939 0.452 - vertex -0.276851 2.2939 0.40229 - vertex -0.299456 2.2939 0.406808 + vertex -0.259902 2.2206 0.452 + vertex -0.276851 2.2206 0.40229 + vertex -0.299456 2.2206 0.406808 endloop endfacet facet normal 0 1 0 outer loop - vertex -0.192105 2.2939 0.424895 - vertex -0.254264 2.2939 0.38872 - vertex -0.276851 2.2939 0.40229 + vertex -0.192105 2.2206 0.424895 + vertex -0.254264 2.2206 0.38872 + vertex -0.276851 2.2206 0.40229 endloop endfacet facet normal 0 1 0 outer loop - vertex -0.192105 2.2939 0.424895 - vertex -0.24178 2.2939 0.375478 - vertex -0.254264 2.2939 0.38872 + vertex -0.192105 2.2206 0.424895 + vertex -0.24178 2.2206 0.375478 + vertex -0.254264 2.2206 0.38872 endloop endfacet facet normal 0 1 0 outer loop - vertex -0.097237 2.2939 0.0765288 - vertex -0.24178 2.2939 0.375478 - vertex -0.181432 2.2939 0.410963 + vertex -0.097237 2.2206 0.0765288 + vertex -0.24178 2.2206 0.375478 + vertex -0.181432 2.2206 0.410963 endloop endfacet facet normal 0 1 0 outer loop - vertex -0.097237 2.2939 0.0765288 - vertex -0.158206 2.2939 0.0452166 - vertex -0.24178 2.2939 0.375478 + vertex -0.097237 2.2206 0.0765288 + vertex -0.158206 2.2206 0.0452166 + vertex -0.24178 2.2206 0.375478 endloop endfacet facet normal 0 1 0 outer loop - vertex -0.0847534 2.2939 0.0632866 - vertex -0.158206 2.2939 0.0452166 - vertex -0.097237 2.2939 0.0765288 + vertex -0.0847534 2.2206 0.0632866 + vertex -0.158206 2.2206 0.0452166 + vertex -0.097237 2.2206 0.0765288 endloop endfacet facet normal 0 1 0 outer loop - vertex -0.0621659 2.2939 0.0497341 - vertex -0.158206 2.2939 0.0452166 - vertex -0.0847534 2.2939 0.0632866 + vertex -0.0621659 2.2206 0.0497341 + vertex -0.158206 2.2206 0.0452166 + vertex -0.0847534 2.2206 0.0632866 endloop endfacet facet normal 0 1 0 outer loop - vertex -0.158206 2.2939 0.0452166 - vertex -0.0621659 2.2939 0.0497341 - vertex -0.039561 2.2939 0.0452166 + vertex -0.158206 2.2206 0.0452166 + vertex -0.0621659 2.2206 0.0497341 + vertex -0.039561 2.2206 0.0452166 endloop endfacet facet normal 0 1 0 outer loop - vertex -0.276851 2.2939 0.40229 - vertex -0.259902 2.2939 0.452 - vertex -0.231659 2.2939 0.447482 + vertex -0.276851 2.2206 0.40229 + vertex -0.259902 2.2206 0.452 + vertex -0.231659 2.2206 0.447482 endloop endfacet facet normal 0 1 0 outer loop - vertex -0.276851 2.2939 0.40229 - vertex -0.231659 2.2939 0.447482 - vertex -0.209054 2.2939 0.438447 + vertex -0.276851 2.2206 0.40229 + vertex -0.231659 2.2206 0.447482 + vertex -0.209054 2.2206 0.438447 endloop endfacet facet normal 0 1 0 outer loop - vertex -0.276851 2.2939 0.40229 - vertex -0.209054 2.2939 0.438447 - vertex -0.192105 2.2939 0.424895 + vertex -0.276851 2.2206 0.40229 + vertex -0.209054 2.2206 0.438447 + vertex -0.192105 2.2206 0.424895 endloop endfacet facet normal 0 1 0 outer loop - vertex -0.24178 2.2939 0.375478 - vertex -0.192105 2.2939 0.424895 - vertex -0.181432 2.2939 0.410963 + vertex -0.24178 2.2206 0.375478 + vertex -0.192105 2.2206 0.424895 + vertex -0.181432 2.2206 0.410963 endloop endfacet facet normal 0 1 0 outer loop - vertex -0.259902 2.2939 0.452 - vertex -0.299456 2.2939 0.406808 - vertex -0.395514 2.2939 0.452 + vertex -0.259902 2.2206 0.452 + vertex -0.299456 2.2206 0.406808 + vertex -0.395514 2.2206 0.452 endloop endfacet facet normal 0 1 0 outer loop - vertex -0.395514 2.2939 0.452 - vertex -0.299456 2.2939 0.406808 - vertex -0.408425 2.2939 0.406808 + vertex -0.395514 2.2206 0.452 + vertex -0.299456 2.2206 0.406808 + vertex -0.408425 2.2206 0.406808 endloop endfacet facet normal 0 -1 0 outer loop - vertex -0.299456 1.808 0.406808 - vertex -0.259902 1.808 0.452 - vertex -0.395514 1.808 0.452 + vertex -0.299456 1.7906 0.406808 + vertex -0.259902 1.7906 0.452 + vertex -0.395514 1.7906 0.452 endloop endfacet facet normal 0 -1 0 outer loop - vertex -0.276851 1.808 0.40229 - vertex -0.259902 1.808 0.452 - vertex -0.299456 1.808 0.406808 + vertex -0.276851 1.7906 0.40229 + vertex -0.259902 1.7906 0.452 + vertex -0.299456 1.7906 0.406808 endloop endfacet facet normal 0 -1 -0 outer loop - vertex -0.259902 1.808 0.452 - vertex -0.276851 1.808 0.40229 - vertex -0.231659 1.808 0.447482 + vertex -0.259902 1.7906 0.452 + vertex -0.276851 1.7906 0.40229 + vertex -0.231659 1.7906 0.447482 endloop endfacet facet normal 0 -1 0 outer loop - vertex -0.254264 1.808 0.38872 - vertex -0.231659 1.808 0.447482 - vertex -0.276851 1.808 0.40229 + vertex -0.254264 1.7906 0.38872 + vertex -0.231659 1.7906 0.447482 + vertex -0.276851 1.7906 0.40229 endloop endfacet facet normal 0 -1 0 outer loop - vertex -0.299456 1.808 0.406808 - vertex -0.395514 1.808 0.452 - vertex -0.408425 1.808 0.406808 + vertex -0.299456 1.7906 0.406808 + vertex -0.395514 1.7906 0.452 + vertex -0.408425 1.7906 0.406808 endloop endfacet facet normal 0 -1 -0 outer loop - vertex -0.231659 1.808 0.447482 - vertex -0.254264 1.808 0.38872 - vertex -0.209054 1.808 0.438447 + vertex -0.231659 1.7906 0.447482 + vertex -0.254264 1.7906 0.38872 + vertex -0.209054 1.7906 0.438447 endloop endfacet facet normal 0 -1 0 outer loop - vertex -0.24178 1.808 0.375478 - vertex -0.209054 1.808 0.438447 - vertex -0.254264 1.808 0.38872 + vertex -0.24178 1.7906 0.375478 + vertex -0.209054 1.7906 0.438447 + vertex -0.254264 1.7906 0.38872 endloop endfacet facet normal 0 -1 -0 outer loop - vertex -0.209054 1.808 0.438447 - vertex -0.24178 1.808 0.375478 - vertex -0.192105 1.808 0.424895 + vertex -0.209054 1.7906 0.438447 + vertex -0.24178 1.7906 0.375478 + vertex -0.192105 1.7906 0.424895 endloop endfacet facet normal 0 -1 -0 outer loop - vertex -0.192105 1.808 0.424895 - vertex -0.24178 1.808 0.375478 - vertex -0.181432 1.808 0.410963 + vertex -0.192105 1.7906 0.424895 + vertex -0.24178 1.7906 0.375478 + vertex -0.181432 1.7906 0.410963 endloop endfacet facet normal 0 -1 0 outer loop - vertex -0.24178 1.808 0.375478 - vertex -0.097237 1.808 0.0765288 - vertex -0.181432 1.808 0.410963 + vertex -0.24178 1.7906 0.375478 + vertex -0.097237 1.7906 0.0765288 + vertex -0.181432 1.7906 0.410963 endloop endfacet facet normal 0 -1 0 outer loop - vertex -0.158206 1.808 0.0452166 - vertex -0.097237 1.808 0.0765288 - vertex -0.24178 1.808 0.375478 + vertex -0.158206 1.7906 0.0452166 + vertex -0.097237 1.7906 0.0765288 + vertex -0.24178 1.7906 0.375478 endloop endfacet facet normal 0 -1 0 outer loop - vertex -0.152551 1.808 0.0361643 - vertex -0.097237 1.808 0.0765288 - vertex -0.158206 1.808 0.0452166 + vertex -0.152551 1.7906 0.0361643 + vertex -0.097237 1.7906 0.0765288 + vertex -0.158206 1.7906 0.0452166 endloop endfacet facet normal 0 -1 0 outer loop - vertex -0.135601 1.808 0.0180942 - vertex -0.097237 1.808 0.0765288 - vertex -0.152551 1.808 0.0361643 + vertex -0.135601 1.7906 0.0180942 + vertex -0.097237 1.7906 0.0765288 + vertex -0.152551 1.7906 0.0361643 endloop endfacet facet normal 0 -1 -0 outer loop - vertex -0.097237 1.808 0.0765288 - vertex -0.135601 1.808 0.0180942 - vertex -0.0847534 1.808 0.0632866 + vertex -0.097237 1.7906 0.0765288 + vertex -0.135601 1.7906 0.0180942 + vertex -0.0847534 1.7906 0.0632866 endloop endfacet facet normal 0 -1 0 outer loop - vertex -0.107358 1.808 0.00452441 - vertex -0.0847534 1.808 0.0632866 - vertex -0.135601 1.808 0.0180942 + vertex -0.107358 1.7906 0.00452441 + vertex -0.0847534 1.7906 0.0632866 + vertex -0.135601 1.7906 0.0180942 endloop endfacet facet normal 0 -1 -0 outer loop - vertex -0.0847534 1.808 0.0632866 - vertex -0.107358 1.808 0.00452441 - vertex -0.0621659 1.808 0.0497341 + vertex -0.0847534 1.7906 0.0632866 + vertex -0.107358 1.7906 0.00452441 + vertex -0.0621659 1.7906 0.0497341 endloop endfacet facet normal 0 -1 0 outer loop - vertex -0.0734597 1.808 -0.000527618 - vertex -0.0621659 1.808 0.0497341 - vertex -0.107358 1.808 0.00452441 + vertex -0.0734597 1.7906 -0.000527618 + vertex -0.0621659 1.7906 0.0497341 + vertex -0.107358 1.7906 0.00452441 endloop endfacet facet normal 0 -1 -0 outer loop - vertex -0.0621659 1.808 0.0497341 - vertex -0.0734597 1.808 -0.000527618 - vertex -0.039561 1.808 0.0452166 + vertex -0.0621659 1.7906 0.0497341 + vertex -0.0734597 1.7906 -0.000527618 + vertex -0.039561 1.7906 0.0452166 endloop endfacet facet normal -0 -1 0 outer loop - vertex 0.113 1.808 6.89697e-06 - vertex -0.039561 1.808 0.0452166 - vertex -0.0734597 1.808 -0.000527618 + vertex 0.113 1.7906 6.89697e-06 + vertex -0.039561 1.7906 0.0452166 + vertex -0.0734597 1.7906 -0.000527618 endloop endfacet facet normal 0 -1 0 outer loop - vertex -0.039561 1.808 0.0452166 - vertex 0.113 1.808 6.89697e-06 - vertex 0.113 1.808 0.0452166 + vertex -0.039561 1.7906 0.0452166 + vertex 0.113 1.7906 6.89697e-06 + vertex 0.113 1.7906 0.0452166 endloop endfacet facet normal 1 -0 0 outer loop - vertex 0.113 1.808 0.0452166 - vertex 0.113 2.2939 6.89697e-06 - vertex 0.113 2.2939 0.0452166 + vertex 0.113 1.7906 0.0452166 + vertex 0.113 2.2206 6.89697e-06 + vertex 0.113 2.2206 0.0452166 endloop endfacet facet normal 1 0 0 outer loop - vertex 0.113 2.2939 6.89697e-06 - vertex 0.113 1.808 0.0452166 - vertex 0.113 1.808 6.89697e-06 + vertex 0.113 2.2206 6.89697e-06 + vertex 0.113 1.7906 0.0452166 + vertex 0.113 1.7906 6.89697e-06 endloop endfacet facet normal -0 0 1 outer loop - vertex -0.039561 2.2939 0.0452166 - vertex 0.113 1.808 0.0452166 - vertex 0.113 2.2939 0.0452166 + vertex -0.039561 2.2206 0.0452166 + vertex 0.113 1.7906 0.0452166 + vertex 0.113 2.2206 0.0452166 endloop endfacet facet normal 0 0 1 outer loop - vertex 0.113 1.808 0.0452166 - vertex -0.039561 2.2939 0.0452166 - vertex -0.039561 1.808 0.0452166 + vertex 0.113 1.7906 0.0452166 + vertex -0.039561 2.2206 0.0452166 + vertex -0.039561 1.7906 0.0452166 endloop endfacet facet normal 0.195971 0 0.98061 outer loop - vertex -0.0621659 2.2939 0.0497341 - vertex -0.039561 1.808 0.0452166 - vertex -0.039561 2.2939 0.0452166 + vertex -0.0621659 2.2206 0.0497341 + vertex -0.039561 1.7906 0.0452166 + vertex -0.039561 2.2206 0.0452166 endloop endfacet facet normal 0.195971 0 0.98061 outer loop - vertex -0.039561 1.808 0.0452166 - vertex -0.0621659 2.2939 0.0497341 - vertex -0.0621659 1.808 0.0497341 + vertex -0.039561 1.7906 0.0452166 + vertex -0.0621659 2.2206 0.0497341 + vertex -0.0621659 1.7906 0.0497341 endloop endfacet facet normal 0.514496 0 0.857493 outer loop - vertex -0.0847534 2.2939 0.0632866 - vertex -0.0621659 1.808 0.0497341 - vertex -0.0621659 2.2939 0.0497341 + vertex -0.0847534 2.2206 0.0632866 + vertex -0.0621659 1.7906 0.0497341 + vertex -0.0621659 2.2206 0.0497341 endloop endfacet facet normal 0.514496 0 0.857493 outer loop - vertex -0.0621659 1.808 0.0497341 - vertex -0.0847534 2.2939 0.0632866 - vertex -0.0847534 1.808 0.0632866 + vertex -0.0621659 1.7906 0.0497341 + vertex -0.0847534 2.2206 0.0632866 + vertex -0.0847534 1.7906 0.0632866 endloop endfacet facet normal 0.727642 -0 0.685958 outer loop - vertex -0.097237 1.808 0.0765288 - vertex -0.0847534 2.2939 0.0632866 - vertex -0.097237 2.2939 0.0765288 + vertex -0.097237 1.7906 0.0765288 + vertex -0.0847534 2.2206 0.0632866 + vertex -0.097237 2.2206 0.0765288 endloop endfacet facet normal 0.727642 0 0.685958 outer loop - vertex -0.0847534 2.2939 0.0632866 - vertex -0.097237 1.808 0.0765288 - vertex -0.0847534 1.808 0.0632866 + vertex -0.0847534 2.2206 0.0632866 + vertex -0.097237 1.7906 0.0765288 + vertex -0.0847534 1.7906 0.0632866 endloop endfacet facet normal 0.969741 -0 0.244136 outer loop - vertex -0.181432 1.808 0.410963 - vertex -0.097237 2.2939 0.0765288 - vertex -0.181432 2.2939 0.410963 + vertex -0.181432 1.7906 0.410963 + vertex -0.097237 2.2206 0.0765288 + vertex -0.181432 2.2206 0.410963 endloop endfacet facet normal 0.969741 0 0.244136 outer loop - vertex -0.097237 2.2939 0.0765288 - vertex -0.181432 1.808 0.410963 - vertex -0.097237 1.808 0.0765288 + vertex -0.097237 2.2206 0.0765288 + vertex -0.181432 1.7906 0.410963 + vertex -0.097237 1.7906 0.0765288 endloop endfacet facet normal 0.793832 -0 0.608137 outer loop - vertex -0.192105 1.808 0.424895 - vertex -0.181432 2.2939 0.410963 - vertex -0.192105 2.2939 0.424895 + vertex -0.192105 1.7906 0.424895 + vertex -0.181432 2.2206 0.410963 + vertex -0.192105 2.2206 0.424895 endloop endfacet facet normal 0.793832 0 0.608137 outer loop - vertex -0.181432 2.2939 0.410963 - vertex -0.192105 1.808 0.424895 - vertex -0.181432 1.808 0.410963 + vertex -0.181432 2.2206 0.410963 + vertex -0.192105 1.7906 0.424895 + vertex -0.181432 1.7906 0.410963 endloop endfacet facet normal 0.624493 0 0.781031 outer loop - vertex -0.209054 2.2939 0.438447 - vertex -0.192105 1.808 0.424895 - vertex -0.192105 2.2939 0.424895 + vertex -0.209054 2.2206 0.438447 + vertex -0.192105 1.7906 0.424895 + vertex -0.192105 2.2206 0.424895 endloop endfacet facet normal 0.624493 0 0.781031 outer loop - vertex -0.192105 1.808 0.424895 - vertex -0.209054 2.2939 0.438447 - vertex -0.209054 1.808 0.438447 + vertex -0.192105 1.7906 0.424895 + vertex -0.209054 2.2206 0.438447 + vertex -0.209054 1.7906 0.438447 endloop endfacet facet normal 0.371143 0 0.928576 outer loop - vertex -0.231659 2.2939 0.447482 - vertex -0.209054 1.808 0.438447 - vertex -0.209054 2.2939 0.438447 + vertex -0.231659 2.2206 0.447482 + vertex -0.209054 1.7906 0.438447 + vertex -0.209054 2.2206 0.438447 endloop endfacet facet normal 0.371143 0 0.928576 outer loop - vertex -0.209054 1.808 0.438447 - vertex -0.231659 2.2939 0.447482 - vertex -0.231659 1.808 0.447482 + vertex -0.209054 1.7906 0.438447 + vertex -0.231659 2.2206 0.447482 + vertex -0.231659 1.7906 0.447482 endloop endfacet facet normal 0.157961 0 0.987445 outer loop - vertex -0.259902 2.2939 0.452 - vertex -0.231659 1.808 0.447482 - vertex -0.231659 2.2939 0.447482 + vertex -0.259902 2.2206 0.452 + vertex -0.231659 1.7906 0.447482 + vertex -0.231659 2.2206 0.447482 endloop endfacet facet normal 0.157961 0 0.987445 outer loop - vertex -0.231659 1.808 0.447482 - vertex -0.259902 2.2939 0.452 - vertex -0.259902 1.808 0.452 + vertex -0.231659 1.7906 0.447482 + vertex -0.259902 2.2206 0.452 + vertex -0.259902 1.7906 0.452 endloop endfacet facet normal -0 0 1 outer loop - vertex -0.395514 2.2939 0.452 - vertex -0.259902 1.808 0.452 - vertex -0.259902 2.2939 0.452 + vertex -0.395514 2.2206 0.452 + vertex -0.259902 1.7906 0.452 + vertex -0.259902 2.2206 0.452 endloop endfacet facet normal 0 0 1 outer loop - vertex -0.259902 1.808 0.452 - vertex -0.395514 2.2939 0.452 - vertex -0.395514 1.808 0.452 + vertex -0.259902 1.7906 0.452 + vertex -0.395514 2.2206 0.452 + vertex -0.395514 1.7906 0.452 endloop endfacet facet normal 0 0 -1 outer loop - vertex -0.408425 1.808 0.406808 - vertex -0.299456 2.2939 0.406808 - vertex -0.299456 1.808 0.406808 + vertex -0.408425 1.7906 0.406808 + vertex -0.299456 2.2206 0.406808 + vertex -0.299456 1.7906 0.406808 endloop endfacet facet normal -0 0 -1 outer loop - vertex -0.299456 2.2939 0.406808 - vertex -0.408425 1.808 0.406808 - vertex -0.408425 2.2939 0.406808 + vertex -0.299456 2.2206 0.406808 + vertex -0.408425 1.7906 0.406808 + vertex -0.408425 2.2206 0.406808 endloop endfacet facet normal -0.195991 0 -0.980606 outer loop - vertex -0.299456 1.808 0.406808 - vertex -0.276851 2.2939 0.40229 - vertex -0.276851 1.808 0.40229 + vertex -0.299456 1.7906 0.406808 + vertex -0.276851 2.2206 0.40229 + vertex -0.276851 1.7906 0.40229 endloop endfacet facet normal -0.195991 0 -0.980606 outer loop - vertex -0.276851 2.2939 0.40229 - vertex -0.299456 1.808 0.406808 - vertex -0.299456 2.2939 0.406808 + vertex -0.276851 2.2206 0.40229 + vertex -0.299456 1.7906 0.406808 + vertex -0.299456 2.2206 0.406808 endloop endfacet facet normal -0.514992 0 -0.857195 outer loop - vertex -0.276851 1.808 0.40229 - vertex -0.254264 2.2939 0.38872 - vertex -0.254264 1.808 0.38872 + vertex -0.276851 1.7906 0.40229 + vertex -0.254264 2.2206 0.38872 + vertex -0.254264 1.7906 0.38872 endloop endfacet facet normal -0.514992 0 -0.857195 outer loop - vertex -0.254264 2.2939 0.38872 - vertex -0.276851 1.808 0.40229 - vertex -0.276851 2.2939 0.40229 + vertex -0.254264 2.2206 0.38872 + vertex -0.276851 1.7906 0.40229 + vertex -0.276851 2.2206 0.40229 endloop endfacet facet normal -0.727625 0 -0.685975 outer loop - vertex -0.24178 1.808 0.375478 - vertex -0.254264 2.2939 0.38872 - vertex -0.24178 2.2939 0.375478 + vertex -0.24178 1.7906 0.375478 + vertex -0.254264 2.2206 0.38872 + vertex -0.24178 2.2206 0.375478 endloop endfacet facet normal -0.727625 -0 -0.685975 outer loop - vertex -0.254264 2.2939 0.38872 - vertex -0.24178 1.808 0.375478 - vertex -0.254264 1.808 0.38872 + vertex -0.254264 2.2206 0.38872 + vertex -0.24178 1.7906 0.375478 + vertex -0.254264 1.7906 0.38872 endloop endfacet facet normal -0.969442 0 -0.245321 outer loop - vertex -0.158206 1.808 0.0452166 - vertex -0.24178 2.2939 0.375478 - vertex -0.158206 2.2939 0.0452166 + vertex -0.158206 1.7906 0.0452166 + vertex -0.24178 2.2206 0.375478 + vertex -0.158206 2.2206 0.0452166 endloop endfacet facet normal -0.969442 -0 -0.245321 outer loop - vertex -0.24178 2.2939 0.375478 - vertex -0.158206 1.808 0.0452166 - vertex -0.24178 1.808 0.375478 + vertex -0.24178 2.2206 0.375478 + vertex -0.158206 1.7906 0.0452166 + vertex -0.24178 1.7906 0.375478 endloop endfacet facet normal -0.848111 0 -0.529818 outer loop - vertex -0.152551 1.808 0.0361643 - vertex -0.158206 2.2939 0.0452166 - vertex -0.152551 2.2939 0.0361643 + vertex -0.152551 1.7906 0.0361643 + vertex -0.158206 2.2206 0.0452166 + vertex -0.152551 2.2206 0.0361643 endloop endfacet facet normal -0.848111 -0 -0.529818 outer loop - vertex -0.158206 2.2939 0.0452166 - vertex -0.152551 1.808 0.0361643 - vertex -0.158206 1.808 0.0452166 + vertex -0.158206 2.2206 0.0452166 + vertex -0.152551 1.7906 0.0361643 + vertex -0.158206 1.7906 0.0452166 endloop endfacet facet normal -0.72935 0 -0.68414 outer loop - vertex -0.135601 1.808 0.0180942 - vertex -0.152551 2.2939 0.0361643 - vertex -0.135601 2.2939 0.0180942 + vertex -0.135601 1.7906 0.0180942 + vertex -0.152551 2.2206 0.0361643 + vertex -0.135601 2.2206 0.0180942 endloop endfacet facet normal -0.72935 -0 -0.68414 outer loop - vertex -0.152551 2.2939 0.0361643 - vertex -0.135601 1.808 0.0180942 - vertex -0.152551 1.808 0.0361643 + vertex -0.152551 2.2206 0.0361643 + vertex -0.135601 1.7906 0.0180942 + vertex -0.152551 1.7906 0.0361643 endloop endfacet facet normal -0.433072 0 -0.901359 outer loop - vertex -0.135601 1.808 0.0180942 - vertex -0.107358 2.2939 0.00452441 - vertex -0.107358 1.808 0.00452441 + vertex -0.135601 1.7906 0.0180942 + vertex -0.107358 2.2206 0.00452441 + vertex -0.107358 1.7906 0.00452441 endloop endfacet facet normal -0.433072 0 -0.901359 outer loop - vertex -0.107358 2.2939 0.00452441 - vertex -0.135601 1.808 0.0180942 - vertex -0.135601 2.2939 0.0180942 + vertex -0.107358 2.2206 0.00452441 + vertex -0.135601 1.7906 0.0180942 + vertex -0.135601 2.2206 0.0180942 endloop endfacet facet normal -0.147407 0 -0.989076 outer loop - vertex -0.107358 1.808 0.00452441 - vertex -0.0734597 2.2939 -0.000527618 - vertex -0.0734597 1.808 -0.000527618 + vertex -0.107358 1.7906 0.00452441 + vertex -0.0734597 2.2206 -0.000527618 + vertex -0.0734597 1.7906 -0.000527618 endloop endfacet facet normal -0.147407 0 -0.989076 outer loop - vertex -0.0734597 2.2939 -0.000527618 - vertex -0.107358 1.808 0.00452441 - vertex -0.107358 2.2939 0.00452441 + vertex -0.0734597 2.2206 -0.000527618 + vertex -0.107358 1.7906 0.00452441 + vertex -0.107358 2.2206 0.00452441 endloop endfacet facet normal 0.00286664 0 -0.999996 outer loop - vertex -0.0734597 1.808 -0.000527618 - vertex 0.113 2.2939 6.89697e-06 - vertex 0.113 1.808 6.89697e-06 + vertex -0.0734597 1.7906 -0.000527618 + vertex 0.113 2.2206 6.89697e-06 + vertex 0.113 1.7906 6.89697e-06 endloop endfacet facet normal 0.00286664 0 -0.999996 outer loop - vertex 0.113 2.2939 6.89697e-06 - vertex -0.0734597 1.808 -0.000527618 - vertex -0.0734597 2.2939 -0.000527618 + vertex 0.113 2.2206 6.89697e-06 + vertex -0.0734597 1.7906 -0.000527618 + vertex -0.0734597 2.2206 -0.000527618 endloop endfacet facet normal 0 1 -0 outer loop - vertex 0.113 0.259901 6.89697e-06 - vertex -0.039561 0.259901 0.0452166 - vertex 0.113 0.259901 0.0452166 + vertex 0.113 0.239401 6.89697e-06 + vertex -0.039561 0.239401 0.0452166 + vertex 0.113 0.239401 0.0452166 endloop endfacet facet normal -0 1 0 outer loop - vertex -0.107358 0.259901 0.00452441 - vertex -0.039561 0.259901 0.0452166 - vertex -0.0734597 0.259901 -0.000527618 + vertex -0.107358 0.239401 0.00452441 + vertex -0.039561 0.239401 0.0452166 + vertex -0.0734597 0.239401 -0.000527618 endloop endfacet facet normal -0 1 0 outer loop - vertex -0.135601 0.259901 0.0180942 - vertex -0.039561 0.259901 0.0452166 - vertex -0.107358 0.259901 0.00452441 + vertex -0.135601 0.239401 0.0180942 + vertex -0.039561 0.239401 0.0452166 + vertex -0.107358 0.239401 0.00452441 endloop endfacet facet normal 0 1 0 outer loop - vertex -0.039561 0.259901 0.0452166 - vertex -0.152551 0.259901 0.0361643 - vertex -0.158206 0.259901 0.0452166 + vertex -0.039561 0.239401 0.0452166 + vertex -0.152551 0.239401 0.0361643 + vertex -0.158206 0.239401 0.0452166 endloop endfacet facet normal 0 1 0 outer loop - vertex -0.039561 0.259901 0.0452166 - vertex 0.113 0.259901 6.89697e-06 - vertex -0.0734597 0.259901 -0.000527618 + vertex -0.039561 0.239401 0.0452166 + vertex 0.113 0.239401 6.89697e-06 + vertex -0.0734597 0.239401 -0.000527618 endloop endfacet facet normal 0 1 0 outer loop - vertex -0.039561 0.259901 0.0452166 - vertex -0.135601 0.259901 0.0180942 - vertex -0.152551 0.259901 0.0361643 + vertex -0.039561 0.239401 0.0452166 + vertex -0.135601 0.239401 0.0180942 + vertex -0.152551 0.239401 0.0361643 endloop endfacet facet normal 0 1 0 outer loop - vertex -0.259902 0.259901 0.452 - vertex -0.276851 0.259901 0.40229 - vertex -0.299456 0.259901 0.406808 + vertex -0.259902 0.239401 0.452 + vertex -0.276851 0.239401 0.40229 + vertex -0.299456 0.239401 0.406808 endloop endfacet facet normal 0 1 0 outer loop - vertex -0.192105 0.259901 0.424895 - vertex -0.254264 0.259901 0.38872 - vertex -0.276851 0.259901 0.40229 + vertex -0.192105 0.239401 0.424895 + vertex -0.254264 0.239401 0.38872 + vertex -0.276851 0.239401 0.40229 endloop endfacet facet normal 0 1 0 outer loop - vertex -0.192105 0.259901 0.424895 - vertex -0.24178 0.259901 0.375478 - vertex -0.254264 0.259901 0.38872 + vertex -0.192105 0.239401 0.424895 + vertex -0.24178 0.239401 0.375478 + vertex -0.254264 0.239401 0.38872 endloop endfacet facet normal 0 1 0 outer loop - vertex -0.097237 0.259901 0.0765288 - vertex -0.24178 0.259901 0.375478 - vertex -0.181432 0.259901 0.410963 + vertex -0.097237 0.239401 0.0765288 + vertex -0.24178 0.239401 0.375478 + vertex -0.181432 0.239401 0.410963 endloop endfacet facet normal 0 1 0 outer loop - vertex -0.097237 0.259901 0.0765288 - vertex -0.158206 0.259901 0.0452166 - vertex -0.24178 0.259901 0.375478 + vertex -0.097237 0.239401 0.0765288 + vertex -0.158206 0.239401 0.0452166 + vertex -0.24178 0.239401 0.375478 endloop endfacet facet normal 0 1 0 outer loop - vertex -0.0847534 0.259901 0.0632866 - vertex -0.158206 0.259901 0.0452166 - vertex -0.097237 0.259901 0.0765288 + vertex -0.0847534 0.239401 0.0632866 + vertex -0.158206 0.239401 0.0452166 + vertex -0.097237 0.239401 0.0765288 endloop endfacet facet normal 0 1 0 outer loop - vertex -0.0621659 0.259901 0.0497341 - vertex -0.158206 0.259901 0.0452166 - vertex -0.0847534 0.259901 0.0632866 + vertex -0.0621659 0.239401 0.0497341 + vertex -0.158206 0.239401 0.0452166 + vertex -0.0847534 0.239401 0.0632866 endloop endfacet facet normal 0 1 0 outer loop - vertex -0.158206 0.259901 0.0452166 - vertex -0.0621659 0.259901 0.0497341 - vertex -0.039561 0.259901 0.0452166 + vertex -0.158206 0.239401 0.0452166 + vertex -0.0621659 0.239401 0.0497341 + vertex -0.039561 0.239401 0.0452166 endloop endfacet facet normal 0 1 0 outer loop - vertex -0.276851 0.259901 0.40229 - vertex -0.259902 0.259901 0.452 - vertex -0.231659 0.259901 0.447482 + vertex -0.276851 0.239401 0.40229 + vertex -0.259902 0.239401 0.452 + vertex -0.231659 0.239401 0.447482 endloop endfacet facet normal 0 1 0 outer loop - vertex -0.276851 0.259901 0.40229 - vertex -0.231659 0.259901 0.447482 - vertex -0.209054 0.259901 0.438447 + vertex -0.276851 0.239401 0.40229 + vertex -0.231659 0.239401 0.447482 + vertex -0.209054 0.239401 0.438447 endloop endfacet facet normal 0 1 0 outer loop - vertex -0.276851 0.259901 0.40229 - vertex -0.209054 0.259901 0.438447 - vertex -0.192105 0.259901 0.424895 + vertex -0.276851 0.239401 0.40229 + vertex -0.209054 0.239401 0.438447 + vertex -0.192105 0.239401 0.424895 endloop endfacet facet normal 0 1 0 outer loop - vertex -0.24178 0.259901 0.375478 - vertex -0.192105 0.259901 0.424895 - vertex -0.181432 0.259901 0.410963 + vertex -0.24178 0.239401 0.375478 + vertex -0.192105 0.239401 0.424895 + vertex -0.181432 0.239401 0.410963 endloop endfacet facet normal 0 1 0 outer loop - vertex -0.259902 0.259901 0.452 - vertex -0.299456 0.259901 0.406808 - vertex -0.395514 0.259901 0.452 + vertex -0.259902 0.239401 0.452 + vertex -0.299456 0.239401 0.406808 + vertex -0.395514 0.239401 0.452 endloop endfacet facet normal 0 1 0 outer loop - vertex -0.395514 0.259901 0.452 - vertex -0.299456 0.259901 0.406808 - vertex -0.408425 0.259901 0.406808 + vertex -0.395514 0.239401 0.452 + vertex -0.299456 0.239401 0.406808 + vertex -0.408425 0.239401 0.406808 endloop endfacet facet normal 0 -1 0 outer loop - vertex -0.299456 -0.225999 0.406808 - vertex -0.259902 -0.225999 0.452 - vertex -0.395514 -0.225999 0.452 + vertex -0.299456 -0.1906 0.406808 + vertex -0.259902 -0.1906 0.452 + vertex -0.395514 -0.1906 0.452 endloop endfacet facet normal 0 -1 0 outer loop - vertex -0.276851 -0.225999 0.40229 - vertex -0.259902 -0.225999 0.452 - vertex -0.299456 -0.225999 0.406808 + vertex -0.276851 -0.1906 0.40229 + vertex -0.259902 -0.1906 0.452 + vertex -0.299456 -0.1906 0.406808 endloop endfacet facet normal 0 -1 -0 outer loop - vertex -0.259902 -0.225999 0.452 - vertex -0.276851 -0.225999 0.40229 - vertex -0.231659 -0.225999 0.447482 + vertex -0.259902 -0.1906 0.452 + vertex -0.276851 -0.1906 0.40229 + vertex -0.231659 -0.1906 0.447482 endloop endfacet facet normal 0 -1 0 outer loop - vertex -0.254264 -0.225999 0.38872 - vertex -0.231659 -0.225999 0.447482 - vertex -0.276851 -0.225999 0.40229 + vertex -0.254264 -0.1906 0.38872 + vertex -0.231659 -0.1906 0.447482 + vertex -0.276851 -0.1906 0.40229 endloop endfacet facet normal 0 -1 0 outer loop - vertex -0.299456 -0.225999 0.406808 - vertex -0.395514 -0.225999 0.452 - vertex -0.408425 -0.225999 0.406808 + vertex -0.299456 -0.1906 0.406808 + vertex -0.395514 -0.1906 0.452 + vertex -0.408425 -0.1906 0.406808 endloop endfacet facet normal 0 -1 -0 outer loop - vertex -0.231659 -0.225999 0.447482 - vertex -0.254264 -0.225999 0.38872 - vertex -0.209054 -0.225999 0.438447 + vertex -0.231659 -0.1906 0.447482 + vertex -0.254264 -0.1906 0.38872 + vertex -0.209054 -0.1906 0.438447 endloop endfacet facet normal 0 -1 0 outer loop - vertex -0.24178 -0.225999 0.375478 - vertex -0.209054 -0.225999 0.438447 - vertex -0.254264 -0.225999 0.38872 + vertex -0.24178 -0.1906 0.375478 + vertex -0.209054 -0.1906 0.438447 + vertex -0.254264 -0.1906 0.38872 endloop endfacet facet normal 0 -1 -0 outer loop - vertex -0.209054 -0.225999 0.438447 - vertex -0.24178 -0.225999 0.375478 - vertex -0.192105 -0.225999 0.424895 + vertex -0.209054 -0.1906 0.438447 + vertex -0.24178 -0.1906 0.375478 + vertex -0.192105 -0.1906 0.424895 endloop endfacet facet normal 0 -1 -0 outer loop - vertex -0.192105 -0.225999 0.424895 - vertex -0.24178 -0.225999 0.375478 - vertex -0.181432 -0.225999 0.410963 + vertex -0.192105 -0.1906 0.424895 + vertex -0.24178 -0.1906 0.375478 + vertex -0.181432 -0.1906 0.410963 endloop endfacet facet normal 0 -1 0 outer loop - vertex -0.24178 -0.225999 0.375478 - vertex -0.097237 -0.225999 0.0765288 - vertex -0.181432 -0.225999 0.410963 + vertex -0.24178 -0.1906 0.375478 + vertex -0.097237 -0.1906 0.0765288 + vertex -0.181432 -0.1906 0.410963 endloop endfacet facet normal 0 -1 0 outer loop - vertex -0.158206 -0.225999 0.0452166 - vertex -0.097237 -0.225999 0.0765288 - vertex -0.24178 -0.225999 0.375478 + vertex -0.158206 -0.1906 0.0452166 + vertex -0.097237 -0.1906 0.0765288 + vertex -0.24178 -0.1906 0.375478 endloop endfacet facet normal 0 -1 0 outer loop - vertex -0.152551 -0.225999 0.0361643 - vertex -0.097237 -0.225999 0.0765288 - vertex -0.158206 -0.225999 0.0452166 + vertex -0.152551 -0.1906 0.0361643 + vertex -0.097237 -0.1906 0.0765288 + vertex -0.158206 -0.1906 0.0452166 endloop endfacet facet normal 0 -1 0 outer loop - vertex -0.135601 -0.225999 0.0180942 - vertex -0.097237 -0.225999 0.0765288 - vertex -0.152551 -0.225999 0.0361643 + vertex -0.135601 -0.1906 0.0180942 + vertex -0.097237 -0.1906 0.0765288 + vertex -0.152551 -0.1906 0.0361643 endloop endfacet facet normal 0 -1 -0 outer loop - vertex -0.097237 -0.225999 0.0765288 - vertex -0.135601 -0.225999 0.0180942 - vertex -0.0847534 -0.225999 0.0632866 + vertex -0.097237 -0.1906 0.0765288 + vertex -0.135601 -0.1906 0.0180942 + vertex -0.0847534 -0.1906 0.0632866 endloop endfacet facet normal 0 -1 0 outer loop - vertex -0.107358 -0.225999 0.00452441 - vertex -0.0847534 -0.225999 0.0632866 - vertex -0.135601 -0.225999 0.0180942 + vertex -0.107358 -0.1906 0.00452441 + vertex -0.0847534 -0.1906 0.0632866 + vertex -0.135601 -0.1906 0.0180942 endloop endfacet facet normal 0 -1 -0 outer loop - vertex -0.0847534 -0.225999 0.0632866 - vertex -0.107358 -0.225999 0.00452441 - vertex -0.0621659 -0.225999 0.0497341 + vertex -0.0847534 -0.1906 0.0632866 + vertex -0.107358 -0.1906 0.00452441 + vertex -0.0621659 -0.1906 0.0497341 endloop endfacet facet normal 0 -1 0 outer loop - vertex -0.0734597 -0.225999 -0.000527618 - vertex -0.0621659 -0.225999 0.0497341 - vertex -0.107358 -0.225999 0.00452441 + vertex -0.0734597 -0.1906 -0.000527618 + vertex -0.0621659 -0.1906 0.0497341 + vertex -0.107358 -0.1906 0.00452441 endloop endfacet facet normal 0 -1 -0 outer loop - vertex -0.0621659 -0.225999 0.0497341 - vertex -0.0734597 -0.225999 -0.000527618 - vertex -0.039561 -0.225999 0.0452166 + vertex -0.0621659 -0.1906 0.0497341 + vertex -0.0734597 -0.1906 -0.000527618 + vertex -0.039561 -0.1906 0.0452166 endloop endfacet facet normal -0 -1 0 outer loop - vertex 0.113 -0.225999 6.89697e-06 - vertex -0.039561 -0.225999 0.0452166 - vertex -0.0734597 -0.225999 -0.000527618 + vertex 0.113 -0.1906 6.89697e-06 + vertex -0.039561 -0.1906 0.0452166 + vertex -0.0734597 -0.1906 -0.000527618 endloop endfacet facet normal 0 -1 0 outer loop - vertex -0.039561 -0.225999 0.0452166 - vertex 0.113 -0.225999 6.89697e-06 - vertex 0.113 -0.225999 0.0452166 + vertex -0.039561 -0.1906 0.0452166 + vertex 0.113 -0.1906 6.89697e-06 + vertex 0.113 -0.1906 0.0452166 endloop endfacet facet normal 1 -0 0 outer loop - vertex 0.113 -0.225999 0.0452166 - vertex 0.113 0.259901 6.89697e-06 - vertex 0.113 0.259901 0.0452166 + vertex 0.113 -0.1906 0.0452166 + vertex 0.113 0.239401 6.89697e-06 + vertex 0.113 0.239401 0.0452166 endloop endfacet facet normal 1 0 0 outer loop - vertex 0.113 0.259901 6.89697e-06 - vertex 0.113 -0.225999 0.0452166 - vertex 0.113 -0.225999 6.89697e-06 + vertex 0.113 0.239401 6.89697e-06 + vertex 0.113 -0.1906 0.0452166 + vertex 0.113 -0.1906 6.89697e-06 endloop endfacet facet normal -0 0 1 outer loop - vertex -0.039561 0.259901 0.0452166 - vertex 0.113 -0.225999 0.0452166 - vertex 0.113 0.259901 0.0452166 + vertex -0.039561 0.239401 0.0452166 + vertex 0.113 -0.1906 0.0452166 + vertex 0.113 0.239401 0.0452166 endloop endfacet facet normal 0 0 1 outer loop - vertex 0.113 -0.225999 0.0452166 - vertex -0.039561 0.259901 0.0452166 - vertex -0.039561 -0.225999 0.0452166 + vertex 0.113 -0.1906 0.0452166 + vertex -0.039561 0.239401 0.0452166 + vertex -0.039561 -0.1906 0.0452166 endloop endfacet facet normal 0.195971 0 0.98061 outer loop - vertex -0.0621659 0.259901 0.0497341 - vertex -0.039561 -0.225999 0.0452166 - vertex -0.039561 0.259901 0.0452166 + vertex -0.0621659 0.239401 0.0497341 + vertex -0.039561 -0.1906 0.0452166 + vertex -0.039561 0.239401 0.0452166 endloop endfacet facet normal 0.195971 0 0.98061 outer loop - vertex -0.039561 -0.225999 0.0452166 - vertex -0.0621659 0.259901 0.0497341 - vertex -0.0621659 -0.225999 0.0497341 + vertex -0.039561 -0.1906 0.0452166 + vertex -0.0621659 0.239401 0.0497341 + vertex -0.0621659 -0.1906 0.0497341 endloop endfacet facet normal 0.514496 0 0.857493 outer loop - vertex -0.0847534 0.259901 0.0632866 - vertex -0.0621659 -0.225999 0.0497341 - vertex -0.0621659 0.259901 0.0497341 + vertex -0.0847534 0.239401 0.0632866 + vertex -0.0621659 -0.1906 0.0497341 + vertex -0.0621659 0.239401 0.0497341 endloop endfacet facet normal 0.514496 0 0.857493 outer loop - vertex -0.0621659 -0.225999 0.0497341 - vertex -0.0847534 0.259901 0.0632866 - vertex -0.0847534 -0.225999 0.0632866 + vertex -0.0621659 -0.1906 0.0497341 + vertex -0.0847534 0.239401 0.0632866 + vertex -0.0847534 -0.1906 0.0632866 endloop endfacet facet normal 0.727642 -0 0.685958 outer loop - vertex -0.097237 -0.225999 0.0765288 - vertex -0.0847534 0.259901 0.0632866 - vertex -0.097237 0.259901 0.0765288 + vertex -0.097237 -0.1906 0.0765288 + vertex -0.0847534 0.239401 0.0632866 + vertex -0.097237 0.239401 0.0765288 endloop endfacet facet normal 0.727642 0 0.685958 outer loop - vertex -0.0847534 0.259901 0.0632866 - vertex -0.097237 -0.225999 0.0765288 - vertex -0.0847534 -0.225999 0.0632866 + vertex -0.0847534 0.239401 0.0632866 + vertex -0.097237 -0.1906 0.0765288 + vertex -0.0847534 -0.1906 0.0632866 endloop endfacet facet normal 0.969741 -0 0.244136 outer loop - vertex -0.181432 -0.225999 0.410963 - vertex -0.097237 0.259901 0.0765288 - vertex -0.181432 0.259901 0.410963 + vertex -0.181432 -0.1906 0.410963 + vertex -0.097237 0.239401 0.0765288 + vertex -0.181432 0.239401 0.410963 endloop endfacet facet normal 0.969741 0 0.244136 outer loop - vertex -0.097237 0.259901 0.0765288 - vertex -0.181432 -0.225999 0.410963 - vertex -0.097237 -0.225999 0.0765288 + vertex -0.097237 0.239401 0.0765288 + vertex -0.181432 -0.1906 0.410963 + vertex -0.097237 -0.1906 0.0765288 endloop endfacet facet normal 0.793832 -0 0.608137 outer loop - vertex -0.192105 -0.225999 0.424895 - vertex -0.181432 0.259901 0.410963 - vertex -0.192105 0.259901 0.424895 + vertex -0.192105 -0.1906 0.424895 + vertex -0.181432 0.239401 0.410963 + vertex -0.192105 0.239401 0.424895 endloop endfacet facet normal 0.793832 0 0.608137 outer loop - vertex -0.181432 0.259901 0.410963 - vertex -0.192105 -0.225999 0.424895 - vertex -0.181432 -0.225999 0.410963 + vertex -0.181432 0.239401 0.410963 + vertex -0.192105 -0.1906 0.424895 + vertex -0.181432 -0.1906 0.410963 endloop endfacet facet normal 0.624493 0 0.781031 outer loop - vertex -0.209054 0.259901 0.438447 - vertex -0.192105 -0.225999 0.424895 - vertex -0.192105 0.259901 0.424895 + vertex -0.209054 0.239401 0.438447 + vertex -0.192105 -0.1906 0.424895 + vertex -0.192105 0.239401 0.424895 endloop endfacet facet normal 0.624493 0 0.781031 outer loop - vertex -0.192105 -0.225999 0.424895 - vertex -0.209054 0.259901 0.438447 - vertex -0.209054 -0.225999 0.438447 + vertex -0.192105 -0.1906 0.424895 + vertex -0.209054 0.239401 0.438447 + vertex -0.209054 -0.1906 0.438447 endloop endfacet facet normal 0.371143 0 0.928576 outer loop - vertex -0.231659 0.259901 0.447482 - vertex -0.209054 -0.225999 0.438447 - vertex -0.209054 0.259901 0.438447 + vertex -0.231659 0.239401 0.447482 + vertex -0.209054 -0.1906 0.438447 + vertex -0.209054 0.239401 0.438447 endloop endfacet facet normal 0.371143 0 0.928576 outer loop - vertex -0.209054 -0.225999 0.438447 - vertex -0.231659 0.259901 0.447482 - vertex -0.231659 -0.225999 0.447482 + vertex -0.209054 -0.1906 0.438447 + vertex -0.231659 0.239401 0.447482 + vertex -0.231659 -0.1906 0.447482 endloop endfacet facet normal 0.157961 0 0.987445 outer loop - vertex -0.259902 0.259901 0.452 - vertex -0.231659 -0.225999 0.447482 - vertex -0.231659 0.259901 0.447482 + vertex -0.259902 0.239401 0.452 + vertex -0.231659 -0.1906 0.447482 + vertex -0.231659 0.239401 0.447482 endloop endfacet facet normal 0.157961 0 0.987445 outer loop - vertex -0.231659 -0.225999 0.447482 - vertex -0.259902 0.259901 0.452 - vertex -0.259902 -0.225999 0.452 + vertex -0.231659 -0.1906 0.447482 + vertex -0.259902 0.239401 0.452 + vertex -0.259902 -0.1906 0.452 endloop endfacet facet normal -0 0 1 outer loop - vertex -0.395514 0.259901 0.452 - vertex -0.259902 -0.225999 0.452 - vertex -0.259902 0.259901 0.452 + vertex -0.395514 0.239401 0.452 + vertex -0.259902 -0.1906 0.452 + vertex -0.259902 0.239401 0.452 endloop endfacet facet normal 0 0 1 outer loop - vertex -0.259902 -0.225999 0.452 - vertex -0.395514 0.259901 0.452 - vertex -0.395514 -0.225999 0.452 + vertex -0.259902 -0.1906 0.452 + vertex -0.395514 0.239401 0.452 + vertex -0.395514 -0.1906 0.452 endloop endfacet facet normal 0 0 -1 outer loop - vertex -0.408425 -0.225999 0.406808 - vertex -0.299456 0.259901 0.406808 - vertex -0.299456 -0.225999 0.406808 + vertex -0.408425 -0.1906 0.406808 + vertex -0.299456 0.239401 0.406808 + vertex -0.299456 -0.1906 0.406808 endloop endfacet facet normal -0 0 -1 outer loop - vertex -0.299456 0.259901 0.406808 - vertex -0.408425 -0.225999 0.406808 - vertex -0.408425 0.259901 0.406808 + vertex -0.299456 0.239401 0.406808 + vertex -0.408425 -0.1906 0.406808 + vertex -0.408425 0.239401 0.406808 endloop endfacet facet normal -0.195991 0 -0.980606 outer loop - vertex -0.299456 -0.225999 0.406808 - vertex -0.276851 0.259901 0.40229 - vertex -0.276851 -0.225999 0.40229 + vertex -0.299456 -0.1906 0.406808 + vertex -0.276851 0.239401 0.40229 + vertex -0.276851 -0.1906 0.40229 endloop endfacet facet normal -0.195991 0 -0.980606 outer loop - vertex -0.276851 0.259901 0.40229 - vertex -0.299456 -0.225999 0.406808 - vertex -0.299456 0.259901 0.406808 + vertex -0.276851 0.239401 0.40229 + vertex -0.299456 -0.1906 0.406808 + vertex -0.299456 0.239401 0.406808 endloop endfacet facet normal -0.514992 0 -0.857195 outer loop - vertex -0.276851 -0.225999 0.40229 - vertex -0.254264 0.259901 0.38872 - vertex -0.254264 -0.225999 0.38872 + vertex -0.276851 -0.1906 0.40229 + vertex -0.254264 0.239401 0.38872 + vertex -0.254264 -0.1906 0.38872 endloop endfacet facet normal -0.514992 0 -0.857195 outer loop - vertex -0.254264 0.259901 0.38872 - vertex -0.276851 -0.225999 0.40229 - vertex -0.276851 0.259901 0.40229 + vertex -0.254264 0.239401 0.38872 + vertex -0.276851 -0.1906 0.40229 + vertex -0.276851 0.239401 0.40229 endloop endfacet facet normal -0.727625 0 -0.685975 outer loop - vertex -0.24178 -0.225999 0.375478 - vertex -0.254264 0.259901 0.38872 - vertex -0.24178 0.259901 0.375478 + vertex -0.24178 -0.1906 0.375478 + vertex -0.254264 0.239401 0.38872 + vertex -0.24178 0.239401 0.375478 endloop endfacet facet normal -0.727625 -0 -0.685975 outer loop - vertex -0.254264 0.259901 0.38872 - vertex -0.24178 -0.225999 0.375478 - vertex -0.254264 -0.225999 0.38872 + vertex -0.254264 0.239401 0.38872 + vertex -0.24178 -0.1906 0.375478 + vertex -0.254264 -0.1906 0.38872 endloop endfacet facet normal -0.969442 0 -0.245321 outer loop - vertex -0.158206 -0.225999 0.0452166 - vertex -0.24178 0.259901 0.375478 - vertex -0.158206 0.259901 0.0452166 + vertex -0.158206 -0.1906 0.0452166 + vertex -0.24178 0.239401 0.375478 + vertex -0.158206 0.239401 0.0452166 endloop endfacet facet normal -0.969442 -0 -0.245321 outer loop - vertex -0.24178 0.259901 0.375478 - vertex -0.158206 -0.225999 0.0452166 - vertex -0.24178 -0.225999 0.375478 + vertex -0.24178 0.239401 0.375478 + vertex -0.158206 -0.1906 0.0452166 + vertex -0.24178 -0.1906 0.375478 endloop endfacet facet normal -0.848111 0 -0.529818 outer loop - vertex -0.152551 -0.225999 0.0361643 - vertex -0.158206 0.259901 0.0452166 - vertex -0.152551 0.259901 0.0361643 + vertex -0.152551 -0.1906 0.0361643 + vertex -0.158206 0.239401 0.0452166 + vertex -0.152551 0.239401 0.0361643 endloop endfacet facet normal -0.848111 -0 -0.529818 outer loop - vertex -0.158206 0.259901 0.0452166 - vertex -0.152551 -0.225999 0.0361643 - vertex -0.158206 -0.225999 0.0452166 + vertex -0.158206 0.239401 0.0452166 + vertex -0.152551 -0.1906 0.0361643 + vertex -0.158206 -0.1906 0.0452166 endloop endfacet facet normal -0.72935 0 -0.68414 outer loop - vertex -0.135601 -0.225999 0.0180942 - vertex -0.152551 0.259901 0.0361643 - vertex -0.135601 0.259901 0.0180942 + vertex -0.135601 -0.1906 0.0180942 + vertex -0.152551 0.239401 0.0361643 + vertex -0.135601 0.239401 0.0180942 endloop endfacet facet normal -0.72935 -0 -0.68414 outer loop - vertex -0.152551 0.259901 0.0361643 - vertex -0.135601 -0.225999 0.0180942 - vertex -0.152551 -0.225999 0.0361643 + vertex -0.152551 0.239401 0.0361643 + vertex -0.135601 -0.1906 0.0180942 + vertex -0.152551 -0.1906 0.0361643 endloop endfacet facet normal -0.433072 0 -0.901359 outer loop - vertex -0.135601 -0.225999 0.0180942 - vertex -0.107358 0.259901 0.00452441 - vertex -0.107358 -0.225999 0.00452441 + vertex -0.135601 -0.1906 0.0180942 + vertex -0.107358 0.239401 0.00452441 + vertex -0.107358 -0.1906 0.00452441 endloop endfacet facet normal -0.433072 0 -0.901359 outer loop - vertex -0.107358 0.259901 0.00452441 - vertex -0.135601 -0.225999 0.0180942 - vertex -0.135601 0.259901 0.0180942 + vertex -0.107358 0.239401 0.00452441 + vertex -0.135601 -0.1906 0.0180942 + vertex -0.135601 0.239401 0.0180942 endloop endfacet facet normal -0.147407 0 -0.989076 outer loop - vertex -0.107358 -0.225999 0.00452441 - vertex -0.0734597 0.259901 -0.000527618 - vertex -0.0734597 -0.225999 -0.000527618 + vertex -0.107358 -0.1906 0.00452441 + vertex -0.0734597 0.239401 -0.000527618 + vertex -0.0734597 -0.1906 -0.000527618 endloop endfacet facet normal -0.147407 0 -0.989076 outer loop - vertex -0.0734597 0.259901 -0.000527618 - vertex -0.107358 -0.225999 0.00452441 - vertex -0.107358 0.259901 0.00452441 + vertex -0.0734597 0.239401 -0.000527618 + vertex -0.107358 -0.1906 0.00452441 + vertex -0.107358 0.239401 0.00452441 endloop endfacet facet normal 0.00286664 0 -0.999996 outer loop - vertex -0.0734597 -0.225999 -0.000527618 - vertex 0.113 0.259901 6.89697e-06 - vertex 0.113 -0.225999 6.89697e-06 + vertex -0.0734597 -0.1906 -0.000527618 + vertex 0.113 0.239401 6.89697e-06 + vertex 0.113 -0.1906 6.89697e-06 endloop endfacet facet normal 0.00286664 0 -0.999996 outer loop - vertex 0.113 0.259901 6.89697e-06 - vertex -0.0734597 -0.225999 -0.000527618 - vertex -0.0734597 0.259901 -0.000527618 + vertex 0.113 0.239401 6.89697e-06 + vertex -0.0734597 -0.1906 -0.000527618 + vertex -0.0734597 0.239401 -0.000527618 endloop endfacet facet normal 0 1 -0 outer loop - vertex -1.73454 1.2204 0.406804 - vertex -1.7741 1.2204 0.452 - vertex -1.63849 1.2204 0.452 + vertex -1.73454 1.23 0.406804 + vertex -1.7741 1.23 0.452 + vertex -1.63849 1.23 0.452 endloop endfacet facet normal 0 1 -0 outer loop - vertex -1.75715 1.2204 0.402287 - vertex -1.7741 1.2204 0.452 - vertex -1.73454 1.2204 0.406804 + vertex -1.75715 1.23 0.402287 + vertex -1.7741 1.23 0.452 + vertex -1.73454 1.23 0.406804 endloop endfacet facet normal 0 1 0 outer loop - vertex -1.7741 1.2204 0.452 - vertex -1.75715 1.2204 0.402287 - vertex -1.80235 1.2204 0.447482 + vertex -1.7741 1.23 0.452 + vertex -1.75715 1.23 0.402287 + vertex -1.80235 1.23 0.447482 endloop endfacet facet normal 0 1 -0 outer loop - vertex -1.77974 1.2204 0.38872 - vertex -1.80235 1.2204 0.447482 - vertex -1.75715 1.2204 0.402287 + vertex -1.77974 1.23 0.38872 + vertex -1.80235 1.23 0.447482 + vertex -1.75715 1.23 0.402287 endloop endfacet facet normal 0 1 0 outer loop - vertex -1.73454 1.2204 0.406804 - vertex -1.63849 1.2204 0.452 - vertex -1.62557 1.2204 0.406804 + vertex -1.73454 1.23 0.406804 + vertex -1.63849 1.23 0.452 + vertex -1.62557 1.23 0.406804 endloop endfacet facet normal 0 1 0 outer loop - vertex -1.80235 1.2204 0.447482 - vertex -1.77974 1.2204 0.38872 - vertex -1.82495 1.2204 0.438441 + vertex -1.80235 1.23 0.447482 + vertex -1.77974 1.23 0.38872 + vertex -1.82495 1.23 0.438441 endloop endfacet facet normal 0 1 -0 outer loop - vertex -1.79223 1.2204 0.375478 - vertex -1.82495 1.2204 0.438441 - vertex -1.77974 1.2204 0.38872 + vertex -1.79223 1.23 0.375478 + vertex -1.82495 1.23 0.438441 + vertex -1.77974 1.23 0.38872 endloop endfacet facet normal 0 1 0 outer loop - vertex -1.82495 1.2204 0.438441 - vertex -1.79223 1.2204 0.375478 - vertex -1.8419 1.2204 0.424882 + vertex -1.82495 1.23 0.438441 + vertex -1.79223 1.23 0.375478 + vertex -1.8419 1.23 0.424882 endloop endfacet facet normal 0 1 0 outer loop - vertex -1.8419 1.2204 0.424882 - vertex -1.79223 1.2204 0.375478 - vertex -1.85258 1.2204 0.410963 + vertex -1.8419 1.23 0.424882 + vertex -1.79223 1.23 0.375478 + vertex -1.85258 1.23 0.410963 endloop endfacet facet normal 0 1 0 outer loop - vertex -1.79223 1.2204 0.375478 - vertex -1.93676 1.2204 0.0765288 - vertex -1.85258 1.2204 0.410963 + vertex -1.79223 1.23 0.375478 + vertex -1.93676 1.23 0.0765288 + vertex -1.85258 1.23 0.410963 endloop endfacet facet normal 0 1 -0 outer loop - vertex -1.87579 1.2204 0.0452036 - vertex -1.93676 1.2204 0.0765288 - vertex -1.79223 1.2204 0.375478 + vertex -1.87579 1.23 0.0452036 + vertex -1.93676 1.23 0.0765288 + vertex -1.79223 1.23 0.375478 endloop endfacet facet normal 0 1 -0 outer loop - vertex -1.88145 1.2204 0.036161 - vertex -1.93676 1.2204 0.0765288 - vertex -1.87579 1.2204 0.0452036 + vertex -1.88145 1.23 0.036161 + vertex -1.93676 1.23 0.0765288 + vertex -1.87579 1.23 0.0452036 endloop endfacet facet normal 0 1 -0 outer loop - vertex -1.8984 1.2204 0.0180845 - vertex -1.93676 1.2204 0.0765288 - vertex -1.88145 1.2204 0.036161 + vertex -1.8984 1.23 0.0180845 + vertex -1.93676 1.23 0.0765288 + vertex -1.88145 1.23 0.036161 endloop endfacet facet normal 0 1 0 outer loop - vertex -1.93676 1.2204 0.0765288 - vertex -1.8984 1.2204 0.0180845 - vertex -1.94925 1.2204 0.0632866 + vertex -1.93676 1.23 0.0765288 + vertex -1.8984 1.23 0.0180845 + vertex -1.94925 1.23 0.0632866 endloop endfacet facet normal 0 1 -0 outer loop - vertex -1.92664 1.2204 0.00452441 - vertex -1.94925 1.2204 0.0632866 - vertex -1.8984 1.2204 0.0180845 + vertex -1.92664 1.23 0.00452441 + vertex -1.94925 1.23 0.0632866 + vertex -1.8984 1.23 0.0180845 endloop endfacet facet normal 0 1 0 outer loop - vertex -1.94925 1.2204 0.0632866 - vertex -1.92664 1.2204 0.00452441 - vertex -1.97184 1.2204 0.0497211 + vertex -1.94925 1.23 0.0632866 + vertex -1.92664 1.23 0.00452441 + vertex -1.97184 1.23 0.0497211 endloop endfacet facet normal 0 1 -0 outer loop - vertex -1.96055 1.2204 -0.000537317 - vertex -1.97184 1.2204 0.0497211 - vertex -1.92664 1.2204 0.00452441 + vertex -1.96055 1.23 -0.000537317 + vertex -1.97184 1.23 0.0497211 + vertex -1.92664 1.23 0.00452441 endloop endfacet facet normal 0 1 0 outer loop - vertex -1.97184 1.2204 0.0497211 - vertex -1.96055 1.2204 -0.000537317 - vertex -1.99445 1.2204 0.0452036 + vertex -1.97184 1.23 0.0497211 + vertex -1.96055 1.23 -0.000537317 + vertex -1.99445 1.23 0.0452036 endloop endfacet facet normal -0 1 0 outer loop - vertex -2.147 1.2204 4.31061e-07 - vertex -1.99445 1.2204 0.0452036 - vertex -1.96055 1.2204 -0.000537317 + vertex -2.147 1.23 4.31061e-07 + vertex -1.99445 1.23 0.0452036 + vertex -1.96055 1.23 -0.000537317 endloop endfacet facet normal 0 1 0 outer loop - vertex -1.99445 1.2204 0.0452036 - vertex -2.147 1.2204 4.31061e-07 - vertex -2.147 1.2204 0.0452036 + vertex -1.99445 1.23 0.0452036 + vertex -2.147 1.23 4.31061e-07 + vertex -2.147 1.23 0.0452036 endloop endfacet facet normal 0 -1 0 outer loop - vertex -2.147 0.7345 4.31061e-07 - vertex -1.99445 0.7345 0.0452036 - vertex -2.147 0.7345 0.0452036 + vertex -2.147 0.8 4.31061e-07 + vertex -1.99445 0.8 0.0452036 + vertex -2.147 0.8 0.0452036 endloop endfacet facet normal -0 -1 0 outer loop - vertex -1.92664 0.7345 0.00452441 - vertex -1.99445 0.7345 0.0452036 - vertex -1.96055 0.7345 -0.000537317 + vertex -1.92664 0.8 0.00452441 + vertex -1.99445 0.8 0.0452036 + vertex -1.96055 0.8 -0.000537317 endloop endfacet facet normal -0 -1 0 outer loop - vertex -1.8984 0.7345 0.0180845 - vertex -1.99445 0.7345 0.0452036 - vertex -1.92664 0.7345 0.00452441 + vertex -1.8984 0.8 0.0180845 + vertex -1.99445 0.8 0.0452036 + vertex -1.92664 0.8 0.00452441 endloop endfacet facet normal 0 -1 0 outer loop - vertex -1.99445 0.7345 0.0452036 - vertex -1.88145 0.7345 0.036161 - vertex -1.87579 0.7345 0.0452036 + vertex -1.99445 0.8 0.0452036 + vertex -1.88145 0.8 0.036161 + vertex -1.87579 0.8 0.0452036 endloop endfacet facet normal 0 -1 -0 outer loop - vertex -1.99445 0.7345 0.0452036 - vertex -2.147 0.7345 4.31061e-07 - vertex -1.96055 0.7345 -0.000537317 + vertex -1.99445 0.8 0.0452036 + vertex -2.147 0.8 4.31061e-07 + vertex -1.96055 0.8 -0.000537317 endloop endfacet facet normal 0 -1 0 outer loop - vertex -1.99445 0.7345 0.0452036 - vertex -1.8984 0.7345 0.0180845 - vertex -1.88145 0.7345 0.036161 + vertex -1.99445 0.8 0.0452036 + vertex -1.8984 0.8 0.0180845 + vertex -1.88145 0.8 0.036161 endloop endfacet facet normal 0 -1 0 outer loop - vertex -1.7741 0.7345 0.452 - vertex -1.75715 0.7345 0.402287 - vertex -1.73454 0.7345 0.406804 + vertex -1.7741 0.8 0.452 + vertex -1.75715 0.8 0.402287 + vertex -1.73454 0.8 0.406804 endloop endfacet facet normal 0 -1 0 outer loop - vertex -1.8419 0.7345 0.424882 - vertex -1.77974 0.7345 0.38872 - vertex -1.75715 0.7345 0.402287 + vertex -1.8419 0.8 0.424882 + vertex -1.77974 0.8 0.38872 + vertex -1.75715 0.8 0.402287 endloop endfacet facet normal 0 -1 0 outer loop - vertex -1.8419 0.7345 0.424882 - vertex -1.79223 0.7345 0.375478 - vertex -1.77974 0.7345 0.38872 + vertex -1.8419 0.8 0.424882 + vertex -1.79223 0.8 0.375478 + vertex -1.77974 0.8 0.38872 endloop endfacet facet normal 0 -1 0 outer loop - vertex -1.93676 0.7345 0.0765288 - vertex -1.79223 0.7345 0.375478 - vertex -1.85258 0.7345 0.410963 + vertex -1.93676 0.8 0.0765288 + vertex -1.79223 0.8 0.375478 + vertex -1.85258 0.8 0.410963 endloop endfacet facet normal 0 -1 0 outer loop - vertex -1.93676 0.7345 0.0765288 - vertex -1.87579 0.7345 0.0452036 - vertex -1.79223 0.7345 0.375478 + vertex -1.93676 0.8 0.0765288 + vertex -1.87579 0.8 0.0452036 + vertex -1.79223 0.8 0.375478 endloop endfacet facet normal 0 -1 0 outer loop - vertex -1.94925 0.7345 0.0632866 - vertex -1.87579 0.7345 0.0452036 - vertex -1.93676 0.7345 0.0765288 + vertex -1.94925 0.8 0.0632866 + vertex -1.87579 0.8 0.0452036 + vertex -1.93676 0.8 0.0765288 endloop endfacet facet normal 0 -1 0 outer loop - vertex -1.97184 0.7345 0.0497211 - vertex -1.87579 0.7345 0.0452036 - vertex -1.94925 0.7345 0.0632866 + vertex -1.97184 0.8 0.0497211 + vertex -1.87579 0.8 0.0452036 + vertex -1.94925 0.8 0.0632866 endloop endfacet facet normal 0 -1 0 outer loop - vertex -1.87579 0.7345 0.0452036 - vertex -1.97184 0.7345 0.0497211 - vertex -1.99445 0.7345 0.0452036 + vertex -1.87579 0.8 0.0452036 + vertex -1.97184 0.8 0.0497211 + vertex -1.99445 0.8 0.0452036 endloop endfacet facet normal 0 -1 0 outer loop - vertex -1.75715 0.7345 0.402287 - vertex -1.7741 0.7345 0.452 - vertex -1.80235 0.7345 0.447482 + vertex -1.75715 0.8 0.402287 + vertex -1.7741 0.8 0.452 + vertex -1.80235 0.8 0.447482 endloop endfacet facet normal 0 -1 0 outer loop - vertex -1.75715 0.7345 0.402287 - vertex -1.80235 0.7345 0.447482 - vertex -1.82495 0.7345 0.438441 + vertex -1.75715 0.8 0.402287 + vertex -1.80235 0.8 0.447482 + vertex -1.82495 0.8 0.438441 endloop endfacet facet normal 0 -1 0 outer loop - vertex -1.75715 0.7345 0.402287 - vertex -1.82495 0.7345 0.438441 - vertex -1.8419 0.7345 0.424882 + vertex -1.75715 0.8 0.402287 + vertex -1.82495 0.8 0.438441 + vertex -1.8419 0.8 0.424882 endloop endfacet facet normal 0 -1 0 outer loop - vertex -1.79223 0.7345 0.375478 - vertex -1.8419 0.7345 0.424882 - vertex -1.85258 0.7345 0.410963 + vertex -1.79223 0.8 0.375478 + vertex -1.8419 0.8 0.424882 + vertex -1.85258 0.8 0.410963 endloop endfacet facet normal 0 -1 0 outer loop - vertex -1.7741 0.7345 0.452 - vertex -1.73454 0.7345 0.406804 - vertex -1.63849 0.7345 0.452 + vertex -1.7741 0.8 0.452 + vertex -1.73454 0.8 0.406804 + vertex -1.63849 0.8 0.452 endloop endfacet facet normal 0 -1 -0 outer loop - vertex -1.63849 0.7345 0.452 - vertex -1.73454 0.7345 0.406804 - vertex -1.62557 0.7345 0.406804 + vertex -1.63849 0.8 0.452 + vertex -1.73454 0.8 0.406804 + vertex -1.62557 0.8 0.406804 endloop endfacet facet normal -0.371426 0 0.928463 outer loop - vertex -1.82495 1.2204 0.438441 - vertex -1.80235 0.7345 0.447482 - vertex -1.80235 1.2204 0.447482 + vertex -1.82495 1.23 0.438441 + vertex -1.80235 0.8 0.447482 + vertex -1.80235 1.23 0.447482 endloop endfacet facet normal -0.371426 0 0.928463 outer loop - vertex -1.80235 0.7345 0.447482 - vertex -1.82495 1.2204 0.438441 - vertex -1.82495 0.7345 0.438441 + vertex -1.80235 0.8 0.447482 + vertex -1.82495 1.23 0.438441 + vertex -1.82495 0.8 0.438441 endloop endfacet facet normal -0.624667 0 0.780891 outer loop - vertex -1.8419 1.2204 0.424882 - vertex -1.82495 0.7345 0.438441 - vertex -1.82495 1.2204 0.438441 + vertex -1.8419 1.23 0.424882 + vertex -1.82495 0.8 0.438441 + vertex -1.82495 1.23 0.438441 endloop endfacet facet normal -0.624667 0 0.780891 outer loop - vertex -1.82495 0.7345 0.438441 - vertex -1.8419 1.2204 0.424882 - vertex -1.8419 0.7345 0.424882 + vertex -1.82495 0.8 0.438441 + vertex -1.8419 1.23 0.424882 + vertex -1.8419 0.8 0.424882 endloop endfacet facet normal -0.793365 0 0.608746 outer loop - vertex -1.85258 0.7345 0.410963 - vertex -1.8419 1.2204 0.424882 - vertex -1.85258 1.2204 0.410963 + vertex -1.85258 0.8 0.410963 + vertex -1.8419 1.23 0.424882 + vertex -1.85258 1.23 0.410963 endloop endfacet facet normal -0.793365 0 0.608746 outer loop - vertex -1.8419 1.2204 0.424882 - vertex -1.85258 0.7345 0.410963 - vertex -1.8419 0.7345 0.424882 + vertex -1.8419 1.23 0.424882 + vertex -1.85258 0.8 0.410963 + vertex -1.8419 0.8 0.424882 endloop endfacet facet normal -0.969751 0 0.244095 outer loop - vertex -1.93676 0.7345 0.0765288 - vertex -1.85258 1.2204 0.410963 - vertex -1.93676 1.2204 0.0765288 + vertex -1.93676 0.8 0.0765288 + vertex -1.85258 1.23 0.410963 + vertex -1.93676 1.23 0.0765288 endloop endfacet facet normal -0.969751 0 0.244095 outer loop - vertex -1.85258 1.2204 0.410963 - vertex -1.93676 0.7345 0.0765288 - vertex -1.85258 0.7345 0.410963 + vertex -1.85258 1.23 0.410963 + vertex -1.93676 0.8 0.0765288 + vertex -1.85258 0.8 0.410963 endloop endfacet facet normal -0.727466 0 0.686144 outer loop - vertex -1.94925 0.7345 0.0632866 - vertex -1.93676 1.2204 0.0765288 - vertex -1.94925 1.2204 0.0632866 + vertex -1.94925 0.8 0.0632866 + vertex -1.93676 1.23 0.0765288 + vertex -1.94925 1.23 0.0632866 endloop endfacet facet normal -0.727466 0 0.686144 outer loop - vertex -1.93676 1.2204 0.0765288 - vertex -1.94925 0.7345 0.0632866 - vertex -1.93676 0.7345 0.0765288 + vertex -1.93676 1.23 0.0765288 + vertex -1.94925 0.8 0.0632866 + vertex -1.93676 0.8 0.0765288 endloop endfacet facet normal -0.514817 0 0.8573 outer loop - vertex -1.97184 1.2204 0.0497211 - vertex -1.94925 0.7345 0.0632866 - vertex -1.94925 1.2204 0.0632866 + vertex -1.97184 1.23 0.0497211 + vertex -1.94925 0.8 0.0632866 + vertex -1.94925 1.23 0.0632866 endloop endfacet facet normal -0.514817 0 0.8573 outer loop - vertex -1.94925 0.7345 0.0632866 - vertex -1.97184 1.2204 0.0497211 - vertex -1.97184 0.7345 0.0497211 + vertex -1.94925 0.8 0.0632866 + vertex -1.97184 1.23 0.0497211 + vertex -1.97184 0.8 0.0497211 endloop endfacet facet normal -0.195928 0 0.980618 outer loop - vertex -1.99445 1.2204 0.0452036 - vertex -1.97184 0.7345 0.0497211 - vertex -1.97184 1.2204 0.0497211 + vertex -1.99445 1.23 0.0452036 + vertex -1.97184 0.8 0.0497211 + vertex -1.97184 1.23 0.0497211 endloop endfacet facet normal -0.195928 0 0.980618 outer loop - vertex -1.97184 0.7345 0.0497211 - vertex -1.99445 1.2204 0.0452036 - vertex -1.99445 0.7345 0.0452036 + vertex -1.97184 0.8 0.0497211 + vertex -1.99445 1.23 0.0452036 + vertex -1.99445 0.8 0.0452036 endloop endfacet facet normal -0 0 1 outer loop - vertex -2.147 1.2204 0.0452036 - vertex -1.99445 0.7345 0.0452036 - vertex -1.99445 1.2204 0.0452036 + vertex -2.147 1.23 0.0452036 + vertex -1.99445 0.8 0.0452036 + vertex -1.99445 1.23 0.0452036 endloop endfacet facet normal 0 0 1 outer loop - vertex -1.99445 0.7345 0.0452036 - vertex -2.147 1.2204 0.0452036 - vertex -2.147 0.7345 0.0452036 + vertex -1.99445 0.8 0.0452036 + vertex -2.147 1.23 0.0452036 + vertex -2.147 0.8 0.0452036 endloop endfacet facet normal -1 0 0 outer loop - vertex -2.147 0.7345 4.31061e-07 - vertex -2.147 1.2204 0.0452036 - vertex -2.147 1.2204 4.31061e-07 + vertex -2.147 0.8 4.31061e-07 + vertex -2.147 1.23 0.0452036 + vertex -2.147 1.23 4.31061e-07 endloop endfacet facet normal -1 -0 0 outer loop - vertex -2.147 1.2204 0.0452036 - vertex -2.147 0.7345 4.31061e-07 - vertex -2.147 0.7345 0.0452036 + vertex -2.147 1.23 0.0452036 + vertex -2.147 0.8 4.31061e-07 + vertex -2.147 0.8 0.0452036 endloop endfacet facet normal -0.00288413 0 -0.999996 outer loop - vertex -2.147 0.7345 4.31061e-07 - vertex -1.96055 1.2204 -0.000537317 - vertex -1.96055 0.7345 -0.000537317 + vertex -2.147 0.8 4.31061e-07 + vertex -1.96055 1.23 -0.000537317 + vertex -1.96055 0.8 -0.000537317 endloop endfacet facet normal -0.00288413 0 -0.999996 outer loop - vertex -1.96055 1.2204 -0.000537317 - vertex -2.147 0.7345 4.31061e-07 - vertex -2.147 1.2204 4.31061e-07 + vertex -1.96055 1.23 -0.000537317 + vertex -2.147 0.8 4.31061e-07 + vertex -2.147 1.23 4.31061e-07 endloop endfacet facet normal 0.147634 0 -0.989042 outer loop - vertex -1.96055 0.7345 -0.000537317 - vertex -1.92664 1.2204 0.00452441 - vertex -1.92664 0.7345 0.00452441 + vertex -1.96055 0.8 -0.000537317 + vertex -1.92664 1.23 0.00452441 + vertex -1.92664 0.8 0.00452441 endloop endfacet facet normal 0.147634 0 -0.989042 outer loop - vertex -1.92664 1.2204 0.00452441 - vertex -1.96055 0.7345 -0.000537317 - vertex -1.96055 1.2204 -0.000537317 + vertex -1.92664 1.23 0.00452441 + vertex -1.96055 0.8 -0.000537317 + vertex -1.96055 1.23 -0.000537317 endloop endfacet facet normal 0.432858 0 -0.901462 outer loop - vertex -1.92664 0.7345 0.00452441 - vertex -1.8984 1.2204 0.0180845 - vertex -1.8984 0.7345 0.0180845 + vertex -1.92664 0.8 0.00452441 + vertex -1.8984 1.23 0.0180845 + vertex -1.8984 0.8 0.0180845 endloop endfacet facet normal 0.432858 0 -0.901462 outer loop - vertex -1.8984 1.2204 0.0180845 - vertex -1.92664 0.7345 0.00452441 - vertex -1.92664 1.2204 0.00452441 + vertex -1.8984 1.23 0.0180845 + vertex -1.92664 0.8 0.00452441 + vertex -1.92664 1.23 0.00452441 endloop endfacet facet normal 0.729471 0 -0.684012 outer loop - vertex -1.88145 0.7345 0.036161 - vertex -1.8984 1.2204 0.0180845 - vertex -1.88145 1.2204 0.036161 + vertex -1.88145 0.8 0.036161 + vertex -1.8984 1.23 0.0180845 + vertex -1.88145 1.23 0.036161 endloop endfacet facet normal 0.729471 0 -0.684012 outer loop - vertex -1.8984 1.2204 0.0180845 - vertex -1.88145 0.7345 0.036161 - vertex -1.8984 0.7345 0.0180845 + vertex -1.8984 1.23 0.0180845 + vertex -1.88145 0.8 0.036161 + vertex -1.8984 0.8 0.0180845 endloop endfacet facet normal 0.847645 0 -0.530563 outer loop - vertex -1.87579 0.7345 0.0452036 - vertex -1.88145 1.2204 0.036161 - vertex -1.87579 1.2204 0.0452036 + vertex -1.87579 0.8 0.0452036 + vertex -1.88145 1.23 0.036161 + vertex -1.87579 1.23 0.0452036 endloop endfacet facet normal 0.847645 0 -0.530563 outer loop - vertex -1.88145 1.2204 0.036161 - vertex -1.87579 0.7345 0.0452036 - vertex -1.88145 0.7345 0.036161 + vertex -1.88145 1.23 0.036161 + vertex -1.87579 0.8 0.0452036 + vertex -1.88145 0.8 0.036161 endloop endfacet facet normal 0.969454 0 -0.245274 outer loop - vertex -1.79223 0.7345 0.375478 - vertex -1.87579 1.2204 0.0452036 - vertex -1.79223 1.2204 0.375478 + vertex -1.79223 0.8 0.375478 + vertex -1.87579 1.23 0.0452036 + vertex -1.79223 1.23 0.375478 endloop endfacet facet normal 0.969454 0 -0.245274 outer loop - vertex -1.87579 1.2204 0.0452036 - vertex -1.79223 0.7345 0.375478 - vertex -1.87579 0.7345 0.0452036 + vertex -1.87579 1.23 0.0452036 + vertex -1.79223 0.8 0.375478 + vertex -1.87579 0.8 0.0452036 endloop endfacet facet normal 0.727461 0 -0.686149 outer loop - vertex -1.77974 0.7345 0.38872 - vertex -1.79223 1.2204 0.375478 - vertex -1.77974 1.2204 0.38872 + vertex -1.77974 0.8 0.38872 + vertex -1.79223 1.23 0.375478 + vertex -1.77974 1.23 0.38872 endloop endfacet facet normal 0.727461 0 -0.686149 outer loop - vertex -1.79223 1.2204 0.375478 - vertex -1.77974 0.7345 0.38872 - vertex -1.79223 0.7345 0.375478 + vertex -1.79223 1.23 0.375478 + vertex -1.77974 0.8 0.38872 + vertex -1.79223 0.8 0.375478 endloop endfacet facet normal 0.514858 0 -0.857275 outer loop - vertex -1.77974 0.7345 0.38872 - vertex -1.75715 1.2204 0.402287 - vertex -1.75715 0.7345 0.402287 + vertex -1.77974 0.8 0.38872 + vertex -1.75715 1.23 0.402287 + vertex -1.75715 0.8 0.402287 endloop endfacet facet normal 0.514858 0 -0.857275 outer loop - vertex -1.75715 1.2204 0.402287 - vertex -1.77974 0.7345 0.38872 - vertex -1.77974 1.2204 0.38872 + vertex -1.75715 1.23 0.402287 + vertex -1.77974 0.8 0.38872 + vertex -1.77974 1.23 0.38872 endloop endfacet facet normal 0.195908 0 -0.980622 outer loop - vertex -1.75715 0.7345 0.402287 - vertex -1.73454 1.2204 0.406804 - vertex -1.73454 0.7345 0.406804 + vertex -1.75715 0.8 0.402287 + vertex -1.73454 1.23 0.406804 + vertex -1.73454 0.8 0.406804 endloop endfacet facet normal 0.195908 0 -0.980622 outer loop - vertex -1.73454 1.2204 0.406804 - vertex -1.75715 0.7345 0.402287 - vertex -1.75715 1.2204 0.402287 + vertex -1.73454 1.23 0.406804 + vertex -1.75715 0.8 0.402287 + vertex -1.75715 1.23 0.402287 endloop endfacet facet normal 0 0 -1 outer loop - vertex -1.73454 0.7345 0.406804 - vertex -1.62557 1.2204 0.406804 - vertex -1.62557 0.7345 0.406804 + vertex -1.73454 0.8 0.406804 + vertex -1.62557 1.23 0.406804 + vertex -1.62557 0.8 0.406804 endloop endfacet facet normal -0 0 -1 outer loop - vertex -1.62557 1.2204 0.406804 - vertex -1.73454 0.7345 0.406804 - vertex -1.73454 1.2204 0.406804 + vertex -1.62557 1.23 0.406804 + vertex -1.73454 0.8 0.406804 + vertex -1.73454 1.23 0.406804 endloop endfacet facet normal -0 0 1 outer loop - vertex -1.7741 1.2204 0.452 - vertex -1.63849 0.7345 0.452 - vertex -1.63849 1.2204 0.452 + vertex -1.7741 1.23 0.452 + vertex -1.63849 0.8 0.452 + vertex -1.63849 1.23 0.452 endloop endfacet facet normal 0 0 1 outer loop - vertex -1.63849 0.7345 0.452 - vertex -1.7741 1.2204 0.452 - vertex -1.7741 0.7345 0.452 + vertex -1.63849 0.8 0.452 + vertex -1.7741 1.23 0.452 + vertex -1.7741 0.8 0.452 endloop endfacet facet normal -0.157922 0 0.987452 outer loop - vertex -1.80235 1.2204 0.447482 - vertex -1.7741 0.7345 0.452 - vertex -1.7741 1.2204 0.452 + vertex -1.80235 1.23 0.447482 + vertex -1.7741 0.8 0.452 + vertex -1.7741 1.23 0.452 endloop endfacet facet normal -0.157922 0 0.987452 outer loop - vertex -1.7741 0.7345 0.452 - vertex -1.80235 1.2204 0.447482 - vertex -1.80235 0.7345 0.447482 + vertex -1.7741 0.8 0.452 + vertex -1.80235 1.23 0.447482 + vertex -1.80235 0.8 0.447482 endloop endfacet facet normal -0 0 1 outer loop - vertex -1.5255 2.61595 1.0509 - vertex -0.508503 -0.66105 1.0509 - vertex -0.508503 2.61595 1.0509 + vertex -1.5255 2.465 1.0509 + vertex -0.508503 -0.435 1.0509 + vertex -0.508503 2.465 1.0509 endloop endfacet facet normal 0 0 1 outer loop - vertex -0.508503 -0.66105 1.0509 - vertex -1.5255 2.61595 1.0509 - vertex -1.5255 -0.66105 1.0509 + vertex -0.508503 -0.435 1.0509 + vertex -1.5255 2.465 1.0509 + vertex -1.5255 -0.435 1.0509 endloop endfacet - facet normal 0 0 -1 + facet normal 0 -1 0 outer loop - vertex -1.5255 -0.66105 0.0565103 - vertex -0.508503 2.61595 0.0565103 - vertex -0.508503 -0.66105 0.0565103 + vertex -1.63849 -0.435 0.452 + vertex -0.508503 -0.435 1.0509 + vertex -1.5255 -0.435 1.0509 endloop endfacet - facet normal -0 0 -1 + facet normal 0 -1 0 outer loop - vertex -0.508503 2.61595 0.0565103 - vertex -1.5255 -0.66105 0.0565103 - vertex -1.5255 2.61595 0.0565103 + vertex -1.63849 -0.435 0.452 + vertex -0.395514 -0.435 0.452 + vertex -0.508503 -0.435 1.0509 endloop endfacet facet normal 0 -1 0 outer loop - vertex -1.63849 -0.66105 0.452 - vertex -0.508503 -0.66105 1.0509 - vertex -1.5255 -0.66105 1.0509 + vertex -1.5255 -0.435 0.0565103 + vertex -0.395514 -0.435 0.452 + vertex -1.63849 -0.435 0.452 endloop endfacet facet normal 0 -1 0 outer loop - vertex -1.63849 -0.66105 0.452 - vertex -0.395514 -0.66105 0.452 - vertex -0.508503 -0.66105 1.0509 + vertex -0.395514 -0.435 0.452 + vertex -1.5255 -0.435 0.0565103 + vertex -0.508503 -0.435 0.0565103 endloop endfacet - facet normal 0 -1 0 + facet normal 0.982665 0 0.18539 outer loop - vertex -1.5255 -0.66105 0.0565103 - vertex -0.395514 -0.66105 0.452 - vertex -1.63849 -0.66105 0.452 + vertex -0.508503 2.465 1.0509 + vertex -0.395514 2.2206 0.452 + vertex -0.395514 2.465 0.452 endloop endfacet - facet normal 0 -1 0 + facet normal 0.982665 0 0.18539 outer loop - vertex -0.395514 -0.66105 0.452 - vertex -1.5255 -0.66105 0.0565103 - vertex -0.508503 -0.66105 0.0565103 + vertex -0.508503 2.465 1.0509 + vertex -0.395514 1.7906 0.452 + vertex -0.395514 2.2206 0.452 endloop endfacet - facet normal 0.96153 0 -0.274701 + facet normal 0.982665 0 0.18539 outer loop - vertex -0.395514 -0.225999 0.452 - vertex -0.395514 -0.66105 0.452 - vertex -0.408425 -0.225999 0.406808 + vertex -0.508503 2.465 1.0509 + vertex -0.395514 0.239401 0.452 + vertex -0.395514 1.7906 0.452 endloop endfacet - facet normal 0.96153 0 -0.274701 + facet normal 0.982665 -0 0.18539 outer loop - vertex -0.395514 1.808 0.452 - vertex -0.395514 0.259901 0.452 - vertex -0.408425 1.808 0.406808 + vertex -0.508503 -0.435 1.0509 + vertex -0.395514 0.239401 0.452 + vertex -0.508503 2.465 1.0509 endloop endfacet - facet normal 0.96153 0 -0.274701 + facet normal 0.982665 0 0.18539 outer loop - vertex -0.408425 2.2939 0.406808 - vertex -0.395514 2.61595 0.452 - vertex -0.395514 2.2939 0.452 + vertex -0.395514 0.239401 0.452 + vertex -0.508503 -0.435 1.0509 + vertex -0.395514 -0.1906 0.452 endloop endfacet - facet normal 0.961529 2.3683e-07 -0.274703 + facet normal 0.982665 0 0.18539 outer loop - vertex -0.395514 2.61595 0.452 - vertex -0.408425 2.2939 0.406808 - vertex -0.508503 2.61595 0.0565103 + vertex -0.395514 -0.1906 0.452 + vertex -0.508503 -0.435 1.0509 + vertex -0.395514 -0.435 0.452 endloop endfacet - facet normal 0.961529 0 -0.274703 + facet normal 0.96153 0 -0.274701 outer loop - vertex -0.408425 1.808 0.406808 - vertex -0.508503 2.61595 0.0565103 - vertex -0.408425 2.2939 0.406808 + vertex -0.395514 -0.1906 0.452 + vertex -0.395514 -0.435 0.452 + vertex -0.408425 -0.1906 0.406808 endloop endfacet facet normal 0.96153 0 -0.274701 outer loop - vertex -0.408425 0.259901 0.406808 - vertex -0.408425 1.808 0.406808 - vertex -0.395514 0.259901 0.452 + vertex -0.395514 1.7906 0.452 + vertex -0.395514 0.239401 0.452 + vertex -0.408425 1.7906 0.406808 endloop endfacet - facet normal 0.961529 0 -0.274703 + facet normal 0.96153 0 -0.274701 outer loop - vertex -0.408425 1.808 0.406808 - vertex -0.408425 0.259901 0.406808 - vertex -0.508503 2.61595 0.0565103 + vertex -0.408425 2.2206 0.406808 + vertex -0.395514 2.465 0.452 + vertex -0.395514 2.2206 0.452 endloop endfacet - facet normal 0.961529 0 -0.274703 + facet normal 0.961529 3.12075e-07 -0.274703 outer loop - vertex -0.508503 -0.66105 0.0565103 - vertex -0.408425 0.259901 0.406808 - vertex -0.408425 -0.225999 0.406808 + vertex -0.395514 2.465 0.452 + vertex -0.408425 2.2206 0.406808 + vertex -0.508503 2.465 0.0565103 endloop endfacet - facet normal 0.961529 -1.75315e-07 -0.274703 + facet normal 0.961529 0 -0.274703 outer loop - vertex -0.508503 -0.66105 0.0565103 - vertex -0.408425 -0.225999 0.406808 - vertex -0.395514 -0.66105 0.452 + vertex -0.408425 1.7906 0.406808 + vertex -0.508503 2.465 0.0565103 + vertex -0.408425 2.2206 0.406808 endloop endfacet - facet normal 0.961529 0 -0.274703 + facet normal 0.96153 0 -0.274701 outer loop - vertex -0.408425 0.259901 0.406808 - vertex -0.508503 -0.66105 0.0565103 - vertex -0.508503 2.61595 0.0565103 + vertex -0.408425 0.239401 0.406808 + vertex -0.408425 1.7906 0.406808 + vertex -0.395514 0.239401 0.452 endloop endfacet - facet normal -0.982665 0 0.185392 + facet normal 0.961529 0 -0.274703 outer loop - vertex -1.63849 1.2204 0.452 - vertex -1.5255 2.61595 1.0509 - vertex -1.63849 2.61595 0.452 + vertex -0.408425 1.7906 0.406808 + vertex -0.408425 0.239401 0.406808 + vertex -0.508503 2.465 0.0565103 endloop endfacet - facet normal -0.982665 0 0.185392 + facet normal 0.961529 0 -0.274703 outer loop - vertex -1.63849 0.7345 0.452 - vertex -1.5255 2.61595 1.0509 - vertex -1.63849 1.2204 0.452 + vertex -0.508503 -0.435 0.0565103 + vertex -0.408425 0.239401 0.406808 + vertex -0.408425 -0.1906 0.406808 endloop endfacet - facet normal -0.982665 0 0.185392 + facet normal 0.961529 0 -0.274703 outer loop - vertex -1.5255 -0.66105 1.0509 - vertex -1.63849 0.7345 0.452 - vertex -1.63849 -0.66105 0.452 + vertex -0.408425 0.239401 0.406808 + vertex -0.508503 -0.435 0.0565103 + vertex -0.508503 2.465 0.0565103 endloop endfacet - facet normal -0.982665 0 0.185392 + facet normal 0.961529 -3.12075e-07 -0.274703 outer loop - vertex -1.63849 0.7345 0.452 - vertex -1.5255 -0.66105 1.0509 - vertex -1.5255 2.61595 1.0509 + vertex -0.508503 -0.435 0.0565103 + vertex -0.408425 -0.1906 0.406808 + vertex -0.395514 -0.435 0.452 endloop endfacet - facet normal -0.961528 -5.28021e-06 -0.274705 + facet normal 0 0 -1 outer loop - vertex -1.5255 2.61595 0.0565103 - vertex -1.62557 1.2204 0.406804 - vertex -1.63849 2.61595 0.452 + vertex -1.5255 -0.435 0.0565103 + vertex -0.508503 2.465 0.0565103 + vertex -0.508503 -0.435 0.0565103 endloop endfacet - facet normal -0.961534 0 -0.274686 + facet normal -0 0 -1 outer loop - vertex -1.5255 2.61595 0.0565103 - vertex -1.62557 0.7345 0.406804 - vertex -1.62557 1.2204 0.406804 + vertex -0.508503 2.465 0.0565103 + vertex -1.5255 -0.435 0.0565103 + vertex -1.5255 2.465 0.0565103 endloop endfacet - facet normal -0.961534 0 -0.274686 + facet normal -0.982665 0 0.185392 outer loop - vertex -1.5255 -0.66105 0.0565103 - vertex -1.62557 0.7345 0.406804 - vertex -1.5255 2.61595 0.0565103 + vertex -1.63849 1.23 0.452 + vertex -1.5255 2.465 1.0509 + vertex -1.63849 2.465 0.452 endloop endfacet - facet normal -0.961528 5.28021e-06 -0.274705 + facet normal -0.982665 0 0.185392 outer loop - vertex -1.63849 -0.66105 0.452 - vertex -1.62557 0.7345 0.406804 - vertex -1.5255 -0.66105 0.0565103 + vertex -1.63849 0.8 0.452 + vertex -1.5255 2.465 1.0509 + vertex -1.63849 1.23 0.452 endloop endfacet - facet normal -0.961485 0 -0.274856 + facet normal -0.982665 0 0.185392 outer loop - vertex -1.62557 0.7345 0.406804 - vertex -1.63849 -0.66105 0.452 - vertex -1.63849 0.7345 0.452 + vertex -1.5255 -0.435 1.0509 + vertex -1.63849 0.8 0.452 + vertex -1.63849 -0.435 0.452 endloop endfacet - facet normal -0.961485 -0 -0.274856 + facet normal -0.982665 0 0.185392 outer loop - vertex -1.63849 2.61595 0.452 - vertex -1.62557 1.2204 0.406804 - vertex -1.63849 1.2204 0.452 + vertex -1.63849 0.8 0.452 + vertex -1.5255 -0.435 1.0509 + vertex -1.5255 2.465 1.0509 endloop endfacet - facet normal 0 1 0 + facet normal -0.961528 -5.96663e-06 -0.274705 outer loop - vertex -0.395514 2.61595 0.452 - vertex -1.5255 2.61595 1.0509 - vertex -0.508503 2.61595 1.0509 + vertex -1.5255 2.465 0.0565103 + vertex -1.62557 1.23 0.406804 + vertex -1.63849 2.465 0.452 endloop endfacet - facet normal 0 1 0 + facet normal -0.961534 0 -0.274686 outer loop - vertex -0.395514 2.61595 0.452 - vertex -1.63849 2.61595 0.452 - vertex -1.5255 2.61595 1.0509 + vertex -1.5255 2.465 0.0565103 + vertex -1.62557 0.8 0.406804 + vertex -1.62557 1.23 0.406804 endloop endfacet - facet normal 0 1 -0 + facet normal -0.961534 0 -0.274686 outer loop - vertex -0.508503 2.61595 0.0565103 - vertex -1.63849 2.61595 0.452 - vertex -0.395514 2.61595 0.452 + vertex -1.5255 -0.435 0.0565103 + vertex -1.62557 0.8 0.406804 + vertex -1.5255 2.465 0.0565103 endloop endfacet - facet normal 0 1 0 + facet normal -0.961528 5.96663e-06 -0.274705 outer loop - vertex -1.63849 2.61595 0.452 - vertex -0.508503 2.61595 0.0565103 - vertex -1.5255 2.61595 0.0565103 + vertex -1.63849 -0.435 0.452 + vertex -1.62557 0.8 0.406804 + vertex -1.5255 -0.435 0.0565103 endloop endfacet - facet normal 0.982665 0 0.18539 + facet normal -0.961485 0 -0.274856 outer loop - vertex -0.508503 2.61595 1.0509 - vertex -0.395514 2.2939 0.452 - vertex -0.395514 2.61595 0.452 + vertex -1.62557 0.8 0.406804 + vertex -1.63849 -0.435 0.452 + vertex -1.63849 0.8 0.452 endloop endfacet - facet normal 0.982665 0 0.18539 + facet normal -0.961485 -0 -0.274856 outer loop - vertex -0.508503 2.61595 1.0509 - vertex -0.395514 1.808 0.452 - vertex -0.395514 2.2939 0.452 + vertex -1.63849 2.465 0.452 + vertex -1.62557 1.23 0.406804 + vertex -1.63849 1.23 0.452 endloop endfacet - facet normal 0.982665 0 0.18539 + facet normal 0 1 0 outer loop - vertex -0.508503 2.61595 1.0509 - vertex -0.395514 0.259901 0.452 - vertex -0.395514 1.808 0.452 + vertex -0.395514 2.465 0.452 + vertex -1.5255 2.465 1.0509 + vertex -0.508503 2.465 1.0509 endloop endfacet - facet normal 0.982665 -0 0.18539 + facet normal 0 1 0 outer loop - vertex -0.508503 -0.66105 1.0509 - vertex -0.395514 0.259901 0.452 - vertex -0.508503 2.61595 1.0509 + vertex -0.395514 2.465 0.452 + vertex -1.63849 2.465 0.452 + vertex -1.5255 2.465 1.0509 endloop endfacet - facet normal 0.982665 0 0.18539 + facet normal 0 1 -0 outer loop - vertex -0.395514 0.259901 0.452 - vertex -0.508503 -0.66105 1.0509 - vertex -0.395514 -0.225999 0.452 + vertex -0.508503 2.465 0.0565103 + vertex -1.63849 2.465 0.452 + vertex -0.395514 2.465 0.452 endloop endfacet - facet normal 0.982665 0 0.18539 + facet normal 0 1 0 outer loop - vertex -0.395514 -0.225999 0.452 - vertex -0.508503 -0.66105 1.0509 - vertex -0.395514 -0.66105 0.452 + vertex -1.63849 2.465 0.452 + vertex -0.508503 2.465 0.0565103 + vertex -1.5255 2.465 0.0565103 endloop endfacet endsolid OpenSCAD_Model diff -Nru pcb-rnd-3.1.0/footprint/smd/SOT25.fp pcb-rnd-3.1.1/footprint/smd/SOT25.fp --- pcb-rnd-3.1.0/footprint/smd/SOT25.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/SOT25.fp 2023-05-06 10:36:00.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = SOT25 SMT transistor, 5 pins + openscad = SOT25.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/smd/SOT25.scad pcb-rnd-3.1.1/footprint/smd/SOT25.scad --- pcb-rnd-3.1.0/footprint/smd/SOT25.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/SOT25.scad 2023-05-12 15:36:01.000000000 +0000 @@ -0,0 +1,140 @@ +// Model for SOT25 package +// +// Copyright (C) 2017,2020 Tibor 'Igor2' Palinkas +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_sot25(fillet=0) +{ + + module fillet(pad_len=0.23, pad_width=0.43, pad_height= 0.1) { + fillet_height = pad_height/3; + fillet_width = pad_len/3; + overall_width = fillet_width + pad_width; + overall_length = pad_len + fillet_width; + + translate([-pad_len/2,0,0]) { + fillet_points = [ + [0,overall_width/2,0], // 0 + [overall_length,overall_width/2,0], // 1 + [overall_length,-overall_width/2,0], // 2 + [0,-overall_width/2,0], // 3 + [0,pad_width/2+fillet_width/2,fillet_height/3], // 4 + [pad_len+fillet_width/2,pad_width/2+fillet_width/2,fillet_height/3], // 5 + [pad_len+fillet_width/2,-pad_width/2-fillet_width/2,fillet_height/3], // 6 + [0,-pad_width/2-fillet_width/2,fillet_height/3], // 7 + [0,pad_width/2+fillet_width/6,2*fillet_height/3], // 8 + [pad_len+fillet_width/6,pad_width/2+fillet_width/6,2*fillet_height/3], // 9 + [pad_len+fillet_width/6,-pad_width/2-fillet_width/6,2*fillet_height/3], // 10 + [0,-pad_width/2-fillet_width/6,2*fillet_height/3], // 11 + [0,pad_width/2,fillet_height], // 12 + [pad_len,pad_width/2,fillet_height], // 13 + [pad_len,-pad_width/2,fillet_height], // 14 + [0,-pad_width/2,fillet_height]]; // 15 + + fillet_faces = [ + [0,4,8,12,15,11,7,3], // 0 + [0,1,5,4], // 1 + [1,2,6,5], // 2 + [7,6,2,3], // 3 + [4,5,9,8], // 4 + [5,6,10,9],// 5 + [10,6,7,11],// 6 + [8,9,13,12],// 7 + [9,10,14,13],// 8 + [15,14,10,11],// 9 + [12,13,14,15],// 10 + [3,2,1,0]];// 11 + + polyhedron(fillet_points, fillet_faces); + } + } + + module sot25_() + { + // pin prototype + module pin(length, height, thick) + { + linear_extrude(height=thick) + scale([length, -height, 1]) + polygon([[0.3400,0.0000],[0.3900,0.0100],[0.4300,0.0300],[0.4600,0.0600],[0.4789,0.0908],[0.6279,0.8307],[0.6500,0.8600],[0.6900,0.8900],[0.7300,0.9000],[1.0000,0.9000],[1.0000,1.0000],[0.6700,1.0012],[0.6100,0.9900],[0.5600,0.9600],[0.5300,0.9200],[0.5200,0.9000],[0.3721,0.1693],[0.3500,0.1400],[0.3100,0.1100],[0.2700,0.1000],[0.0000,0.1000],[0.0000,0.0000]]); + } + + rotate([90,0,-90]) scale([1.13,1.13,1.0]) translate([-0.9, 0.4, -2.14 - 0.43/2]) { + // body + color([0.1,0.1,0.1]) + linear_extrude(height=2.9) + polygon([[-0.55,0],[-0.45,0.53],[0.45,0.53],[0.55,0],[0.45,-0.35],[-0.45,-0.35]]); + + // 3 pins + color([0.9, 0.9, 0.9]) { + translate([0.5,0,0.4594-0.43/2]) + pin(0.5, 0.4, 0.43); + + translate([0.5,0,2.4406-0.43/2]) + pin(0.5, 0.4, 0.43); + + translate([-0.5,0,0.4594-0.43/2]) + pin(-0.5, 0.4, 0.43); + + translate([-0.5,0,2.4406-0.43/2]) + pin(-0.5, 0.4, 0.43); + + translate([-0.5,0,1.45-0.43/2]) + pin(-0.5, 0.4, 0.43); + + } + } + } + + if (fillet) { + color([0.9, 0.9, 0.9]) { + translate([0,0.02,0]) + fillet(); + translate([0,2.0,0]) + fillet(); + translate([-2.03,0.02,0]) + rotate([0,0,180]) + fillet(); + translate([-2.03,1.01,0]) + rotate([0,0,180]) + fillet(); + translate([-2.03,2.0,0]) + rotate([0,0,180]) + fillet(); + } + } + + translate([0,0.1,0]) + // match rotation with stock footprint's + rotate([0,0,90]) + sot25_(); +} + diff -Nru pcb-rnd-3.1.0/footprint/smd/SOT26.fp pcb-rnd-3.1.1/footprint/smd/SOT26.fp --- pcb-rnd-3.1.0/footprint/smd/SOT26.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/SOT26.fp 2023-05-06 10:36:22.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = SOT26 SMT transistor, 6 pins + openscad = SOT26.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/smd/SOT26.scad pcb-rnd-3.1.1/footprint/smd/SOT26.scad --- pcb-rnd-3.1.0/footprint/smd/SOT26.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/SOT26.scad 2023-05-12 15:36:01.000000000 +0000 @@ -0,0 +1,145 @@ +// Model for SOT26 package +// +// Copyright (C) 2017,2020 Tibor 'Igor2' Palinkas +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_sot26(fillet=0) +{ + + module fillet(pad_len=0.23, pad_width=0.43, pad_height= 0.1) { + fillet_height = pad_height/3; + fillet_width = pad_len/3; + overall_width = fillet_width + pad_width; + overall_length = pad_len + fillet_width; + + translate([-pad_len/2,0,0]) { + fillet_points = [ + [0,overall_width/2,0], // 0 + [overall_length,overall_width/2,0], // 1 + [overall_length,-overall_width/2,0], // 2 + [0,-overall_width/2,0], // 3 + [0,pad_width/2+fillet_width/2,fillet_height/3], // 4 + [pad_len+fillet_width/2,pad_width/2+fillet_width/2,fillet_height/3], // 5 + [pad_len+fillet_width/2,-pad_width/2-fillet_width/2,fillet_height/3], // 6 + [0,-pad_width/2-fillet_width/2,fillet_height/3], // 7 + [0,pad_width/2+fillet_width/6,2*fillet_height/3], // 8 + [pad_len+fillet_width/6,pad_width/2+fillet_width/6,2*fillet_height/3], // 9 + [pad_len+fillet_width/6,-pad_width/2-fillet_width/6,2*fillet_height/3], // 10 + [0,-pad_width/2-fillet_width/6,2*fillet_height/3], // 11 + [0,pad_width/2,fillet_height], // 12 + [pad_len,pad_width/2,fillet_height], // 13 + [pad_len,-pad_width/2,fillet_height], // 14 + [0,-pad_width/2,fillet_height]]; // 15 + + fillet_faces = [ + [0,4,8,12,15,11,7,3], // 0 + [0,1,5,4], // 1 + [1,2,6,5], // 2 + [7,6,2,3], // 3 + [4,5,9,8], // 4 + [5,6,10,9],// 5 + [10,6,7,11],// 6 + [8,9,13,12],// 7 + [9,10,14,13],// 8 + [15,14,10,11],// 9 + [12,13,14,15],// 10 + [3,2,1,0]];// 11 + + polyhedron(fillet_points, fillet_faces); + } + } + + module sot26_() + { + // pin prototype + module pin(length, height, thick) + { + linear_extrude(height=thick) + scale([length, -height, 1]) + polygon([[0.3400,0.0000],[0.3900,0.0100],[0.4300,0.0300],[0.4600,0.0600],[0.4789,0.0908],[0.6279,0.8307],[0.6500,0.8600],[0.6900,0.8900],[0.7300,0.9000],[1.0000,0.9000],[1.0000,1.0000],[0.6700,1.0012],[0.6100,0.9900],[0.5600,0.9600],[0.5300,0.9200],[0.5200,0.9000],[0.3721,0.1693],[0.3500,0.1400],[0.3100,0.1100],[0.2700,0.1000],[0.0000,0.1000],[0.0000,0.0000]]); + } + + rotate([90,0,-90]) scale([1.13,1.13,1.0]) translate([-0.9, 0.4, -2.14 - 0.43/2]) { + // body + color([0.1,0.1,0.1]) + linear_extrude(height=2.9) + polygon([[-0.55,0],[-0.45,0.53],[0.45,0.53],[0.55,0],[0.45,-0.35],[-0.45,-0.35]]); + + // 3 pins + color([0.9, 0.9, 0.9]) { + translate([0.5,0,0.4594-0.43/2]) + pin(0.5, 0.4, 0.43); + + translate([0.5,0,1.45-0.43/2]) + pin(0.5, 0.4, 0.43); + + translate([0.5,0,2.4406-0.43/2]) + pin(0.5, 0.4, 0.43); + + translate([-0.5,0,0.4594-0.43/2]) + pin(-0.5, 0.4, 0.43); + + translate([-0.5,0,2.4406-0.43/2]) + pin(-0.5, 0.4, 0.43); + + translate([-0.5,0,1.45-0.43/2]) + pin(-0.5, 0.4, 0.43); + + } + } + } + + if (fillet) { + color([0.9, 0.9, 0.9]) { + translate([0,0.02,0]) + fillet(); + translate([0,1.01,0]) + fillet(); + translate([0,2.0,0]) + fillet(); + translate([-2.03,0.02,0]) + rotate([0,0,180]) + fillet(); + translate([-2.03,1.01,0]) + rotate([0,0,180]) + fillet(); + translate([-2.03,2.0,0]) + rotate([0,0,180]) + fillet(); + } + } + + translate([0,0.1,0]) + // match rotation with stock footprint's + rotate([0,0,90]) + sot26_(); +} + diff -Nru pcb-rnd-3.1.0/footprint/smd/SOT323D.fp pcb-rnd-3.1.1/footprint/smd/SOT323D.fp --- pcb-rnd-3.1.0/footprint/smd/SOT323D.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/SOT323D.fp 2023-05-06 10:37:13.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = SOT323D SMT diode (pin 1 is cathode) + openscad = SOT323D.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/smd/SOT323D.scad pcb-rnd-3.1.1/footprint/smd/SOT323D.scad --- pcb-rnd-3.1.0/footprint/smd/SOT323D.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/SOT323D.scad 2023-05-12 15:36:01.000000000 +0000 @@ -0,0 +1,127 @@ +// Model for SOT323D package +// +// Copyright (C) 2017,2020 Tibor 'Igor2' Palinkas +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_sot323D(fillet=0) +{ + + module fillet(pad_len=0.3, pad_width=0.3, pad_height= 0.2) { + fillet_height = pad_height/3; + fillet_width = pad_len/3; + overall_width = fillet_width + pad_width; + overall_length = pad_len + fillet_width; + + translate([-pad_len/2,0,0]) { + fillet_points = [ + [0,overall_width/2,0], // 0 + [overall_length,overall_width/2,0], // 1 + [overall_length,-overall_width/2,0], // 2 + [0,-overall_width/2,0], // 3 + [0,pad_width/2+fillet_width/2,fillet_height/3], // 4 + [pad_len+fillet_width/2,pad_width/2+fillet_width/2,fillet_height/3], // 5 + [pad_len+fillet_width/2,-pad_width/2-fillet_width/2,fillet_height/3], // 6 + [0,-pad_width/2-fillet_width/2,fillet_height/3], // 7 + [0,pad_width/2+fillet_width/6,2*fillet_height/3], // 8 + [pad_len+fillet_width/6,pad_width/2+fillet_width/6,2*fillet_height/3], // 9 + [pad_len+fillet_width/6,-pad_width/2-fillet_width/6,2*fillet_height/3], // 10 + [0,-pad_width/2-fillet_width/6,2*fillet_height/3], // 11 + [0,pad_width/2,fillet_height], // 12 + [pad_len,pad_width/2,fillet_height], // 13 + [pad_len,-pad_width/2,fillet_height], // 14 + [0,-pad_width/2,fillet_height]]; // 15 + + fillet_faces = [ + [0,4,8,12,15,11,7,3], // 0 + [0,1,5,4], // 1 + [1,2,6,5], // 2 + [7,6,2,3], // 3 + [4,5,9,8], // 4 + [5,6,10,9],// 5 + [10,6,7,11],// 6 + [8,9,13,12],// 7 + [9,10,14,13],// 8 + [15,14,10,11],// 9 + [12,13,14,15],// 10 + [3,2,1,0]];// 11 + + polyhedron(fillet_points, fillet_faces); + } + } + + module sot323D_() + { + // pin prototype + module pin(length, height, thick) + { + linear_extrude(height=thick) + scale([length, -2*height, 1]) + polygon([[0.3400,0.0000],[0.3900,0.0100],[0.4300,0.0300],[0.4600,0.0600],[0.4789,0.0908],[0.6279,0.8307],[0.6500,0.8600],[0.6900,0.8900],[0.7300,0.9000],[1.0000,0.9000],[1.0000,1.0000],[0.6700,1.0012],[0.6100,0.9900],[0.5600,0.9600],[0.5300,0.9200],[0.5200,0.9000],[0.3721,0.1693],[0.3500,0.1400],[0.3100,0.1100],[0.2700,0.1000],[0.0000,0.1000],[0.0000,0.0000]]); + } + + rotate([90,0,-90]) scale([1.13,1.13,1.0]) translate([-0.9, 0.4, -2.0 + 0.35]) { + // body + color([0.1,0.1,0.1]) + linear_extrude(height=2.0) + polygon([[-0.55,0.18],[-0.50,0.53],[0.50,0.53],[0.55,0.18],[0.45,-0.35],[-0.45,-0.35]]); + + // 3 pins + color([0.9, 0.9, 0.9]) { + translate([0.43,0.4,0.35-0.3/2]) + pin(0.6, 0.4, 0.3); + + translate([0.43,0.4,1.65-0.3/2]) + pin(0.6, 0.4, 0.3); + + translate([-0.43,0.4,1.0-0.3/2]) + pin(-0.6, 0.4, 0.3); + } + } + } + + if (fillet) { + color([0.9, 0.9, 0.9]) { + rotate([0,0,-90]) + fillet(); + translate([1.45-0.3/2,0,0]) + rotate([0,0,-90]) + fillet(); + translate([0.8-0.3/2,2.03,0]) + rotate([0,0,90]) + fillet(); + } + } + + // match rotation with stock footprint's + rotate([0,0,0]) + sot323D_(); +} + diff -Nru pcb-rnd-3.1.0/footprint/smd/SOT323.fp pcb-rnd-3.1.1/footprint/smd/SOT323.fp --- pcb-rnd-3.1.0/footprint/smd/SOT323.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/SOT323.fp 2023-05-06 10:36:46.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = SOT323 SMT transistor, 3 pins + openscad = SOT323.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/smd/SOT323.scad pcb-rnd-3.1.1/footprint/smd/SOT323.scad --- pcb-rnd-3.1.0/footprint/smd/SOT323.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/SOT323.scad 2023-05-12 15:36:01.000000000 +0000 @@ -0,0 +1,125 @@ +// Model for SOT323 package +// +// Copyright (C) 2017,2020 Tibor 'Igor2' Palinkas +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_sot323(fillet=0) +{ + + module fillet(pad_len=0.3, pad_width=0.3, pad_height= 0.2) { + fillet_height = pad_height/3; + fillet_width = pad_len/3; + overall_width = fillet_width + pad_width; + overall_length = pad_len + fillet_width; + + translate([-pad_len/2,0,0]) { + fillet_points = [ + [0,overall_width/2,0], // 0 + [overall_length,overall_width/2,0], // 1 + [overall_length,-overall_width/2,0], // 2 + [0,-overall_width/2,0], // 3 + [0,pad_width/2+fillet_width/2,fillet_height/3], // 4 + [pad_len+fillet_width/2,pad_width/2+fillet_width/2,fillet_height/3], // 5 + [pad_len+fillet_width/2,-pad_width/2-fillet_width/2,fillet_height/3], // 6 + [0,-pad_width/2-fillet_width/2,fillet_height/3], // 7 + [0,pad_width/2+fillet_width/6,2*fillet_height/3], // 8 + [pad_len+fillet_width/6,pad_width/2+fillet_width/6,2*fillet_height/3], // 9 + [pad_len+fillet_width/6,-pad_width/2-fillet_width/6,2*fillet_height/3], // 10 + [0,-pad_width/2-fillet_width/6,2*fillet_height/3], // 11 + [0,pad_width/2,fillet_height], // 12 + [pad_len,pad_width/2,fillet_height], // 13 + [pad_len,-pad_width/2,fillet_height], // 14 + [0,-pad_width/2,fillet_height]]; // 15 + + fillet_faces = [ + [0,4,8,12,15,11,7,3], // 0 + [0,1,5,4], // 1 + [1,2,6,5], // 2 + [7,6,2,3], // 3 + [4,5,9,8], // 4 + [5,6,10,9],// 5 + [10,6,7,11],// 6 + [8,9,13,12],// 7 + [9,10,14,13],// 8 + [15,14,10,11],// 9 + [12,13,14,15],// 10 + [3,2,1,0]];// 11 + + polyhedron(fillet_points, fillet_faces); + } + } + + module sot323_() + { + // pin prototype + module pin(length, height, thick) + { + linear_extrude(height=thick) + scale([length, -2*height, 1]) + polygon([[0.3400,0.0000],[0.3900,0.0100],[0.4300,0.0300],[0.4600,0.0600],[0.4789,0.0908],[0.6279,0.8307],[0.6500,0.8600],[0.6900,0.8900],[0.7300,0.9000],[1.0000,0.9000],[1.0000,1.0000],[0.6700,1.0012],[0.6100,0.9900],[0.5600,0.9600],[0.5300,0.9200],[0.5200,0.9000],[0.3721,0.1693],[0.3500,0.1400],[0.3100,0.1100],[0.2700,0.1000],[0.0000,0.1000],[0.0000,0.0000]]); + } + + rotate([90,0,-90]) scale([1.13,1.13,1.0]) translate([-0.9, 0.4, -2.0 + 0.35]) { + // body + color([0.1,0.1,0.1]) + linear_extrude(height=2.0) + polygon([[-0.55,0.18],[-0.50,0.53],[0.50,0.53],[0.55,0.18],[0.45,-0.35],[-0.45,-0.35]]); + + // 3 pins + color([0.9, 0.9, 0.9]) { + translate([0.43,0.4,0.35-0.3/2]) + pin(0.6, 0.4, 0.3); + + translate([0.43,0.4,1.65-0.3/2]) + pin(0.6, 0.4, 0.3); + + translate([-0.43,0.4,1.0-0.3/2]) + pin(-0.6, 0.4, 0.3); + } + } + } + + if (fillet) { + color([0.9, 0.9, 0.9]) { + fillet(); + translate([0,1.45-0.3/2,0]) + fillet(); + translate([-2.03,0.8-0.3/2,0]) + rotate([0,0,180]) + fillet(); + } + } + + // match rotation with stock footprint's + rotate([0,0,90]) + sot323_(); +} + diff -Nru pcb-rnd-3.1.0/footprint/smd/SOT325.fp pcb-rnd-3.1.1/footprint/smd/SOT325.fp --- pcb-rnd-3.1.0/footprint/smd/SOT325.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/SOT325.fp 2023-05-06 10:38:11.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = SOT325 SMT transistor, 5 pins + openscad = SOT325.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/smd/SOT325.scad pcb-rnd-3.1.1/footprint/smd/SOT325.scad --- pcb-rnd-3.1.0/footprint/smd/SOT325.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/SOT325.scad 2023-05-12 15:36:01.000000000 +0000 @@ -0,0 +1,134 @@ +// Model for SOT325 package +// +// Copyright (C) 2017,2020 Tibor 'Igor2' Palinkas +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_sot325(fillet=0) +{ + + module fillet(pad_len=0.3, pad_width=0.3, pad_height= 0.2) { + fillet_height = pad_height/3; + fillet_width = pad_len/3; + overall_width = fillet_width + pad_width; + overall_length = pad_len + fillet_width; + + translate([-pad_len/2,0,0]) { + fillet_points = [ + [0,overall_width/2,0], // 0 + [overall_length,overall_width/2,0], // 1 + [overall_length,-overall_width/2,0], // 2 + [0,-overall_width/2,0], // 3 + [0,pad_width/2+fillet_width/2,fillet_height/3], // 4 + [pad_len+fillet_width/2,pad_width/2+fillet_width/2,fillet_height/3], // 5 + [pad_len+fillet_width/2,-pad_width/2-fillet_width/2,fillet_height/3], // 6 + [0,-pad_width/2-fillet_width/2,fillet_height/3], // 7 + [0,pad_width/2+fillet_width/6,2*fillet_height/3], // 8 + [pad_len+fillet_width/6,pad_width/2+fillet_width/6,2*fillet_height/3], // 9 + [pad_len+fillet_width/6,-pad_width/2-fillet_width/6,2*fillet_height/3], // 10 + [0,-pad_width/2-fillet_width/6,2*fillet_height/3], // 11 + [0,pad_width/2,fillet_height], // 12 + [pad_len,pad_width/2,fillet_height], // 13 + [pad_len,-pad_width/2,fillet_height], // 14 + [0,-pad_width/2,fillet_height]]; // 15 + + fillet_faces = [ + [0,4,8,12,15,11,7,3], // 0 + [0,1,5,4], // 1 + [1,2,6,5], // 2 + [7,6,2,3], // 3 + [4,5,9,8], // 4 + [5,6,10,9],// 5 + [10,6,7,11],// 6 + [8,9,13,12],// 7 + [9,10,14,13],// 8 + [15,14,10,11],// 9 + [12,13,14,15],// 10 + [3,2,1,0]];// 11 + + polyhedron(fillet_points, fillet_faces); + } + } + + module sot325_() + { + // pin prototype + module pin(length, height, thick) + { + linear_extrude(height=thick) + scale([length, -2*height, 1]) + polygon([[0.3400,0.0000],[0.3900,0.0100],[0.4300,0.0300],[0.4600,0.0600],[0.4789,0.0908],[0.6279,0.8307],[0.6500,0.8600],[0.6900,0.8900],[0.7300,0.9000],[1.0000,0.9000],[1.0000,1.0000],[0.6700,1.0012],[0.6100,0.9900],[0.5600,0.9600],[0.5300,0.9200],[0.5200,0.9000],[0.3721,0.1693],[0.3500,0.1400],[0.3100,0.1100],[0.2700,0.1000],[0.0000,0.1000],[0.0000,0.0000]]); + } + + rotate([90,0,-90]) scale([1.13,1.13,1.0])translate([-0.9, 0.4, -2.0 + 0.35]) { + // body + color([0.1,0.1,0.1]) + linear_extrude(height=2.0) + polygon([[-0.55,0.18],[-0.50,0.53],[0.50,0.53],[0.55,0.18],[0.45,-0.35],[-0.45,-0.35]]); + + // 3 pins + color([0.9, 0.9, 0.9]) { + translate([0.43,0.4,0.35-0.3/2]) + pin(0.6, 0.4, 0.3); + translate([0.43,0.4,1.65-0.3/2]) + pin(0.6, 0.4, 0.3); + + translate([-0.43,0.4,0.35-0.3/2]) + pin(-0.6, 0.4, 0.3); + translate([-0.43,0.4,1.0-0.3/2]) + pin(-0.6, 0.4, 0.3); + translate([-0.43,0.4,1.65-0.3/2]) + pin(-0.6, 0.4, 0.3); + } + } + } + + if (fillet) { + color([0.9, 0.9, 0.9]) { + fillet(); + translate([0,1.45-0.3/2,0]) + fillet(); + translate([-2.03,0,0]) + rotate([0,0,180]) + fillet(); + translate([-2.03,0.8-0.3/2,0]) + rotate([0,0,180]) + fillet(); + translate([-2.03,1.45-0.3/2,0]) + rotate([0,0,180]) + fillet(); + } + } + + // match rotation with stock footprint's + rotate([0,0,90]) + sot325_(); +} + diff -Nru pcb-rnd-3.1.0/footprint/smd/SOT326.fp pcb-rnd-3.1.1/footprint/smd/SOT326.fp --- pcb-rnd-3.1.0/footprint/smd/SOT326.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/SOT326.fp 2023-05-06 10:38:39.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = SOT326 SMT transistor, 6 pins + openscad = SOT326.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/smd/SOT326.scad pcb-rnd-3.1.1/footprint/smd/SOT326.scad --- pcb-rnd-3.1.0/footprint/smd/SOT326.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/SOT326.scad 2023-05-12 15:36:01.000000000 +0000 @@ -0,0 +1,138 @@ +// Model for SOT326 package +// +// Copyright (C) 2017,2020 Tibor 'Igor2' Palinkas +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_sot326(fillet=0) +{ + + module fillet(pad_len=0.3, pad_width=0.3, pad_height= 0.2) { + fillet_height = pad_height/3; + fillet_width = pad_len/3; + overall_width = fillet_width + pad_width; + overall_length = pad_len + fillet_width; + + translate([-pad_len/2,0,0]) { + fillet_points = [ + [0,overall_width/2,0], // 0 + [overall_length,overall_width/2,0], // 1 + [overall_length,-overall_width/2,0], // 2 + [0,-overall_width/2,0], // 3 + [0,pad_width/2+fillet_width/2,fillet_height/3], // 4 + [pad_len+fillet_width/2,pad_width/2+fillet_width/2,fillet_height/3], // 5 + [pad_len+fillet_width/2,-pad_width/2-fillet_width/2,fillet_height/3], // 6 + [0,-pad_width/2-fillet_width/2,fillet_height/3], // 7 + [0,pad_width/2+fillet_width/6,2*fillet_height/3], // 8 + [pad_len+fillet_width/6,pad_width/2+fillet_width/6,2*fillet_height/3], // 9 + [pad_len+fillet_width/6,-pad_width/2-fillet_width/6,2*fillet_height/3], // 10 + [0,-pad_width/2-fillet_width/6,2*fillet_height/3], // 11 + [0,pad_width/2,fillet_height], // 12 + [pad_len,pad_width/2,fillet_height], // 13 + [pad_len,-pad_width/2,fillet_height], // 14 + [0,-pad_width/2,fillet_height]]; // 15 + + fillet_faces = [ + [0,4,8,12,15,11,7,3], // 0 + [0,1,5,4], // 1 + [1,2,6,5], // 2 + [7,6,2,3], // 3 + [4,5,9,8], // 4 + [5,6,10,9],// 5 + [10,6,7,11],// 6 + [8,9,13,12],// 7 + [9,10,14,13],// 8 + [15,14,10,11],// 9 + [12,13,14,15],// 10 + [3,2,1,0]];// 11 + + polyhedron(fillet_points, fillet_faces); + } + } + + module sot326_() + { + // pin prototype + module pin(length, height, thick) + { + linear_extrude(height=thick) + scale([length, -2*height, 1]) + polygon([[0.3400,0.0000],[0.3900,0.0100],[0.4300,0.0300],[0.4600,0.0600],[0.4789,0.0908],[0.6279,0.8307],[0.6500,0.8600],[0.6900,0.8900],[0.7300,0.9000],[1.0000,0.9000],[1.0000,1.0000],[0.6700,1.0012],[0.6100,0.9900],[0.5600,0.9600],[0.5300,0.9200],[0.5200,0.9000],[0.3721,0.1693],[0.3500,0.1400],[0.3100,0.1100],[0.2700,0.1000],[0.0000,0.1000],[0.0000,0.0000]]); + } + + rotate([90,0,-90]) scale([1.13,1.13,1.0]) translate([-0.9, 0.4, -2.0 + 0.35]) { + // body + color([0.1,0.1,0.1]) + linear_extrude(height=2.0) + polygon([[-0.55,0.18],[-0.50,0.53],[0.50,0.53],[0.55,0.18],[0.45,-0.35],[-0.45,-0.35]]); + + // 6 pins + color([0.9, 0.9, 0.9]) { + translate([0.43,0.4,0.35-0.3/2]) + pin(0.6, 0.4, 0.3); + translate([0.43,0.4,1.0-0.3/2]) + pin(0.6, 0.4, 0.3); + translate([0.43,0.4,1.65-0.3/2]) + pin(0.6, 0.4, 0.3); + + translate([-0.43,0.4,0.35-0.3/2]) + pin(-0.6, 0.4, 0.3); + translate([-0.43,0.4,1.0-0.3/2]) + pin(-0.6, 0.4, 0.3); + translate([-0.43,0.4,1.65-0.3/2]) + pin(-0.6, 0.4, 0.3); + + } + } + } + + if (fillet) { + color([0.9, 0.9, 0.9]) { + fillet(); + translate([0,0.8-0.3/2,0]) + fillet(); + translate([0,1.45-0.3/2,0]) + fillet(); + translate([-2.03,0,0]) + rotate([0,0,180]) + fillet(); + translate([-2.03,0.8-0.3/2,0]) + rotate([0,0,180]) + fillet(); + translate([-2.03,1.45-0.3/2,0]) + rotate([0,0,180]) + fillet(); + } + } + // match rotation with stock footprint's + rotate([0,0,90]) + sot326_(); +} + diff -Nru pcb-rnd-3.1.0/footprint/smd/SOT89.fp pcb-rnd-3.1.1/footprint/smd/SOT89.fp --- pcb-rnd-3.1.0/footprint/smd/SOT89.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/SOT89.fp 2023-05-06 12:33:11.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = SOT89 SMT transistor, 4 pins + openscad = SOT89.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/smd/SOT89.scad pcb-rnd-3.1.1/footprint/smd/SOT89.scad --- pcb-rnd-3.1.0/footprint/smd/SOT89.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/SOT89.scad 2023-05-12 15:36:01.000000000 +0000 @@ -0,0 +1,120 @@ +// Model for SOT89 package +// +// Copyright (C) 2017,2020 Tibor 'Igor2' Palinkas +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_sot89(fillet=0) +{ + module fillet(pad_width=0.48,pad_len=1.0,pad_height= 0.4) { + fillet_height = pad_height/3; + fillet_width = pad_len/3; + overall_width = fillet_width + pad_width; + overall_length = pad_len + fillet_width; + + translate([-pad_len/2,0,0]) { + fillet_points = [ + [0,overall_width/2,0], // 0 + [overall_length,overall_width/2,0], // 1 + [overall_length,-overall_width/2,0], // 2 + [0,-overall_width/2,0], // 3 + [0,pad_width/2+fillet_width/2,fillet_height/3], // 4 + [pad_len+fillet_width/2,pad_width/2+fillet_width/2,fillet_height/3], // 5 + [pad_len+fillet_width/2,-pad_width/2-fillet_width/2,fillet_height/3], // 6 + [0,-pad_width/2-fillet_width/2,fillet_height/3], // 7 + [0,pad_width/2+fillet_width/6,2*fillet_height/3], // 8 + [pad_len+fillet_width/6,pad_width/2+fillet_width/6,2*fillet_height/3], // 9 + [pad_len+fillet_width/6,-pad_width/2-fillet_width/6,2*fillet_height/3], // 10 + [0,-pad_width/2-fillet_width/6,2*fillet_height/3], // 11 + [0,pad_width/2,fillet_height], // 12 + [pad_len,pad_width/2,fillet_height], // 13 + [pad_len,-pad_width/2,fillet_height], // 14 + [0,-pad_width/2,fillet_height]]; // 15 + + fillet_faces = [ + [0,4,8,12,15,11,7,3], // 0 + [0,1,5,4], // 1 + [1,2,6,5], // 2 + [7,6,2,3], // 3 + [4,5,9,8], // 4 + [5,6,10,9],// 5 + [10,6,7,11],// 6 + [8,9,13,12],// 7 + [9,10,14,13],// 8 + [15,14,10,11],// 9 + [12,13,14,15],// 10 + [3,2,1,0]];// 11 + + polyhedron(fillet_points, fillet_faces); + } + } + + module sot89_() { + rotate([0,0,90]) { + translate([1.55,-0.5,0]) { + color([0.9, 0.9, 0.9]) { + // tab + linear_extrude(height=0.4) + polygon([[0.2400,0.0000],[0.2400,1.600],[0.9000,1.6000],[0.9000,3.7500],[0.6500,4.000],[-0.6500,4.000],[-0.9000,3.7500],[-0.9000,1.6000],[-0.2400,1.6000],[-0.2400,0.0000]]); + // pins + linear_extrude(height=0.4) + polygon([[-1.7400,0.0000],[-1.7400,1.200],[-1.2600,1.2000],[-1.2600,0.0000]]); + + linear_extrude(height=0.4) + polygon([[1.7400,0.0000],[1.7400,1.200],[1.2600,1.2000],[1.2600,0.0000]]); + } + + // body + color([0.1,0.1,0.1]) { + translate([-2.3,1.0,0.1]) { + rotate([0,90,0]) { + linear_extrude(height=4.6) + polygon([[0.0, 0.0],[-1.5,0.3],[-1.5,2.2],[0.0,2.5]]); + } + } + } + } + } + } + sot89_(); + if(fillet) { + color([0.9, 0.9, 0.9]) { + translate([0,0.05,0]) + fillet(); + translate([0,1.55,0]) + fillet(); + translate([0,3.05,0]) + fillet(); + translate([-3.2,1.55,0]) + rotate([0,0,180]) + fillet(pad_width=1.7,pad_len=0.5); + } + } +} diff -Nru pcb-rnd-3.1.0/footprint/smd/TANT.scad pcb-rnd-3.1.1/footprint/smd/TANT.scad --- pcb-rnd-3.1.0/footprint/smd/TANT.scad 2020-09-13 05:02:03.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/smd/TANT.scad 2023-05-12 15:12:37.000000000 +0000 @@ -30,12 +30,54 @@ // in any way. // -module part_tantalum (sz) +module part_tantalum (sz,fillet=0) { + module fillet(pad_len=P, pad_width=Tw, pad_height= H/2) { + fillet_height = pad_height/3; + fillet_width = pad_len/4; + overall_width = fillet_width + pad_width; + overall_length = pad_len + fillet_width; + + translate([-pad_len/2,0,0]) { + fillet_points = [ + [0,overall_width/2,0], // 0 + [overall_length,overall_width/2,0], // 1 + [overall_length,-overall_width/2,0], // 2 + [0,-overall_width/2,0], // 3 + [0,pad_width/2+fillet_width/2,fillet_height/3], // 4 + [pad_len+fillet_width/2,pad_width/2+fillet_width/2,fillet_height/3], // 5 + [pad_len+fillet_width/2,-pad_width/2-fillet_width/2,fillet_height/3], // 6 + [0,-pad_width/2-fillet_width/2,fillet_height/3], // 7 + [0,pad_width/2+fillet_width/6,2*fillet_height/3], // 8 + [pad_len+fillet_width/6,pad_width/2+fillet_width/6,2*fillet_height/3], // 9 + [pad_len+fillet_width/6,-pad_width/2-fillet_width/6,2*fillet_height/3], // 10 + [0,-pad_width/2-fillet_width/6,2*fillet_height/3], // 11 + [0,pad_width/2,fillet_height], // 12 + [pad_len,pad_width/2,fillet_height], // 13 + [pad_len,-pad_width/2,fillet_height], // 14 + [0,-pad_width/2,fillet_height]]; // 15 + + fillet_faces = [ + [0,4,8,12,15,11,7,3], // 0 + [0,1,5,4], // 1 + [1,2,6,5], // 2 + [7,6,2,3], // 3 + [4,5,9,8], // 4 + [5,6,10,9],// 5 + [10,6,7,11],// 6 + [8,9,13,12],// 7 + [9,10,14,13],// 8 + [15,14,10,11],// 9 + [12,13,14,15],// 10 + [3,2,1,0]];// 11 + + polyhedron(fillet_points, fillet_faces); + } + } + module impl (L, W, H, P, Tw, Th) { delta = 1e-3 ; - $fn = 30 ; module lead (P, Tw, Th) color ([0.9, 0.9, 0.9]) @@ -81,6 +123,16 @@ translate ([L/2, 0, 0]) mirror ([1, 0, 0]) lead (P, Tw, Th) ; + + if (fillet) { + color ([0.8, 0.8, 0.8]) { + translate ([L/2-P/2, 0, 0]) + fillet(pad_len=P, pad_width=Tw, pad_height= H/2); + translate ([-L/2+P/2, 0, 0]) + rotate([0,0,180]) + fillet(pad_len=P, pad_width=Tw, pad_height= H/2); + } + } } sizes = "ABCDE" ; @@ -93,3 +145,4 @@ idx = search (sz, sizes)[0] ; impl (L[idx], W[idx], H[idx], P[idx], Tw[idx], H[idx]/2) ; } + diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/HC49.fp pcb-rnd-3.1.1/footprint/thru-hole/HC49.fp --- pcb-rnd-3.1.0/footprint/thru-hole/HC49.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/HC49.fp 2023-05-09 01:32:08.000000000 +0000 @@ -2,6 +2,8 @@ ha:subc.5 { ha:attributes { footprint = HC49 Crystals + openscad = HC49U.scad + openscad-param = {height=3.5} } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/HC49U_3.fp pcb-rnd-3.1.1/footprint/thru-hole/HC49U_3.fp --- pcb-rnd-3.1.0/footprint/thru-hole/HC49U_3.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/HC49U_3.fp 2023-05-07 09:34:26.000000000 +0000 @@ -3,6 +3,8 @@ ha:attributes { value = footprint = HC49U_3 Crystals + openscad = HC49U.scad + openscad-param = {height=13.46,pins=3} } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/HC49U_3H.fp pcb-rnd-3.1.1/footprint/thru-hole/HC49U_3H.fp --- pcb-rnd-3.1.0/footprint/thru-hole/HC49U_3H.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/HC49U_3H.fp 2023-05-07 10:35:02.000000000 +0000 @@ -2,6 +2,8 @@ ha:subc.5 { ha:attributes { footprint = HC49U_3H Crystals + openscad = HC49UH.scad + openscad-param = {height=13.46,pins=3} } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/HC49U.fp pcb-rnd-3.1.1/footprint/thru-hole/HC49U.fp --- pcb-rnd-3.1.0/footprint/thru-hole/HC49U.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/HC49U.fp 2023-05-07 09:12:29.000000000 +0000 @@ -2,6 +2,8 @@ ha:subc.5 { ha:attributes { footprint = HC49U Crystals + openscad = HC49U.scad + openscad-param = {height=13.46} } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/HC49UH.fp pcb-rnd-3.1.1/footprint/thru-hole/HC49UH.fp --- pcb-rnd-3.1.0/footprint/thru-hole/HC49UH.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/HC49UH.fp 2023-05-07 10:35:02.000000000 +0000 @@ -2,6 +2,8 @@ ha:subc.5 { ha:attributes { footprint = HC49UH Crystals + openscad = HC49UH.scad + openscad-param = {height=13.46} } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/HC49UH.scad pcb-rnd-3.1.1/footprint/thru-hole/HC49UH.scad --- pcb-rnd-3.1.0/footprint/thru-hole/HC49UH.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/HC49UH.scad 2023-05-12 15:45:19.000000000 +0000 @@ -0,0 +1,115 @@ +// Model for HC49 horizontal 2 and 3 pin through hole packages +// +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_HC49H(height=13.46, pins=2, pin_descent=2.5) +{ + major_diameter = 4.65; + minor_diameter = 3.8; + rim_thickness = 0.43; + pin_diameter = 0.43; + pcb_offset = 0.1; + rounding = 0.5; + + // r[adius], h[eight], [rou]n[d] + module rounded_cylinder(r,h,n) { + rotate_extrude(convexity=1) { + offset(r=n) offset(delta=-n) square([r,h]); + square([n,h]); + } + } + + module curved_pin(pin_sense) { + rotate([90,0,pin_sense*90]) + translate([major_diameter/2, 0,0]) + rotate_extrude(angle=90, convexity=10) + translate([-major_diameter/2, 0,0]) + circle(r = pin_diameter/2); + } + + // rotate sorts out default lib 3 pin vs 2 pin HC49 alignment difference + rotate([0,0,(pins-2)*90]) { + translate([0,major_diameter/2,major_diameter/2]) { + rotate([-90,0,0]) { + union() { + color([0.7,0.7,0.7]) { + translate ([2.44,0,0]) { + translate ([(10.24-minor_diameter)/2,0,0]) + rounded_cylinder(minor_diameter/2,height,rounding); + translate ([-(10.24-minor_diameter)/2,0,0]) + rounded_cylinder(minor_diameter/2,height,rounding); + translate ([0,0,(height-rounding)/2]) + cube([10.24-minor_diameter,minor_diameter, height - rounding], true); + translate ([0,0,height-rounding]) + cube([10.24-minor_diameter,minor_diameter-rounding*2, rounding*2], true); + translate ([-(10.24-minor_diameter)/2,-minor_diameter/2+rounding,height-rounding]) + rotate([0,90,0]) + cylinder(r = rounding, h = 10.24-minor_diameter); + translate ([-(10.24-minor_diameter)/2,minor_diameter/2-rounding,height-rounding]) + rotate([0,90,0]) + cylinder(r = rounding, h = 10.24-minor_diameter); + + translate ([-(11.05-major_diameter)/2,0,0]) + cylinder(r = major_diameter/2, h = rim_thickness); + translate ([(11.05-major_diameter)/2,0,0]) + cylinder(r = major_diameter/2, h = rim_thickness); + translate ([0,0,rim_thickness/2]) + cube([11.05-major_diameter,major_diameter, rim_thickness], true); + } + } + color([0.8,0.8,0.8]) { + pin_sense = 1; // or -1 for opposite direction + curved_pin(pin_sense); + translate ([4.88,0,0]) + curved_pin(pin_sense); + if (pins == 3) { + translate ([2.44,0,0]) + curved_pin(pin_sense); + } + rotate([-90*pin_sense,0,0]) { + translate ([0,pin_sense*major_diameter/2,major_diameter]) { + translate ([0,0,-2.35]) + cylinder(r = pin_diameter/2, h = pin_descent); + translate ([4.88,0,-2.35]) + cylinder(r = pin_diameter/2, h = pin_descent); + if (pins == 3) { + translate ([2.44,0,-2.35]) + cylinder(r = pin_diameter/2, h = pin_descent); + } + } + } + } + } + } + } + } +} + diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/HC49U.scad pcb-rnd-3.1.1/footprint/thru-hole/HC49U.scad --- pcb-rnd-3.1.0/footprint/thru-hole/HC49U.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/HC49U.scad 2023-05-12 15:45:19.000000000 +0000 @@ -0,0 +1,90 @@ +// Model for HC49 vertical 2 and 3 pin through hole packages +// +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_HC49(height=13.46, pins=2, pin_descent=2.5) +{ + major_diameter = 4.65; + minor_diameter = 3.8; + rim_thickness = 0.43; + pin_diameter = 0.43; + pcb_offset = 0.1; + rounding = 0.5; + + // r[adius], h[eight], [rou]n[d] + module rounded_cylinder(r,h,n) { + rotate_extrude(convexity=1) { + offset(r=n) offset(delta=-n) square([r,h]); + square([n,h]); + } + } + // rotate sorts out default lib 3 pin vs 2 pin HC49 alignment difference + rotate([0,0,(pins-2)*90]) { + union() { + color([0.7,0.7,0.7]) { + translate ([2.44,0,pcb_offset]) { + translate ([(10.24-minor_diameter)/2,0,0]) + rounded_cylinder(minor_diameter/2,height,rounding); + translate ([-(10.24-minor_diameter)/2,0,0]) + rounded_cylinder(minor_diameter/2,height,rounding); + translate ([0,0,(height-rounding)/2]) + cube([10.24-minor_diameter,minor_diameter, height - rounding], true); + translate ([0,0,height-rounding]) + cube([10.24-minor_diameter,minor_diameter-rounding*2, rounding*2], true); + translate ([-(10.24-minor_diameter)/2,-minor_diameter/2+rounding,height-rounding]) + rotate([0,90,0]) + cylinder(r = rounding, h = 10.24-minor_diameter); + translate ([-(10.24-minor_diameter)/2,minor_diameter/2-rounding,height-rounding]) + rotate([0,90,0]) + cylinder(r = rounding, h = 10.24-minor_diameter); + + translate ([-(11.05-major_diameter)/2,0,0]) + cylinder(r = major_diameter/2, h = rim_thickness); + translate ([(11.05-major_diameter)/2,0,0]) + cylinder(r = major_diameter/2, h = rim_thickness); + translate ([0,0,rim_thickness/2]) + cube([11.05-major_diameter,major_diameter, rim_thickness], true); + } + } + color([0.8,0.8,0.8]) { + translate ([0,0,-pin_descent]) + cylinder(r = pin_diameter/2, h = pcb_offset +pin_descent); + translate ([4.88,0,-pin_descent]) + cylinder(r = pin_diameter/2, h = pcb_offset + pin_descent); + if (pins == 3) { + translate ([2.44,0,-pin_descent]) + cylinder(r = pin_diameter/2, h = pcb_offset + pin_descent); + } + } + } + } +} + diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/HC51U.fp pcb-rnd-3.1.1/footprint/thru-hole/HC51U.fp --- pcb-rnd-3.1.0/footprint/thru-hole/HC51U.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/HC51U.fp 2023-05-07 11:47:41.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = HC51U Crystals + openscad = HC51U.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/HC51UH.fp pcb-rnd-3.1.1/footprint/thru-hole/HC51UH.fp --- pcb-rnd-3.1.0/footprint/thru-hole/HC51UH.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/HC51UH.fp 2023-05-07 11:47:41.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = HC51UH Crystals + openscad = HC51UH.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/HC51UH.scad pcb-rnd-3.1.1/footprint/thru-hole/HC51UH.scad --- pcb-rnd-3.1.0/footprint/thru-hole/HC51UH.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/HC51UH.scad 2023-05-12 15:45:19.000000000 +0000 @@ -0,0 +1,117 @@ +// Model for HC51 horizontal 2 and 3 pin through hole packages +// +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_HC51H(height=19.7, pins=2, pin_descent=2.5) +{ + major_diameter = 9.2; + minor_diameter = 8.94; + rim_thickness = 0.43; + pin_diameter = 0.43; + major_axis1 = 18.4; + major_axis2 = 19.2; + pcb_offset = 0.1; + rounding = 0.5; + + // r[adius], h[eight], [rou]n[d] + module rounded_cylinder(r,h,n) { + rotate_extrude(convexity=1) { + offset(r=n) offset(delta=-n) square([r,h]); + square([n,h]); + } + } + + module curved_pin(pin_sense) { + rotate([90,0,pin_sense*90]) + translate([major_diameter/2, 0,0]) + rotate_extrude(angle=90, convexity=10) + translate([-major_diameter/2, 0,0]) + circle(r = pin_diameter/2); + } + + // rotate sorted out default lib 3 pin vs 2 pin HC49 alignment difference + rotate([0,0,(pins-2)*90]) { + translate([0,major_diameter/2,major_diameter/2]) { + rotate([-90,0,0]) { + union() { + color([0.7,0.7,0.7]) { + translate ([6.15,0,0]) { + translate ([(major_axis1-minor_diameter)/2,0,0]) + rounded_cylinder(minor_diameter/2,height,rounding); + translate ([-(major_axis1-minor_diameter)/2,0,0]) + rounded_cylinder(minor_diameter/2,height,rounding); + translate ([0,0,(height-rounding)/2]) + cube([major_axis1-minor_diameter,minor_diameter, height - rounding], true); + translate ([0,0,height-rounding]) + cube([major_axis1-minor_diameter,minor_diameter-rounding*2, rounding*2], true); + translate ([-(major_axis1-minor_diameter)/2,-minor_diameter/2+rounding,height-rounding]) + rotate([0,90,0]) + cylinder(r = rounding, h = major_axis1-minor_diameter); + translate ([-(major_axis1-minor_diameter)/2,minor_diameter/2-rounding,height-rounding]) + rotate([0,90,0]) + cylinder(r = rounding, h = major_axis1-minor_diameter); + + translate ([-(major_axis2-major_diameter)/2,0,0]) + cylinder(r = major_diameter/2, h = rim_thickness); + translate ([(major_axis2-major_diameter)/2,0,0]) + cylinder(r = major_diameter/2, h = rim_thickness); + translate ([0,0,rim_thickness/2]) + cube([major_axis2-major_diameter,major_diameter, rim_thickness], true); + } + } + color([0.8,0.8,0.8]) { + pin_sense = 1; // or -1 for opposite direction + curved_pin(pin_sense); + translate ([12.3,0,0]) + curved_pin(pin_sense); + if (pins == 3) { + translate ([6.15,0,0]) + curved_pin(pin_sense); + } + rotate([-90*pin_sense,0,0]) { + translate ([0,pin_sense*major_diameter/2,major_diameter-2.45]) { + translate ([0,0,-2.15]) + cylinder(r = pin_diameter/2, h = pin_descent); + translate ([12.3,0,-2.15]) + cylinder(r = pin_diameter/2, h = pin_descent); + if (pins == 3) { + translate ([6.15,0,-pin_descent]) + cylinder(r = pin_diameter/2, h = pin_descent); + } + } + } + } + } + } + } + } +} + diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/HC51U.scad pcb-rnd-3.1.1/footprint/thru-hole/HC51U.scad --- pcb-rnd-3.1.0/footprint/thru-hole/HC51U.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/HC51U.scad 2023-05-12 15:45:19.000000000 +0000 @@ -0,0 +1,91 @@ +// Model for HC51 vertical 2 pin through hole packages +// +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_HC51(height=19.7, pins=2, pin_descent=2.5) +{ + major_diameter = 9.2; + minor_diameter = 8.94; + rim_thickness = 0.43; + pin_diameter = 0.43; + major_axis1 = 18.4; + major_axis2 = 19.2; + pcb_offset = 0.1; + rounding = 0.5; + + // r[adius], h[eight], [rou]n[d] + module rounded_cylinder(r,h,n) { + rotate_extrude(convexity=1) { + offset(r=n) offset(delta=-n) square([r,h]); + square([n,h]); + } + } + // rotate sorts out default lib 3 pin vs 2 pin HC49 alignment difference + rotate([0,0,(pins-2)*90]) { + union() { + color([0.7,0.7,0.7]) { + translate ([6.15,0,pcb_offset]) { + translate ([(major_axis1-minor_diameter)/2,0,0]) + rounded_cylinder(minor_diameter/2,height,rounding); + translate ([-(major_axis1-minor_diameter)/2,0,0]) + rounded_cylinder(minor_diameter/2,height,rounding); + translate ([0,0,(height-rounding)/2]) + cube([major_axis1-minor_diameter,minor_diameter, height - rounding], true); + translate ([0,0,height-rounding]) + cube([major_axis1-minor_diameter,minor_diameter-rounding*2, rounding*2], true); + translate ([-(major_axis1-minor_diameter)/2,-minor_diameter/2+rounding,height-rounding]) + rotate([0,90,0]) + cylinder(r = rounding, h = major_axis1 -minor_diameter); + translate ([-(major_axis1-minor_diameter)/2,minor_diameter/2-rounding,height-rounding]) + rotate([0,90,0]) + cylinder(r = rounding, h = major_axis1 -minor_diameter); + translate ([-(major_axis2-major_diameter)/2,0,0]) + cylinder(r = major_diameter/2, h = rim_thickness); + translate ([(major_axis2-major_diameter)/2,0,0]) + cylinder(r = major_diameter/2, h = rim_thickness); + translate ([0,0,rim_thickness/2]) + cube([major_axis2-major_diameter,major_diameter, rim_thickness], true); + } + } + color([0.8,0.8,0.8]) { + translate ([0,0,-pin_descent]) + cylinder(r = pin_diameter/2, h = pcb_offset +pin_descent); + translate ([12.3,0,-pin_descent]) + cylinder(r = pin_diameter/2, h = pcb_offset + pin_descent); + if (pins == 3) { + translate ([6.15,0,-pin_descent]) + cylinder(r = pin_diameter/2, h = pcb_offset + pin_descent); + } + } + } + } +} + diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/HEPTAWATT.fp pcb-rnd-3.1.1/footprint/thru-hole/HEPTAWATT.fp --- pcb-rnd-3.1.0/footprint/thru-hole/HEPTAWATT.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/HEPTAWATT.fp 2023-05-08 16:58:22.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = HEPTAWATT Power IC, as in MULTIWATT15 + openscad = HEPTAWATT.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/HEPTAWATT.scad pcb-rnd-3.1.1/footprint/thru-hole/HEPTAWATT.scad --- pcb-rnd-3.1.0/footprint/thru-hole/HEPTAWATT.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/HEPTAWATT.scad 2023-05-12 15:45:19.000000000 +0000 @@ -0,0 +1,121 @@ +// Model for vertical HEPTAWATT package +// +// Copyright (C) 2017,2020 Tibor 'Igor2' Palinkas +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_heptawatt(pin_descent=2.5) +{ + pins=7; + pin_thickness = 0.5; + pin_width = 0.7; + + pin_neck = 3.0; + pin_spacing = 1.27; + + tab_thickness = 1.6; + tab_width = 10.05; + tab_height = 6.81; + tab_overhang = 6.8; + tab_bevel = 0.1; + + device_height = 10; + device_width = 10.05; + body_thickness = 4.8; + body_offset = 3.4; + + hole_dia = 3.75; + hole_height = -4.0; + notch_size = 3.0; + notch_height = 6.0; + + module pin() { + rotate([0,-90,180]) + translate([-pin_thickness/2,0,-pin_width/2]) + linear_extrude(height=pin_width) + scale([0.7553,1.0]) + polygon([[0,0],[0.51,0],[0.51,0.56],[0.54,0.7],[0.6,0.82],[0.71,0.93],[0.84,1.02],[1.0,1.08],[6.26,2.24],[6.64,2.35],[6.86,2.47],[7.01,2.59],[7.11,2.74],[7.15,2.9],[7.15,3+pin_descent],[6.62,3+pin_descent],[6.62,3.29],[6.6,3.14],[6.57,2.99],[6.48,2.87],[6.22,2.76],[6.08,2.72],[0.72,1.55],[0.49,1.45],[0.3,1.34],[0.13,1.21],[0.02,0.99],[0,0.79]]); + } + + module pin2() { + rotate([0,-90,180]) + translate([-pin_thickness/2,0,-pin_width/2]) + linear_extrude(height=pin_width) + polygon([[0,0],[0.5,0],[0.5,3+pin_descent],[0.0,3+pin_descent]]); + } + + module body() { + union() { + color([0.3,0.3,0.3]) { + difference() { + translate([0,hole_height,-body_offset]) + translate([device_width/2,0,0]) + rotate([0,-90,0]) + linear_extrude(height=device_width) + polygon([[0,0],[1.6,0],[4.8,-0.3],[4.8,-9.6],[3.8,-10.0],[1.6,-10.0],[0,-9.7]]); + translate([-device_width/2,hole_height-notch_height,-2]) + cylinder(r=notch_size/2, h=body_thickness*2); + translate([device_width/2,hole_height-notch_height,-2]) + cylinder(r=notch_size/2, h=body_thickness*2); + } + } + color([0.8,0.8,0.8]) + translate([0,hole_height+tab_overhang,-body_offset]) + difference() { + linear_extrude(height=tab_thickness) + polygon([[-tab_width/2,-tab_height],[tab_width/2,-tab_height],[tab_width/2,-tab_bevel],[tab_width/2-tab_bevel,0],[-tab_width/2+tab_bevel,0],[-tab_width/2,-tab_bevel]]); + translate([0,-hole_height-tab_overhang,-body_thickness]) + cylinder(r=hole_dia/2, h=body_thickness*3); + } + } + } + + translate([-3.2,device_width/2-pin_spacing/2-pin_width/2,0]) { + rotate([90,0,90]) { + translate([0,0,0]) { + union() { + color([0.9, 0.9, 0.9]) { + for (index = [0:2:pins-1]) { + translate([(index+0.5)*pin_spacing-device_width/2+pin_width/2,pin_neck+0.05,-pin_thickness/2]) + pin(); + } + for (index = [1:2:pins-1]) { + translate([(index+0.5)*pin_spacing-device_width/2+pin_width/2,pin_neck+0.05,-pin_thickness/2]) + pin2(); + } + } + translate([-0.2,pin_neck+device_height-hole_height,0]) + body(); + } + } + } + } +} + diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/LED3.fp pcb-rnd-3.1.1/footprint/thru-hole/LED3.fp --- pcb-rnd-3.1.0/footprint/thru-hole/LED3.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/LED3.fp 2023-05-07 06:36:47.000000000 +0000 @@ -2,6 +2,8 @@ ha:subc.5 { ha:attributes { footprint = LED3, 3mm LED (pin 1 is +, 2 is -) + openscad = LED.scad + openscad-param = {diameter=3.0} } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/LED5.fp pcb-rnd-3.1.1/footprint/thru-hole/LED5.fp --- pcb-rnd-3.1.0/footprint/thru-hole/LED5.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/LED5.fp 2023-05-07 06:36:47.000000000 +0000 @@ -2,6 +2,8 @@ ha:subc.5 { ha:attributes { footprint = LED5, 5mm LED (pin 1 is +, 2 is -) + openscad = LED.scad + openscad-param = {diameter=5.0} } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/LED.scad pcb-rnd-3.1.1/footprint/thru-hole/LED.scad --- pcb-rnd-3.1.0/footprint/thru-hole/LED.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/LED.scad 2023-05-12 15:45:19.000000000 +0000 @@ -0,0 +1,55 @@ +// Model for round 3mm and 5mm LED through hole package +// +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_led(diameter=3, pin_descent=2.5) +{ + height = 1.65*diameter + 0.35; + union () { + color([1.0,0.1,0.1]) { + translate ([0.0,0.0,height-diameter/2]) + sphere(r = diameter/2); + cylinder(r = diameter/2, h = height-diameter/2); + intersection () { + translate ([-0.45,0,0.5]) + cube ([diameter+0.9, diameter+0.9, 1.0], true); + cylinder(r = (diameter+0.9)/2, h = 1.0); + } + } + color([0.8,0.8,0.8]) { + translate ([-1.252,0,-pin_descent/2]) + cube ([0.5, 0.5, pin_descent], true); + translate ([1.252,0,-pin_descent/2]) + cube ([0.5, 0.5, pin_descent], true); + } + } +} + diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/MULTIWATT11.fp pcb-rnd-3.1.1/footprint/thru-hole/MULTIWATT11.fp --- pcb-rnd-3.1.0/footprint/thru-hole/MULTIWATT11.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/MULTIWATT11.fp 2023-05-08 16:37:51.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = MULTIWATT11 Power IC + openscad = MULTIWATT11.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/MULTIWATT11.scad pcb-rnd-3.1.1/footprint/thru-hole/MULTIWATT11.scad --- pcb-rnd-3.1.0/footprint/thru-hole/MULTIWATT11.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/MULTIWATT11.scad 2023-05-12 15:45:19.000000000 +0000 @@ -0,0 +1,120 @@ +// Model for vertical MULTIWATT11 package +// +// Copyright (C) 2017,2020 Tibor 'Igor2' Palinkas +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_multiwatt11(pin_descent=2.5) +{ + pins=11; + pin_thickness = 0.6; + pin_width = 0.7; + + pin_neck = 3.00; + pin_spacing = 1.7018; + + tab_thickness = 1.6; + tab_width = 19.6; + tab_height = 6.81; + tab_overhang = 6.8; + tab_bevel = 2.3; + + device_height = 10; + device_width = 19.6; + body_thickness = 4.8; + body_offset = 3.4; + + hole_dia = 3.75; + hole_height = -4.0; + notch_size = 3.0; + notch_height = 6.0; + + module pin() { + rotate([0,-90,180]) + translate([-pin_thickness/2,0,-pin_width/2]) + linear_extrude(height=pin_width) + polygon([[0,0],[0.51,0],[0.51,0.56],[0.54,0.7],[0.6,0.82],[0.71,0.93],[0.84,1.02],[1.0,1.08],[6.26,2.24],[6.64,2.35],[6.86,2.47],[7.01,2.59],[7.11,2.74],[7.15,2.9],[7.15,3+pin_descent],[6.62,3+pin_descent],[6.62,3.29],[6.6,3.14],[6.57,2.99],[6.48,2.87],[6.22,2.76],[6.08,2.72],[0.72,1.55],[0.49,1.45],[0.3,1.34],[0.13,1.21],[0.02,0.99],[0,0.79]]); + } + + module pin2() { + rotate([0,-90,180]) + translate([-pin_thickness/2,0,-pin_width/2]) + linear_extrude(height=pin_width) + polygon([[0,0],[0.5,0],[0.5,0.71],[0.51,0.8],[0.54,0.89],[0.61,1.02],[1.70,2.31],[1.84,2.5],[1.92,2.66],[1.95,2.80],[1.96,2.98],[1.97,3.18],[1.97,3+pin_descent],[1.37,3+pin_descent],[1.37,3.4],[1.36,3.2],[1.34,3.01],[1.29,2.85],[1.22,2.68],[1.12,2.52],[1.02,2.38],[0.2,1.4],[0.13,1.26],[0.06,1.10],[0.01,0.96],[0,0.8]]); + } + + module body() { + union() { + color([0.3,0.3,0.3]) { + difference() { + translate([0,hole_height,-body_offset]) + translate([device_width/2,0,0]) + rotate([0,-90,0]) + linear_extrude(height=device_width) + polygon([[0,0],[1.6,0],[4.8,-0.3],[4.8,-9.6],[3.8,-10.0],[1.6,-10.0],[0,-9.7]]); + translate([-device_width/2,hole_height-notch_height,-3]) + cylinder(r=notch_size/2, h=body_thickness*2); + translate([device_width/2,hole_height-notch_height,-3]) + cylinder(r=notch_size/2, h=body_thickness*2); + } + } + color([0.8,0.8,0.8]) + translate([0,hole_height+tab_overhang,-body_offset]) + difference() { + linear_extrude(height=tab_thickness) + polygon([[-tab_width/2,-tab_height],[tab_width/2,-tab_height],[tab_width/2,-tab_bevel],[tab_width/2-tab_bevel,0],[-tab_width/2+tab_bevel,0],[-tab_width/2,-tab_bevel]]); + translate([0,-hole_height-tab_overhang,-body_thickness]) + cylinder(r=hole_dia/2, h=body_thickness*3); + } + } + } + + translate([-3.2,device_width/2-pin_spacing/2-pin_width/2,0]) { + rotate([90,0,90]) { + translate([0,0,0]) { + union() { + color([0.9, 0.9, 0.9]) { + for (index = [0:2:pins-1]) { + translate([(index+0.5)*pin_spacing-device_width/2+pin_width/2,pin_neck+0.05,-pin_thickness/2]) + pin(); + } + for (index = [1:2:pins-1]) { + translate([(index+0.5)*pin_spacing-device_width/2+pin_width/2,pin_neck+0.05,-pin_thickness/2]) + pin2(); + } + } + translate([0,pin_neck+device_height-hole_height,0]) + body(); + } + } + } + } +} + diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/MULTIWATT15.fp pcb-rnd-3.1.1/footprint/thru-hole/MULTIWATT15.fp --- pcb-rnd-3.1.0/footprint/thru-hole/MULTIWATT15.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/MULTIWATT15.fp 2023-05-08 16:37:51.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = MULTIWATT15 Power IC + openscad = MULTIWATT15.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/MULTIWATT15.scad pcb-rnd-3.1.1/footprint/thru-hole/MULTIWATT15.scad --- pcb-rnd-3.1.0/footprint/thru-hole/MULTIWATT15.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/MULTIWATT15.scad 2023-05-12 15:45:19.000000000 +0000 @@ -0,0 +1,120 @@ +// Model for vertical MULTIWATT15 package +// +// Copyright (C) 2017,2020 Tibor 'Igor2' Palinkas +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_multiwatt15(pin_descent=2.5) +{ + pins=15; + pin_thickness = 0.6; + pin_width = 0.7; + + pin_neck = 3.0; + pin_spacing = 1.27; + + tab_thickness = 1.6; + tab_width = 19.6; + tab_height = 6.81; + tab_overhang = 6.8; + tab_bevel = 2.3; + + device_height = 10; + device_width = 19.6; + body_thickness = 4.8; + body_offset = 3.4; + + hole_dia = 3.75; + hole_height = -4.0; + notch_size = 3.0; + notch_height = 6.0; + + module pin() { + rotate([0,-90,180]) + translate([-pin_thickness/2,0,-pin_width/2]) + linear_extrude(height=pin_width) + polygon([[0,0],[0.51,0],[0.51,0.56],[0.54,0.7],[0.6,0.82],[0.71,0.93],[0.84,1.02],[1.0,1.08],[6.26,2.24],[6.64,2.35],[6.86,2.47],[7.01,2.59],[7.11,2.74],[7.15,2.9],[7.15,3+pin_descent],[6.62,3+pin_descent],[6.62,3.29],[6.6,3.14],[6.57,2.99],[6.48,2.87],[6.22,2.76],[6.08,2.72],[0.72,1.55],[0.49,1.45],[0.3,1.34],[0.13,1.21],[0.02,0.99],[0,0.79]]); + } + + module pin2() { + rotate([0,-90,180]) + translate([-pin_thickness/2,0,-pin_width/2]) + linear_extrude(height=pin_width) + polygon([[0,0],[0.5,0],[0.5,0.71],[0.51,0.8],[0.54,0.89],[0.61,1.02],[1.70,2.31],[1.84,2.5],[1.92,2.66],[1.95,2.80],[1.96,2.98],[1.97,3.18],[1.97,3+pin_descent],[1.37,3+pin_descent],[1.37,3.4],[1.36,3.2],[1.34,3.01],[1.29,2.85],[1.22,2.68],[1.12,2.52],[1.02,2.38],[0.2,1.4],[0.13,1.26],[0.06,1.10],[0.01,0.96],[0,0.8]]); + } + + module body() { + union() { + color([0.3,0.3,0.3]) { + difference() { + translate([0,hole_height,-body_offset]) + translate([device_width/2,0,0]) + rotate([0,-90,0]) + linear_extrude(height=device_width) + polygon([[0,0],[1.6,0],[4.8,-0.3],[4.8,-9.6],[3.8,-10.0],[1.6,-10.0],[0,-9.7]]); + translate([-device_width/2,hole_height-notch_height,-3]) + cylinder(r=notch_size/2, h=body_thickness*2); + translate([device_width/2,hole_height-notch_height,-3]) + cylinder(r=notch_size/2, h=body_thickness*2); + } + } + color([0.8,0.8,0.8]) + translate([0,hole_height+tab_overhang,-body_offset]) + difference() { + linear_extrude(height=tab_thickness) + polygon([[-tab_width/2,-tab_height],[tab_width/2,-tab_height],[tab_width/2,-tab_bevel],[tab_width/2-tab_bevel,0],[-tab_width/2+tab_bevel,0],[-tab_width/2,-tab_bevel]]); + translate([0,-hole_height-tab_overhang,-body_thickness]) + cylinder(r=hole_dia/2, h=body_thickness*3); + } + } + } + + translate([-3.2,device_width/2-pin_spacing/2-pin_width/2,0]) { + rotate([90,0,90]) { + translate([0,0,0]) { + union() { + color([0.9, 0.9, 0.9]) { + for (index = [0:2:pins-1]) { + translate([(index+0.5)*pin_spacing-device_width/2+pin_width/2,pin_neck+0.05,-pin_thickness/2]) + pin(); + } + for (index = [1:2:pins-1]) { + translate([(index+0.5)*pin_spacing-device_width/2+pin_width/2,pin_neck+0.05,-pin_thickness/2]) + pin2(); + } + } + translate([0,pin_neck+device_height-hole_height,0]) + body(); + } + } + } + } +} + diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/MULTIWATT8.fp pcb-rnd-3.1.1/footprint/thru-hole/MULTIWATT8.fp --- pcb-rnd-3.1.0/footprint/thru-hole/MULTIWATT8.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/MULTIWATT8.fp 2023-05-08 16:37:51.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = MULTIWATT8 Power IC + openscad = MULTIWATT8.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/MULTIWATT8.scad pcb-rnd-3.1.1/footprint/thru-hole/MULTIWATT8.scad --- pcb-rnd-3.1.0/footprint/thru-hole/MULTIWATT8.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/MULTIWATT8.scad 2023-05-12 15:45:19.000000000 +0000 @@ -0,0 +1,108 @@ +// Model for vertical MULTIWATT8 package +// +// Copyright (C) 2017,2020 Tibor 'Igor2' Palinkas +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_multiwatt8(pin_descent=2.5) +{ + pins=8; + pin_thickness = 0.6; + pin_width1 = 1.32; + pin_width2 = 0.82; + + pin_neck = 3.85; + pin_spacing = 2.54; + + tab_thickness = 1.6; + tab_width = 19.6; + tab_height = 6.81; + tab_overhang = 6.8; + tab_bevel = 2.3; + + device_height = 10; + device_width = 19.6; + body_thickness = 4.8; + body_offset = 3.4; + + hole_dia = 3.75; + hole_height = -4.0; + notch_size = 3.0; + notch_height = 6.0; + + module pin() { + linear_extrude(height=pin_thickness) + polygon([[-pin_width1/2,0],[pin_width1/2,0],[pin_width1/2,pin_width1-pin_width2-pin_neck],[pin_width2/2,-pin_neck],[pin_width2/2,-pin_neck-0.01-pin_descent ],[-pin_width2/2,-pin_neck-0.01-pin_descent],[-pin_width2/2,-pin_neck],[-pin_width1/2,pin_width1-pin_width2-pin_neck]]); + } + + module body() { + union() { + color([0.3,0.3,0.3]) { + difference() { + translate([0,hole_height,-body_offset]) + translate([device_width/2,0,0]) + rotate([0,-90,0]) + linear_extrude(height=device_width) + polygon([[0,0],[1.6,0],[4.8,-0.3],[4.8,-9.6],[3.8,-10.0],[1.6,-10.0],[0,-9.7]]); + translate([-device_width/2,hole_height-notch_height,-3]) + cylinder(r=notch_size/2, h=body_thickness*2); + translate([device_width/2,hole_height-notch_height,-3]) + cylinder(r=notch_size/2, h=body_thickness*2); + } + } + color([0.8,0.8,0.8]) + translate([0,hole_height+tab_overhang,-body_offset]) + difference() { + linear_extrude(height=tab_thickness) + polygon([[-tab_width/2,-tab_height],[tab_width/2,-tab_height],[tab_width/2,-tab_bevel],[tab_width/2-tab_bevel,0],[-tab_width/2+tab_bevel,0],[-tab_width/2,-tab_bevel]]); + translate([0,-hole_height-tab_overhang,-body_thickness]) + cylinder(r=hole_dia/2, h=body_thickness*3); + } + } + } + + translate([-3.2,device_width/2-pin_spacing/2-pin_width2/2,0]) { + rotate([90,0,90]) { + translate([0,0,0]) { + union() { + color([0.9, 0.9, 0.9]) { + for (index = [0:pins-1]) { + translate([(index+0.5)*pin_spacing+-device_width/2+pin_width2/2,pin_neck+0.05,-pin_thickness/2]) + pin(); + } + } + translate([device_width/2-3.55*pin_spacing,pin_neck+device_height-hole_height,0]) + body(); + } + } + } + } +} + diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/OSC14_8.scad pcb-rnd-3.1.1/footprint/thru-hole/OSC14_8.scad --- pcb-rnd-3.1.0/footprint/thru-hole/OSC14_8.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/OSC14_8.scad 2023-05-12 15:45:19.000000000 +0000 @@ -0,0 +1,121 @@ +// Model for OSC8_14 oscillator in a can 8 and 14 variants +// openscad parameter: +// size = 0 OSC14 (default) +// size = 1 OSC8 +// +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_OSC8_14(size=0,pin_descent=2.5) +{ + height = 5.3; + major_diameter = 9.2; + minor_diameter = 8.94; + rim_thickness = 0.56; + pin_diameter = 0.45; + rim_width = 1.0; + major_axis1 = 20.5 - size*7.6; + major_axis2 = major_axis1-rim_width*2; + minor_axis1 = 13.08 - size*0.18; + minor_axis2 = minor_axis1-rim_width*2; + pcb_offset = 0.56; + rounding = 1; + minor_rounding = 0.4; + pin_spacing_x = 2.54*3; + pin_spacing_y = 2.54*(6-size*3); + + // r[adius], h[eight], [rou]n[d] + module rounded_cylinder(r,h,n) { + rotate_extrude(convexity=0.1) { + offset(r=n) offset(delta=-n) square([r,h]); + square([n,h]); + } + } + + union() { + color([0.7,0.7,0.7]) { + translate ([-(minor_axis1-pin_spacing_x)/2,-(major_axis1-pin_spacing_y)/2-pin_spacing_y,pcb_offset]) { + + // main body + translate ([rim_width+rounding, major_axis2+rim_width-rounding,0]) + rounded_cylinder(1, height, minor_rounding); + translate ([minor_axis2+rim_width-rounding, major_axis2+rim_width-rounding,0]) + rounded_cylinder(1, height, minor_rounding); + translate ([minor_axis2+rim_width-rounding, rim_width+rounding,0]) + rounded_cylinder(1, height, minor_rounding); + translate ([rim_width+rounding, rim_width+rounding,0]) + rounded_cylinder(1, height, minor_rounding); + + translate([rim_width,rim_width,0]) + linear_extrude(height=height-minor_rounding) + polygon([[0,major_axis2-rounding],[rounding,major_axis2],[minor_axis2-rounding,major_axis2],[minor_axis2,major_axis2-rounding],[minor_axis2,rounding],[minor_axis2-rounding,0],[rounding,0],[0,rounding]]); + translate ([rim_width, rim_width,0]) + linear_extrude(height=height) + polygon([[minor_rounding,major_axis2-rounding],[rounding,major_axis2-minor_rounding],[minor_axis2-rounding,major_axis2-minor_rounding],[minor_axis2-minor_rounding,major_axis2-rounding],[minor_axis2-minor_rounding,rounding],[minor_axis2-rounding,minor_rounding],[rounding,minor_rounding],[minor_rounding,rounding]]); + + translate ([rim_width+(minor_axis2-minor_rounding), rim_width+rounding,height-minor_rounding]) + rotate([-90,0,0]) + cylinder(r=minor_rounding, h =(major_axis2-2*rounding)); + translate ([rim_width+minor_rounding, rim_width+rounding,height-minor_rounding]) + rotate([-90,0,0]) + cylinder(r=minor_rounding, h =(major_axis2-2*rounding)); + translate ([rim_width+rounding, rim_width+minor_rounding,height-minor_rounding]) + rotate([0,90,0]) + cylinder(r=minor_rounding, h =(minor_axis2-2*rounding)); + translate ([rim_width+rounding, rim_width+(major_axis2-minor_rounding),height-minor_rounding]) + rotate([0,90,0]) + cylinder(r=minor_rounding, h =(minor_axis2-2*rounding)); + + //base plate + translate ([rounding,rounding,0]) + cylinder(r = rounding, h = rim_thickness); + translate ([minor_axis1-rounding,major_axis1-rounding,0]) + cylinder(r = rounding, h = rim_thickness); + translate ([minor_axis1-rounding,rounding,0]) + cylinder(r = rounding, h = rim_thickness); + linear_extrude(height=rim_thickness) + polygon([[0,major_axis1],[minor_axis1-rounding,major_axis1],[minor_axis1,major_axis1-rounding],[minor_axis1,rounding],[minor_axis1-rounding,0],[rounding,0],[0,rounding]]); + + } + + } + color([0.8,0.8,0.8]) { + translate ([0,0,-pin_descent]) + cylinder(r = pin_diameter/2, h = pcb_offset +pin_descent); + translate ([pin_spacing_x,0,-pin_descent]) + cylinder(r = pin_diameter/2, h = pcb_offset + pin_descent); + translate ([pin_spacing_x,-pin_spacing_y,-pin_descent]) + cylinder(r = pin_diameter/2, h = pcb_offset + pin_descent); + translate ([0,-pin_spacing_y,-pin_descent]) + cylinder(r = pin_diameter/2, h = pcb_offset + pin_descent); + } + } +} + diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/OSC14.fp pcb-rnd-3.1.1/footprint/thru-hole/OSC14.fp --- pcb-rnd-3.1.0/footprint/thru-hole/OSC14.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/OSC14.fp 2023-05-07 14:11:13.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = OSC14, Crystal oscillator + openscad = OSC14_8.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/PENTAWATT.fp pcb-rnd-3.1.1/footprint/thru-hole/PENTAWATT.fp --- pcb-rnd-3.1.0/footprint/thru-hole/PENTAWATT.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/PENTAWATT.fp 2023-05-08 17:18:10.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = PENTAWATT Power IC + openscad = PENTAWATT.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/PENTAWATT.scad pcb-rnd-3.1.1/footprint/thru-hole/PENTAWATT.scad --- pcb-rnd-3.1.0/footprint/thru-hole/PENTAWATT.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/PENTAWATT.scad 2023-05-12 15:45:19.000000000 +0000 @@ -0,0 +1,122 @@ +// Model for vertical PENTAWATT package +// +// Copyright (C) 2017,2020 Tibor 'Igor2' Palinkas +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_pentawatt(pin_descent=2.5) +{ + pins=5; + pin_thickness = 0.5; + pin_width = 0.7; + + pin_neck = 3.0; + pin_spacing = 1.7018; + + tab_thickness = 1.6; + tab_width = 10.05; + tab_height = 6.81; + tab_overhang = 6.8; + tab_bevel = 2.3; + + device_height = 10; + device_width = 10.05; + body_thickness = 4.8; + body_offset = 3.4; + + hole_dia = 3.75; + hole_height = -4.0; + notch_size = 3.0; + notch_height = 6.0; + + module pin() { + rotate([0,-90,180]) + translate([-pin_thickness/2,0,-pin_width/2]) + linear_extrude(height=pin_width) + scale([0.921,1.0]) // need 6.1, have 6.62, scale: 0.921 + polygon([[0,0],[0.51,0],[0.51,0.56],[0.54,0.7],[0.6,0.82],[0.71,0.93],[0.84,1.02],[1.0,1.08],[6.26,2.24],[6.64,2.35],[6.86,2.47],[7.01,2.59],[7.11,2.74],[7.15,2.9],[7.15,3+pin_descent],[6.62,3+pin_descent],[6.62,3.29],[6.6,3.14],[6.57,2.99],[6.48,2.87],[6.22,2.76],[6.08,2.72],[0.72,1.55],[0.49,1.45],[0.3,1.34],[0.13,1.21],[0.02,0.99],[0,0.79]]); + } + + module pin2() { + rotate([0,-90,180]) + translate([-pin_thickness/2,0,-pin_width/2]) + scale([1.606,1.0]) // 2.2 -> need to scale: 1.606 + linear_extrude(height=pin_width) + polygon([[0,0],[0.2,0],[0.2,0.71],[0.21,0.8],[0.24,0.89],[0.31,1.02],[1.40,2.31],[1.54,2.5],[1.62,2.66],[1.65,2.80],[1.66,2.98],[1.67,3.18],[1.67,3.0+pin_descent],[1.37,3.0+pin_descent],[1.37,3.4],[1.36,3.2],[1.34,3.01],[1.29,2.85],[1.22,2.68],[1.12,2.52],[1.02,2.38],[0.2,1.4],[0.13,1.26],[0.06,1.10],[0.01,0.96],[0,0.8]]); + } + + module body() { + union() { + color([0.3,0.3,0.3]) { + difference() { + translate([0,hole_height,-body_offset]) + translate([device_width/2,0,0]) + rotate([0,-90,0]) + linear_extrude(height=device_width) + polygon([[0,0],[1.6,0],[4.8,-0.3],[4.8,-9.6],[3.8,-10.0],[1.6,-10.0],[0,-9.7]]); + translate([-device_width/2,hole_height-notch_height,-2]) + cylinder(r=notch_size/2, h=body_thickness*2); + translate([device_width/2,hole_height-notch_height,-2]) + cylinder(r=notch_size/2, h=body_thickness*2); + } + } + color([0.8,0.8,0.8]) + translate([0,hole_height+tab_overhang,-body_offset]) + difference() { + linear_extrude(height=tab_thickness) + polygon([[-tab_width/2,-tab_height],[tab_width/2,-tab_height],[tab_width/2,-(hole_height+tab_overhang)],[tab_width/2-pin_thickness/2,-(hole_height+tab_overhang)],[tab_width/2-pin_thickness/2,0],[-tab_width/2+pin_thickness/2,0],[-tab_width/2+pin_thickness/2,-(hole_height+tab_overhang)],[-tab_width/2,-(hole_height+tab_overhang)]]); + translate([0,-hole_height-tab_overhang,-body_thickness]) + cylinder(r=hole_dia/2, h=body_thickness*3); + } + } + } + + translate([-3.7,device_width/2-pin_spacing/2-pin_width/2,0]) { + rotate([90,0,90]) { + translate([0,0,0]) { + union() { + color([0.9, 0.9, 0.9]) { + for (index = [0:2:pins-1]) { + translate([(index+0.5)*pin_spacing-device_width/2+pin_width/2,pin_neck+0.05,-pin_thickness/2]) + pin(); + } + for (index = [1:2:pins-1]) { + translate([(index+0.5)*pin_spacing-device_width/2+pin_width/2,pin_neck+0.05,-pin_thickness/2]) + pin2(); + } + } + translate([-0.2,pin_neck+device_height-hole_height,pin_width]) + body(); + } + } + } + } +} + diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/TACT_6x6_4p pcb-rnd-3.1.1/footprint/thru-hole/TACT_6x6_4p --- pcb-rnd-3.1.0/footprint/thru-hole/TACT_6x6_4p 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/TACT_6x6_4p 2023-05-09 02:14:52.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint=tactile button + openscad=TACT_6x6_4p.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/TACT_6x6_4p.scad pcb-rnd-3.1.1/footprint/thru-hole/TACT_6x6_4p.scad --- pcb-rnd-3.1.0/footprint/thru-hole/TACT_6x6_4p.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/TACT_6x6_4p.scad 2023-05-12 15:45:19.000000000 +0000 @@ -0,0 +1,95 @@ +// Model for 6x6mm tactile switch +// openscad parameter button_height defaults to 1mm +// +// Copyright (C) 2017,2020 Tibor 'Igor2' Palinkas +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_tact6x6(button_height=1.0) +{ + pin_thickness = 0.3; + pin_width = 0.7; + pin_spacing = 4.5; + + body_width = 6; + body_thickness = 3.5; + plate_thickness = 0.3; + + button_dia = 3.0; + dimple_size = 1.0; + dimple_height = 0.3; + dimple_spacing = 4.5; + + module pin() { + rotate([90,0,0]) + translate([-pin_thickness/2,1.2,-pin_width/2]) + linear_extrude(height=pin_width) + polygon([[0,0],[0.3,0],[0.3,-1.8],[0.6,-3.0],[0.3,-4.2],[0.3,-4.7],[0.15,-5.0],[0,-4.7],[0,-4.2],[0.3,-3.0],[0,-1.8]]); + } + + module body() { + union() { + color([0.9, 0.9, 0.9]) + translate([0,0,body_thickness-plate_thickness/2]) + cube([body_width,body_width,plate_thickness], true); + color([0.1,0.1,0.1]) { + translate([0,0,(body_thickness-plate_thickness)/2]) + cube([body_width,body_width,body_thickness-plate_thickness], true); + translate([0,0,body_thickness]) + cylinder(r=button_dia/2, h=button_height); + translate([dimple_spacing/2,dimple_spacing/2,body_thickness]) + cylinder(r=dimple_size/2, h=dimple_height); + translate([-dimple_spacing/2,dimple_spacing/2,body_thickness]) + cylinder(r=dimple_size/2, h=dimple_height); + translate([-dimple_spacing/2,-dimple_spacing/2,body_thickness]) + cylinder(r=dimple_size/2, h=dimple_height); + translate([dimple_spacing/2,-dimple_spacing/2,body_thickness]) + cylinder(r=dimple_size/2, h=dimple_height); + } + } + } + + union() { + body(); + color([0.9, 0.9, 0.9]) { + translate([body_width/2+pin_thickness/2,pin_spacing/2,0]) + pin(); + translate([body_width/2+pin_thickness/2,-pin_spacing/2,0]) + pin(); + translate([-body_width/2-pin_thickness/2,pin_spacing/2,0]) + rotate([0,0,180]) + pin(); + translate([-body_width/2-pin_thickness/2,-pin_spacing/2,0]) + rotate([0,0,180]) + pin(); + } + } +} + diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/TO126.fp pcb-rnd-3.1.1/footprint/thru-hole/TO126.fp --- pcb-rnd-3.1.0/footprint/thru-hole/TO126.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/TO126.fp 2023-05-08 07:13:33.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = TO126 Transistor + openscad = TO126.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/TO126.scad pcb-rnd-3.1.1/footprint/thru-hole/TO126.scad --- pcb-rnd-3.1.0/footprint/thru-hole/TO126.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/TO126.scad 2023-05-12 15:45:19.000000000 +0000 @@ -0,0 +1,120 @@ +// Model for horizontal TO126 package and S offset middle pin variant +// +// Copyright (C) 2017,2020 Tibor 'Igor2' Palinkas +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_to126(pins=3,S=0,pin_descent=2.5) +{ + pin_thickness = 0.5; + pin_width1 = 1.2; + pin_width2 = 0.8; + pin_neck = 2.1; + pin_spacing = 2.28; + + tab_thickness = 1.3; + tab_width = 5.2; + tab_height = 8; + tab_r = 0.76; + tab_hole_height = 3.0; + + hole_dia = 3.4; + hole_height = 3.6; + notch_width = 0.8; + + device_height = 11.2; + device_width = 8.2; + body_thickness = 2.8; + body_offset = body_thickness/2; + + module downbent_pin(S=0) { + pin_descent2 = pin_descent + body_offset-1.02; + union() { + linear_extrude(height=pin_thickness) + polygon([[-pin_width1/2,0],[pin_width1/2,0],[pin_width1/2,pin_width1-pin_width2-pin_neck],[pin_width2/2,-pin_neck],[pin_width2/2,-pin_neck-0.01-S*2.54],[-pin_width2/2,-pin_neck-0.01-S*2.54],[-pin_width2/2,-pin_neck],[-pin_width1/2,pin_width1-pin_width2-pin_neck]]); + translate([0,-pin_neck-S*2.54,-(1.02-pin_thickness/2)]) + rotate([0,-90,0]) + rotate_extrude(angle=-90) + polygon([[1.02-pin_thickness/2,pin_width2/2],[1.02-pin_thickness/2,-pin_width2/2],[1.02+pin_thickness/2,-pin_width2/2],[1.02+pin_thickness/2,pin_width2/2]]); + translate([0,-pin_neck-1.02-pin_thickness/2-S*2.54,pin_thickness/2-1.02-pin_descent2]) + linear_extrude(height=pin_descent2) + polygon([[-pin_width2/2, pin_thickness],[pin_width2/2,pin_thickness],[pin_width2/2, 0],[-pin_width2/2, 0]]); + } + } + + module body() { + union() { + color([0.3,0.3,0.3]) + difference() { + translate([0,hole_height,-body_offset]) + linear_extrude(height=body_thickness) + polygon([[-device_width/2,-device_height],[device_width/2,-device_height],[device_width/2,0],[-device_width/2,0]]); + translate([0,0,-body_thickness]) + cylinder(r=hole_dia/2, h=body_thickness*3); + rotate([0,0,120]) + translate([-notch_width/2,hole_dia/2-0.1,body_thickness/2-notch_width+0.01]) + cube(notch_width, false); + rotate([0,0,-120]) + translate([-notch_width/2,hole_dia/2-0.1,body_thickness/2-notch_width+0.01]) + cube(notch_width, false); + translate([-notch_width/2,hole_dia/2-0.1,body_thickness/2-notch_width+0.01]) + cube(notch_width, false); + } + difference() { + color([0.8,0.8,0.8]) + translate([0,tab_hole_height,-body_thickness/2-0.01]) + linear_extrude(height=body_thickness/2) + polygon([[-tab_width/2,-tab_height],[tab_width/2,-tab_height],[tab_width/2,0],[-tab_width/2,0]]); + translate([0,0,-body_thickness]) + cylinder(r=hole_dia/2+0.05, h=body_thickness*3); + } + } + } + + translate([-1.02,2.54,body_offset]) { + rotate([0,0,90]) { + union() { + color([0.9, 0.9, 0.9]) { + if (pins==3) { + translate([0,pin_neck+0.05,-pin_thickness/2]) + downbent_pin(S); + } + translate([-pin_spacing,pin_neck+0.05,-pin_thickness/2]) + downbent_pin(); + translate([pin_spacing,pin_neck+0.05,-pin_thickness/2]) + downbent_pin(); + } + translate([0,pin_neck+device_height-hole_height,0]) + body(); + } + } + } +} + diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/TO126S.fp pcb-rnd-3.1.1/footprint/thru-hole/TO126S.fp --- pcb-rnd-3.1.0/footprint/thru-hole/TO126S.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/TO126S.fp 2023-05-08 07:13:33.000000000 +0000 @@ -2,6 +2,8 @@ ha:subc.5 { ha:attributes { footprint = TO126S Transistor + openscad = TO126.scad + openscad-param = {S=1} } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/TO126SW.fp pcb-rnd-3.1.1/footprint/thru-hole/TO126SW.fp --- pcb-rnd-3.1.0/footprint/thru-hole/TO126SW.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/TO126SW.fp 2023-05-08 09:46:55.000000000 +0000 @@ -2,6 +2,8 @@ ha:subc.5 { ha:attributes { footprint = TO126SW Transistor + openscad = TO126W.scad + openscad-param = {S=1} } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/TO126W.fp pcb-rnd-3.1.1/footprint/thru-hole/TO126W.fp --- pcb-rnd-3.1.0/footprint/thru-hole/TO126W.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/TO126W.fp 2023-05-08 09:46:55.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = TO126W Transistor + openscad = TO126W.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/TO126W.scad pcb-rnd-3.1.1/footprint/thru-hole/TO126W.scad --- pcb-rnd-3.1.0/footprint/thru-hole/TO126W.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/TO126W.scad 2023-05-12 15:45:19.000000000 +0000 @@ -0,0 +1,120 @@ +// Model for vertical TO126 package and S offset middle pin variant +// +// Copyright (C) 2017,2020 Tibor 'Igor2' Palinkas +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_to126w(pins=3, S=0, pin_descent=2.5) +{ + pin_thickness = 0.5; + pin_width1 = 1.2; + pin_width2 = 0.8; + pin_neck = 2.1; + pin_spacing = 2.28; + + tab_thickness = 1.3; + tab_width = 5.2; + tab_height = 8; + tab_r = 0.76; + tab_hole_height = 3.0; + + hole_dia = 3.4; + hole_height = 3.6; + notch_width = 0.8; + + device_height = 11.2; + device_width = 8.2; + body_thickness = 2.8; + body_offset = body_thickness/2; + + module pin(S=0) { + pin_descent2 = (1-S)*pin_descent + S*1.717; + rotate([S*(-45),0,0]) { + union() { + linear_extrude(height=pin_thickness) + polygon([[-pin_width1/2,0],[pin_width1/2,0],[pin_width1/2,pin_width1-pin_width2-pin_neck],[pin_width2/2,-pin_neck],[pin_width2/2,-pin_neck-0.01-pin_descent2],[-pin_width2/2,-pin_neck-0.01-pin_descent2],[-pin_width2/2,-pin_neck],[-pin_width1/2,pin_width1-pin_width2-pin_neck]]); + } + } + if (S==1) { + translate([0,-2.1,2.56]) { + linear_extrude(height=pin_thickness) + polygon([[-pin_width2/2,-0.253],[pin_width2/2,-0.253],[pin_width2/2,-2.5],[-pin_width2/2,-2.5]]); + } + } + } + + module body() { + union() { + color([0.3,0.3,0.3]) + difference() { + translate([0,hole_height,-body_offset]) + linear_extrude(height=body_thickness) + polygon([[-device_width/2,-device_height],[device_width/2,-device_height],[device_width/2,0],[-device_width/2,0]]); + translate([0,0,-body_thickness]) + cylinder(r=hole_dia/2, h=body_thickness*3); + rotate([0,0,120]) + translate([-notch_width/2,hole_dia/2-0.1,body_thickness/2-notch_width+0.01]) + cube(notch_width, false); + rotate([0,0,-120]) + translate([-notch_width/2,hole_dia/2-0.1,body_thickness/2-notch_width+0.01]) + cube(notch_width, false); + translate([-notch_width/2,hole_dia/2-0.1,body_thickness/2-notch_width+0.01]) + cube(notch_width, false); + } + difference() { + color([0.8,0.8,0.8]) + translate([0,tab_hole_height,-body_thickness/2-0.01]) + linear_extrude(height=body_thickness/2) + polygon([[-tab_width/2,-tab_height],[tab_width/2,-tab_height],[tab_width/2,0],[-tab_width/2,0]]); + translate([0,0,-body_thickness]) + cylinder(r=hole_dia/2+0.05, h=body_thickness*3); + } + } + } + + translate([S*2.56,(1-S)*2.56,S*0.2]) { + rotate([90,0,(1-S)*90]) { + union() { + color([0.9, 0.9, 0.9]) { + if (pins==3) { + translate([0,pin_neck+0.05,-pin_thickness/2]) + pin(S); + } + translate([-pin_spacing,pin_neck+0.05,-pin_thickness/2]) + pin(); + translate([pin_spacing,pin_neck+0.05,-pin_thickness/2]) + pin(); + } + translate([0,pin_neck+device_height-hole_height,0]) + body(); + } + } + } +} diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/TO18.fp pcb-rnd-3.1.1/footprint/thru-hole/TO18.fp --- pcb-rnd-3.1.0/footprint/thru-hole/TO18.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/TO18.fp 2023-05-07 08:31:30.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = TO18 Transistor + openscad = TO18.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/TO18.scad pcb-rnd-3.1.1/footprint/thru-hole/TO18.scad --- pcb-rnd-3.1.0/footprint/thru-hole/TO18.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/TO18.scad 2023-05-12 15:45:19.000000000 +0000 @@ -0,0 +1,71 @@ +// Model for TO18 through hole package +// +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_to18(pin_descent=2.5) +{ + height = 4.83; + major_diameter = 5.6; + minor_diameter = 4.7; + rim_thickness = 0.5; + tab_square = 1.0; + pin_diameter = 0.45; + pcb_offset = 3.0; + + // r[adius], h[eight], [rou]n[d] + module rounded_cylinder(r,h,n) { + rotate_extrude(convexity=1) { + offset(r=n) offset(delta=-n) square([r,h]); + square([n,h]); + } + } + + union() { + color([0.7,0.7,0.7]) { + translate ([0,0,pcb_offset]) { + rounded_cylinder(minor_diameter/2,height,0.5); + rotate([0,0,135]) + translate([-tab_square/2,0,rim_thickness/2]) + cube ([major_diameter+tab_square, tab_square, rim_thickness], true); + cylinder(r = major_diameter/2, h = rim_thickness); + } + } + color([0.8,0.8,0.8]) { + translate ([-1.27,0,-pin_descent]) + cylinder(r = pin_diameter/2, h = pcb_offset +pin_descent); + translate ([0,1.27,-pin_descent]) + cylinder(r = pin_diameter/2, h = pcb_offset + pin_descent); + translate ([1.27,0,-pin_descent]) + cylinder(r = pin_diameter/2, h = pcb_offset + pin_descent); + } + } +} + diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/TO220ACSTAND.fp pcb-rnd-3.1.1/footprint/thru-hole/TO220ACSTAND.fp --- pcb-rnd-3.1.0/footprint/thru-hole/TO220ACSTAND.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/TO220ACSTAND.fp 2023-05-07 17:49:03.000000000 +0000 @@ -2,6 +2,8 @@ ha:subc.5 { ha:attributes { footprint = TO220ACSTAND diode in TO220 + openscad = TO220W.scad + openscad-param = {pins=2} } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/TO220.fp pcb-rnd-3.1.1/footprint/thru-hole/TO220.fp --- pcb-rnd-3.1.0/footprint/thru-hole/TO220.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/TO220.fp 2023-05-08 05:58:25.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = TO220 Transistor + openscad = TO220.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/TO220.scad pcb-rnd-3.1.1/footprint/thru-hole/TO220.scad --- pcb-rnd-3.1.0/footprint/thru-hole/TO220.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/TO220.scad 2023-05-12 15:45:19.000000000 +0000 @@ -0,0 +1,130 @@ +// Model for horizontal TO220 package and S offset middle pin variant +// +// Copyright (C) 2017,2020 Tibor 'Igor2' Palinkas +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_to220(pins=3, S=0, pin_descent=2.5) +{ + pin_thickness = 0.5; + pin_width1 = 1.45; + pin_width2 = 0.85; + pin_neck = 3.55; + + tab_thickness = 1.3; + tab_width1 = 10.3; + tab_width2 = 7.88; + tab_neck = 6.3; + tab_length = 12.3; + + hole_dia = 4.25; + hole_height = 2.8; + notch_radius = 0.76; + + device_height = 15.1; + body_thickness = 4.45; + chamfer = 0.5; + body_offset = 2.76; + + module downbent_pin(S=0) { + pin_descent2 = pin_descent+2.0; + union() { + linear_extrude(height=pin_thickness) + polygon([[-pin_width1/2,0],[pin_width1/2,0],[pin_width1/2,pin_width1-pin_width2-pin_neck],[pin_width2/2,-pin_neck],[pin_width2/2,-pin_neck-0.01-S*2.54],[-pin_width2/2,-pin_neck-0.01-S*2.54],[-pin_width2/2,-pin_neck],[-pin_width1/2,pin_width1-pin_width2-pin_neck]]); + translate([0,-pin_neck-S*2.54,-(1.02-pin_thickness/2)]) + rotate([0,-90,0]) + rotate_extrude(angle=-90) + polygon([[1.02-pin_thickness/2,pin_width2/2],[1.02-pin_thickness/2,-pin_width2/2],[1.02+pin_thickness/2,-pin_width2/2],[1.02+pin_thickness/2,pin_width2/2]]); + translate([0,-pin_neck-1.02-pin_thickness/2-S*2.54,pin_thickness/2-1.02-pin_descent2]) + linear_extrude(height=pin_descent2) + polygon([[-pin_width2/2, pin_thickness],[pin_width2/2,pin_thickness],[pin_width2/2, 0],[-pin_width2/2, 0]]); + } + } + + module tab() { + difference() { + linear_extrude(height=tab_thickness) + polygon([[-tab_width1/2,0],[tab_width1/2,0],[tab_width1/2,-tab_neck],[tab_width2/2,-tab_neck],[tab_width2/2,-tab_length],[-tab_width2/2,-tab_length],[-tab_width2/2,-tab_neck],[-tab_width1/2,-tab_neck]]); + translate([0,-hole_height,-1*tab_thickness]) + cylinder(r=hole_dia/2,h=tab_thickness*3); + translate([-tab_width1/2,notch_radius-hole_height,-tab_thickness]) + cylinder(r=notch_radius,h=tab_thickness*3); + translate([tab_width1/2,notch_radius-hole_height,-tab_thickness]) + cylinder(r=notch_radius,h=tab_thickness*3); + } + } + + module body() { + body_points = [ + [-tab_width1/2,device_height-tab_neck,0], // 0 + [-tab_width1/2,0,0], // 1 + [tab_width1/2,0,0], // 2 + [tab_width1/2,device_height-tab_neck,0], // 3 + + [-tab_width1/2+chamfer,device_height-tab_neck-chamfer,body_thickness], // 4 + [-tab_width1/2+chamfer,0,body_thickness], // 5 + [tab_width1/2-chamfer,0,body_thickness], // 6 + [tab_width1/2-chamfer,device_height-tab_neck-chamfer,body_thickness]];// 7 + + body_faces = [ + [0,1,2,3], // 0 + [4,5,1,0], // 1 + [7,6,5,4], // 2 + [5,6,2,1], // 3 + [6,7,3,2], // 4 + [7,4,0,3]];// 5 + + translate([0,0,0.05]) + polyhedron(body_points, body_faces); + } + translate([-1.02,0,body_offset+pin_thickness/2]) { + rotate([0,0,90]) { + union() { + color([0.9, 0.9, 0.9]) { + if (pins==3) { + translate([0,pin_neck+0.05,-pin_thickness/2]) + downbent_pin(S); + } + translate([-2.54,pin_neck+0.05,-pin_thickness/2]) + downbent_pin(); + translate([2.54,pin_neck+0.05,-pin_thickness/2]) + downbent_pin(); + translate([0,pin_neck + device_height,-body_offset-pin_thickness/2]) + tab(); + } + color([0.1, 0.1, 0.1]) { + translate([0,pin_neck,-body_offset-pin_thickness/2]) + body(); + } + } + } + } +} + diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/TO220S.fp pcb-rnd-3.1.1/footprint/thru-hole/TO220S.fp --- pcb-rnd-3.1.0/footprint/thru-hole/TO220S.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/TO220S.fp 2023-05-08 05:58:25.000000000 +0000 @@ -2,6 +2,8 @@ ha:subc.5 { ha:attributes { footprint = TO220S Transistor + openscad = TO220.scad + openscad-param = {S=1} } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/TO220SW.fp pcb-rnd-3.1.1/footprint/thru-hole/TO220SW.fp --- pcb-rnd-3.1.0/footprint/thru-hole/TO220SW.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/TO220SW.fp 2023-05-07 18:23:43.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = TO220SW Transistor + openscad = TO220SW.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/TO220SW.scad pcb-rnd-3.1.1/footprint/thru-hole/TO220SW.scad --- pcb-rnd-3.1.0/footprint/thru-hole/TO220SW.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/TO220SW.scad 2023-05-12 15:45:19.000000000 +0000 @@ -0,0 +1,129 @@ +// Model for TO220SW package +// +// Copyright (C) 2017,2020 Tibor 'Igor2' Palinkas +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_to220sw(pin_descent=2.5) +{ + pin_thickness = 0.5; + pin_width1 = 1.45; + pin_width2 = 0.85; + pin_neck = 3.55; + + tab_thickness = 1.3; + tab_width1 = 10.3; + tab_width2 = 7.88; + tab_neck = 6.3; + tab_length = 12.3; + + hole_dia = 4.25; + hole_height = 2.8; + notch_radius = 0.76; + + device_height = 15.1; + body_thickness = 4.45; + chamfer = 0.5; + body_offset = 2.76; + + module pin() { + linear_extrude(height=pin_thickness) + polygon([[-pin_width1/2,0],[pin_width1/2,0],[pin_width1/2,pin_width1-pin_width2-pin_neck],[pin_width2/2,-pin_neck],[pin_width2/2,-pin_neck-pin_descent],[-pin_width2/2,-pin_neck-pin_descent],[-pin_width2/2,-pin_neck],[-pin_width1/2,pin_width1-pin_width2-pin_neck]]); + } + + module bent_pin() { + union () { + rotate([-45,0,0]) + linear_extrude(height=pin_thickness) + polygon([[-pin_width1/2,0],[pin_width1/2,0],[pin_width1/2,pin_width1-pin_width2-pin_neck],[pin_width2/2,-pin_neck],[pin_width2/2,-pin_neck-0.25],[-pin_width2/2,-pin_neck-0.25], + [-pin_width2/2,-pin_neck],[-pin_width1/2,pin_width1-pin_width2-pin_neck]]); + translate([-pin_width2/2,-3.54-pin_descent,2.54]) + cube([pin_width2,1.196+pin_descent,pin_thickness],false); + } + } + + module tab() { + difference() { + linear_extrude(height=tab_thickness) + polygon([[-tab_width1/2,0],[tab_width1/2,0],[tab_width1/2,-tab_neck],[tab_width2/2,-tab_neck],[tab_width2/2,-tab_length],[-tab_width2/2,-tab_length],[-tab_width2/2,-tab_neck],[-tab_width1/2,-tab_neck]]); + translate([0,-hole_height,-1*tab_thickness]) + cylinder(r=hole_dia/2,h=tab_thickness*3); + translate([-tab_width1/2,notch_radius-hole_height,-tab_thickness]) + cylinder(r=notch_radius,h=tab_thickness*3); + translate([tab_width1/2,notch_radius-hole_height,-tab_thickness]) + cylinder(r=notch_radius,h=tab_thickness*3); + } + } + + module body() { + body_points = [ + [-tab_width1/2,device_height-tab_neck,0], // 0 + [-tab_width1/2,0,0], // 1 + [tab_width1/2,0,0], // 2 + [tab_width1/2,device_height-tab_neck,0], // 3 + + [-tab_width1/2+chamfer,device_height-tab_neck-chamfer,body_thickness], // 4 + [-tab_width1/2+chamfer,0,body_thickness], // 5 + [tab_width1/2-chamfer,0,body_thickness], // 6 + [tab_width1/2-chamfer,device_height-tab_neck-chamfer,body_thickness]];// 7 + + body_faces = [ + [0,1,2,3], // 0 + [4,5,1,0], // 1 + [7,6,5,4], // 2 + [5,6,2,1], // 3 + [6,7,3,2], // 4 + [7,4,0,3]];// 5 + + translate([0,0,0.05]) + polyhedron(body_points, body_faces); + } + translate([2.54,0,0]) { + rotate([90,0,0]) { + union() { + color([0.9, 0.9, 0.9]) { + translate([0,pin_neck+0.05,-pin_thickness/2]) + bent_pin(); + translate([-2.54,pin_neck+0.05,-pin_thickness/2]) + pin(); + translate([2.54,pin_neck+0.05,-pin_thickness/2]) + pin(); + translate([0,pin_neck + device_height,-body_offset-pin_thickness/2]) + tab(); + } + color([0.1, 0.1, 0.1]) { + translate([0,pin_neck,-body_offset-pin_thickness/2]) + body(); + } + } + } + } +} + diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/TO220W.fp pcb-rnd-3.1.1/footprint/thru-hole/TO220W.fp --- pcb-rnd-3.1.0/footprint/thru-hole/TO220W.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/TO220W.fp 2023-05-07 17:23:51.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = TO220W Transistor + openscad = TO220W.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/TO220W.scad pcb-rnd-3.1.1/footprint/thru-hole/TO220W.scad --- pcb-rnd-3.1.0/footprint/thru-hole/TO220W.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/TO220W.scad 2023-05-12 15:45:19.000000000 +0000 @@ -0,0 +1,120 @@ +// Model for TO220W package +// +// Copyright (C) 2017,2020 Tibor 'Igor2' Palinkas +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_to220w(pins=3,pin_descent=2.5) +{ + pin_thickness = 0.5; + pin_width1 = 1.45; + pin_width2 = 0.85; + pin_neck = 3.55; + + tab_thickness = 1.3; + tab_width1 = 10.3; + tab_width2 = 7.88; + tab_neck = 6.3; + tab_length = 12.3; + + hole_dia = 4.25; + hole_height = 2.8; + notch_radius = 0.76; + + device_height = 15.1; + body_thickness = 4.45; + chamfer = 0.5; + body_offset = 2.76; + + module pin() { + linear_extrude(height=pin_thickness) + polygon([[-pin_width1/2,0],[pin_width1/2,0],[pin_width1/2,pin_width1-pin_width2-pin_neck],[pin_width2/2,-pin_neck],[pin_width2/2,-pin_neck-pin_descent],[-pin_width2/2,-pin_neck-pin_descent],[-pin_width2/2,-pin_neck],[-pin_width1/2,pin_width1-pin_width2-pin_neck]]); + } + + module tab() { + difference() { + linear_extrude(height=tab_thickness) + polygon([[-tab_width1/2,0],[tab_width1/2,0],[tab_width1/2,-tab_neck],[tab_width2/2,-tab_neck],[tab_width2/2,-tab_length],[-tab_width2/2,-tab_length],[-tab_width2/2,-tab_neck],[-tab_width1/2,-tab_neck]]); + translate([0,-hole_height,-1*tab_thickness]) + cylinder(r=hole_dia/2,h=tab_thickness*3); + translate([-tab_width1/2,notch_radius-hole_height,-tab_thickness]) + cylinder(r=notch_radius,h=tab_thickness*3); + translate([tab_width1/2,notch_radius-hole_height,-tab_thickness]) + cylinder(r=notch_radius,h=tab_thickness*3); + } + } + + module body() { + body_points = [ + [-tab_width1/2,device_height-tab_neck,0], // 0 + [-tab_width1/2,0,0], // 1 + [tab_width1/2,0,0], // 2 + [tab_width1/2,device_height-tab_neck,0], // 3 + + [-tab_width1/2+chamfer,device_height-tab_neck-chamfer,body_thickness], // 4 + [-tab_width1/2+chamfer,0,body_thickness], // 5 + [tab_width1/2-chamfer,0,body_thickness], // 6 + [tab_width1/2-chamfer,device_height-tab_neck-chamfer,body_thickness]];// 7 + + body_faces = [ + [0,1,2,3], // 0 + [4,5,1,0], // 1 + [7,6,5,4], // 2 + [5,6,2,1], // 3 + [6,7,3,2], // 4 + [7,4,0,3]];// 5 + + translate([0,0,0.05]) + polyhedron(body_points, body_faces); + } + translate([(3-pins)*2.54,2.54+(3-pins)*pin_thickness,0]) { + rotate([90,0,(pins-2)*90]) { + union() { + color([0.9, 0.9, 0.9]) { + if (pins==3) { + translate([0,pin_neck+0.05,-pin_thickness/2]) + pin(); + } + translate([-2.54,pin_neck+0.05,-pin_thickness/2]) + pin(); + translate([2.54,pin_neck+0.05,-pin_thickness/2]) + pin(); + translate([0,pin_neck + device_height,-body_offset-pin_thickness/2]) + tab(); + } + color([0.1, 0.1, 0.1]) { + translate([0,pin_neck,-body_offset-pin_thickness/2]) + body(); + } + } + } + } +} + diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/TO247_2.fp pcb-rnd-3.1.1/footprint/thru-hole/TO247_2.fp --- pcb-rnd-3.1.0/footprint/thru-hole/TO247_2.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/TO247_2.fp 2023-05-08 13:58:58.000000000 +0000 @@ -2,6 +2,8 @@ ha:subc.5 { ha:attributes { footprint = TO247_2 diode in TO220 + openscad = TO247.scad + openscad-param = {pins=2} } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/TO247.fp pcb-rnd-3.1.1/footprint/thru-hole/TO247.fp --- pcb-rnd-3.1.0/footprint/thru-hole/TO247.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/TO247.fp 2023-05-08 13:58:58.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = TO247 diode in TO220 + openscad = TO247.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/TO247.scad pcb-rnd-3.1.1/footprint/thru-hole/TO247.scad --- pcb-rnd-3.1.0/footprint/thru-hole/TO247.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/TO247.scad 2023-05-12 15:45:19.000000000 +0000 @@ -0,0 +1,110 @@ +// Model for vertical TO247 package 2 and 3 pin variants +// +// Copyright (C) 2017,2020 Tibor 'Igor2' Palinkas +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_to247(pins=3,pin_descent=2.5) +{ + pin_thickness = 0.6; + pin_width1 = 2.0; + pin_width2 = 1.2; + pin_neck = 4.2; + pin_spacing = 5.56; + + tab_thickness = 0.5; + tab_width = 13.9; + tab_height = 17.3; + tab_overhang = -1.2; + tab_bevel = 2.0; + + device_height = 21; + device_width = 16; + body_thickness = 5; + body_offset = body_thickness/2; + + hole_dia = 3.6; + hole_height = 6.1; + notch_size = 5.0; + notch_height = 5.6; + + module pin() { + linear_extrude(height=pin_thickness) + polygon([[-pin_width1/2,0],[pin_width1/2,0],[pin_width1/2,pin_width1-pin_width2-pin_neck],[pin_width2/2,-pin_neck],[pin_width2/2,-pin_neck-0.01-pin_descent ],[-pin_width2/2,-pin_neck-0.01-pin_descent],[-pin_width2/2,-pin_neck],[-pin_width1/2,pin_width1-pin_width2-pin_neck]]); + } + + module body() { + union() { + color([0.3,0.3,0.3]) { + difference() { + translate([0,hole_height,-body_offset]) + linear_extrude(height=body_thickness) + polygon([[-device_width/2,-device_height],[device_width/2,-device_height],[device_width/2,0],[-device_width/2,0]]); + translate([0,0,-body_thickness]) + cylinder(r=hole_dia/2, h=body_thickness*3); + translate([-device_width/2,hole_height-notch_height,body_thickness/2]) + cube(notch_size, true); + translate([device_width/2,hole_height-notch_height,body_thickness/2]) + cube(notch_size, true); + } + } + color([0.8,0.8,0.8]) + translate([0,hole_height+tab_overhang,-body_thickness/2-0.01]) + difference() { + linear_extrude(height=tab_thickness) + polygon([[-tab_width/2,-tab_height],[tab_width/2,-tab_height],[tab_width/2,-tab_bevel],[tab_width/2-tab_bevel,0],[-tab_width/2+tab_bevel,0],[-tab_width/2,-tab_bevel]]); + translate([0,-hole_height-tab_overhang,-body_thickness]) + cylinder(r=hole_dia, h=body_thickness*3); + } + } + } + + translate([-(pins-2)*3.556,(3-pins)*3.556,0]) { + rotate([90,0,(pins-2)*90]) { + translate([pin_spacing,0,0]) { + union() { + color([0.9, 0.9, 0.9]) { + if (pins==3) { + translate([0,pin_neck+0.05,-pin_thickness/2]) + pin(); + } + translate([-pin_spacing,pin_neck+0.05,-pin_thickness/2]) + pin(); + translate([pin_spacing,pin_neck+0.05,-pin_thickness/2]) + pin(); + } + translate([0,pin_neck+device_height-hole_height,0]) + body(); + } + } + } + } +} + diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/TO251.fp pcb-rnd-3.1.1/footprint/thru-hole/TO251.fp --- pcb-rnd-3.1.0/footprint/thru-hole/TO251.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/TO251.fp 2023-05-08 11:10:38.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = TO251 diode in TO220 + openscad = TO251.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/TO251.scad pcb-rnd-3.1.1/footprint/thru-hole/TO251.scad --- pcb-rnd-3.1.0/footprint/thru-hole/TO251.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/TO251.scad 2023-05-12 15:45:19.000000000 +0000 @@ -0,0 +1,98 @@ +// Model for vertical TO251 package 2 and 3 pin variants +// +// Copyright (C) 2017,2020 Tibor 'Igor2' Palinkas +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_to251(pins=3,pin_descent=2.5) +{ + pin_thickness = 0.5; + pin_width1 = 1.0; + pin_width2 = 0.74; + pin_neck = 1.7; + pin_spacing = 2.29; + + tab_thickness = 0.5; + tab_width = 5.3; + tab_height = 5.2; + tab_overhang = 1.1; + tab_bevel = 0.6; + + device_height = 6.1; + device_width = 6.6; + body_thickness = 2.4; + body_offset = body_thickness/2; + + dimple_dia = 1.2; + hole_height = device_height/2; + + module pin() { + linear_extrude(height=pin_thickness) + polygon([[-pin_width1/2,0],[pin_width1/2,0],[pin_width1/2,pin_width1-pin_width2-pin_neck],[pin_width2/2,-pin_neck],[pin_width2/2,-pin_neck-0.01-pin_descent ],[-pin_width2/2,-pin_neck-0.01-pin_descent],[-pin_width2/2,-pin_neck],[-pin_width1/2,pin_width1-pin_width2-pin_neck]]); + } + + module body() { + union() { + color([0.3,0.3,0.3]) { + difference() { + translate([0,hole_height,-body_offset]) + linear_extrude(height=body_thickness) + polygon([[-device_width/2,-device_height],[device_width/2,-device_height],[device_width/2,0],[-device_width/2,0]]); + translate([0,0,body_thickness/2-0.2]) + cylinder(r=dimple_dia, h=1); + } + } + color([0.8,0.8,0.8]) + translate([0,device_height-tab_height/2+tab_overhang,-body_thickness/2-0.01]) + linear_extrude(height=tab_thickness) + polygon([[-tab_width/2,-tab_height],[tab_width/2,-tab_height],[tab_width/2,-tab_bevel],[tab_width/2-tab_bevel,0],[-tab_width/2+tab_bevel,0],[-tab_width/2,-tab_bevel]]); + } + } + + translate([-pin_spacing,pin_spacing,0]) { + rotate([90,0,90]) { + union() { + color([0.9, 0.9, 0.9]) { + if (pins==3) { + translate([0,pin_neck+0.05,-pin_thickness/2]) + pin(); + } + translate([-pin_spacing,pin_neck+0.05,-pin_thickness/2]) + pin(); + translate([pin_spacing,pin_neck+0.05,-pin_thickness/2]) + pin(); + } + translate([0,pin_neck+device_height-hole_height,0]) + body(); + } + } + } +} + diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/TO264.fp pcb-rnd-3.1.1/footprint/thru-hole/TO264.fp --- pcb-rnd-3.1.0/footprint/thru-hole/TO264.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/TO264.fp 2023-05-08 14:23:36.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = TO264 diode in TO220 + openscad = TO264.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/TO264.scad pcb-rnd-3.1.1/footprint/thru-hole/TO264.scad --- pcb-rnd-3.1.0/footprint/thru-hole/TO264.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/TO264.scad 2023-05-12 15:45:19.000000000 +0000 @@ -0,0 +1,115 @@ +// Model for vertical TO264 package 2 and 3 pin variants +// +// Copyright (C) 2017,2020 Tibor 'Igor2' Palinkas +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_to264(pins=3,pin_descent=2.5) +{ + pin_thickness = 0.6; + pin_width1 = 2.9; + pin_width2 = 1.25; + pin_neck = 2.45; + pin_spacing = 5.56; + + tab_thickness = 0.5; + tab_width = 18; + tab_height = 24; + tab_overhang = -1.0; + tab_bevel = 1.5; + + device_height = 26; + device_width = 20; + body_thickness = 5; + body_offset = body_thickness/2; + + hole_dia = 3.3; + hole_height = 6.0; + notch_size = 4.0; + notch_height = 6.0; + notch2_height = 15.0; + + module pin() { + linear_extrude(height=pin_thickness) + polygon([[-pin_width1/2,0],[pin_width1/2,0],[pin_width1/2,pin_width1-pin_width2-pin_neck],[pin_width2/2,-pin_neck],[pin_width2/2,-pin_neck-0.01-pin_descent ],[-pin_width2/2,-pin_neck-0.01-pin_descent],[-pin_width2/2,-pin_neck],[-pin_width1/2,pin_width1-pin_width2-pin_neck]]); + } + + module body() { + union() { + color([0.3,0.3,0.3]) { + difference() { + translate([0,hole_height,-body_offset]) + linear_extrude(height=body_thickness) + polygon([[-device_width/2,-device_height],[device_width/2,-device_height],[device_width/2,0],[-device_width/2,0]]); + translate([0,0,-body_thickness]) + cylinder(r=hole_dia/2, h=body_thickness*3); + translate([-device_width/2,hole_height-notch_height,0]) + cylinder(r=notch_size/2, h=body_thickness*2); + translate([device_width/2,hole_height-notch_height,0]) + cylinder(r=notch_size/2, h=body_thickness*2); + translate([-device_width/2,hole_height-notch2_height,0]) + cylinder(r=notch_size/4, h=body_thickness*2); + translate([device_width/2,hole_height-notch2_height,0]) + cylinder(r=notch_size/4, h=body_thickness*2); + } + } + color([0.8,0.8,0.8]) + translate([0,hole_height+tab_overhang,-body_thickness/2-0.01]) + difference() { + linear_extrude(height=tab_thickness) + polygon([[-tab_width/2,-tab_height],[tab_width/2,-tab_height],[tab_width/2,-tab_bevel],[tab_width/2-tab_bevel,0],[-tab_width/2+tab_bevel,0],[-tab_width/2,-tab_bevel]]); + translate([0,-hole_height-tab_overhang,-body_thickness]) + cylinder(r=hole_dia, h=body_thickness*3); + } + } + } + + translate([-3.556,0,0]) { + rotate([90,0,90]) { + translate([pin_spacing,0,0]) { + union() { + color([0.9, 0.9, 0.9]) { + if (pins==3) { + translate([0,pin_neck+0.05,-pin_thickness/2]) + pin(); + } + translate([-pin_spacing,pin_neck+0.05,-pin_thickness/2]) + pin(); + translate([pin_spacing,pin_neck+0.05,-pin_thickness/2]) + pin(); + } + translate([0,pin_neck+device_height-hole_height,0]) + body(); + } + } + } + } +} + diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/TO39.fp pcb-rnd-3.1.1/footprint/thru-hole/TO39.fp --- pcb-rnd-3.1.0/footprint/thru-hole/TO39.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/TO39.fp 2023-05-07 08:20:22.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = TO39 Transistor + openscad = TO39.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/TO39.scad pcb-rnd-3.1.1/footprint/thru-hole/TO39.scad --- pcb-rnd-3.1.0/footprint/thru-hole/TO39.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/TO39.scad 2023-05-12 15:45:19.000000000 +0000 @@ -0,0 +1,71 @@ +// Model for TO39 through hole package +// +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_to39(pin_descent=2.5) +{ + height = 6.35; + major_diameter = 8.95; + minor_diameter = 8.1; + rim_thickness = 0.89; + tab_square = 0.82; + pin_diameter = 0.41; + pcb_offset = 3.0; + + // r[adius], h[eight], [rou]n[d] + module rounded_cylinder(r,h,n) { + rotate_extrude(convexity=1) { + offset(r=n) offset(delta=-n) square([r,h]); + square([n,h]); + } + } + + union() { + color([0.7,0.7,0.7]) { + translate ([0,0,pcb_offset]) { + rounded_cylinder(minor_diameter/2,height,0.5); + rotate([0,0,135]) + translate([-tab_square/2,0,rim_thickness/2]) + cube ([major_diameter+tab_square, tab_square, rim_thickness], true); + cylinder(r = major_diameter/2, h = rim_thickness); + } + } + color([0.8,0.8,0.8]) { + translate ([-2.54,0,-pin_descent]) + cylinder(r = pin_diameter/2, h = pcb_offset +pin_descent); + translate ([0,2.54,-pin_descent]) + cylinder(r = pin_diameter/2, h = pcb_offset + pin_descent); + translate ([2.54,0,-pin_descent]) + cylinder(r = pin_diameter/2, h = pcb_offset + pin_descent); + } + } +} + diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/TO92.fp pcb-rnd-3.1.1/footprint/thru-hole/TO92.fp --- pcb-rnd-3.1.0/footprint/thru-hole/TO92.fp 2019-08-10 07:25:37.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/TO92.fp 2023-05-07 07:37:12.000000000 +0000 @@ -2,6 +2,7 @@ ha:subc.5 { ha:attributes { footprint = TO92 Transistor + openscad = TO92.scad } ha:data { li:padstack_prototypes { diff -Nru pcb-rnd-3.1.0/footprint/thru-hole/TO92.scad pcb-rnd-3.1.1/footprint/thru-hole/TO92.scad --- pcb-rnd-3.1.0/footprint/thru-hole/TO92.scad 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/footprint/thru-hole/TO92.scad 2023-05-12 15:45:19.000000000 +0000 @@ -0,0 +1,68 @@ +// Model for TO92 through hole package +// +// Copyright (C) 2023 Erich Heinzle +// +// File distribution license: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// The above distribution license applies when the file is distributed as a +// stand alone model file or as part of a library, in both cases intended +// for reuse combined by the user with other openscad scripts. +// +// Use license: +// as a special exception, the content of the file may be +// embedded in an openscad script that represents a printed circuit board, +// for example when a board is exported by pcb-rnd. In such use case, +// the content of this file may be copied into the resulting board file +// with or without modifications, without affecting the board file's license +// in any way. +// + +module part_to92(pin_descent=2.5) +{ + height = 5.0; + diameter = 5.0; + pin_thickness = 0.38; + + module bent_pin(pin_thickness) { + translate([0,0,-pin_thickness/2]) + linear_extrude(height=pin_thickness) + polygon([[-pin_thickness/2,-pin_descent],[-pin_thickness/2,2.25],[1.27-pin_thickness/2,3.25],[1.27-pin_thickness/2,5.5],[1.27+pin_thickness/2,5.5],[1.27+pin_thickness/2,3.0],[pin_thickness/2,2.0],[pin_thickness/2,-pin_descent]]); + } + + rotate([0,0,-90]) { + union() { + color([0.1,0.1,0.1]) { + translate ([2.54,0,3*height/4]) { + intersection () { + translate ([0,-1.0,height/2]) + cube ([diameter, diameter, height], true); + cylinder(r = diameter/2, h = height); + } + } + } + color([0.8,0.8,0.8]) { + rotate([90,0,0]) + bent_pin(pin_thickness); + translate ([2.54,0,height-(height+pin_descent)/2]) + cube ([pin_thickness, pin_thickness, height+pin_descent], true); + translate ([5.08,0,0]) + rotate([90,0,180]) + bent_pin(pin_thickness); + } + } + } +} + diff -Nru pcb-rnd-3.1.0/Release_notes pcb-rnd-3.1.1/Release_notes --- pcb-rnd-3.1.0/Release_notes 2023-02-04 16:53:50.000000000 +0000 +++ pcb-rnd-3.1.1/Release_notes 2023-05-18 03:39:48.000000000 +0000 @@ -1,12 +1,5 @@ -pcb-rnd 3.1.0 +pcb-rnd 3.1.1 ~~~~~~~~~~~~~ -This release focuses on librnd4 switchover. - -Feature highlight (bugfixes are listed in the Changelog): - -1. many of the devhelper scripts got moved to librnd to be shared with - other Ringdove apps - -2. the generic low levels of the font engine got moved to librnd for the - same reason +This release is a minor bugfix release with only one major feature: +openscad 3d models for all static file footprints in the stock lib. diff -Nru pcb-rnd-3.1.0/scconfig/hooks.c pcb-rnd-3.1.1/scconfig/hooks.c --- pcb-rnd-3.1.0/scconfig/hooks.c 2023-02-08 03:06:05.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/hooks.c 2023-05-24 02:44:04.000000000 +0000 @@ -11,7 +11,7 @@ #include "util/arg_auto_set.h" #include "Rev.h" -#define version "3.1.0" +#define version "3.1.1" #define REQ_LIBRND_MAJOR 4 #define REQ_LIBRND_MINOR 0 diff -Nru pcb-rnd-3.1.0/scconfig/src/c99/find_c99.c pcb-rnd-3.1.1/scconfig/src/c99/find_c99.c --- pcb-rnd-3.1.0/scconfig/src/c99/find_c99.c 2018-07-17 10:23:51.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/c99/find_c99.c 2023-04-09 03:21:26.000000000 +0000 @@ -18,7 +18,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/default/arg.c pcb-rnd-3.1.1/scconfig/src/default/arg.c --- pcb-rnd-3.1.0/scconfig/src/default/arg.c 2020-04-17 13:25:52.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/default/arg.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/default/db.c pcb-rnd-3.1.1/scconfig/src/default/db.c --- pcb-rnd-3.1.0/scconfig/src/default/db.c 2019-02-02 06:09:49.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/default/db.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/default/dep.c pcb-rnd-3.1.1/scconfig/src/default/dep.c --- pcb-rnd-3.1.0/scconfig/src/default/dep.c 2019-07-17 06:12:32.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/default/dep.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/default/deps_default.c pcb-rnd-3.1.1/scconfig/src/default/deps_default.c --- pcb-rnd-3.1.0/scconfig/src/default/deps_default.c 2022-08-27 11:35:50.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/default/deps_default.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include "dep.h" diff -Nru pcb-rnd-3.1.0/scconfig/src/default/find_cc.c pcb-rnd-3.1.1/scconfig/src/default/find_cc.c --- pcb-rnd-3.1.0/scconfig/src/default/find_cc.c 2023-01-12 19:35:03.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/default/find_cc.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/default/find_environ.c pcb-rnd-3.1.1/scconfig/src/default/find_environ.c --- pcb-rnd-3.1.0/scconfig/src/default/find_environ.c 2018-02-13 19:14:28.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/default/find_environ.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/default/find_fscalls.c pcb-rnd-3.1.1/scconfig/src/default/find_fscalls.c --- pcb-rnd-3.1.0/scconfig/src/default/find_fscalls.c 2023-01-12 18:50:31.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/default/find_fscalls.c 2023-04-09 03:21:26.000000000 +0000 @@ -18,7 +18,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/default/find_fstools.c pcb-rnd-3.1.1/scconfig/src/default/find_fstools.c --- pcb-rnd-3.1.0/scconfig/src/default/find_fstools.c 2022-07-13 15:50:17.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/default/find_fstools.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/default/find_io.c pcb-rnd-3.1.1/scconfig/src/default/find_io.c --- pcb-rnd-3.1.0/scconfig/src/default/find_io.c 2023-01-07 10:31:07.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/default/find_io.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/default/find_libs.c pcb-rnd-3.1.1/scconfig/src/default/find_libs.c --- pcb-rnd-3.1.0/scconfig/src/default/find_libs.c 2021-01-25 15:21:12.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/default/find_libs.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/default/find_printf.c pcb-rnd-3.1.1/scconfig/src/default/find_printf.c --- pcb-rnd-3.1.0/scconfig/src/default/find_printf.c 2018-02-13 19:14:28.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/default/find_printf.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/default/find_proc.c pcb-rnd-3.1.1/scconfig/src/default/find_proc.c --- pcb-rnd-3.1.0/scconfig/src/default/find_proc.c 2019-01-30 11:14:29.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/default/find_proc.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/default/find_signal.c pcb-rnd-3.1.1/scconfig/src/default/find_signal.c --- pcb-rnd-3.1.0/scconfig/src/default/find_signal.c 2018-11-09 10:11:15.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/default/find_signal.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/default/find_str.c pcb-rnd-3.1.1/scconfig/src/default/find_str.c --- pcb-rnd-3.1.0/scconfig/src/default/find_str.c 2019-01-24 09:02:14.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/default/find_str.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/default/find_sys.c pcb-rnd-3.1.1/scconfig/src/default/find_sys.c --- pcb-rnd-3.1.0/scconfig/src/default/find_sys.c 2020-03-31 03:20:29.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/default/find_sys.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/default/find_target.c pcb-rnd-3.1.1/scconfig/src/default/find_target.c --- pcb-rnd-3.1.0/scconfig/src/default/find_target.c 2018-08-13 12:05:04.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/default/find_target.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/default/find_thread.c pcb-rnd-3.1.1/scconfig/src/default/find_thread.c --- pcb-rnd-3.1.0/scconfig/src/default/find_thread.c 2021-01-25 15:21:12.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/default/find_thread.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/default/find_time.c pcb-rnd-3.1.1/scconfig/src/default/find_time.c --- pcb-rnd-3.1.0/scconfig/src/default/find_time.c 2022-08-27 11:40:43.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/default/find_time.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/default/find_types.c pcb-rnd-3.1.1/scconfig/src/default/find_types.c --- pcb-rnd-3.1.0/scconfig/src/default/find_types.c 2023-01-02 06:56:15.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/default/find_types.c 2023-04-09 03:21:26.000000000 +0000 @@ -18,7 +18,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/default/find_uname.c pcb-rnd-3.1.1/scconfig/src/default/find_uname.c --- pcb-rnd-3.1.0/scconfig/src/default/find_uname.c 2020-12-10 06:07:14.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/default/find_uname.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/default/ht.c pcb-rnd-3.1.1/scconfig/src/default/ht.c --- pcb-rnd-3.1.0/scconfig/src/default/ht.c 2016-08-04 03:50:30.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/default/ht.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/default/lib_compile.c pcb-rnd-3.1.1/scconfig/src/default/lib_compile.c --- pcb-rnd-3.1.0/scconfig/src/default/lib_compile.c 2022-07-17 03:09:42.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/default/lib_compile.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/default/lib_file.c pcb-rnd-3.1.1/scconfig/src/default/lib_file.c --- pcb-rnd-3.1.0/scconfig/src/default/lib_file.c 2018-02-01 10:43:22.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/default/lib_file.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/default/lib_filelist.c pcb-rnd-3.1.1/scconfig/src/default/lib_filelist.c --- pcb-rnd-3.1.0/scconfig/src/default/lib_filelist.c 2018-02-13 19:14:28.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/default/lib_filelist.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/default/lib_srctree.c pcb-rnd-3.1.1/scconfig/src/default/lib_srctree.c --- pcb-rnd-3.1.0/scconfig/src/default/lib_srctree.c 2016-03-19 05:28:41.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/default/lib_srctree.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/default/lib_uniqinc.c pcb-rnd-3.1.1/scconfig/src/default/lib_uniqinc.c --- pcb-rnd-3.1.0/scconfig/src/default/lib_uniqinc.c 2022-08-20 12:17:22.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/default/lib_uniqinc.c 2023-04-09 03:21:26.000000000 +0000 @@ -18,7 +18,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/default/log.c pcb-rnd-3.1.1/scconfig/src/default/log.c --- pcb-rnd-3.1.0/scconfig/src/default/log.c 2016-08-25 03:28:19.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/default/log.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include "log.h" diff -Nru pcb-rnd-3.1.0/scconfig/src/default/main.c pcb-rnd-3.1.1/scconfig/src/default/main.c --- pcb-rnd-3.1.0/scconfig/src/default/main.c 2018-08-13 12:05:04.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/default/main.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/default/main_custom_args.c pcb-rnd-3.1.1/scconfig/src/default/main_custom_args.c --- pcb-rnd-3.1.0/scconfig/src/default/main_custom_args.c 2016-02-14 16:42:45.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/default/main_custom_args.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/default/main_lib.c pcb-rnd-3.1.1/scconfig/src/default/main_lib.c --- pcb-rnd-3.1.0/scconfig/src/default/main_lib.c 2017-10-26 06:27:47.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/default/main_lib.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/default/str.c pcb-rnd-3.1.1/scconfig/src/default/str.c --- pcb-rnd-3.1.0/scconfig/src/default/str.c 2022-08-30 03:27:24.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/default/str.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/generator/generator.c pcb-rnd-3.1.1/scconfig/src/generator/generator.c --- pcb-rnd-3.1.0/scconfig/src/generator/generator.c 2018-11-01 03:32:58.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/generator/generator.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/gui/find_cairo.c pcb-rnd-3.1.1/scconfig/src/gui/find_cairo.c --- pcb-rnd-3.1.0/scconfig/src/gui/find_cairo.c 2019-05-20 03:00:06.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/gui/find_cairo.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include #include diff -Nru pcb-rnd-3.1.0/scconfig/src/gui/find_gd.c pcb-rnd-3.1.1/scconfig/src/gui/find_gd.c --- pcb-rnd-3.1.0/scconfig/src/gui/find_gd.c 2021-01-25 15:23:00.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/gui/find_gd.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include #include diff -Nru pcb-rnd-3.1.0/scconfig/src/gui/find_gl.c pcb-rnd-3.1.1/scconfig/src/gui/find_gl.c --- pcb-rnd-3.1.0/scconfig/src/gui/find_gl.c 2022-08-20 08:53:02.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/gui/find_gl.c 2023-04-09 03:21:26.000000000 +0000 @@ -18,7 +18,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include #include diff -Nru pcb-rnd-3.1.0/scconfig/src/gui/find_gtk2.c pcb-rnd-3.1.1/scconfig/src/gui/find_gtk2.c --- pcb-rnd-3.1.0/scconfig/src/gui/find_gtk2.c 2021-01-25 15:23:00.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/gui/find_gtk2.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include #include diff -Nru pcb-rnd-3.1.0/scconfig/src/gui/find_gtk3.c pcb-rnd-3.1.1/scconfig/src/gui/find_gtk3.c --- pcb-rnd-3.1.0/scconfig/src/gui/find_gtk3.c 2021-11-04 08:59:46.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/gui/find_gtk3.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include #include diff -Nru pcb-rnd-3.1.0/scconfig/src/gui/find_gtk4.c pcb-rnd-3.1.1/scconfig/src/gui/find_gtk4.c --- pcb-rnd-3.1.0/scconfig/src/gui/find_gtk4.c 2021-11-11 09:24:56.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/gui/find_gtk4.c 2023-04-09 03:21:26.000000000 +0000 @@ -18,7 +18,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include #include diff -Nru pcb-rnd-3.1.0/scconfig/src/gui/find_lesstif2.c pcb-rnd-3.1.1/scconfig/src/gui/find_lesstif2.c --- pcb-rnd-3.1.0/scconfig/src/gui/find_lesstif2.c 2021-11-07 06:04:11.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/gui/find_lesstif2.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include #include diff -Nru pcb-rnd-3.1.0/scconfig/src/gui/find_misc.c pcb-rnd-3.1.1/scconfig/src/gui/find_misc.c --- pcb-rnd-3.1.0/scconfig/src/gui/find_misc.c 2018-12-09 09:02:02.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/gui/find_misc.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include #include diff -Nru pcb-rnd-3.1.0/scconfig/src/gui/find_sdl2.c pcb-rnd-3.1.1/scconfig/src/gui/find_sdl2.c --- pcb-rnd-3.1.0/scconfig/src/gui/find_sdl2.c 2022-08-27 08:16:33.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/gui/find_sdl2.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include #include diff -Nru pcb-rnd-3.1.0/scconfig/src/gui/find_x.c pcb-rnd-3.1.1/scconfig/src/gui/find_x.c --- pcb-rnd-3.1.0/scconfig/src/gui/find_x.c 2022-12-05 15:17:36.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/gui/find_x.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include #include diff -Nru pcb-rnd-3.1.0/scconfig/src/math/find_fpenan.c pcb-rnd-3.1.1/scconfig/src/math/find_fpenan.c --- pcb-rnd-3.1.0/scconfig/src/math/find_fpenan.c 2021-01-25 15:47:01.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/math/find_fpenan.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/math/find_func.c pcb-rnd-3.1.1/scconfig/src/math/find_func.c --- pcb-rnd-3.1.0/scconfig/src/math/find_func.c 2021-01-25 15:24:44.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/math/find_func.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/math/find_math.c pcb-rnd-3.1.1/scconfig/src/math/find_math.c --- pcb-rnd-3.1.0/scconfig/src/math/find_math.c 2021-01-25 15:24:44.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/math/find_math.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/math/find_mfunc_cc.c pcb-rnd-3.1.1/scconfig/src/math/find_mfunc_cc.c --- pcb-rnd-3.1.0/scconfig/src/math/find_mfunc_cc.c 2018-03-03 15:01:16.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/math/find_mfunc_cc.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/menulib/hookreadline.c pcb-rnd-3.1.1/scconfig/src/menulib/hookreadline.c --- pcb-rnd-3.1.0/scconfig/src/menulib/hookreadline.c 2016-02-07 06:00:37.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/menulib/hookreadline.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/menulib/hookreadline.h pcb-rnd-3.1.1/scconfig/src/menulib/hookreadline.h --- pcb-rnd-3.1.0/scconfig/src/menulib/hookreadline.h 2016-02-07 06:00:37.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/menulib/hookreadline.h 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ diff -Nru pcb-rnd-3.1.0/scconfig/src/menulib/scmenu.c pcb-rnd-3.1.1/scconfig/src/menulib/scmenu.c --- pcb-rnd-3.1.0/scconfig/src/menulib/scmenu.c 2016-02-15 04:01:29.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/menulib/scmenu.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include #include diff -Nru pcb-rnd-3.1.0/scconfig/src/menulib/scmenu.h pcb-rnd-3.1.1/scconfig/src/menulib/scmenu.h --- pcb-rnd-3.1.0/scconfig/src/menulib/scmenu.h 2016-02-15 06:20:41.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/menulib/scmenu.h 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include "hookreadline.h" diff -Nru pcb-rnd-3.1.0/scconfig/src/menulib/scmenu_menu.c pcb-rnd-3.1.1/scconfig/src/menulib/scmenu_menu.c --- pcb-rnd-3.1.0/scconfig/src/menulib/scmenu_menu.c 2016-02-15 04:10:32.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/menulib/scmenu_menu.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ static void menu_scroll_valid(scm_menu_t *menu, scm_win_t *win) diff -Nru pcb-rnd-3.1.0/scconfig/src/menulib/scmenu_rl.c pcb-rnd-3.1.1/scconfig/src/menulib/scmenu_rl.c --- pcb-rnd-3.1.0/scconfig/src/menulib/scmenu_rl.c 2016-02-07 14:26:41.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/menulib/scmenu_rl.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ char *scm_readline(scm_ctx_t *ctx, const char *title, const char *prompt, const char *orig) diff -Nru pcb-rnd-3.1.0/scconfig/src/menulib/scmenu_text.c pcb-rnd-3.1.1/scconfig/src/menulib/scmenu_text.c --- pcb-rnd-3.1.0/scconfig/src/menulib/scmenu_text.c 2016-08-04 03:50:30.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/menulib/scmenu_text.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ static char *button_text[] = {"yes", "no", "ok", "cancel", "quit"}; diff -Nru pcb-rnd-3.1.0/scconfig/src/menulib/vt100.c pcb-rnd-3.1.1/scconfig/src/menulib/vt100.c --- pcb-rnd-3.1.0/scconfig/src/menulib/vt100.c 2016-08-04 04:00:32.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/menulib/vt100.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ diff -Nru pcb-rnd-3.1.0/scconfig/src/menulib/vt100.h pcb-rnd-3.1.1/scconfig/src/menulib/vt100.h --- pcb-rnd-3.1.0/scconfig/src/menulib/vt100.h 2016-02-06 15:38:43.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/menulib/vt100.h 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ diff -Nru pcb-rnd-3.1.0/scconfig/src/parser/find_expat.c pcb-rnd-3.1.1/scconfig/src/parser/find_expat.c --- pcb-rnd-3.1.0/scconfig/src/parser/find_expat.c 2021-01-25 15:25:33.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/parser/find_expat.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include "parser.h" diff -Nru pcb-rnd-3.1.0/scconfig/src/parser/parser.c pcb-rnd-3.1.1/scconfig/src/parser/parser.c --- pcb-rnd-3.1.0/scconfig/src/parser/parser.c 2013-06-16 15:01:47.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/parser/parser.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include "parser.h" diff -Nru pcb-rnd-3.1.0/scconfig/src/parsgen/find_parsgen.c pcb-rnd-3.1.1/scconfig/src/parsgen/find_parsgen.c --- pcb-rnd-3.1.0/scconfig/src/parsgen/find_parsgen.c 2020-04-24 13:53:28.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/parsgen/find_parsgen.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/posix/find_dev.c pcb-rnd-3.1.1/scconfig/src/posix/find_dev.c --- pcb-rnd-3.1.0/scconfig/src/posix/find_dev.c 2018-03-13 12:59:59.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/posix/find_dev.c 2023-04-09 03:21:26.000000000 +0000 @@ -18,7 +18,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/posix/find_fs.c pcb-rnd-3.1.1/scconfig/src/posix/find_fs.c --- pcb-rnd-3.1.0/scconfig/src/posix/find_fs.c 2019-02-27 10:25:39.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/posix/find_fs.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/posix/find_log.c pcb-rnd-3.1.1/scconfig/src/posix/find_log.c --- pcb-rnd-3.1.0/scconfig/src/posix/find_log.c 2020-05-27 10:16:21.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/posix/find_log.c 2023-04-09 03:21:26.000000000 +0000 @@ -18,7 +18,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/posix/find_proc.c pcb-rnd-3.1.1/scconfig/src/posix/find_proc.c --- pcb-rnd-3.1.0/scconfig/src/posix/find_proc.c 2020-04-09 09:48:31.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/posix/find_proc.c 2023-04-09 03:21:26.000000000 +0000 @@ -18,7 +18,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/posix/find_res.c pcb-rnd-3.1.1/scconfig/src/posix/find_res.c --- pcb-rnd-3.1.0/scconfig/src/posix/find_res.c 2021-09-06 12:44:12.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/posix/find_res.c 2023-04-09 03:21:26.000000000 +0000 @@ -18,7 +18,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/scripts/find_duktape.c pcb-rnd-3.1.1/scconfig/src/scripts/find_duktape.c --- pcb-rnd-3.1.0/scconfig/src/scripts/find_duktape.c 2021-01-25 15:29:11.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/scripts/find_duktape.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include "scripts.h" diff -Nru pcb-rnd-3.1.0/scconfig/src/scripts/find_fungw.c pcb-rnd-3.1.1/scconfig/src/scripts/find_fungw.c --- pcb-rnd-3.1.0/scconfig/src/scripts/find_fungw.c 2021-01-25 15:29:11.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/scripts/find_fungw.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include "scripts.h" diff -Nru pcb-rnd-3.1.0/scconfig/src/scripts/find_funlisp.c pcb-rnd-3.1.1/scconfig/src/scripts/find_funlisp.c --- pcb-rnd-3.1.0/scconfig/src/scripts/find_funlisp.c 2021-01-25 15:29:11.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/scripts/find_funlisp.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include "scripts.h" diff -Nru pcb-rnd-3.1.0/scconfig/src/scripts/find_gpmi.c pcb-rnd-3.1.1/scconfig/src/scripts/find_gpmi.c --- pcb-rnd-3.1.0/scconfig/src/scripts/find_gpmi.c 2018-02-13 19:14:28.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/scripts/find_gpmi.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include "scripts.h" diff -Nru pcb-rnd-3.1.0/scconfig/src/scripts/find_guile.c pcb-rnd-3.1.1/scconfig/src/scripts/find_guile.c --- pcb-rnd-3.1.0/scconfig/src/scripts/find_guile.c 2021-01-25 15:29:11.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/scripts/find_guile.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include "scripts.h" diff -Nru pcb-rnd-3.1.0/scconfig/src/scripts/find_lua.c pcb-rnd-3.1.1/scconfig/src/scripts/find_lua.c --- pcb-rnd-3.1.0/scconfig/src/scripts/find_lua.c 2021-01-25 15:29:11.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/scripts/find_lua.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include "scripts.h" diff -Nru pcb-rnd-3.1.0/scconfig/src/scripts/find_m4.c pcb-rnd-3.1.1/scconfig/src/scripts/find_m4.c --- pcb-rnd-3.1.0/scconfig/src/scripts/find_m4.c 2018-02-13 19:14:28.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/scripts/find_m4.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include "scripts.h" diff -Nru pcb-rnd-3.1.0/scconfig/src/scripts/find_mawk.c pcb-rnd-3.1.1/scconfig/src/scripts/find_mawk.c --- pcb-rnd-3.1.0/scconfig/src/scripts/find_mawk.c 2018-03-03 15:01:06.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/scripts/find_mawk.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include "scripts.h" diff -Nru pcb-rnd-3.1.0/scconfig/src/scripts/find_mruby.c pcb-rnd-3.1.1/scconfig/src/scripts/find_mruby.c --- pcb-rnd-3.1.0/scconfig/src/scripts/find_mruby.c 2021-01-25 15:29:11.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/scripts/find_mruby.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include "scripts.h" diff -Nru pcb-rnd-3.1.0/scconfig/src/scripts/find_mujs.c pcb-rnd-3.1.1/scconfig/src/scripts/find_mujs.c --- pcb-rnd-3.1.0/scconfig/src/scripts/find_mujs.c 2022-01-06 18:22:07.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/scripts/find_mujs.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include "scripts.h" diff -Nru pcb-rnd-3.1.0/scconfig/src/scripts/find_perl.c pcb-rnd-3.1.1/scconfig/src/scripts/find_perl.c --- pcb-rnd-3.1.0/scconfig/src/scripts/find_perl.c 2021-01-25 15:29:11.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/scripts/find_perl.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include "scripts.h" diff -Nru pcb-rnd-3.1.0/scconfig/src/scripts/find_picol.c pcb-rnd-3.1.1/scconfig/src/scripts/find_picol.c --- pcb-rnd-3.1.0/scconfig/src/scripts/find_picol.c 2021-04-17 04:09:26.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/scripts/find_picol.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include "scripts.h" diff -Nru pcb-rnd-3.1.0/scconfig/src/scripts/find_python.c pcb-rnd-3.1.1/scconfig/src/scripts/find_python.c --- pcb-rnd-3.1.0/scconfig/src/scripts/find_python.c 2019-01-09 06:46:09.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/scripts/find_python.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include "scripts.h" diff -Nru pcb-rnd-3.1.0/scconfig/src/scripts/find_ruby.c pcb-rnd-3.1.1/scconfig/src/scripts/find_ruby.c --- pcb-rnd-3.1.0/scconfig/src/scripts/find_ruby.c 2021-01-25 15:29:11.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/scripts/find_ruby.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include "scripts.h" diff -Nru pcb-rnd-3.1.0/scconfig/src/scripts/find_stutter.c pcb-rnd-3.1.1/scconfig/src/scripts/find_stutter.c --- pcb-rnd-3.1.0/scconfig/src/scripts/find_stutter.c 2021-01-25 15:29:11.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/scripts/find_stutter.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include "scripts.h" diff -Nru pcb-rnd-3.1.0/scconfig/src/scripts/find_tcl.c pcb-rnd-3.1.1/scconfig/src/scripts/find_tcl.c --- pcb-rnd-3.1.0/scconfig/src/scripts/find_tcl.c 2021-01-25 15:29:11.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/scripts/find_tcl.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include "scripts.h" diff -Nru pcb-rnd-3.1.0/scconfig/src/scripts/find_welltype.c pcb-rnd-3.1.1/scconfig/src/scripts/find_welltype.c --- pcb-rnd-3.1.0/scconfig/src/scripts/find_welltype.c 2021-07-01 16:05:53.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/scripts/find_welltype.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include "scripts.h" diff -Nru pcb-rnd-3.1.0/scconfig/src/scripts/scripts.c pcb-rnd-3.1.1/scconfig/src/scripts/scripts.c --- pcb-rnd-3.1.0/scconfig/src/scripts/scripts.c 2022-01-06 18:22:07.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/scripts/scripts.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include "scripts.h" diff -Nru pcb-rnd-3.1.0/scconfig/src/socket/find_dns.c pcb-rnd-3.1.1/scconfig/src/socket/find_dns.c --- pcb-rnd-3.1.0/scconfig/src/socket/find_dns.c 2022-02-11 16:24:38.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/socket/find_dns.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include "socket.h" diff -Nru pcb-rnd-3.1.0/scconfig/src/socket/find_select.c pcb-rnd-3.1.1/scconfig/src/socket/find_select.c --- pcb-rnd-3.1.0/scconfig/src/socket/find_select.c 2023-01-07 10:52:22.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/socket/find_select.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include "socket.h" diff -Nru pcb-rnd-3.1.0/scconfig/src/socket/find_socket.c pcb-rnd-3.1.1/scconfig/src/socket/find_socket.c --- pcb-rnd-3.1.0/scconfig/src/socket/find_socket.c 2022-12-05 15:28:15.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/socket/find_socket.c 2023-04-09 03:21:26.000000000 +0000 @@ -18,7 +18,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include "socket.h" diff -Nru pcb-rnd-3.1.0/scconfig/src/socket/socket.c pcb-rnd-3.1.1/scconfig/src/socket/socket.c --- pcb-rnd-3.1.0/scconfig/src/socket/socket.c 2020-05-16 12:19:42.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/socket/socket.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include "socket.h" diff -Nru pcb-rnd-3.1.0/scconfig/src/sul/find_aspell.c pcb-rnd-3.1.1/scconfig/src/sul/find_aspell.c --- pcb-rnd-3.1.0/scconfig/src/sul/find_aspell.c 2018-12-09 08:39:06.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/sul/find_aspell.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/sul/find_dbus.c pcb-rnd-3.1.1/scconfig/src/sul/find_dbus.c --- pcb-rnd-3.1.0/scconfig/src/sul/find_dbus.c 2018-12-09 08:39:06.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/sul/find_dbus.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/sul/find_dmalloc.c pcb-rnd-3.1.1/scconfig/src/sul/find_dmalloc.c --- pcb-rnd-3.1.0/scconfig/src/sul/find_dmalloc.c 2018-12-09 08:39:06.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/sul/find_dmalloc.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/sul/find_freetype2.c pcb-rnd-3.1.1/scconfig/src/sul/find_freetype2.c --- pcb-rnd-3.1.0/scconfig/src/sul/find_freetype2.c 2021-01-25 19:01:02.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/sul/find_freetype2.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/sul/find_fs.c pcb-rnd-3.1.1/scconfig/src/sul/find_fs.c --- pcb-rnd-3.1.0/scconfig/src/sul/find_fs.c 2019-03-20 03:42:28.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/sul/find_fs.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/sul/find_gen.c pcb-rnd-3.1.1/scconfig/src/sul/find_gen.c --- pcb-rnd-3.1.0/scconfig/src/sul/find_gen.c 2021-01-25 15:34:53.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/sul/find_gen.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/sul/find_gettext.c pcb-rnd-3.1.1/scconfig/src/sul/find_gettext.c --- pcb-rnd-3.1.0/scconfig/src/sul/find_gettext.c 2018-12-09 08:39:06.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/sul/find_gettext.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/sul/find_glib.c pcb-rnd-3.1.1/scconfig/src/sul/find_glib.c --- pcb-rnd-3.1.0/scconfig/src/sul/find_glib.c 2021-01-25 15:34:53.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/sul/find_glib.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/sul/find_iconv.c pcb-rnd-3.1.1/scconfig/src/sul/find_iconv.c --- pcb-rnd-3.1.0/scconfig/src/sul/find_iconv.c 2018-12-09 08:39:06.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/sul/find_iconv.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/sul/find_librnd.c pcb-rnd-3.1.1/scconfig/src/sul/find_librnd.c --- pcb-rnd-3.1.0/scconfig/src/sul/find_librnd.c 2022-11-16 11:02:08.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/sul/find_librnd.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/sul/find_libxml2.c pcb-rnd-3.1.1/scconfig/src/sul/find_libxml2.c --- pcb-rnd-3.1.0/scconfig/src/sul/find_libxml2.c 2018-12-09 08:39:06.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/sul/find_libxml2.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/sul/find_pcre.c pcb-rnd-3.1.1/scconfig/src/sul/find_pcre.c --- pcb-rnd-3.1.0/scconfig/src/sul/find_pcre.c 2018-12-09 08:39:06.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/sul/find_pcre.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/sul/find_regex.c pcb-rnd-3.1.1/scconfig/src/sul/find_regex.c --- pcb-rnd-3.1.0/scconfig/src/sul/find_regex.c 2018-12-09 08:39:06.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/sul/find_regex.c 2023-04-09 03:21:26.000000000 +0000 @@ -18,7 +18,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/tty/find_gpm.c pcb-rnd-3.1.1/scconfig/src/tty/find_gpm.c --- pcb-rnd-3.1.0/scconfig/src/tty/find_gpm.c 2018-12-09 08:51:28.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/tty/find_gpm.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include #include diff -Nru pcb-rnd-3.1.0/scconfig/src/tty/find_ioctl.c pcb-rnd-3.1.1/scconfig/src/tty/find_ioctl.c --- pcb-rnd-3.1.0/scconfig/src/tty/find_ioctl.c 2018-12-09 08:51:28.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/tty/find_ioctl.c 2023-04-09 03:21:26.000000000 +0000 @@ -18,7 +18,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include #include diff -Nru pcb-rnd-3.1.0/scconfig/src/tty/find_ncurses.c pcb-rnd-3.1.1/scconfig/src/tty/find_ncurses.c --- pcb-rnd-3.1.0/scconfig/src/tty/find_ncurses.c 2018-12-09 08:51:28.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/tty/find_ncurses.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include #include diff -Nru pcb-rnd-3.1.0/scconfig/src/tty/find_pty.c pcb-rnd-3.1.1/scconfig/src/tty/find_pty.c --- pcb-rnd-3.1.0/scconfig/src/tty/find_pty.c 2018-12-09 08:51:28.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/tty/find_pty.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include #include diff -Nru pcb-rnd-3.1.0/scconfig/src/tty/find_readline.c pcb-rnd-3.1.1/scconfig/src/tty/find_readline.c --- pcb-rnd-3.1.0/scconfig/src/tty/find_readline.c 2019-01-18 14:50:40.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/tty/find_readline.c 2023-04-09 03:21:26.000000000 +0000 @@ -18,7 +18,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include #include diff -Nru pcb-rnd-3.1.0/scconfig/src/tty/find_slang.c pcb-rnd-3.1.1/scconfig/src/tty/find_slang.c --- pcb-rnd-3.1.0/scconfig/src/tty/find_slang.c 2018-12-09 08:51:28.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/tty/find_slang.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include #include diff -Nru pcb-rnd-3.1.0/scconfig/src/tty/find_term.c pcb-rnd-3.1.1/scconfig/src/tty/find_term.c --- pcb-rnd-3.1.0/scconfig/src/tty/find_term.c 2018-03-14 12:15:53.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/tty/find_term.c 2023-04-09 03:21:26.000000000 +0000 @@ -18,7 +18,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include #include diff -Nru pcb-rnd-3.1.0/scconfig/src/userpass/find_username.c pcb-rnd-3.1.1/scconfig/src/userpass/find_username.c --- pcb-rnd-3.1.0/scconfig/src/userpass/find_username.c 2021-01-25 15:36:54.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/userpass/find_username.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include #include diff -Nru pcb-rnd-3.1.0/scconfig/src/util/arg_auto_set.c pcb-rnd-3.1.1/scconfig/src/util/arg_auto_set.c --- pcb-rnd-3.1.0/scconfig/src/util/arg_auto_set.c 2016-12-21 06:14:38.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/util/arg_auto_set.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/util/cquote.c pcb-rnd-3.1.1/scconfig/src/util/cquote.c --- pcb-rnd-3.1.0/scconfig/src/util/cquote.c 2018-06-01 06:30:35.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/util/cquote.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/util/ls.c pcb-rnd-3.1.1/scconfig/src/util/ls.c --- pcb-rnd-3.1.0/scconfig/src/util/ls.c 2009-09-26 09:33:00.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/util/ls.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/scconfig/src/util/sccbox.c pcb-rnd-3.1.1/scconfig/src/util/sccbox.c --- pcb-rnd-3.1.0/scconfig/src/util/sccbox.c 2022-07-01 03:26:32.000000000 +0000 +++ pcb-rnd-3.1.1/scconfig/src/util/sccbox.c 2023-04-09 03:21:26.000000000 +0000 @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Project page: http://repo.hu/projects/scconfig - Contact via email: scconfig [at] igor2.repo.hu + Contact (email and IRC): http://igor2.repo.hu/contact.html */ #include diff -Nru pcb-rnd-3.1.0/src/attrib.c pcb-rnd-3.1.1/src/attrib.c --- pcb-rnd-3.1.0/src/attrib.c 2020-09-14 07:05:53.000000000 +0000 +++ pcb-rnd-3.1.1/src/attrib.c 2023-03-10 08:34:03.000000000 +0000 @@ -241,7 +241,7 @@ -/*** undoable attribute set/del */ +/*** undoable attribute set/del and rename ***/ typedef struct { pcb_attribute_list_t *list; /* it is safe to save the object pointer because it is persistent (through the removed object list) */ char *name; diff -Nru pcb-rnd-3.1.0/src/build_run.c pcb-rnd-3.1.1/src/build_run.c --- pcb-rnd-3.1.0/src/build_run.c 2022-11-19 06:39:44.000000000 +0000 +++ pcb-rnd-3.1.1/src/build_run.c 2023-05-21 14:33:35.000000000 +0000 @@ -84,7 +84,7 @@ gds_init(&info); gds_append_str(&info, "Recent pcb-rnd copyright:\n"); - gds_append_str(&info, "Copyright (C) Tibor Palinkas 2013..2022 (pcb-rnd)\n"); + gds_append_str(&info, "Copyright (C) Tibor Palinkas 2013..2023 (pcb-rnd)\n"); gds_append_str(&info, "For a more complete list of pcb-rnd authors and\ncontributors, see http://repo.hu/cgi-bin/pcb-rnd-people.cgi\n\n"); gds_append_str(&info, "Historical copyright:\n"); diff -Nru pcb-rnd-3.1.0/src/conf_core.c pcb-rnd-3.1.1/src/conf_core.c --- pcb-rnd-3.1.0/src/conf_core.c 2022-12-19 08:49:59.000000000 +0000 +++ pcb-rnd-3.1.1/src/conf_core.c 2023-02-08 07:19:12.000000000 +0000 @@ -3,6 +3,7 @@ #include "conf_core.h" #include #include +#include #include #include #include @@ -59,6 +60,8 @@ } +static char *dotdir = NULL; + void pcb_conf_core_postproc(void) { htpp_entry_t *e; @@ -70,6 +73,10 @@ rnd_conf_force_set_str(conf_core.rc.path.bin, BINDIR); rnd_conf_ro("rc/path/bin"); rnd_conf_force_set_str(conf_core.rc.path.share, PCBSHAREDIR); rnd_conf_ro("rc/path/share"); + if (dotdir == NULL) + dotdir = rnd_concat(rnd_conf.rc.path.home, RND_DIR_SEPARATOR_S, rnd_app.dot_dir, NULL); + rnd_conf_force_set_str(conf_core.rc.path.dotdir, dotdir); rnd_conf_ro("rc/path/dotdir"); + for(e = htpp_first(&legacy_new2old); e != NULL; e = htpp_next(&legacy_new2old, e)) { rnd_conf_native_t *nlegacy = e->value, *ndst = e->key; if (nlegacy->rnd_conf_rev > ndst->rnd_conf_rev) @@ -107,6 +114,7 @@ { htpp_uninit(&legacy_new2old); htpp_uninit(&legacy_old2new); + free(dotdir); } void conf_core_init(void) diff -Nru pcb-rnd-3.1.0/src/conf_core.h pcb-rnd-3.1.1/src/conf_core.h --- pcb-rnd-3.1.0/src/conf_core.h 2022-12-19 08:49:59.000000000 +0000 +++ pcb-rnd-3.1.1/src/conf_core.h 2023-02-08 07:19:12.000000000 +0000 @@ -145,6 +145,7 @@ RND_CFT_STRING share; /* e.g. /usr/share/pcb-rnd */ RND_CFT_STRING design; /* directory path of the current design, or if the current design doesn't have a file name yet */ + RND_CFT_STRING dotdir; /* user's config dir, normally ~/.pcb-rnd */ } path; } rc; diff -Nru pcb-rnd-3.1.0/src/data.c pcb-rnd-3.1.1/src/data.c --- pcb-rnd-3.1.0/src/data.c 2022-08-13 14:17:51.000000000 +0000 +++ pcb-rnd-3.1.1/src/data.c 2023-05-02 03:09:35.000000000 +0000 @@ -974,11 +974,13 @@ else if (rnd_strncasecmp(*name, "buffer#", 7) == 0) { char *end; long idx = strtol((*name)+7, &end, 10); - if ((*end == '\0') && (idx >= 0) && (idx < PCB_MAX_BUFFER)) { + if (((*end == '\0') || (*end == '/')) && (idx >= 0) && (idx < PCB_MAX_BUFFER)) { *name = end; if (**name == '/') (*name)++; *addr = idx+2; + if ((idx < 0) || (idx >= PCB_MAX_BUFFER)) + return NULL; return pcb_buffers[idx].Data; } } diff -Nru pcb-rnd-3.1.0/src/draw.c pcb-rnd-3.1.1/src/draw.c --- pcb-rnd-3.1.0/src/draw.c 2022-12-01 02:54:38.000000000 +0000 +++ pcb-rnd-3.1.1/src/draw.c 2023-05-16 04:00:58.000000000 +0000 @@ -474,16 +474,17 @@ copied = 1; } - /* ... plus only in GUI mode: per layer GUI modifications */ - if ((Layer != NULL) && ((rnd_render == rnd_gui) || dst->add_gui_xform) && (!pcb_xform_is_nop(&Layer->meta.real.gui_xform))) { - if (copied) - pcb_xform_add(dst, &Layer->meta.real.gui_xform); - else - pcb_xform_copy(dst, &Layer->meta.real.gui_xform); - info->xform = dst; - } if (info->xform_caller != NULL) { + /* ... plus only in GUI mode: per layer GUI modifications */ + if ((Layer != NULL) && ((rnd_render == rnd_gui) || info->xform_caller->add_gui_xform) && (!pcb_xform_is_nop(&Layer->meta.real.gui_xform))) { + if (copied) + pcb_xform_add(dst, &Layer->meta.real.gui_xform); + else + pcb_xform_copy(dst, &Layer->meta.real.gui_xform); + info->xform = dst; + } + if (info->xform == NULL) { info->xform = dst; pcb_xform_copy(dst, info->xform_caller); diff -Nru pcb-rnd-3.1.0/src/find.c pcb-rnd-3.1.1/src/find.c --- pcb-rnd-3.1.0/src/find.c 2021-10-10 05:51:57.000000000 +0000 +++ pcb-rnd-3.1.1/src/find.c 2023-04-28 02:51:35.000000000 +0000 @@ -2,7 +2,7 @@ * COPYRIGHT * * pcb-rnd, interactive printed circuit board design - * Copyright (C) 2018,2020 Tibor 'Igor2' Palinkas + * Copyright (C) 2018,2020,2023 Tibor 'Igor2' Palinkas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -103,7 +103,7 @@ pcb_pstk_shape_t *shp; /* do anything only if there are disjoint copper shapes */ - if ((proto == NULL) || (proto->all_copper_connd && proto->hplated) || ((pcb_pstk_t *)obj)->term) + if ((proto == NULL) || proto->all_copper_connd || ((pcb_pstk_t *)obj)->term) return; mm = pcb_find_get_mm(ctx, obj); @@ -173,7 +173,7 @@ rnd_layer_id_t lid; /* do anything only if there are disjoint copper shapes */ - if ((proto == NULL) || (proto->all_copper_connd && proto->hplated) || ((pcb_pstk_t *)obj)->term) + if ((proto == NULL) || proto->all_copper_connd || ((pcb_pstk_t *)obj)->term) return 1; mm = pcb_find_get_mm(ctx, obj); @@ -217,7 +217,7 @@ rnd_layer_id_t lid; /* do anything only if there are disjoint copper shapes */ - if ((proto == NULL) || (proto->all_copper_connd && proto->hplated) || ((pcb_pstk_t *)obj)->term) + if ((proto == NULL) || proto->all_copper_connd || ((pcb_pstk_t *)obj)->term) return 1; mm = pcb_find_get_mm(ctx, obj); @@ -386,7 +386,7 @@ } \ } while(0) -#define PCB_FIND_CHECK_RAT(ctx, curr, obj, ctype, retstmt) \ +#define PCB_FIND_CHECK_RAT_GEO(ctx, curr, obj, ctype, retstmt) \ do { \ pcb_any_obj_t *__obj__ = (pcb_any_obj_t *)obj; \ if (!pcb_find_mark_get(ctx, __obj__, (curr))) { \ @@ -398,6 +398,35 @@ } \ } while(0) +#define PCB_FIND_CHECK_RAT_IDP(ctx, curr, rat, ctype, retstmt) \ + do { \ + int n; \ + pcb_any_obj_t *__obj__ = (pcb_any_obj_t *)rat; \ + for(n = 0; n < 2; n++) { \ + if (pcb_idpath_obj_match(ctx->pcb, rat->anchor[n], curr)) { \ + if (pcb_find_addobj(ctx, __obj__, curr, ctype, ctx->consider_rats) != 0) { retstmt; } \ + if ((__obj__->term != NULL) && (!ctx->ignore_intconn) && (__obj__->intconn > 0)) \ + find_int_conn(ctx, __obj__); \ + } \ + } \ + } while(0) + + +/* If anchors are available, check object idpath against the anchor instead + of fiding intersections; this is safer because other objects on the same + point/layer can be present; corner case: two nointconn lines intersect + at their endpoints and a rat is drawn to one of them - if we go by _GEO(), + the rat's endpoint still connects them! */ +#define PCB_FIND_CHECK_RAT(ctx, curr, obj, ctype, retstmt) \ + do { \ + pcb_rat_t *rat = (pcb_rat_t *)obj; \ + if ((rat->anchor[0] != NULL) && (rat->anchor[1] != NULL)) \ + PCB_FIND_CHECK_RAT_IDP(ctx, curr, rat, ctype, retstmt); \ + else \ + PCB_FIND_CHECK_RAT_GEO(ctx, curr, obj, ctype, retstmt); \ + } while(0) + + void pcb_find_on_layer(pcb_find_t *ctx, pcb_layer_t *l, pcb_any_obj_t *curr, rnd_rtree_box_t *sb, pcb_found_conn_type_t ctype) { rnd_rtree_it_t it; @@ -483,7 +512,7 @@ PCB_FIND_CHECK(ctx, curr, n, ctype, return ctx->nfound); if ((ctx->consider_rats || ctx->only_mark_rats) && (PCB->Data->rat_tree != NULL)) - if (PCB->Data->padstack_tree != NULL) + if (PCB->Data->rat_tree != NULL) for(n = rnd_rtree_first(&it, PCB->Data->rat_tree, sb); n != NULL; n = rnd_rtree_next(&it)) PCB_FIND_CHECK_RAT(ctx, curr, n, PCB_FCT_RAT, return ctx->nfound); diff -Nru pcb-rnd-3.1.0/src/find_geo.c pcb-rnd-3.1.1/src/find_geo.c --- pcb-rnd-3.1.0/src/find_geo.c 2022-09-23 02:46:04.000000000 +0000 +++ pcb-rnd-3.1.1/src/find_geo.c 2023-04-28 02:51:35.000000000 +0000 @@ -5,7 +5,7 @@ * pcb-rnd, interactive printed circuit board design * (this file is based on PCB, interactive printed circuit board design) * Copyright (C) 1994,1995,1996, 2005 Thomas Nau - * pcb-rnd Copyright (C) 2020,2022 Tibor 'Igor2' Palinkas + * pcb-rnd Copyright (C) 2020,2022,2023 Tibor 'Igor2' Palinkas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -268,6 +268,19 @@ return rnd_false; } +/* If anchors are available: return true if obj is one of the two anchors, else + return false. If no anchors, don't do anything */ +#define PCB_ISC_RAT_BY_IDPATH(ctx, rat, obj) \ + do { \ + if ((rat->anchor[0] != NULL) && (rat->anchor[1] != NULL)) { \ + int n; \ + for(n = 0; n < 2; n++) \ + if (pcb_idpath_obj_match(ctx->pcb, rat->anchor[n], (obj))) \ + return rnd_true; \ + return rnd_false; \ + } \ + } while(0) + /* --------------------------------------------------------------------------- * Tests if point is same as line end point or center point */ @@ -293,6 +306,8 @@ { rnd_layergrp_id_t gid = pcb_layer_get_group_(line->parent.layer); + PCB_ISC_RAT_BY_IDPATH(ctx, rat, (pcb_any_obj_t *)line); + if ((rat->group1 == gid) && pcb_isc_ratp_line(ctx, &rat->Point1, line)) return rnd_true; if ((rat->group2 == gid) && pcb_isc_ratp_line(ctx, &rat->Point2, line)) @@ -330,6 +345,8 @@ { rnd_layergrp_id_t gid = pcb_layer_get_group_(arc->parent.layer); + PCB_ISC_RAT_BY_IDPATH(ctx, rat, (pcb_any_obj_t *)arc); + if ((rat->group1 == gid) && pcb_isc_ratp_arc(ctx, &rat->Point1, arc)) return rnd_true; if ((rat->group2 == gid) && pcb_isc_ratp_arc(ctx, &rat->Point2, arc)) @@ -398,6 +415,8 @@ rnd_layergrp_id_t gid = pcb_layer_get_group_(poly->parent.layer); int donut = PCB_FLAG_TEST(PCB_FLAG_VIA, rat); + PCB_ISC_RAT_BY_IDPATH(ctx, rat, (pcb_any_obj_t *)poly); + if ((rat->group1 == gid) && pcb_isc_ratp_poly(ctx, &rat->Point1, poly, donut)) return rnd_true; if ((rat->group2 == gid) && pcb_isc_ratp_poly(ctx, &rat->Point2, poly, donut)) @@ -409,6 +428,10 @@ /* Tests any end of a rat line is on the other rat */ static rnd_bool pcb_isc_rat_rat(const pcb_find_t *ctx, pcb_rat_t *r1, pcb_rat_t *r2) { + +/* Can't do this by idpath: a rat will never have another rat for anchor! + PCB_ISC_RAT_BY_IDPATH(ctx, r1, (pcb_any_obj_t *)r2); */ + if ((r1->group1 == r2->group1) && (r1->Point1.X == r2->Point1.X) && (r1->Point1.Y == r2->Point1.Y)) return rnd_true; if ((r1->group2 == r2->group2) && (r1->Point2.X == r2->Point2.X) && (r1->Point2.Y == r2->Point2.Y)) @@ -1246,10 +1269,10 @@ PCB_ISC_PSTK_ANYLAYER(ps, pcb_isc_pstk_poly_shp(ctx, ps, poly, &tshp->shape[n])); if (PCB_FLAG_TEST(PCB_FLAG_CLEARPOLY, poly) && PCB_FLAG_TEST(PCB_FLAG_CLEARLINE, ps)) { - /* optimization: if there's a clearance between the padstack and the poly, no - need to calculate anything */ + /* optimization: if there's a clearance between the padstack and the poly + and bloat can't overshoot it, no need to calculate anything */ clr = pcb_obj_clearance_at(PCB, (pcb_any_obj_t *)ps, poly->parent.layer); - if ((clr > 0) && (ctx->bloat == 0)) { + if ((clr > 0) && (ctx->bloat <= clr)) { unsigned char *thr = pcb_pstk_get_thermal(ps, pcb_layer2id(PCB->Data, poly->parent.layer), 0); /* but only if there's no thermal that'd connect it through the clearance */ @@ -1420,6 +1443,8 @@ { pcb_board_t *pcb = PCB; + PCB_ISC_RAT_BY_IDPATH(ctx, rat, (pcb_any_obj_t *)ps); + if ((rat->Point1.X == ps->x) && (rat->Point1.Y == ps->y)) { pcb_layer_t *layer = pcb_get_layer(pcb->Data, pcb->LayerGroups.grp[rat->group1].lid[0]); if ((layer != NULL) && (pcb_pstk_shape_at(pcb, ps, layer) != NULL)) diff -Nru pcb-rnd-3.1.0/src/hid_cam.c pcb-rnd-3.1.1/src/hid_cam.c --- pcb-rnd-3.1.0/src/hid_cam.c 2022-11-19 06:39:44.000000000 +0000 +++ pcb-rnd-3.1.1/src/hid_cam.c 2023-03-10 12:25:41.000000000 +0000 @@ -5,7 +5,7 @@ * (this file is based on PCB, interactive printed circuit board design) * Copyright (C) 1994,1995,1996 Thomas Nau * Copyright (C) 2004 harry eaton - * Copyright (C) 2019 Tibor 'Igor2' Palinkas + * Copyright (C) 2019,2023 Tibor 'Igor2' Palinkas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -41,7 +41,9 @@ #include "layer_addr.h" #include "layer_vis.h" #include "plug_io.h" +#include "conf_core.h" #include +#include htsp_t *pcb_cam_vars = NULL; /* substitute %% variables from this hash */ @@ -257,6 +259,12 @@ dst->okempty_group = 1; else if (strcmp(curr, "okempty-content") == 0) dst->okempty_content = 1; + else if (strcmp(curr, "flip_x") == 0) + dst->flip_x = 1; + else if (strcmp(curr, "flip_y") == 0) + dst->flip_y = 1; + else if (strcmp(curr, "force_nonempty") == 0) + dst->force_nonempty = 1; else rnd_message(RND_MSG_ERROR, "CAM: ignoring unknown global parameter [%s]\n", curr); } @@ -340,6 +348,12 @@ } } + if (dst->flip_x) + rnd_conf_force_set_bool(rnd_conf.editor.view.flip_x, 1); + if (dst->flip_y) + rnd_conf_force_set_bool(rnd_conf.editor.view.flip_y, 1); + rnd_conf_force_set_bool(conf_core.editor.show_solder_side, (dst->flip_x ^ dst->flip_y)); + dst->active = 1; return 0; err:; @@ -349,6 +363,13 @@ return -1; } +rnd_bool pcb_cam_layergrp_is_empty(pcb_cam_t *dst, pcb_board_t *PCB, rnd_layergrp_id_t group) +{ + if (dst->force_nonempty) + return 0; + return pcb_layergrp_is_empty(PCB, group); +} + int pcb_cam_end(pcb_cam_t *dst) { free(dst->inst); diff -Nru pcb-rnd-3.1.0/src/hid_cam.h pcb-rnd-3.1.1/src/hid_cam.h --- pcb-rnd-3.1.0/src/hid_cam.h 2022-11-19 06:39:44.000000000 +0000 +++ pcb-rnd-3.1.1/src/hid_cam.h 2023-03-10 12:25:41.000000000 +0000 @@ -21,6 +21,9 @@ unsigned int okempty_content:1; /* do not warn if no objects exported (but group exists) */ unsigned int okempty_group:1; /* do not warn if no group exported */ + unsigned flip_x:1; + unsigned flip_y:1; + unsigned force_nonempty:1; /* export even if layer group is empty */ /* private/internal/cache */ const char *fn_template; @@ -95,4 +98,8 @@ directly, instead of manipulating an attribute */ char *pcb_derive_default_filename_(const char *pcbfile, const char *suffix); +/* Returns whether the layer groups hould be considered empty; most of the times + this matches pcb_layergrp_is_empty(), but cam may override this */ +rnd_bool pcb_cam_layergrp_is_empty(pcb_cam_t *dst, pcb_board_t *PCB, rnd_layergrp_id_t group); + #endif diff -Nru pcb-rnd-3.1.0/src/idpath.c pcb-rnd-3.1.1/src/idpath.c --- pcb-rnd-3.1.0/src/idpath.c 2021-04-15 11:01:30.000000000 +0000 +++ pcb-rnd-3.1.1/src/idpath.c 2023-05-02 03:29:39.000000000 +0000 @@ -3,7 +3,7 @@ * COPYRIGHT * * pcb-rnd, interactive printed circuit board design - * Copyright (C) 2018,2019 Tibor 'Igor2' Palinkas + * Copyright (C) 2018,2019,2023 Tibor 'Igor2' Palinkas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -40,6 +40,7 @@ #include "data.h" #include "layer.h" #include "layer_ui.h" +#include "obj_subc_parent.h" #include static int idpath_map(pcb_idpath_t *idp, pcb_any_obj_t *obj, int level, int *numlevels) @@ -239,8 +240,15 @@ } } +pcb_any_obj_t *pcb_idpath2obj_in_only(pcb_data_t *data, const pcb_idpath_t *path) +{ + return idpath2obj(data, path, 0); +} + pcb_any_obj_t *pcb_idpath2obj_in(pcb_data_t *data, const pcb_idpath_t *path) { + if ((path->data_addr >= 2) && (path->data_addr < PCB_MAX_BUFFER+2)) + data = pcb_buffers[path->data_addr - 2].Data; return idpath2obj(data, path, 0); } @@ -286,3 +294,14 @@ } +rnd_bool pcb_idpath_obj_match(pcb_board_t *pcb, const pcb_idpath_t *path, pcb_any_obj_t *obj) +{ + int n; + for(n = path->len-1; n >= 0; n--) { + if ((obj == NULL) || (obj->ID != path->id[n])) + return 0; + obj = (pcb_any_obj_t *)pcb_obj_parent_subc(obj); + } + + return 1; +} diff -Nru pcb-rnd-3.1.0/src/idpath.h pcb-rnd-3.1.1/src/idpath.h --- pcb-rnd-3.1.0/src/idpath.h 2021-02-27 09:11:26.000000000 +0000 +++ pcb-rnd-3.1.1/src/idpath.h 2023-05-02 03:29:39.000000000 +0000 @@ -3,7 +3,7 @@ * COPYRIGHT * * pcb-rnd, interactive printed circuit board design - * Copyright (C) 2018 Tibor 'Igor2' Palinkas + * Copyright (C) 2018,2023 Tibor 'Igor2' Palinkas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -63,14 +63,24 @@ pcb_idpath_t *pcb_str2idpath(pcb_board_t *pcb, const char *str); /* slash separated list of ids */ char *pcb_idpath2str(const pcb_idpath_t *idp, rnd_bool relative); void pcb_append_idpath(gds_t *dst, const pcb_idpath_t *idp, rnd_bool relative); -pcb_any_obj_t *pcb_idpath2obj_in(pcb_data_t *data, const pcb_idpath_t *path); pcb_idpath_t *pcb_idpath_dup(const pcb_idpath_t *path); void pcb_idpath_destroy(pcb_idpath_t *path); +/* Return path from within data when path is relative or pcb based, or from + within a buffer if path addresses a buffer */ +pcb_any_obj_t *pcb_idpath2obj_in(pcb_data_t *data, const pcb_idpath_t *path); + +/* Return path from within data when path is relative or pcb based, return NULL + if path is pointing into the buffer */ +pcb_any_obj_t *pcb_idpath2obj_in_only(pcb_data_t *data, const pcb_idpath_t *path); + /* Look up self contained path; Refuse unknown root, if pcb is NULL, refuse pcb root. Always has access to the buffers. Returns NULL on error. */ pcb_any_obj_t *pcb_idpath2obj(pcb_board_t *pcb, const pcb_idpath_t *path); void pcb_idpath_list_clear(pcb_idpath_list_t *lst); +/* Returns whether path is the obj's idpath; cheaper than pcb_idpath2obj() */ +rnd_bool pcb_idpath_obj_match(pcb_board_t *pcb, const pcb_idpath_t *path, pcb_any_obj_t *obj); + #endif diff -Nru pcb-rnd-3.1.0/src/layer.c pcb-rnd-3.1.1/src/layer.c --- pcb-rnd-3.1.0/src/layer.c 2022-11-19 16:13:11.000000000 +0000 +++ pcb-rnd-3.1.1/src/layer.c 2023-04-28 05:20:30.000000000 +0000 @@ -4,7 +4,7 @@ * pcb-rnd, interactive printed circuit board design * (this file is based on PCB, interactive printed circuit board design) * Copyright (C) 1994,1995,1996,2004,2006 Thomas Nau - * Copyright (C) 2016, 2017, 2020 Tibor 'Igor2' Palinkas (pcb-rnd extensions) + * Copyright (C) 2016, 2017, 2020, 2023 Tibor 'Igor2' Palinkas (pcb-rnd extensions) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -911,6 +911,30 @@ return lp; } +/* update padstack thermals for layer ID changes on del */ +static void layer_del_update_thermals(pcb_board_t *pcb, rnd_layer_id_t old_index, rnd_bool undoable) +{ + rnd_box_t *b; + rnd_rtree_it_t it; + + if (pcb->Data->padstack_tree == NULL) + return; + + /* thermals are referenced by layer IDs which are going to change now */ + for(b = rnd_r_first(pcb->Data->padstack_tree, &it); b != NULL; b = rnd_r_next(&it)) { + int n; + pcb_pstk_t *ps = (pcb_pstk_t *)b; + for(n = old_index; n < pcb->Data->LayerN-1; n++) { + unsigned char *src = pcb_pstk_get_thermal(ps, n+1, 0); + unsigned char *dst = pcb_pstk_get_thermal(ps, n, 0); + if (src == NULL) + break; + if (*src != *dst) + pcb_pstk_set_thermal(ps, n, *src, undoable); + } + } +} + static int pcb_layer_move_delete_(pcb_board_t *pcb, rnd_layer_id_t old_index, rnd_bool undoable) { rnd_layer_id_t l; @@ -945,6 +969,8 @@ g->lid[n]--; } + layer_del_update_thermals(pcb, old_index, undoable); + /* update visibility */ for(l = old_index; l < pcb->Data->LayerN-1; l++) { pcb_layer_move_(&pcb->Data->Layer[l], &pcb->Data->Layer[l+1]); diff -Nru pcb-rnd-3.1.0/src/Makefile.dep pcb-rnd-3.1.1/src/Makefile.dep --- pcb-rnd-3.1.0/src/Makefile.dep 2022-11-18 11:57:42.000000000 +0000 +++ pcb-rnd-3.1.1/src/Makefile.dep 2023-03-10 12:53:35.000000000 +0000 @@ -652,9 +652,10 @@ board.h data.h crosshair.h route.h buffer.h obj_rat_list.h obj_rat.h \ idpath.h obj_subc_list.h obj_subc.h ../src_3rd/libminuid/libminuid.h \ ht_subc.h obj_pstk_list.h obj_pstk.h vtpadstack.h obj_pstk_shape.h \ - polygon.h vtpadstack_t.h draw.h layer.h layer_vis.h obj_pstk_inlines.h \ - data.h thermal.h operation.h funchash_core.h funchash_core_list.h \ - hid_cam.h ../src_plugins/export_openscad/scad_draw.c \ + polygon.h vtpadstack_t.h data_it.h data.h draw.h layer.h layer_vis.h \ + obj_pstk_inlines.h thermal.h operation.h funchash_core.h \ + funchash_core_list.h hid_cam.h \ + ../src_plugins/export_openscad/scad_draw.c \ ../src_plugins/export_openscad/../lib_polyhelp/topoly.h obj_common.h \ plug_io.h plug_footprint.h ../src_plugins/export_openscad/scad_models.c ../src_plugins/export_png/png.o: ../src_plugins/export_png/png.c \ @@ -2959,7 +2960,8 @@ route.h buffer.h obj_rat_list.h obj_rat.h idpath.h obj_subc_list.h \ obj_subc.h ../src_3rd/libminuid/libminuid.h ht_subc.h obj_pstk_list.h \ obj_pstk.h vtpadstack.h obj_pstk_shape.h polygon.h vtpadstack_t.h \ - hid_cam.h layer_addr.h layer_vis.h plug_io.h plug_footprint.h + hid_cam.h layer_addr.h layer_vis.h plug_io.h plug_footprint.h \ + conf_core.h ht_pstk.o: ht_pstk.c ../config.h ht_pstk.h obj_pstk.h obj_common.h flag.h \ globalconst.h attrib.h global_typedefs.h data_parent.h layer.h \ obj_arc_list.h obj_arc.h obj_line_list.h obj_line.h obj_poly_list.h \ diff -Nru pcb-rnd-3.1.0/src/menu-default.lht pcb-rnd-3.1.1/src/menu-default.lht --- pcb-rnd-3.1.0/src/menu-default.lht 2022-12-17 07:54:23.000000000 +0000 +++ pcb-rnd-3.1.1/src/menu-default.lht 2023-05-10 07:59:11.000000000 +0000 @@ -64,7 +64,7 @@ - ha:Import { li:submenu { - ha:Import schematics... = { action=ImportSch() } + ha:Import schematics... = {a={f;f;s}; action=ImportSch() } ha:Configure import schematics... = { action=ImportSch(dialog) } @import_top ha:Import AnyLoad (or lht config) = { action=AnyLoad() } diff -Nru pcb-rnd-3.1.0/src/obj_gfx.c pcb-rnd-3.1.1/src/obj_gfx.c --- pcb-rnd-3.1.0/src/obj_gfx.c 2023-01-23 12:13:33.000000000 +0000 +++ pcb-rnd-3.1.1/src/obj_gfx.c 2023-04-27 07:37:16.000000000 +0000 @@ -292,7 +292,7 @@ rnd_swap(rnd_angle_t, g->rot, g->gfx->rot); if (g->rot != g->gfx->rot) - g->gfx->pxm_xformed = pcb_pixmap_alloc_insert_transformed(&pcb_pixmaps, g->gfx->pxm_neutral, g->gfx->rot, g->gfx->xmirror, g->gfx->ymirror); + g->gfx->pxm_xformed = pcb_pixmap_alloc_insert_transformed(&pcb_pixmaps, g->gfx->pxm_neutral, g->gfx->rot, g->sx, g->sy, g->gfx->xmirror, g->gfx->ymirror); pcb_gfx_update(g->gfx); pcb_gfx_bbox(g->gfx); @@ -489,7 +489,7 @@ void pcb_gfx_rotate90(pcb_gfx_t *gfx, rnd_coord_t X, rnd_coord_t Y, unsigned Number) { gfx->rot = rnd_normalize_angle(gfx->rot + Number * 90); - gfx->pxm_xformed = pcb_pixmap_alloc_insert_transformed(&pcb_pixmaps, gfx->pxm_neutral, gfx->rot, gfx->xmirror, gfx->ymirror); + gfx->pxm_xformed = pcb_pixmap_alloc_insert_transformed(&pcb_pixmaps, gfx->pxm_neutral, gfx->rot, gfx->sx, gfx->sy, gfx->xmirror, gfx->ymirror); pcb_gfx_update(gfx); pcb_gfx_bbox(gfx); } @@ -500,7 +500,7 @@ rnd_r_delete_entry(layer->gfx_tree, (rnd_box_t *) gfx); gfx->rot = rnd_normalize_angle(gfx->rot + angle); - gfx->pxm_xformed = pcb_pixmap_alloc_insert_transformed(&pcb_pixmaps, gfx->pxm_neutral, gfx->rot, gfx->xmirror, gfx->ymirror); + gfx->pxm_xformed = pcb_pixmap_alloc_insert_transformed(&pcb_pixmaps, gfx->pxm_neutral, gfx->rot, gfx->sx, gfx->sy, gfx->xmirror, gfx->ymirror); pcb_gfx_update(gfx); pcb_gfx_bbox(gfx); @@ -620,7 +620,7 @@ { TODO("gfx: undoable pixmap assign"); gfx->pxm_neutral = pcb_pixmap_insert_neutral_or_free(&pcb_pixmaps, pxm); - gfx->pxm_xformed = pcb_pixmap_alloc_insert_transformed(&pcb_pixmaps, gfx->pxm_neutral, gfx->rot, gfx->xmirror, gfx->ymirror); + gfx->pxm_xformed = pcb_pixmap_alloc_insert_transformed(&pcb_pixmaps, gfx->pxm_neutral, gfx->rot, gfx->sx, gfx->sy, gfx->xmirror, gfx->ymirror); gfx->pxm_id = 0; /* no preference on the ID now */ } @@ -628,7 +628,7 @@ { TODO("gfx: undoable pixmap assign"); gfx->pxm_neutral = pcb_pixmap_insert_neutral_dup(&PCB->hidlib, &pcb_pixmaps, pxm); - gfx->pxm_xformed = pcb_pixmap_alloc_insert_transformed(&pcb_pixmaps, gfx->pxm_neutral, gfx->rot, gfx->xmirror, gfx->ymirror); + gfx->pxm_xformed = pcb_pixmap_alloc_insert_transformed(&pcb_pixmaps, gfx->pxm_neutral, gfx->rot, gfx->sx, gfx->sy, gfx->xmirror, gfx->ymirror); gfx->pxm_id = 0; /* no preference on the ID now */ } diff -Nru pcb-rnd-3.1.0/src/obj_pstk_proto.c pcb-rnd-3.1.1/src/obj_pstk_proto.c --- pcb-rnd-3.1.0/src/obj_pstk_proto.c 2022-01-08 03:11:53.000000000 +0000 +++ pcb-rnd-3.1.1/src/obj_pstk_proto.c 2023-04-27 15:25:37.000000000 +0000 @@ -87,7 +87,7 @@ /* mark each shape with whether it overlaps with the hole/mech shape or not */ hole = pcb_pstk_shape_mech_or_hole_(NULL, dst, &holetmp); - dst->all_copper_connd = (hole != NULL); + dst->all_copper_connd = (hole != NULL) && dst->hplated; for(n = 0; n < ts->len; n++) { if ((ts->shape[n].layer_mask & PCB_LYT_COPPER) && !(ts->shape[n].layer_mask & PCB_LYT_INTERN)) coppers++; diff -Nru pcb-rnd-3.1.0/src/pixmap_pcb.c pcb-rnd-3.1.1/src/pixmap_pcb.c --- pcb-rnd-3.1.0/src/pixmap_pcb.c 2022-11-19 08:55:37.000000000 +0000 +++ pcb-rnd-3.1.1/src/pixmap_pcb.c 2023-04-27 07:37:16.000000000 +0000 @@ -89,17 +89,28 @@ return r; } -rnd_pixmap_t *pcb_pixmap_alloc_insert_transformed(pcb_pixmap_hash_t *pmhash, rnd_pixmap_t *ipm, rnd_angle_t rot, int xmirror, int ymirror) +rnd_pixmap_t *pcb_pixmap_alloc_insert_transformed(pcb_pixmap_hash_t *pmhash, rnd_pixmap_t *ipm, rnd_angle_t rot, rnd_coord_t render_sx, rnd_coord_t render_sy, int xmirror, int ymirror) { rnd_pixmap_t *opm; pcb_xform_mx_t mx = PCB_XFORM_MX_IDENT; pcb_xform_mx_t mxr = PCB_XFORM_MX_IDENT; - long n, len, icx, icy, ocx, ocy, xo, yo, end; + long n, len, icx, icy, ocx, ocy, xo, yo, end, sx1, sx2, sy1, sy2; unsigned char *o, *i; + double scx, iasp, rasp; + int scaled = 0; if ((rot == 0) && !xmirror && !ymirror) return ipm; /* xformed == neutral */ + iasp = (double)ipm->sx / (double)ipm->sy; /* input aspect */ + rasp = (double)render_sx / (double)render_sy; /* rendering aspect */ + + if (fabs(iasp-rasp) > 0.001) { + scx = rasp/iasp; + scaled = 1; + } + + opm = calloc(sizeof(rnd_pixmap_t), 1); if (ipm->has_transp) { opm->tr = ipm->tr; @@ -116,13 +127,27 @@ opm->tr_yscale = 1.0; opm->has_transp = 1; - TODO("gfx: apply mirrors"); + + if (scaled) + pcb_xform_mx_scale(mxr, 1.0/scx, 1.0); + pcb_xform_mx_rotate(mx, rot); pcb_xform_mx_rotate(mxr, -rot); - opm->sx = pcb_xform_x(mx, (ipm->sx/2)+1, (ipm->sy/2)+1) * 2; - opm->sy = pcb_xform_y(mx, -(ipm->sx/2)-1, (ipm->sy/2)-1) * 2; + if (scaled) + pcb_xform_mx_scale(mx, scx, 1.0); + + sx1 = pcb_xform_x(mx, (ipm->sx/2)+1, (ipm->sy/2)+1) * 2; + sx2 = pcb_xform_x(mx, -(ipm->sx/2)-1, +(ipm->sy/2)+1) * 2; + sy1 = pcb_xform_y(mx, -(ipm->sx/2)-1, (ipm->sy/2)-1) * 2; + sy2 = pcb_xform_y(mx, -(ipm->sx/2)-1, -(ipm->sy/2)+1) * 2; + + sx1 = RND_ABS(sx1); sx2 = RND_ABS(sx2); + sy1 = RND_ABS(sy1); sy2 = RND_ABS(sy2); + + opm->sx = sx1 > sx2 ? sx1 : sx2; + opm->sy = sy1 > sy2 ? sy1 : sy2; /* alloc and fill with transparent */ len = opm->sx * opm->sy * 3; @@ -162,7 +187,7 @@ /* out pixel is transparent if out-of-range or input pixel is transparent */ o[0] = opm->tr; o[1] = opm->tg; - o[2] = opm->tb; + o[2] = opm->tb + ROT_DEBUG; } else { o[0] = i[0]; diff -Nru pcb-rnd-3.1.0/src/pixmap_pcb.h pcb-rnd-3.1.1/src/pixmap_pcb.h --- pcb-rnd-3.1.0/src/pixmap_pcb.h 2022-11-19 08:55:37.000000000 +0000 +++ pcb-rnd-3.1.1/src/pixmap_pcb.h 2023-04-27 07:37:16.000000000 +0000 @@ -53,7 +53,7 @@ /* Allocate and render a transformed version of pm (or return the one from cache if already cached */ -rnd_pixmap_t *pcb_pixmap_alloc_insert_transformed(pcb_pixmap_hash_t *pmhash, rnd_pixmap_t *pm, rnd_angle_t rot, int xmirror, int ymirror); +rnd_pixmap_t *pcb_pixmap_alloc_insert_transformed(pcb_pixmap_hash_t *pmhash, rnd_pixmap_t *pm, rnd_angle_t rot, rnd_coord_t render_sx, rnd_coord_t render_sy, int xmirror, int ymirror); /*** global state ***/ diff -Nru pcb-rnd-3.1.0/src/thermal.c pcb-rnd-3.1.1/src/thermal.c --- pcb-rnd-3.1.0/src/thermal.c 2021-09-14 05:59:17.000000000 +0000 +++ pcb-rnd-3.1.1/src/thermal.c 2023-05-17 12:06:03.000000000 +0000 @@ -149,7 +149,7 @@ { pcb_thermal_t res = 0; - if (src[0] == '\0') { + if ((src == NULL) || (src[0] == '\0')) { *dst = 0; return 0; } diff -Nru pcb-rnd-3.1.0/src_3rd/rnd_inclib/dialogs/dlg_library_param.c pcb-rnd-3.1.1/src_3rd/rnd_inclib/dialogs/dlg_library_param.c --- pcb-rnd-3.1.0/src_3rd/rnd_inclib/dialogs/dlg_library_param.c 2022-08-06 15:41:47.000000000 +0000 +++ pcb-rnd-3.1.1/src_3rd/rnd_inclib/dialogs/dlg_library_param.c 2023-02-24 05:02:23.000000000 +0000 @@ -493,6 +493,8 @@ if (filter_txt == NULL) { filter_txt = ctx->example; + if (filter_txt == NULL) /* when there's no example; also happens when the script failed with syntax error */ + return -1; library_set_filter(ctx->lib_ctx, filter_txt); } diff -Nru pcb-rnd-3.1.0/src_plugins/asm/asm.c pcb-rnd-3.1.1/src_plugins/asm/asm.c --- pcb-rnd-3.1.0/src_plugins/asm/asm.c 2022-12-14 08:07:13.000000000 +0000 +++ pcb-rnd-3.1.1/src_plugins/asm/asm.c 2023-03-11 08:50:21.000000000 +0000 @@ -294,6 +294,8 @@ char *grp, *srt; group_t *g; + if (subc->extobj != NULL) continue; + if ((qn != NULL) && asm_extract_exclude(&ec, qn, &qit, data, subc)) continue; diff -Nru pcb-rnd-3.1.0/src_plugins/cam/cam.conf pcb-rnd-3.1.1/src_plugins/cam/cam.conf --- pcb-rnd-3.1.0/src_plugins/cam/cam.conf 2021-02-02 05:17:07.000000000 +0000 +++ pcb-rnd-3.1.1/src_plugins/cam/cam.conf 2023-03-12 07:15:19.000000000 +0000 @@ -7,7 +7,19 @@ desc export top and bottom copper and silk in 600 DPI pngs plugin png --dpi 600 write %base%.top.png=top-copper,top-silk - write %base%.bottom.png=bottom-copper,bottom-silk + write %base%.bottom.png=[flip_y] bottom-copper,bottom-silk + } + doc_eps { + desc export top and bottom copper and silk in colorful embedded ps + plugin eps --enable-flip + write %base%.top.eps=top-copper,top-silk + write %base%.bottom.eps=[flip_y] bottom-copper,bottom-silk + } + doc_ps { + desc export top and bottom copper (faded) and silk (solid) in black&white ps + plugin ps + write %base%.top.ps=top-copper(faded),top-silk + write %base%.bottom.ps=[flip_y] bottom-copper(faded),bottom-silk } {gerber:eagle} { desc gerber export compatible with Eagle's gerber file names @@ -145,6 +157,27 @@ plugin excellon write %base%.xln=[okempty] virtual(purpose=pdrill),virtual(purpose=udrill),mech(purpose=proute),mech(purpose=uroute) } + +# Advanced Circuits, reported by Bdale (untested); same as jlc but force exporting fab + {gerber:advanced_circuits} { + desc gerber export for Advanced Circuits + plugin gerber + write %base%.gtl=top-copper + write %base%.gbl=bottom-copper + write %base%.g%top_offs+1%l=intern-copper + write %base%.gto=top-silk + write %base%.gbo=bottom-silk + write %base%.gts=top-mask + write %base%.gbs=bottom-mask + write %base%.gtp=top-paste + write %base%.gbp=bottom-paste + write %base%.gko=boundary + write %base%.ast=top-virtual(purpose=assy),top-doc(purpose=assy) + write %base%.asb=bottom-virtual(purpose=assy),bottom-doc(purpose=assy) + write %base%.fab=[force_nonempty] virtual(purpose=fab),top-doc(purpose=fab) + plugin excellon + write %base%.xln=[okempty] virtual(purpose=pdrill),virtual(purpose=udrill),mech(purpose=proute),mech(purpose=uroute) + } # protel job tested and contributed by keantoken {gerber:protel} { diff -Nru pcb-rnd-3.1.0/src_plugins/ch_editpoint/ch_editpoint.c pcb-rnd-3.1.1/src_plugins/ch_editpoint/ch_editpoint.c --- pcb-rnd-3.1.0/src_plugins/ch_editpoint/ch_editpoint.c 2022-12-07 14:09:08.000000000 +0000 +++ pcb-rnd-3.1.1/src_plugins/ch_editpoint/ch_editpoint.c 2023-03-10 07:42:27.000000000 +0000 @@ -93,6 +93,34 @@ return NULL; } +/* Undraw the old objects; returns whether anything is removed */ +static int editpoint_undraw(void) +{ + int n, removed = 0; + + for(n = 0; n < old_editpoint_objs->used; n++) { + pcb_any_obj_t *op = old_editpoint_objs->array[n]; + + /* only remove and redraw those which aren't in the new list */ + if (editpoint_find(editpoint_objs, op) != NULL) + continue; + + op->ind_editpoint = 0; + pcb_draw_obj(op); + removed = 1; + } + + return removed; +} + +/* swap old and new endpoint list */ +static void endpoint_swap(void) +{ + vtp0_t *tmp = editpoint_objs; + editpoint_objs = old_editpoint_objs; + old_editpoint_objs = tmp; +} + /* Searches for lines/arcs which have points that are exactly at the given coords and adds them to the object list along with their respective type. */ static void editpoint_work(pcb_crosshair_t *crosshair, rnd_coord_t X, rnd_coord_t Y) @@ -100,12 +128,9 @@ rnd_box_t SearchBox = rnd_point_box(X, Y); int n; rnd_bool redraw = rnd_false; - vtp0_t *tmp; /* swap old and new */ - tmp = editpoint_objs; - editpoint_objs = old_editpoint_objs; - old_editpoint_objs = tmp; + endpoint_swap(); /* Do not truncate to 0 because that may free the array */ vtp0_truncate(editpoint_objs, 1); @@ -122,19 +147,8 @@ } rnd_r_search(PCB->Data->padstack_tree, &SearchBox, NULL, editpoint_callback, crosshair, NULL); - - /* Undraw the old objects */ - for(n = 0; n < old_editpoint_objs->used; n++) { - pcb_any_obj_t *op = old_editpoint_objs->array[n]; - - /* only remove and redraw those which aren't in the new list */ - if (editpoint_find(editpoint_objs, op) != NULL) - continue; - - op->ind_editpoint = 0; - pcb_draw_obj(op); - redraw = rnd_true; - } +/* Undraw the old objects */ + redraw = editpoint_undraw(); /* draw the new objects */ for(n = 0; n < editpoint_objs->used; n++) { @@ -151,22 +165,30 @@ rnd_hid_redraw(&PCB->hidlib); } +static void pcb_editpoint_flush(rnd_design_t *hidlib, void *user_data, int argc, rnd_event_arg_t argv[]) +{ + /* clear all editpoint lists because the old list may hold objects just + deleted; the edit will trigger a redraw anyway */ + editpoint_raw[0].used = editpoint_raw[1].used = 0; +} + static void pcb_ch_editpoint(rnd_design_t *hidlib, void *user_data, int argc, rnd_event_arg_t argv[]) { pcb_crosshair_t *ch = argv[1].d.p; if (conf_ch_editpoint.plugins.ch_editpoint.enable) { const rnd_tool_t *tool = rnd_tool_get(rnd_conf.editor.mode); - if ((tool != NULL) && (tool->user_flags & PCB_TLF_EDIT)) + if ((tool != NULL) && (tool->user_flags & PCB_TLF_EDIT)) { editpoint_work(ch, ch->X, ch->Y); + } + else if (editpoint_objs->used != 0) { + /* schedule endpoints for removal from render */ + endpoint_swap(); + editpoint_undraw(); + pcb_editpoint_flush(hidlib, user_data, argc, argv); + } } } -static void pcb_editpoint_flush(rnd_design_t *hidlib, void *user_data, int argc, rnd_event_arg_t argv[]) -{ - /* clear all editpoint lists because the old list may hold objects just - deleted; the edit will trigger a redraw anyway */ - editpoint_raw[0].used = editpoint_raw[1].used = 0; -} int pplg_check_ver_ch_editpoint(int ver_needed) { return 0; } diff -Nru pcb-rnd-3.1.0/src_plugins/dialogs/dlg_library.c pcb-rnd-3.1.1/src_plugins/dialogs/dlg_library.c --- pcb-rnd-3.1.0/src_plugins/dialogs/dlg_library.c 2022-12-01 02:54:38.000000000 +0000 +++ pcb-rnd-3.1.1/src_plugins/dialogs/dlg_library.c 2023-02-20 17:59:40.000000000 +0000 @@ -134,6 +134,8 @@ " @ ", }; +static void library_filter_reapply(void *hid_ctx, library_ctx_t *ctx); + static void library_update_preview(library_ctx_t *ctx, pcb_subc_t *sc, pcb_fplibrary_t *l) { rnd_box_t bbox; @@ -416,9 +418,10 @@ } } -static void library_filter_cb(void *hid_ctx, void *caller_data, rnd_hid_attribute_t *attr_inp) +static void library_filter_cb(void *hid_ctx, void *caller_data, rnd_hid_attribute_t *attr_inp__) { library_ctx_t *ctx = caller_data; + rnd_hid_attribute_t *attr_inp = &ctx->dlg[ctx->wfilt]; rnd_hid_attribute_t *attr; rnd_hid_tree_t *tree; const char *otext; @@ -430,6 +433,7 @@ attr = &ctx->dlg[ctx->wtree]; tree = attr->wdata; otext = attr_inp->val.str; + if (otext == NULL) otext = ""; text = rnd_strdup(otext); have_filter_text = (*text != '\0'); @@ -514,6 +518,12 @@ free(text); } +static void library_filter_reapply(void *hid_ctx, library_ctx_t *ctx) +{ + library_filter_cb(hid_ctx, ctx, NULL); +} + + static rnd_hid_row_t *find_fp_prefix_(rnd_hid_tree_t *tree, gdl_list_t *rowlist, const char *name, int namelen) { rnd_hid_row_t *r, *pr; @@ -619,8 +629,10 @@ oname = rnd_strdup(l->name); /* need to save the name because refresh invalidates l */ - if (pcb_fp_rehash(&PCB->hidlib, l) == 0) + if (pcb_fp_rehash(&PCB->hidlib, l) == 0) { rnd_message(RND_MSG_INFO, "Refreshed library '%s'\n", oname); + library_filter_reapply(hid_ctx, ctx); + } else rnd_message(RND_MSG_ERROR, "Failed to refresh library '%s'\n", oname); @@ -743,7 +755,7 @@ RND_DAD_BEGIN_HBOX(library_ctx.dlg); RND_DAD_STRING(library_ctx.dlg); RND_DAD_COMPFLAG(library_ctx.dlg, RND_HATF_EXPFILL | RND_HATF_INIT_FOCUS); - RND_DAD_HELP(library_ctx.dlg, "filter: display only footprints matching this text\n(if empty: display all)"); + RND_DAD_HELP(library_ctx.dlg, "filter: display only footprints matching this regex\ncase insensitive\n(if empty: display all)"); RND_DAD_CHANGE_CB(library_ctx.dlg, library_filter_cb); library_ctx.wfilt = RND_DAD_CURRENT(library_ctx.dlg); RND_DAD_PICBUTTON(library_ctx.dlg, xpm_edit_param); diff -Nru pcb-rnd-3.1.0/src_plugins/dialogs/dlg_loadsave.c pcb-rnd-3.1.1/src_plugins/dialogs/dlg_loadsave.c --- pcb-rnd-3.1.0/src_plugins/dialogs/dlg_loadsave.c 2023-01-22 07:11:43.000000000 +0000 +++ pcb-rnd-3.1.1/src_plugins/dialogs/dlg_loadsave.c 2023-05-01 16:54:14.000000000 +0000 @@ -2,7 +2,7 @@ * COPYRIGHT * * pcb-rnd, interactive printed circuit board design - * Copyright (C) 2019 Tibor 'Igor2' Palinkas + * Copyright (C) 2019,2023 Tibor 'Igor2' Palinkas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -59,6 +59,17 @@ static char *last_footprint = NULL, *last_layout = NULL, *last_netlist = NULL; const char *function = "Layout"; char *name = NULL; + static const char *flt_any[] = {"*", "*.*", NULL}; + static const char *pat_lht[] = {"*.rp", "*.lht", NULL}; + static const char *pat_pcb[] = {"*.pcb", NULL}; + static const char *pat_tdx[] = {"*.tdx", NULL}; + static const rnd_hid_fsd_filter_t flt_brd[] = { + {"rp/lihata", "rp/lihata", pat_lht}, + {"pcb", "pcb", pat_pcb}, + {"tEDAx", "tEDAx", pat_tdx}, + {"all", NULL, flt_any}, + {NULL, NULL, NULL} + }; if (last_footprint == NULL) last_footprint = dup_cwd(); if (last_layout == NULL) last_layout = dup_cwd(); @@ -75,9 +86,9 @@ else if ((rnd_strcasecmp(function, "FootprintToBuffer") == 0) || (rnd_strcasecmp(function, "ElementToBuffer") == 0)) name = rnd_hid_fileselect(rnd_gui, "Load footprint to buffer", "Import footprint from file", last_footprint, NULL, NULL, "footprint", RND_HID_FSD_READ, NULL); else if (rnd_strcasecmp(function, "LayoutToBuffer") == 0) - name = rnd_hid_fileselect(rnd_gui, "Load layout to buffer", "load layout (board) to buffer", last_layout, NULL, NULL, "board", RND_HID_FSD_READ, NULL); + name = rnd_hid_fileselect(rnd_gui, "Load layout to buffer", "load layout (board) to buffer", last_layout, NULL, flt_brd, "board", RND_HID_FSD_READ, NULL); else if (rnd_strcasecmp(function, "Layout") == 0) - name = rnd_hid_fileselect(rnd_gui, "Load layout file", "load layout (board) as board to edit", last_layout, NULL, NULL, "board", RND_HID_FSD_READ, NULL); + name = rnd_hid_fileselect(rnd_gui, "Load layout file", "load layout (board) as board to edit", last_layout, NULL, flt_brd, "board", RND_HID_FSD_READ, NULL); else { rnd_message(RND_MSG_ERROR, "Invalid subcommand for Load(): '%s'\n", function); RND_ACT_IRES(1); @@ -385,9 +396,10 @@ const char pcb_acts_Save[] = "Save()\n" - "Save(Layout|LayoutAs)\n" - "Save(AllConnections|AllUnusedPins|ElementConnections)\n" - "Save(PasteBuffer)\n" + "Save(Layout)\n" + "Save(LayoutAs, [path])\n" + "Save(AllConnections|AllUnusedPins|ElementConnections, [path])\n" + "Save(PasteBuffer, [path])\n" "Save(DialogByPattern, pcb|footprint|font|buffer, none|board|fp, prompt, [default_pattern])"; const char pcb_acth_Save[] = "Save layout data to a user-selected file."; /* DOC: save.html */ diff -Nru pcb-rnd-3.1.0/src_plugins/dialogs/dlg_padstack.c pcb-rnd-3.1.1/src_plugins/dialogs/dlg_padstack.c --- pcb-rnd-3.1.0/src_plugins/dialogs/dlg_padstack.c 2022-11-19 09:18:31.000000000 +0000 +++ pcb-rnd-3.1.1/src_plugins/dialogs/dlg_padstack.c 2023-04-28 03:52:26.000000000 +0000 @@ -878,7 +878,9 @@ RND_DAD_LABEL(dlg, "Thermals per layer"); RND_DAD_BEGIN_TABLE(dlg, 2); { + gds_t tmp = {0}; rnd_layergrp_id_t gid; + pse->thermal.len = 0; for(gid = 0; gid < pse->pcb->LayerGroups.len; gid++) { pcb_layergrp_t *g = &pse->pcb->LayerGroups.grp[gid]; @@ -888,7 +890,12 @@ pcb_layer_t *ly = pcb_get_layer(pse->pcb->Data, g->lid[n]); if (ly == NULL) continue; - RND_DAD_LABEL(dlg, ly->name); + + tmp.used = 0; + rnd_append_printf(&tmp, "[%ld] ", (long)g->lid[n]); + gds_append_str(&tmp, ly->name); + RND_DAD_LABEL(dlg, tmp.array); + pse->thermal.lid[pse->thermal.len] = g->lid[n]; RND_DAD_BEGIN_HBOX(dlg); RND_DAD_ENUM(dlg, pcb_thermal_type); @@ -898,6 +905,7 @@ pse->thermal.len++; } } + gds_uninit(&tmp); } RND_DAD_END(dlg); RND_DAD_END(dlg); diff -Nru pcb-rnd-3.1.0/src_plugins/export_bom/bom.c pcb-rnd-3.1.1/src_plugins/export_bom/bom.c --- pcb-rnd-3.1.0/src_plugins/export_bom/bom.c 2022-12-01 04:48:54.000000000 +0000 +++ pcb-rnd-3.1.1/src_plugins/export_bom/bom.c 2023-03-11 08:50:53.000000000 +0000 @@ -191,6 +191,8 @@ PCB_SUBC_LOOP(PCB->Data); { + if (subc->extobj != NULL) continue; + /* insert this component into the bill of materials list */ bom = bom_insert((char *) RND_UNKNOWN(subc->refdes), (char *) RND_UNKNOWN(pcb_subc_name(subc, "bom::footprint")), diff -Nru pcb-rnd-3.1.0/src_plugins/export_fidocadj/fidocadj.c pcb-rnd-3.1.1/src_plugins/export_fidocadj/fidocadj.c --- pcb-rnd-3.1.0/src_plugins/export_fidocadj/fidocadj.c 2022-12-01 04:48:54.000000000 +0000 +++ pcb-rnd-3.1.1/src_plugins/export_fidocadj/fidocadj.c 2023-03-11 08:52:45.000000000 +0000 @@ -310,7 +310,9 @@ PCB_END_LOOP; PCB_SUBC_LOOP(PCB->Data) { - const char *fp = pcb_attribute_get(&subc->Attributes, "footprint"); + const char *fp; + if (subc->extobj != NULL) continue; + fp = pcb_attribute_get(&subc->Attributes, "footprint"); if ((fp != NULL) && have_lib && (htsi_get(&lib_names, fp))) { rnd_coord_t x, y; double rot = 0.0; diff -Nru pcb-rnd-3.1.0/src_plugins/export_gerber/gerber.c pcb-rnd-3.1.1/src_plugins/export_gerber/gerber.c --- pcb-rnd-3.1.0/src_plugins/export_gerber/gerber.c 2022-12-01 14:53:15.000000000 +0000 +++ pcb-rnd-3.1.1/src_plugins/export_gerber/gerber.c 2023-03-10 12:26:18.000000000 +0000 @@ -449,7 +449,7 @@ if (!all_layers) { int stay = 0; - if ((group >= 0) && pcb_layergrp_is_empty(PCB, group) && !(flags & PCB_LYT_SILK)) { + if ((group >= 0) && pcb_cam_layergrp_is_empty(&gerber_cam, PCB, group) && !(flags & PCB_LYT_SILK)) { /* layer is empty and the user didn't want to have empty layers; however; if the user wants to copy the outline to specific layers, those layers will become non-empty: even an empty outline would bring diff -Nru pcb-rnd-3.1.0/src_plugins/export_ipcd356/ipcd356.c pcb-rnd-3.1.1/src_plugins/export_ipcd356/ipcd356.c --- pcb-rnd-3.1.0/src_plugins/export_ipcd356/ipcd356.c 2022-12-01 04:48:54.000000000 +0000 +++ pcb-rnd-3.1.1/src_plugins/export_ipcd356/ipcd356.c 2023-03-11 08:53:14.000000000 +0000 @@ -379,6 +379,8 @@ ipcd356_write_head(&ctx); PCB_SUBC_LOOP(pcb->Data); { + if (subc->extobj != NULL) continue; + TODO("subc: subc-in-subc") PCB_PADSTACK_LOOP(subc->data); { ipcd356_write_pstk(&ctx, subc, padstack); diff -Nru pcb-rnd-3.1.0/src_plugins/export_oldconn/oldconn.c pcb-rnd-3.1.1/src_plugins/export_oldconn/oldconn.c --- pcb-rnd-3.1.0/src_plugins/export_oldconn/oldconn.c 2022-11-20 07:56:54.000000000 +0000 +++ pcb-rnd-3.1.1/src_plugins/export_oldconn/oldconn.c 2023-03-11 08:53:44.000000000 +0000 @@ -198,6 +198,8 @@ { PCB_SUBC_LOOP(PCB->Data); { + if (subc->extobj != NULL) continue; + print_select_unused_subc_terms(f, subc, do_select); } PCB_END_LOOP; diff -Nru pcb-rnd-3.1.0/src_plugins/export_openscad/export_openscad.c pcb-rnd-3.1.1/src_plugins/export_openscad/export_openscad.c --- pcb-rnd-3.1.0/src_plugins/export_openscad/export_openscad.c 2022-12-01 14:53:15.000000000 +0000 +++ pcb-rnd-3.1.1/src_plugins/export_openscad/export_openscad.c 2023-03-19 09:09:34.000000000 +0000 @@ -2,7 +2,7 @@ * COPYRIGHT * * pcb-rnd, interactive printed circuit board design - * Copyright (C) 2017,2020 Tibor 'Igor2' Palinkas + * Copyright (C) 2017,2020,2023 Tibor 'Igor2' Palinkas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -40,6 +40,7 @@ #include #include "board.h" #include "data.h" +#include "data_it.h" #include "draw.h" #include #include "layer.h" @@ -81,6 +82,8 @@ static const char *scad_group_color; static int scad_layer_cnt; static vti0_t scad_comp; +static const char *scad_prefix = "pcb"; +static double board_thickness = 1.6; static rnd_hid_attr_val_t *openscad_options; @@ -114,13 +117,17 @@ RND_HATT_BOOL, 0, 0, {1, 0, 0}, 0}, #define HA_models 4 + {"prefix", "prefix for module names so that multiple exports can be used together", + RND_HATT_STRING, 0, 0, {0, "pcb", 0}, 0}, +#define HA_prefix 5 + {"drill", "enable drilling holes", RND_HATT_BOOL, 0, 0, {1, 0, 0}, 0}, -#define HA_drill 5 +#define HA_drill 6 {"cam", "CAM instruction", RND_HATT_STRING, 0, 0, {0, 0, 0}, 0}, -#define HA_cam 6 +#define HA_cam 7 }; @@ -218,7 +225,7 @@ int id = scad_comp.array[n], is_pos = id > 0; if (id < 0) id = -id; - fprintf(f, " layer_%s_%s_%d();\n", scad_group_name, is_pos ? "pos" : "neg", id); + fprintf(f, " %s_layer_%s_%s_%d();\n", scad_prefix , scad_group_name, is_pos ? "pos" : "neg", id); if ((n > 0) && (n < vti0_len(&scad_comp)-1)) { int id2 = scad_comp.array[n+1]; int p1 = is_pos, p2 = (id2 > 0); @@ -237,11 +244,11 @@ static void scad_close_layer_group() { if (scad_group_name != NULL) { - fprintf(f, "module layer_group_%s() {\n", scad_group_name); + fprintf(f, "module %s_layer_group_%s() {\n", scad_prefix, scad_group_name); scad_dump_comp(); fprintf(f, "}\n\n"); - rnd_append_printf(&layer_group_calls, " layer_group_%s();\n", scad_group_name); + rnd_append_printf(&layer_group_calls, " %s_layer_group_%s();\n", scad_prefix, scad_group_name); scad_group_name = NULL; scad_group_color = NULL; scad_group_level = 0; @@ -264,21 +271,21 @@ if (is_pos) { effective_layer_thickness = layer_thickness; if (scad_group_level > 0) - h = 0.8+((double)scad_group_level*1.1) * effective_layer_thickness; + h = board_thickness/2.0+((double)scad_group_level*1.1) * effective_layer_thickness; else - h = -0.8+((double)scad_group_level*1.1) * effective_layer_thickness; + h = -board_thickness/2.0+((double)scad_group_level*1.1) * effective_layer_thickness; } else { double mult = 2.0; effective_layer_thickness = layer_thickness * mult; if (scad_group_level > 0) - h = 0.8+((double)scad_group_level*1.1) * layer_thickness; + h = board_thickness/2.0+((double)scad_group_level*1.1) * layer_thickness; else - h = -0.8+((double)scad_group_level*1.1) * layer_thickness; + h = -board_thickness/2.0+((double)scad_group_level*1.1) * layer_thickness; h -= effective_layer_thickness/2.0; effective_layer_thickness+=1.0; } - fprintf(f, "module layer_%s_%s_%d() {\n", scad_group_name, is_pos ? "pos" : "neg", scad_layer_cnt); + fprintf(f, "module %s_layer_%s_%s_%d() {\n", scad_prefix, scad_group_name, is_pos ? "pos" : "neg", scad_layer_cnt); fprintf(f, " color([%s])\n", scad_group_color); fprintf(f, " translate([0,0,%f]) {\n", h); layer_open = 1; @@ -296,12 +303,29 @@ scad_group_level = level; } +/* Find the pick and place 0;0 mark, if there is any */ +static void find_origin(rnd_coord_t *ox, rnd_coord_t *oy) +{ + const char *name = "openscad-origin"; + pcb_data_it_t it; + pcb_any_obj_t *obj; + + for(obj = pcb_data_first(&it, PCB->Data, PCB_OBJ_CLASS_REAL); obj != NULL; obj = pcb_data_next(&it)) { + if (pcb_attribute_get(&obj->Attributes, name) != NULL) { + pcb_obj_center(obj, ox, oy); + TRX(*ox); TRY(*oy); + return; + } + } +} + static void openscad_do_export(rnd_hid_t *hid, rnd_design_t *design, rnd_hid_attr_val_t *options, void *appspec) { const char *filename; int save_ons[PCB_MAX_LAYER]; pcb_cam_t cam; + rnd_coord_t ox = 0, oy = 0; if (!options) { openscad_get_export_options(hid, 0, design, appspec); @@ -312,6 +336,22 @@ if (!filename) filename = "pcb.openscad"; + scad_prefix = options[HA_prefix].str; + if (scad_prefix == NULL) + scad_prefix = "pcb"; + + { + rnd_layergrp_id_t from = 0, to = 0; + + pcb_layergrp_list(PCB, PCB_LYT_BOTTOM|PCB_LYT_COPPER, &from, 1); + pcb_layergrp_list(PCB, PCB_LYT_TOP|PCB_LYT_COPPER, &to, 1); + + if (from != to) + board_thickness = RND_COORD_TO_MM(pcb_stack_thickness(PCB, "openscad", PCB_BRDTHICK_PRINT_ERROR, from, 1, to, 0, PCB_LYT_SUBSTRATE|PCB_LYT_COPPER)); + else + board_thickness = 1.6; + } + pcb_cam_begin_nolayer(PCB, &cam, NULL, options[HA_cam].str, &filename); f = rnd_fopen_askovr(&PCB->hidlib, filename, "wb", NULL); @@ -341,7 +381,9 @@ if (options[HA_drill].lng) scad_draw_drills(); - scad_draw_finish(options); + find_origin(&ox, &oy); + + scad_draw_finish(options, ox, oy); pcb_hid_restore_layer_ons(save_ons); @@ -493,7 +535,7 @@ TRX(x2); TRY(y2); fix_rect_coords(); - rnd_fprintf(f, " pcb_fill_rect(%mm, %mm, %mm, %mm, %f, %f);\n", + rnd_fprintf(f, " %s_fill_rect(%mm, %mm, %mm, %mm, %f, %f);\n", scad_prefix, x1, y1, x2, y2, 0.0, effective_layer_thickness); } @@ -513,7 +555,7 @@ else cap_style = "rc"; - rnd_fprintf(f, " pcb_line_%s(%mm, %mm, %mm, %f, %mm, %f);\n", cap_style, + rnd_fprintf(f, " %s_line_%s(%mm, %mm, %mm, %f, %mm, %f);\n", scad_prefix, cap_style, x1, y1, (rnd_coord_t)rnd_round(length), angle * RND_RAD_TO_DEG, gc->width, effective_layer_thickness); } @@ -567,13 +609,13 @@ { TRX(cx); TRY(cy); - rnd_fprintf(f, " pcb_fcirc(%mm, %mm, %mm, %f);\n", cx, cy, radius, effective_layer_thickness); + rnd_fprintf(f, " %s_fcirc(%mm, %mm, %mm, %f);\n", scad_prefix, cx, cy, radius, effective_layer_thickness); } static void openscad_fill_polygon_offs(rnd_hid_gc_t gc, int n_coords, rnd_coord_t *x, rnd_coord_t *y, rnd_coord_t dx, rnd_coord_t dy) { int n; - fprintf(f, " pcb_fill_poly(["); + fprintf(f, " %s_fill_poly([", scad_prefix); for(n = 0; n < n_coords-1; n++) rnd_fprintf(f, "[%mm,%mm],", TRX_(x[n]+dx), TRY_(y[n]+dy)); rnd_fprintf(f, "[%mm,%mm]], %f);\n", TRX_(x[n]+dx), TRY_(y[n]+dy), effective_layer_thickness); diff -Nru pcb-rnd-3.1.0/src_plugins/export_openscad/scad_draw.c pcb-rnd-3.1.1/src_plugins/export_openscad/scad_draw.c --- pcb-rnd-3.1.0/src_plugins/export_openscad/scad_draw.c 2022-11-19 06:39:44.000000000 +0000 +++ pcb-rnd-3.1.1/src_plugins/export_openscad/scad_draw.c 2023-02-08 12:04:42.000000000 +0000 @@ -2,7 +2,7 @@ * COPYRIGHT * * pcb-rnd, interactive printed circuit board design - * Copyright (C) 2017 Tibor 'Igor2' Palinkas + * Copyright (C) 2017,2023 Tibor 'Igor2' Palinkas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -38,7 +38,7 @@ static void scad_draw_primitives(void) { fprintf(f, "// Round cap line\n"); - fprintf(f, "module pcb_line_rc(x1, y1, length, angle, width, thick) {\n"); + fprintf(f, "module %s_line_rc(x1, y1, length, angle, width, thick) {\n", scad_prefix); fprintf(f, " translate([x1,y1,0]) {\n"); fprintf(f, " rotate([0,0,angle]) {\n"); fprintf(f, " translate([length/2, 0, 0])\n"); @@ -51,7 +51,7 @@ fprintf(f, "}\n"); fprintf(f, "// Square cap line\n"); - fprintf(f, "module pcb_line_sc(x1, y1, length, angle, width, thick) {\n"); + fprintf(f, "module %s_line_sc(x1, y1, length, angle, width, thick) {\n", scad_prefix); fprintf(f, " translate([x1,y1,0]) {\n"); fprintf(f, " rotate([0,0,angle]) {\n"); fprintf(f, " translate([length/2, 0, 0])\n"); @@ -61,20 +61,20 @@ fprintf(f, "}\n"); fprintf(f, "// filled rectangle\n"); - fprintf(f, "module pcb_fill_rect(x1, y1, x2, y2, angle, thick) {\n"); + fprintf(f, "module %s_fill_rect(x1, y1, x2, y2, angle, thick) {\n", scad_prefix); fprintf(f, " translate([(x1+x2)/2,(y1+y2)/2,0])\n"); fprintf(f, " rotate([0,0,angle])\n"); fprintf(f, " cube([x2-x1, y2-y1, thick], center=true);\n"); fprintf(f, "}\n"); fprintf(f, "// filled polygon\n"); - fprintf(f, "module pcb_fill_poly(coords, thick) {\n"); + fprintf(f, "module %s_fill_poly(coords, thick) {\n", scad_prefix); fprintf(f, " linear_extrude(height=thick)\n"); fprintf(f, " polygon(coords);\n"); fprintf(f, "}\n"); fprintf(f, "// filled circle\n"); - fprintf(f, "module pcb_fcirc(x1, y1, radius, thick) {\n"); + fprintf(f, "module %s_fcirc(x1, y1, radius, thick) {\n", scad_prefix); fprintf(f, " translate([x1,y1,0])\n"); fprintf(f, " cylinder(r=radius, h=thick, center=true, $fn=30);\n"); fprintf(f, "}\n"); @@ -88,7 +88,7 @@ if (poly == NULL) return -1; - fprintf(f, "module pcb_outline() {\n"); + fprintf(f, "module %s_outline() {\n", scad_prefix); fprintf(f, " polygon([\n\t\t"); /* we need the as-drawn polygon and we know there are no holes */ for(n = 0; n < poly->PointN; n++) @@ -126,7 +126,7 @@ switch(mech->shape) { case PCB_PSSH_POLY: fprintf(f, " translate([0,0,%f])\n", -effective_layer_thickness/2); - fprintf(f, " pcb_fill_poly(["); + fprintf(f, " %s_fill_poly([", scad_prefix); for(n = 0; n < mech->data.poly.len; n++) rnd_fprintf(f, "%s[%mm,%mm]", (n > 0 ? ", " : ""), TRX_(ps->x + mech->data.poly.x[n]), @@ -153,7 +153,7 @@ rnd_rtree_it_t it; rnd_box_t *obj; - fprintf(f, "module pcb_drill() {\n"); + fprintf(f, "module %s_drill() {\n", scad_prefix); for(obj = rnd_r_first(PCB->Data->padstack_tree, &it); obj != NULL; obj = rnd_r_next(&it)) scad_draw_pstk((pcb_pstk_t *)obj); @@ -161,32 +161,42 @@ fprintf(f, "}\n"); } -static void scad_draw_finish(rnd_hid_attr_val_t *options) +static void scad_draw_finish(rnd_hid_attr_val_t *options, rnd_coord_t ox, rnd_coord_t oy) { - fprintf(f, "module pcb_board_main() {\n"); - fprintf(f, " translate ([0, 0, -0.8])\n"); - fprintf(f, " linear_extrude(height=1.6)\n"); - fprintf(f, " pcb_outline();\n"); + int has_origin = (ox != 0) || (oy != 0); + + fprintf(f, "module %s_board_main() {\n", scad_prefix); + fprintf(f, " translate ([0, 0, -%f])\n", board_thickness/2); + fprintf(f, " linear_extrude(height=%f)\n", board_thickness); + fprintf(f, " %s_outline();\n", scad_prefix); fprintf(f, "%s", layer_group_calls.array); fprintf(f, "}\n"); fprintf(f, "\n"); - fprintf(f, "module pcb_board() {\n"); - fprintf(f, " intersection() {\n"); - fprintf(f, " translate ([0, 0, -4])\n"); - fprintf(f, " linear_extrude(height=8)\n"); - fprintf(f, " pcb_outline();\n"); - fprintf(f, " union() {\n"); - fprintf(f, " difference() {\n"); - fprintf(f, " pcb_board_main();\n"); + fprintf(f, "module %s_board() {\n", scad_prefix); + + if (has_origin) + rnd_fprintf(f, " translate([%mm, %mm, 0]) {\n", -ox, -oy); + + fprintf(f, " intersection() {\n"); + fprintf(f, " translate ([0, 0, -%d])\n", (int)(board_thickness+1)*2); + fprintf(f, " linear_extrude(height=%d)\n", (int)(board_thickness+1)*4); + fprintf(f, " %s_outline();\n", scad_prefix); + fprintf(f, " union() {\n"); + fprintf(f, " difference() {\n"); + fprintf(f, " %s_board_main();\n", scad_prefix); if (options[HA_drill].lng) - fprintf(f, " pcb_drill();\n"); + fprintf(f, " %s_drill();\n", scad_prefix); + fprintf(f, " }\n"); fprintf(f, " }\n"); fprintf(f, " }\n"); + fprintf(f, " %s", model_calls.array); + + if (has_origin) fprintf(f, " }\n"); - fprintf(f, "%s", model_calls.array); + fprintf(f, "}\n"); fprintf(f, "\n"); - fprintf(f, "pcb_board();\n"); + fprintf(f, "%s_board();\n", scad_prefix); } diff -Nru pcb-rnd-3.1.0/src_plugins/export_openscad/scad_models.c pcb-rnd-3.1.1/src_plugins/export_openscad/scad_models.c --- pcb-rnd-3.1.0/src_plugins/export_openscad/scad_models.c 2020-08-29 14:11:18.000000000 +0000 +++ pcb-rnd-3.1.1/src_plugins/export_openscad/scad_models.c 2023-02-08 11:05:48.000000000 +0000 @@ -2,7 +2,7 @@ * COPYRIGHT * * pcb-rnd, interactive printed circuit board design - * Copyright (C) 2017 Tibor 'Igor2' Palinkas + * Copyright (C) 2017,2023 Tibor 'Igor2' Palinkas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -55,7 +55,7 @@ while(isspace(*mod)) mod++; if (!isalpha(*mod) && (*mod != '_')) rnd_message(RND_MSG_ERROR, "Openscad model '%s': module name must be in the same line as the module keyword\n", full_path); - fprintf(f, " pcb_part_%s", safe_name); + fprintf(f, " %s_part_%s", scad_prefix, safe_name); par = strchr(mod, '('); if (par != NULL) fprintf(f, "%s", par); @@ -71,7 +71,7 @@ fprintf(f, "%s", buff); } fclose(fin); - rnd_snprintf(buff, sizeof(buff), "pcb_part_%s", safe_name); + rnd_snprintf(buff, sizeof(buff), "%s_part_%s", scad_prefix, safe_name); htsp_set(models, (char *)name, rnd_strdup(buff)); free(safe_name); } @@ -84,7 +84,7 @@ if (ref != NULL) { char tab[] = "\t\t\t\t\t\t\t\t"; int ind = 0; - rnd_append_printf(&model_calls, " translate([%mm,%mm,%c0.8])\n", x0, y0, on_bottom ? '-' : '+'); + rnd_append_printf(&model_calls, " translate([%mm,%mm,%f])\n", x0, y0, on_bottom ? -board_thickness/2.0 : +board_thickness/2.0); ind++; tab[ind] = '\0'; diff -Nru pcb-rnd-3.1.0/src_plugins/export_png/png.c pcb-rnd-3.1.1/src_plugins/export_png/png.c --- pcb-rnd-3.1.0/src_plugins/export_png/png.c 2022-12-01 14:53:15.000000000 +0000 +++ pcb-rnd-3.1.1/src_plugins/export_png/png.c 2023-03-10 08:46:21.000000000 +0000 @@ -390,7 +390,8 @@ if (options[HA_as_shown].lng) pcb_draw_setup_default_gui_xform(xform); if (!options[HA_as_shown].lng) { - rnd_conf_force_set_bool(conf_core.editor.show_solder_side, 0); + if (!png_cam.active) + rnd_conf_force_set_bool(conf_core.editor.show_solder_side, 0); qsort(pcb_layer_stack, pcb_max_layer(PCB), sizeof(pcb_layer_stack[0]), layer_sort); diff -Nru pcb-rnd-3.1.0/src_plugins/export_ps/eps.c pcb-rnd-3.1.1/src_plugins/export_ps/eps.c --- pcb-rnd-3.1.0/src_plugins/export_ps/eps.c 2022-12-01 04:48:54.000000000 +0000 +++ pcb-rnd-3.1.1/src_plugins/export_ps/eps.c 2023-03-10 17:45:03.000000000 +0000 @@ -21,6 +21,7 @@ #include "layer_vis.h" #include #include +#include #include #include @@ -40,7 +41,7 @@ static rnd_eps_t pctx_, *pctx = &pctx_; static int print_group[PCB_MAX_LAYERGRP]; static int print_layer[PCB_MAX_LAYER]; -static int fast_erase = -1; +static int fast_erase = -1, eps_mirx, eps_miry; static const rnd_export_opt_t eps_attribute_list[] = { /* other HIDs expect this to be first. */ @@ -102,9 +103,21 @@ RND_HATT_BOOL, 0, 0, {0, 0, 0}, 0}, #define HA_only_visible 4 +/* %start-doc options "92 Encapsulated Postscript Export" +@ftable @code +@cindex as-shown (EPS) +@item --as-shown +Export layers as shown on screen. +@end ftable +%end-doc +*/ + {"enable-flip", "For historical reasons eps export ignores flip_x and flip_y; unless this option is enabled", + RND_HATT_BOOL, 0, 0, {0, 0, 0}, 0}, +#define HA_enable_flip 5 + {"cam", "CAM instruction", RND_HATT_STRING, 0, 0, {0, 0, 0}, 0}, -#define HA_cam 5 +#define HA_cam 6 }; @@ -227,10 +240,21 @@ qsort(pcb_layer_stack, pcb_max_layer(PCB), sizeof(pcb_layer_stack[0]), layer_sort); } + if (options[HA_enable_flip].lng) { + /* new: accurately copy mirror flags */ + eps_mirx = rnd_conf.editor.view.flip_x; + eps_miry = rnd_conf.editor.view.flip_y; + } + else if (pctx->as_shown) { + /* legacy, kept for compatibility */ + eps_mirx = conf_core.editor.show_solder_side; + eps_miry = 0; + } + rnd_eps_init(pctx, the_file, *bnds, options_[HA_scale].dbl, options[HA_mono].lng, options[HA_as_shown].lng); if (pctx->outf != NULL) - rnd_eps_print_header(pctx, rnd_hid_export_fn(filename), pctx->as_shown && conf_core.editor.show_solder_side, 0); + rnd_eps_print_header(pctx, rnd_hid_export_fn(filename), eps_mirx, eps_miry); if (pctx->as_shown) { /* disable (exporter default) hiding overlay in as_shown */ @@ -247,6 +271,8 @@ memcpy(pcb_layer_stack, saved_layer_stack, sizeof(pcb_layer_stack)); options_ = NULL; + + rnd_conf_update(NULL, -1); /* restore forced sets */ } static void eps_do_export(rnd_hid_t *hid, rnd_design_t *design, rnd_hid_attr_val_t *options, void *appspec) @@ -322,7 +348,8 @@ fclose(pctx->outf); } pctx->outf = rnd_fopen_askovr(&PCB->hidlib, eps_cam.fn, "w", NULL); - rnd_eps_print_header(pctx, eps_cam.fn, pctx->as_shown && conf_core.editor.show_solder_side, 0); + + rnd_eps_print_header(pctx, eps_cam.fn, eps_mirx, eps_miry); } if (!eps_cam.active) { @@ -332,7 +359,7 @@ if (PCB_LAYER_IS_ASSY(flags, purpi) || PCB_LAYER_IS_FAB(flags, purpi) || PCB_LAYER_IS_CSECT(flags, purpi) || (flags & PCB_LYT_INVIS)) return 0; - if ((group >= 0) && pcb_layergrp_is_empty(PCB, group) && PCB_LAYER_IS_ROUTE(flags, purpi)) + if ((group >= 0) && pcb_cam_layergrp_is_empty(&eps_cam, PCB, group) && PCB_LAYER_IS_ROUTE(flags, purpi)) return 0; } diff -Nru pcb-rnd-3.1.0/src_plugins/export_ps/ps.c pcb-rnd-3.1.1/src_plugins/export_ps/ps.c --- pcb-rnd-3.1.0/src_plugins/export_ps/ps.c 2022-12-12 04:27:34.000000000 +0000 +++ pcb-rnd-3.1.1/src_plugins/export_ps/ps.c 2023-03-10 17:45:03.000000000 +0000 @@ -431,6 +431,8 @@ rnd_ps_end_pages(&global.ps); memcpy(pcb_layer_stack, saved_layer_stack, sizeof(pcb_layer_stack)); + + rnd_conf_update(NULL, -1); /* restore forced sets */ } static void ps_do_export(rnd_hid_t *hid, rnd_design_t *design, rnd_hid_attr_val_t *options, void *appspec) @@ -505,6 +507,8 @@ return rnd_hid_parse_command_line(argc, argv); } +extern int rnd_ps_faded; + static int ps_set_layer_group(rnd_hid_t *hid, rnd_design_t *design, rnd_layergrp_id_t group, const char *purpose, int purpi, rnd_layer_id_t layer, unsigned int flags, int is_empty, rnd_xform_t **xform) { gds_t tmp_ln; @@ -524,7 +528,7 @@ if (is_empty) return 0; - if ((group >= 0) && pcb_layergrp_is_empty(PCB, group)) + if ((group >= 0) && pcb_cam_layergrp_is_empty(&ps_cam, PCB, group)) return 0; } @@ -544,6 +548,7 @@ global.is_assy = PCB_LAYER_IS_ASSY(flags, purpi); global.is_copper = !!(flags & PCB_LYT_COPPER); global.is_paste = !!(flags & PCB_LYT_PASTE); + rnd_ps_faded = ((xform != NULL) && (*xform != NULL) && (*xform)->layer_faded); #if 0 printf("Layer %s group %d drill %d mask %d\n", name, group, global.ps.is_drill, global.ps.is_mask); diff -Nru pcb-rnd-3.1.0/src_plugins/export_stl/export_stl.c pcb-rnd-3.1.1/src_plugins/export_stl/export_stl.c --- pcb-rnd-3.1.0/src_plugins/export_stl/export_stl.c 2022-12-01 04:48:54.000000000 +0000 +++ pcb-rnd-3.1.1/src_plugins/export_stl/export_stl.c 2023-04-28 10:26:58.000000000 +0000 @@ -2,7 +2,7 @@ * COPYRIGHT * * pcb-rnd, interactive printed circuit board design - * Copyright (C) 2019,2020 Tibor 'Igor2' Palinkas + * Copyright (C) 2019,2020,2023 Tibor 'Igor2' Palinkas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -90,7 +90,9 @@ #define NUM_OPTIONS (sizeof(stl_attribute_list)/sizeof(stl_attribute_list[0])) -static rnd_hid_attr_val_t stl_values[NUM_OPTIONS]; +static rnd_hid_attr_val_t stl_values_[NUM_OPTIONS]; +static rnd_hid_attr_val_t amf_values_[NUM_OPTIONS]; +static rnd_hid_attr_val_t proj_values_[NUM_OPTIONS]; static long pa_len(const rnd_polyarea_t *pa) { @@ -259,10 +261,16 @@ int purpi = pcb_layer_purpose(pcb, lid, NULL); pcb_layer_t *layer = &pcb->Data->Layer[lid]; pcb_poly_t *poly; + pcb_line_t *line; + pcb_arc_t *arc; + rnd_rtree_it_t it; + if (!PCB_LAYER_IS_ROUTE(lyt, purpi)) continue; /* rnd_trace("Outline [%ld]\n", lid);*/ - PCB_LINE_LOOP(layer) { + + if (layer->line_tree != NULL) + for(line = rnd_rtree_all_first(&it, layer->line_tree); line != NULL; line = rnd_rtree_all_next(&it)) { if (PCB_DFLAG_TEST(&line->Flags, df)) continue; /* object already found - either as outline or as a cutout */ poly = pcb_topoly_conn_with(pcb, (pcb_any_obj_t *)line, PCB_TOPOLY_FLOATING, df); if (poly != NULL) { @@ -272,15 +280,18 @@ else rnd_message(RND_MSG_ERROR, "Cutout error: need closed loops; cutout omitted\n(Hint: use the wireframe draw mode to see broken connections; use a coarse grid and snap to fix them up!)\n"); /* rnd_trace(" line: %ld %d -> %p\n", line->ID, PCB_DFLAG_TEST(&line->Flags, df), poly);*/ - } PCB_END_LOOP; - PCB_ARC_LOOP(layer) { + } + + if (layer->arc_tree != NULL) + for(arc = rnd_rtree_all_first(&it, layer->arc_tree); arc != NULL; arc = rnd_rtree_all_next(&it)) { if (PCB_DFLAG_TEST(&arc->Flags, df)) continue; /* object already found - either as outline or as a cutout */ poly = pcb_topoly_conn_with(pcb, (pcb_any_obj_t *)arc, PCB_TOPOLY_FLOATING, df); vtp0_append(cutouts, poly); cnt += poly_len(poly); /* rnd_trace(" arc: %ld %d -> %p\n", arc->ID, PCB_DFLAG_TEST(&arc->Flags, df), poly);*/ - } PCB_END_LOOP; + } } + return cnt; } @@ -363,13 +374,13 @@ stl_facet_t *(*model_load)(rnd_design_t *hl, FILE *f, const char *fn); } stl_fmt_t; -static const rnd_export_opt_t *stl_get_export_options_(rnd_hid_t *hid, int *n, const stl_fmt_t *fmt, rnd_design_t *dsg, void *appspec) +static const rnd_export_opt_t *stl_get_export_options_(rnd_hid_t *hid, int *n, const stl_fmt_t *fmt, rnd_hid_attr_val_t *values, rnd_design_t *dsg, void *appspec) { const char *suffix = fmt->suffix; - const char *val = stl_values[HA_stlfile].str; + const char *val = values[HA_stlfile].str; if ((dsg != NULL) && ((val == NULL) || (*val == '\0'))) - pcb_derive_default_filename(dsg->loadname, &stl_values[HA_stlfile], suffix); + pcb_derive_default_filename(dsg->loadname, &values[HA_stlfile], suffix); if (n) *n = NUM_OPTIONS; @@ -389,17 +400,17 @@ static const rnd_export_opt_t *stl_get_export_options(rnd_hid_t *hid, int *n, rnd_design_t *dsg, void *appspec) { - return stl_get_export_options_(hid, n, &fmt_stl, dsg, appspec); + return stl_get_export_options_(hid, n, &fmt_stl, stl_values_, dsg, appspec); } static const rnd_export_opt_t *amf_get_export_options(rnd_hid_t *hid, int *n, rnd_design_t *dsg, void *appspec) { - return stl_get_export_options_(hid, n, &fmt_amf, dsg, appspec); + return stl_get_export_options_(hid, n, &fmt_amf, amf_values_, dsg, appspec); } static const rnd_export_opt_t *proj_get_export_options(rnd_hid_t *hid, int *n, rnd_design_t *dsg, void *appspec) { - return stl_get_export_options_(hid, n, &fmt_proj, dsg, appspec); + return stl_get_export_options_(hid, n, &fmt_proj, proj_values_, dsg, appspec); } static int stl_hid_export_to_file(FILE *f, rnd_hid_attr_val_t *options, rnd_coord_t maxy, rnd_coord_t z0, rnd_coord_t z1, const stl_fmt_t *fmt) @@ -442,7 +453,7 @@ contlen = pa_len(brdpoly->Clipped); mem_req = fp2t_memory_required(contlen + pstk_points + cutout_points); mem = calloc(mem_req, 1); - if (!fp2t_init(&tri, mem, contlen + pstk_points)) { + if (!fp2t_init(&tri, mem, contlen + pstk_points + cutout_points)) { free(mem); pcb_poly_free(brdpoly); pcb_dynflag_free(df); @@ -512,9 +523,9 @@ fmt->print_footer(f); - vtp0_uninit(&cutouts); for(n = 0; n < cutouts.used; n++) pcb_poly_free((pcb_poly_t *)cutouts.array[n]); + vtp0_uninit(&cutouts); vtd0_uninit(&contours); free(mem); pcb_poly_free(brdpoly); @@ -522,7 +533,7 @@ return 0; } -static void stl_do_export_(rnd_hid_t *hid, rnd_hid_attr_val_t *options, const stl_fmt_t *fmt, rnd_design_t *dsg, void *appspec) +static void stl_do_export_(rnd_hid_t *hid, rnd_hid_attr_val_t *options, const stl_fmt_t *fmt, rnd_hid_attr_val_t *values, rnd_design_t *dsg, void *appspec) { const char *filename; pcb_cam_t cam; @@ -530,8 +541,8 @@ rnd_coord_t thick; if (!options) { - stl_get_export_options_(hid, 0, fmt, dsg, appspec); - options = stl_values; + stl_get_export_options_(hid, 0, fmt, values, dsg, appspec); + options = values; } filename = options[HA_stlfile].str; @@ -565,17 +576,17 @@ static void stl_do_export(rnd_hid_t *hid, rnd_design_t *design, rnd_hid_attr_val_t *options, void *appspec) { - stl_do_export_(hid, options, &fmt_stl, design, appspec); + stl_do_export_(hid, options, &fmt_stl, stl_values_, design, appspec); } static void amf_do_export(rnd_hid_t *hid, rnd_design_t *design, rnd_hid_attr_val_t *options, void *appspec) { - stl_do_export_(hid, options, &fmt_amf, design, appspec); + stl_do_export_(hid, options, &fmt_amf, amf_values_, design, appspec); } static void proj_do_export(rnd_hid_t *hid, rnd_design_t *design, rnd_hid_attr_val_t *options, void *appspec) { - stl_do_export_(hid, options, &fmt_proj, design, appspec); + stl_do_export_(hid, options, &fmt_proj, proj_values_, design, appspec); } static int stl_parse_arguments(rnd_hid_t *hid, int *argc, char ***argv) @@ -619,7 +630,7 @@ stl_hid.get_export_options = stl_get_export_options; stl_hid.do_export = stl_do_export; stl_hid.parse_arguments = stl_parse_arguments; - stl_hid.argument_array = stl_values; + stl_hid.argument_array = stl_values_; stl_hid.usage = stl_usage; @@ -632,6 +643,7 @@ amf_hid.description = "export board outline in 3-dimensional AMF"; amf_hid.get_export_options = amf_get_export_options; amf_hid.do_export = amf_do_export; + amf_hid.argument_array = amf_values_; rnd_hid_register_hid(&amf_hid); rnd_hid_load_defaults(&amf_hid, stl_attribute_list, NUM_OPTIONS); @@ -642,6 +654,7 @@ proj_hid.description = "export board outline as a projector(1) object for 3d rendering"; proj_hid.get_export_options = proj_get_export_options; proj_hid.do_export = proj_do_export; + proj_hid.argument_array = proj_values_; rnd_hid_register_hid(&proj_hid); rnd_hid_load_defaults(&proj_hid, stl_attribute_list, NUM_OPTIONS); diff -Nru pcb-rnd-3.1.0/src_plugins/export_stl/stl_models.c pcb-rnd-3.1.1/src_plugins/export_stl/stl_models.c --- pcb-rnd-3.1.0/src_plugins/export_stl/stl_models.c 2022-11-19 08:55:37.000000000 +0000 +++ pcb-rnd-3.1.1/src_plugins/export_stl/stl_models.c 2023-03-11 08:56:08.000000000 +0000 @@ -247,6 +247,8 @@ PCB_SUBC_LOOP(PCB->Data); { int good = 0; + if (subc->extobj != NULL) continue; + if (stl_model_print(pcb, outf, maxy, z0, z1, &models, subc, &first, fmt, fmt) != 0) { const stl_fmt_t **n; /* fallback: try all other formats */ for(n = fmt_all; *n != NULL; n++) { diff -Nru pcb-rnd-3.1.0/src_plugins/export_xy/xy.c pcb-rnd-3.1.1/src_plugins/export_xy/xy.c --- pcb-rnd-3.1.0/src_plugins/export_xy/xy.c 2022-12-01 04:48:54.000000000 +0000 +++ pcb-rnd-3.1.1/src_plugins/export_xy/xy.c 2023-05-10 11:37:58.000000000 +0000 @@ -832,6 +832,9 @@ pcb_any_obj_t *o; pcb_data_it_t it; int bott; + + if (subc->extobj != NULL) continue; + ctx.count++; ctx.pad_w = ctx.pad_h = 0; @@ -975,7 +978,9 @@ static int xy_usage(rnd_hid_t *hid, const char *topic) { + int n; fprintf(stderr, "\nXY exporter command line arguments:\n\n"); + xy_get_export_options(hid, &n, NULL, NULL); rnd_hid_usage(xy_options, sizeof(xy_options) / sizeof(xy_options[0])); fprintf(stderr, "\nUsage: pcb-rnd [generic_options] -x xy [xy_options] foo.pcb\n\n"); return 0; @@ -984,6 +989,11 @@ static int xy_parse_arguments(rnd_hid_t *hid, int *argc, char ***argv) { rnd_export_register_opts2(hid, xy_options, sizeof(xy_options) / sizeof(xy_options[0]), xy_cookie, 0); + + /* when called from the export() command this field may be uninitialized yet */ + if (xy_options[HA_format].enumerations == NULL) + xy_get_export_options(hid, NULL, NULL, NULL); + return rnd_hid_parse_command_line(argc, argv); } diff -Nru pcb-rnd-3.1.0/src_plugins/oldactions/oldactions.c pcb-rnd-3.1.1/src_plugins/oldactions/oldactions.c --- pcb-rnd-3.1.0/src_plugins/oldactions/oldactions.c 2022-12-04 03:46:55.000000000 +0000 +++ pcb-rnd-3.1.1/src_plugins/oldactions/oldactions.c 2023-03-11 09:00:27.000000000 +0000 @@ -236,6 +236,9 @@ { double rot; const char *refdes = RND_UNKNOWN(subc->refdes); + + if (subc->extobj != NULL) continue; + if (pcb_subc_get_rotation(subc, &rot) == 0) rnd_message(RND_MSG_INFO, "%f %s\n", rot, refdes); else diff -Nru pcb-rnd-3.1.0/src_plugins/propedit/propdlg.c pcb-rnd-3.1.1/src_plugins/propedit/propdlg.c --- pcb-rnd-3.1.0/src_plugins/propedit/propdlg.c 2022-12-15 06:40:14.000000000 +0000 +++ pcb-rnd-3.1.1/src_plugins/propedit/propdlg.c 2023-02-09 04:21:59.000000000 +0000 @@ -2,7 +2,7 @@ * COPYRIGHT * * pcb-rnd, interactive printed circuit board design - * Copyright (C) 2018 Tibor 'Igor2' Palinkas + * Copyright (C) 2018,2023 Tibor 'Igor2' Palinkas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -507,6 +507,11 @@ prop_data_cb(hid_ctx, caller_data, attr, 1); } +static void prop_attr_enter_pressed_cb(void *hid_ctx, void *caller_data, rnd_hid_attribute_t *attr) +{ + rnd_dad_retovr_t **retovr = caller_data; + rnd_hid_dad_close(hid_ctx, *retovr, 0); +} static void prop_add_cb(void *hid_ctx, void *caller_data, rnd_hid_attribute_t *attr) { @@ -525,10 +530,11 @@ RND_DAD_LABEL(dlg, "Attribute value:"); RND_DAD_STRING(dlg); wval = RND_DAD_CURRENT(dlg); + RND_DAD_ENTER_CB(dlg, prop_attr_enter_pressed_cb); RND_DAD_END(dlg); RND_DAD_BUTTON_CLOSES(dlg, clbtn); RND_DAD_END(dlg); - RND_DAD_AUTORUN("propedit_add", dlg, "Propedit: add new attribute", NULL, failed); + RND_DAD_AUTORUN("propedit_add", dlg, "Propedit: add new attribute", &dlg_ret_override, failed); key = dlg[wkey].val.str; if (key == NULL) key = ""; diff -Nru pcb-rnd-3.1.0/src_plugins/propedit/propedit.c pcb-rnd-3.1.1/src_plugins/propedit/propedit.c --- pcb-rnd-3.1.0/src_plugins/propedit/propedit.c 2021-01-30 07:31:35.000000000 +0000 +++ pcb-rnd-3.1.1/src_plugins/propedit/propedit.c 2023-02-10 12:28:25.000000000 +0000 @@ -176,7 +176,7 @@ extern rnd_layergrp_id_t pcb_actd_EditGroup_gid; static const char pcb_acts_propset[] = "propset([scope], name, value)"; -static const char pcb_acth_propset[] = "Change the named property of scope or all selected objects to/by value. Scope is documented at PropEdit()."; +static const char pcb_acth_propset[] = "Change the named property of scope or all selected objects to/by value. Scope is documented at PropEdit(). Existing attributes can be renamed to value by using a name rename/a/old_name, where old_name is the current name of the attribute."; fgw_error_t pcb_act_propset(fgw_arg_t *res, int argc, fgw_arg_t *argv) { const char *first, *name, *val; diff -Nru pcb-rnd-3.1.0/src_plugins/propedit/propsel.c pcb-rnd-3.1.1/src_plugins/propedit/propsel.c --- pcb-rnd-3.1.0/src_plugins/propedit/propsel.c 2022-11-27 04:31:59.000000000 +0000 +++ pcb-rnd-3.1.1/src_plugins/propedit/propsel.c 2023-03-10 06:22:30.000000000 +0000 @@ -2,7 +2,7 @@ * COPYRIGHT * * pcb-rnd, interactive printed circuit board design - * Copyright (C) 2016,2018,2019,2020 Tibor 'Igor2' Palinkas + * Copyright (C) 2016,2018,2019,2020,2023 Tibor 'Igor2' Palinkas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -457,10 +457,17 @@ } orig = pcb_attribute_get(list, key); - if ((orig != NULL) && (strcmp(orig, st->s) == 0)) - return; - - pcb_attribute_put(list, key, st->s); + if (st->arename) { + if (strcmp(st->s, key) == 0) + return; + pcb_attribute_put(list, st->s, orig); + pcb_attribute_remove(list, key); + } + else { + if ((orig != NULL) && (strcmp(orig, st->s) == 0)) + return; + pcb_attribute_put(list, key, st->s); + } st->set_cnt++; } @@ -469,6 +476,9 @@ const char *key = st->name+2; int side_effect, res; + if (st->arename && (strcmp(st->s, key) == 0)) + return; + if (st->toggle) { toggle_attr(st, &obj->Attributes, 1, obj); return; @@ -478,7 +488,20 @@ if (side_effect) pcb_obj_pre(obj); - res = pcb_uchg_attr(st->pcb, obj, key, st->s); + + if (st->arename) { + const char *orig = pcb_attribute_get(&obj->Attributes, key); + if (orig != NULL) { + res = pcb_uchg_attr(st->pcb, obj, st->s, orig); + if (res == 0) + res = pcb_uchg_attr(st->pcb, obj, key, NULL); + } + else + res = -1; + } + else + res = pcb_uchg_attr(st->pcb, obj, key, st->s); + if (side_effect) { pcb_obj_update_bbox(st->pcb, obj); pcb_obj_post(obj); @@ -670,25 +693,37 @@ op.move.pcb = st->pcb; pn = st->name + 7; if (st->c_valid && (strcmp(pn, "x1") == 0)) { - op.move.dx = st->c - line->Point1.X; + if (st->c_absolute) + op.move.dx = st->c - line->Point1.X; + else + op.move.dx = st->c; pcb_undo_add_obj_to_move(PCB_OBJ_LINE_POINT, line->parent.layer, line, &line->Point1, op.move.dx, op.move.dy); if (pcb_lineop_move_point(&op, line->parent.layer, line, &line->Point1) != NULL) DONE; } if (st->c_valid && (strcmp(pn, "y1") == 0)) { - op.move.dy = st->c - line->Point1.Y; + if (st->c_absolute) + op.move.dy = st->c - line->Point1.Y; + else + op.move.dy = st->c; pcb_undo_add_obj_to_move(PCB_OBJ_LINE_POINT, line->parent.layer, line, &line->Point1, op.move.dx, op.move.dy); if (pcb_lineop_move_point(&op, line->parent.layer, line, &line->Point1) != NULL) DONE; } if (st->c_valid && (strcmp(pn, "x2") == 0)) { - op.move.dx = st->c - line->Point2.X; + if (st->c_absolute) + op.move.dx = st->c - line->Point2.X; + else + op.move.dx = st->c; pcb_undo_add_obj_to_move(PCB_OBJ_LINE_POINT, line->parent.layer, line, &line->Point2, op.move.dx, op.move.dy); if (pcb_lineop_move_point(&op, line->parent.layer, line, &line->Point2) != NULL) DONE; } if (st->c_valid && (strcmp(pn, "y2") == 0)) { - op.move.dy = st->c - line->Point2.Y; + if (st->c_absolute) + op.move.dy = st->c - line->Point2.Y; + else + op.move.dy = st->c; pcb_undo_add_obj_to_move(PCB_OBJ_LINE_POINT, line->parent.layer, line, &line->Point2, op.move.dx, op.move.dy); if (pcb_lineop_move_point(&op, line->parent.layer, line, &line->Point2) != NULL) DONE; @@ -739,13 +774,19 @@ op.move.pcb = st->pcb; pn = st->name + 6; if (st->c_valid && (strcmp(pn, "x") == 0)) { - op.move.dx = st->c - arc->X; + if (st->c_absolute) + op.move.dx = st->c - arc->X; + else + op.move.dx = st->c; pcb_undo_add_obj_to_move(PCB_OBJ_ARC, arc->parent.layer, arc, arc, op.move.dx, op.move.dy); if (pcb_arcop_move(&op, arc->parent.layer, arc) != NULL) DONE; } if (st->c_valid && (strcmp(pn, "y") == 0)) { - op.move.dy = st->c - arc->Y; + if (st->c_absolute) + op.move.dy = st->c - arc->Y; + else + op.move.dy = st->c; pcb_undo_add_obj_to_move(PCB_OBJ_ARC, arc->parent.layer, arc, arc, op.move.dx, op.move.dy); if (pcb_arcop_move(&op, arc->parent.layer, arc) != NULL) DONE; @@ -830,13 +871,19 @@ memset(&op, 0, sizeof(op)); op.move.pcb = st->pcb; if (st->c_valid && (strcmp(pn, "x") == 0)) { - op.move.dx = st->c - text->X; + if (st->c_absolute) + op.move.dx = st->c - text->X; + else + op.move.dx = st->c; pcb_undo_add_obj_to_move(PCB_OBJ_TEXT, text->parent.layer, text, text, op.move.dx, op.move.dy); if (pcb_textop_move(&op, text->parent.layer, text) != NULL) DONE; } if (st->c_valid && (strcmp(pn, "y") == 0)) { - op.move.dy = st->c - text->Y; + if (st->c_absolute) + op.move.dy = st->c - text->Y; + else + op.move.dy = st->c; pcb_undo_add_obj_to_move(PCB_OBJ_TEXT, text->parent.layer, text, text, op.move.dx, op.move.dy); if (pcb_textop_move(&op, text->parent.layer, text) != NULL) DONE; @@ -941,13 +988,19 @@ memset(&op, 0, sizeof(op)); op.move.pcb = st->pcb; if (st->c_valid && (strcmp(pn, "x") == 0)) { - op.move.dx = st->c - ps->x; + if (st->c_absolute) + op.move.dx = st->c - ps->x; + else + op.move.dx = st->c; pcb_undo_add_obj_to_move(PCB_OBJ_PSTK, ps->parent.data, ps, ps, op.move.dx, op.move.dy); if (pcb_pstkop_move(&op, ps) != NULL) DONE; } if (st->c_valid && (strcmp(pn, "y") == 0)) { - op.move.dy = st->c - ps->y; + if (st->c_absolute) + op.move.dy = st->c - ps->y; + else + op.move.dy = st->c; pcb_undo_add_obj_to_move(PCB_OBJ_PSTK, ps->parent.data, ps, ps, op.move.dx, op.move.dy); if (pcb_pstkop_move(&op, ps) != NULL) DONE; @@ -1004,13 +1057,19 @@ memset(&op, 0, sizeof(op)); op.move.pcb = st->pcb; if (st->c_valid && (strcmp(pn, "x") == 0)) { - op.move.dx = st->c - x; + if (st->c_absolute) + op.move.dx = st->c - x; + else + op.move.dx = st->c; pcb_undo_add_obj_to_move(PCB_OBJ_SUBC, ssubc->parent.data, ssubc, ssubc, op.move.dx, op.move.dy); if (pcb_subcop_move(&op, ssubc) != NULL) DONE; } if (st->c_valid && (strcmp(pn, "y") == 0)) { - op.move.dy = st->c - y; + if (st->c_absolute) + op.move.dy = st->c - y; + else + op.move.dy = st->c; pcb_undo_add_obj_to_move(PCB_OBJ_SUBC, ssubc->parent.data, ssubc, ssubc, op.move.dx, op.move.dy); if (pcb_subcop_move(&op, ssubc) != NULL) DONE; @@ -1086,18 +1145,21 @@ int pcb_propsel_set_str(pcb_propedit_t *ctx, const char *prop, const char *value) { - pcb_propset_ctx_t sctx; + pcb_propset_ctx_t sctx = {0}; char *end; const char *start; + if ((prop[0] == 'r') && (strncmp(prop, "rename/a/", 9)) == 0) { + sctx.arename = 1; + prop += 7; + } + /* sanity checks for invalid props */ if ((prop[1] != '/') || ((prop[0] != 'a') && (prop[0] != 'p'))) { rnd_message(RND_MSG_ERROR, "Invalid property path: '%s':\n must start with p/ for property or a/ for attribute\n", prop); return 0; } - memset(&sctx, 0, sizeof(sctx)); - if (value == NULL) value = ""; sctx.s = value; diff -Nru pcb-rnd-3.1.0/src_plugins/propedit/propsel.h pcb-rnd-3.1.1/src_plugins/propedit/propsel.h --- pcb-rnd-3.1.0/src_plugins/propedit/propsel.h 2020-05-04 10:27:45.000000000 +0000 +++ pcb-rnd-3.1.1/src_plugins/propedit/propsel.h 2023-02-10 12:28:25.000000000 +0000 @@ -35,6 +35,7 @@ rnd_bool c_absolute, d_absolute, c_valid, d_valid, clr_valid; unsigned toggle:1; /* when 1, ignore value and attempt to toggle */ unsigned toggle_create:1; /* when 1, create non-existing attribute on toggle, with value true */ + unsigned arename:1; /* when 1, attribute is renamed to s; must not be used for anything else but a/ */ /* private */ unsigned is_trace:1; diff -Nru pcb-rnd-3.1.0/src_plugins/query/query_act.c pcb-rnd-3.1.1/src_plugins/query/query_act.c --- pcb-rnd-3.1.0/src_plugins/query/query_act.c 2022-11-19 10:46:22.000000000 +0000 +++ pcb-rnd-3.1.1/src_plugins/query/query_act.c 2023-05-01 15:43:21.000000000 +0000 @@ -48,11 +48,11 @@ static const char pcb_acts_query[] = "query(dump, expr) - dry run: compile and dump an expression\n" - "query(eval|evalidp, expr) - compile and evaluate an expression and print a list of results on stdout\n" - "query(count, expr) - compile and evaluate an expression and return the number of matched objects (-1 on error)\n" - "query(select|unselect|view, expr) - select or unselect or build a view of objects matching an expression\n" - "query(setflag:flag|unsetflag:flag, expr) - set or unset a named flag on objects matching an expression\n" - "query(append, idplist, expr) - compile and run expr and append the idpath of resulting objects on idplist\n" + "query(eval|evalidp, expr, [scope]) - compile and evaluate an expression and print a list of results on stdout\n" + "query(count, expr, [scope]) - compile and evaluate an expression and return the number of matched objects (-1 on error)\n" + "query(select|unselect|view, expr, [scope]) - select or unselect or build a view of objects matching an expression\n" + "query(setflag:flag|unsetflag:flag, expr, [scope]) - set or unset a named flag on objects matching an expression\n" + "query(append, idplist, expr, [scope]) - compile and run expr and append the idpath of resulting objects on idplist\n" ; static const char pcb_acth_query[] = "Perform various queries on PCB data."; diff -Nru pcb-rnd-3.1.0/src_plugins/renumber/renumber.c pcb-rnd-3.1.1/src_plugins/renumber/renumber.c --- pcb-rnd-3.1.0/src_plugins/renumber/renumber.c 2021-11-10 08:18:04.000000000 +0000 +++ pcb-rnd-3.1.1/src_plugins/renumber/renumber.c 2023-03-11 08:57:52.000000000 +0000 @@ -145,7 +145,9 @@ PCB_SUBC_LOOP(PCB->Data); { rnd_coord_t ox, oy; - + + if (subc->extobj != NULL) continue; + if (pcb_subc_get_origin(subc, &ox, &oy) != 0) { ox = (subc->BoundingBox.X1 + subc->BoundingBox.X2)/2; oy = (subc->BoundingBox.Y1 + subc->BoundingBox.Y2)/2; diff -Nru pcb-rnd-3.1.0/src_plugins/tool_std/tool_arrow.c pcb-rnd-3.1.1/src_plugins/tool_std/tool_arrow.c --- pcb-rnd-3.1.0/src_plugins/tool_std/tool_arrow.c 2022-11-19 08:55:37.000000000 +0000 +++ pcb-rnd-3.1.1/src_plugins/tool_std/tool_arrow.c 2023-03-17 13:18:24.000000000 +0000 @@ -40,6 +40,7 @@ #include "crosshair.h" #include "data.h" #include +#include #include "remove.h" #include "move.h" #include "search.h" @@ -68,6 +69,9 @@ rnd_design_t *hl = hv.ptr; pcb_board_t *pcb = hv.ptr; + if (hl != rnd_multi_get_current()) /* switched away or unloaded in the meantime */ + return; + if (hl->tool_click) { rnd_hid_notify_crosshair_change(&PCB->hidlib, rnd_false); hl->tool_click = rnd_false; Binary files /tmp/tmpys0ah35_/8iwyqPQyU6/pcb-rnd-3.1.0/tests/cam/grp_name/ref.tar.gz and /tmp/tmpys0ah35_/eMBwIKGbUe/pcb-rnd-3.1.1/tests/cam/grp_name/ref.tar.gz differ Binary files /tmp/tmpys0ah35_/8iwyqPQyU6/pcb-rnd-3.1.0/tests/cam/type/ref.tar.gz and /tmp/tmpys0ah35_/eMBwIKGbUe/pcb-rnd-3.1.1/tests/cam/type/ref.tar.gz differ diff -Nru pcb-rnd-3.1.0/tests/find/disjoint.rp pcb-rnd-3.1.1/tests/find/disjoint.rp --- pcb-rnd-3.1.0/tests/find/disjoint.rp 1970-01-01 00:00:00.000000000 +0000 +++ pcb-rnd-3.1.1/tests/find/disjoint.rp 2023-04-27 15:28:41.000000000 +0000 @@ -0,0 +1,933 @@ +ha:pcb-rnd-board-v8 { + + li:styles { + ha:Signal { + via_proto = 0 + thickness = 10.0mil + text_thick = 0.0 + text_scale = 100 + clearance = 20.0mil + } + ha:Power { + via_proto = 1 + thickness = 20.0mil + text_thick = 0.0 + text_scale = 100 + clearance = 20.0mil + } + ha:Fat { + via_proto = 2 + thickness = 80.0mil + text_thick = 0.0 + text_scale = 100 + clearance = 25.0mil + } + ha:Sig-tight { + via_proto = 3 + thickness = 10.0mil + text_thick = 0.0 + text_scale = 100 + clearance = 12.0mil + } + } + + ha:meta { + ha:size { + thermal_scale = 0.500000 + x = 127.0mm + y = 127.0mm + } + ha:grid { + spacing = 25.0mil + offs_x = 0.0 + offs_y = 0.0 + } + } + + ha:data { + li:padstack_prototypes { + + ha:ps_proto_v6.0 { + hdia=0.8mm; hplated=1; htop=0; hbottom=0; + li:shape { + + ha:ps_shape_v4 { + ha:ps_circ { x=0.0; y=0.0; dia=2.0mm; } + ha:combining { } + ha:layer_mask { + copper = 1 + top = 1 + } + clearance=0.0 + } + + ha:ps_shape_v4 { + ha:ps_circ { x=0.0; y=0.0; dia=2.0mm; } + ha:combining { } + ha:layer_mask { + bottom = 1 + copper = 1 + } + clearance=0.0 + } + + ha:ps_shape_v4 { + ha:ps_circ { x=0.0; y=0.0; dia=2.0mm; } + ha:combining { } + ha:layer_mask { + copper = 1 + intern = 1 + } + clearance=0.0 + } + } + } + + ha:ps_proto_v6.1 { + hdia=1.0mm; hplated=0; htop=0; hbottom=0; + li:shape { + + } + } + + ha:ps_proto_v6.2 { + hdia=1.2mm; hplated=1; htop=0; hbottom=0; + li:shape { + + ha:ps_shape_v4 { + ha:ps_circ { x=0.0; y=0.0; dia=3.5mm; } + ha:combining { } + ha:layer_mask { + copper = 1 + top = 1 + } + clearance=0.0 + } + + ha:ps_shape_v4 { + ha:ps_circ { x=0.0; y=0.0; dia=3.5mm; } + ha:combining { } + ha:layer_mask { + bottom = 1 + copper = 1 + } + clearance=0.0 + } + + ha:ps_shape_v4 { + ha:ps_circ { x=0.0; y=0.0; dia=3.5mm; } + ha:combining { } + ha:layer_mask { + copper = 1 + intern = 1 + } + clearance=0.0 + } + } + } + + ha:ps_proto_v6.3 { + hdia=0.8mm; hplated=1; htop=0; hbottom=0; + li:shape { + + ha:ps_shape_v4 { + ha:ps_circ { x=0.0; y=0.0; dia=64.0mil; } + ha:combining { } + ha:layer_mask { + copper = 1 + top = 1 + } + clearance=0.0 + } + + ha:ps_shape_v4 { + ha:ps_circ { x=0.0; y=0.0; dia=64.0mil; } + ha:combining { } + ha:layer_mask { + bottom = 1 + copper = 1 + } + clearance=0.0 + } + + ha:ps_shape_v4 { + ha:ps_circ { x=0.0; y=0.0; dia=64.0mil; } + ha:combining { } + ha:layer_mask { + copper = 1 + intern = 1 + } + clearance=0.0 + } + } + } + + ha:ps_proto_v6.4 { + hdia=0.0; hplated=0; htop=0; hbottom=0; + li:shape { + + ha:ps_shape_v4 { + ha:combining { } + ha:layer_mask { + copper = 1 + top = 1 + } + clearance=40.0mil + li:ps_poly { + -175.0mil + -150.0mil + 100.0mil + -150.0mil + 100.0mil + 200.0mil + -175.0mil + 200.0mil + } + } + + ha:ps_shape_v4 { + ha:combining { } + ha:layer_mask { + bottom = 1 + copper = 1 + } + clearance=40.0mil + li:ps_poly { + -100.0mil + -200.0mil + 175.0mil + -200.0mil + 175.0mil + 25.0mil + -100.0mil + 25.0mil + } + } + } + } + + ha:ps_proto_v6.5 { + hdia=0.8mm; hplated=1; htop=0; hbottom=0; + li:shape { + + ha:ps_shape_v4 { + ha:combining { } + ha:layer_mask { + copper = 1 + top = 1 + } + clearance=40.0mil + li:ps_poly { + -50.0mil + -300.0mil + 225.0mil + -300.0mil + 225.0mil + 50.0mil + -50.0mil + 50.0mil + } + } + + ha:ps_shape_v4 { + ha:combining { } + ha:layer_mask { + bottom = 1 + copper = 1 + } + clearance=40.0mil + li:ps_poly { + 25.0mil + -350.0mil + 300.0mil + -350.0mil + 300.0mil + -125.0mil + 25.0mil + -125.0mil + } + } + + ha:ps_shape_v4 { + ha:ps_circ { x=0.0; y=0.0; dia=2.0mm; } + ha:combining { } + ha:layer_mask { + copper = 1 + intern = 1 + } + clearance=0.0 + } + } + } + + ha:ps_proto_v6.6 { + hdia=0.8mm; hplated=0; htop=0; hbottom=0; + li:shape { + + ha:ps_shape_v4 { + ha:combining { } + ha:layer_mask { + copper = 1 + top = 1 + } + clearance=40.0mil + li:ps_poly { + -175.0mil + -100.0mil + 100.0mil + -100.0mil + 100.0mil + 250.0mil + -175.0mil + 250.0mil + } + } + + ha:ps_shape_v4 { + ha:combining { } + ha:layer_mask { + bottom = 1 + copper = 1 + } + clearance=40.0mil + li:ps_poly { + -100.0mil + -150.0mil + 175.0mil + -150.0mil + 175.0mil + 75.0mil + -100.0mil + 75.0mil + } + } + + ha:ps_shape_v4 { + ha:ps_circ { x=0.0; y=0.0; dia=2.0mm; } + ha:combining { } + ha:layer_mask { + copper = 1 + intern = 1 + } + clearance=0.0 + } + } + } + } + + li:objects { + ha:padstack_ref.26 { + proto=4; x=42.545mm; y=1.175in; rot=0.000000; xmirror=0; smirror=0; clearance=20.0mil; + ha:flags { + clearline=1 + } + + li:thermal { + } + } + ha:padstack_ref.37 { + proto=4; x=48.895mm; y=37.465mm; rot=0.000000; xmirror=0; smirror=0; clearance=20.0mil; + ha:flags { + clearline=1 + } + + li:thermal { + } + } + ha:padstack_ref.58 { + proto=0; x=875.0mil; y=2.1in; rot=0.000000; xmirror=0; smirror=0; clearance=20.0mil; + ha:flags { + clearline=1 + } + + li:thermal { + } + } + ha:padstack_ref.71 { + proto=5; x=1.7in; y=56.515mm; rot=0.000000; xmirror=0; smirror=0; clearance=20.0mil; + ha:flags { + clearline=1 + } + + li:thermal { + } + } + ha:padstack_ref.95 { + proto=5; x=48.895mm; y=63.5mm; rot=0.000000; xmirror=0; smirror=0; clearance=20.0mil; + ha:flags { + clearline=1 + } + + li:thermal { + } + } + ha:padstack_ref.117 { + proto=0; x=26.035mm; y=67.31mm; rot=0.000000; xmirror=0; smirror=0; clearance=20.0mil; + ha:flags { + clearline=1 + } + + li:thermal { + } + } + ha:padstack_ref.130 { + proto=6; x=44.45mm; y=70.485mm; rot=0.000000; xmirror=0; smirror=0; clearance=20.0mil; + ha:flags { + clearline=1 + } + + li:thermal { + } + } + ha:padstack_ref.131 { + proto=6; x=1.975in; y=78.105mm; rot=0.000000; xmirror=0; smirror=0; clearance=20.0mil; + ha:flags { + clearline=1 + } + + li:thermal { + } + } + ha:padstack_ref.159 { + proto=0; x=27.305mm; y=3.875in; rot=0.000000; xmirror=0; smirror=0; clearance=20.0mil; + ha:flags { + clearline=1 + } + + li:thermal { + } + } + ha:padstack_ref.172 { + proto=6; x=49.53mm; y=3.925in; rot=0.000000; xmirror=0; smirror=0; clearance=20.0mil; + ha:flags { + clearline=1 + } + + li:thermal { + } + } + ha:padstack_ref.175 { + proto=6; x=2.175in; y=106.045mm; rot=0.000000; xmirror=0; smirror=0; clearance=20.0mil; + ha:flags { + clearline=1 + } + + li:thermal { + } + } + ha:padstack_ref.220 { + proto=1; x=1.4in; y=120.65mm; rot=0.000000; xmirror=0; smirror=0; clearance=20.0mil; + ha:flags { + clearline=1 + } + + li:thermal { + } + } + } + li:layers { + + ha:top-sig { + lid=0 + group=3 + ha:combining { } + + ha:attributes { + {pcb-rnd::key::vis}={l; Shiftt} + {pcb-rnd::key::select}={l; t} + } + + li:objects { + ha:line.221 { + x1=38.1mm; y1=120.65mm; x2=1.421in; y2=120.65mm; thickness=20.0mil; clearance=40.0mil; + ha:flags { + clearline=1 + } + } + ha:polygon.5 { clearance=40.0mil; + li:geometry { + ta:contour { + { 750.0mil; 1.1in } + { 26.035mm; 1.1in } + { 26.035mm; 36.83mm } + { 750.0mil; 36.83mm } + } + } + + ha:flags { + clearpoly=1 + } + } + ha:polygon.48 { clearance=40.0mil; + li:geometry { + ta:contour { + { 825.0mil; 1.8in } + { 1.1in; 1.8in } + { 1.1in; 54.61mm } + { 825.0mil; 54.61mm } + } + } + + ha:flags { + clearpoly=1 + } + } + ha:polygon.107 { clearance=40.0mil; + li:geometry { + ta:contour { + { 850.0mil; 2.55in } + { 1.125in; 2.55in } + { 1.125in; 73.66mm } + { 850.0mil; 73.66mm } + } + } + + ha:flags { + clearpoly=1 + } + } + ha:polygon.149 { clearance=40.0mil; + li:geometry { + ta:contour { + { 900.0mil; 95.885mm } + { 1.175in; 95.885mm } + { 1.175in; 104.775mm } + { 900.0mil; 104.775mm } + } + } + + ha:flags { + clearpoly=1 + } + } + } + color = {#8b2323} + } + + ha:bottom-sig { + lid=1 + group=10 + ha:combining { } + + ha:attributes { + {pcb-rnd::key::vis}={l; Shiftb} + {pcb-rnd::key::select}={l; b} + } + + li:objects { + ha:line.132 { + x1=47.625mm; y1=2.7in; x2=2.425in; y2=2.7in; thickness=10.0mil; clearance=40.0mil; + ha:flags { + clearline=1 + } + } + ha:line.135 { + x1=53.975mm; y1=3.0in; x2=2.45in; y2=3.0in; thickness=10.0mil; clearance=40.0mil; + ha:flags { + clearline=1 + } + } + ha:line.176 { + x1=63.5mm; y1=106.045mm; x2=2.325in; y2=106.045mm; thickness=20.0mil; clearance=40.0mil; + ha:flags { + clearline=1 + } + } + ha:line.179 { + x1=2.35in; y1=3.875in; x2=2.1in; y2=3.875in; thickness=20.0mil; clearance=40.0mil; + ha:flags { + clearline=1 + } + } + ha:line.224 { + x1=1.374in; y1=120.65mm; x2=32.6898mm; y2=120.65mm; thickness=20.0mil; clearance=40.0mil; + ha:flags { + clearline=1 + } + } + ha:polygon.10 { clearance=40.0mil; + li:geometry { + ta:contour { + { 825.0mil; 26.67mm } + { 1.1in; 26.67mm } + { 1.1in; 1.275in } + { 825.0mil; 1.275in } + } + } + + ha:flags { + clearpoly=1 + } + } + ha:polygon.53 { clearance=40.0mil; + li:geometry { + ta:contour { + { 900.0mil; 44.45mm } + { 1.175in; 44.45mm } + { 1.175in; 1.975in } + { 900.0mil; 1.975in } + } + } + + ha:flags { + clearpoly=1 + } + } + ha:polygon.112 { clearance=40.0mil; + li:geometry { + ta:contour { + { 925.0mil; 63.5mm } + { 30.48mm; 63.5mm } + { 30.48mm; 69.215mm } + { 925.0mil; 69.215mm } + } + } + + ha:flags { + clearpoly=1 + } + } + ha:polygon.154 { clearance=40.0mil; + li:geometry { + ta:contour { + { 975.0mil; 3.725in } + { 31.75mm; 3.725in } + { 31.75mm; 3.95in } + { 975.0mil; 3.95in } + } + } + + ha:flags { + clearpoly=1 + } + } + } + color = {#3a5fcd} + } + + ha:top-gnd { + lid=2 + group=3 + ha:combining { } + + li:objects { + } + color = {#104e8b} + } + + ha:bottom-gnd { + lid=3 + group=10 + ha:combining { } + + li:objects { + } + color = {#cd3700} + } + + ha:int-sig2 { + lid=4 + group=7 + ha:combining { } + + ha:attributes { + {pcb-rnd::key::vis}={l; Shifti} + {pcb-rnd::key::select}={l; i} + } + + li:objects { + } + color = {#548b54} + } + + ha:int-sig1 { + lid=5 + group=5 + ha:combining { } + + ha:attributes { + {pcb-rnd::key::vis}={l; Shifto} + {pcb-rnd::key::select}={l; o} + } + + li:objects { + } + color = {#8b7355} + } + + ha:outline { + lid=6 + group=9 + ha:combining { } + + li:objects { + } + color = {#00868b} + } + + ha:bottom-silk { + lid=7 + group=12 + ha:combining { auto=1; } + + ha:attributes { + {pcb-rnd::key::vis}={l; Shiftx} + {pcb-rnd::key::select}={l; x} + } + + li:objects { + } + color = {#000000} + } + + ha:top-silk { + lid=8 + group=1 + ha:combining { auto=1; } + + ha:attributes { + {pcb-rnd::key::vis}={l; Shifts} + {pcb-rnd::key::select}={l; s} + } + + li:objects { + } + color = {#000000} + } + + ha:top-paste { + lid=9 + group=0 + ha:combining { auto=1; } + + li:objects { + } + color = {#cd00cd} + } + + ha:top-mask { + lid=10 + group=2 + ha:combining { sub=1; auto=1; } + + li:objects { + } + color = {#ff0000} + } + + ha:bottom-mask { + lid=11 + group=11 + ha:combining { sub=1; auto=1; } + + li:objects { + } + color = {#ff0000} + } + + ha:bottom-paste { + lid=12 + group=13 + ha:combining { auto=1; } + + li:objects { + } + color = {#cd00cd} + } + + ha:slot-plated { + lid=13 + group=14 + ha:combining { auto=1; } + + li:objects { + } + color = {#8b7355} + } + + ha:slot-unplated { + lid=14 + group=15 + ha:combining { auto=1; } + + li:objects { + } + color = {#00868b} + } + + ha:top-assy { + lid=15 + group=16 + ha:combining { } + + li:objects { + } + color = {#444444} + } + + ha:bot-assy { + lid=16 + group=17 + ha:combining { } + + li:objects { + } + color = {#444444} + } + + ha:fab { + lid=17 + group=18 + ha:combining { auto=1; } + + li:objects { + } + color = {#222222} + } + } + } + + + ha:layer_stack { + li:groups { + ha:0 { + name = top_paste + ha:type { top=1; paste=1; } + li:layers { 9; } + } + ha:1 { + name = top_silk + ha:type { silk=1; top=1; } + li:layers { 8; } + } + ha:2 { + name = top_mask + ha:type { top=1; mask=1; } + li:layers { 10; } + } + ha:3 { + name = top_copper + ha:type { copper=1; top=1; } + li:layers { 0; 2; } + } + ha:4 { + name = grp_4 + ha:type { substrate=1; intern=1; } + li:layers { } + ha:attributes { + thickness={0.7375mm } + } + } + ha:5 { + name = Intern + ha:type { copper=1; intern=1; } + li:layers { 5; } + } + ha:6 { + name = grp_6 + ha:type { substrate=1; intern=1; } + li:layers { } + ha:attributes { + thickness={0.125mm } + } + } + ha:7 { + name = Intern + ha:type { copper=1; intern=1; } + li:layers { 4; } + } + ha:8 { + name = grp_8 + ha:type { substrate=1; intern=1; } + li:layers { } + ha:attributes { + thickness={0.7375mm } + } + } + ha:9 { + name = global_outline + ha:type { boundary=1; } + li:layers { 6; } + purpose = uroute + } + ha:10 { + name = bottom_copper + ha:type { bottom=1; copper=1; } + li:layers { 1; 3; } + } + ha:11 { + name = bottom_mask + ha:type { bottom=1; mask=1; } + li:layers { 11; } + } + ha:12 { + name = bottom_silk + ha:type { silk=1; bottom=1; } + li:layers { 7; } + } + ha:13 { + name = bottom_paste + ha:type { bottom=1; paste=1; } + li:layers { 12; } + } + ha:14 { + name = pmech + ha:type { mech=1; } + li:layers { 13; } + purpose = proute + } + ha:15 { + name = umech + ha:type { mech=1; } + li:layers { 14; } + purpose = uroute + } + ha:16 { + name = top_assy + ha:type { top=1; doc=1; } + li:layers { 15; } + ha:attributes { + init-invis=1 + } + purpose = assy + } + ha:17 { + name = bot_assy + ha:type { bottom=1; doc=1; } + li:layers { 16; } + ha:attributes { + init-invis=1 + } + purpose = assy + } + ha:18 { + name = fab + ha:type { top=1; doc=1; } + li:layers { 17; } + ha:attributes { + init-invis=1 + } + purpose = fab + } + } + } + li:pcb-rnd-conf-v1 { + ha:overwrite { + ha:design { + line_thickness = 20.00 mil + via_proto = 1 + text_font_id = 0 + text_scale = 100 + text_thickness = 0 + clearance = 20.00 mil + } + ha:editor { + buffer_number = 0 + grids_idx = 4 + grid = 25.00 mil + } + } + } + ha:pixmaps { + } +} diff -Nru pcb-rnd-3.1.0/tests/pupfilter.sh pcb-rnd-3.1.1/tests/pupfilter.sh --- pcb-rnd-3.1.0/tests/pupfilter.sh 2021-10-24 08:41:35.000000000 +0000 +++ pcb-rnd-3.1.1/tests/pupfilter.sh 2023-02-15 06:21:38.000000000 +0000 @@ -13,6 +13,7 @@ /^ERROR: hid_actions_uninit: action.*left registered/ { next } /^pcb_plug_fp_chain is not empty;/ { next } /^... Log produced during uninitialization:/ { next } + /some plugins are not soft-unloaded/ { next } (ws && (/^[ \t]*$/)) { next } { print $0 } ' diff -Nru pcb-rnd-3.1.0/tests/RTT/Export.sh pcb-rnd-3.1.1/tests/RTT/Export.sh --- pcb-rnd-3.1.0/tests/RTT/Export.sh 2022-02-23 07:52:25.000000000 +0000 +++ pcb-rnd-3.1.1/tests/RTT/Export.sh 2023-03-10 10:08:47.000000000 +0000 @@ -141,6 +141,7 @@ s@%%Creator:.*@%%Creator: pcb-rnd@ s@%%Version:.*@%%Version: ver@ s@^[(]Created on.*@(Created on date@ + /^matrix defaultmatrix setmatrix/ d; ' $raw_out ;; gcode) diff -Nru pcb-rnd-3.1.0/tests/strflags/tester.c pcb-rnd-3.1.1/tests/strflags/tester.c --- pcb-rnd-3.1.0/tests/strflags/tester.c 2021-06-05 06:58:50.000000000 +0000 +++ pcb-rnd-3.1.1/tests/strflags/tester.c 2023-02-08 15:36:42.000000000 +0000 @@ -53,7 +53,7 @@ static void dump_flag(pcb_flag_t * f) { int l; - printf("F:%08x T:[", f->f); + printf("F:%08lx T:[", f->f); for (l = 0; l < (PCB_MAX_LAYER + 7) / 8; l++) printf(" %02x", f->t[l]); printf("]"); diff -Nru pcb-rnd-3.1.0/tests/uniq_name/tester.c pcb-rnd-3.1.1/tests/uniq_name/tester.c --- pcb-rnd-3.1.0/tests/uniq_name/tester.c 2020-12-10 04:38:01.000000000 +0000 +++ pcb-rnd-3.1.1/tests/uniq_name/tester.c 2023-02-08 15:38:22.000000000 +0000 @@ -55,7 +55,7 @@ if (e->value == NULL) printf("(nil)'\n"); else - printf("#%d'\n", ((int *)e->value) - values); + printf("#%d'\n", (int)(((int *)e->value) - values)); } }