Skip to content

Releases: prisant-labs/3d-cable-box-parametric-openscad

v2.0.0-rc.6

v2.0.0-rc.6 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 10 Oct 03:12

This is a release candidate for 2.0.0.

Further print validation would be helpful before the final release.

What's new since rc.5

This candidate fixes the two problems that the rc.5 test prints found, and it adds three options for printing without supports. It changes default geometry for sliced boxes, whose seams now interlock, and for Gridfinity parts: the base now has solid feet and a footprint rounded up to whole cells, and every Gridfinity magnet pocket is 0.05 mm wider. Unsliced boxes and lids without Gridfinity render exactly as in rc.5. Nothing new in this candidate has been printed yet.

  • The Gridfinity base fits a standard baseplate. With Enable_Gridfinity_Bottom on, each cell gets one solid foot on the standard's profile, with sides at 45 degrees or vertical, so the feet need no support. The footprint rounds up to whole cells, and the model echoes the size it built. The default 100 x 75 box becomes 125.5 x 83.5, a 3 x 2 grid, and the lid grows with it. Foot magnet pockets are 6.5 x 2.4 mm and open on the bed, with two bridging layers above them. Gridfinity_Magnet_Diameter now defaults to 6.25, which gives the standard's 6.5 mm pocket once the clearance is added. The gridfinity-module preset now types its footprint as exactly 3 x 2 cells.
  • Sliced halves stay level. Seam_Tooth_Depth, 3 mm by default, cuts each seam as a 45 degree sawtooth through the walls, so joined pieces cannot slide vertically and their rims meet flush. The teeth print without supports. Seam_Tooth_Depth=0 restores the flat seam.
  • Three options for printing without supports. All three default to today's shapes, so no preset changes.
    • All_Opening_Top_Style=Teardrop turns each rounded top corner of a side opening into a 45 degree flank with a short flat cap. Openings keep their typed width and height.
    • Bottom_Edge_Style=Teardrop keeps a rounded bottom edge but finishes it at 45 degrees at the bed. Bottom_Edge_Style=Chamfer is a plain 45 degree bevel. Bottom_Edge_Fillet sets the size for both.
    • Print_Layer_Height, 0.2 mm by default, sizes the two bridging layers above each Gridfinity foot's magnet pocket. Set it to the layer height you slice at.

The full list, including smaller fixes, is in the changelog below. The planning docs are E-12 (Gridfinity to spec), E-13 (seam joints), and E-14 (printability options).

Known issues

  • Nothing new here has been printed. The feet are checked against a baseplate built from the standard's numbers, and the seams and new options are checked by the geometry suite, but no print has confirmed them. This candidate exists for that print round.
  • The lid-top Gridfinity socket is unchanged from rc.5, and it still prints poorly. It prints facing the bed over a bridged floor. A rebuild to the standard baseplate profile is planned for rc.7. Until then, treat Enable_Gridfinity_Lid_Top as experimental.
  • The gridfinity-module preset's lid shows 2 x 1 sockets, not 3 x 2. The lid top still uses its older layout, and the lid is now smaller. rc.7 gives the lid the same cells as the base.
  • An odd cell count puts a slice seam through a foot. At the defaults, a two-piece sliced box with the Gridfinity base halves its middle foot. Each piece still exports as one solid, but this has not been printed on a baseplate.
  • Top_Edge_Chamfer rounds the lid's exposed edge instead of chamfering it. Only the lid's other edge is chamfered. This affects only lids with Top_Edge_Chamfer above 0, and the shape it should be is undecided.

Full 2.0.0 changelog so far

Added

  • Edge treatment. Bottom_Edge_Fillet rounds the box's outer bottom edge
    and Top_Edge_Chamfer chamfers the box's top rim and both exposed lid edges.
    Every horizontal edge was previously a hard 90 degrees, which is the largest
    visible gap between this and a commercial enclosure; the bottom fillet also
    absorbs elephant foot visually. Both default to 0, and at 0 the code takes
    the same cuboid() path it always has, so an untreated model is unchanged by
    construction rather than by comparison. Non-zero, the shell switches to BOSL2
    offset_sweep(), which resolves how a horizontal fillet meets the vertical
    corner radius. Suppressed automatically wherever a Gridfinity interface owns
    the face, because those profiles are dimensioned by the standard.

  • Lid removal relief. Lid_Relief_Style takes Scallop (a concave groove)
    or Tab (a protruding grip), placed by Lid_Relief_On_Left/Right/Front/Back
    mirroring the existing Opening_On_* block, and sized by Lid_Relief_Width
    and Lid_Relief_Depth. A friction-fit lid otherwise has nothing to grip.
    A side is skipped
    automatically when an opening on that wall reaches the rim, which is the only
    case where the lid feature and the box feature meet. Defaults to None.

  • Magnetic lid retention. Enable_Lid_Magnets cuts mating pockets in the
    box and lid, held in bosses at the four inside corners. Corners rather than
    the rim because the rim is only Wall_Thickness wide and a 6 mm magnet does
    not fit it, and because corners are free of openings, stabilizers, the post
    and slice seams by construction rather than by avoidance logic. The four
    positions are symmetric in both axes, so they align however the lid is flipped
    onto the box. Bosses run the full box height so they print off the bed instead
    of hanging off the rim. Lid_Magnet_Diameter defaults to 6.2 for a nominal
    6 mm magnet. Asserts when
    the boss will not fit the cavity or would touch the post. Defaults to off.

    Magnets must be inserted with opposing poles facing. Symmetric geometry cannot
    enforce that.

All four features default to a state that leaves existing geometry unchanged.
Nine regression scenarios cover them, including that the defaults render
identically and that magnets survive slicing.

  • Release automation. Pushing a v* tag runs .github/workflows/release.yml.
    It runs the version check, the geometry suite, and the standalone-bundle
    render, then drafts a GitHub release for review rather than publishing one.
    scripts/package_release.py builds the assets reproducibly, and
    scripts/release_notes.py writes the notes from this file. A final tag is
    refused while [Unreleased] still has entries.

  • Every release attaches all nine presets as cable-box-presets.zip.
    Releases up to v2.0.0-rc.3 carried only a few hand-picked sample STLs.

  • Options guide section for the finishing features: the bottom fillet, the
    top chamfer, both lid reliefs, and the magnet bosses.

  • Lid_Style chooses how the lid locates. Plug, the default, drops a
    ring just inside the box wall and leaves the lid's edge overhanging as a
    finger grip. The ring is notched around the magnet bosses, and the model
    asserts when stabilizer fins or the post would reach it, or when the box is
    too small to hold it. Skirt wraps a wall around the outside of the box and
    has none of those limits. Both styles fitted well in the rc.5 test prints.

    The Plug default is stricter about fins than a Skirt: they must stop
    Lid_Lip_Gap_Height below the rim, even when only the box is rendered. At
    the defaults that caps Stabilizer_Height at Box_Height - 4.85. The
    defaults and all nine presets are well inside it. Set Lid_Style=Skirt for
    fins that reach the rim.

  • Seam_Tooth_Depth cuts sliced seams as a 45 degree sawtooth. Above the
    floor, each seam zigzags through the walls, the post, and any fin it crosses,
    so joined pieces cannot slide vertically and their rims meet flush. The teeth
    have no undercut, so the pieces still push together the way the floor clips
    go in, and every tooth face prints without support. The default is 3 mm;
    0 restores the flat seam exactly. Where a front or back opening crosses a
    seam, the teeth skip its height range, so they never leave slivers against
    its rounded edges. See
    E-13 (seam joints).

  • All_Opening_Top_Style gives side openings a top that prints without
    support.
    Round, the default, keeps today's arcs, which flatten near the
    top and print there as an overhang. Teardrop turns each rounded top corner
    into a 45 degree flank with a short flat cap. The cap sits where the round
    top was, so every opening keeps its typed width and height, and the rim,
    lid-relief and seam-teeth checks that read an opening's top are unaffected.
    Square openings are unchanged. One setting covers all four walls. See
    E-14 (printability options).

  • Bottom_Edge_Style shapes the bottom edge treatment. Fillet, the
    default, is the quarter round that Bottom_Edge_Fillet has always made, and
    its lowest layers overhang the bed. Teardrop keeps the rounded look but
    finishes in a 45 degree chamfer at the bed. Chamfer is a plain 45 degree
    bevel. Bottom_Edge_Fillet sets the size for every style, and the setting
    shapes only the box's bottom edge, never the lid's.

  • Print_Layer_Height sizes the Gridfinity bridging layers. The two
    stepped layers above each foot's magnet pocket were fixed at 0.2 mm. A
    slicer samples each layer near its middle height, so at a thicker layer a
    0.2 mm step can be skipped and the pocket's ceiling sags. Set it to the
    layer height you slice at. The default 0.2 reproduces the earlier steps
    exactly, and Gridfinity_Magnet_Depth may now reach
    4.75 - 2 * Print_Layer_Height.

Changed

  • **A Gridfinity base rounds the box up to whole cells, and its feet follow the...
Read more

v2.0.0-rc.5

v2.0.0-rc.5 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 07 Oct 03:20

This is a release candidate for 2.0.0.

Further print validation would be helpful before the final release.

What's new since rc.4

This candidate fixes the two defects that the rc.4 test prints found, and the rc.5 test prints confirmed both fixes. It changes default geometry: every lid is new, and every sliced piece changes.

  • The lid fits the box. In every earlier version, the lid's lip ring landed on top of the box wall, so the lid stood on the rim instead of seating. Lid_Style now chooses how the lid locates:
    • Plug, the default, drops a ring just inside the box wall and leaves the lid's edge overhanging as a finger grip.
    • Skirt wraps a short wall around the outside of the box.
    • Both fitted well in test prints at the new Lid_Lip_Gap of 0.15 mm per side, with and without magnets.
  • Plug lids are stricter about stabilizer fins. Fins must stop Lid_Lip_Gap_Height below the rim, because the plug ring sits in that band. At the defaults, that caps Stabilizer_Height at Box_Height - 4.85, which counts the 3 mm lip and the 1.85 mm floor. The check applies even when only the box is rendered. The defaults and all nine presets are well inside it. Set Lid_Style=Skirt for fins that reach the rim.
  • The lid's post socket has clearance. It now takes Lid_Lip_Gap on each side instead of being exactly Post_Diameter.
  • Sliced pieces sit flat on the bed. Floor clips used to hang 0.575 mm below each sliced piece, so a slicer stood the piece on its clips. They now start at the floor's bottom face and rise inside the box.
  • The calibration coupons no longer ship. rc.4 attached them as cable-box-calibration.zip. They found the two defects above and confirmed the fixes. They are now maintainer tooling outside the repository. To check a fit on your own printer, docs/PRINTING.md describes a small fit test box built from your own settings.

Known issues

  • The Gridfinity interfaces print poorly. The base under the box is a straight 41.5 mm block, hollow from below, where the standard foot tapers at 45 degrees. The lid-top socket prints facing the bed, over a bridged floor. A redesign to the standard profile is being scoped. Until then, treat Enable_Gridfinity_Bottom and Enable_Gridfinity_Lid_Top as experimental.
  • Sliced halves can slide vertically at the seam. Both clip styles sit only in the floor and drop in from above, so nothing holds one half level with the other. The snap clips hold, but feel weak. A joint redesign for boxes larger than the bed is planned, sized for glue as well as a dry fit.

Full 2.0.0 changelog so far

Added

  • Edge treatment. Bottom_Edge_Fillet rounds the box's outer bottom edge
    and Top_Edge_Chamfer chamfers the box's top rim and both exposed lid edges.
    Every horizontal edge was previously a hard 90 degrees, which is the largest
    visible gap between this and a commercial enclosure; the bottom fillet also
    absorbs elephant foot visually. Both default to 0, and at 0 the code takes
    the same cuboid() path it always has, so an untreated model is unchanged by
    construction rather than by comparison. Non-zero, the shell switches to BOSL2
    offset_sweep(), which resolves how a horizontal fillet meets the vertical
    corner radius. Suppressed automatically wherever a Gridfinity interface owns
    the face, because those profiles are dimensioned by the standard.

  • Lid removal relief. Lid_Relief_Style takes Scallop (a concave groove)
    or Tab (a protruding grip), placed by Lid_Relief_On_Left/Right/Front/Back
    mirroring the existing Opening_On_* block, and sized by Lid_Relief_Width
    and Lid_Relief_Depth. A friction-fit lid otherwise has nothing to grip.
    A side is skipped
    automatically when an opening on that wall reaches the rim, which is the only
    case where the lid feature and the box feature meet. Defaults to None.

  • Magnetic lid retention. Enable_Lid_Magnets cuts mating pockets in the
    box and lid, held in bosses at the four inside corners. Corners rather than
    the rim because the rim is only Wall_Thickness wide and a 6 mm magnet does
    not fit it, and because corners are free of openings, stabilizers, the post
    and slice seams by construction rather than by avoidance logic. The four
    positions are symmetric in both axes, so they align however the lid is flipped
    onto the box. Bosses run the full box height so they print off the bed instead
    of hanging off the rim. Sizing follows the existing Gridfinity_Magnet_*
    convention: Lid_Magnet_Diameter 6.2 for a nominal 6 mm magnet. Asserts when
    the boss will not fit the cavity or would touch the post. Defaults to off.

    Magnets must be inserted with opposing poles facing. Symmetric geometry cannot
    enforce that.

All four features default to a state that leaves existing geometry unchanged.
Nine regression scenarios cover them, including that the defaults render
identically and that magnets survive slicing.

  • Release automation. Pushing a v* tag runs .github/workflows/release.yml.
    It runs the version check, the geometry suite, and the standalone-bundle
    render, then drafts a GitHub release for review rather than publishing one.
    scripts/package_release.py builds the assets reproducibly, and
    scripts/release_notes.py writes the notes from this file. A final tag is
    refused while [Unreleased] still has entries.

  • Every release attaches all nine presets as cable-box-presets.zip.
    Releases up to v2.0.0-rc.3 carried only a few hand-picked sample STLs.

  • Options guide section for the finishing features: the bottom fillet, the
    top chamfer, both lid reliefs, and the magnet bosses.

  • Lid_Style chooses how the lid locates. Plug, the default, drops a
    ring just inside the box wall and leaves the lid's edge overhanging as a
    finger grip. The ring is notched around the magnet bosses, and the model
    asserts when stabilizer fins or the post would reach it, or when the box is
    too small to hold it. Skirt wraps a wall around the outside of the box and
    has none of those limits. Both styles fitted well in the rc.5 test prints.

    The Plug default is stricter about fins than a Skirt: they must stop
    Lid_Lip_Gap_Height below the rim, even when only the box is rendered. At
    the defaults that caps Stabilizer_Height at Box_Height - 4.85. The
    defaults and all nine presets are well inside it. Set Lid_Style=Skirt for
    fins that reach the rim.

Changed

  • Lid_Lip_Gap is now a clearance on each side, and defaults to 0.15.
    It was added once to the lid's overall width, which made it a total. The
    same value now separates the lip from the wall on every side, for both lid
    styles, and also opens up the lid's post socket. The lid's footprint is
    Box + 2*(Wall_Thickness + Lid_Lip_Gap), so the default lid is 104 x 79 mm
    instead of 103.8 x 78.8. The rc.5 test prints confirmed 0.15 for both lid
    styles, with and without magnets, on a Bambu Lab P1S printing PLA+. No preset
    sets Lid_Lip_Gap.

  • All_Openings_Up now defaults to 5 instead of 0. Side openings are
    anchored at their bottom edge, so every enabled side opening now sits 5 mm
    above the box floor instead of flush with it. Set All_Openings_Up=0 to
    restore the previous output.

    This changes geometry for unchanged inputs, which under
    E-10 (versioning) is a major bump
    rather than the minor one the features above would have been. No preset sets
    All_Openings_Up, so all nine inherit the new value and every preset STL and
    GLB shifts with it. A print made from v2.0.0-rc.2 no longer matches what the
    model produces from the same parameters.

  • Calibration coupons no longer ship. v2.0.0-rc.4 attached them as
    cable-box-calibration.zip, built from a calibration/ folder. They are now
    maintainer tooling outside the repository. docs/PRINTING.md describes a fit
    test box made from your own settings instead. Their two print rounds found
    the lid and floor-clip defects fixed below, and confirmed both fixes.

  • The code inherited from the 2022 original is rewritten. Side openings
    are placed by one loop over the four walls instead of four copied blocks.
    The lid's post socket and the part layout use named values, and the override
    check names the wall at fault. Every preview colour is now a named constant.
    Geometry is unchanged, proven by canonical mesh hash across twelve
    configurations rather than by inspection. THIRD_PARTY_NOTICES.md now
    records where the earlier versions came from.

  • README. It leads with the preset library, and its options-guide links go
    to the site, because GitHub shows a .html file as source. A fourth feature
    image shows the finishing features. The Gridfinity text no longer promises a
    fit that no print has confirmed yet, and print reports are now the first
    contribution it asks for.

  • CI. The docs site now builds, without deploying, on every pull request,
    so a dependency break shows up in review rather than at deploy time.
    Dependabot proposes grouped monthly updates for the site and the workflows,
    and holds back three until @google/model-viewer accepts a newer version.

  • New preview palette. Teal, red and yellow become slate with an orange
    post. This changes the OpenSCAD preview and every generated PNG render;
    STLs carry no colour. The README's hero and feature images are now
    rendered by scripts/build_readme_images.py instead of by hand, which
    also corrects two that had drifted: the Gridfinity image still showed the
    retired lid studs, and the hero showed openings flush with the floor.

Fixed

  • The lid fits the box. In every version from v1.0.0 to v2.0.0-rc.4,
    including v1.4.1, the lid's lip ring was sized to land on top of the box
    wall: on a 5...
Read more

v2.0.0-rc.4 - Calibration coupons, for print validation

Choose a tag to compare

@github-actions github-actions released this 03 Oct 20:42

This is a release candidate for 2.0.0.

Further print validation would be helpful before the final release. The calibration coupons are small test prints for exactly that.

What's new since rc.3

This candidate exists for print validation. It adds eight small calibration coupons, so the prints that 2.0.0 waits on are now a few small test pieces rather than a full box. Default geometry is unchanged from rc.3: twelve reference configurations hash identical by canonical mesh.

  • Calibration coupons. Eight test prints, each isolating one fit: lid fit, magnet pockets, the Gridfinity base and lid socket, snap and tab seam clips, the edge treatment, and a side opening. They are attached as cable-box-calibration.zip; see the coupon README for how to tune each one and report a result.
  • All nine presets attached. cable-box-presets.zip holds every preset's STLs, config.json and notes. Earlier candidates carried only a few sample STLs.
  • Validation fixes for the E-04 features.
    • The lid relief is now dropped over an opening raised to the rim by its own Move_Opening_*_Up.
    • Lid_Relief_Width is now checked against each wall's own length.
    • An opening lifted past the rim is reported instead of silently becoming a notch.
    • A shallow box with closed walls is no longer rejected for an opening it never cuts.
  • Independent code. The code inherited from the 2022 original is rewritten, with geometry proven unchanged. Earlier releases' origin is recorded in THIRD_PARTY_NOTICES.md.
  • New preview palette, for the OpenSCAD preview and the generated renders. STLs carry no colour.
  • Release automation. This is the first release drafted by .github/workflows/release.yml.

Known issues

  • Sliced pieces have floor clips below the bed. Each male floor clip is 3 mm tall but centred on the 1.85 mm floor, so 0.575 mm of it hangs below every sliced piece. A slicer that drops the part to the bed leaves the rest of the floor in the air. The same placement goes back to at least v1.1.0, so this is not new in this candidate. The snap-clip-pair and tab-clip-pair coupons reproduce it, and show how much it matters on a real printer. A fix is tracked for 2.0.0.
  • Gridfinity base seating is unconfirmed. Each base cell is a square 41.5 mm block, and a standard baseplate pocket tapers, so the base may sit on a baseplate rather than drop into it. The gridfinity-base-1x1 coupon answers this.

Full 2.0.0 changelog so far

Added

  • Edge treatment. Bottom_Edge_Fillet rounds the box's outer bottom edge
    and Top_Edge_Chamfer chamfers the box's top rim and both exposed lid edges.
    Every horizontal edge was previously a hard 90 degrees, which is the largest
    visible gap between this and a commercial enclosure; the bottom fillet also
    absorbs elephant foot visually. Both default to 0, and at 0 the code takes
    the same cuboid() path it always has, so an untreated model is unchanged by
    construction rather than by comparison. Non-zero, the shell switches to BOSL2
    offset_sweep(), which resolves how a horizontal fillet meets the vertical
    corner radius. Suppressed automatically wherever a Gridfinity interface owns
    the face, because those profiles are dimensioned by the standard.

  • Lid removal relief. Lid_Relief_Style takes Scallop (a concave groove)
    or Tab (a protruding grip), placed by Lid_Relief_On_Left/Right/Front/Back
    mirroring the existing Opening_On_* block, and sized by Lid_Relief_Width
    and Lid_Relief_Depth. Lid_Lip_Gap defaults to 0.1 mm, which is a
    deliberately tight friction fit with nothing to grip. A side is skipped
    automatically when an opening on that wall reaches the rim, which is the only
    case where the lid feature and the box feature meet. Defaults to None.

  • Magnetic lid retention. Enable_Lid_Magnets cuts mating pockets in the
    box and lid, held in bosses at the four inside corners. Corners rather than
    the rim because the rim is only Wall_Thickness wide and a 6 mm magnet does
    not fit it, and because corners are free of openings, stabilizers, the post
    and slice seams by construction rather than by avoidance logic. The four
    positions are symmetric in both axes, so they align however the lid is flipped
    onto the box. Bosses run the full box height so they print off the bed instead
    of hanging off the rim. Sizing follows the existing Gridfinity_Magnet_*
    convention: Lid_Magnet_Diameter 6.2 for a nominal 6 mm magnet. Asserts when
    the boss will not fit the cavity or would touch the post. Defaults to off.

    Magnets must be inserted with opposing poles facing. Symmetric geometry cannot
    enforce that.

All four features default to a state that leaves existing geometry unchanged.
Nine regression scenarios cover them, including that the defaults render
identically and that magnets survive slicing.

  • Calibration coupons. calibration/ holds eight small test prints, each
    isolating one fit that a full box would otherwise be the first print of: the
    lid fit, the magnet pockets, the Gridfinity base and lid socket, snap and tab
    seam clips, the edge treatment, and a side opening. Several 2.0.0 features
    render cleanly but have not yet been confirmed on a printer, so further print
    validation would be helpful; the coupons make that cheap. They are OpenSCAD
    parameter sets in calibration/config.json, exported and checked by
    scripts/build_calibration.py for exit code, a clean log, and body count.
  • Release automation. Pushing a v* tag runs .github/workflows/release.yml.
    It runs the version check, the geometry suite, and the standalone-bundle
    render, then drafts a GitHub release for review rather than publishing one.
    scripts/package_release.py builds the assets reproducibly, and
    scripts/release_notes.py writes the notes from this file. A final tag is
    refused while [Unreleased] still has entries.
  • Every release attaches all nine presets as cable-box-presets.zip, plus
    the coupons as cable-box-calibration.zip. Releases up to v2.0.0-rc.3
    carried only a few hand-picked sample STLs.
  • Options guide section for the finishing features: the bottom fillet, the
    top chamfer, both lid reliefs, and the magnet bosses.

Changed

  • All_Openings_Up now defaults to 5 instead of 0. Side openings are
    anchored at their bottom edge, so every enabled side opening now sits 5 mm
    above the box floor instead of flush with it. Set All_Openings_Up=0 to
    restore the previous output.

    This changes geometry for unchanged inputs, which under
    E-10 (versioning) is a major bump
    rather than the minor one the features above would have been. No preset sets
    All_Openings_Up, so all nine inherit the new value and every preset STL and
    GLB shifts with it. A print made from v2.0.0-rc.2 no longer matches what the
    model produces from the same parameters.

  • The code inherited from the 2022 original is rewritten. Side openings
    are placed by one loop over the four walls instead of four copied blocks.
    The lid's post socket and the part layout use named values, and the override
    check names the wall at fault. Every preview colour is now a named constant.
    Geometry is unchanged, proven by canonical mesh hash across twelve
    configurations rather than by inspection. THIRD_PARTY_NOTICES.md now
    records where the earlier versions came from.

  • README. It leads with the preset library, and its options-guide links go
    to the site, because GitHub shows a .html file as source. A fourth feature
    image shows the finishing features. The Gridfinity text no longer promises a
    fit that no print has confirmed yet, and print reports are now the first
    contribution it asks for.

  • CI. The docs site now builds, without deploying, on every pull request,
    so a dependency break shows up in review rather than at deploy time.
    Dependabot proposes grouped monthly updates for the site and the workflows,
    and holds back three until @google/model-viewer accepts a newer version.

  • New preview palette. Teal, red and yellow become slate with an orange
    post. This changes the OpenSCAD preview and every generated PNG render;
    STLs carry no colour. The README's hero and feature images are now
    rendered by scripts/build_readme_images.py instead of by hand, which
    also corrects two that had drifted: the Gridfinity image still showed the
    retired lid studs, and the hero showed openings flush with the floor.

Fixed

  • Lid relief over a raised opening. The check that drops a relief above an
    opening reaching the rim counted only All_Openings_Up. An opening raised to
    the rim by its own Move_Opening_*_Up still got a tab standing over it. The
    check now uses the opening's real top edge.
  • Relief width on long, narrow boxes. Lid_Relief_Width was checked
    against the shorter of Box_Width and Box_Depth for every wall, so a
    150 mm wall rejected a 100 mm relief because the box was 60 mm wide. Each
    enabled wall is now checked against its own length, and the message names
    the wall.
  • Openings lifted past the rim are reported. An opening whose top edge ends
    above Box_Height is cut open to the rim as a notch. That is still allowed,
    but it used to happen without any message; the model now prints one.
  • Closed boxes shallower than the default opening. All_Opening_Height
    was checked against Box_Height even with every side opening off, so a
    12 mm box with closed walls was rejected for a 30 mm opening it never cuts.
    The check now applies only when a side opening is on.

Five regression scenarios cover these fixes, and each fails against the
previous model.

  • Sliced preset sizes. `surge-strip...
Read more

v2.0.0-rc.3 - Side openings lift off the floor, for print validation

Choose a tag to compare

@jprisant jprisant released this 11 Aug 16:39

Supersedes v2.0.0-rc.2, which was tagged but never published and never
printed. Anything printed from rc.2 no longer matches this model: side
openings have moved.

All_Openings_Up now defaults to 5 rather than 0, so an opening spans z 5 to
35 instead of z 0 to 30. No preset sets that parameter, so all nine inherit
it and every preset STL in this tag differs from rc.2. Set All_Openings_Up=0
for the old geometry.

Release candidate. Geometry is verified by 75 automated scenarios but has not
been printed. Four things need a physical test, and this tag exists so they
have something specific to print rather than whatever was on main that
afternoon.

  1. The new opening position is the reason for this candidate. Does a cable
    still route comfortably now that the opening starts 5mm up? The old
    default let a cable lying on the desk pass straight in; this one asks it
    to climb a 5mm lip. That tradeoff is the thing to judge in the hand, and
    no automated check can judge it.
  2. Enable_Gridfinity_Lid_Top renders a socketed baseplate instead of a
    stud. The socket mouth is sized from GF_BASE_CELL 41.5mm plus 0.25mm
    clearance. That clearance is a chosen number. Does a real Gridfinity
    foot seat in it? Carried unanswered from rc.1 and rc.2.
  3. Does the box underside still seat in a real baseplate? Unchanged since
    v1.2.0-rc.1 and still unprinted.
  4. Snap clips remain opt-in. Clip correctness is the one thing here that
    rendering cannot check: a joint too tight to assemble passes every
    automated test.

Prereleases do not show as Latest, per docs/internal/E-10_versioning.md.
The 2.0.0 CHANGELOG date is a placeholder for the final release.

Also in this candidate, all opt-in and all leaving default geometry alone:
magnetic lid retention, bottom edge fillet and top edge chamfer, and lid
removal relief in Scallop or Tab form.

One caveat for whoever reviews the diff. The preview renders in this tag were
selected by which mesh actually changed, not by the PNG noise guard in
build_library.py. That guard reported 3 of 18 renders as changed, because
PNG_NOISE_BYTES=4000 was calibrated on whole-box resizes and a relocated
opening moves far fewer pixels. The constant is unchanged and still wants a
re-measurement.

v1.4.1 - Preset configs that OpenSCAD will actually load

Choose a tag to compare

@jprisant jprisant released this 05 Aug 00:19

Bugfix release. No geometry change - the model is untouched apart from its version string, and every STL in library/ is byte-identical to 1.4.0.

Fixed

Three preset config.json files could not be loaded at all. Booleans were written capitalised ("True"), where OpenSCAD's Customizer parameter-set format requires "true". Loading one fails with:

ERROR: Cannot apply Parameter Set 'conversion of data to type "b" failed'

and OpenSCAD then discards the entire parameter set rather than skipping the bad key. That made gridfinity-module, surge-strip-6-sliced and under-desk-passthrough unusable through the -p / -P invocation the docs recommend.

The STLs were never affected. The render path lowercased booleans correctly, so only the JSON path was wrong, and nothing exercised it.

Preview renders hid the difference between presets. Images used --viewall, which zooms each model to fill the frame and so throws away scale. Five of the nine presets differ only in dimensions, so a 265 mm surge strip and a 120 mm charger were drawn identically. Every preset's box-and-lid view now renders at one fixed camera distance, making the library a real size comparison. Detail views keep fit-to-frame.

Release snapshots recorded a tag object SHA where they meant the commit, because git rev-parse <tag> dereferences differently for annotated tags. Snapshot contents and checksums were always correct.

Added

cable-box-parametric.json - all nine presets in one file beside the model. Open cable-box-parametric.scad, press F3, and the whole list is in the Customizer dropdown. From the command line:

openscad -o out.stl cable-box-parametric.scad \
  -p cable-box-parametric.json -P desk-compact

It is OpenSCAD's native parameter-set format, so settings round-trip between this model and the desktop Customizer.

Assets

  • cable-box-parametric.scad - the model, requires BOSL2
  • cable-box-standalone-bundle.zip - needs nothing installed; keep both files together
  • Two sample STLs, ready to slice

Full detail in CHANGELOG.md.

v1.4.0 - Snap clips, attachables, and a dependency guard

Choose a tag to compare

@jprisant jprisant released this 03 Aug 17:09

Completes E-02 (BOSL2 migration) phases 2 and 3. Geometry is unchanged at default settings; mesh volumes match 1.3.0 exactly across box, lid, both, Gridfinity, and slicing.

Snap-fit seam clips

Clip_Style adds "Snap", a BOSL2 rabbit_clip cantilever joint, alongside the original "Tab". The tab is a rectangle in a slightly larger hole held by friction; the snap has an engagement bump and an arm that flexes, so it absorbs print inaccuracy instead of jamming.

Tuning: Clip_Snap_Length, Clip_Snap, Clip_Arm_Thickness, Clip_Compression, Clip_Lock.

The default stays "Tab". Clip correctness is the one thing here that rendering cannot establish: manifoldness, solid counts, and probes all pass for a joint far too tight to assemble or too loose to hold. The default flips once a print says it should.

Attachment interface

m_box() and m_lid_part() are now BOSL2 attachables with named anchors: floor, rim, wall-front, wall-back, wall-left, wall-right, post-top, lid-face, lip.

Render_On_Include = false;
include <cable-box-parametric.scad>

m_box() attach("wall-back") my_bracket();

lid-face names the face that ends up exposed when the box is closed, which is exactly what v1.2.0's Gridfinity lid interface got wrong. It is now a name rather than something each caller re-derives.

Missing-dependency guard

Without BOSL2, the model used to emit Can't open include file, a wall of unknown-module warnings, no geometry, and exit code 0 - which looks like success. It now stops with one message naming what to install and pointing at the standalone bundle.

Fixed

  • Snap clips did not overlap their slice. The existing offsets assume a centred cube; a rabbit_clip is base-anchored and grows away from the slice, leaving the pin floating.
  • Preview layout now accounts for clip protrusion, so an 8 mm pin no longer bridges the 5 mm preview gap and fuses the preview into one body.

Testing

65 scenarios, up from 48. Adds bounding-box assertions, which is what caught a clip silently rotated onto the wrong axis, and a report of which BOSL2 version OpenSCAD actually loads.

v1.3.0 - BOSL2 as a dependency

Choose a tag to compare

@jprisant jprisant released this 31 Jul 20:08

Replaces the embedded BOSL2 copy with a real dependency.

Dimensionally identical to 1.2.0. Mesh volumes match to four decimal places across every configuration tested; only corner-rounding tessellation differs, by a handful of facets.

Changed

The model now declares include <BOSL2/std.scad> instead of carrying a February 2022 subset minified onto a single 214,500-character line that was 79 percent of the file. 271 KB → 72 KB, and reviewable, diffable, and searchable for the first time.

This also makes the model publishable on MakerWorld, whose parametric customizer bundles BOSL2 and forbids custom library uploads. A local lib/ split, the obvious tidy-up, is the one arrangement that would have broken it.

Installing BOSL2:

# Windows and macOS
git clone https://github.com/BelfrySCAD/BOSL2.git ~/Documents/OpenSCAD/libraries/BOSL2
# Linux
git clone https://github.com/BelfrySCAD/BOSL2.git ~/.local/share/OpenSCAD/libraries/BOSL2

Or download cable-box-standalone-bundle.zip below, which has BOSL2 inlined and needs nothing installed. Unzip both files into the same folder and open the bundled .scad.

Fixed

The lid was relying on coplanar-face fusion. Its lip ring and post collar met the lid panel on a shared plane with zero overlap. Whether such a pair fuses into one body is kernel-dependent: the 2022 BOSL2 fused them, the current one does not, so the lid exported as three detached solids.

This was latent, not a migration regression. Any BOSL2 or CGAL update could have triggered it, and it would have shipped a lid in three pieces with no error message. Caught by the geometry suite's disconnected-solid assertion.

Notes

The bundle is two files rather than one. BOSL2 pulls in builtins.scad with use rather than include because it wraps OpenSCAD's builtins (module _translate(v) translate(v) children();). use scopes it so translate resolves to the builtin; inlining it makes the body resolve to BOSL2's own translate and the two recurse forever. Keep both files together.

CI pins BOSL2 to a commit, builds the bundle, and verifies it renders with BOSL2 moved out of reach.

48 geometry scenarios passing.

v1.2.0 - Gridfinity, preset library, visual options guide

Choose a tag to compare

@jprisant jprisant released this 31 Jul 04:55

Preset library

Nine ready-to-print configurations in library/, organised by what you physically have rather than by dimensions: USB charger, compact desk tidy, Gridfinity module, laptop brick, under-desk pass-through, monitor junction, router shelf, six-outlet surge strip, and that strip split for a 180 mm bed. Each ships a complete config.json, STLs, renders, and notes.

All generated by scripts/build_library.py, so presets cannot drift from the model.

Visual options guide

docs/options-guide.html renders 43 configurations from the model and embeds them as data URIs. One file, works offline, no CDN. A Markdown companion lives at docs/OPTIONS_GUIDE.md.

Gridfinity (optional, off by default)

  • Enable_Gridfinity_Bottom - 42 mm base under the box so it drops into a baseplate. Adds 4.75 mm to total height; Box_Height still describes the box body, so interior volume is unchanged.
  • Enable_Gridfinity_Lid_Top - the profile on the lid's exposed face.
  • Enable_Gridfinity_Magnet_Screw - magnet pockets and M3 holes.

Requires Closed_Post=true, because the base would otherwise block an open post bore. Geometry with both toggles off is byte-identical to 1.1.1, verified by normalised STL comparison.

Provisional: the lid profile is currently a positive stud, so the closed box behaves like a bin sitting in a baseplate. If the intent is for Gridfinity bins to sit on the lid, it needs to be a socket instead. Unresolved pending a print test, and it may change. The box underside is unaffected.

CI

All actions bumped past the Node 20 deprecation: checkout v4→v7, setup-python v5→v7, configure-pages v5→v6, upload-pages-artifact v3→v5, deploy-pages v4→v5.

Validation

48 geometry scenarios passing, covering exit codes, manifoldness, disconnected-solid counts, and point probes against the exported mesh.

v1.1.1 - Manifold fix, MIT relicence, geometry tests

Choose a tag to compare

@jprisant jprisant released this 31 Jul 04:54

Patch release on the 1.1 line.

Fixed

  • Side openings anchored flush with the box floor produced a non-manifold solid. The cut stopped exactly on the box bottom plane, leaving a zero-thickness tangency that CGAL reports as Simple: no and a slicer may reject. The cut is now sunk below its own bottom edge so it crosses that plane cleanly.

Changed

  • Relicensed from CC BY-NC-SA 4.0 to MIT. The NonCommercial clause blocked selling printed copies and print-on-demand, and was ambiguous on platforms with creator rewards. MIT matches Gridfinity's own licence and suits a model that is really source code.

Added

  • Model_Version, echoed at render, so an exported STL traces back to its source.
  • scripts/check-version.sh: fails the build when the model version, changelog, and git tag disagree.
  • tests/: a 39-scenario geometry regression harness asserting exit codes, manifoldness, disconnected-solid counts, and point probes against the exported mesh. It caught the manifold defect above on its first run.

v1.2.0-rc.1 - Gridfinity (release candidate)

Choose a tag to compare

@jprisant jprisant released this 30 Jul 19:58

Release candidate for print validation. Not a stable release.

Adds optional Gridfinity interfaces. Both default to off, and geometry with them disabled is byte-identical to 1.1.1.

  • Enable_Gridfinity_Bottom - 42mm base under the box so it drops into a baseplate. Adds 4.75mm to total height; Box_Height still describes the box body.
  • Enable_Gridfinity_Lid_Top - the profile on the lid's exposed face so the closed box joins a stack. Adds 4.5mm.
  • Enable_Gridfinity_Magnet_Screw - magnet pockets and M3 screw holes on whichever interfaces are on.

Gridfinity bottom requires Closed_Post=true, because the base would otherwise block an open post bore.

What needs a physical test

Verified by 48 automated scenarios, but nothing here has been printed:

  1. Does the box underside seat in a real Gridfinity baseplate? Check fit and tune Gridfinity_Profile_Clearance.
  2. Is the lid profile the right direction? It is currently a positive stud, so the closed box behaves like a bin. If you want Gridfinity bins to sit on the lid, it needs to be a socket instead. This is the main open design question.
  3. Magnet seating, and whether the underside grid makes the box rock on a flat desk.

Attached STLs are rendered with both interfaces on and Closed_Post=true.

Gridfinity is by Zack Freedman, MIT licensed. No Gridfinity code is vendored.