|
|
@@ -1,48 +1,49 @@
|
|
|
import { fabric } from 'fabric';
|
|
|
+import { ref } from 'vue';
|
|
|
import cameraActiveImg from '@/assets/camera/camera-active.png';
|
|
|
import cameraImg from '@/assets/camera/camera.png';
|
|
|
-import { MapData } from './types';
|
|
|
+import favoritesImg from '@/assets/camera/favorites.png';
|
|
|
+import { CameraImage, MapData, OnMoving, OnRightClick, OnSelect, isCanvas } from './types';
|
|
|
import { fabricSetting } from './fabricSetting';
|
|
|
+import { getRandomPosition } from './utils';
|
|
|
+// import templateGroup from './CameraGroup';
|
|
|
+import { createGroup, toggleGroupSelected, toggleCameraDefault } from './CameraStarGroup';
|
|
|
|
|
|
-export interface CameraImage extends fabric.Image {
|
|
|
- cameraId: string;
|
|
|
-}
|
|
|
-
|
|
|
-type Canvas = fabric.Canvas;
|
|
|
-
|
|
|
-const isCanvas = (canvas: Canvas | null): canvas is Canvas => {
|
|
|
- return Boolean(canvas);
|
|
|
-};
|
|
|
-
|
|
|
-type OnSelect = (image: CameraImage | null) => unknown;
|
|
|
-type OnRightClick = (e: fabric.IEvent<MouseEvent>) => unknown;
|
|
|
-fabricSetting(fabric);
|
|
|
+fabricSetting();
|
|
|
|
|
|
class CameraMap {
|
|
|
- public canvas: fabric.Canvas | null = null;
|
|
|
+ public canvas = ref<fabric.Canvas | null>();
|
|
|
private onSelect: OnSelect;
|
|
|
private onRightClick: OnRightClick;
|
|
|
-
|
|
|
- constructor(param: { canvasId: string; onSelect: OnSelect; onRightClick: OnRightClick }) {
|
|
|
- this.canvas = new fabric.Canvas(param.canvasId, {
|
|
|
+ private onMoving: OnMoving;
|
|
|
+
|
|
|
+ constructor(param: {
|
|
|
+ canvasId: string;
|
|
|
+ onSelect: OnSelect;
|
|
|
+ onRightClick: OnRightClick;
|
|
|
+ onMoving: OnMoving;
|
|
|
+ }) {
|
|
|
+ this.canvas.value = new fabric.Canvas(param.canvasId, {
|
|
|
fireRightClick: true, // 启用右键,button的数字为3
|
|
|
stopContextMenu: true, // 禁止默认右键菜单
|
|
|
});
|
|
|
this.addListener();
|
|
|
this.onSelect = param.onSelect;
|
|
|
this.onRightClick = param.onRightClick;
|
|
|
- // window.canvas = this.canvas;
|
|
|
+ this.onMoving = param.onMoving;
|
|
|
+ window.canvas = this.canvas.value;
|
|
|
}
|
|
|
|
|
|
/** 监听点击事件 */
|
|
|
private addListener() {
|
|
|
- const canvas = this.canvas;
|
|
|
+ const canvas = this.canvas.value;
|
|
|
if (!isCanvas(canvas)) return;
|
|
|
|
|
|
canvas.on('mouse:down', (options) => {
|
|
|
const target = options.target as CameraImage;
|
|
|
const cameraId = target?.cameraId;
|
|
|
// console.log('当前选中的id是', cameraId);
|
|
|
+ console.log('mouse:down');
|
|
|
console.log(options);
|
|
|
|
|
|
// 判断:右键,且在元素上右键
|
|
|
@@ -73,22 +74,22 @@ class CameraMap {
|
|
|
|
|
|
/** 上传背景图 */
|
|
|
public uploadBg(imgUrl: string) {
|
|
|
- const canvas = this.canvas;
|
|
|
+ const canvas = this.canvas.value;
|
|
|
if (!isCanvas(canvas)) return;
|
|
|
fabric.Image.fromURL(imgUrl, (img) => {
|
|
|
console.log('image', img);
|
|
|
- this.canvas!.setWidth(img.width!);
|
|
|
- this.canvas!.setHeight(img.height!);
|
|
|
+ canvas!.setWidth(img.width!);
|
|
|
+ canvas!.setHeight(img.height!);
|
|
|
img.lockScalingX = true;
|
|
|
img.lockScalingY = true;
|
|
|
// 设置背景图
|
|
|
- canvas.setBackgroundImage(img, this.canvas!.renderAll.bind(this.canvas));
|
|
|
+ canvas.setBackgroundImage(img, this.canvas.value!.renderAll.bind(this.canvas));
|
|
|
});
|
|
|
}
|
|
|
|
|
|
/** 将所有的摄像头都设置为非激活状态 */
|
|
|
private setAllCameraUnActive() {
|
|
|
- const canvas = this.canvas;
|
|
|
+ const canvas = this.canvas.value;
|
|
|
if (!isCanvas(canvas)) return;
|
|
|
canvas.forEachObject((object) => {
|
|
|
(object as fabric.Image).setSrc(cameraImg, () => {
|
|
|
@@ -97,24 +98,28 @@ class CameraMap {
|
|
|
});
|
|
|
}
|
|
|
|
|
|
- private getRandomPosition() {
|
|
|
- return 100 + Math.floor(Math.random() * 30);
|
|
|
- }
|
|
|
-
|
|
|
/** 增加一个摄像头 */
|
|
|
public addCamera(cameraId: string): Promise<CameraImage> {
|
|
|
- const canvas = this.canvas;
|
|
|
+ const canvas = this.canvas.value;
|
|
|
if (!isCanvas(canvas)) return Promise.reject();
|
|
|
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
|
+ const that = this;
|
|
|
return new Promise((resolve) => {
|
|
|
fabric.Image.fromURL(cameraActiveImg, (cImg) => {
|
|
|
- const cameraImg: CameraImage = cImg as unknown as CameraImage;
|
|
|
+ const cameraImg = ref(cImg as unknown as CameraImage);
|
|
|
this.setAllCameraUnActive();
|
|
|
- cameraImg.set({
|
|
|
- left: this.getRandomPosition(),
|
|
|
- top: this.getRandomPosition(),
|
|
|
+ cameraImg.value.set({
|
|
|
+ left: getRandomPosition(),
|
|
|
+ top: getRandomPosition(),
|
|
|
cameraId,
|
|
|
});
|
|
|
- canvas.add(cameraImg);
|
|
|
+ cameraImg.value.lockScalingX = true;
|
|
|
+ cameraImg.value.lockScalingY = true;
|
|
|
+ canvas.add(cameraImg.value);
|
|
|
+ cameraImg.value.on('moving', function (e) {
|
|
|
+ console.log('move', e);
|
|
|
+ that.onMoving(e);
|
|
|
+ });
|
|
|
resolve(cameraImg);
|
|
|
});
|
|
|
});
|
|
|
@@ -122,7 +127,7 @@ class CameraMap {
|
|
|
|
|
|
/** 删除一个摄像头 */
|
|
|
public removeCamera(cameraImage: CameraImage) {
|
|
|
- const canvas = this.canvas;
|
|
|
+ const canvas = this.canvas.value;
|
|
|
if (!isCanvas(canvas)) return;
|
|
|
console.log('removeCamera', cameraImage);
|
|
|
canvas.remove(cameraImage);
|
|
|
@@ -130,7 +135,7 @@ class CameraMap {
|
|
|
|
|
|
/** 导出JSON格式 */
|
|
|
public toJSON() {
|
|
|
- const canvas = this.canvas;
|
|
|
+ const canvas = this.canvas.value;
|
|
|
if (!isCanvas(canvas)) return;
|
|
|
const initialJSON = canvas.toJSON(['cameraId']);
|
|
|
/** toJSON返回值的类型它写错了,应该是有backgroundImage的 */
|
|
|
@@ -158,7 +163,7 @@ class CameraMap {
|
|
|
|
|
|
/** 从json中加载 */
|
|
|
public loadFromJSON(json: MapData): Promise<void> {
|
|
|
- const canvas = this.canvas;
|
|
|
+ const canvas = this.canvas.value;
|
|
|
if (!isCanvas(canvas)) return Promise.reject();
|
|
|
return new Promise((resolve) => {
|
|
|
const { width, height } = json.backgroundImage;
|
|
|
@@ -178,24 +183,29 @@ class CameraMap {
|
|
|
|
|
|
/** 更新摄像头的渲染 */
|
|
|
public renderCamera() {
|
|
|
- const canvas = this.canvas;
|
|
|
+ const canvas = this.canvas.value;
|
|
|
if (!isCanvas(canvas)) return;
|
|
|
canvas.renderAll();
|
|
|
}
|
|
|
|
|
|
public clear() {
|
|
|
- this.canvas?.clear();
|
|
|
+ this.canvas.value?.clear();
|
|
|
}
|
|
|
|
|
|
/** 是否已经存在这个cameraId */
|
|
|
public hasCamera(cameraId: string) {
|
|
|
- const canvas = this.canvas;
|
|
|
+ const canvas = this.canvas.value;
|
|
|
if (!isCanvas(canvas)) return;
|
|
|
const cameraIds = canvas
|
|
|
.toJSON(['cameraId'])
|
|
|
.objects.map((item) => (item as CameraImage).cameraId);
|
|
|
return cameraIds.includes(cameraId);
|
|
|
}
|
|
|
+
|
|
|
+ /** 根据cameraId查找某个元素 */
|
|
|
+ public getCameraById(cameraId: string) {
|
|
|
+ return this.canvas.value?.getObjects().find((x) => (x as CameraImage).cameraId === cameraId);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
export default CameraMap;
|