# Tooltip面板
::: details 目录
[[toc]]
:::
## 指令说明
目前对模型添加Tooltip面板的方式只有一种 就是前端自定义一个Vue组件,然后引擎获取组件实例,并将其显示到3D场景中的特定位置,后续会支持Canvas方式添加Tooltip
## 添加面板
::: details 完整结构
```json5
{
"CmdName": "PEChengWebView",
"Time": "",
"Platform": "",
"CmdParams": {
},
"OrderList": [{
"OrderName": "PELoadWebView",//--必填-- 加载VUE组件
"OrderParams": {
"ViewList": [{//--必填-- 需要显示web面板的SourceID
"ObjectID": "",//--必填-- SourceID
"ViewName": "",//--必填-- Vue组件名称
"ViewParam": {},//--必填-- 需要传递给Vue组件的参数对象
"IsLimit": true,//该View是否需要需要常驻显示在场景中 默认为True
"Matrix": {//面板的默认显示参数
"ScalePosition": {//View的缩放逻辑
"MinScalePosition": 0,//最小缩放距离
"MaxScalePosition": 0//最大缩放距离
},
"Translate": {//View距离Mesh的偏移量
"x": 100,
"y": 100,
"z": 100
},
"DefaultScale": 0.2//View的默认缩放系数
}
}]
}
}
]
}
```
:::
### 原理说明
引擎根据ObjectID找到对应的模型,然后计算出包围盒的大小,在根据ViewName从UI上获取该Vue组件的的Dom实例,将该Dom元素显示到模型正上方默认的位置
### 参数说明
::: details ObjectID
模型对应的SourceID
:::
::: details ViewName
自定义Vue组件的名称,该组件必须现在BimView.vue中注册过
:::
::: details ViewParam
需要显示ToolTip面板的数据源
:::
::: details IsLimit
由于每一个ToolTip面板都是一个Dom实例,如果一次性显示太多面板会造成卡顿,所以引擎会自动根据当前场景中面板的数量,自动进行添加删除,例如一共显示50个面板,那么引擎会自动删除二十个,只显示距离相机最近的30个面板,但是如果希望某个面板一直显示在场景中,则设置**IsLimit**为false即可。
:::
::: details ScalePosition
Vue组件添加到场景中后会默认设置为DefaultScale设置的缩放系数,该缩放系数是前端与美术一起商定的默认显示大小,然后再MinScalePosition与MinScalePosition距离范围内随着相机拉远View自动放大,相机拉近自动缩小,小于MinScalePosition或者大于MinScalePosition不进行缩放控制
:::
::: details Translate
面板默认显示的位置是模型包围盒的正上方,如果默认位置并不符合需求,则可以通过该属性设置X,Y,Z三个方向上的偏移量
:::
::: details DefaultScale
因为UI中的单位是像素,但是在3D中并没有像素的概念,所以UI中看到的大小并不是3D中看到的大小,所以需要通过该属性调整面板显示大小。
:::
### 使用说明
::: details 简单例子
1.编写自定义的Vue组件 例如名字叫:HelloWorld.vue
```js
```
2.在BIMView.vue中声明注册自定义组件
3.发送显示Tooltip面板指令
```json
{
"CmdName": "PEChengWebView",
"Time": "",
"Platform": "",
"CmdParams": {
},
"OrderList": [{
"OrderName": "PELoadWebView",
"OrderParams": {
"ViewList": [{
"ObjectID": "*******",
"ViewName": "HelloWorld",
"ViewParam": {
"content": "动态面板模拟数据源"
},
"IsLimit": true,
"Matrix": {
"ScalePosition": {
"MinScalePosition": 0,
"MaxScalePosition": 0
},
"Translate": {
"x": 100,
"y": 100,
"z": 100
},
"DefaultScale": 0.2
}
}]
}
}
]
}
```
:::
## 卸载面板
::: details 完整结构
```json5
{
"CmdName": "PEChengWebView",
"Time": "",
"Platform": "",
"CmdParams": {
},
"OrderList": [
{
"OrderName": "PERemoveWebView",//卸载View组件
"OrderParams": {
"ViewList": [//--必填-- 需要卸载的SourceID列表
""
]
}
}
]
}
```
:::
## 更新面板数据源
::: details 完整结构
```json5
{
"CmdName": "PEChengWebView",
"Time": "",
"Platform": "",
"CmdParams": {
},
"OrderList": [
{
"OrderName": "PEUpdateData",//更新数据
"OrderParams": {
"IDList": [{//--必填-- 需要更新的SourceID列表
"ObjectID": "",//--必填-- SourceID
"ViewParam": {//--必填-- 需要更新的数据
}
}]
}
}
]
}
```
:::
## 面板刷新频率设置
::: details 完整结构
```json5
{
"CmdName": "PEChengWebView",
"Time": "",
"Platform": "",
"CmdParams": {
},
"OrderList": [
{
"OrderName": "PEUpdateType",//设置View刷新的模式
"OrderParams": {
"Type": 0,//0 表示 每一帧 固定时间间隔去计算一次 1 表示只有在鼠标结束操作之后才会去计算一次view
"TimeOut": 500//刷新的时间间隔
}
}
]
}
```
:::
## 指令常见问题说明
### View的显示逻辑
如果场景中添加同时添加太多的view会导致性能消耗严重,而相同的dom元素又无法复用,所以在配置文件中MaxViewNumber属性设置了场景中同时存在View的数量限制
默认再相机视野范围内并且距离场景中心点最近的30个View才会显示
IsLimit控制是否接受限制,如果等于false不受限制则只要view出现在相机视野范围内就会一直常驻显示
### View的刷新逻辑
刷新方式1:在鼠标操作场景过程中每500毫秒修改一次View的位置缩放等信息
刷新方式2:再鼠标操作场景结束之后500毫秒修改一次View的位置缩放等信息
默认方式为刷新方式1
### View的缩放逻辑
View添加到场景中后回默认设置为DefaultScale设置的缩放系数,该缩放系数是前端与美术一起商定的默认显示大小,然后再MinScalePosition与MinScalePosition距离范围内随着相机拉远View自动放大,相机拉近自动缩小,小于MinScalePosition或者大于MinScalePosition不进行缩放控制
### View的显示位置控制
View默认显示为Mesh包围盒的正上方10单位的位置,然后以此为原点进行Translate设置的偏移量
### View组件数据刷新
Web平台直接修改**PELoadWebView**指令传入的**ViewParam**也可以修改面板中的数据源,但是强烈建议都通过PEUpdateData指令去进行修改数据源,因为直接修改会造成如果更新数据源出现bug很难浮现出问题。通过指令修改可以有效追踪数据是如何呗修改的。