案例展示
给模型添加2D元素
<template>
<div style="position: relative">
<div id="TO"></div>
<el-form id="formMarker" ref="formRef" :model="form" label-width="40px">
<el-form-item label="标题:">
<el-input v-model="form.title" size="small" />
</el-form-item>
<el-form-item label="内容:">
<el-input type="textarea" v-model="form.content" size="small" />
</el-form-item>
<el-form-item label="显示:">
<el-switch v-model="form.visible" size="small"></el-switch>
</el-form-item>
<div style="display: flex; justify-content: center">
<el-button type="primary" size="small" @click="updateMarker">确定</el-button>
</div>
</el-form>
</div>
</template>
<script setup lang="ts">
import { onMounted, ref } from 'vue'
import { ElButton, ElInput, ElForm, ElFormItem, ElSwitch } from 'element-plus'
import { merge } from 'lodash-es'
// @ts-ignore
declare const ThingOrigin: any
const form = ref({
title: 'ABB机械臂',
content: 'ABB 机械臂,高精度、强性能的工业好帮手',
visible: true
})
const formRef = ref()
let TO: any = null
let model = null
let markerInfo = {
name: '', //标签列表的标签名称,可选
modelName: 'marker-abb', //标签绑定的模型名称
id: 'marker', //标签id
type: 'text', //标签类型
bg: 'bg1', //标签背景图片
configs: {
//标签配置项
title: form.value.title,
content: form.value.content,
visible: form.value.visible,
html: ''
},
markerName: '', // 标签名称
position: { x: 0, y: 40, z: 0 }, //标签位置
base: {
//标签基础信息
relative: 'model', //标签相对于模型的位置
offset: { x: 0, y: 15, z: 0 }, //标签相对于模型的偏移量
ratio: 1.1, //标签相对于模型的比例
intervalY: 40 //标签之间的间隔距离
},
width: 350, //标签元素宽度(px)
height: 100 //标签元素高度(px)
}
onMounted(() => {
//初始化场景
TO = new ThingOrigin('fileModel', document.getElementById('TO'), {
camera: {
lookAt: {
x: 25.62454680418967,
y: -2.3106037456621856,
z: -66.99965038950995
},
position: {
x: 41.87976418982612,
y: 78.50564268979477,
z: 117.31701183506453
}
}
})
//导入模型
TO.model
.loadModel({
modelName: 'fileModel-abb', //模型名称
base: {
modelUrl: 'https://124.70.30.193:8443/model2/loadFileAsId/56201403' //模型地址
},
modelType: 'gltf' //模型类型
})
.then((model) => {
TO.scene.add(model) //添加模型
addMarker() //添加标记
})
function addMarker() {
//创建HTML
let htmlContent = createHTML(markerInfo)
//找到fileModel-abb模型
model = TO.scene.getObjectByProperty('name', 'fileModel-abb')
//添加标签
const marker = TO.marker.addMarker(model, htmlContent, markerInfo)
//获取标签名称
markerInfo.markerName = marker.name
}
})
//创建HTML
function createHTML(markerInfo) {
//背景图片
const imageUrl = 'https://124.70.30.193:8443/image/load/10'
// 使用模板字符串创建html
const innerHtml = `
<div class="marker-text-title">
${markerInfo.configs.title || '无标题'}
</div>
<div class="marker-text-content">
${markerInfo.configs.content || '无内容'}
</div>
`
// 主HTML结构
const mainHtml = `
<div id="markerDiv" class="marker-container"
style="width:${markerInfo.width}px; height:${markerInfo.height}px; position:relative;">
<img src="${imageUrl}" alt="标记背景" style="width:100%; ">
<div class="marker-innerDiv">
${innerHtml}
</div>
</div>
`
return mainHtml
}
//更新标记
function updateMarker() {
//创建HTML
let newMarkerInfo = merge(markerInfo, {
configs: {
//标签配置项
title: form.value.title,
content: form.value.content,
visible: form.value.visible,
html: ''
}
})
let htmlContent = createHTML(newMarkerInfo)
TO.marker.setMarkerInfo(model.name, newMarkerInfo, htmlContent)
}
</script>
<style>
#TO {
width: 100%;
height: 400px;
position: relative;
}
.marker-innerDiv {
position: absolute;
left: 4%;
right: 6%;
top: 10%;
bottom: 10%;
width: 92%;
height: 80%;
}
.marker-text-title {
font-weight: bold;
text-align: center;
font-size: 15px;
line-height: 30px;
letter-spacing: 2px;
}
.marker-text-content {
line-height: 25px;
font-size: 14px;
text-indent: 2em;
letter-spacing: 1px;
}
</style>
<style scoped>
#formMarker {
position: absolute;
top: 10px;
right: 10px;
min-width: 260px;
box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1);
z-index: 10;
background: rgba(0, 0, 0, 0.6);
color: #fff;
padding: 12px 16px;
border-radius: 4px;
font-size: 12px;
}
#formMarker :deep(.el-form-item__label) {
color: #fff !important;
font-size: 12px;
}
</style>API 介绍
marker.addMarker
| 方法签名 | 返回值 | 描述 |
|---|---|---|
addMarker(model: Object3D | Group, html: string | HTMLElement, markerInfo: markerInfoParams) | Object3D | 给模型添加2D元素 |
参数说明:
| 参数名 | 说明 | 类型 | 必填 | 默认值 |
|---|---|---|---|---|
model | 模型对象 | Object3D | Group | 是 | - |
html | DOM元素内容(HTML字符串或DOM元素) | string | HTMLElement | 是 | - |
markerInfo | 标记信息参数 | markerInfoParam | 是 | - |