修复楼层点位展示与楼层匹配
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user