From 3b66e1c214f4bbc3d3124c4f6dd11139a5b5ee76 Mon Sep 17 00:00:00 2001 From: wass08 Date: Mon, 26 Jan 2026 08:08:44 +0900 Subject: [PATCH] auto-selection of level / building --- apps/editor/store/use-editor.tsx | 64 +++++++++++++++++++++----------- 1 file changed, 43 insertions(+), 21 deletions(-) diff --git a/apps/editor/store/use-editor.tsx b/apps/editor/store/use-editor.tsx index 717f339c..c780fa8f 100644 --- a/apps/editor/store/use-editor.tsx +++ b/apps/editor/store/use-editor.tsx @@ -69,6 +69,38 @@ const useEditor = create()((set, get) => ({ const viewer = useViewer.getState() const scene = useScene.getState() + // Helper to find building and level 0 + const selectBuildingAndLevel0 = () => { + let buildingId = viewer.selection.buildingId + + // If no building selected, find the first one + if (!buildingId) { + const firstBuildingId = scene.rootNodeIds.find((id) => { + const node = scene.nodes[id] + return node?.type === 'building' + }) + if (firstBuildingId) { + buildingId = firstBuildingId as BuildingNode['id'] + viewer.setSelection({ buildingId }) + } + } + + // If no level selected, find level 0 in the building + if (buildingId && !viewer.selection.levelId) { + const buildingNode = scene.nodes[buildingId] as BuildingNode + const level0Id = buildingNode.children.find((childId) => { + const levelNode = scene.nodes[childId] as LevelNode + return levelNode?.type === 'level' && levelNode.level === 0 + }) + if (level0Id) { + viewer.setSelection({ levelId: level0Id as LevelNode['id'] }) + } else if (buildingNode.children[0]) { + // Fallback to first level if level 0 doesn't exist + viewer.setSelection({ levelId: buildingNode.children[0] as LevelNode['id'] }) + } + } + } + switch (phase) { case 'site': // In Site mode, we zoom out and deselect specific levels/buildings @@ -77,29 +109,12 @@ const useEditor = create()((set, get) => ({ break case 'structure': - // In Structure mode, we often want to focus on a specific building/level - // Auto-select the first building if none is selected - if (!viewer.selection.buildingId) { - const firstBuildingId = scene.rootNodeIds.find((id) => { - const node = scene.nodes[id] - return node?.type === 'building' || null - }) - if (firstBuildingId) { - viewer.setSelection({ - buildingId: firstBuildingId as BuildingNode['id'], - }) - const buildingNode = scene.nodes[firstBuildingId] as BuildingNode - const firstLevelId = buildingNode.children[0] - if (firstLevelId) { - viewer.setSelection({ levelId: firstLevelId as LevelNode['id'] }) - } - } - } - viewer.setLevelMode('stacked') // Better for structure editing + selectBuildingAndLevel0() + viewer.setLevelMode('stacked') break case 'furnish': - // Maybe in furnish mode we force "solo" level view to see inside rooms + selectBuildingAndLevel0() viewer.setLevelMode('solo') break } @@ -109,7 +124,14 @@ const useEditor = create()((set, get) => ({ tool: null, setTool: (tool) => set({ tool }), structureLayer: 'elements', - setStructureLayer: (layer) => set({ structureLayer: layer }), + setStructureLayer: (layer) => { + set({ structureLayer: layer }) + const viewer = useViewer.getState() + viewer.setSelection({ + selectedIds: [], + zoneId: null, + }) + }, catalogCategory: null, setCatalogCategory: (category) => set({ catalogCategory: category }), selectedItem: null,