Repository navigation
Releases: prisant-labs/3d-cable-box-parametric-openscad
Release list
v2.0.0-rc.6
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_Bottomon, 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_Diameternow defaults to6.25, which gives the standard's 6.5 mm pocket once the clearance is added. Thegridfinity-modulepreset 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=0restores the flat seam. - Three options for printing without supports. All three default to today's shapes, so no preset changes.
All_Opening_Top_Style=Teardropturns 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=Teardropkeeps a rounded bottom edge but finishes it at 45 degrees at the bed.Bottom_Edge_Style=Chamferis a plain 45 degree bevel.Bottom_Edge_Filletsets 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_Topas experimental. - The
gridfinity-modulepreset'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_Chamferrounds the lid's exposed edge instead of chamfering it. Only the lid's other edge is chamfered. This affects only lids withTop_Edge_Chamferabove 0, and the shape it should be is undecided.
Full 2.0.0 changelog so far
Added
-
Edge treatment.
Bottom_Edge_Filletrounds the box's outer bottom edge
andTop_Edge_Chamferchamfers 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 to0, and at0the code takes
the samecuboid()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_StyletakesScallop(a concave groove)
orTab(a protruding grip), placed byLid_Relief_On_Left/Right/Front/Back
mirroring the existingOpening_On_*block, and sized byLid_Relief_Width
andLid_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 toNone. -
Magnetic lid retention.
Enable_Lid_Magnetscuts mating pockets in the
box and lid, held in bosses at the four inside corners. Corners rather than
the rim because the rim is onlyWall_Thicknesswide 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_Diameterdefaults 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.pybuilds the assets reproducibly, and
scripts/release_notes.pywrites 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 tov2.0.0-rc.3carried 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_Stylechooses 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.Skirtwraps 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_Heightbelow the rim, even when only the box is rendered. At
the defaults that capsStabilizer_HeightatBox_Height - 4.85. The
defaults and all nine presets are well inside it. SetLid_Style=Skirtfor
fins that reach the rim. -
Seam_Tooth_Depthcuts 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 is3mm;
0restores 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_Stylegives 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.Teardropturns 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_Styleshapes the bottom edge treatment.Fillet, the
default, is the quarter round thatBottom_Edge_Fillethas always made, and
its lowest layers overhang the bed.Teardropkeeps the rounded look but
finishes in a 45 degree chamfer at the bed.Chamferis a plain 45 degree
bevel.Bottom_Edge_Filletsets the size for every style, and the setting
shapes only the box's bottom edge, never the lid's. -
Print_Layer_Heightsizes 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 default0.2reproduces the earlier steps
exactly, andGridfinity_Magnet_Depthmay now reach
4.75 - 2 * Print_Layer_Height.
Changed
- **A Gridfinity base rounds the box up to whole cells, and its feet follow the...
v2.0.0-rc.5
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_Stylenow 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.Skirtwraps a short wall around the outside of the box.- Both fitted well in test prints at the new
Lid_Lip_Gapof 0.15 mm per side, with and without magnets.
- Plug lids are stricter about stabilizer fins. Fins must stop
Lid_Lip_Gap_Heightbelow the rim, because the plug ring sits in that band. At the defaults, that capsStabilizer_HeightatBox_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. SetLid_Style=Skirtfor fins that reach the rim. - The lid's post socket has clearance. It now takes
Lid_Lip_Gapon each side instead of being exactlyPost_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_BottomandEnable_Gridfinity_Lid_Topas 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_Filletrounds the box's outer bottom edge
andTop_Edge_Chamferchamfers 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 to0, and at0the code takes
the samecuboid()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_StyletakesScallop(a concave groove)
orTab(a protruding grip), placed byLid_Relief_On_Left/Right/Front/Back
mirroring the existingOpening_On_*block, and sized byLid_Relief_Width
andLid_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 toNone. -
Magnetic lid retention.
Enable_Lid_Magnetscuts mating pockets in the
box and lid, held in bosses at the four inside corners. Corners rather than
the rim because the rim is onlyWall_Thicknesswide 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 existingGridfinity_Magnet_*
convention:Lid_Magnet_Diameter6.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.pybuilds the assets reproducibly, and
scripts/release_notes.pywrites 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 tov2.0.0-rc.3carried 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_Stylechooses 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.Skirtwraps 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_Heightbelow the rim, even when only the box is rendered. At
the defaults that capsStabilizer_HeightatBox_Height - 4.85. The
defaults and all nine presets are well inside it. SetLid_Style=Skirtfor
fins that reach the rim.
Changed
-
Lid_Lip_Gapis now a clearance on each side, and defaults to0.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 confirmed0.15for both lid
styles, with and without magnets, on a Bambu Lab P1S printing PLA+. No preset
setsLid_Lip_Gap. -
All_Openings_Upnow defaults to5instead of0. 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. SetAll_Openings_Up=0to
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 fromv2.0.0-rc.2no longer matches what the
model produces from the same parameters. -
Calibration coupons no longer ship.
v2.0.0-rc.4attached them as
cable-box-calibration.zip, built from acalibration/folder. They are now
maintainer tooling outside the repository.docs/PRINTING.mddescribes 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.mdnow
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.htmlfile 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 backthreeuntil@google/model-vieweraccepts 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 byscripts/build_readme_images.pyinstead 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...
v2.0.0-rc.4 - Calibration coupons, for print validation
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.zipholds every preset's STLs,config.jsonand 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_Widthis 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.
- The lid relief is now dropped over an opening raised to the rim by its own
- 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-pairandtab-clip-paircoupons 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-1x1coupon answers this.
Full 2.0.0 changelog so far
Added
-
Edge treatment.
Bottom_Edge_Filletrounds the box's outer bottom edge
andTop_Edge_Chamferchamfers 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 to0, and at0the code takes
the samecuboid()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_StyletakesScallop(a concave groove)
orTab(a protruding grip), placed byLid_Relief_On_Left/Right/Front/Back
mirroring the existingOpening_On_*block, and sized byLid_Relief_Width
andLid_Relief_Depth.Lid_Lip_Gapdefaults 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 toNone. -
Magnetic lid retention.
Enable_Lid_Magnetscuts mating pockets in the
box and lid, held in bosses at the four inside corners. Corners rather than
the rim because the rim is onlyWall_Thicknesswide 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 existingGridfinity_Magnet_*
convention:Lid_Magnet_Diameter6.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 incalibration/config.json, exported and checked by
scripts/build_calibration.pyfor 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.pybuilds the assets reproducibly, and
scripts/release_notes.pywrites 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 ascable-box-calibration.zip. Releases up tov2.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_Upnow defaults to5instead of0. 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. SetAll_Openings_Up=0to
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 fromv2.0.0-rc.2no 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.mdnow
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.htmlfile 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 backthreeuntil@google/model-vieweraccepts 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 byscripts/build_readme_images.pyinstead 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 onlyAll_Openings_Up. An opening raised to
the rim by its ownMove_Opening_*_Upstill got a tab standing over it. The
check now uses the opening's real top edge. - Relief width on long, narrow boxes.
Lid_Relief_Widthwas checked
against the shorter ofBox_WidthandBox_Depthfor 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
aboveBox_Heightis 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 againstBox_Heighteven 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...
v2.0.0-rc.3 - Side openings lift off the floor, for print validation
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.
- 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. - 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. - Does the box underside still seat in a real baseplate? Unchanged since
v1.2.0-rc.1 and still unprinted. - 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
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-compactIt 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 BOSL2cable-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
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_clipis 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
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/BOSL2Or 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
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_Heightstill 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
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: noand 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)
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_Heightstill 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:
- Does the box underside seat in a real Gridfinity baseplate? Check fit and tune
Gridfinity_Profile_Clearance. - 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.
- 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.