Skip to content

fix(editor): improve duct routing and parametric controls - #862

Open
sudhir9297 wants to merge 52 commits into
pascalorg:mainfrom
sudhir9297:t3code/improve-duct-piping-wall-drawing
Open

fix(editor): improve duct routing and parametric controls#862
sudhir9297 wants to merge 52 commits into
pascalorg:mainfrom
sudhir9297:t3code/improve-duct-piping-wall-drawing

Conversation

@sudhir9297

@sudhir9297 sudhir9297 commented Sep 13, 2026

Copy link
Copy Markdown
Contributor

What does this PR do?

  • Rectangular and oval duct wall clearance

    • Issue: Rectangular and oval ducts could be placed partly inside a wall because placement clearance used only the profile height.
    • Fixed: Placement and wall attachments now use the largest profile dimension, with a small wall standoff for non-round ducts.
  • Keep a run on its starting wall

    • Issue: Continuing a duct or pipe run could move onto another wall when the cursor crossed the room.
    • Fixed: The run stays constrained to the wall face where its first point was placed.
  • Automatic endcap cleanup

    • Issue: Deleting a duct or pipe left its automatically generated endcap behind.
    • Fixed: Deleting a run removes its automatic endcap while preserving manually placed endcaps.
  • Parametric inspector controls

    • Issue: Inspector groups and action buttons did not support the desired initial layout and grouping.
    • Fixed: Groups can specify their initial expansion state, and parametric actions use a two-column layout where appropriate.

How to test

  1. Run the editor with bun run dev.

  2. Draw round, rectangular, and oval duct runs against a wall.

    • All profiles should remain outside the wall, and continuing a run should stay on its starting wall face.
  3. Delete a duct or pipe with an automatic endcap.

    • The automatic endcap should be deleted with the run; manually placed endcaps should remain.
  4. Open a parametric inspector with multiple groups and actions.

    • Groups should use their configured initial state and actions should be laid out consistently.
  5. Run bun run checks.

    • Formatting, lint checks, type checks, and the full type validation should pass.

Focused node tests: 27 passed.

Screenshots / screen recording

Not added yet.

Checklist

  • I've tested this locally with bun dev
  • My code follows the existing code style (run bun check to verify)
  • I've updated relevant documentation (if applicable)
  • This PR targets the main branch

Note

Medium Risk
Changes MEP run drafting, wall attachment math, and delete cascades in core node tools—user-visible geometry and scene mutations, though covered by new tests.

Overview
Improves duct/pipe drafting against walls and cleans up deletion and inspector behavior.

Routing & clearance: Rectangular and oval ducts now offset from walls using the largest profile dimension (plus a small non-round wall standoff) via shared ductSurfaceClearanceM, used for cursor clearance and wall attachments. Runs that start on a wall stay locked to that host/face for the rest of the draft instead of jumping to another surface when the cursor crosses the room.

Scene graph: Deleting a duct or pipe cascade-deletes automatic run end caps (metadata-owned) while manual end caps are left alone; findAutomaticRunEndCapIds drives this.

Editor UI: Parametric inspector groups can set defaultExpanded on ParamGroup; parametric Actions use a two-column grid when actions are present. Switch checked/unchecked styling moves to global CSS (.pascal-switch) after stripping Tailwind data-[state] classes. React Scan is removed from ClientBootstrap (webpack ESM/CJS issue); dev diagnostics still gate Agentation in layout. Minor scene-load effect cleanup (drops unused void sceneLoadAttempt).

Tests cover clearance, wall-surface matching, end-cap discovery, and delete behavior.

Reviewed by Cursor Bugbot for commit ab2d983. Bugbot is set up for automated code reviews on this repo. Configure here.

sudhir9297 and others added 30 commits May 19, 2026 02:59
Items (e.g. solar panels) can now be placed on sloped roof surfaces.
The placement system computes euler rotation from the roof surface
normal so items sit flush on the slope instead of going inside.

- Add roofStrategy to placement-strategies with enter/move/click/leave
- Wire roof:enter/move/click/leave events in the placement coordinator
- Add calculateRoofRotation in placement-math using surface normals
- Support full 3D cursor rotation for sloped surfaces
- Items on roofs are parented to the level with world-space rotation

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
# Conflicts:
#	packages/editor/src/components/editor/handles/handle-arrow.tsx
#	packages/editor/src/components/editor/index.tsx
- Keep larger duct profiles clear of wall faces
- Lock runs to their starting wall surface
- Remove automatic end caps with deleted runs
- Support default-expanded inspector groups and grid action buttons
- Fix switch styling in the editor
- Disable incompatible React Scan bootstrap loading
@pascal

pascal Bot commented Sep 13, 2026

Copy link
Copy Markdown

I hit an error while handling your request (Model unavailable on AI Gateway free tier: Free tier users do not have access to this model. Upgrade to paid credits at https://vercel.com/d?to=%2F%5Bteam%5D%2F%7E%2Fai%3Fmodal%3Dtop-up for unrestricted…).

Please try again, rephrase, or reach out if it keeps failing.

Error id: 3c5ee842-fe04-498b-b876-c397431a6467

@cursor cursor Bot 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.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit ab2d983. Configure here.

: null
: hasSurface
? { point: hit.point, frame: hit.frame }
: null

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Unlocked runs stick to hovered walls

Medium Severity

The old leave-wall fallback that switched an unlocked run back to a horizontal plane through the start point was removed, and lockedWallTargetRef is only set on the first click of a new draft. Floor-started runs and continuation seeds therefore keep the last hovered wall as the working plane once the cursor leaves that mesh, so the preview stays stuck on that wall instead of routing freely at the start elevation.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit ab2d983. Configure here.

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.

1 participant