Repository navigation
Conversation
What this PR doesTwo features for columns, plus some unrelated fixes that rode along. The column work adds an
Start with the schema change in |
| const handleTypeClick = useCallback( | ||
| (type: BuildType) => { | ||
| setMepOpen(type.id === 'mep') | ||
| if (type.id === 'fence' && selectedFence) return |
There was a problem hiding this comment.
Fence selection hijacks other build tools
Medium Severity
fenceContext becomes true from selection alone, so a selected fence keeps the Fence tile lit, blocks re-arming the fence tool, and replaces the kitchen, MEP, and wand secondary panels even while another build tool is active.
Additional Locations (2)
Reviewed by Cursor Bugbot for commit 1d42ed9. Configure here.
| onSelect: () => | ||
| activateBuildTool(tool === 'pipe-fitting' ? 'pipe-segment' : 'pipe-fitting'), | ||
| }, | ||
| { |
There was a problem hiding this comment.
Wand fence tiles stay inactive
Low Severity
XR wand gate and opening actions always pass active: false, so the wand never shows which fence feature is armed. The desktop tiles compare against placingFenceFeature.
Reviewed by Cursor Bugbot for commit 1d42ed9. Configure here.
Columns gain an `i-beam` cross-section: two flanges spanning the width at the front and back faces, joined by a web along the depth. Plate thicknesses come from one core helper (`columnIBeamSection`) shared by the renderer, the top-surface region, the plan outline and IFC export. - Capitals, bands and carvings treat the section as a box, so caps are plates; a bare i-beam's top support region is its I outline. - The plan draws a bare i-beam as its true section, in the nodes floorplan and the editor's reference-floor footprint; with plates it draws the plate rectangle. - `add_column` accepts `crossSection: 'i-beam'`. - IFC export writes an IfcIShapeProfileDef extrusion and import reads one back as an i-beam column. - The panel offers I-Beam beside Round / Square / Rectangular (2×2 grid) and shows Depth for it; shaft profile controls are hidden for it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FX8vGAP5g43AHR1jixUeXr
Columns gain optional `tiltX` / `tiltZ` (radians, ±45°). Absent fields keep older scenes round-tripping unchanged. The lean is one shear in the column's local frame (x += −tan(tiltZ)·y, z += tan(tiltX)·y): the base stays planted, the height is unchanged and the top stays level. A single `ColumnLean` wrapper applies it under the yaw in both the renderer and the placement ghost, which now applies the node's yaw itself so it matches the committed column. - The top surface stays level and slides with the lean; objects on top follow a tilt or height change (`followsSurfacePlan` on the column hosted-edit policy). - 2D: the footprint is the base swept along the lean, with the leaned top outlined dashed; the reference floor uses the same sweep. - The agent scene-view box covers the lean. The floor-placement footprint stays on the planted base, which is what stands on a slab. - `add_column` takes tiltX / tiltZ in degrees. - IFC: a plain tilted column exports as an oblique extrusion and is read back with its tilt. - Panel: Tilt X / Tilt Z in degrees under Transform (not for lean-to posts, whose layout the lean-to owns). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FX8vGAP5g43AHR1jixUeXr
1d42ed9 to
949fac4
Compare
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.
There are 3 total unresolved issues (including 2 from previous reviews).
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 949fac4. Configure here.
| if (floorPlanUrl && node.source) { | ||
| const { min, max } = node.source.manifest.bounds | ||
| const [cx, cz] = points | ||
| const [cx, cz] = base |
There was a problem hiding this comment.
Scripted image uses swept vertex count
Medium Severity
The scripted floor-plan image now averages base vertices but still divides by points.length (the swept hull). When a scripted column leans, those counts diverge, so the image is scaled toward the origin and no longer sits on the column.
Reviewed by Cursor Bugbot for commit 949fac4. Configure here.


What does this PR do?
This PR brings highly requested architectural features to the column system:
i-beam): Adds a new cross-section type for standard H/I-Beam steel structural columns. The renderer generates the beam automatically by computing proportional flange and web thicknesses based on the column's overall width and depth.tiltXandtiltZproperties to theColumnNodeschema, allowing columns to organically lean off the vertical Y-axis.Both features are fully integrated into the editor UI and the 2D floorplan projection.
How to test
Screenshots / screen recording
Not added yet.
Checklist
bun devbun checkto verify)mainbranchCo-Authored-By: AI
Note
Medium Risk
Touches column schema, 3D rendering, floorplan/collision semantics, hosted-child moves, and IFC import/export—wide but covered by new tests; lean changes plan footprint without lifting the base for slab overlap.
Overview
Adds
i-beamas a column cross-section and optionaltiltX/tiltZlean (±45°, degrees in tools/UI, radians on the node). Lean is modeled as shear (base fixed, top level), with shared helpers incolumn-geometryfor i-beam outlines, lean offsets, and swept plan footprints.3D / editor: Renders i-beams as flange + web boxes; applies a lean shear matrix on the column body while hosted children stay on the shifted, level top surface. Floorplan and scene-view bounds use the swept footprint; the panel adds I-Beam and tilt sliders (shaft controls hidden for i-beam).
Agents / schema / IFC:
add_columnandColumnNodeaccept the new fields; IFC export usesIfcIShapeProfileDefand oblique extrusions for lean, with import round-trip coverage in tests.Reviewed by Cursor Bugbot for commit 949fac4. Bugbot is set up for automated code reviews on this repo. Configure here.