auto-selection of level / building
This commit is contained in:
@@ -69,6 +69,38 @@ const useEditor = create<EditorState>()((set, get) => ({
|
|||||||
const viewer = useViewer.getState()
|
const viewer = useViewer.getState()
|
||||||
const scene = useScene.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) {
|
switch (phase) {
|
||||||
case 'site':
|
case 'site':
|
||||||
// In Site mode, we zoom out and deselect specific levels/buildings
|
// In Site mode, we zoom out and deselect specific levels/buildings
|
||||||
@@ -77,29 +109,12 @@ const useEditor = create<EditorState>()((set, get) => ({
|
|||||||
break
|
break
|
||||||
|
|
||||||
case 'structure':
|
case 'structure':
|
||||||
// In Structure mode, we often want to focus on a specific building/level
|
selectBuildingAndLevel0()
|
||||||
// Auto-select the first building if none is selected
|
viewer.setLevelMode('stacked')
|
||||||
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
|
|
||||||
break
|
break
|
||||||
|
|
||||||
case 'furnish':
|
case 'furnish':
|
||||||
// Maybe in furnish mode we force "solo" level view to see inside rooms
|
selectBuildingAndLevel0()
|
||||||
viewer.setLevelMode('solo')
|
viewer.setLevelMode('solo')
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@@ -109,7 +124,14 @@ const useEditor = create<EditorState>()((set, get) => ({
|
|||||||
tool: null,
|
tool: null,
|
||||||
setTool: (tool) => set({ tool }),
|
setTool: (tool) => set({ tool }),
|
||||||
structureLayer: 'elements',
|
structureLayer: 'elements',
|
||||||
setStructureLayer: (layer) => set({ structureLayer: layer }),
|
setStructureLayer: (layer) => {
|
||||||
|
set({ structureLayer: layer })
|
||||||
|
const viewer = useViewer.getState()
|
||||||
|
viewer.setSelection({
|
||||||
|
selectedIds: [],
|
||||||
|
zoneId: null,
|
||||||
|
})
|
||||||
|
},
|
||||||
catalogCategory: null,
|
catalogCategory: null,
|
||||||
setCatalogCategory: (category) => set({ catalogCategory: category }),
|
setCatalogCategory: (category) => set({ catalogCategory: category }),
|
||||||
selectedItem: null,
|
selectedItem: null,
|
||||||
|
|||||||
Reference in New Issue
Block a user