全景热点标签
PanoTagPlugin
功能说明
全景热点标签插件 提供在全景模式下标注房源不同位置热点标签信息。
详细功能点如下:
- 热点标签共分为“音频标签(Audio)”、“文本标签(Text)”、“图文标签(ImageText)”、“VR 跳转标签(Link)”、“营销标签(Marketing)”、“图片视频贴片(MediaPlane)”、“自定义标签(Custom)”等。
- 标签按照维度类型(DimensionType)可以分为:“2D(Two)”和“3D(Three)”两种。
- 按照点位类型(PointType)来分,标签又可以分为:点标记(PointTag)和平面 标记(PlaneTag)两种。
- 用户可以自由组合上述标签分类属性,根据自己的业务类型,创造更加适合的全景热点标签。
示例效果
安装引用
请按需选择 yarn 或 npm 安装方式:
- npm
- Yarn
- pnpm
npm install @realsee/dnalogelyarn add @realsee/dnalogelpnpm add @realsee/dnalogel通过 es 引用:
import { PanoTagPlugin } from '@realsee/dnalogel'开发指南
初始化
在初始化 Five 实例时,将 PanoTagPlugin 配置在初始化插件参数即可。
import { Five } from '@realsee/five'
import { PanoTagPlugin } from '@realsee/dnalogel'
const five = new Five({
plugins: [
[
PanoTagPlugin,
'panoTagPlugin', // 自定义插件名称
{
// 参数配置
},
],
],
})React 初始化
在创建 FiveProvider 时,将 PanoTagPlugin 配置在初始化插件参数即可。
import { PanoTagPlugin } from '@realsee/dnalogel'
import { createFiveProvider, FiveCanvas } from '@realsee/five/react'
const FiveProvider = createFiveProvider({
plugins: [
[
PanoTagPlugin,
'panoTagPlugin', // 自定义插件名称
{
// 参数配置
},
],
],
})Vue 初始化
在使用 FiveProvider 时,将 PanoTagPlugin 配置在初始化插件参数即可。
<template>
<FiveProvider :fiveInitArgs="fiveInitArgs"> </FiveProvider>
</template>
<script setup>
import PanoTagPlugin from '@realsee/dnalogel/libs/PanoTagPlugin'
import { FiveProvider, FiveCanvas } from '@realsee/five/vue'
const fiveInitArgs = {
plugins: [
[
PanoTagPlugin,
'panoTagPlugin', // 自定义插件名称
{
// 参数配置
},
],
],
}
</script>载入数据
// 调用 `load` 方法载入全景标签数据
const plugin: PanoTagPluginControllerplugin.PanoTagPluginController.load(data: Tags): Promise<void>load(const data: {
tagList: Tag[];
}data)
核心方法
载入插件数据
全量加载数据(会覆盖之前的数据)
const plugin: PanoTagPluginControllerplugin.PanoTagPluginController.load(data: Tags): Promise<void>load(const data: {
tagList: Tag[];
}data)增量添加数据
const plugin: PanoTagPluginControllerplugin.PanoTagPluginController.addTag(tag: Tag | Tag[]): Promise<void>addTag(let tag: anytag)清除标签数据
const plugin: PanoTagPluginControllerplugin.PanoTagPluginController.clearTags(): voidclearTags()修改标签配置
const plugin: PanoTagPluginControllerplugin.PanoTagPluginController.changeConfig(config: Pick<Tags, "globalConfig" | "contentTypeConfig">, merge?: boolean | undefined): voidchangeConfig({ globalConfig?: TagConfig<"Audio" | "Text" | "ImageText" | "Image" | "Video" | "Link" | "Sticker" | "VRLink" | "PanoLink" | "Marketing" | "MediaPlane" | "MediaModel" | "Model" | "Panorama" | "Custom" | "Unknown"> | undefined全局配置
globalConfig, contentTypeConfig?: {
[x: string & Record<never, never>]: TagConfig<any> | TagConfig<any> | undefined;
Audio?: TagConfig<"Audio"> | undefined;
Text?: TagConfig<"Text"> | undefined;
ImageText?: TagConfig<"ImageText"> | undefined;
Image?: TagConfig<"Image"> | undefined;
Video?: TagConfig<"Video"> | undefined;
Link?: TagConfig<"Link"> | undefined;
Sticker?: TagConfig<"Sticker"> | undefined;
VRLink?: TagConfig<"VRLink"> | undefined;
PanoLink?: TagConfig<"PanoLink"> | undefined;
Marketing?: TagConfig<"Marketing"> | undefined;
MediaPlane?: TagConfig<"MediaPlane"> | undefined;
MediaModel?: TagConfig<"MediaModel"> | undefined;
Model?: TagConfig<"Model"> | undefined;
Panorama?: TagConfig<"Panorama"> | undefined;
Custom?: TagConfig<"Custom"> | undefined;
Unknown?: TagConfig<"Unknown"> | undefined;
"[Model]"?: TagConfig<any> | TagConfig<any> | undefined;
"[Panorama]"?: TagConfig<any> | TagConfig<any> | undefined;
"[Floorplan]"?: TagConfig<any> | TagConfig<any> | undefined;
"[Topview]"?: TagConfig<any> | TagConfig<any> | undefined;
"[Mapview]"?: TagConfig<any> | TagConfig<any> | undefined;
"[VRPanorama]"?: TagConfig<any> | TagConfig<any> | undefined;
"[DepthPanorama]"?: TagConfig<any> | TagConfig<any> | undefined;
"[XRPanorama]"?: TagConfig<any> | TagConfig<any> | undefined;
"[PanoramaLike]"?: TagConfig<any> | TagConfig<any> | undefined;
"[ModelLike]"?: TagConfig<any> | TagConfig<any> | undefined;
Any?: TagConfig<any> | TagConfig<any> | undefined;
"Model-Audio"?: TagConfig<"Audio"> | undefined ...按type配置
contentTypeConfig })
const plugin: PanoTagPluginControllerplugin.PanoTagPluginController.changeGlobalConfig(globalConfig: TagConfig<"Audio" | "Text" | "ImageText" | "Image" | "Video" | "Link" | "Sticker" | "VRLink" | "PanoLink" | "Marketing" | "MediaPlane" | "MediaModel" | "Model" | "Panorama" | "Custom" | "Unknown"> | undefined, merge?: boolean | undefined): voidchangeGlobalConfig(let globalConfig: anyglobalConfig)
const plugin: PanoTagPluginControllerplugin.PanoTagPluginController.changeContentTypeConfig<any>(key: any, contentTypeConfig: TagConfig<any> | TagConfig<any>, merge?: boolean | undefined): voidchangeContentTypeConfig(let contentTypeKey: anycontentTypeKey, let config: anyconfig)启用/禁用/展示/隐藏/销毁
// 开启插件
const plugin: PanoTagPluginControllerplugin.PanoTagPluginController.enable(params?: {
userAction?: boolean | undefined;
} | undefined): void启用插件,让插件能够响应交互
enable()
// 禁用插件
const plugin: PanoTagPluginControllerplugin.PanoTagPluginController.disable(params?: {
userAction?: boolean | undefined;
} | undefined): void禁用插件,让插件停止响应交互
disable()
// 显示插件
const plugin: PanoTagPluginControllerplugin.PanoTagPluginController.show(params?: {
userAction?: boolean | undefined;
} | undefined): Promise<void>展示UI
show()
// 隐藏插件
const plugin: PanoTagPluginControllerplugin.PanoTagPluginController.hide(params?: {
userAction?: boolean | undefined;
} | undefined): Promise<void>隐藏UI
hide()
// 销毁插件
const plugin: PanoTagPluginControllerplugin.PanoTagPluginController.dispose(): void插件进行销毁
dispose()修改标签数据
修改 tag.data
const plugin: PanoTagPluginControllerplugin.PanoTagPluginController.changeDataById<"Model" | "Text" | "Audio" | "ImageText" | "Image" | "Video" | "Panorama" | "Link" | "VRLink" | "Sticker" | "PanoLink" | "Marketing" | "MediaPlane" | "MediaModel" | "Custom" | "Unknown">(id: TagId, data: PartialObjectDeep<...>, deepMerge?: boolean | undefined): voidchangeDataById(1, let data: anydata)
// or
const const tag: BaseTag<"Model" | "Text" | "Audio" | "ImageText" | "Image" | "Video" | "Panorama" | "Link" | "VRLink" | "Sticker" | "PanoLink" | "Marketing" | "MediaPlane" | "MediaModel" | "Custom" | "Unknown", StickType> | undefinedtag = const plugin: PanoTagPluginControllerplugin.TagUtil.getTagById<"Model" | "Text" | "Audio" | "ImageText" | "Image" | "Video" | "Panorama" | "Link" | "VRLink" | "Sticker" | "PanoLink" | "Marketing" | "MediaPlane" | "MediaModel" | "Custom" | "Unknown", StickType>(id: TagId): BaseTag<...> | undefinedgetTagById(1)
const tag: BaseTag<"Model" | "Text" | "Audio" | "ImageText" | "Image" | "Video" | "Panorama" | "Link" | "VRLink" | "Sticker" | "PanoLink" | "Marketing" | "MediaPlane" | "MediaModel" | "Custom" | "Unknown", StickType> | undefinedtag?.BaseTag<"Model" | "Text" | "Audio" | "ImageText" | "Image" | "Video" | "Panorama" | "Link" | "VRLink" | "Sticker" | "PanoLink" | "Marketing" | "MediaPlane" | "MediaModel" | "Custom" | "Unknown", StickType>.changeData(data: PartialObjectDeep<({
modelUrl: string;
} & {
extraData?: Object | undefined;
} & {
[key: string]: any;
}) | ({
appearance?: "line" | "plane" | undefined;
text?: string | undefined;
title?: string | undefined;
description?: string | undefined;
descriptionMaxRows?: number | ... 1 more ... | undefined;
titleMaxRows?: number | ... 1 more ... | undefined;
edit?: {
...;
} | undefined;
} & {
extraData?: Object | undefined;
} & {
[key: string]: any;
}) | ... 6 more ... | (Object & ... 1 more ... & {
[key: string]: any;
})>, deepMerge?: boolean | undefined): voidchangeData(let data: anydata)-
destroyTagById: (id: TagId | TagId[]) => void销毁 tag -
pauseCurrentMedia: () => void暂停当前标签内进行的所有多媒体
热点标签配置
热点标签可以通过丰富的配置来实现各种不同的标签展示效果:
添加 config
- load 时添加
const const globalConfig: TagConfig<"Audio" | "Text" | "ImageText" | "Image" | "Video" | "Link" | "Sticker" | "VRLink" | "PanoLink" | "Marketing" | "MediaPlane" | "MediaModel" | "Model" | "Panorama" | "Custom" | "Unknown">globalConfig: interface TagConfig<C extends "Audio" | "Text" | "ImageText" | "Image" | "Video" | "Link" | "Sticker" | "VRLink" | "PanoLink" | "Marketing" | "MediaPlane" | "MediaModel" | "Model" | "Panorama" | "Custom" | "Unknown" = "Audio" | ... 14 more ... | "Unknown">TagConfig = {}
const const TextTagConfig: TagConfig<"Audio" | "Text" | "ImageText" | "Image" | "Video" | "Link" | "Sticker" | "VRLink" | "PanoLink" | "Marketing" | "MediaPlane" | "MediaModel" | "Model" | "Panorama" | "Custom" | "Unknown">TextTagConfig: interface TagConfig<C extends "Audio" | "Text" | "ImageText" | "Image" | "Video" | "Link" | "Sticker" | "VRLink" | "PanoLink" | "Marketing" | "MediaPlane" | "MediaModel" | "Model" | "Panorama" | "Custom" | "Unknown" = "Audio" | ... 14 more ... | "Unknown">TagConfig = {}
const pluginInstance: PanoTagPluginControllerpluginInstance.PanoTagPluginController.load(data: Tags): Promise<void>load({
Tags.tagList: Tag<"Audio" | "Text" | "ImageText" | "Image" | "Video" | "Link" | "Sticker" | "VRLink" | "PanoLink" | "Marketing" | "MediaPlane" | "MediaModel" | "Model" | "Panorama" | "Custom" | "Unknown", StickType>[]标签列表配置
tagList: [],
Tags.globalConfig?: TagConfig<"Audio" | "Text" | "ImageText" | "Image" | "Video" | "Link" | "Sticker" | "VRLink" | "PanoLink" | "Marketing" | "MediaPlane" | "MediaModel" | "Model" | "Panorama" | "Custom" | "Unknown"> | undefined全局配置
globalConfig: const globalConfig: TagConfig<"Audio" | "Text" | "ImageText" | "Image" | "Video" | "Link" | "Sticker" | "VRLink" | "PanoLink" | "Marketing" | "MediaPlane" | "MediaModel" | "Model" | "Panorama" | "Custom" | "Unknown">globalConfig,
Tags.contentTypeConfig?: {
[x: string & Record<never, never>]: TagConfig<any> | TagConfig<any> | undefined;
Audio?: TagConfig<"Audio"> | undefined;
Text?: TagConfig<"Text"> | undefined;
ImageText?: TagConfig<"ImageText"> | undefined;
Image?: TagConfig<"Image"> | undefined;
Video?: TagConfig<"Video"> | undefined;
Link?: TagConfig<"Link"> | undefined;
Sticker?: TagConfig<"Sticker"> | undefined;
VRLink?: TagConfig<"VRLink"> | undefined;
PanoLink?: TagConfig<"PanoLink"> | undefined;
Marketing?: TagConfig<"Marketing"> | undefined;
MediaPlane?: TagConfig<"MediaPlane"> | undefined;
MediaModel?: TagConfig<"MediaModel"> | undefined;
Model?: TagConfig<"Model"> | undefined;
Panorama?: TagConfig<"Panorama"> | undefined;
Custom?: TagConfig<"Custom"> | undefined;
Unknown?: TagConfig<"Unknown"> | undefined;
"[Model]"?: TagConfig<any> | TagConfig<any> | undefined;
"[Panorama]"?: TagConfig<any> | TagConfig<any> | undefined;
"[Floorplan]"?: TagConfig<any> | TagConfig<any> | undefined;
"[Topview]"?: TagConfig<any> | TagConfig<any> | undefined;
"[Mapview]"?: TagConfig<any> | TagConfig<any> | undefined;
"[VRPanorama]"?: TagConfig<any> | TagConfig<any> | undefined;
"[DepthPanorama]"?: TagConfig<any> | TagConfig<any> | undefined;
"[XRPanorama]"?: TagConfig<any> | TagConfig<any> | undefined;
"[PanoramaLike]"?: TagConfig<any> | TagConfig<any> | undefined;
"[ModelLike]"?: TagConfig<any> | TagConfig<any> | undefined;
Any?: TagConfig<any> | TagConfig<any> | undefined;
"Model-Audio"?: TagConfig<"Audio"> | undefined ...按type配置
contentTypeConfig: {
'Text': const TextTagConfig: TagConfig<"Audio" | "Text" | "ImageText" | "Image" | "Video" | "Link" | "Sticker" | "VRLink" | "PanoLink" | "Marketing" | "MediaPlane" | "MediaModel" | "Model" | "Panorama" | "Custom" | "Unknown">TextTagConfig
}
})- 实时切换
import { interface TagConfig<C extends "Audio" | "Text" | "ImageText" | "Image" | "Video" | "Link" | "Sticker" | "VRLink" | "PanoLink" | "Marketing" | "MediaPlane" | "MediaModel" | "Model" | "Panorama" | "Custom" | "Unknown" = "Audio" | ... 14 more ... | "Unknown">TagConfig } from '@realsee/dnalogel'
const const globalConfig: TagConfig<"Audio" | "Text" | "ImageText" | "Image" | "Video" | "Link" | "Sticker" | "VRLink" | "PanoLink" | "Marketing" | "MediaPlane" | "MediaModel" | "Model" | "Panorama" | "Custom" | "Unknown">globalConfig: interface TagConfig<C extends "Audio" | "Text" | "ImageText" | "Image" | "Video" | "Link" | "Sticker" | "VRLink" | "PanoLink" | "Marketing" | "MediaPlane" | "MediaModel" | "Model" | "Panorama" | "Custom" | "Unknown" = "Audio" | ... 14 more ... | "Unknown">TagConfig = {}
const const contentTypeConfig: {
Text: {};
}contentTypeConfig = {
'Text': {}
}
const pluginInstance: PanoTagPluginControllerpluginInstance.PanoTagPluginController.changeConfig(config: Pick<Tags, "globalConfig" | "contentTypeConfig">, merge?: boolean | undefined): voidchangeConfig({
globalConfig?: TagConfig<"Audio" | "Text" | "ImageText" | "Image" | "Video" | "Link" | "Sticker" | "VRLink" | "PanoLink" | "Marketing" | "MediaPlane" | "MediaModel" | "Model" | "Panorama" | "Custom" | "Unknown"> | undefined全局配置
globalConfig,
contentTypeConfig?: {
[x: string & Record<never, never>]: TagConfig<any> | TagConfig<any> | undefined;
Audio?: TagConfig<"Audio"> | undefined;
Text?: TagConfig<"Text"> | undefined;
ImageText?: TagConfig<"ImageText"> | undefined;
Image?: TagConfig<"Image"> | undefined;
Video?: TagConfig<"Video"> | undefined;
Link?: TagConfig<"Link"> | undefined;
Sticker?: TagConfig<"Sticker"> | undefined;
VRLink?: TagConfig<"VRLink"> | undefined;
PanoLink?: TagConfig<"PanoLink"> | undefined;
Marketing?: TagConfig<"Marketing"> | undefined;
MediaPlane?: TagConfig<"MediaPlane"> | undefined;
MediaModel?: TagConfig<"MediaModel"> | undefined;
Model?: TagConfig<"Model"> | undefined;
Panorama?: TagConfig<"Panorama"> | undefined;
Custom?: TagConfig<"Custom"> | undefined;
Unknown?: TagConfig<"Unknown"> | undefined;
"[Model]"?: TagConfig<any> | TagConfig<any> | undefined;
"[Panorama]"?: TagConfig<any> | TagConfig<any> | undefined;
"[Floorplan]"?: TagConfig<any> | TagConfig<any> | undefined;
"[Topview]"?: TagConfig<any> | TagConfig<any> | undefined;
"[Mapview]"?: TagConfig<any> | TagConfig<any> | undefined;
"[VRPanorama]"?: TagConfig<any> | TagConfig<any> | undefined;
"[DepthPanorama]"?: TagConfig<any> | TagConfig<any> | undefined;
"[XRPanorama]"?: TagConfig<any> | TagConfig<any> | undefined;
"[PanoramaLike]"?: TagConfig<any> | TagConfig<any> | undefined;
"[ModelLike]"?: TagConfig<any> | TagConfig<any> | undefined;
Any?: TagConfig<any> | TagConfig<any> | undefined;
"Model-Audio"?: TagConfig<"Audio"> | undefined ...按type配置
contentTypeConfig
})Config 种类
1. 全局 Config
const const globalConfig: TagConfig<"Audio" | "Text" | "ImageText" | "Image" | "Video" | "Link" | "Sticker" | "VRLink" | "PanoLink" | "Marketing" | "MediaPlane" | "MediaModel" | "Model" | "Panorama" | "Custom" | "Unknown">globalConfig: interface TagConfig<C extends "Audio" | "Text" | "ImageText" | "Image" | "Video" | "Link" | "Sticker" | "VRLink" | "PanoLink" | "Marketing" | "MediaPlane" | "MediaModel" | "Model" | "Panorama" | "Custom" | "Unknown" = "Audio" | ... 14 more ... | "Unknown">TagConfig = {}
const pluginInstance: PanoTagPluginControllerpluginInstance.PanoTagPluginController.load(data: Tags): Promise<void>load({
Tags.tagList: Tag<"Audio" | "Text" | "ImageText" | "Image" | "Video" | "Link" | "Sticker" | "VRLink" | "PanoLink" | "Marketing" | "MediaPlane" | "MediaModel" | "Model" | "Panorama" | "Custom" | "Unknown", StickType>[]标签列表配置
tagList: [],
Tags.globalConfig?: TagConfig<"Audio" | "Text" | "ImageText" | "Image" | "Video" | "Link" | "Sticker" | "VRLink" | "PanoLink" | "Marketing" | "MediaPlane" | "MediaModel" | "Model" | "Panorama" | "Custom" | "Unknown"> | undefined全局配置
globalConfig: const globalConfig: TagConfig<"Audio" | "Text" | "ImageText" | "Image" | "Video" | "Link" | "Sticker" | "VRLink" | "PanoLink" | "Marketing" | "MediaPlane" | "MediaModel" | "Model" | "Panorama" | "Custom" | "Unknown">globalConfig
})2. 按标签类型的config,只对指定类型的标签生效
这种设置方式全局配置也会同时生效,配置冲突时以局部配置为准
const const TextTagConfig: TagConfig<"Audio" | "Text" | "ImageText" | "Image" | "Video" | "Link" | "Sticker" | "VRLink" | "PanoLink" | "Marketing" | "MediaPlane" | "MediaModel" | "Model" | "Panorama" | "Custom" | "Unknown">TextTagConfig: interface TagConfig<C extends "Audio" | "Text" | "ImageText" | "Image" | "Video" | "Link" | "Sticker" | "VRLink" | "PanoLink" | "Marketing" | "MediaPlane" | "MediaModel" | "Model" | "Panorama" | "Custom" | "Unknown" = "Audio" | ... 14 more ... | "Unknown">TagConfig = {}
const pluginInstance: PanoTagPluginControllerpluginInstance.PanoTagPluginController.load(data: Tags): Promise<void>load({
Tags.tagList: Tag<"Audio" | "Text" | "ImageText" | "Image" | "Video" | "Link" | "Sticker" | "VRLink" | "PanoLink" | "Marketing" | "MediaPlane" | "MediaModel" | "Model" | "Panorama" | "Custom" | "Unknown", StickType>[]标签列表配置
tagList: [],
Tags.contentTypeConfig?: {
[x: string & Record<never, never>]: TagConfig<any> | TagConfig<any> | undefined;
Audio?: TagConfig<"Audio"> | undefined;
Text?: TagConfig<"Text"> | undefined;
ImageText?: TagConfig<"ImageText"> | undefined;
Image?: TagConfig<"Image"> | undefined;
Video?: TagConfig<"Video"> | undefined;
Link?: TagConfig<"Link"> | undefined;
Sticker?: TagConfig<"Sticker"> | undefined;
VRLink?: TagConfig<"VRLink"> | undefined;
PanoLink?: TagConfig<"PanoLink"> | undefined;
Marketing?: TagConfig<"Marketing"> | undefined;
MediaPlane?: TagConfig<"MediaPlane"> | undefined;
MediaModel?: TagConfig<"MediaModel"> | undefined;
Model?: TagConfig<"Model"> | undefined;
Panorama?: TagConfig<"Panorama"> | undefined;
Custom?: TagConfig<"Custom"> | undefined;
Unknown?: TagConfig<"Unknown"> | undefined;
"[Model]"?: TagConfig<any> | TagConfig<any> | undefined;
"[Panorama]"?: TagConfig<any> | TagConfig<any> | undefined;
"[Floorplan]"?: TagConfig<any> | TagConfig<any> | undefined;
"[Topview]"?: TagConfig<any> | TagConfig<any> | undefined;
"[Mapview]"?: TagConfig<any> | TagConfig<any> | undefined;
"[VRPanorama]"?: TagConfig<any> | TagConfig<any> | undefined;
"[DepthPanorama]"?: TagConfig<any> | TagConfig<any> | undefined;
"[XRPanorama]"?: TagConfig<any> | TagConfig<any> | undefined;
"[PanoramaLike]"?: TagConfig<any> | TagConfig<any> | undefined;
"[ModelLike]"?: TagConfig<any> | TagConfig<any> | undefined;
Any?: TagConfig<any> | TagConfig<any> | undefined;
"Model-Audio"?: TagConfig<"Audio"> | undefined ...按type配置
contentTypeConfig: {
'Text': const TextTagConfig: TagConfig<"Audio" | "Text" | "ImageText" | "Image" | "Video" | "Link" | "Sticker" | "VRLink" | "PanoLink" | "Marketing" | "MediaPlane" | "MediaModel" | "Model" | "Panorama" | "Custom" | "Unknown">TextTagConfig
}
})2. 标签单独配置,只对单个标签生效
这种设置方式全局配置和标签类型维度的配置也会同时生效,配置冲突时以标签单独配置为准
const const TagConfig1: TagConfig<"Audio" | "Text" | "ImageText" | "Image" | "Video" | "Link" | "Sticker" | "VRLink" | "PanoLink" | "Marketing" | "MediaPlane" | "MediaModel" | "Model" | "Panorama" | "Custom" | "Unknown">TagConfig1: interface TagConfig<C extends "Audio" | "Text" | "ImageText" | "Image" | "Video" | "Link" | "Sticker" | "VRLink" | "PanoLink" | "Marketing" | "MediaPlane" | "MediaModel" | "Model" | "Panorama" | "Custom" | "Unknown" = "Audio" | ... 14 more ... | "Unknown">TagConfig = {}
const pluginInstance: PanoTagPluginControllerpluginInstance.PanoTagPluginController.load(data: Tags): Promise<void>load({
Tags.tagList: Tag<"Audio" | "Text" | "ImageText" | "Image" | "Video" | "Link" | "Sticker" | "VRLink" | "PanoLink" | "Marketing" | "MediaPlane" | "MediaModel" | "Model" | "Panorama" | "Custom" | "Unknown", StickType>[]标签列表配置
tagList: [
{
...let tagData: anytagData, // 标签数据
config?: TagConfig<"Audio" | "Text" | "ImageText" | "Image" | "Video" | "Link" | "Sticker" | "VRLink" | "PanoLink" | "Marketing" | "MediaPlane" | "MediaModel" | "Model" | "Panorama" | "Custom" | "Unknown"> | undefined「展开/收起」 「可见/不可见」 的策略配置
config: const TagConfig1: TagConfig<"Audio" | "Text" | "ImageText" | "Image" | "Video" | "Link" | "Sticker" | "VRLink" | "PanoLink" | "Marketing" | "MediaPlane" | "MediaModel" | "Model" | "Panorama" | "Custom" | "Unknown">TagConfig1 // 只针对本标签有效
}
],
})Config interface
const const config: {
visibleConfig?: {
keep?: "visible" | "hidden" | null | undefined;
visibleFiveMode?: TagVisibleMode | ((tag: TagInstance) => TagVisibleMode) | undefined;
entryFromModel?: boolean | undefined;
followModelVisibility?: boolean | undefined;
alwaysShowWhenMovePano?: boolean | undefined;
visibleDistance?: MinMax | "unLimited" | undefined;
visiblePanoIndex?: "all" | "current" | number[] | undefined;
intersectRaycaster?: boolean | {
enabled?: boolean | undefined;
distanceAccuracy?: number | undefined;
checkPoints?: "center" | "corner" | Vector3[] | undefined;
needPassed?: number | undefined;
} | undefined;
angleRange?: MinMax | undefined;
} | ConfigFunction | undefined;
unfoldedConfig?: ConfigFunction | {
keep?: "unfolded" | "folded" | null | undefined;
autoFoldWhenHide?: false | undefined;
disableUnfold?: true | undefined;
disableFold?: true | undefined;
unfoldDistance?: MinMax | undefined;
autoUnfold?: false | {
enable?: boolean | undefined;
strategy?: "ScreenPostion" | undefined;
autoUnfoldProjectX?: MinMax | undefined;
} | {
enable?: boolean | undefined;
strategy?: "MinimumDistance" | undefined;
maxNumber?: number | undefined;
distance?: MinMax | undefined;
} | {
enable?: boolean | undefined;
strategy?: "FoldWhenMove" | undefined;
} | undefined;
} | undefined; ...config: type Simplify<T> = { [KeyType in keyof T]: T[KeyType]; }Useful to flatten the type output to improve type hints shown in editors. And also to transform an interface into a type to aide with assignability.
Simplify<interface TagConfig<C extends "Audio" | "Text" | "ImageText" | "Image" | "Video" | "Link" | "Sticker" | "VRLink" | "PanoLink" | "Marketing" | "MediaPlane" | "MediaModel" | "Model" | "Panorama" | "Custom" | "Unknown" = "Audio" | ... 14 more ... | "Unknown">TagConfig> = {
visibleConfig?: {
keep?: "visible" | "hidden" | null | undefined;
visibleFiveMode?: TagVisibleMode | ((tag: TagInstance) => TagVisibleMode) | undefined;
entryFromModel?: boolean | undefined;
followModelVisibility?: boolean | undefined;
alwaysShowWhenMovePano?: boolean | undefined;
visibleDistance?: MinMax | "unLimited" | undefined;
visiblePanoIndex?: "all" | "current" | number[] | undefined;
intersectRaycaster?: boolean | {
enabled?: boolean | undefined;
distanceAccuracy?: number | undefined;
checkPoints?: "center" | "corner" | Vector3[] | undefined;
needPassed?: number | undefined;
} | undefined;
angleRange?: MinMax | undefined;
} | ConfigFunction | undefinedvisibleConfig: {
keep?: "visible" | "hidden" | null | undefinedkeep: null,
visibleFiveMode?: TagVisibleMode | ((tag: TagInstance) => TagVisibleMode) | undefinedvisibleFiveMode: ['Panorama'],
visibleDistance?: MinMax | "unLimited" | undefinedvisibleDistance: { MinMax.min?: number | undefinedmin: 0, MinMax.max?: number | undefinedmax: 10 },
visiblePanoIndex?: "all" | "current" | number[] | undefinedvisiblePanoIndex: var undefinedundefined,
// 仅在 Mapview/Floorplan 下跟随当前楼层可见性
followModelVisibility?: boolean | undefinedfollowModelVisibility: false,
// 从模型态点击入口进入全景时,是否允许看向标签点(仅全景标签)
entryFromModel?: boolean | undefinedentryFromModel: false,
// 碰撞检测配置:控制遮挡判断
intersectRaycaster?: boolean | {
enabled?: boolean | undefined;
distanceAccuracy?: number | undefined;
checkPoints?: "center" | "corner" | Vector3[] | undefined;
needPassed?: number | undefined;
} | undefinedintersectRaycaster: {
enabled?: boolean | undefinedenabled: true,
distanceAccuracy?: number | undefineddistanceAccuracy: 0.04,
checkPoints?: "center" | "corner" | Vector3[] | undefinedcheckPoints: 'corner',
needPassed?: number | undefinedneedPassed: 1,
},
// 3D 标签在全景下,根据相机与法线夹角的可见范围
angleRange?: MinMax | undefinedangleRange: var undefinedundefined,
},
unfoldedConfig?: ConfigFunction | {
keep?: "unfolded" | "folded" | null | undefined;
autoFoldWhenHide?: false | undefined;
disableUnfold?: true | undefined;
disableFold?: true | undefined;
unfoldDistance?: MinMax | undefined;
autoUnfold?: false | {
enable?: boolean | undefined;
strategy?: "ScreenPostion" | undefined;
autoUnfoldProjectX?: MinMax | undefined;
} | {
enable?: boolean | undefined;
strategy?: "MinimumDistance" | undefined;
maxNumber?: number | undefined;
distance?: MinMax | undefined;
} | {
enable?: boolean | undefined;
strategy?: "FoldWhenMove" | undefined;
} | undefined;
} | undefinedunfoldedConfig: {
keep?: "unfolded" | "folded" | null | undefinedkeep: null,
autoFoldWhenHide?: false | undefinedautoFoldWhenHide: false,
autoUnfold?: false | {
enable?: boolean | undefined;
strategy?: "ScreenPostion" | undefined;
autoUnfoldProjectX?: MinMax | undefined;
} | {
enable?: boolean | undefined;
strategy?: "MinimumDistance" | undefined;
maxNumber?: number | undefined;
distance?: MinMax | undefined;
} | {
enable?: boolean | undefined;
strategy?: "FoldWhenMove" | undefined;
} | undefinedautoUnfold: {
enable?: boolean | undefinedenable: true,
strategy?: "MinimumDistance" | undefined自动展开:最近标签自动展开
strategy: 'MinimumDistance',
maxNumber?: number | undefinedmaxNumber: 1,
distance?: MinMax | undefineddistance: { MinMax.min?: number | undefinedmin: 0, MinMax.max?: number | undefinedmax: 10 }
},
// 进入可见范围则展开,离开则收起
unfoldDistance?: MinMax | undefinedmin-max米内自动展开,否则收起
unfoldDistance: var undefinedundefined,
// 其他策略:'ScreenPostion' | 'FoldWhenMove' | 'ScreenCenter'
// ScreenPostion: 根据投影 x 位置范围展开
// FoldWhenMove: 屏幕移动自动收起
// ScreenCenter: 屏幕中心优先展开
},
// 初始状态
initialState?: {
visible?: boolean | undefined;
unfolded?: boolean | undefined;
} | undefined初始状态
initialState: {
visible?: boolean | undefinedvisible: var undefinedundefined,
unfolded?: boolean | undefinedunfolded: var undefinedundefined,
},
// 初始化合并到 tag.data 的默认数据(支持 important 覆盖)
initialData?: (PartialObjectDeep<({
text?: string | undefined;
title?: string | undefined;
appearance?: "line" | "plane" | undefined;
theme?: "dark" | "light" | undefined;
audioUrl: string;
} & {
extraData?: Object | undefined;
} & {
[key: string]: any;
}) | ({
appearance?: "line" | "plane" | undefined;
text?: string | undefined;
title?: string | undefined;
description?: string | undefined;
descriptionMaxRows?: number | null | undefined;
titleMaxRows?: number | null | undefined;
edit?: {
title?: {
inputting?: boolean | undefined;
placeholder?: string | undefined;
} | undefined;
description?: {
inputting?: boolean | undefined;
placeholder?: string | undefined;
} | undefined;
} | undefined;
} & {
extraData?: Object | undefined;
} & {
[key: string]: any;
}) | ({
text?: string | undefined;
title?: string | undefined;
mediaData: (MediaData & {
name?: string | undefined;
})[];
} & {
extraData?: Object | undefined;
} & {
[key: string]: any;
}) | ({
text?: string | undefined;
title?: string | undefined;
linkType?: "normal" | "vr" | undefined;
icon?: TagIconUrl | undefined;
} & {
extraData?: Object | undefined;
} & {
[key: string]: any;
}) | ({
title: string;
brandTags?: string[] | undefined;
tags?: string[] | undefined;
headerPictureUrl?: string | undefined;
highlightText?: string | undefined;
theme?: "dark" | "light" | undefined;
limitWidth?: number | boolean | undefined ...initialData: {
important?: boolean | undefinedimportant: false,
},
// 3D 标签容器配置
tag3DConfig?: ({
ratio?: number | undefined;
dpr?: number | undefined;
devicePixelRatio?: number | undefined;
autoRender?: boolean | undefined;
container?: HTMLElement | undefined;
pointerEvents?: "none" | "auto" | undefined;
wrapperStyle?: Partial<CSSStyleDeclaration> | undefined;
} & ({
mode?: "front" | undefined;
} | {
mode: "behind";
behindFiveContainer?: HTMLElement | undefined;
})) | undefinedtag3DConfig: {
// ratio 等缩放参数在全局默认里也可配置
}
}修改Config
参照 修改标签配置
常用配置项说明
visibleConfig(可见性)
keep: 在指定模式下强制可见/不可见。可选'visible' | 'hidden' | null。设置后同组内其他项不再生效。visibleFiveMode: 指定在哪些 Five 模式下可见。支持Five.Mode | Five.Mode[] | 'PanoramaLike'|'ModelLike'|'all' | ((tag: TagInstance) => TagVisibleMode)返回。followModelVisibility: Mapview/Floorplan 下是否仅在当前楼层可见。entryFromModel: 模型态点击入口,进入全景后自动看向标签(仅全景标签)。visibleDistance: 按与摄像机距离控制可见范围,MinMax或'unLimited'。visiblePanoIndex: 控制在哪些全景点位可见:'all' | 'current' | number[]。intersectRaycaster: 标签遮挡检测(开启将按模型遮挡判断可见)。enabled: 是否开启distanceAccuracy: 距离误差checkPoints:'center' | 'corner' | Vector3[]needPassed: 通过多少检测点算可见
angleRange: 全景下(3D 标签)按相机与法线夹角范围可见。
unfoldedConfig(展开/收起)
keep:'unfolded' | 'folded' | null(优先级最高)。autoFoldWhenHide: 隐藏时自动收起(部分标签天然不可收起)。unfoldDistance: 进入范围展开,出范围收起。autoUnfold策略:'MinimumDistance': 最近标签自动展开,支持maxNumber、distance。'ScreenPostion': 根据标签投影到屏幕的 X 坐标范围展开(autoUnfoldProjectX,取值区间为 [-1, 1],越接近 0 越靠近屏幕中心)。'FoldWhenMove': 屏幕移动时收起。'ScreenCenter': 屏幕中心优先展开(支持distance、maxNumber)。
初始行为与数据
initialState: 初始的visible/unfolded。initialData: 合并到tag.data的默认数据,支持important强覆盖。