::: details 目录 [[toc]] :::
目前对模型添加Tooltip面板的方式只有一种 就是前端自定义一个Vue组件,然后引擎获取组件实例,并将其显示到3D场景中的特定位置,后续会支持Canvas方式添加Tooltip
::: details 完整结构
{
"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
<template>
<div id="SpaceView">
<div id="BottomBox" class="Space">{{Param.content}}</div>
</div>
</template>
<script>
export default {
props:{
Param:Object
},
data:function () {
return {
}
}
}
</script>
<style scoped>
#SpaceView{
width: 206px;
height: 45px;
display: flex;
flex-direction: column;
justify-content: space-between;
}
.Space{
width: 206px;
height: 45px;
border: 1px solid;
display: flex;
justify-content: center;
align-content: center;
flex-direction: column;
}
#BottomBox{
border: yellow;
background-color: #FE5E86;
}
</style>
2.在BIMView.vue中声明注册自定义组件
3.发送显示Tooltip面板指令
{
"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 完整结构
{
"CmdName": "PEChengWebView",
"Time": "",
"Platform": "",
"CmdParams": {
},
"OrderList": [
{
"OrderName": "PERemoveWebView",//卸载View组件
"OrderParams": {
"ViewList": [//--必填-- 需要卸载的SourceID列表
""
]
}
}
]
}
:::
::: details 完整结构
{
"CmdName": "PEChengWebView",
"Time": "",
"Platform": "",
"CmdParams": {
},
"OrderList": [
{
"OrderName": "PEUpdateData",//更新数据
"OrderParams": {
"IDList": [{//--必填-- 需要更新的SourceID列表
"ObjectID": "",//--必填-- SourceID
"ViewParam": {//--必填-- 需要更新的数据
}
}]
}
}
]
}
:::
::: details 完整结构
{
"CmdName": "PEChengWebView",
"Time": "",
"Platform": "",
"CmdParams": {
},
"OrderList": [
{
"OrderName": "PEUpdateType",//设置View刷新的模式
"OrderParams": {
"Type": 0,//0 表示 每一帧 固定时间间隔去计算一次 1 表示只有在鼠标结束操作之后才会去计算一次view
"TimeOut": 500//刷新的时间间隔
}
}
]
}
:::
如果场景中添加同时添加太多的view会导致性能消耗严重,而相同的dom元素又无法复用,所以在配置文件中MaxViewNumber属性设置了场景中同时存在View的数量限制
默认再相机视野范围内并且距离场景中心点最近的30个View才会显示
IsLimit控制是否接受限制,如果等于false不受限制则只要view出现在相机视野范围内就会一直常驻显示
刷新方式1:在鼠标操作场景过程中每500毫秒修改一次View的位置缩放等信息
刷新方式2:再鼠标操作场景结束之后500毫秒修改一次View的位置缩放等信息
默认方式为刷新方式1
View添加到场景中后回默认设置为DefaultScale设置的缩放系数,该缩放系数是前端与美术一起商定的默认显示大小,然后再MinScalePosition与MinScalePosition距离范围内随着相机拉远View自动放大,相机拉近自动缩小,小于MinScalePosition或者大于MinScalePosition不进行缩放控制
View默认显示为Mesh包围盒的正上方10单位的位置,然后以此为原点进行Translate设置的偏移量
Web平台直接修改PELoadWebView指令传入的ViewParam也可以修改面板中的数据源,但是强烈建议都通过PEUpdateData指令去进行修改数据源,因为直接修改会造成如果更新数据源出现bug很难浮现出问题。通过指令修改可以有效追踪数据是如何呗修改的。