<!DOCTYPE html>
|
<html lang="en">
|
<head>
|
<meta charset="UTF-8">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<title>wcs监控图</title>
|
<link rel="stylesheet" href="wcsmap.css">
|
<script type="text/javascript" src="mapData.json"></script>
|
<script src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
|
<script src="pixijs.js"></script>
|
<script src="vue.min.js"></script>
|
<style>
|
.tooltip {
|
position: absolute;
|
display: block;
|
padding: 10px;
|
color: #fff;
|
background-color: #000;
|
border-radius: 5px;
|
left: 200px;
|
top: 200px;
|
}
|
</style>
|
</head>
|
<body>
|
<div id="app">
|
<div id="pixiView">
|
|
</div>
|
<!--输出操作和FPS-->
|
<div style="position: absolute;top: 20px;right: 50px;">
|
<div>FPS:{{mapFps}}</div>
|
</div>
|
<div id="tooltip" class="tooltip">111</div>
|
<p style="position: absolute;top: 20px;right: 100px;" data-tooltip="1232131">666666666</p>
|
</div>
|
</div>
|
</body>
|
</html>
|
|
<script>
|
let objectsContainer;
|
var tooltip = document.getElementById('tooltip');
|
var app = new Vue({
|
el: '#app',
|
data: {
|
mapFps: 0,
|
},
|
created(){
|
console.log(mapData);
|
},
|
})
|
let pixiApp = new PIXI.Application({
|
resizeTo: window,
|
backgroundColor: 0x1f3366
|
})
|
$("#pixiView").append(pixiApp.view)
|
// 加载位图资源
|
PIXI.Loader.shared.add('ChillRoundF','./image_font.xml.fnt').load();
|
function onAssetsLoaded() {
|
createText();
|
}
|
function createText() {
|
// let text = new PIXI.BitmapText('123',{
|
// fontName: 'font',
|
// fontSize: 16,
|
// tint: 0xffffff
|
// })
|
// text.x = 100;
|
// text.y = 100;
|
// pixiApp.stage.addChild(text)
|
}
|
//*******************拖动画布*******************
|
let stageOriginalPos;
|
let mouseDownPoint;
|
let touchBlank = false;
|
let touchOver = false;
|
pixiApp.renderer.plugins.interaction.on(
|
'pointerdown',
|
(event) => {
|
const globalPos = event.data.global;
|
// 记录下stage原来的位置
|
stageOriginalPos = [pixiApp.stage.position._x, pixiApp.stage.position._y];
|
// 记录下mouse down的位置
|
mouseDownPoint = [globalPos.x, globalPos.y];
|
if (!event.target) {
|
// 点到了画布的空白位置
|
touchBlank = true;
|
}
|
}
|
);
|
|
|
pixiApp.renderer.plugins.interaction.on(
|
'pointermove',
|
(event) => {
|
const globalPos = event.data.global;
|
|
if (touchBlank) {
|
// 拖拽画布
|
const dx = globalPos.x - mouseDownPoint[0];
|
const dy = globalPos.y - mouseDownPoint[1];
|
pixiApp.stage.position.set(
|
stageOriginalPos[0] + dx,
|
stageOriginalPos[1] + dy
|
);
|
}
|
}
|
);
|
|
pixiApp.renderer.plugins.interaction.on(
|
'pointerup',
|
(event) => {
|
touchBlank = false;
|
}
|
);
|
// pixiApp.renderer.plugins.interaction.on(
|
// 'mouseover',
|
// (event) => {
|
// const globalPos = event.data.global;
|
// console.log(globalPos);
|
// }
|
// );
|
|
//*******************拖动画布*******************
|
|
//*******************缩放画布*******************
|
pixiApp.view.addEventListener('wheel', (event) => {
|
event.stopPropagation();
|
event.preventDefault();
|
// 因为画布是充满视窗的,所以clientX等于mouse point在renderer上的x坐标
|
const globalPos = [event.clientX, event.clientY];
|
const delta = event.deltaY;
|
const oldZoom = pixiApp.stage.scale.x;
|
let newZoom = oldZoom * 0.999 ** delta;
|
|
// const oldStageMatrix = app.stage.localTransform.clone();
|
// const oldStagePos = oldStageMatrix.applyInverse(pointerGlobalPos);
|
const oldStagePos = globalPos;
|
const dx = oldStagePos[0] * oldZoom - oldStagePos[0] * newZoom;
|
const dy = oldStagePos[1] * oldZoom - oldStagePos[1] * newZoom;
|
|
pixiApp.stage.setTransform(
|
pixiApp.stage.position.x + dx,
|
pixiApp.stage.position.y + dy,
|
newZoom,
|
newZoom,
|
0,
|
0,
|
0,
|
0,
|
0
|
);
|
|
});
|
//*******************缩放画布*******************
|
|
// 创建一个容器来管理大批量的显示对象
|
objectsContainer = new PIXI.Container();
|
pixiApp.stage.addChild(objectsContainer);
|
|
|
//*******************FPS*******************
|
var g_Time=0;
|
pixiApp.ticker.add((delta) => {
|
var timeNow = (new Date()).getTime();
|
var timeDiff = timeNow - g_Time;
|
g_Time = timeNow;
|
var fps = 1000 / timeDiff;
|
this.mapFps = parseInt(fps)
|
});
|
//*******************FPS*******************
|
for (let k of mapData.plant) {
|
let rectangle = new PIXI.Graphics();
|
rectangle.beginFill(k.background);
|
rectangle.originColor = k.background;
|
rectangle.drawRect(0, 0, k.width, k.height);
|
rectangle.x = k.x;
|
rectangle.y = k.y;
|
objectsContainer.addChild(rectangle);
|
}
|
|
for (let k of mapData.conveyor) {
|
let rectangle = new PIXI.Graphics();
|
rectangle.beginFill(k.background);
|
rectangle.originColor = k.background;
|
rectangle.alpha=k.alpha ? k.alpha : 1
|
rectangle.drawRect(0, 0, k.width, k.height);
|
rectangle.x = k.x;
|
rectangle.y = k.y;
|
rectangle.interactive = true
|
rectangle.cursor = "pointer"
|
rectangle.on('mouseover', onMouseOver)
|
function onMouseOver(event) {
|
console.log(event);
|
// 创建内容框
|
let tooltip = new PIXI.Graphics();
|
tooltip.beginFill(0xFFFFFF); // 内容框背景颜色
|
tooltip.lineStyle(1, 0x000000); // 内容框边框样式
|
tooltip.drawRect(0, 0, 100, 40); // 绘制内容框
|
tooltip.x = event.data.global.x; // 根据鼠标位置调整内容框位置
|
tooltip.y = event.data.global.y;
|
pixiApp.stage.addChild(tooltip);
|
|
// 计算内容框的位置,使其在鼠标右下角偏移10像素处
|
tooltip.x = event.currentTarget.x + event.currentTarget.width + 10;
|
tooltip.y = event.currentTarget.y + event.currentTarget.height + 10;
|
// 添加文本到内容框
|
var hel = `站点编号:${k.title}`
|
let text = new PIXI.BitmapText(hel,{
|
fontName: 'ChillRoundF',
|
fontSize: 16,
|
tint: 0xffffff
|
})
|
// text.x = 100;
|
// text.y = 100;
|
// pixiApp.stage.addChild(text)
|
// let text = new PIXI.Text('Hello!', { fontFamily: 'Arial', fontSize: 20, fill: 0x000000 ,resolution: pixiApp.renderer.resolution,antialias: true});
|
text.x = tooltip.x;
|
text.y = tooltip.y;
|
text.resolution = pixiApp.renderer.resolution;
|
pixiApp.stage.addChild(text);
|
|
// 监听鼠标移出事件,移除内容框
|
rectangle.on('mouseout', () => {
|
pixiApp.stage.removeChild(tooltip);
|
pixiApp.stage.removeChild(text);
|
});
|
}
|
objectsContainer.addChild(rectangle);
|
}
|
let shelf1 = mapData.shelf1
|
for (let j in shelf1) {
|
let k = shelf1[j]
|
let y = k.y
|
for (let i = 0; i < k.anfme; i++) {
|
let rectangle = new PIXI.Graphics();
|
rectangle.beginFill(0xffffff);
|
// rectangle.lineStyle(1, 0xffffff);
|
rectangle.drawRect(0, 0, k.unitX-2, k.unitY-2);
|
rectangle.x = k.x + k.unitX * i;
|
rectangle.y = y;
|
objectsContainer.addChild(rectangle);
|
}
|
}
|
|
let shelf2 = mapData.shelf2
|
for (let j in shelf2) {
|
let k = shelf2[j]
|
let y = k.y
|
for (let i = 0; i < k.anfme; i++) {
|
let rectangle = new PIXI.Graphics();
|
rectangle.beginFill(0xffffff);
|
// rectangle.lineStyle(1, 0xffffff);
|
rectangle.drawRect(0, 0, k.unitX-2, k.unitY);
|
rectangle.x = k.x + k.unitX * i;
|
rectangle.y = y;
|
objectsContainer.addChild(rectangle);
|
}
|
}
|
|
|
|
|
|
|
// window.addEventListener('DOMContentLoaded',function() {
|
// var tooltip = document.getElementById('tooltip');
|
|
// document.addEventListener('mouseover',function(event) {
|
// var target = event.target
|
// var tooltipText = target.getAttribute('data-tooltip')
|
|
// if (tooltipText) {
|
// tooltip.innerHTML = tooltipText
|
// tooltip.style.display = 'block'
|
// tooltip.style.left = (event.clientX + 10) + 'px'
|
// tooltip.style.top = (event.clientY + 10) + 'px'
|
// }
|
// })
|
// document.addEventListener('mouseout',function() {
|
// tooltip.style.display = 'none'
|
// })
|
// })
|
|
</script>
|