Replace manual support painting with general-purpose Bambu Studio PLA recipe + manually-baked narrowing-pillar / tree-support workflow (with mesh-ray-cast placement) for TPU-safe coverage of vertical members + PR #35 T3-prism gcode verification on Bamb... - #66
Replace manual support painting with general-purpose Bambu Studio PLA recipe + manually-baked narrowing-pillar / tree-support workflow (with mesh-ray-cast placement) for TPU-safe coverage of vertical members + PR #35 T3-prism gcode verification on Bamb...#66
Conversation
|
@copilot no, we need this to be general-purpose. Try to figure this out for a single-material PLA print using bambu slicer |
Want to make sure I take this in the right direction before rewriting — when you say "general-purpose" for single-material PLA in Bambu Studio, do you mean: (a) Drop the custom enforcer-STL workflow entirely and replace this PR with a documented Bambu Studio profile/settings recipe (tree(auto) + (b) Keep the enforcer-STL idea but make the generator geometry-agnostic — take an arbitrary input STL/3mf, auto-detect bottom-facing cylindrical members, and emit enforcer prisms under each one (no hard-coded (c) Something else (e.g. a Bambu Studio process/ I'm leaning toward (a) since it's the simplest thing that actually generalizes across geometries, but want to confirm before I tear out |
…geometry-agnostic fallback generator Agent-Logs-Url: https://github.com/vertical-cloud-lab/tensegrity-optimization/sessions/80f96023-40fd-457c-a568-bb77ad9f69b6 Co-authored-by: sgbaird <45469701+sgbaird@users.noreply.github.com>
Done in 21ca244 (plus a doc-path clarification in the follow-up commit). Path (a) — primary, no painting required for any tensegrity structure:
Path (b) — fallback for exotic topologies the auto recipe fails on:
|
Agent-Logs-Url: https://github.com/vertical-cloud-lab/tensegrity-optimization/sessions/80f96023-40fd-457c-a568-bb77ad9f69b6 Co-authored-by: sgbaird <45469701+sgbaird@users.noreply.github.com>
…review render Agent-Logs-Url: https://github.com/vertical-cloud-lab/tensegrity-optimization/sessions/95196825-ad83-42ca-86cf-0a7a108ea58f Co-authored-by: sgbaird <45469701+sgbaird@users.noreply.github.com>
Done in fb41388. Sliced Slice summary: 601 layers / 0.20 mm / 38.39 cm³ PLA / 6 h 52 m / 425 230 extrusion segments (96 176 support · 327 553 object · 1 198 brim). Supports = organic tree, buildplate-only, θ=40°, tip Ø 0.8 mm, 5 mm outer brim, bridges unsupported. 3-panel gcode render (bottom-view supports-only · iso object+supports · first layer): What to look for vs. Audrey's manual paint:
Reproduction recipe + full slice metrics in |
…r height) + clarify branch reference Agent-Logs-Url: https://github.com/vertical-cloud-lab/tensegrity-optimization/sessions/95196825-ad83-42ca-86cf-0a7a108ea58f Co-authored-by: sgbaird <45469701+sgbaird@users.noreply.github.com>
|
@copilot the PLA near vertical oriented struts appear to be unsupported, which is problematic when we move to TPU which struggles to hold itself up. That's why I want you to figure out a way to force supports all the way along the bottom of the shallow overhang |
…overage; re-slice + add before/after comparison panel Agent-Logs-Url: https://github.com/vertical-cloud-lab/tensegrity-optimization/sessions/67def28e-b528-405b-aaef-3c533f80feba Co-authored-by: sgbaird <45469701+sgbaird@users.noreply.github.com>
PR35's branch HEAD mesh has drifted (blob d552684 vs 4db9b48 at the 65d0d3f commit that HOW-TO-PRINT pins for the struts/cables STLs and that the committed pillar artefacts match). Cages regenerated from the pinned mesh: 3 tendons Ø4.8-4.95 mm, tilt 19.7 deg, z 22-100 mm, full 3x97 mm pillars + 3-4 C-rings each, 3,736 tris. Co-authored-by: Sterling G. Baird <45469701+sgbaird@users.noreply.github.com> Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Sterling G. Baird <45469701+sgbaird@users.noreply.github.com> Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Sterling G. Baird <45469701+sgbaird@users.noreply.github.com> Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…age builder - verify_cage_geometry.py: NO-CONTACT / ON-PLATE / ENCIRCLE / REMOVABLE checks, exits non-zero for CI gating. Lifts the part into the cage frame (raw PR35 mesh sits at z_min=-7.65; the generator builds output in the lifted on-plate frame) - without the lift every distance is offset and the checks false-fail. - build_tendon_cages: final vertex-level clash gate on each emitted pillar/ring (with guard-shortening retries), hardening the sparse sample-based pre-checks against thin diagonal members near joints. - Regenerated cage STL/report at default gaps; verified: closest cage-to-part distance 0.92 mm, 82 plate feet, max azimuth gap 92 deg, opening chord > tendon dia on all 3 tendons. - Re-rendered preview with the part in the lifted frame (previous render had the part 7.65 mm low relative to the cages). Co-authored-by: Sterling G. Baird <45469701+sgbaird@users.noreply.github.com> Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Sterling G. Baird <45469701+sgbaird@users.noreply.github.com> Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Sterling G. Baird <45469701+sgbaird@users.noreply.github.com> Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Noting that at some point, we started printing smaller structures. This could also be contributing a bit towards the difficulty of printing. We can try upscaling a bit, too. Obviously increases the print time. @claude is there some kind of physics-based or other kind of simulation we could run to help us decide on the right path to better manual supports and printing? TPU humidity is a clear, recurring issue, but there's not a lot we can do about it being more humid outside recently. We're already doing a lot of dry cycles. Likewise send an edison query asking for advice on the issues being experienced in #35 and how this might be addressed. Provide general feedback on our approaches here, too. |
|
Claude finished @sgbaird's task in 16m 26s —— View job TL;DRYes — and I built one. The decisive physics for the tendon failures is beam mechanics: a Ø4.8 mm × ~80 mm TPU 85A column has ~1000× the lateral compliance of the same column in PLA, so any nozzle touch moves it millimetres. I committed an analytic nozzle-wobble simulation ( Todos — all complete
1. The simulation you can run now (committed)
Key scaling facts that fall out of the model:
2. Edison's advice on the PR #35 issues (full answer · references, 14-item prioritized table with citations)On humidity/bubbling (the part you can partially do something about):
On tendon stabilization, Edison independently converges on the cage: 3–4 PLA guide towers per tendon, and notes a free-standing shield gives almost no restraint unless it's a close-fitting cage — which is what the On simulation strategy, it recommends exactly the ladder we're on: Level 1 = reduced-order beam model (now committed) → Level 2 = CalculiX/FEniCSx nonlinear beam + nozzle contact with element activation (a natural extension of the existing 3. General feedback on the approaches in this PR
Committed in this session
|
Co-authored-by: Sterling G. Baird <45469701+sgbaird@users.noreply.github.com>
…vs PLA) Co-authored-by: Sterling G. Baird <45469701+sgbaird@users.noreply.github.com>
…k dump Co-authored-by: Sterling G. Baird <45469701+sgbaird@users.noreply.github.com>
@claude we have the fancy Bambu Lab single channel dry box, forgot the name, ams pro 2 or something like that, and according to Jinkwan there is now a PTFE tube connecting from the box to the chamber and we have the new TPU assist module, too
Run all of these, as best as you can, as comprehensively as you can, iteratively in terms of design, up to your full 3 hr timeout window |
|
Claude finished @sgbaird's task in 36m 25s —— View job TL;DRRan the full Edison simulation ladder (Level 1 analytic sweep → Level 2 CalculiX contact FEA → Level 3 g-code-driven thermal FEA) end-to-end on the PR #35 tendon cages, and the simulations changed the design: the old cage's 120° ring opening was an escape corridor — the tendon could wobble clean out of the cage in that direction, which no amount of ring tuning would fix. The cage is now regenerated with sim-tuned parameters (rings every 12 mm, gap 0.8 mm, opening 70°) that bound the tendon's wobble to ~1 mm in every direction while staying removable (the soft TPU cable squeezes out of the sub-diameter opening after printing). All four geometry checks PASS on the new artefact, and the merged part+pillars+cages mesh slices cleanly on the live Bambu Studio H2D CLI (646 layers, ~6 h 25 m). Also noted your dry-box/PTFE/TPU-assist hardware in the docs — that closes Edison's #1 recommendation, leaving drying protocol + spool-mass verification as the remaining materials-side actions. The simulation ladder (all committed, all reproducible)Level 1 — Level 2 — Level 3 — Design iteration (
|
…ow in place Co-authored-by: Sterling G. Baird <45469701+sgbaird@users.noreply.github.com> Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… in 120-deg opening Swept-contact cross-section model of the exact build_tendon_cages layout shows the committed C-ring opening (120 deg, chord 6.37 mm > tendon dia) plus the pillar spacing leaves an azimuthal corridor through which the tendon escapes the cage entirely. Recommended design from the sweep: opening 70 deg (soft-TPU squeeze-out ratio 0.76 keeps it removable), ring gap 1.2 -> 0.8 mm, ring spacing 18 -> 12 mm. Worst-direction free travel drops from escape to 1.06 mm; closed-direction worst deflection 1.25 -> 0.81 mm (10 mN nozzle force + self-weight sag of the 19.7-deg tilted tendon + Newton-cooling hot tip). Co-authored-by: Sterling G. Baird <45469701+sgbaird@users.noreply.github.com> Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ot clamps Tilted (19.7 deg) TPU 85A tendon grown layer-by-layer as B32 beams, NLGEOM statics under gravity + 10 mN nozzle force, C-rings as active-set unilateral stops. Cross-validates Level 1: bare tendon 4.2 mm FEA vs 4.75 mm analytic; bare self-weight buckling SF 30.5 (ccx *BUCKLE) vs 29 Greenhill hand-calc. New finding: because a ring caps translation but rotation carries past it, the committed cage really allows 1.83 mm worst print-front wobble (fresh-clamp analytic said 1.25); the Level-1 recommended design (gap 0.8 @ 12 mm) holds 1.15 mm. Also found and worked around a ccx 2.21 defect: SECTION=CIRC beam expansion is ~14x too compliant and diverges under mesh refinement; SECTION=RECT converges to the analytic cantilever, so the model uses the I-equivalent square section (side (12I)^0.25, area within 2.3%). Co-authored-by: Sterling G. Baird <45469701+sgbaird@users.noreply.github.com> Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…mal softening second-order Sliced the committed part+pillars mesh on the live BambuStudio 02.06.00.51 CLI / H2D 0.4-nozzle PLA profile (646 layers, 5h33m est), integrated per-layer times from the g-code (~30 s/layer across the tendon span), ran Newton cooling + an engineering E(T) map for TPU 85A, and fed the resulting per-element modulus profile into the Level-2 CalculiX contact FEA. Findings: only ~1.0 mm of tendon below the print front is still soft (E < E/2) when the nozzle returns on the real schedule (0.2 mm on the slower PLA+TPU schedule), so wobble is dominated by elastic compliance and cage clearance, not melt softening — the fixed 0.5 mm hot-tip assumption in Levels 1-2 was sound. Even a worst-case 3 s/layer tendon-only schedule (9.5 mm soft) only raises the caged deflection from 1.03 to 1.10 mm, quantifying Edison's print-several-parts advice (#10) as insurance rather than a primary lever for this geometry. Co-authored-by: Sterling G. Baird <45469701+sgbaird@users.noreply.github.com> Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…+ regenerated artefacts generate_support_pillars.py cage defaults are now the sweep/FEA-tuned values: ring gap 1.2 -> 0.8 mm (the wobble floor), ring spacing 18 -> 12 mm (rings are point stops and must engage together), opening 120 -> 70 deg with a new --cage_squeeze 0.75 removability floor (chord as a fraction of tendon diameter). The old rigid-body rule (chord > diameter + 0.6) is gone: the Level-1 restraint rose showed such an opening is an escape corridor the tendon can wobble through during the print, while a soft TPU tendon still squeezes out of a 0.75x chord afterwards. verify_cage_geometry.py's REMOVABLE check now enforces the squeeze criterion (and reads the squeeze value from the report). Regenerated the PR35 cage artefacts against the pinned 65d0d3f mesh: 3 tendons, 3 pillars + 5-6 rings each, 6,096 tris, all four checks PASS (NO-CONTACT 0.54 mm, ON-PLATE 82 feet, ENCIRCLE <= 92 deg, REMOVABLE 0.76x squeeze), preview + rotating GIF re-rendered. Also fixed the ccx 2.21 SECTION=CIRC defect in fea_support_stability.py (same I-equivalent RECT workaround as fea_tendon_wobble.py): corrected self-weight buckling SF for the PLA tree supports is 245x, not 61x (old number was conservative; all PASS verdicts stand). Verification README gains a 'Simulation ladder' section documenting all three levels; HOW-TO-PRINT documents the squeeze-off removal. Co-authored-by: Sterling G. Baird <45469701+sgbaird@users.noreply.github.com> Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ages (646 layers, ~6h25m) Co-authored-by: Sterling G. Baird <45469701+sgbaird@users.noreply.github.com> Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
@claude I guess we're using 85A, not 90A? |
|
Claude finished @sgbaird's task in 1m 28s —— View job Yes — 85A, everywhereEverything in this PR (and PR #35) is built around TPU 85A; there is no 90A assumption anywhere on this branch.
Where 85A is pinned
The only 90A mentions in the repo are inside quoted literature in the Edison artifacts (a study that processed 85A and 90A grades side-by-side) — not anything we're using as a spec. If the spool on the printer is actually 90ANothing breaks, and the safety margins move in the right direction: 90A is roughly 1.5–2× stiffer than 85A, so the wobble/sag predictions (bare-tendon 4.4 mm, caged ~1 mm) become conservative over-estimates, and the cage squeeze-out removal gets slightly harder but 0.76× chord is still fine for 90A. The only real changes would be swapping the filament profile in the MM slice ( |
|
Noting also that another alternative we hadn't really considered is using a harder TPU.. |
|
@claude pull up a report on if white vs. black PLA (basic PLA from Bambu, just different colors) have any noticeably different material properties, particularly when it comes to shock transmission, stiffness, etc. |
|
Claude finished @me-madsen's task in 18m 38s —— View job White vs black Bambu PLA Basic: what the data actually supportsShort answer: stiffness, no difference. Strength, a couple of percent. Shock transmission and damping, nobody has measured it, and the physics leaves almost no room for it to matter. Full write-up + reproducible analysis committed at 1. Stiffness — the cleanest resultThere is exactly one study that holds the base resin fixed and reports white and black separately: Wittbrodt & Pearce, Addit. Manuf. 8:110 (2015) (five colours all extruded from the same NatureWorks 4043D pellets, printed at 190 °C, ASTM D638 + XRD). I pulled the full preprint for the table:
Bambu itself publishes one TDS for all ~30 PLA Basic colours with no per-colour data: E(X-Y) = 2580 ± 220 MPa, UTS(X-Y) = 35 ± 4 MPa, ρ = 1.24 g/cm³. Worth knowing: the V2.0 sheet quotes wildly different numbers from V3.0 for the same line (unnotched impact 61.2 → 26.6 kJ/m², MFI 45.8 → 23.2 g/10 min). Revision drift in this product line dwarfs anything colour does. 2. Shock transmission — bounded by a square rootStress-wave propagation in a slender member goes as
Take the deliberately pessimistic case of a white member at one band edge bonded to a black member at the other: For damping: room-temperature tan δ of glassy PLA is ~0.01–0.03 and is set by the polymer's sub-Tg relaxations. A ~1–3 wt% pigment loading isn't a plausible route to moving that, whereas infill, wall count and interlayer bond quality demonstrably are — the printed-PLA damping literature specifically ties high damping to poor inter-filament bonding. 3. Where colour does show up (and why it's mostly process, not polymer)Multi-colour surveys report big spreads (up to 31 % UTS over 14 colours, 80 % impact over 10 colours), but the extremes in those sets are red / pink / silver, not white or black, and none separates pigment from carrier resin, dispersant or lot. Panel B puts them next to effects we already accept as ordinary: print direction alone is 93 % on impact and 25 % on modulus. Two findings from the Edison literature query (task
4. Recommendation
Todos
Not done: no experiment was run. Everything above is published data plus closed-form derivation from it. If you want a repo-local answer, the drop/modal test in the last bullet is the thing to do, and it needs hardware, not more literature. |
…ack) change mechanics? Co-authored-by: Marcus Madsen <265197858+me-madsen@users.noreply.github.com>
…e + derived shock-transmission analysis Co-authored-by: Marcus Madsen <265197858+me-madsen@users.noreply.github.com>
…cs and viscoelasticity Co-authored-by: Marcus Madsen <265197858+me-madsen@users.noreply.github.com>
…ck transmission Co-authored-by: Marcus Madsen <265197858+me-madsen@users.noreply.github.com>







Audrey's manual paint protocol (bottom-view stripes along each member's centerline, ~1/3 projected width, trimmed at vertex overlaps except the three bed-contact vertices which are connected triangularly) is laborious, gets wiped whenever the source mesh is re-rendered, and does not generalize across the structure families and parameter sweeps planned in PR #22. This PR replaces the paint step with a general-purpose, single-material PLA support recipe for Bambu Studio that works on any tensegrity topology without per-geometry tuning, plus a manually-baked narrowing-pillar / tree-support STL workflow for any print that contains vertical or near-vertical members (e.g. the vertical TPU cables of a T-prism). Overhang analysis can never flag a perfectly vertical cylinder as an overhang regardless of
support_threshold_anglevalue — it has no down-facing surface — so the slicer settings alone are physically incapable of placing supports under vertical cables. The narrowing-pillar path was therefore promoted to the recommended TPU-safe path (replacing the Support Enforcer STL approach, which still proved unreliable in practice and is kept only as a secondary fallback).The headless verification toolchain now targets the actual Bambu Lab H2D 0.4 nozzle system profile via the genuine Bambu Studio CLI (the
bambu-studiobinary shipped in the BambuStudio Linux AppImage). The previously-used OrcaSlicer fork has been dropped: the Ubuntu 24.04 Bambu Studio build links libsoup-3.0 / WebKit2GTK-4.1 (the older 2.4 / 4.0 dependency was only an issue on legacy AppImage builds) and runs cleanly under xvfb, so we no longer need a community fork to drive the sameresources/profiles/BBL/bundle. The PyPIbambu-clipackage is a printer-control MQTT client, not a slicer, so it isn't applicable here.Changes
Path (a) — Bambu Studio settings recipe (no painting, no per-geometry code)
Suitable on its own for PLA-only prints whose members all have a meaningful tilt away from vertical.
cad/print-supports/README.md— derives the override set that reproduces Audrey's "centerline stripes, ~1/3 member width, no vertex overlaps, three bed-vertices bridged" pattern from the slicer's overhang analysis instead of paint flags:support_type = tree(auto)+support_on_build_plate_only = 1(branches root at the plate, never on a member — matches the bottom-view-only rule).support_threshold_angle = 10(flags the entire down-facing side of every tilted member as an overhang so the tree generator builds branches from the plate all the way along each strut's bottom). Documented limitation: this still cannot cover perfectly vertical surfaces (there's no down-facing geometry to detect); use §C for those.tree_support_tip_diameter = 0.8+tree_support_branch_distance = 2.5(reproduces the ~1/3-of-member-width stripe coverage).bridge_no_support = 1(the three bottom-triangle cables bridge cleanly between bed-contact vertices).brim_type = outer_only,brim_width = 5(insurance against tip-over for the tiny node footprints).cad/print-supports/bambu-pla-tensegrity-process.json— one-shot importable process-override snippet (Process → Add → Import process).Path (c) — manually-baked narrowing-pillar / tree-support STL generator (primary TPU-safe path / any structure with vertical members)
Tapered contact pillars are baked directly into the printable mesh — bottom view, narrowing upward from the bed to a small contact patch on the underside of each member. Because they are part of the printed object (not slicer supports), they print reliably regardless of slicer behaviour around vertical cylinders, are visible in any STL viewer before sending to the printer, and snap off cleanly after printing.
The generator now defaults to a Bambu-Studio-style
--treemode (in response to print-floor feedback that the earlier one-cone-per-cell pillars were effectively solid columns that fused onto the part and tore it on removal, and built up too much material on the plate):--treemode — slim Ø0.4 mm breakaway contact tips merge pairwise into thin, near-hollow Ø1.8 mm self-supporting branches (kept within--max_branch_angle, default 40°, of vertical) that converge agglomeratively onto just a few trunk feet on the build plate instead of one wide base per pillar. This dramatically reduces both the part-contact area (clean snap-off, no fused infill) and the build-plate footprint. Branch/trunk/tip diameters are tunable via--branch_d,--trunk_d,--tip_d; merging is controlled by--merge_radius. All emitted geometry is clamped to the build plate (z ≥ base_z).tree_support_tip_diameterdefaults to 0.8 mm, with official guidance to shrink it toward 0.3–0.4 mm for fine/delicate features). The previous Ø 0.6 mm tip flared to the branch over only 1.5 mm, giving a ~0.8 mm effective contact footprint at the part (right at Bambu's default). The defaults are now--tip_d 0.4mm (one nozzle width — finer than Bambu's default, matching its delicate-feature guidance; the tip is buried--tip_overshoot 0.3mm into the member so it still slices reliably) and--tip_contact_h 2.5mm (up from 1.5 mm) so the slim neck stays narrow for longer before flaring to branch width, dropping the surface contact footprint from ~0.8 mm to ~0.55 mm. Both knobs remain CLI-tunable.cad/print-supports/generate_support_pillars.py— geometry-agnostic generator. Three placement modes, each usable with or without--tree:--stl part.stl(mesh-ray-cast mode, primary) — usestrimesh's ray-intersection engine to look "up from the build plate" through the actual printable mesh. For each cell of an XY grid (--spacing, default 4 mm for the committed artefacts) it casts a +Z ray and inspects every triangle the ray crosses (multiple_hits=True), classifying each by its face normal: a closed solid is entered through a down-facing face (a member's underside) and exited through an up-facing one. A contact tip is placed under each down-facing underside that sits above--min_clearanceand has more than--min_gapmm of open air directly below it (so faces already resting on the plate or on a lower member are skipped); the--down_normal_maxknob sets how steep a face still counts as down-facing. In tree mode those undersides become the branch tips. This replaced an earliermultiple_hits=Falseversion that recorded only the single lowest surface per XY column — which silently dropped every member stacked above another one, most importantly the bottom end-caps of the vertical TPU cables that hang above the struts, so they printed unsupported and the print failed. Walking all crossings now guarantees a tip on the underside of every member at every height — including joint-sphere bulges, fillets, members crossing over other members, and any other geometry the centerline-sampling / lowest-hit modes missed. The committed run (--spacing 4 --min_clearance 1.5 --min_gap 1.0 --merge_radius 22) yields 188 tips spanning z ≈ 1.6–126.1 mm (verified byverify_support_geometry.pyto land on the part underside to within 0.0000 mm, with all feet clamped to the plate).--topology t3_prism|prism_npreset (built-in, no extra dep) — parametric centerline sampling along each member.--members my_members.json(list of{p1, p2, d, trim_ends}) — parametric centerline sampling for arbitrary structures.numpyalways;trimeshonly for the--stlray-cast mode.Path (c′, fallback) — geometry-agnostic Support Enforcer STL generator
Kept as a secondary fallback for users who want to drive supports through the slicer rather than baking them into the mesh.
cad/print-supports/generate_support_enforcers.py— geometry-agnostic enforcer-STL generator. Same--members JSON/--topology presetinterface; vertical members emit footprint enforcers via--vertical_pad.Support verification — geometry checks + layer-by-layer CalculiX FEA (
cad/print-supports/verification/)Added in response to a print failure where the committed support STL was found to be stale — re-casting the underside rays against the real PR #35 mesh produces 188 contact points (z ≈ 1.6–126.1 mm), but the previously committed
t3-prism-pr35-pillars.stlheld only 181 (topping out at z ≈ 112 mm), so the 7 top-cap / joint undersides were missing and the highest members printed unsupported. The artefacts are regenerated and two automated, reproducible verification tools now gate against this recurring (eyeballing the preview was not enough):verify_support_geometry.py(new) — uses trimesh's exact ray/proximity engine, exits non-zero on any failure. Four invariants, all PASS on the committed artefact:--tip_overshoot).fea_support_stability.py(new) — CalculiX (ccx) layer-by-layer FEA. Reconstructs the emitted branch network, extracts the worst-case column (longest continuous run = 108.5 mm, 1.2° from vertical, Ø1.8–3.1 mm) and grows it from the plate: self-weight buckling min safety factor 61× (PASS), tip-over COM margin 27.8 mm inside the convex hull of 1148 plate contacts / 79 mm base span (PASS), plus a documented worst-case lateral-compliance caveat (a fully free-standing 108 mm Ø1.8 mm column is floppy, but never stands free in practice — neighbouring struts/branches print in lockstep, in-print forces are ~hundredths of a N, the 5 mm brim anchors the feet; bump--trunk_dor--merge_radiusto brace a taller lone column). Producest3-prism-pr35-fea-stability.png.render_pillars_preview.py(new) — still iso + bottom-view preview renderer (the preview PNG previously had no committed generator), matching the rotating-GIF scene/colours.bambu-studioCLI — see the slice subsection below.End-to-end verification on PR #35 T3-prism (
cad/print-supports/verification/) — Bambu Lab H2D + Bambu Studio CLIslice_bambu_h2d.py(renamed fromslice_h2d.py) — headless slicing driver. Resolves the BambuStudio AppImage's bundled Bambu Lab H2D 0.4 nozzle machine profile, walks theinheritschain through the matching process +Bambu PLA Basic @BBL H2Dfilament, layers the tensegrity overrides frombambu-pla-tensegrity-process.jsonon top, and invokes thebambu-studioCLI under xvfb. Supports the path-(a) auto-only flow, the path-(c) baked-pillar flow (slice the combined mesh with--no-repo-overrides --override enable_support=0, keeping the 5 mm brim), and the path-(c′) enforcer flow.t3-prism-pr35-with-pillars.stl(part + baked tree pillars) slices end-to-end with no errors on the genuine BambuStudio 02.06.00.51 CLI / Bambu Lab H2D 0.4 nozzle PLA profile: 646 layers, max_z 129.20 mm, 20 094 mm / 60.90 g filament, ~5 h 36 m. Because the pillars are baked into the mesh, slicer-side support generation is disabled so it slices as one solid object. (Running the Ubuntu-24.04 AppImage CLI headlessly requires thelibgstreamer1.0-0,libgstreamer-plugins-base1.0-0,libsoup-3.0-0,libwebkit2gtk-4.1-0,libgtk-3-0apt libs.)render_gcode.py— gained a--baked-supportsmode so the gcode preview is honest for a single-object (baked-pillar) slice: the slicer emits noSupportfeatures, so the panels are relabelled to show the object (members + baked pillars) coloured by layer height plus the pillar feet + brim that land on the plate. The default (path-(a) slicer-supports) behaviour is unchanged.diff_supports.py,gcode_to_stl.py,merge_stls.py— gcode parsers/renderers and STL utilities, unchanged from prior revisions of this PR.render_pillars_gif.py— small matplotlib-based renderer that loads the combined part+pillars STL and writes a rotating 360° GIF (configurable frame count, elevation, FPS, resolution) so the bed-up support coverage can be verified visually from every angle without an external viewer.build_enforcer_3mf.py— bundles a printable STL + an enforcer STL into a single 3MF with the enforcer markedvolume_type=SupportEnforcer(used only for the fallback enforcer path).t3-prism-pr35-pillars.stl(regenerated, tree mode with the finer Ø 0.4 mm contact tips and the multi-hit underside ray-cast, 188 contact tips / 31 trunk feet / 23,520 tris) — tree-support mesh produced bygenerate_support_pillars.py --stl … --treeray-cast against the actual PR Add T3-prism (3-strut tensegrity) parametric CAD with Bambu PETG.gcode.3mfslice + re-importable project.3mf(H2D-only, supports enabled, scale 1.5× / cable_d 4.5 mm) + PLA-cables and PLA-struts/TPU-cables MM variants (with modeled-in PLA scaffo... #35 T3-prism printable mesh, so every down-facing underside the bed's-eye rays cross gets a tip (including the vertical-cable end-caps, members stacked above struts, and the top-cap / joint undersides the prior stale 181-tip pass missed) while branching off only a handful of feet on the plate.t3-prism-pr35-with-pillars.stl(regenerated, 50,336 tris) — combined printable STL (T3-prism + ray-cast tree supports merged viamerge_stls.py), ready to slice as a single solid object with no slicer-side support material required.t3-prism-pr35-pillars-preview.png(regenerated, viarender_pillars_preview.py) — iso + bottom-view render showing the T3-prism part in grey with the ray-cast tree supports (orange) branching from a few feet up to the underside of each member at every height, including the joint-sphere bulges and the vertical-cable end-caps the prior lowest-hit pass missed.t3-prism-pr35-pillars-gcode-preview.png(new, viarender_gcode.py --baked-supports) — 3-panel render of the on-hardware-profile slice of the combined part+pillars mesh: bottom view + first-layer panels show every baked pillar foot and member base landing on the bed inside the brim, and the height-coloured iso panel confirms the toolpath spans the full z ≈ 0–126 mm with everything rooted on the plate.t3-prism-pr35-pillars-rotating.gif(regenerated) — rotating 360° turntable animation of the combined part+pillars mesh (object grey, supports orange), produced byrender_pillars_gif.py, for full-angle visual verification of support-to-underside coverage.t3-prism-pr35-fea-stability.png(new) — 2-panel CalculiX FEA figure (layer-by-layer buckling safety factor + tip-over margin) produced byfea_support_stability.py.README.md— full reproduction recipe for path (a), path (c) multi-hit ray-cast tree supports / narrowing-pillars (and the parametric--topology/--membersfallbacks), the path (c′) enforcer fallback, the rotating-GIF render step, a verification section documentingverify_support_geometry.py,fea_support_stability.py,render_pillars_preview.pyand their results (geometry all-PASS; FEA buckling SF 61×, tip-over margin 27.8 mm, lateral-compliance caveat), and a new on-hardware-profile slice subsection with theslice_bambu_h2d.py --no-repo-overrides --override enable_support=0recipe, therender_gcode.py --baked-supportspreview step, and the slice result table (646 layers, 129.2 mm, 60.9 g, ~5 h 36 m). Includes a "why these defaults" rationale that documents the Ø 0.4 mm tip / 2.5 mm contact-neck choice against Bambu Studio's own tip-diameter defaults and delicate-feature guidance, plus the multi-hit underside detection and the--min_clearance 1.5 --min_gap 1.0defaults.cad/print-supports/HOW-TO-PRINT.md— GUI print guide for the Bambu Studio multi-STL upload, updated to describe the tree supports, their easier breakaway removal, and the--branch_d/--trunk_d/--tip_d/--tip_contact_h/--merge_radius/--min_gaptuning knobs.