From 6f37783fbdb8acd769af15274a33c3ca3b623c43 Mon Sep 17 00:00:00 2001 From: Wassim SAMAD Date: Thu, 25 Jun 2026 14:57:24 -0400 Subject: [PATCH] fix(editor): commit ceiling locally in 2D-only view (3D tool can't) Same fix as slab: ceiling is committed by its 3D registry tool, dead in 2D-only view. Commit it from the panel on both close paths, gated to viewMode==='2d'. Co-Authored-By: Claude Opus 4.8 --- .../src/components/editor/floorplan-panel.tsx | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/packages/editor/src/components/editor/floorplan-panel.tsx b/packages/editor/src/components/editor/floorplan-panel.tsx index 93b09090..0584620b 100644 --- a/packages/editor/src/components/editor/floorplan-panel.tsx +++ b/packages/editor/src/components/editor/floorplan-panel.tsx @@ -6,6 +6,7 @@ import { type AnyNodeId, type BuildingNode, type CeilingNode, + CeilingNode as CeilingNodeSchema, type ColumnNode, calculateLevelMiters, DEFAULT_ANGLE_STEP, @@ -7607,6 +7608,27 @@ export function FloorplanPanel({ [levelId, setSelection], ) + const createCeilingOnCurrentLevel = useCallback( + (points: WallPlanPoint[]) => { + if (!levelId) { + return null + } + const { createNode, nodes } = useScene.getState() + const ceilingCount = Object.values(nodes).filter((node) => node.type === 'ceiling').length + const defaults = useEditor.getState().toolDefaults.ceiling ?? {} + const ceiling = CeilingNodeSchema.parse({ + ...defaults, + name: `Ceiling ${ceilingCount + 1}`, + polygon: points.map(([x, z]) => [x, z] as [number, number]), + }) + createNode(ceiling, levelId) + sfxEmitter.emit('sfx:structure-build') + setSelection({ selectedIds: [ceiling.id] }) + return ceiling.id + }, + [levelId, setSelection], + ) + useEffect(() => { if (!isStairBuildActive) { useStairBuildPreview.getState().reset() @@ -9176,6 +9198,9 @@ export function FloorplanPanel({ const firstPoint = ceilingDraftPoints[0] if (firstPoint && ceilingDraftPoints.length >= 3 && isPointNearPlanPoint(point, firstPoint)) { + if (useEditor.getState().viewMode === '2d') { + createCeilingOnCurrentLevel(ceilingDraftPoints) + } clearCeilingPlacementDraft() return } @@ -9183,7 +9208,7 @@ export function FloorplanPanel({ setCeilingDraftPoints((currentPoints) => [...currentPoints, point]) setCursorPoint(point) }, - [ceilingDraftPoints, clearCeilingPlacementDraft], + [ceilingDraftPoints, clearCeilingPlacementDraft, createCeilingOnCurrentLevel], ) const handleCeilingPlacementConfirm = useCallback( (point?: WallPlanPoint) => { @@ -9206,9 +9231,12 @@ export function FloorplanPanel({ return } + if (useEditor.getState().viewMode === '2d') { + createCeilingOnCurrentLevel(nextPoints) + } clearCeilingPlacementDraft() }, - [ceilingDraftPoints, clearCeilingPlacementDraft], + [ceilingDraftPoints, clearCeilingPlacementDraft, createCeilingOnCurrentLevel], ) const handleZonePlacementPoint = useCallback( (point: WallPlanPoint) => {