Files
23-GXJD-GXJD_TV/src/components/DMT/index.vue

1438 lines
53 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<div>
<div id="viewPort" :style="{height: containerHeight,width: containerWidth}"></div>
<div ref="modelProcess" style="position: absolute;top: 10px;left: 2px;color: white">正在加载模型0%</div>
<div style="display: none">
<audio controls loop id="alarm">
<source src="./libs/alarm.mp3" type="audio/mpeg">
</audio>
<audio controls id="clash">
<source src="./libs/alarm.mp3" type="audio/mpeg">
</audio>
</div>
<div>
<div class="laber_name" id="laber_name">
<div style="text-align: center">{{robotInfo.name}}属性信息</div>
<div style="margin-top: 5px;margin-bottom: 5px">运行速度{{robotInfo.speed}}%</div>
<span>关节数据</span>
<table style="table-layout:fixed;font-size: 14px;border-color: white!important;color: white!important; border-collapse:collapse;" border="1 solid black" width="100%">
<tr style="height: 22px;text-align: center;">
<td colspan="30" rowspan="1">J1</td>
<td colspan="30" rowspan="1">J2</td>
<td colspan="30" rowspan="1">J3</td>
<td colspan="30" rowspan="1">J4</td>
<td colspan="30" rowspan="1">J5</td>
<td colspan="30" rowspan="1">J6</td>
</tr>
<tr style="height: 22px">
<td colspan="30" rowspan="1" style="text-align: center;">{{robotInfo.joint['J1']}}</td>
<td colspan="30" rowspan="1" style="text-align: center;">{{robotInfo.joint['J2']}}</td>
<td colspan="30" rowspan="1" style="text-align: center;">{{robotInfo.joint['J3']}}</td>
<td colspan="30" rowspan="1" style="text-align: center;">{{robotInfo.joint['J4']}}</td>
<td colspan="30" rowspan="1" style="text-align: center;">{{robotInfo.joint['J5']}}</td>
<td colspan="30" rowspan="1" style="text-align: center;">{{robotInfo.joint['J6']}}</td>
</tr>
</table>
<div style="margin-top: 5px">位置信息</div>
<table style="table-layout:fixed;font-size: 14px;border-color: white!important;color: white!important; border-collapse:collapse;" border="1 solid black" width="100%">
<tr style="height: 22px;text-align: center;">
<td colspan="30" rowspan="1">tx</td>
<td colspan="30" rowspan="1">ty</td>
<td colspan="30" rowspan="1">tz</td>
<td colspan="30" rowspan="1">rx</td>
<td colspan="30" rowspan="1">ry</td>
<td colspan="30" rowspan="1">rz</td>
</tr>
<tr style="height: 22px">
<td colspan="30" rowspan="1" style="text-align: center;">{{robotInfo.tcp['tx']}}</td>
<td colspan="30" rowspan="1" style="text-align: center;">{{robotInfo.tcp['ty']}}</td>
<td colspan="30" rowspan="1" style="text-align: center;">{{robotInfo.tcp['tz']}}</td>
<td colspan="30" rowspan="1" style="text-align: center;">{{robotInfo.tcp['rx']}}</td>
<td colspan="30" rowspan="1" style="text-align: center;">{{robotInfo.tcp['ry']}}</td>
<td colspan="30" rowspan="1" style="text-align: center;">{{robotInfo.tcp['rz']}}</td>
</tr>
</table>
<div style="margin-top: 5px">报警信息</div>
<table style="table-layout:fixed;font-size: 14px;border-color: white!important;color: white!important; border-collapse:collapse;" border="1 solid black" width="100%">
<tr style="height: 22px;text-align: center;">
<td colspan="25" rowspan="1">类型</td>
<td colspan="70" rowspan="1">内容</td>
<td colspan="55" rowspan="1">时间</td>
</tr>
<tr style="height: 22px">
<td colspan="25" rowspan="1" style="text-align: center;">{{robotInfo.alarm[0].SeverityMessage}}</td>
<td colspan="70" rowspan="1" style="text-align: center;overflow: hidden; white-space: nowrap; text-overflow: ellipsis;width:100%;">{{robotInfo.alarm[0].AlarmMessage}}</td>
<td colspan="55" rowspan="1" style="text-align: center;">{{robotInfo.alarm[0].Time}}</td>
</tr>
<tr style="height: 22px">
<td colspan="25" rowspan="1" style="text-align: center;">{{robotInfo.alarm[1].SeverityMessage}}</td>
<td colspan="70" rowspan="1" style="text-align: center;overflow: hidden; white-space: nowrap; text-overflow: ellipsis;width:100%;">{{robotInfo.alarm[1].AlarmMessage}}</td>
<td colspan="55" rowspan="1" style="text-align: center;">{{robotInfo.alarm[1].Time}}</td>
</tr>
<tr style="height: 22px">
<td colspan="25" rowspan="1" style="text-align: center;">{{robotInfo.alarm[2].SeverityMessage}}</td>
<td colspan="70" rowspan="1" style="text-align: center;overflow: hidden; white-space: nowrap; text-overflow: ellipsis;width:100%;">{{robotInfo.alarm[2].AlarmMessage}}</td>
<td colspan="55" rowspan="1" style="text-align: center;">{{robotInfo.alarm[2].Time}}</td>
</tr>
</table>
<!-- <div style="width: 300px">{{robotInfo.alarm[0].SeverityMessage}} {{robotInfo.alarm[0].Time}} {{robotInfo.alarm[0].AlarmMessage}} </div>-->
<!-- <div style="width: 300px">{{robotInfo.alarm[1].SeverityMessage}} {{robotInfo.alarm[1].Time}} {{robotInfo.alarm[1].AlarmMessage}} </div>-->
<!-- <div style="width: 300px">{{robotInfo.alarm[2].SeverityMessage}} {{robotInfo.alarm[2].Time}} {{robotInfo.alarm[2].AlarmMessage}} </div>-->
</div>
</div>
<!-- <div class="viewOperationParent" id="viewOperationParent">-->
<!-- <div style="display:inline;text-align: center;background: #074492" id="viewOperationChild">-->
<!-- <div style="text-align: center">-->
<!-- &lt;!&ndash; <el-checkbox v-model="checked" style="margin-right: 5px;color: #fff">设定</el-checkbox>&ndash;&gt;-->
<!-- <el-button v-for="(item, index) in cameraData" :id="'cameraViewBtn' + item.焦点代码" :key=index style="height: 36px;white-space:normal;">{{ item.焦点说明 }}</el-button>-->
<!-- <button id="setView" style="width: 20px;height: 20px;padding: 0;margin: 0;background: transparent;border: none;cursor: pointer;"></button>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<div style="position:absolute; left: 20%;top:10%">
<config-vue></config-vue>
</div>
</div>
</template>
<script>
import configVue from './config.vue'
import * as THREE from 'three'
import axios from 'axios'
import $ from 'jquery'
import { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js'
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'
import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js'
import { TWEEN } from 'three/examples/jsm/libs/tween.module.min.js'
import { CSS2DRenderer, CSS2DObject } from 'three/examples/jsm/renderers/CSS2DRenderer.js'
import { DmtControl } from './libs/DmtControl.js'
import { connect } from './js/websocketConnect.js'
import { connectMqtt } from './js/MqttConnect.js'
import { PlaySoundCommand } from './js/PlaySoundCommand.js'
// eslint-disable-next-line no-unused-vars
const labelRenderer = new CSS2DRenderer()
let pointLabel = null
// eslint-disable-next-line no-unused-vars
let container, clock, scene, camera, axesHelper, renderer, Plane
let modelCount = 0
const editor = {
robotInfo: {
'B3FD789E-E018-4006-91AD-4824830E6557': {
joint: {
'J1': 999.99,
'J2': 999.99,
'J3': 999.99,
'J4': 999.99,
'J5': 999.99,
'J6': 999.99
},
tcp: {
'tx': 999.99,
'ty': 999.99,
'tz': 999.99,
'rx': 999.99,
'ry': 999.99,
'rz': 999.99
},
speed: 100,
alarm: [
{
'AlarmID': 2,
'AlarmNumber': 78,
'CauseAlarmID': 0,
'CauseAlarmNumber': 0,
'Severity': 0,
'Time': '2020-03-12T15:34:18',
'AlarmMessage': 'FILE-078 ラヤカッアクキンヘ?ノ',
'CauseAlarmMessage': '',
'SeverityMessage': 'WARN'
},
{
'AlarmID': 2,
'AlarmNumber': 77,
'CauseAlarmID': 0,
'CauseAlarmNumber': 0,
'Severity': 0,
'Time': '2020-03-12T15:30:12',
'AlarmMessage': 'FILE-077 ラヤカッアクキンソェハシ (FRA:\\)',
'CauseAlarmMessage': '',
'SeverityMessage': 'WARN'
},
{
'AlarmID': 76,
'AlarmNumber': 125,
'CauseAlarmID': 0,
'CauseAlarmNumber': 0,
'Severity': 34,
'Time': '2020-03-12T15:27:06',
'AlarmMessage': 'DNET-125 エモカッヨ眞ャスモマミヨテ: Bd 2',
'CauseAlarmMessage': '',
'SeverityMessage': 'PAUSE.G'
}
]
},
'A769F461-4011-46A4-BBC2-2AFB39EFD9C2': {
joint: {
'J1': 888.88,
'J2': 888.88,
'J3': 888.88,
'J4': 888.88,
'J5': 888.88,
'J6': 888.88
},
tcp: {
'tx': 888.88,
'ty': 888.88,
'tz': 888.88,
'rx': 888.88,
'ry': 888.88,
'rz': 888.88
},
speed: 99,
alarm: [
{
'AlarmID': 2,
'AlarmNumber': 78,
'CauseAlarmID': 0,
'CauseAlarmNumber': 0,
'Severity': 0,
'Time': '2020-03-12T15:34:18',
'AlarmMessage': 'FILE-078 ラヤカッアクキンヘ?ノ',
'CauseAlarmMessage': '',
'SeverityMessage': 'WARN'
},
{
'AlarmID': 2,
'AlarmNumber': 77,
'CauseAlarmID': 0,
'CauseAlarmNumber': 0,
'Severity': 0,
'Time': '2020-03-12T15:30:12',
'AlarmMessage': 'FILE-077 ラヤカッアクキンソェハシ (FRA:\\)',
'CauseAlarmMessage': '',
'SeverityMessage': 'WARN'
},
{
'AlarmID': 76,
'AlarmNumber': 125,
'CauseAlarmID': 0,
'CauseAlarmNumber': 0,
'Severity': 34,
'Time': '2020-03-12T15:27:06',
'AlarmMessage': 'DNET-125 エモカッヨ眞ャスモマミヨテ: Bd 2',
'CauseAlarmMessage': '',
'SeverityMessage': 'PAUSE.G'
}
]
},
'04A6D8F9-7019-4C92-8845-B3CFDDF4A433': {
joint: {
'J1': 777.77,
'J2': 777.77,
'J3': 777.77,
'J4': 777.77,
'J5': 777.77,
'J6': 777.77
},
tcp: {
'tx': 777.77,
'ty': 777.77,
'tz': 777.77,
'rx': 777.77,
'ry': 777.77,
'rz': 777.77
},
speed: 98,
alarm: [
{
'AlarmID': 2,
'AlarmNumber': 78,
'CauseAlarmID': 0,
'CauseAlarmNumber': 0,
'Severity': 0,
'Time': '2020-03-12T15:34:18',
'AlarmMessage': 'FILE-078 ラヤカッアクキンヘ?ノ',
'CauseAlarmMessage': '',
'SeverityMessage': 'WARN'
},
{
'AlarmID': 2,
'AlarmNumber': 77,
'CauseAlarmID': 0,
'CauseAlarmNumber': 0,
'Severity': 0,
'Time': '2020-03-12T15:30:12',
'AlarmMessage': 'FILE-077 ラヤカッアクキンソェハシ (FRA:\\)',
'CauseAlarmMessage': '',
'SeverityMessage': 'WARN'
},
{
'AlarmID': 76,
'AlarmNumber': 125,
'CauseAlarmID': 0,
'CauseAlarmNumber': 0,
'Severity': 34,
'Time': '2020-03-12T15:27:06',
'AlarmMessage': 'DNET-125 エモカッヨ眞ャスモマミヨテ: Bd 2',
'CauseAlarmMessage': '',
'SeverityMessage': 'PAUSE.G'
}
]
},
'B2BF5C42-B6ED-46D8-A7C3-046968D39805': {
joint: {
'J1': 666.66,
'J2': 666.66,
'J3': 666.66,
'J4': 666.66,
'J5': 666.66,
'J6': 666.66
},
tcp: {
'tx': 666.66,
'ty': 666.66,
'tz': 666.66,
'rx': 666.66,
'ry': 666.66,
'rz': 666.66
},
speed: 97,
alarm: [
{
'AlarmID': 2,
'AlarmNumber': 78,
'CauseAlarmID': 0,
'CauseAlarmNumber': 0,
'Severity': 0,
'Time': '2020-03-12T15:34:18',
'AlarmMessage': 'FILE-078 ラヤカッアクキンヘ?ノ',
'CauseAlarmMessage': '',
'SeverityMessage': 'WARN'
},
{
'AlarmID': 2,
'AlarmNumber': 77,
'CauseAlarmID': 0,
'CauseAlarmNumber': 0,
'Severity': 0,
'Time': '2020-03-12T15:30:12',
'AlarmMessage': 'FILE-077 ラヤカッアクキンソェハシ (FRA:\\)',
'CauseAlarmMessage': '',
'SeverityMessage': 'WARN'
},
{
'AlarmID': 76,
'AlarmNumber': 125,
'CauseAlarmID': 0,
'CauseAlarmNumber': 0,
'Severity': 34,
'Time': '2020-03-12T15:27:06',
'AlarmMessage': 'DNET-125 エモカッヨ眞ャスモマミヨテ: Bd 2',
'CauseAlarmMessage': '',
'SeverityMessage': 'PAUSE.G'
}
]
}
},
showTagList: [{
title: '工件QY16KC',
ModelId: 'A113AD62-9CE7-4ACF-8D0C-8E8A597A8768',
object: null
}],
ip: '',
WeldLight1: '',
WeldLightVisible1: false,
WeldLight2: '',
WeldLightVisible2: false,
scene: null,
objectIdUUidMap: new Map(),
opname: '',
connectType: 1,
BSport: '',
IsAllowConnect: true,
service: axios.create({
baseURL: './submit/MESCommonBase.ashx',
timeout: 1500000 // 请求超时时间
}),
selected: null,
socket: null,
mqttClient: {
connected: false
},
ProjectCode: null,
sceneConfig: null,
resourcesTree: null,
attachments: null,
resources: null,
cameraState: null,
cameraStateAll: [],
isOk: false,
objectIdSet: new Map(),
animOperations: null,
CraftList: {},
moveTrigger: null,
camera: null,
cameraPosition: 10,
currentButton: 1,
cameraControls: null,
TagActList: {}, // 存放tag对应的类型
worker: {}, // 播放工艺的线程
RotationWorker: {}, // 自传工艺的线程
ModelRotateWorker: {}, // 自传工艺的的状态数据
rotateSpeed: 5 * Math.PI / 180,
getObjectById: null, // 方法 根据ModelId获取模型
solveAttachModel: null, // 方法 处理attach问题
removeObject: null, // 方法 移除模型
setModelWireFrame: null, // 方法 设置线框
setTransparent: null, // 方法 设置透明
showMessage: null, // 方法 显示消息
playSoundCommand: new PlaySoundCommand(), // 方法 警告
attachList: new Map(), // 记录attach列表
objMaterial: new Map(),
WareHouseList: [],
WareHouse: new Map(), // 立库库存表
WareHouseBasicModel: new Map(), // 立库库存基础 零件模型需要命名为warehousepart1-100 立库定位模型需要命名为warehouse1000-1009
ProtocolIdentifiers: {
Robot_7: 'Robot_7',
Device_3: 'Device_3',
Agv_3: 'Agv_3',
Device_1: 'Device_1',
FirstPosition: 'FirstPosition',
WareHousePart: 'WareHousePart',
Robot_6: 'Robot_6',
RobotTcp: 'RobotTcp',
DrawPath: 'DrawPath',
ReLoadData: 'ReLoadData',
PlayAct: 'PlayAct',
CraftCurrOperation: 'CraftCurrOperation',
Position: 'Position',
Select: 'Select',
DragMove: 'DragMove',
ModelTransparent: 'ModelTransparent',
Visible: 'Visible',
Frames: 'Frames',
ModelRotation: 'ModelRotation',
GoHome: 'GoHome',
GetJointAxisInfo: 'GetJointAxisInfo',
GetDeviceBaseTool: 'GetDeviceBaseTool',
GetJointValue: 'GetJointValue',
C_B_ImportModel: 'C_B_ImportModel',
SendURDF: 'SendURDF',
SendDeviceJson: 'SendDeviceJson',
GetDeviceJson: 'GetDeviceJson',
SendMotionInfo: 'SendMotionInfo',
C_B_ImportLayout: 'C_B_ImportLayout',
GetPoseLocation: 'GetPoseLocation',
C_B_SetProjectCode: 'C_B_SetProjectCode',
C_B_TagIDTrigger: 'C_B_TagIDTrigger',
C_B_ReLoad_TagIDHandler: 'C_B_ReLoad_TagIDHandler',
C_B_SetCurrSignalList: 'C_B_SetCurrSignalList',
SendClearModelInfo: 'SendClearModelInfo',
C_B_SaveProjectSimulationData: 'C_B_SaveProjectSimulationData',
C_B_GetProjectSimulationData: 'C_B_GetProjectSimulationData',
C_B_KinematicsEditing: 'C_B_KinematicsEditing',
C_B_SaveModel: 'C_B_SaveModel',
C_B_ObjectAlarm: 'C_B_ObjectAlarm',
C_B_JointMoveTo: 'C_B_JointMoveTo',
JointMoveTo: 'JointMoveTo' // DT|JointMoveTo|modelCode|{"J1":"1","J2":"2","J3":"3","J4":"4","J5":"5","J6":"6","J7":"7","J8":"8","J9":"9"}
},
craftPlaySolveType: {
visible: 'visible',
rotation: 'rotation',
craft: 'craft',
signalwrite: 'signalwrite',
wait: 'wait',
FrameData: 'FrameData',
attach: 'attach',
warning: 'warning'
},
FrameOperation: {
playCraft: true,
visibleObject: true,
rotationObject: true,
writeSignal: true,
waitSignal: true,
attach: true,
warning: true
},
signalSolveType: {
visible: 'visible',
rotation: 'rotation',
craft: 'craft',
targetLocation: 'targetlocation',
attach: 'attach',
warning: 'warning'
}
}
// eslint-disable-next-line no-unused-vars
let ModelListTransParentList = []
const ModelList = []
const ModelListId = []
// eslint-disable-next-line no-unused-vars
const timer = null
// eslint-disable-next-line no-unused-vars
const lastIntersectModel = null
// eslint-disable-next-line no-unused-vars
const onUpPosition = new THREE.Vector2()
var raycaster = new THREE.Raycaster()
var mouse = new THREE.Vector2()
window.editor = editor
export default {
components: {
'configVue': configVue
},
name: 'DMT',
props: {
containerHeight: String,
containerWidth: String
},
data() {
return {
checked: false,
cameraData: [],
object: null,
s: null,
robotInfo: {
id: '',
joint: {
'J1': 999.99,
'J2': 999.99,
'J3': 999.99,
'J4': 999.99,
'J5': 999.99,
'J6': 999.99
},
tcp: {
'tx': 999.99,
'ty': 999.99,
'tz': 999.99,
'rx': 999.99,
'ry': 999.99,
'rz': 999.99
},
speed: 100,
alarm: [
{
'AlarmID': 2,
'AlarmNumber': 78,
'CauseAlarmID': 0,
'CauseAlarmNumber': 0,
'Severity': 0,
'Time': '',
'AlarmMessage': '',
'CauseAlarmMessage': '',
'SeverityMessage': ''
},
{
'AlarmID': 2,
'AlarmNumber': 77,
'CauseAlarmID': 0,
'CauseAlarmNumber': 0,
'Severity': 0,
'Time': '',
'AlarmMessage': '',
'CauseAlarmMessage': '',
'SeverityMessage': 'WARN'
},
{
'AlarmID': 76,
'AlarmNumber': 125,
'CauseAlarmID': 0,
'CauseAlarmNumber': 0,
'Severity': 34,
'Time': '2020-03-12T15:27:06',
'AlarmMessage': 'DNET-125 エモカッヨ眞ャスモマミヨテ: Bd 2',
'CauseAlarmMessage': '',
'SeverityMessage': 'PAUSE.G'
}
],
name: ''
}
}
},
mounted() {
const scope = this
editor.objectIdSet = new Map()
editor.objMaterial = new Map()
editor.attachList = new Map()
if (pointLabel) {
scene.remove(pointLabel)
}
this.getConfig().then(res => {
if (Object.hasOwnProperty.call(res, 'robotList')) {
editor.robotList = res.robotList
}
if (Object.hasOwnProperty.call(res, 'WareHouseList')) {
editor.WareHouseList = res.WareHouseList
}
if (Object.hasOwnProperty.call(res, 'transParentList')) {
ModelListTransParentList = res.transParentList
}
if (Object.hasOwnProperty.call(res, 'connectType')) {
editor.connectType = res.connectType
}
editor.mqttHost = res.MQTTHost
editor.mqttPort = res.MQTTPort
editor.ip = res.webSocketIp
editor.opname = res.webSocketOpName
editor.BSport = res.webSocketBSport
editor.rootIp = res.NodeRootIp
this.getProjectConfig()
})
editor.showMessage = function(message, type, time = 2000) {
scope.$message({
message: message,
type: type,
duration: time,
center: true
})
}
console.log(1)
// window.updateLabelInfoJoint = this.updateLabelInfoJoint
},
created() {
},
methods: {
getConfig() {
return new Promise((resolve, reject) => {
axios.get('./DMT_WEB/config/config.json').then(res => {
const configData = res.data
resolve(configData)
}).catch(err => {
reject(err)
})
})
},
/**
* 获取项目配置文件,用于初始隐藏模型
*/
getProjectConfig() {
const P1 = new Promise(function(resolve, reject) {
axios({
method: 'get',
url: './DMT_WEB/models/DTDATA.json'
}).then((res) => {
editor.animOperations = {}
editor.moveTrigger = {}
res.data.forEach(n => {
Object.keys(n).forEach(function(key) {
/**
* 获取播放数据并解析数据
*/
if (key === 'OperationTree') {
n[key].forEach(CraftData => {
editor.CraftList[CraftData.CraftCode] = {}
editor.CraftList[CraftData.CraftCode]['CraftName'] = CraftData.CraftName
editor.CraftList[CraftData.CraftCode]['Varieties'] = CraftData.Varieties
editor.CraftList[CraftData.CraftCode]['CurrPlay'] = CraftData.CurrPlay
if (CraftData.CraftPlayData === '' || CraftData.CraftPlayData === null || CraftData.CraftPlayData.length < 2) {
editor.animOperations[CraftData.CraftCode] = ''
} else {
editor.animOperations[CraftData.CraftCode] = JSON.parse(CraftData.CraftPlayData)
}
editor.moveTrigger[CraftData.CraftCode] = {
moveStatus: 0,
myVarSetInterval: null,
doAnimation: false,
currentFrame: 0,
pausedFrame: 0,
animOperations: editor.animOperations[CraftData.CraftCode],
simPaceTime: 20,
moveStatusPosition: 0
}
})
}
/**
* HandlerType: 1:显隐,2:自转,3行为
* HandlerCode: 模型或者工艺代码
* HandlerValue: 显隐0/1 ,自传:正负转速&axis,行为暂停播放0/1
* TagValue:信号值
*/
if (key === 'TagTriggerHandler') {
n[key].forEach(TagActListValue => {
if (editor.TagActList[TagActListValue.TagID]) {
editor.TagActList[TagActListValue.TagID].push({
HandlerType: TagActListValue.HandlerType,
HandlerCode: TagActListValue.HandlerCode,
HandlerValue: TagActListValue.HandlerValue,
TagValue: TagActListValue.TagValue,
JointType: TagActListValue.JointType,
Axis: TagActListValue.Axis,
Flip: TagActListValue.Flip,
Value: TagActListValue.Value,
ValueFactor: TagActListValue.ValueFactor
})
} else {
editor.TagActList[TagActListValue.TagID] = []
editor.TagActList[TagActListValue.TagID].push({
HandlerType: TagActListValue.HandlerType,
HandlerCode: TagActListValue.HandlerCode,
HandlerValue: TagActListValue.HandlerValue,
TagValue: TagActListValue.TagValue,
JointType: TagActListValue.JointType,
Axis: TagActListValue.Axis,
Flip: TagActListValue.Flip,
Value: TagActListValue.Value,
ValueFactor: TagActListValue.ValueFactor
})
}
})
}
})
})
resolve(1)
})
})
const P2 = new Promise(function(resolve, reject) {
axios({
method: 'get',
url: './DMT_WEB/models/RobotPlan_Process.json'
}).then((res) => {
editor.sceneConfig = res.data.sceneConfig // 场景配置
editor.attachments = res.data.attachments // 附加物体
editor.resources = res.data.resources // 场景模型资源
editor.resourcesTree = res.data.resourcesTree // 模型树
editor.cameraState = res.data.cameraState // 场景相机位置
editor.ProjectCode = res.data.ProjectCode // 项目代码
editor.resourcesTree.forEach(res => {
if (res.treeType === 'OriginModel') {
ModelList.push(res.name)
}
})
editor.resources.forEach(res => {
editor.objectIdUUidMap.set(res.id, res)
})
editor.attachments.forEach(res => {
editor.attachList.set(res.RootId, res.attachList)
})
resolve(1)
}).catch((error) => { console.log(error) })
})
Promise.all([P1, P2]).then(res => {
this.init()
// this.getCameraData()
})
},
/**
* 设定模型初始状态
*/
setModelSates() {
// 模型的显示隐藏
editor.resourcesTree.forEach(res => {
if (res.visible === '0') {
if (editor.getObjectById(res.id)) {
editor.getObjectById(res.id).visible = !!(parseInt(res.visible))
}
}
})
const treeRes = editor.resourcesTree
for (const treeResValue of treeRes) {
if (treeResValue.treeType !== 'folder') {
const currentModel = editor.getObjectById(treeResValue.id)
if (Object.hasOwnProperty.call(treeResValue, 'WireFrame') && treeResValue.WireFrame) {
editor.setModelWireFrame(currentModel, true)
}
if (Object.hasOwnProperty.call(treeResValue, 'transParent') && treeResValue.transParent) {
editor.setTransparent(treeResValue.id, 0.3)
}
if (currentModel) currentModel.visible = !!parseInt(treeResValue.visible)
}
}
},
/**
* 设定场景初始状态
* @param type
*/
setSceneStates(type) {
switch (type) {
case '0':
scene.background = new THREE.Color('#dcdcdc')
break
case '1':
scene.background = new THREE.Color(editor.sceneConfig.RenderColorModel.color)
break
case '2':
if (editor.sceneConfig.RenderColorModel.image === '') {
editor.scene.background = new THREE.Color(editor.sceneConfig.RenderColorModel.color)
return
}
new THREE.TextureLoader().load(editor.sceneConfig.RenderColorModel.image === '', function(texture) {
scene.background = texture
texture.dispose()
})
break
default:
scene.background = new THREE.Color('#dcdcdc')
break
}
},
/**
* 初始化场景信息
*/
init() {
const scope = this
container = document.getElementById('viewPort')
clock = new THREE.Clock()
scene = new THREE.Scene()
editor.scene = scene
const width = container.clientWidth
const height = container.clientHeight
const k = width / height
const s = 100
camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 0, 2000)
camera.position.set(editor.cameraPosition, editor.cameraPosition, editor.cameraPosition)
camera.lookAt(scene.position)
camera.up.x = 0
camera.up.y = 0
camera.up.z = 1
scene.add(camera)
editor.camera = camera
axesHelper = new THREE.AxesHelper(1)
scene.add(axesHelper)
renderer = new THREE.WebGLRenderer({ antialias: true })
renderer.setPixelRatio(window.devicePixelRatio)
renderer.setSize(container.clientWidth, container.clientHeight)
renderer.setClearColor(0x666666, 0)
renderer.toneMapping = THREE.ACESFilmicToneMapping
renderer.toneMappingExposure = 0.8
renderer.shadowMap.enabled = true
renderer.hadowMapEnabled = true
renderer.shadowMap.type = THREE.PCFSoftShadowMap
renderer.outputEncoding = THREE.sRGBEncoding
renderer.textureEncoding = THREE.sRGBEncoding
editor.WeldLight1 = this.drawWeldLight()
editor.WeldLight2 = this.drawWeldLight()
const pmremGenerator = new THREE.PMREMGenerator(renderer)
pmremGenerator.compileEquirectangularShader()
const loader = new GLTFLoader().setPath('./DMT_WEB/models/')
const dracoLoader = new DRACOLoader()
new RGBELoader().setDataType(THREE.FloatType)
.load('./DMT_WEB/assets/venice_sunset_1k.hdr', function(texture) {
const envMap = pmremGenerator.fromEquirectangular(texture).texture
scene.environment = envMap
scene.background = new THREE.Color('#081f48')
texture.dispose()
pmremGenerator.dispose()
})
this.setSceneStates(editor.sceneConfig.RenderColorModel.model)
dracoLoader.setDecoderPath('./DMT_WEB/draco/')
loader.setDRACOLoader(dracoLoader)
this.createLabel()
editor.getObjectById = function(ModelId) {
let currentModel = null
const currentModelData = editor.objectIdSet.get(ModelId)
if (currentModelData) currentModel = currentModelData.object
return currentModel
}
editor.solveAttachModel = function(ModelId, attach = true) {
const attachList = editor.attachList
attachList.forEach(function(value, key) {
const RootModel = editor.getObjectById(key)
if (RootModel) {
for (const attachData of value) {
const attachModel = editor.getObjectById(attachData.ModelId)
let parentObject = null
attachData['ParentId'] ? parentObject = editor.getObjectById(attachData.ParentId) : parentObject = editor.scene
if (attachModel && parentObject) {
if (attach) {
RootModel.attach(attachModel)
} else {
parentObject.attach(attachModel)
}
}
}
}
})
}
editor.removeObject = function(object) {
if (object === null) return
if (object.parent === null) return
object.parent.remove(object)
}
/**
* 设置模型线框
* @param currentObject
* @param WireframeValue
*/
editor.setModelWireFrame = function(currentObject, WireframeValue) {
currentObject.traverse(obj => {
if (obj instanceof THREE.Mesh) {
obj.material = editor.objMaterial.get(obj.id).clone()
obj.material['wireframe'] = WireframeValue
obj.material.needsUpdate = true
}
})
}
/**
* 模型透明
* @param ModelId
* @param Opacity 透明度
*/
editor.setTransparent = function(ModelId, Opacity = 0.3) {
new Promise((resolve, reject) => {
const TransModel = editor.getObjectById(ModelId)
if (!TransModel) {
console.warn('模型不存在setTransparent')
reject(false)
} else {
TransModel.traverse(obj => {
if (obj.material) {
const material_yuan = editor.objMaterial.get(obj.id).clone()
obj.material = material_yuan
if (Opacity !== 1) {
obj.material = new THREE.MeshStandardMaterial({
color: material_yuan.color,
side: 2,
transparent: true,
opacity: Opacity
})
}
}
})
resolve(true)
}
})
}
container.appendChild(renderer.domElement)
// container.addEventListener('mousemove', this.onMouseMove, false)
container.addEventListener('dblclick', this.ondblclick, false)
editor.cameraControls = new DmtControl(editor.camera, renderer.domElement)
editor.cameraControls.listenToKeyEvents(window) // optional
editor.cameraControls.update()
// Viewer(editor)
const light1 = new THREE.AmbientLight(new THREE.Color('#ffffff'), 1)
light1.name = 'ambient_light'
editor.cameraControls.object.add(light1)
const light2 = new THREE.DirectionalLight(new THREE.Color('#ffffff'), 1)
light2.position.set(0.5, 0, 0.866) // ~60º
light2.name = 'main_light'
editor.cameraControls.object.add(light2)
// document.getElementById('orientCubeWrapperDiv').style.display = 'none'
window.addEventListener('resize', this.onWindowResize, false)
const encoding = THREE.sRGBEncoding
editor.cameraControls.resetState(editor.cameraState.target, editor.cameraState.position, editor.cameraState.zoom0)
// 加载立库的特殊写法
for (let i = 0; i < editor.WareHouseList.length; i++) {
loader.load('wh/' + editor.WareHouseList[i] + '.glb', (result) => {
const scene = result.scene.children[0]
scene.traverse(child => {
if (child['material']) {
const nm = new THREE.MeshPhysicalMaterial({
metalness: 1.0, roughness: 0.5, clearcoat: 1, clearcoatRoughness: 0, side: 2, emissive: new THREE.Color(0, 0, 0), flatShading: false
})
child['material'].map ? nm.map = child['material'].map.clone() : nm.map = null
nm.color = child['material'].color.clone()
child.material = nm
}
})
const modelInfo = scene
// 立库定位点
if (scene.name.indexOf('part') === -1) {
scene.traverse(child => {
modelInfo[child.name] = child
})
editor.scene.add(scene)
}
editor.WareHouseBasicModel.set(scene.name, modelInfo)
result = null
}, (xhr) => {
}, (error) => {
console.log(error.toString())
})
}
// 加载模型
modelCount = 0
for (let i = 0; i < ModelList.length; i++) {
loader.load(ModelList[i] + '.glb', function(gltf) {
const currentModel = gltf.scene.children[0]
if (currentModel.name === 'Plane') {
Plane = currentModel
}
currentModel.traverse(child => {
if (child['material']) {
child['material'].metalness = 1
if (child['material'].map) child['material'].map.encoding = encoding
if (child['material'].emissiveMap) child['material'].emissiveMap.encoding = encoding
if (child['material'].map || child['material'].emissiveMap) child['material'].needsUpdate = true
editor.objMaterial.set(child.id, child['material'])
}
})
scene.add(currentModel)
scope.setObjectByConfig(currentModel)
ModelListId.push(gltf.scene.id)
modelCount += 1
scope.$refs.modelProcess.innerText = '正在加载模型' + (modelCount / ModelList.length * 100).toFixed(2) + '%'
if (modelCount === ModelList.length) {
scope.$refs.modelProcess.style.display = 'none'
modelCount = 0
scope.lookObject(scene)
scope.setModelSates()
scope.connectService()
}
}, (xhr) => {
// eslint-disable-next-line handle-callback-err
}, (error) => {
modelCount += 1
console.log(`加载模型${ModelList[i].ModelName}出错!`)
if (modelCount === ModelList.length) {
modelCount = 0
scope.$refs.modelProcess.style.display = 'none'
scope.lookObject(scene)
scope.setModelSates()
scope.connectService()
}
})
}
this.animate()
pointLabel = new CSS2DObject($('#laber_name')[0])
pointLabel.visible = false
scene.add(pointLabel)
},
/**
* 自适应窗口尺寸
*/
onWindowResize() {
renderer.setSize(container.clientWidth, container.clientHeight)
const s = 100; const k = container.clientWidth / container.clientHeight // 窗口宽高比
camera.left = -s * k
camera.right = s * k
camera.top = s
camera.bottom = -s
camera.updateProjectionMatrix()
this.render()
},
/**
* 根据有配置文件设置模型初始化属性
* @param object
*/
setObjectByConfig(object) {
const objectId = object.userData['ModelId']
const objectResource = editor.objectIdUUidMap.get(objectId)
if (objectResource) {
object.position.copy(
new THREE.Vector3(parseFloat(objectResource.location.position.x),
parseFloat(objectResource.location.position.y),
parseFloat(objectResource.location.position.z)
))
object.quaternion.copy(
new THREE.Quaternion(parseFloat(objectResource.location.quaternion.x),
parseFloat(objectResource.location.quaternion.y),
parseFloat(objectResource.location.quaternion.z),
parseFloat(objectResource.location.quaternion.w)
))
object.visible = Boolean(parseInt(objectResource.visible))
}
},
/**
* 渲染
*/
animate() {
// const delta = clock.getDelta()
this.render()
// editor.cameraControls.update(delta)
requestAnimationFrame(this.animate)
// viewCubeUpdate()
TWEEN.update()
// if (editor.WeldLightVisible1) {
// editor.WeldLight1.visible = !editor.WeldLight1.visible
// } else {
// editor.WeldLight1.visible = false
// }
// if (editor.WeldLightVisible2) {
// editor.WeldLight2.visible = !editor.WeldLight2.visible
// } else {
// editor.WeldLight2.visible = false
// }
// if (editor.isOk) {
// updateTag()
// }
},
/**
* 渲染
*/
render() {
renderer.render(scene, camera)
// this.sendCameraState(camera.zoom < 200)
this.updatePosition(editor.selected)
labelRenderer.render(scene, camera)
},
connectService() {
switch (editor.connectType) {
case 1:
connect(editor)
break
case 2:
connectMqtt(editor)
break
default:
break
}
},
drawWeldLight() {
const geometry = new THREE.BufferGeometry()
const vertices = []
const textureLoader = new THREE.TextureLoader()
const sprite1 = textureLoader.load('./css/lensflare0.png')
const x = 0
const y = 0.3
const z = -0.07
const materials = []
vertices.push(x, y, z)
geometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3))
const parameters = [
[[1.0, 1, 1], sprite1, 50]
]
const sprite = parameters[ 0 ][ 1 ]
const size = parameters[ 0 ][ 2 ]
materials[ 0 ] = new THREE.PointsMaterial({ size: size, map: sprite, blending: THREE.AdditiveBlending, depthTest: false, transparent: true })
return new THREE.Points(geometry, materials[0])
},
/**
* 解析模型
* @param object
*/
lookObject(object) {
object.traverse(function(child) {
if (!child) return
// 避免modelId重复
if (Object.hasOwnProperty.call(child.userData, 'ModelId')) {
if (editor.objectIdSet.has(child.userData['ModelId'])) {
child.userData['ModelId'] = child.uuid
editor.objectIdSet.set(child.uuid, {
ModelId: child.id,
Name: child.name,
position: JSON.parse(JSON.stringify(child.position)),
rotation: JSON.parse(JSON.stringify(child.rotation)),
quaternion: JSON.parse(JSON.stringify(child.quaternion)),
object: child,
matrix: child.matrix.clone(),
lastValue: null
})
} else {
editor.objectIdSet.set(child.userData['ModelId'], {
ModelId: child.id,
Name: child.name,
position: JSON.parse(JSON.stringify(child.position)),
rotation: JSON.parse(JSON.stringify(child.rotation)),
quaternion: JSON.parse(JSON.stringify(child.quaternion)),
object: child,
matrix: child.matrix.clone(),
lastValue: null
})
}
}
// if (child.userData.ModelId === '6AC86FB2-8535-459E-A746-D07FEC405097') {
// child.add(editor.WeldLight1)
// }
// if (child.userData.ModelId === '13AD3544-38DD-4C03-9928-2F67D15B1265') {
// child.add(editor.WeldLight2)
// }
// if (child.userData.ModelId === '6E90DC77-8E67-46CF-8B70-319D62E748E3') {
// part1 = child
// }
// if (child.userData.ModelId === '2ED26E76-CD2C-4325-8DBA-7B54D9A4B81D') {
// part2 = child
// }
})
for (const robotListInfo in editor.robotList) {
for (const info of editor.robotList[robotListInfo]) {
info.object = editor.getObjectById(info.ModelId)
info.matrix = info.object ? info.object.matrix.clone() : null
info.lastValue = null
}
}
// for (const TagList of editor.showTagList) {
// TagList.object = editor.getObjectById(TagList.ModelId)
// $(document.body).append(`
// <div style="position:fixed;z-index: 99;display:none;height: 50px;background-color:transparent;font-size: 30px;line-height: 50px;color: #9eff00;font-weight:bolder;border: 1px solid #9eff00 " id="tag${TagList.ModelId}">
// </div>
// `)
// }
},
/**
* 获取预置焦点
*/
getCameraData() {
var param = []
param[0] = ['ProjectCode', editor.ProjectCode]
var Data = this.CreateData('3', 'select * from dbo.[基础数据_焦点预置]', param)
this.ExecDatabase(Data).then(response => {
this.cameraData = response.data
// this.setViewCamera()
})
},
/**
* 点击后 到达预置焦点
*/
setViewCamera() {
if (this.cameraData.length === 0) return
const scope = this
const viewOperation = document.getElementById('viewOperationParent')
const viewOperationChild = document.getElementById('viewOperationChild')
viewOperation.onmouseover = function() {
viewOperationChild.style.display = 'block'
}
viewOperation.onmouseout = function() {
viewOperationChild.style.display = 'none'
}
setTimeout(() => {
for (const info of this.cameraData) {
$('#cameraViewBtn' + info.焦点代码).on('click', function(e) {
const data = JSON.parse(info.焦点位置)
const target = data.target
const position = data.position
const zoom0 = data.zoom0
const id = info.焦点代码
$('#cameraViewBtn' + info.焦点代码).css({ 'background': '#00893d', 'color': '#fff' })
editor.cameraControls.resetState(target, position, zoom0)
for (const infoColor of scope.cameraData) {
if (id !== infoColor.焦点代码) {
$('#cameraViewBtn' + infoColor.焦点代码).css({ 'background': '#fff', 'color': '#606266' })
}
}
})
}
}, 1000)
},
getMousePosition(dom, x, y) {
const rect = dom.getBoundingClientRect()
return [(x - rect.left) / rect.width, (y - rect.top) / rect.height]
},
ondblclick(event) {
const array = this.getMousePosition(container, event.clientX, event.clientY)
onUpPosition.fromArray(array)
let intersects = this.getIntersects(onUpPosition, editor.scene.children)
intersects = intersects.filter(res => {
return res.object.visible
})
if (intersects.length > 0) {
const rootObjId = intersects[0].object.userData['RootId']
editor.selected = editor.getObjectById(rootObjId)
this.sendClickModel(editor.selected)
} else {
editor.selected = null
this.sendClickModel(null)
}
},
onMouseMove(event) {
// const array = this.getMousePosition(container, event.clientX, event.clientY)
// onUpPosition.fromArray(array)
// if (!timer) {
// timer = setTimeout(() => {
// let intersects = this.getIntersects(onUpPosition, editor.scene.children)
// intersects = intersects.filter(res => {
// return res.object.visible
// })
// if (intersects.length > 0) {
// if (lastIntersectModel !== intersects[0]) {
// if (['6E90DC77-8E67-46CF-8B70-319D62E748E3', '2ED26E76-CD2C-4325-8DBA-7B54D9A4B81D'].indexOf(intersects[0].object.userData['ModelId']) !== -1) {
// const rootObjId = intersects[0].object.userData['RootId']
// editor.selected = editor.getObjectById(rootObjId)
// } else {
// editor.selected = null
// }
// }
// } else {
// editor.selected = null
// }
// clearTimeout(timer)
// timer = null
// }, 200)
// }
// updateTag(editor.selected, 'showText')
// updateTag(part2, 'showText2')
},
getIntersects(point, objects) {
mouse.set((point.x * 2) - 1, -(point.y * 2) + 1)
raycaster.setFromCamera(mouse, camera)
return raycaster.intersectObjects(objects, true)
},
sendCameraState(state) {
this.$emit('changeCameraState', state)// 自定义事件 传递值“子向父组件传值”
},
sendClickModel(object) {
if (object) {
this.createLabelObj(object.userData.name, object.position, object)
} else {
this.createLabelObj(null, null, null)
}
// let position = {
// left: 0,
// top: 0
// }
// if (object) {
// const targetPosition = object.getWorldPosition(new THREE.Vector3()).clone().project(camera)
// const halfWidth = window.innerWidth / 2
// const halfHeight = window.innerHeight / 2
// position = {
// left: targetPosition.x * halfWidth + halfWidth - 200,
// top: -targetPosition.y * halfHeight + halfHeight - 500
// }
// }
// this.$emit('clickModel', object, position)// 自定义事件 传递值“子向父组件传值”
},
updatePosition() {
if (editor.selected) {
const targetPosition = editor.selected.getWorldPosition(new THREE.Vector3()).clone().project(camera)
const halfWidth = window.innerWidth / 2
const halfHeight = window.innerHeight / 2
const position = {
left: targetPosition.x * halfWidth + halfWidth - 200,
top: -targetPosition.y * halfHeight + halfHeight - 500
}
this.$emit('clickModel', editor.selected, position)// 自定义事件 传递值“子向父组件传值”
}
},
createLabel() {
labelRenderer.setSize(container.clientWidth, container.clientHeight)
labelRenderer.domElement.style.position = 'absolute'
labelRenderer.domElement.style.top = '100px'
document.body.appendChild(labelRenderer.domElement)
labelRenderer.domElement.style.pointerEvents = 'none'
},
createLabelObj(text, vector, object) {
// if (pointLabel) {
//
// // scene.remove(pointLabel)
// }
if (!object) {
pointLabel.visible = false
return
}
const ModelId = object.userData.ModelId
if (!editor.robotInfo[ModelId]) {
pointLabel.visible = false
return
}
this.robotInfo.name = text
this.robotInfo.id = ModelId
this.robotInfo['joint'] = editor.robotInfo[ModelId]['joint']
// pointLabel = null
// const dom = `
// <div class="laber_name" id="laber_name">
// <div style="text-align: center">${text}属性信息</div>
// <div>速度:${info.speed}%</div>
// <span>轴数据:</span>
// <table style="table-layout:fixed;font-size: 14px;border-color: white!important;color: white!important; border-collapse:collapse;" border="1 solid black" width="100%">
// <tr style="height: 22px;text-align: center;">
// <td colspan="30" rowspan="1">J1</td>
// <td colspan="30" rowspan="1">J2</td>
// <td colspan="30" rowspan="1">J3</td>
// <td colspan="30" rowspan="1">J4</td>
// <td colspan="30" rowspan="1">J5</td>
// <td colspan="30" rowspan="1">J6</td>
// </tr>
// <tr style="height: 22px">
// <td colspan="30" rowspan="1" style="text-align: center;">${info.joint['J1']}</td>
// <td colspan="30" rowspan="1" style="text-align: center;">${info.joint['J2']}</td>
// <td colspan="30" rowspan="1" style="text-align: center;">${info.joint['J3']}</td>
// <td colspan="30" rowspan="1" style="text-align: center;">${info.joint['J4']}</td>
// <td colspan="30" rowspan="1" style="text-align: center;">${info.joint['J5']}</td>
// <td colspan="30" rowspan="1" style="text-align: center;">${info.joint['J6']}</td>
// </tr>
// </table>
// <div>位置信息:</div>
// <table style="table-layout:fixed;font-size: 14px;border-color: white!important;color: white!important; border-collapse:collapse;" border="1 solid black" width="100%">
// <tr style="height: 22px;text-align: center;">
// <td colspan="30" rowspan="1">tx</td>
// <td colspan="30" rowspan="1">ty</td>
// <td colspan="30" rowspan="1">tz</td>
// <td colspan="30" rowspan="1">rx</td>
// <td colspan="30" rowspan="1">ry</td>
// <td colspan="30" rowspan="1">rz</td>
// </tr>
// <tr style="height: 22px">
// <td colspan="30" rowspan="1" style="text-align: center;">${info.tcp['tx']}</td>
// <td colspan="30" rowspan="1" style="text-align: center;">${info.tcp['ty']}</td>
// <td colspan="30" rowspan="1" style="text-align: center;">${info.tcp['tz']}</td>
// <td colspan="30" rowspan="1" style="text-align: center;">${info.tcp['rx']}</td>
// <td colspan="30" rowspan="1" style="text-align: center;">${info.tcp['ry']}</td>
// <td colspan="30" rowspan="1" style="text-align: center;">${info.tcp['rz']}</td>
// </tr>
// </table>
// </div>
//
// `
// $('laber_name').empty()
// $('body').append(dom)// 创建div容器
pointLabel.visible = true
pointLabel.position.set(vector.x, vector.y, vector.z)
},
updateLabelInfoJoint(ModelId, robotData) {
for (const robotDatum of Object.keys(robotData)) {
editor.robotInfo[ModelId]['joint'][robotDatum] = robotData[robotDatum]
if (this.robotInfo.id === ModelId) {
this.robotInfo['joint'][robotDatum] = robotData[robotDatum]
}
}
// if (this.robotInfo.id === ModelId) {
// console.log(robotData)
// for (const robotDatum of Object.keys(robotData)) {
// this.robotInfo['joint'][robotDatum] = robotData[robotDatum]
// }
// }
},
updateLabelInfoSpeedPose(ModelId, tcpData, speedData, alarmInfo) {
for (const robotDatum of Object.keys(tcpData)) {
editor.robotInfo[ModelId]['tcp'][robotDatum] = tcpData[robotDatum]
if (this.robotInfo.id === ModelId) {
this.robotInfo['tcp'][robotDatum] = tcpData[robotDatum]
}
}
editor.robotInfo[ModelId]['speed'] = speedData
editor.robotInfo[ModelId]['alarm'] = alarmInfo
if (this.robotInfo.id === ModelId) {
this.robotInfo['speed'] = speedData
this.robotInfo['alarm'] = alarmInfo
}
}
}
}
</script>
<style scoped>
.viewOperationParent {
position:fixed;
bottom: 0;
right:0;
background-color: transparent;
height: 100px;
width: 1920px;
z-index: 99999;
text-align: center;
}
</style>
<style>
.laber_name{
padding: 10px;
background-image: url("./libs/bgc.png");background-repeat:no-repeat; background-size:100% 100%;-moz-background-size:100% 100%;
border-radius: 10px;
width: 420px;
height: 300px;
color: white;
display: none;
}
</style>