Skip to content

Add T3-prism (3-strut tensegrity) parametric CAD with Bambu PETG .gcode.3mf slice + 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

Open
sgbaird-alt with Copilot wants to merge 44 commits into
mainfrom
copilot/get-bambu-sliced-print-t3-prism
Open

Add T3-prism (3-strut tensegrity) parametric CAD with Bambu PETG .gcode.3mf slice + 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
sgbaird-alt with Copilot wants to merge 44 commits into
mainfrom
copilot/get-bambu-sliced-print-t3-prism

Conversation

Copilot AI commented May 8, 2026

Copy link
Copy Markdown
Contributor

T3-prism slicing fixes (PR #35 comment 4464399849)

  • Diagnosed "only PLA shown": Metadata/project_settings.config had filament_colour=['#00AE42'] and filament_map=['1'] (length 1) but filament_settings_id/filament_type had length 2 — Bambu Studio uses the shorter array length to determine filament count, so it imported as single-material PLA.
  • Diagnosed "floating supports": scaffold pillars started at SCAD z=0 but the lowest model point is the joint-sphere bottom at SCAD z=-joint_d/2 = -5.25 mm (scale 1.5). When Bambu lifted the assembly so the lowest point sat on the bed, the pillars floated ~5.25 mm above it.
  • Fix 1: patch_mm_extruder.py now also patches Metadata/project_settings.config — pads filament_colour from a default extruder palette and filament_map with ascending extruder IDs to match filament_settings_id length, and switches filament_map_mode to Manual so Bambu Studio honours the per-extruder routing.
  • Fix 2: in t3-prism.scad pillar_to(), drop pillar bases to SCAD z=-joint_d/2 so they reach the bed when the assembled model sits on it (matches the lowest point of the struts/joints).
  • Re-rendered STLs and re-ran render_print.sh end-to-end → all 3 MM project .3mfs now show filament_colour=['#00AE42','#76D9F4'], filament_map=['1','2'], filament_map_mode=Manual; scaffold STL z-range now [-1.75, 113.74] matching the struts STL exactly.
  • Re-rendered t3-prism.H2D-PETG-supports.png verification render.

T3-prism Sobol BO single-batch generator (PR #35 comment 4503109338)

BO batch multi-material project .3mf (PR #35 comment 4503267471)

  • "Split to parts" in Bambu Studio was producing a single object because the BO batch SCAD unioned struts and cables into one mesh and the generator only wrote a single combined STL.
  • Refactored bo/t3-prism-bo-batch.scad to expose per-specimen specimen_NN_struts() / specimen_NN_cables() modules and a top-level part = "all" | "struts" | "cables" switch, mirroring the cad/t3-prism/t3-prism.scad pattern used by the working t3-prism-separate-assembly.zip reference.
  • bo/t3_prism_sobol_batch.py now renders bo/t3-prism-bo-batch-struts.stl and bo/t3-prism-bo-batch-cables.stl as separate STLs (one per material), in addition to the combined preview STL.
  • Wired the BambuStudio CLI --assemble path into the BO script to produce bo/slices/t3-prism-bo-batch.H2D-MM-PLAstruts-TPUcables.3mf with PLA struts on extruder 1 (Bambu PLA Basic @BBL H2D), TPU 85A cables on extruder 2 (Bambu TPU 85A @BBL H2D 0.4 nozzle), and no auto-supports (manual-painting workflow). A --skip-mm-3mf flag is available for SCAD/STL-only runs.
  • Verified the MM project: filament_settings_id=['Bambu PLA Basic @BBL H2D','Bambu TPU 85A @BBL H2D 0.4 nozzle'], filament_type=['PLA','TPU'], filament_colour=['#00AE42','#76D9F4'], filament_map=['1','2'], filament_map_mode=Manual; Metadata/model_settings.config routes the struts STL to extruder 1 and the cables STL to extruder 2 — Split to parts now exposes both as independently-assignable parts.
  • Updated bo/README.md to document the new struts/cables STLs, the MM project .3mf, and the --skip-mm-3mf flag.

BO batch tighter plate spacing (PR #35 comment 4503427854)

  • Tightened the 3×3 plate packing in bo/t3_prism_sobol_batch.py by dropping the strut_d term from the per-specimen footprint estimate and reducing the inter-cell air gap from 5 mm → 2 mm.
  • Grid cell shrinks from 97.0 mm → 86.9 mm per axis (~30 mm tighter overall on the 350×320 mm H2D plate) while still keeping each specimen's bounding cylinder inside its cell.
  • Regenerated bo/t3-prism-bo-batch.{scad,stl,json,csv}, bo/t3-prism-bo-batch-{struts,cables}.stl, bo/t3-prism-bo-batch-{plate,iso}.png, and bo/slices/t3-prism-bo-batch.H2D-MM-PLAstruts-TPUcables.3mf end-to-end.

Captive TPU core inside PLA outer shell joints (PR #35 comment 4511036510)

  • Replaced solid joint spheres at every T3-prism vertex with a captive TPU core inside a hollow PLA outer shell (per PR Explore and validate joint design for PETG/PLA + TPU prints (5 candidate joints + OpenSCAD CAD + anchor-upset shape variants + Design F captive-core + Edison Phase-1/2/3/5 + Phase-4 submitted + lander-context reco + TPU-inside vs TPU-outside comparison... #39 comment 4461700096 / Design F adapted to a 3-cable junction):
    • PLA outer shell (joint_shell() in cad/t3-prism/t3-prism.scad): hollow sphere with a teardrop hull blend toward the strut and one cylindrical exit bore per outgoing TPU cable (3 per joint).
    • TPU captive core (joint_core() in cad/t3-prism/t3-prism.scad): solid sphere inside the cavity, continuous with the cable end-caps emerging through the bores.
    • Print-in-place clearance: bore = cable_d + 0.8 mm, core_od ≥ bore + 3 mm (TPU mass cannot back out any single bore), shell_id = core_od + 1 mm, shell_od = shell_id + 3.2 mm PLA wall.
    • use_captive_core toggle in t3-prism.scad (default true) preserves the legacy solid-joint path for direct comparison.
  • Mirrored the captive-core joint verbatim in the BO batch generator (bo/t3_prism_sobol_batch.py SPECIMEN_TEMPLATE) so every per-specimen joint is also captive-core, with per-specimen cable_d-derived shell/core/bore sizing.
  • Updated render_print.sh offset_z (3.5 → 8.15 mm), pillar_to(), and bo/specimen_footprint() / z_lift so the now-lower PLA shell underside lands on the bed and the per-specimen plate-grid cell accommodates the (larger) shell OD.
  • Re-rendered cad/t3-prism/{t3-prism, t3-prism-struts, t3-prism-cables, t3-prism-struts-scaffold}.stl + t3-prism-iso.png, and bo/t3-prism-bo-batch{.scad, .csv, .json, .stl, -struts.stl, -cables.stl, -plate.png, -iso.png}.
  • Documented the captive-core joint geometry, clearance rationale, and use_captive_core toggle in cad/t3-prism/README.md and bo/README.md.

TPU misalignment with joints

  • Diagnosed: previously cables.stl lowest world-Z was -cable_d/2 while struts.stl lowest was -max(strut_d, joint_d)/2; Bambu Studio's per-part auto-bed-placement therefore dropped the cables vs. the struts by ~3 mm — exactly the reported "horizontal cables going to the wrong z-height on the top and bottom".
  • Fixed by giving cables.stl the same world-Z bounding box as struts.stl:
    • The new captive TPU core spheres at every joint vertex naturally extend the cables-STL bbox to ±core_od/2.
    • Plus a 5 µm × 5 µm axial spike (cables_z_anchor() in t3-prism.scad, equivalent inline cube in the BO SPECIMEN_TEMPLATE) that pins the cables STL bbox to exactly the struts STL extents.
  • Verified at scale 1.5×: t3-prism-struts.stl z=[0.017, 121.283] vs t3-prism-cables.stl z=[0.000, 121.300] — sub-mm match. Verified for BO batch: struts.stl z=[0.068, 116.925] vs cables.stl z=[-0.000, 117.072] — sub-mm match across all 9 specimens.

BO batch plate spacing + prime tower reserve (PR #35 comments 4513164299 / 4513445377)

  • Added a reserved strip on +X of the H2D plate for the IDEX prime/flush tower (PRIME_TOWER_RESERVE_X), drawn as a thin slab marker in the preview SCAD only (not into the struts/cables STLs).
  • First pass dropped to 6 specimens in a 3×2 layout with a 12 mm air gap and 70 mm reserve; per follow-up feedback ("keep it to 3×3"), reverted N_SPECIMENS back to 9 in a 3×3 grid with a 6 mm inter-cell air gap and a 50 mm prime-tower reserve strip on +X, keeping the layout inside the 300×320 mm usable plate area while leaving room for the wipe tower.
  • Regenerated bo/t3-prism-bo-batch.{scad,stl,json,csv}, bo/t3-prism-bo-batch-{struts,cables}.stl, bo/t3-prism-bo-batch-{plate,iso}.png, and bo/slices/t3-prism-bo-batch.H2D-MM-PLAstruts-TPUcables.3mf end-to-end.
  • Added bo/__pycache__/ to .gitignore.

Bonded captive-core joints + per-specimen object grouping (PR #35 comment 4513722886)

Addressing three asks from @sgbaird:

  • TPU members connect at every vertex — the captive TPU core sphere at each vertex unions all three cable end-cap spheres + cable cylinders into one continuous TPU mass.
  • Full spherical PLA shell around each TPU vertex with no gaps except cable bores, in contact with the TPU core so the materials bond:
    • Dropped the teardrop hull blend toward the strut (every vertex shell is now a uniform sphere — consistent across all six vertices).
    • captive_core_clear = 0 so the TPU core touches the PLA inner wall (was a 0.5 mm radial print-in-place gap → now bonded).
    • captive_bore_clear = 0 so the PLA bore is exactly cable_d and the TPU cable fills it without an annular gap (was 0.4 mm/side).
    • Mirrored the same captive-core geometry in bo/t3_prism_sobol_batch.py SPECIMEN_TEMPLATE.
  • Each tensegrity iteration on the plate is its own Bambu Studio object with two part groups (PLA + TPU)bo/t3_prism_sobol_batch.py now:
    • Adds a spec=-1 filter to the generated batch SCAD so individual specimens can be rendered (-D spec=N).
    • Renders per-specimen STLs into bo/per-specimen-stls/t3-prism-bo-specNN-{struts,cables}.stl (one pair per specimen).
    • Passes all 2N STLs to BambuStudio --assemble and post-processes the resulting .3mf with a new _split_assembled_into_objects() helper that splits the single composite into N composite objects, each containing one struts part (extruder 1 / PLA) and one cables part (extruder 2 / TPU). Objects are not grouped; each can be moved independently while its PLA + TPU parts move together.
    • Verified in bo/slices/t3-prism-bo-batch.H2D-MM-PLAstruts-TPUcables.3mf: 9 <object> entries, each with two <part>s (struts→ext1, cables→ext2); 9 <model_instance> entries on the plate; filament_type=['PLA','TPU'], filament_map_mode=Manual, filament_map=['1','2'].
  • Re-rendered cad/t3-prism/{t3-prism, t3-prism-struts, t3-prism-cables, t3-prism-struts-scaffold}.stl + iso PNG, re-assembled cad/t3-prism/slices/t3-prism.H2D{,-PETG,-PETG.gcode,-MM,-MM-PLAcables,-MM-PLAstruts-TPUcables}.3mf, re-rendered bo/t3-prism-bo-batch-{plate,iso}.png + bo/t3-prism-bo-batch{,-struts,-cables}.stl + the 18 per-specimen STLs.
  • Updated cad/t3-prism/README.md and bo/README.md to document the bonded captive-core geometry and the per-specimen object grouping.

Accelerometer "igloo" mount on top vertices (PR #35 comment 4794790065)

Addressing @sgbaird's request to extrude a block on top of the top vertices with a pocket to secure the 3-axis accelerometer:

  • Added a parametric accelerometer mount to cad/t3-prism/t3-prism.scad (accel_mount() / accel_mount_local(), plus accel_* parameters and helper functions) fused onto each of the three top vertices:
    • Pocket sized to the Dytran 3133A4 accelerometer (measured 6 × 6 × 5.94 mm L×W×H, per PR Analyze drop-tower accelerometer "tuning" data (issue #71) #74 comment 4792400480), with accel_clear = 0.4 mm/side clearance for the adhesive bead and slide-in fit. Because the accelerometer is a physical part, its dimensions are absolute mm and are not multiplied by scale_factor.
    • Three walls + a floor and one open outward-facing front so the sensor slides in from the side and its cable feeds out horizontally.
    • A rounded "igloo" crown (accel_dome) over the pocket to reduce friction against the acrylic drop-test plate.
    • The mount is PLA and is unioned into t3_prism_struts(), so it routes to extruder 1 in the MM variant. Toggleable via add_accel_mount (default true).
    • Extended cables_z_anchor() by accel_rise() so the cables STL bounding box still matches the now-taller struts STL (verified sub-mm parity).
  • Re-rendered cad/t3-prism/{t3-prism, t3-prism-struts, t3-prism-cables, t3-prism-struts-scaffold}.stl + t3-prism-iso.png, and regenerated all cad/t3-prism/slices/*.3mf end-to-end via render_print.sh (BambuStudio CLI v02.06.00.51).
  • Documented the mount geometry, parameters, and igloo rationale in cad/t3-prism/README.md.

Accelerometer mount: flat seat above joint apex + 0.2 mm tolerances (PR #35 comment 4805516634)

Addressing @sgbaird's feedback that the joint underneath was poking through the pocket so the accelerometer could not sit flat, and the request to change the tolerances to 0.2 mm top / 0.2 mm bottom:

  • Flat pocket floor that clears the joint for all designs by default: the pocket floor was previously sunk below the joint apex (at apex − 0.5 mm), so the rounded captive-core joint shell poked up into the pocket. accel_mount() now places the pocket floor a full accel_floor (1.5 mm) above the joint apex V[2] + joint_outer_r(), while accel_mount_local() extends the body underside to -(accel_floor + accel_sink) so the walls still sink accel_sink (2 mm) past the apex and stay fused to the joint. Because the seat height is derived from joint_outer_r() (which tracks cable_d / scale_factor), the floor clears the joint apex for every design and scale by default (verified at scale 1.5×: top-vertex apex z=112.65 < pocket floor z=114.15; struts STL z=[0.52, 131.63] vs cables STL z=[0.50, 131.64] — sub-mm parity preserved).
  • 0.2 mm top / 0.2 mm bottom Z tolerances: added accel_clear_top and accel_clear_bot (0.2 mm each) for the pocket depth (accel_pocket_z() = accel_h + accel_clear_top + accel_clear_bot); the 0.4 mm lateral (XY) slide-in fit accel_clear is unchanged. Updated accel_rise() to drop the accel_sink term accordingly.
  • Re-rendered cad/t3-prism/{t3-prism, t3-prism-struts, t3-prism-cables, t3-prism-struts-scaffold}.stl + t3-prism-iso.png, regenerated all cad/t3-prism/slices/*.3mf end-to-end via render_print.sh (BambuStudio CLI; single-material sliced job return_code=0, 2.90 h / 34.87 g; MM project filament_type=['PLA','TPU'], filament_map_mode=Manual, filament_map=['1','2']), and re-rendered t3-prism.H2D-PETG-supports.png.
  • Documented the flat-floor seat geometry and the new top/bottom tolerance parameters in cad/t3-prism/README.md.

Accelerometer mount: fill the outer void / remove the overhanging lip (PR #35 comment 4813200802)

Addressing @sgbaird's feedback that there was an outer void under the igloo that should be filled by extruding from the surface below up to the underside of the igloo, removing the lip around the edge that could be a stress point:

  • Diagnosed the void: the igloo body's flat rectangular underside is wider than the rounded joint beneath it, so its rim overhung an unsupported gap — a thin lip / stress riser that could crack.
  • Added a skirt to accel_mount() that convex-hulls the body's underside footprint down onto the joint sphere, so PLA runs continuously from the joint surface up to the underside of the igloo (void filled, overhanging lip removed). Because it is derived from joint_outer_r(), this is correct for every design/scale by default.
  • The skirt re-applies the joint shell's cavity (captive_shell_id) and cable-bore cuts — the bores are lengthened so they always punch through the thicker fillet wall — so the captive TPU core and the three cable exits stay open. Struts STL volume topology is unchanged (manifold) and struts/cables world-Z parity is preserved (struts z=[0.516, 131.631] vs cables z=[0.500, 131.640]).
  • accel_mount() now takes the per-vertex cable_dirs so the call site passes vertex_cable_dirs_t(i).
  • Re-rendered cad/t3-prism/{t3-prism, t3-prism-struts, t3-prism-cables, t3-prism-struts-scaffold}.stl + t3-prism-iso.png, regenerated all cad/t3-prism/slices/*.3mf end-to-end via render_print.sh (MM project filament_type=['PLA','TPU'], filament_map=['1','2'], filament_map_mode=Manual), and re-rendered t3-prism.H2D-PETG-supports.png.
  • Documented the skirt / void-fill geometry in cad/t3-prism/README.md.

Copilot AI linked an issue May 8, 2026 that may be closed by this pull request
Copilot AI changed the title [WIP] Get bambu sliced print for T3-prism Add T3-prism (3-strut tensegrity) parametric CAD with Bambu PETG slices May 8, 2026
Copilot AI requested a review from sgbaird-alt May 8, 2026 17:41
@sgbaird-alt

Copy link
Copy Markdown
Collaborator

@copilot we want a bambu lab 3mf file, similar to what's described in vertical-cloud-lab/powder-doser#23

We've started this print. It's printing without supports.
@sgbaird sgbaird marked this pull request as ready for review May 8, 2026 17:53
Copilot AI review requested due to automatic review settings May 8, 2026 17:53
@me-madsen

Copy link
Copy Markdown
Collaborator

We've taken the file produced and began to print it without supports. The 3mf file is uploaded in this branch. A picture of the finished print will be posted later.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new cad/t3-prism/ subtree that provides a parametric OpenSCAD model of a canonical T3 tensegrity prism and a headless pipeline to render/check/slice it into Bambu-targeted PETG G-code, along with committed manufacturing artifacts (STL/PNG/G-code/3MF).

Changes:

  • Added parametric T3-prism OpenSCAD source (t3-prism.scad) with strut/cable connectivity and printable single-piece geometry.
  • Added a one-shot render/slice script (render_print.sh) to produce STL, an isometric preview PNG, and two bed-size-specific G-code outputs.
  • Documented the CAD deliverable and wired it into the repo structure (README.md, cad/t3-prism/README.md) and ignore rules (.gitignore), plus committed the generated artifacts.

Reviewed changes

Copilot reviewed 4 out of 10 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
README.md Adds cad/t3-prism/ to the repository structure overview.
cad/t3-prism/t3-prism.scad Parametric OpenSCAD definition of the single-piece T3-prism geometry.
cad/t3-prism/render_print.sh Headless pipeline: SCAD→STL, admesh check, PNG preview, PrusaSlicer CLI G-code export for two Bambu bed sizes.
cad/t3-prism/README.md Build/slice instructions, geometry/parameter documentation, and artifact links.
cad/t3-prism/t3-prism.stl Committed printable mesh artifact.
cad/t3-prism/t3-prism-iso.png Committed isometric preview image artifact.
cad/t3-prism/slices/t3-prism.X1C-PETG.gcode Committed G-code targeting 256×256 Bambu-class beds.
cad/t3-prism/slices/t3-prism.A1mini-PETG.gcode Committed G-code targeting 180×180 Bambu A1 mini bed.
cad/t3-prism/t3-prism.3mf Committed 3MF artifact present in the directory (currently not documented in the CAD README).
.gitignore Adds an ignore rule intended for scratch outputs.

Comment thread cad/t3-prism/README.md
@@ -0,0 +1,107 @@
# T3-prism (3-strut tensegrity) — Bambu PETG print

Resolves the issue [_"Get a bambu sliced print for a T3-prism"_](../../README.md):
Comment thread cad/t3-prism/README.md Outdated
| File | What |
| ---- | ---- |
| [`t3-prism.scad`](t3-prism.scad) | parametric source |
| [`t3-prism.stl`](t3-prism.stl) | watertight binary STL (manifold, single part) |
Comment thread cad/t3-prism/README.md
Comment on lines +99 to +103
## References & related work

- Issue: ["Get a bambu sliced print for a T3-prism"](../../README.md)
- Programmatic-CAD pattern reused from
[`vertical-cloud-lab/powder-doser` PR #16](https://github.com/vertical-cloud-lab/powder-doser/pull/16)
Comment thread cad/t3-prism/render_print.sh Outdated
Comment on lines +48 to +52
echo "==> OpenSCAD render -> ${STL##*/}"
xvfb-run -a openscad -o "${STL}" --export-format=binstl "${SCAD}"

echo "==> admesh manifold check"
admesh -fundecvb "${SCRATCH}/t3-prism-clean.stl" "${STL}" \
…reserve Marcus's project 3mf

Agent-Logs-Url: https://github.com/vertical-cloud-lab/tensegrity-optimization/sessions/bfc1f8fe-27b9-40fe-8c9d-f46712cc281e

Co-authored-by: sgbaird-alt <71569943+sgbaird-alt@users.noreply.github.com>

Copilot AI commented May 8, 2026

Copy link
Copy Markdown
Contributor Author

@copilot we want a bambu lab 3mf file, similar to what's described in vertical-cloud-lab/powder-doser#23

Switched the pipeline to produce real Bambu .gcode.3mf files using the empirical recipe from powder-doser PR #23 — official BambuStudio v02.06.00.51 AppImage under xvfb-run + software GL, with flatten_bambu_profile.py to walk the bundled BBL profiles' inherits: chain (the CLI doesn't resolve it), the three identity-field patches (from=system, inherits="", printer_settings_id), and curr_bed_type=Textured PEI Plate so PETG passes the bed-compatibility check. Also rebased onto Marcus's commit so cad/t3-prism/t3-prism.3mf (the H2D project file currently printing) is preserved untouched, and added an H2D-targeted slice that mirrors his settings — Bambu PETG Basic @BBL H2D 0.4 nozzle, IDEX manual filament-map (--filament-map-mode Manual --filament-map 1, --slice 1 because the manual-map setup is gated by plate_to_slice != 0), no supports. All three slices return return_code: 0, error_string: "Success." (a8a38ef):

Printer File Print time PETG Supports
H2D slices/t3-prism.H2D-PETG.gcode.3mf 1 h 30 m 46 s 6.74 g off
X1C slices/t3-prism.X1C-PETG.gcode.3mf 1 h 25 m 47 s 6.74 g auto
A1 mini slices/t3-prism.A1mini-PETG.gcode.3mf 1 h 5 m 33 s 6.85 g auto

Copilot AI changed the title Add T3-prism (3-strut tensegrity) parametric CAD with Bambu PETG slices Add T3-prism (3-strut tensegrity) parametric CAD with Bambu PETG .gcode.3mf slices (H2D / X1C / A1 mini) May 8, 2026
@sgbaird-alt

Copy link
Copy Markdown
Collaborator

@copilot we'll only ever be doing H2D. Make a note of that in copilot-instructions.md ; So far, print (using the stl that Marcus downloaded from you) seems ok. We'll see once we get to the "cantilever warning" (maybe it's too far to be considered a bridge)

image

I tried importing slices/t3-prism.H2D-PETG.gcode.3mf, but got the following errors:

The file does not contain any geometry data
Loading of a model file failed

image

If it helps, you can also have a look at the 3mf file that Marcus uploaded (cad/t3-prism/t3-prism.3mf) and so far seems to be printing OK, to see if you can catch any errors. Send the code and figures and files to edison analysis to get some feedback as well on what might be going wrong while trying to import it. Look at bambu lab forum etc. to also figure out what might be going on.

@sgbaird-alt

Copy link
Copy Markdown
Collaborator

@copilot also, make a second version of this print such that it is a multi-material print. One material as PETG and one material as PLA. One material type for the struts and one for the "strings" (up to you which you make PETG vs. PLA, I'm not sure which would mimic more the tensegrity structure, but we'll be swapping one of these out with TPU eventually anyway)

…n copilot-instructions.md

Agent-Logs-Url: https://github.com/vertical-cloud-lab/tensegrity-optimization/sessions/2b0380fe-5fe2-417a-bcb8-ead0b3206e74

Co-authored-by: sgbaird-alt <71569943+sgbaird-alt@users.noreply.github.com>

Copilot AI commented May 8, 2026

Copy link
Copy Markdown
Contributor Author

@copilot we'll only ever be doing H2D. Make a note of that in copilot-instructions.md ; So far, print (using the stl that Marcus downloaded from you) seems ok. We'll see once we get to...

Done in 08a139d:

H2D-only: added a new "Hardware / target printer" section to .github/copilot-instructions.md with the H2D-only constraint, the verified PETG profile triple (Bambu Lab H2D 0.4 nozzle / 0.20mm Standard @BBL H2D / Bambu PETG Basic @BBL H2D 0.4 nozzle), and the IDEX-needs---filament-map-mode Manual --filament-map 1 --slice 1 caveat. Dropped slices/t3-prism.X1C-PETG.gcode.3mf and slices/t3-prism.A1mini-PETG.gcode.3mf; render_print.sh now calls slice_bambu once.

Import error: confirmed the failing file is a sliced print job, not a project — Bambu Studio's drag/import deliberately rejects .gcode.3mf (which carries Metadata/plate_1.gcode, ~3.97 MB of actual print g-code) with "does not contain any geometry data" because the import path treats it as a printer-side artifact. The fix is a second CLI pass without --slice, which produces a true project .3mf. Now committed:

File Use Size
slices/t3-prism.H2D.3mf Open in Bambu Studio (project, re-sliceable, drag-and-drop or File → Open Project) 175 KB
slices/t3-prism.H2D-PETG.gcode.3mf Upload to printer (LAN MQTT param: "Metadata/plate_1.gcode") 1.06 MB

Both regenerated by bash cad/t3-prism/render_print.sh, both return_code: 0, error_string: "Success.", both 385 layers @ 0.20 mm / 6.74 g PETG / 1 h 30 m 46 s / no supports — settings match your in-progress print.

Edison ANALYSIS: submitted task 25c1c897-6d66-462f-bfdb-7df05ff12d9b (non-blocking) with all 9 relevant files attached — both 3mf flavors, scad, stl, iso png, render_print.sh, flatten_bambu_profile.py, README. Asked for (a) confirmation/refutation of the project-vs-sliced hypothesis with Bambu Lab forum citations, (b) cantilever-warning / print-quality assessment for the H2D PETG print at the upcoming top-triangle bridge. I'll fetch results and wire them into the README next session.

Copilot AI changed the title Add T3-prism (3-strut tensegrity) parametric CAD with Bambu PETG .gcode.3mf slices (H2D / X1C / A1 mini) Add T3-prism (3-strut tensegrity) parametric CAD with Bambu PETG .gcode.3mf slice + re-importable project .3mf (H2D-only) May 8, 2026
@ctrhjk

ctrhjk commented Jul 1, 2026

Copy link
Copy Markdown
Collaborator

@claude
Just to let you know that the dimensions of the tri-axis accelerometer below were measured using a caliper
6mm x 6mm x 5.94mm (L x W x H)

@claude

claude Bot commented Jul 1, 2026

Copy link
Copy Markdown

Claude finished @ctrhjk's task in 48s —— View job


Accelerometer dimensions confirmed ✅

Thanks @ctrhjk — the caliper measurement (6 × 6 × 5.94 mm L×W×H) matches what the accelerometer mount is already parameterized to, so no geometry change is needed. Those numbers are set directly in cad/t3-prism/t3-prism.scad:

accel_l = 6.0;    // accelerometer length (X: slide-in / cable-exit axis)
accel_w = 6.0;    // accelerometer width  (Y)
accel_h = 5.94;   // accelerometer height (Z)

A few notes so we stay on the same page about how those get used:

  • The accelerometer is treated as a physical part, so its L×W×H are absolute mm and are not multiplied by scale_factor (unlike the rest of the structure). Confirmed at t3-prism.scad:225-227.
  • The pocket the sensor slides into is larger than the raw part by the tolerances so it actually fits with adhesive:
    • XY (slide-in fit): accel_clear = 0.4 mm per side → pocket 6.8 × 6.8 mm.
    • Z (depth): accel_pocket_z = accel_h + accel_clear_top + accel_clear_bot = 5.94 + 1.0 + 0.2 = 7.14 mm, so the retaining walls stand proud of the seated sensor and the igloo dome (not the sensor) contacts the acrylic drop plate.

Since the caliper numbers already agree with the model, I haven't changed anything.

Heads-up on the other open thread: @sgbaird's 07‑01 request (drop the tweezer breakaways + add flat, non-domed bottom-vertex sensor insets) is a separate change. The current 13c9c75 already has add_accel_mount_bottom = true with flat key-seats and the tweezer slots removed — if you want me to take another pass on that geometry, @claude me on that specific comment and I'll pick it up.

@achris0520

Copy link
Copy Markdown
Collaborator

@claude please generate new .stls for the current regular T3 prism model at 76.92% the size you have been using in recent generations. Remember this sizing as S0 please. Even though the model has been scaled, make sure the accelerometer housing is the same dimensions as before, but add .3mm to the height dimension. Call this new set of accelerometer housing sizing A1 and the original sizing A0. Additionally, make sure there is housing at both the top and bottom of the prism for each vertex (a total of 6 housing sites). The bottom sites will need to be in the optimal position discovered in the results found here: #35 (comment).

Please also reply with a link directly to each .stl used in the multimaterial print when you are done. Thanks!

@claude

claude Bot commented Jul 1, 2026

Copy link
Copy Markdown

Regenerate T3-prism STLs — S0 size + A1 accel housing + 6 housing sites

  • Read the referenced placement analysis (comment 4857717314) → recommends matched top+bottom seats
  • S0 scale = 1.5 × 0.7692 ≈ 1.154 (recover old size with -D scale_factor=1.5)
  • A0/A1 housing set (accel_size); A1 default = A0 + 0.3 mm pocket height, dims stay absolute-mm
  • Top and bottom housing at every vertex — 6 sites (3 igloo + 3 flat), matched top+bottom
  • Re-rendered 4 STLs + iso. Verified: CGAL Simple: yes; 3 connected strut assemblies (each spans z=[0, 115.41] to the bed); struts z=[-16.824, 98.581] vs cables z=[-16.824, 98.590] (sub-mm world-Z parity). Also fixed render_print.sh to compute the bed-lift from the SCAD (was hardcoded for scale 1.5).
  • Committed + pushed STLs (8b597eb)
  • Regenerate H2D .3mf slices end-to-end (BambuStudio CLI running now)
  • Final reply with direct STL links

Rendering STLs was the core deliverable and is done. Now regenerating the .3mf slices so the committed projects aren't stale at the new size.

View job run

@sgbaird

sgbaird commented Jul 1, 2026

Copy link
Copy Markdown
Collaborator

@claude I added EDISON_API_KEY for you. See .github/copilot-instructions.md for how to use it

@claude

claude Bot commented Jul 1, 2026

Copy link
Copy Markdown

Claude finished @sgbaird's task in 7m 34s —— View job


Analysis of @sgbaird's request + status

Thanks @sgbaird for wiring in EDISON_API_KEY — noted the usage in .github/copilot-instructions.md.

Answering @ctrhjk's "analyze what @sgbaird asked and get back to us":

@sgbaird's 2026-07-01 01:24 ask was: (1) remove the tweezer breakaways, (2) add sensor insets at the bottom vertices too — but flat (not domed igloos), below the lower vertices, with an extrusion running from the key-seat upper surface up to the underside of the vertices.

Good news: all of that is already implemented and committed in be51d5e + 13c9c75 (current branch HEAD). I verified against the actual committed geometry:

@sgbaird asked Status Where
Remove the tweezer part ✅ done accel_tweezer* params deleted; note at t3-prism.scad:222
Flat (not domed) bottom insets ✅ done accel_mount_local(domed=false) → flat cap slab, accel_flat=2 mm
Below the 3 lower vertices ✅ done accel_mount_bottom() mirrors the mount through the vertex XY-plane so it hangs below; add_accel_mount_bottom=true
Extrusion from key-seat top → underside of vertex (no lip) ✅ done skirt hulls the key-seat's upper footprint up onto the joint sphere (t3-prism.scad:529)

I re-rendered the struts STL from the committed SCAD and it reproduces exactly (z=[0.000, 142.571], matches the committed t3-prism-struts.stl), and the three coplanar flat caps give a stable flat 3-point base on the bed. So the STLs are current and correct@achris0520 can import the three STLs today.

The one gap: the ready-to-import .3mf project slices under slices/ are stale — they were last regenerated at 0b57d1a, before the bottom key-seat commits, so they don't yet contain the flat bottom seats. Regenerating them now via render_print.sh (BambuStudio CLI v02.06.00.51).

  • Read the request + current accel_mount geometry
  • Confirm each of @sgbaird's 4 asks is implemented & committed
  • Verify committed struts STL reproduces from a fresh render
  • Regenerate the stale .3mf slices with the bottom key-seats
  • Commit + show render for spot-check

…using sites

- scale_factor -> S0 = 1.5 x 0.7692 (~1.154); recover old size with -D scale_factor=1.5.
- accel_size selector: A0 (original) | A1 (default, = A0 + 0.3mm pocket height via accel_h_extra).
- Housing dims stay absolute mm (not scaled), so the sensor pockets stay full-size on the smaller prism.
- 6 housing sites confirmed (3 top igloo + 3 bottom flat), matched top+bottom per the placement
  analysis in PR #35 comment 4857717314.
- render_print.sh now computes the bed-lift OFFSET_Z from the SCAD's MODEL_Z_LO echo instead of the
  hardcoded 18.29 (which only held at scale 1.5), so parts sit on the bed at any scale/housing config.
- Re-rendered 4 STLs + iso. Verified: CGAL Simple:yes; 3 connected strut assemblies
  (component analysis, each spanning z=[0,115.41] to the bed); struts z=[-16.824,98.581] vs
  cables z=[-16.824,98.590] world-Z parity (sub-mm).

Co-authored-by: Audrey Christiansen <achris0520@users.noreply.github.com>
@sgbaird

sgbaird commented Jul 1, 2026

Copy link
Copy Markdown
Collaborator

@ctrhjk I think we'll be putting the single-axis accelerometer on the bottom, which has different dimensions. What are the dimensions? I think these were given somewhere in the repo..

EDIT: we have two tri-axis, so nvm, we'll leave it as-is.

@sgbaird

sgbaird commented Jul 1, 2026

Copy link
Copy Markdown
Collaborator

@copilot pick up from where claude left off, claude seems to keep timing out or erroring out for some reason (i.e., put the lower vertex key seats to the side and not touching the ground). Render/generate/commit all files. Include the direct hyperlinks in your comment reply

Copilot AI commented Jul 1, 2026

Copy link
Copy Markdown
Contributor Author

@copilot pick up from where claude left off, claude seems to keep timing out or erroring out for some reason (i.e., put the lower vertex key seats to the side and not touching the grou...

Done — picked up from where Claude left off and moved the three lower-vertex accelerometer key-seats to the side of each bottom vertex (pushed radially outward past the joint sphere by accel_side_gap) and lifted them so they hover ~2 mm above the plate (accel_hover) instead of hanging below. The joint spheres — not the seats — remain the flat 3-point plate contact, so the seats never touch the ground. A short PLA skirt hulls each seat's inner (vertex-facing) face across the gap onto the joint sphere so PLA stays continuous (no lip / stress riser), and it re-cuts the joint cavity + cable bores so the captive TPU core and the three cable exits stay open. The seat stays flat-capped (not domed) with the cable mouth pointing radially outward.

Re-rendered/regenerated everything end-to-end (render_print.sh): all 4 STLs, the iso preview, the supports PNG, and every .3mf slice (PETG sliced job return_code = 0). Verified world-Z parity struts z=[0.013, 104.465] vs cables z=[0.000, 104.475] and CGAL Simple: yes (3 connected strut assemblies). Model's lowest point is again the bottom joint-shell underside.

Direct links (commit 75fac28):

Multi-material print STLs:

Assembled/combined + slice:

Iso preview: t3-prism iso

@sgbaird

sgbaird commented Jul 1, 2026

Copy link
Copy Markdown
Collaborator

This is looking so funky 😂 like some kind of three-legged alien

@achris0520

Copy link
Copy Markdown
Collaborator

This is looking so funky 😂 like some kind of three-legged alien

@sgbaird It'll blend in with the Martians

@sgbaird

sgbaird commented Jul 2, 2026

Copy link
Copy Markdown
Collaborator

🤣

@achris0520

achris0520 commented Jul 4, 2026

Copy link
Copy Markdown
Collaborator

07/02/2026
The TPU got clogged but the printer managed to print all of the PLA parts without it. We'll retry this one...
1000021517

07/04/2026
Update: It worked!!
We ran the printer with the TPU at 235 to 240 C. One small flaw, but that was likely just a general flaw in printing.
1000021732.zip

SGB EDIT: attaching images from the zip (they were too big when I converted from heic to png, so I chose the lazy route and did phone screenshots)
Screenshot_20260704-172211
Screenshot_20260704-172203
Screenshot_20260704-172157
Screenshot_20260704-172152

@ctrhjk

ctrhjk commented Jul 6, 2026

Copy link
Copy Markdown
Collaborator

This latest printing has a larger interior space within the key-seat housing. I secured the accelerometer with wax, but it kept falling off because the space caused the accelerometer to rotate (see #67 (comment))

IMG_6281

@sgbaird

sgbaird commented Jul 6, 2026

Copy link
Copy Markdown
Collaborator

Lame, sorry about that ☹️ Let's start measuring the dimensions of the CAD files manually before printing using OnShape or Fusion 360 (at least for the first few times).

@claude see #35 (comment) and address. Look at the comments and scripts in vertical-cloud-lab/powder-doser#7 to figure out how to use OnShape and then upload the files we need to print to OnShape similar to that pull request and include the hyperlink directly in your comment reply so we can have a look to manually verify.

@claude

claude Bot commented Jul 6, 2026

Copy link
Copy Markdown

Claude Code is working…

I'll analyze this and get back to you.

View job run

@sgbaird

sgbaird commented Jul 6, 2026

Copy link
Copy Markdown
Collaborator

@claude I cancelled #35 (comment) because I forgot to edit claude.yml to give OnShape access. I did that, so start this again

@claude

claude Bot commented Jul 6, 2026

Copy link
Copy Markdown

Claude finished @sgbaird's task in 10m 12s —— View job


Restarting cancelled task: key-seat fit + OnShape upload for manual dimension verification

Working on @sgbaird's request from the cancelled run (comment): address @ctrhjk's loose key-seat housing (comment 4895789291) and upload the print files to OnShape (per powder-doser PR #7) so dimensions can be verified manually before printing.

  • Gather context: PR Add drop-test protocol, Edison synthesis, and first-data analysis #67 comment 4872787602, ctrhjk's photo, current accel key-seat geometry in t3-prism.scad
  • Study powder-doser PR Conduct a set of mock reviews as if you were part of MRG review committee #7 OnShape upload scripts — classroom key works via HMAC-signed REST; ONSHAPE_ACCESS_KEY/SECRET_KEY are present in this workflow ✓
  • Diagnose the oversized key-seat interior — as-printed A1 pocket is 6.8 × 6.8 × 7.44 mm for the 6 × 6 × 5.94 mm Dytran: 0.4 mm/side XY slop + 1.5 mm Z headroom → sensor yaws/tilts in the seat and shears the wax bead off (matches the in-seat-rotation findings in PR Add drop-test protocol, Edison synthesis, and first-data analysis #67 comment 4872787602)
  • Fix in t3-prism.scad: new A2 housing set (now default) — lateral clearance 0.4 → 0.2 mm/side, top Z gap 1.0 → 0.2 mm (pocket now 6.4 × 6.4 × 6.64 mm; walls register the sensor, A1's +0.3 mm print-shrink allowance kept, dome/cap still the only plate contact) + README docs
  • Re-render STLs + regenerate H2D .3mf slices (render_print.sh running — OpenSCAD CGAL + BambuStudio CLI)
  • Upload print STLs to OnShape (Vertical Cloud Lab classroom, public doc) and verify mm units via bounding-box readback
  • Commit + push, final summary with OnShape hyperlink

@sgbaird

sgbaird commented Jul 6, 2026

Copy link
Copy Markdown
Collaborator

@claude looks like you got stuck or lazy - #35 (comment)

@claude

claude Bot commented Jul 6, 2026

Copy link
Copy Markdown

Claude finished @sgbaird's task in 12m 17s —— View job


Redoing the stuck task: key-seat fit (A2) + OnShape upload for manual dimension verification

The previous run (comment 4896526168) got stuck during rendering and never committed anything — HEAD was still at 75fac28 with a clean tree. Redoing the full task from @sgbaird's request (comment 4896509287): fix @ctrhjk's loose key-seat housing and upload the print files to OnShape for manual dimension verification.

  • Gather context: current accel housing geometry (A0/A1 sets in t3-prism.scad), ctrhjk's in-seat-rotation issue, powder-doser PR Conduct a set of mock reviews as if you were part of MRG review committee #7 OnShape scripts
  • Tighten the housing fit in t3-prism.scad: new A2 set (now default) — lateral clearance 0.4 → 0.2 mm/side, top Z gap 1.0 → 0.2 mm → pocket interior 6.4 × 6.4 × 6.64 mm for the 6 × 6 × 5.94 mm Dytran (walls register the sensor; A1's +0.3 mm print-shrink height allowance kept; dome/flat cap still the only plate contact)
  • Update cad/t3-prism/README.md (A0/A1/A2 table + clearance docs)
  • OnShape API verified working from this runner (auth OK, "Vertical Cloud Lab" classroom resolves); upload script cad/t3-prism/onshape_upload_t3prism.py written (adds a bounding-box readback to programmatically verify mm units after import)
  • Re-render STLs — running now, all 4 in parallel (OpenSCAD CGAL, one per core, so a job cutoff can't strand a serial queue like last time)
  • Checkpoint-commit geometry as soon as STLs land
  • Regenerate H2D .3mf slices (slices-only resume script prepared, BambuStudio AppImage pre-downloaded)
  • Upload print STLs to OnShape (public doc, Vertical Cloud Lab classroom) + verify mm units via bounding-box readback
  • Final summary with OnShape hyperlink

@achris0520

Copy link
Copy Markdown
Collaborator

@claude looks like you got stuck and didn't finish again in #35 (comment). Please do a quick and easy fix for wherever you got caught and finish the to-do list. If you are spending a lot of time trying to figure it out, do a quick and easy fix and move on. Finally, when you have finished, please reply with a link to the new .stls you have generated. Thanks!

@claude

claude Bot commented Jul 7, 2026

Copy link
Copy Markdown

Claude finished @achris0520's task in 11m 40s —— View job


Finishing the stuck task: A2 key-seat fit + re-render + STL links

The previous run (comment 4897755091) got stuck during the STL render and never committed — HEAD was still at 75fac28 with a clean tree, so the A2 fit changes were lost. Redoing them now with checkpoint commits so nothing can be lost again.

  • Re-apply the A2 housing fit in t3-prism.scad (lateral clearance 0.4 → 0.2 mm/side, top Z gap 1.0 → 0.2 mm, A1's +0.3 mm height allowance kept, A2 = default → pocket 6.4 × 6.4 × 6.64 mm for the 6 × 6 × 5.94 mm Dytran)
  • Update cad/t3-prism/README.md (A0/A1/A2 table + clearance docs)
  • Rewrite the (lost) OnShape upload script cad/t3-prism/onshape_upload_t3prism.py (classroom-owned public doc + mm bounding-box readback; API keys confirmed present)
  • Checkpoint-commit + push source changesdd835ef (SCAD + README + OnShape script are safe even if this run is cut off)
  • Iso preview PNG re-rendered — 3 top igloos + 3 bottom flat key-seats verified visually
  • Re-render all 4 STLs — cables ✅ done (z=[0.000, 103.675]); struts / scaffold / full body still rendering in parallel
  • Verify mesh (admesh) + struts/cables world-Z parity
  • Commit + push the STLs
  • Regenerate H2D .3mf slices (slices-only resume script prepared, BambuStudio AppImage pre-downloaded)
  • Upload STLs to OnShape + verify mm units via bounding-box readback
  • Final summary with direct links to the new STLs

…cript

A2 = A1 with clearances tightened so the walls register the Dytran 3133A4
instead of letting it yaw/tilt in the seat and shear the wax bead off
(@ctrhjk loose-housing report, PR #35 comment 4895789291): lateral clearance
0.4 -> 0.2 mm/side, top Z gap 1.0 -> 0.2 mm. Pocket interior 6.8 x 6.8 x
7.44 mm -> 6.4 x 6.4 x 6.64 mm for the 6 x 6 x 5.94 mm sensor; A1's +0.3 mm
print-shrink height allowance kept; dome / flat cap remains the only plate
contact.

onshape_upload_t3prism.py uploads the print STLs to a public Vertical Cloud
Lab classroom document and reads back each Part Studio bounding box in mm to
verify import units (PR #35 comment 4896509287, workflow per powder-doser
PR #7).

Co-authored-by: Audrey Christiansen <280533809+achris0520@users.noreply.github.com>

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@sgbaird

sgbaird commented Jul 7, 2026

Copy link
Copy Markdown
Collaborator

@copilot carry on from where Claude left off

Copilot AI commented Jul 7, 2026

Copy link
Copy Markdown
Contributor Author

@copilot carry on from where Claude left off

Picked up from where Claude left off. Claude had committed the SCAD/README change for the A2 accelerometer housing (tighter fit to stop the sensor rotating/tilting in the seat and shearing the wax bead — @ctrhjk's loose-housing report, #4895789291) but hadn't re-rendered the geometry or regenerated the slices. I finished that end-to-end.

A2 fit change (from A1): lateral clearance 0.4 → 0.2 mm/side, top-Z gap 1.0 → 0.2 mm. Pocket interior is now 6.4 × 6.4 × 6.64 mm (down from 6.8 × 6.8 × 7.44) for the 6 × 6 × 5.94 mm Dytran 3133A4, so the walls register the sensor on all four sides. A1's +0.3 mm print-shrink height allowance is kept; the flat cap / dome remains the only plate contact.

Re-rendered/regenerated everything (render_print.sh): all 4 STLs, iso preview, all 5 .3mf slices (PETG sliced job return_code = 0), and the supports PNG. Verified watertight (0 disconnected/degenerate facets) and struts↔cables world-Z parity (struts z=[0.013, 103.67] vs cables z=[0.000, 103.67] — sub-mm). MM project routes PLA struts→ext1, TPU cables→ext2 (filament_map=['1','2'], filament_map_mode=Manual).

Direct links (commit a7c32ef) — the multi-material print STLs:

One thing I couldn't do here: the OnShape upload for manual dimension verification. Claude's onshape_upload_t3prism.py is committed, but ONSHAPE_ACCESS_KEY / ONSHAPE_SECRET_KEY aren't present in this Copilot agent's environment (only the claude workflow was given them per #4896524136), so python3 cad/t3-prism/onshape_upload_t3prism.py can't authenticate from my side. If you re-run the claude workflow (or run the script locally with those keys) it'll import these same STLs and echo each Part Studio bbox in mm to confirm the units.

@achris0520

Copy link
Copy Markdown
Collaborator
image

@sgbaird-alt

@ctrhjk got the TPU assist module up and running. The TPU got stuck when trying to feed in, but I fixed it by pulling out the PTFE tube and manually hand feeding it into the nozzle like we've been doing, then reattached the PTFE tube. Just to be sure, I also reloaded the TPU one more time and it looks like we're ready to go!

Sending the new file Jinkwan fixed in Onshape through the printer now!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Get a bambu sliced print for a T3-prism

8 participants