修复楼层点位展示与楼层匹配

This commit is contained in:
lyf
2026-06-28 00:38:42 +08:00
parent f043c85af0
commit 1ad77fcf48
4 changed files with 135 additions and 20 deletions

View File

@@ -132,6 +132,7 @@ interface ReusableModelResources {
interface PoiMarkerCacheEntry {
floorId: string
displayMode: PoiDisplayMode
pois: RenderPoi[]
group: THREE.Group
markerSize: number
@@ -393,20 +394,25 @@ const isExteriorModelNode = (object: THREE.Object3D) => (
))
)
const getKnownFloorIdsBySpecificity = () => (
const getKnownFloorMatchEntriesBySpecificity = () => (
floorIndex.value
.map((floor) => floor.floorId)
.sort((a, b) => b.length - a.length)
.flatMap((floor) => [floor.floorId, floor.label, ...(floor.modelMatchKeys || [])]
.filter((value): value is string => Boolean(value))
.map((key) => ({ key, floorId: floor.floorId })))
.sort((a, b) => b.key.length - a.key.length)
)
const getModelNodeFloorIdByName = (name: string) => {
if (!name) return ''
return getKnownFloorIdsBySpecificity().find((floorId) => (
name === floorId
|| name.startsWith(`${floorId}_`)
|| name.startsWith(`${floorId}中心`)
)) || ''
const normalizedName = normalizeModelMatchKey(name)
return getKnownFloorMatchEntriesBySpecificity().find(({ key }) => (
name === key
|| name.startsWith(`${key}_`)
|| name.startsWith(`${key}中心`)
|| normalizedName === normalizeModelMatchKey(key)
|| normalizedName.startsWith(normalizeModelMatchKey(key))
))?.floorId || ''
}
const getModelNodeFloorId = (object: THREE.Object3D) => (
@@ -489,6 +495,8 @@ const getPoiDisplayMode = (): PoiDisplayMode => {
return 'detail'
}
const getPoiMarkerCacheKey = (floorId: string, displayMode = getPoiDisplayMode()) => `${floorId}:${displayMode}`
const getPoiGlyph = (poi: RenderPoi) => (
poiGlyphMap[poi.iconType] || poi.name.charAt(0) || '点'
)
@@ -521,6 +529,7 @@ const getActiveModelSpan = () => {
}
const getPoiVisibilityTier = (): PoiVisibilityTier => {
if (activeView.value === 'floor') return 'full'
if (!controls || !activeModel) return 'full'
const ratio = controls.getDistance() / getActiveModelSpan()
@@ -2339,10 +2348,16 @@ const addFocusMarkerFromRequest = (request: TargetPoiFocusRequest) => {
return poi
}
const createPoiMarkerGroup = (floorId: string, pois: RenderPoi[], markerSize: number) => {
const createPoiMarkerGroup = (
floorId: string,
displayMode: PoiDisplayMode,
pois: RenderPoi[],
markerSize: number
) => {
const group = new THREE.Group()
group.name = `GuideModelPOI_${floorId}`
group.name = `GuideModelPOI_${floorId}_${displayMode}`
group.userData.floorId = floorId
group.userData.displayMode = displayMode
pois.forEach((poi) => {
const [x, y, z] = poi.positionGltf!
@@ -2374,22 +2389,25 @@ const loadFloorPOIs = async (floor: FloorIndexItem, loadToken?: number) => {
if (loadToken !== undefined && !isCurrentModelLoad(loadToken)) return
const cachedEntry = poiMarkerGroupCache.get(floor.floorId)
const displayMode = getPoiDisplayMode()
const markerCacheKey = getPoiMarkerCacheKey(floor.floorId, displayMode)
const cachedEntry = poiMarkerGroupCache.get(markerCacheKey)
if (cachedEntry) {
attachPoiMarkerGroup(cachedEntry)
return
}
const cachedPois = poiDataCache.get(floor.floorId)
const validPois = cachedPois || (await props.modelSource.loadFloorPois(floor.floorId))
.filter((poi) => shouldShowPoiInCurrentMode(poi))
const floorPois = cachedPois || await props.modelSource.loadFloorPois(floor.floorId)
if (loadToken !== undefined && !isCurrentModelLoad(loadToken)) return
poiDataCache.set(floor.floorId, validPois)
poiDataCache.set(floor.floorId, floorPois)
const validPois = floorPois.filter((poi) => shouldShowPoiInCurrentMode(poi))
const markerSize = getPoiMarkerSize()
const markerGroup = createPoiMarkerGroup(floor.floorId, validPois, markerSize)
const markerGroup = createPoiMarkerGroup(floor.floorId, displayMode, validPois, markerSize)
const entry: PoiMarkerCacheEntry = {
floorId: floor.floorId,
displayMode,
pois: validPois,
group: markerGroup,
markerSize
@@ -2400,7 +2418,7 @@ const loadFloorPOIs = async (floor: FloorIndexItem, loadToken?: number) => {
return
}
poiMarkerGroupCache.set(floor.floorId, entry)
poiMarkerGroupCache.set(markerCacheKey, entry)
attachPoiMarkerGroup(entry)
}