<template> <div id="canvasContainer"> <div id="canvasBox"> <!-- 网格 --> <canvas id="canGrid" class="can" :style="{ left: gridLeft, top: gridTop }" :hleft="gridLeft" :htop="gridTop"></canvas> <!-- 箱体连线区域,包含输出源 --> <canvas id="can" class="can"></canvas> <div id="maskArea"></div> <div id="maskSourceCut"> <div class="mask" v-show="is_show_mask" :style="`left: ${maskLeft}; top: ${maskTop}; right: ${maskRight}; bottom: ${maskBottom}`"> <div class="hander hander_lt" v-if="showHander" :style="`width: ${handerWidth}px; height: ${handerHeight}px`" @mousedown="(e) => resizeDown(e, 'lt')" @mousemove="(e) => resizeMove(e, 'lt')" @mouseup="(e) => resizeUp(e, 'lt')"></div> <div class="hander hander_ct" v-if="showHander" :style="`width: ${handerWidth}px;`" @mousedown="(e) => resizeDown(e, 'ct')" @mousemove="(e) => resizeMove(e, 'ct')" @mouseup="(e) => resizeUp(e, 'ct')"></div> <div class="hander hander_rt" v-if="showHander" :style="`width: ${handerWidth}px; height: ${handerHeight}px`" @mousedown="(e) => resizeDown(e, 'rt')" @mousemove="(e) => resizeMove(e, 'rt')" @mouseup="(e) => resizeUp(e, 'rt')"></div> <div class="hander hander_rc" v-if="showHander" :style="`height: ${handerHeight}px;`" @mousedown="(e) => resizeDown(e, 'rc')" @mousemove="(e) => resizeMove(e, 'rc')" @mouseup="(e) => resizeUp(e, 'rc')"></div> <div class="hander hander_rb" v-if="showHander" :style="`width: ${handerWidth}px; height: ${handerHeight}px`" @mousedown="(e) => resizeDown(e, 'rb')" @mousemove="(e) => resizeMove(e, 'rb')" @mouseup="(e) => resizeUp(e, 'rb')"></div> <div class="hander hander_cb" v-if="showHander" :style="`width: ${handerWidth}px;`" @mousedown="(e) => resizeDown(e, 'cb')" @mousemove="(e) => resizeMove(e, 'cb')" @mouseup="(e) => resizeUp(e, 'cb')"></div> <div class="hander hander_lb" v-if="showHander" :style="`width: ${handerWidth}px; height: ${handerHeight}px`" @mousedown="(e) => resizeDown(e, 'lb')" @mousemove="(e) => resizeMove(e, 'lb')" @mouseup="(e) => resizeUp(e, 'lb')"></div> <div class="hander hander_lc" v-if="showHander" :style="`height: ${handerHeight}px;`" @mousedown="(e) => resizeDown(e, 'lc')" @mousemove="(e) => resizeMove(e, 'lc')" @mouseup="(e) => resizeUp(e, 'lc')"></div> <div class="maskCenter" @mousemove="resizeMove" @mouseup=" cutMaskFlag = false; cutMaskType = ''; cutRate = 1; "></div> </div> </div> </div> </div></template><script>var triangle = {};var canvas;var lineArr = {};var firstAdd;var sourceCanvas = {};var rightKey = false; //右键var isdrawBox = false;var startDrawX = 0;var startDrawY = 0;var yesSddBoximport bus from "@/assets/js/bus.js";import { connectionMode } from "@/components/drawLine/ConnectionMode.js";import { handleDataUtil } from "@/components/saveSystemData/handleUtil.js";import { mapState, mapMutations } from "vuex";import myCanvas from "./myCanvas";import { Message } from "element-ui";import { accAdd, accSub, accMul, accDiv } from "@/assets/js/mathem.js";export default { mixins: [myCanvas], computed: { ...mapState({ gridShow: "gridShow", canvasSpace: "canvasSpace", canvasColor: "canvasColor", mode: "mode", boxes: "boxes", sourceData: "sourceData", inputCut: "inputCut", selectedBoxes: "selectedBoxes", boxType: "boxType", areaId: "areaId", groupList: "groupList", seletedGroup: "seletedGroup", frame: "frame", is_show_mask: "is_show_mask", boxTypeList: "boxTypeList", canvasSize: "canvasSize", canvasZoom: "canvasZoom", changeNetWork: "changeNetWork", showFace: "showFace", dataSource: "dataSource", sourceMoveEnable: "sourceMoveEnable", doBack: "doBack", doUp: "doUp", currentMode: "currentMode", selectGroupIndex: "selectGroupIndex", limitSourceSpace: "limitSourceSpace", onlineBoxListData: "onlineBoxListData", allPort: "allPort", inputDetail: "inputDetail", inputPortIndex: "inputPortIndex", cropEn: "cropEn", cut: "cut", inputSource: "inputSource", focusPropertyFlag: "focusPropertyFlag", gridAdsorbent: "gridAdsorbent", adsorbent: "adsorbent", source_crop: "source_crop", cutData: "cutData", rightBoxDetail: "rightBoxDetail", }), }, data () { return { imrotat: false, gridLeft: 0, gridTop: 0, activeTpye: false, mousePosition: { x: null, y: null, }, cutRate: 1, cutMaskFlag: false, cutMaskType: "", cutMinWidth: 50, cutMinHeight: 50, handerWidth: 40, handerHeight: 40, showHander: true, ctrlFlag: false, copyBoxFlag: false, cutBoxFlag: false, originData: null, noIndex: 0, //默认未抉择 卡槽 网口 -----临时废除 dataRect: [], // 点击增加箱体 ----临时废除 allData: [], //所有箱体数据 allData2: [], //深拷贝所有箱体数据 maskLeft: "0px", maskTop: "0px", maskRight: "0px", maskBottom: "0px", // maskWidth: "0px", // maskHeight: "0px", cutingFlag: false, // 开始裁剪时鼠标的坐标 start_x: null, start_y: null, // 裁剪完结时松开鼠标的坐标 end_x: null, end_y: null, // 裁剪后区域间隔边距的间隔 imgTop: "0px", imgRight: "1000px", imgBottom: "1000px", imgLeft: "0px", // 裁剪区域片的宽高 imgHeight: "100%", imgWidth: "100%", cutParam: "0,0,0,0", // 裁剪后果传参 左上右下(不带px) canvasBox: null, movingSoureFlag: false, scalingSourceFlag: false, movup: false, //挪动实现后 rotup: false, //旋转实现后 yd: {}, allGroup: [], isChangeLine: false, addlineDash: 1, startPort: {}, endPort: {}, lineDash: {}, addAngle: 0, onLineBoxType: "", onlineBoxLength: 0, drawAddBox: [], newBoxes: [], unselectecBoxes: [], boxReqList: [], addBoxParams: [], //存贮每次新增箱体数据 face: true, //默认为true代表为正视图。 drawLineType: "", loadNumber: 1, parms: {}, portIds: [], copyNum: 1, copyKeyNum: 1, copyBoxSpace: 10, frameMessage: "", deepcolorMessage: "", shiftFlag: false, dowmMoseList: [], ctrlShiftA_number: 0, //管制长按后退后退操作时反复执行 zouxian: "", zouxianMode: "", hoverGroupFlag: false, scaleOffsetFlag: false, moveMouseX: "", moveMouseY: "", }; }, mounted () { bus.$on("setToRightBox", (val) => { let that = this; console.log("右侧扭转坐标角度", val); if (firstAdd) { this.addAngle = val.angle; firstAdd.set({ angle: val.angle }).setCoords(); canvas.renderAll(); } else { let item = val // canvas.getActiveObject(); if (item) { if (item.isCheckTo) { item.set({ angle: val.angle, left: val.left, top: val.top }).setCoords(); item._objects[2].set({ angle: -val.angle }).setCoords(); canvas.renderAll(); let rectList = this.allData.filter(function (obj, i) { return obj.id == item.id; }); rectList[0].rotationAngle = val.angle; rectList[0].x = val.left; rectList[0].y = val.top; this.setUpdateBox(rectList, (res) => { this.handleData2('manualRotate') }, 1); this.$nextTick(function () { handleDataUtil.doEnything(this.dataSource, this.allData, "canvas", this.groupList, ""); this.setDoBack(false); this.setDoUp(true); }) } else { item.set({ left: val.left, top: val.top, originX: 'center', originY: 'center', angle: val.angle, }).setCoords() canvas.renderAll(); let boxReqList = []; item._objects.forEach((obj, i) => { if (obj.isCheckTo) { obj._objects[2].set({ angle: -((parseFloat(val.angle) + parseFloat(obj.angle)) % 360) }).setCoords() that.allData.forEach((item, k) => { if (item.id == obj.id) { item.rotationAngle = parseInt((parseFloat(val.angle) + parseFloat(obj.angle)) % 360) item.x = obj.matrixCache.value[4]; item.y = obj.matrixCache.value[5]; item.operateType = "manualRotate"; boxReqList.push(item); } }); } else { let arr = obj._objects let objCenterPort = obj.matrixCache.value arr.forEach((list, j) => { that.allData.forEach((item, k) => { if (item.id == list.id) { item.rotationAngle = parseInt((parseFloat(val.angle) + parseFloat(list.angle)) % 360) let x1 = objCenterPort[4] + list.left; let y1 = objCenterPort[5] + list.top; let gg = that.rotatoNi( x1, y1, objCenterPort[4], objCenterPort[5], val.angle ); item.x = gg.x; item.y = gg.y; item.operateType = "manualRotate"; boxReqList.push(item); list._objects[2].set({ angle: -((val.angle + list.angle) % 360) }) } }); }) } }); console.log('旋转后', item) this.handleData2('manualRotate') console.log('所有', JSON.parse(JSON.stringify(that.allData))) console.log('入参', JSON.parse(JSON.stringify(boxReqList))) this.setUpdateBox(boxReqList, (res) => { //this.handleData2('manualRotate') console.log('返回', res) }, 1); this.$nextTick(function () { handleDataUtil.doEnything(this.dataSource, this.allData, "canvas", this.groupList, ""); this.setDoBack(false); this.setDoUp(true); }) } } } }); bus.$on("renderSource", (data) => { console.log(data); sourceCanvas.set(data); sourceCanvas.set({ hoverCursor: "pointer", selectable: true, evented: true, }); this.setSourceData(data); this.canvasBox.renderAll(); }); bus.$on("initSoucre_", (data) => { var that = this; console.log(data); // return; sourceCanvas = new fabric.Rect({ left: data.cropX + that.canvasSize.width / 4, top: data.cropY + that.canvasSize.height / 4, originX: "left", //绝对于坐标点地位 originY: "top", //绝对于坐标点地位 width: data.cropWidth, height: data.cropHeight, hoverCursor: "normal", fill: "green", borderColor: "black", //选中边框色 cornerStyle: "circle", // 手柄形态 正方形 rect||圆 circle cornerColor: "black", //手柄背景色 cornerStrokeColor: "black", //手柄框边框 hasControls: true, //手柄 hasBorders: true, //手柄线 visible: true, //是否可见 selectable: false, //是否可抉择的对象 evented: false, //是否拖动 centeredScaling: false, //居中缩放 transparentCorners: false, //选中框通明角 preserveObjectStacking: true, opacity: 0.2, id: "source", }); sourceCanvas.setControlsVisibility({ mt: true, mb: true, bl: true, br: true, tl: true, tr: true, mr: true, ml: true, mtr: false, }); var objs_ = canvas.getObjects(); for (var i = 0; i < objs_.length; i++) { if (objs_[i].id == 'source') { canvas.remove(objs_[i]); } } console.log(sourceCanvas); canvas.add(sourceCanvas); }); bus.$on("initSoucre_index", (data) => { var that = this; console.log(data); // return; sourceCanvas = new fabric.Rect({ left: data.left, top: data.top, originX: "left", //绝对于坐标点地位 originY: "top", //绝对于坐标点地位 width: data.width, height: data.height, hoverCursor: "normal", fill: "green", borderColor: "black", //选中边框色 cornerStyle: "circle", // 手柄形态 正方形 rect||圆 circle cornerColor: "black", //手柄背景色 cornerStrokeColor: "black", //手柄框边框 hasControls: true, //手柄 hasBorders: true, //手柄线 visible: true, //是否可见 selectable: false, //是否可抉择的对象 evented: false, //是否拖动 centeredScaling: false, //居中缩放 transparentCorners: false, //选中框通明角 preserveObjectStacking: true, opacity: 0.2, id: "source", }); sourceCanvas.setControlsVisibility({ mt: true, mb: true, bl: true, br: true, tl: true, tr: true, mr: true, ml: true, mtr: false, }); var objs_ = canvas.getObjects(); for (var i = 0; i < objs_.length; i++) { if (objs_[i].id == 'source') { canvas.remove(objs_[i]); } } //console.log(sourceCanvas); canvas.add(sourceCanvas); }); bus.$on("drawSource", (data) => { console.log(data); let [gridLeft, gridTop] = [ this.canvasSize.width / 4, this.canvasSize.height / 4 ]; data.left += gridLeft; data.top += gridTop; this.setSourceData(data); //console.log(this.sourceData); this.setCut({ cutLeft: 0, cutTop: 0, cutWidth: data.cropWidth, cutHeight: data.cropHeight, cropX: data.cropX, cropY: data.cropY }); this.initSource(data); }); bus.$on("disableSource", (data) => { sourceCanvas.set(data); this.canvasBox.renderAll(); }); bus.$on("showMask", (data) => { this.setIs_show_mask(data.showFlag); if (!data.showFlag) { this.maskLeft = "0px"; this.maskTop = "0px"; this.maskRight = "0px"; this.maskBottom = "0px"; } if (data.cutData) { this.showHander = data.showHander; this.maskLeft = data.cutData.x * this.canvasZoom + "px"; this.maskTop = data.cutData.y * this.canvasZoom + "px"; this.maskRight = (this.source_crop.width - data.cutData.w - data.cutData.x) * this.canvasZoom + "px"; this.maskBottom = (this.source_crop.height - data.cutData.h - data.cutData.y) * this.canvasZoom + "px"; } }); bus.$on("showMask_index", (data) => { this.setIs_show_mask(false); }); bus.$on("setProCon", (flag) => { canvas.discardActiveObject(); var objects = canvas.getObjects(); let x = document.getElementById("canGrid").offsetWidth * 2; // for (var i in objects) { // if (objects[i].id == "source") { // objects[i].left = x * 2 - objects[i].left - objects[i].width; // objects[i].top = objects[i].top; // } else if (objects[i].type == "group" && objects[i].groupId == "box") { // objects[i].left = x * 2 - objects[i].left; // objects[i].top = objects[i].top; // objects[i].angle = 360 - objects[i].angle; // } // objects[i].setCoords(); // } this.face = flag; this.allData.forEach((item, index) => { item.x = x - item.x - item.width + 100; //这里的100长期加的,临时以两头地位转换坐标,是否最内部有款式影响 item.rotationAngle = 360 - item.rotationAngle; }); this.setUpdateBox( this.allData, (res) => { this.refreshCanvas(res, true); }, 1 ); // that.handleData(""); }); bus.$on("toolDelete", () => { this.deleteBox(); }); bus.$on("toolSelectAll", (flag) => { var that = this; let objs = canvas.getObjects(); if (objs.length == 1 || (that.mode != "canvas" && that.mode != "box")) { // 只有一个源,没有箱体 return; } if (!flag) { // 全选 canvas.discardActiveObject(); let sel = []; let boxes = []; objs.map((item) => { if (item.id != "source" && item.type == "group" && item.groupId == "box") { boxes.push(item); sel.push(item); } else if ( item.id != "source" && item.type == "group" && item.groupId != "box" ) { that.groupList.forEach(group => { if (group.id == item.id && !group.hidden) { boxes.push(item); sel.push(item); } }) } }); var selection = new fabric.ActiveSelection(sel, { canvas: canvas, }); canvas.setActiveObject(selection); canvas.requestRenderAll(); this.setSelectAll(true); this.setSelectedBoxes(boxes); } else { // 勾销全选 canvas.discardActiveObject(); canvas.requestRenderAll(); this.setSelectAll(false); this.setSelectedBoxes([]); } }); bus.$on("disgardObjs", () => { canvas.discardActiveObject(); canvas.requestRenderAll(); this.setSelectAll(false); this.setSelectedBoxes([]); }); bus.$on("makeGroup", () => { if (!canvas.getActiveObject()) { return; } if (canvas.getActiveObject().type !== "activeSelection") { // 选中单个箱体进行分组时,此判断return return; } let that = this; let ids = []; let hasGroupFlag = false; canvas.getActiveObject()._objects.forEach((obj) => { if (obj.type == "group" && obj.groupId != "box") { this.$message.warning(this.$t('GroupNotContinue')); hasGroupFlag = true; } else { ids.push(obj.id); } }); if (hasGroupFlag) { return; } if (ids.length == 0) { this.$message.warning(this.$t('PleaseSelectGroup')); return; } //判断ids 是否存在于 allGroup 中。 for (let allGroupItem of that.allGroup) { for (let boxItem of allGroupItem._objects) { let id = boxItem.id; // 判断id是否在 ids 中,如果有,则表明有已分组的数据,不能够再分组。 if (ids.indexOf(id) > -1) { return; } } } this.setMode("group"); let name = this.getGroupName(); this.$store.dispatch("setBoxGroup", { params: { ids: ids, areaId: this.areaId, //分区id name: name, }, success (res) { that.setActiveMakeGroup(false); let group = canvas.getActiveObject().toGroup({ // 选中单个箱体进行分组,此办法报错 borderColor: "red", isGroup: true, }); let groupId = res.obj.id; group.set({ id: groupId, }); ids.forEach((id) => { that.allData.forEach((data) => { if (data.id == id) { data.groupId = groupId; } }); }); canvas.requestRenderAll(); that.allGroup.push(group); that.$store.dispatch("getBoxGroupByAreaId", { params: { areaId: that.areaId, }, success (res) { let groupList = res.obj; groupList.forEach((item) => { if (item.isShow == "0") { item.hidden = false; } else if (item.isShow == "1") { item.hidden = true; } }); that.setGroupList(groupList); for (let i = 0; i < groupList.length; i++) { if (groupList[i].areaId == that.areaId && groupList[i].id == groupId) { that.setSelectGroupIndex(i); break; } } that.$nextTick(function () { handleDataUtil.doEnything(this.dataSource, this.allData, "canvas", this.groupList, ""); this.setDoBack(false); this.setDoUp(true); }) }, error (res) { }, }); }, error (res) { that.$message(that.$t(res.msg)) }, }); }); bus.$on("breakGroup", () => { let that = this; let groupId = -1; if (this.seletedGroup) { // 通过分组列表选中分组 groupId = this.seletedGroup.id; } else { // 通过屏幕区点击选中分组 groupId = canvas.getActiveObject().id; } that.$store.dispatch("delBoxGroup", { params: { id: groupId, areaId: that.areaId, //分区id }, success (res) { that.setActiveBreakGroup(false); let newGroupList = JSON.parse(JSON.stringify(that.groupList)); for (let i = 0; i < that.groupList.length; i++) { if ( that.groupList[i].areaId == that.areaId && that.groupList[i].id == groupId ) { newGroupList.splice(i, 1); break; } } that.setGroupList(newGroupList); that.setSelectGroupIndex(-1); that.allData.forEach((data) => { if (data.groupId == groupId) { data.groupId = 0; } }); let nmb = null let items = canvas.getActiveObject(); if (items) { if (items.type == "activeSelection") { let objs = items._objects[0]; let matrixCache = objs.matrixCache; objs .set({ left: matrixCache.value[4] + objs.left, top: matrixCache.value[5] + objs.top, }) .setCoords(); nmb = objs.toActiveSelection(); } else { nmb = items.toActiveSelection(); } canvas.discardActiveObject(); canvas.requestRenderAll(); } canvas.forEachObject((obj) => { nmb._objects.forEach((item) => { if (obj.id == item.id) { obj.angle = (360 + obj.angle) % 360 } }) }) for (let i = 0; i < that.allGroup.length; i++) { if (groupId == that.allGroup[i].id) { that.allGroup.splice(i, 1); } } that.$nextTick(function () { handleDataUtil.doEnything(this.dataSource, this.allData, "canvas", this.groupList, ""); this.setDoBack(false); this.setDoUp(true); }) }, error (res) { }, }); }); bus.$on("hideShowGroup", (data) => { let that = this; let params = { params: { id: that.groupList[data.index].id, isShow: data.group.hidden ? 1 : 0, // 0-显示 1-暗藏 name: that.groupList[data.index].name, }, success (res) { let objs = canvas.getObjects(); let groupList = JSON.parse(JSON.stringify(that.groupList)); objs.forEach((obj) => { if (obj.type == "group" && obj.id == that.groupList[data.index].id) { if (data.group.hidden) { obj.set({ visible: false, }); groupList[data.index].hidden = true; groupList[data.index].isShow = "0"; if (data.index == that.selectGroupIndex) { canvas.discardActiveObject(); } } else { obj.set({ visible: true, }); groupList[data.index].hidden = false; groupList[data.index].isShow = "1"; if (data.index == that.selectGroupIndex) { canvas.discardActiveObject(); canvas.setActiveObject(obj); } } } }); that.setGroupList(groupList); canvas.renderAll(); if (data.index == that.selectGroupIndex) { if (data.group.hidden) { that.setActiveDeleteBox(false); that.setActiveBreakGroup(false); } } that.handleData2(""); }, error (res) { }, }; this.$store.dispatch("updateBoxGroup", params); }); bus.$on("showHiddenGroups", (list) => { let objs = canvas.getObjects(); let groupList = JSON.parse(JSON.stringify(list)); groupList.forEach((li) => { objs.forEach((obj) => { if (obj.type == "group" && obj.id == li.id) { obj.set({ visible: true, }); } }); }); this.showHiddenLines(); canvas.renderAll(); }); bus.$on("hideHiddenGroups", (list) => { let objs = canvas.getObjects(); let groupList = JSON.parse(JSON.stringify(list)); groupList.forEach((li) => { objs.forEach((obj) => { if (obj.type == "group" && obj.id == li.id) { obj.set({ visible: false, }); } }); }); this.handleData2(); canvas.renderAll(); }); bus.$on("changeLine", () => { //关上自定义连线状态 --箱体不可选和挪动 中心点可选 this.isChangeLine = true; }); bus.$on("breakLine", () => { this.deleteLine(); }); bus.$on("selectGroup", (groupId) => { canvas.discardActiveObject(); canvas.requestRenderAll(); var sel = null; canvas.forEachObject(obj => { if (obj.type == "group" && obj.groupId != "box") { if (obj.id == groupId && obj.visible) { sel = obj; } } }); canvas.setActiveObject(sel); canvas.requestRenderAll(); if (this.mode != "boxLine16") { this.setActiveBreakGroup(true); this.setActiveDeleteBox(true); } }); bus.$on("changePort", (data) => { let that = this; var newPort = data[1]; var slotId = data[0]; var netWorkPortId = newPort; for (var i = 0; i < this.allPort.length; i++) { if (this.allPort[i].portId == newPort && this.allPort[i].slotId == slotId) { netWorkPortId = this.allPort[i].networkPort; } } if (this.currentMode == "canvas_online") { //代表在线增加模式下切换网口 let indexIndex = that.allData.filter(function (obj, i) { return obj.networkPort == netWorkPortId; }); let _index = indexIndex.length //序号 for (var i = 0; i < that.onlineBoxListData.length; i++) { if (that.onlineBoxListData[i].networkPort == netWorkPortId && _index >= that.onlineBoxListData[i].list.length) { that.$message({ duration: 2000, message: that.$t('ExceedingTheLoadOfTheBox'), type: "error", }); // this.quitAddRect(); // this.setShowBack(false); // this.setAddBoxMode(false); // this.setMaskLeftMenu(false); // this.setActiveChangeLine(true); // this.setActiveConnectLine(true); canvas.forEachObject(o => { // console.log(o.id); if (o.id != "source" && (o.id == "" || o.id == undefined)) { canvas.remove(o); } }); return; } } } if (firstAdd || (this.currentMode == "canvas_online" || this.currentMode == "canvas_offline")) { that.addBoxParams[0].networkPort = netWorkPortId; that.addBoxParams[0].portId = newPort; that.addBoxParams[0].slotId = slotId; that.addBoxParams[0].index = ''; that.parms.index = netWorkPortId; that.parms.networkPort = netWorkPortId; that.parms.portId = newPort; that.parms.slotId = slotId; canvas.remove(firstAdd); firstAdd = this.groupAdd(that.addBoxParams[0], canvas); canvas.add(firstAdd); return } let item = canvas.getActiveObjects(); let boxReqList = []; for (let index = 0; index < item.length; index++) { if (item[index].isCheckTo) { that.allData.forEach((e) => { if (item[index].id == e.id) { boxReqList.push({ id: e.id, networkPort: netWorkPortId, oldNetworkPort: item[index].networkPort, }); } }); } else { let list = item[index]._objects list.forEach((l) => { that.allData.forEach((e) => { if (l.id == e.id) { boxReqList.push({ id: e.id, networkPort: netWorkPortId, oldNetworkPort: l.networkPort, }); } }); }) } } this.$axios({ method: "post", url: "/box/updateBox", data: { flag: 1, // 接口是否返回最新的箱体列表, 0否;1是 areaId: that.areaId, refreshIndex: true, list: boxReqList, frame: 1, // 给后盾传参帧率,用于带载校验 }, }).then((res) => { if (res && res.status == 200) { for (var i = 0; i < res.obj.length; i++) { for (var j = 0; j < res.obj[i].list.length; j++) { res.obj[i].list[j].slotId = res.obj[i].slotId; } } this.refreshCanvas(res); handleDataUtil.doEnything( this.dataSource, this.allData, "canvas", this.groupList, "" ); //后退 this.setDoBack(false); this.setDoUp(true); } else { that.$message(that.$t(res.msg)) } }); }); bus.$on("copyToMe", (ports) => { this.copy2Me(ports); }); bus.$on("backChange", (data) => { canvas.forEachObject((o) => { if (o.id != "source") { canvas.remove(o); } }); this.getboxList(); // this.$refs.queryOnlineBox.queryOnlineBox(); bus.$emit("getiOnLineBox", "") }); bus.$on("copyDoEnything", (date) => { this.copyBoxFlag = false; this.copyKeyNum = 1; let list = canvas.getActiveObjects() list = list.filter(function (obj, i) { return obj.isCheckTo == true; }); let items = list//this.selectedBoxes; this.copyNum += 1 var ports = [...new Set(date.copyTome)]; let data = []; let indexArr = new Array(ports.length); if (date.copyTome != []) { for (let j = 0; j < ports.length; j++) { let index = -1; for (let k = 0; k < this.allData.length; k++) { if (this.allData[k].networkPort == ports[j]) { if (this.allData[k].index >= index) { index = this.allData[k].index; } } } indexArr[j] = index; for (let i = 0; i < items.length; i++) { if (items[i].networkPort == ports[j]) { indexArr[j] += 1; let [x, y] = [0, 0]; if (items.length == 1) { [x, y] = [items[i].left, items[i].top]; } else { [x, y] = [items[i].matrixCache.value[4], items[i].matrixCache.value[5]]; } //[x, y] = [items[i].matrixCache.value[4], items[i].matrixCache.value[5]]; data.push({ rotationAngle: parseInt(parseFloat(items[i].angle)), areaId: this.areaId, networkPort: items[i].networkPort, index: indexArr[j], type: null, width: items[i].width, height: items[i].height, x: x + this.copyNum * this.copyBoxSpace, y: y + this.copyNum * this.copyBoxSpace, boxFileId: items[i].boxFileId, }); } } } } if (date.copyToOtherPort != []) { var copyToOtherPort = date.copyToOtherPort; var copyToOtherPorts = date.copyToOtherPorts; for (let j = 0; j < copyToOtherPort.length; j++) { let index = -1; for (let i = 0; i < data.length; i++) { if (data[i].networkPort == copyToOtherPorts[j]) { if (data[i].index >= index) { index = data[i].index + 1; } } } if (index == -1) { for (let i = 0; i < this.allData.length; i++) { if (this.allData[i].networkPort == copyToOtherPorts[j]) { if (this.allData[i].index >= index) { index = this.allData[i].index + 1; } } } } if (index == -1) { index = 1; } var number = 0; for (let i = 0; i < items.length; i++) { if (items[i].networkPort == copyToOtherPort[j]) { let [x, y] = [0, 0]; if (items.length == 1) { [x, y] = [items[i].left, items[i].top]; } else { [x, y] = [items[i].matrixCache.value[4], items[i].matrixCache.value[5]]; } // [x, y] = [items[i].matrixCache.value[4], items[i].matrixCache.value[5]]; data.push({ rotationAngle: parseInt(parseFloat(items[i].angle)), areaId: this.areaId, networkPort: copyToOtherPorts[j], index: index + number, type: null, width: items[i].width, height: items[i].height, x: x + this.copyNum * this.copyBoxSpace, y: y + this.copyNum * this.copyBoxSpace, boxFileId: items[i].boxFileId, }); number++; } } } } // return; console.log('拷贝相干数据', copyToOtherPorts); let that = this; //return this.setAddBox(data, (res) => { res.obj.forEach((o) => { o.id = o.boxId; }); that.allData = that.allData.concat(res.obj); data.forEach((item, index) => { item.id = res.obj[index].boxId; item.type = res.obj[index].type; item.slotId = res.obj[index].slotId; item.portId = res.obj[index].portId; canvas.add(this.groupAdd(item, canvas)); }); requestAnimationFrame(() => { that.handleData2(""); }) this.$nextTick(function () { handleDataUtil.doEnything( this.dataSource, this.allData, "canvas", this.groupList, "" ); this.setDoBack(false); this.setDoUp(true); }) }); }); bus.$on("copyToOther", (data) => { let items = this.selectedBoxes; let ports = data.ports; let otherPorts = data.otherPorts; let resultData = []; for (let j = 0; j < ports.length; j++) { let index = -1; for (let i = 0; i < this.allData.length; i++) { if (this.allData[i].networkPort == otherPorts[j]) { if (this.allData[i].index >= index) { index = this.allData[i].index + 1; } } } if (index == -1) { index = 1; } for (let i = 0; i < items.length; i++) { if (items[i].networkPort == ports[j]) { let [x, y] = [0, 0]; if (items.length == 1) { [x, y] = [items[i].left, items[i].top]; } else { [x, y] = [items[i].matrixCache.value[4], items[i].matrixCache.value[5]]; } resultData.push({ rotationAngle: items[i].angle, areaId: this.areaId, networkPort: otherPorts[j], index: index + i, type: null, width: items[i].width, height: items[i].height, x: x + 30, y: y + 30, }); } } } let that = this; this.setAddBox(resultData, (res) => { res.obj.forEach((o) => { o.id = o.boxId; }); that.allData = that.allData.concat(res.obj); resultData.forEach((item, index) => { item.id = res.obj[index].boxId; canvas.add(this.groupAdd(item, canvas)); }); that.handleData2(""); that.$nextTick(function () { handleDataUtil.doEnything(this.dataSource, this.allData, "canvas", this.groupList, ""); //后退 this.setDoBack(false); this.setDoUp(true); }) }); }); bus.$on("deselectSource", () => { canvas.discardActiveObject(); canvas.requestRenderAll(); }); bus.$on("changeBoxType", (typeData) => { //批改箱体类型 let that = this; if (that.parms.type == "offline" && firstAdd) { that.addBoxParams[0].type = typeData.id that.addBoxParams[0].boxFileId = typeData.id that.addBoxParams[0].width = typeData.scan_w that.addBoxParams[0].height = typeData.scan_h canvas.remove(firstAdd); var createTextJson = JSON.parse(JSON.stringify(that.addBoxParams[0])); createTextJson.index = 0; firstAdd = this.groupAdd(createTextJson, canvas); console.log(firstAdd); canvas.add(firstAdd); return } let item = canvas.getActiveObjects(); let boxReqList = []; let changeIds = []; for (let index = 0; index < item.length; index++) { if (item[index].isCheckTo) { that.allData.forEach((e) => { if (item[index].id == e.id) { changeIds.push(e.id); boxReqList.push({ id: e.id, boxFileId: typeData.id, networkPort: e.networkPort, width: typeData.scan_w, height: typeData.scan_h, type: typeData.name }); } }); } else { let list = item[index]._objects list.forEach((item) => { that.allData.forEach((e) => { if (item.id == e.id) { changeIds.push(e.id); boxReqList.push({ id: e.id, boxFileId: typeData.id, networkPort: e.networkPort, width: typeData.scan_w, height: typeData.scan_h, type: typeData.name }); } }); }) } } if (boxReqList.length == 0) { return; } this.$axios({ method: "post", url: "/box/updateBox", data: { flag: 1, // 接口是否返回最新的箱体列表, 0否;1是 areaId: that.areaId, list: boxReqList, frame: 1, // 给后盾传参帧率,用于带载校验 }, }).then((res) => { if (res && res.status == 200) { if (res.obj) { for (var i = 0; i < res.obj.length; i++) { for (var j = 0; j < res.obj[i].list.length; j++) { res.obj[i].list[j].slotId = res.obj[i].slotId; } } } that.refreshCanvas(res, false); that.$nextTick(function () { handleDataUtil.doEnything(that.dataSource, that.allData, "canvas", this.groupList, ""); that.setDoBack(false); that.setDoUp(true); }) } else { that.$message(that.$t(res.msg)) } }); }); bus.$on("submitChangeType", (typeData) => { let that = this; let item = canvas.getObjects(); let boxes = []; let boxReqList = []; for (let i = 0; i < item.length; i++) { if ( item[i].type == "group" && item[i].groupId == "box" ) { boxes.push(item[i]); if (item[i].boxFileId == typeData.presentBoxType) { boxReqList.push({ id: item[i].id, boxFileId: typeData.otherBoxType, networkPort: item[i].networkPort, width: typeData.scan_w, height: typeData.scan_h, }); } } else if ( item[i].type == "group" && item[i].groupId != "box" ) { let objs = item[i]._objects; objs.forEach(o => { if (o.boxFileId == typeData.presentBoxType) { boxReqList.push({ id: o.id, boxFileId: typeData.otherBoxType, networkPort: o.networkPort, width: typeData.scan_w, height: typeData.scan_h, }); } }); } } if (boxReqList.length == 0) { return; } this.$axios({ method: "post", url: "/box/updateBox", data: { flag: 1, // 接口是否返回最新的箱体列表, 0否;1是 areaId: that.areaId, list: boxReqList, frame: 1, // 给后盾传参帧率,用于带载校验 }, }).then((res) => { if (res && res.status == 200) { if (res.obj) { for (var i = 0; i < res.obj.length; i++) { for (var j = 0; j < res.obj[i].list.length; j++) { res.obj[i].list[j].slotId = res.obj[i].slotId; } } } that.refreshCanvas(res); bus.$emit('closeTypeChange'); } else { that.$message(that.$t(res.msg)) } }); }); bus.$on("selectBoxesByPort", (port) => { canvas.discardActiveObject(); this.setSelectedBoxes([]); let portBoxes = []; let activeObjs = []; canvas.forEachObject((o) => { if (o.type == "group" && o.groupId == "box" && o.networkPort == port) { portBoxes.push(o); activeObjs.push(o); } else if (o.type == "group" && o.groupId == "box" && o.networkPort != port) { this.unselectecBoxes.push(o); } else if (o.type == "group" && o.groupId != "box") { let objs = o._objects; let flag = false; objs.forEach(obj => { if (obj.networkPort == port) { flag = true; } }); if (flag) { activeObjs.push(o); } } }); var sel = new fabric.ActiveSelection(activeObjs, { canvas: canvas, }); canvas.setActiveObject(sel); canvas.requestRenderAll(); this.setSelectedBoxes(portBoxes); let boxes = canvas.getObjects().filter((o) => { return o.type == "group" && o.groupId == "box" && o.id != "source"; }); if (boxes.length == portBoxes.length) { this.setSelectAll(true); } else { this.setSelectAll(false); } this.setSelectedBoxes(portBoxes); }); bus.$on("useThisLineWay", (data) => { let index = data.lineIndex; let port = data.port; if (port > -1) { // 以后是依据网口号来选中箱体并利用连线 console.log("以后是依据网口号来选中箱体并利用连线"); } let item = canvas.getActiveObjects(); let activeObject = canvas.getActiveObject(); if (!activeObject) { return; } let selectedIds = []; if (activeObject.type == "group" && activeObject.groupId != "box" && port == -1) { // 选中单个分组 let objs = activeObject._objects; objs.forEach((obj) => { selectedIds.push(obj.id); }); } else if ( activeObject.type == "group" && activeObject.groupId != "box" && port > -1 ) { // 通过网口来选中了某分组,再提取分组中该网口箱体 let _objs = activeObject._objects; _objs.forEach((o) => { if (o.networkPort == port) { selectedIds.push(o.id); } }); } else if (activeObject.type == "group" && activeObject.groupId == "box") { // 选中单个箱体 selectedIds.push(activeObject.id); } else if (activeObject.type == "activeSelection") { // 选中多个元素,箱体与分组都可能有 let objs = activeObject._objects; objs.forEach((obj) => { if (obj.type == "group" && obj.groupId == "box") { selectedIds.push(obj.id); } else if (obj.type == "group" && obj.groupId != "box") { let _objs = obj._objects; _objs.forEach((o) => { if (port > -1) { // 通过网口来选中了分组 + 箱体,从分组中提取该网口的箱体 if (o.networkPort == port) { selectedIds.push(o.id); } } else { selectedIds.push(o.id); } }); } }); } let selectedBoxes = []; for (let i = 0; i < this.allData.length; i++) { selectedIds.forEach((boxId) => { if (boxId == this.allData[i].id) { selectedBoxes.push(this.allData[i]); } }); } let boxes = connectionMode.getBoxOrder(this.allData, selectedBoxes, [], index, ""); if (boxes && boxes.length > 0) { let boxReqList = []; boxes.map((box) => { boxReqList = boxReqList.concat(box); }); this.setUpdateBox( boxReqList, (res) => { this.refreshCanvas(res, true, item, true); this.$nextTick(function () { handleDataUtil.doEnything( this.dataSource, this.allData, "canvas_connectionsLine", this.groupList, "" ); this.setDoBack(false); this.setDoUp(true); }) }, 1 ); } }); bus.$on("goBack", () => { var that = this; that.backMethods(); }); bus.$on("goForward", () => { var that = this; that.upMethods(); }); bus.$on("zoomIt", (num) => { // if (this.mode == "operateSource") { // return; // } this.getZoom(num); }); bus.$on("scrollZoom", (num) => { // if (!this.ctrlFlag || this.mode == "operateSource") { if (!this.ctrlFlag) { return; } this.getZoom(num); }); bus.$on("zoomItDrop", (num) => { this.zoomDrop(num); }); bus.$on("zoomToAllBoxes", callback => { let sel = []; canvas.forEachObject(o => { if (o.id != "source" && o.type == "group") { sel.push(o); } }) var selection = new fabric.ActiveSelection(sel, { canvas: canvas, }); canvas.setActiveObject(selection); let allBoxes = canvas.getActiveObject(); // console.log(allBoxes); // return; if (!allBoxes || allBoxes._objects.length == 0) { return; } console.log(allBoxes); // return; let canGrid = document.getElementById("canGrid"); let num = this.limitSourceSpace; let { left, top, width, height } = allBoxes; // allBoxes.left = left + 1; // allBoxes.width = width - 1; // allBoxes.height = height - 1; // allBoxes.top = top - 1; if ( top + height <= parseInt(canGrid.style.top) / this.canvasZoom + num || left + width <= parseInt(canGrid.style.left) / this.canvasZoom + num || top >= parseInt(canGrid.style.top) / this.canvasZoom + canGrid.height / this.canvasZoom - num || left >= parseInt(canGrid.style.left) / this.canvasZoom + canGrid.width / this.canvasZoom - num ) { allBoxes = null; } callback && callback(allBoxes , () => { canvas.discardActiveObject(); canvas.requestRenderAll(); }); }); bus.$on("editGroupAngle", v => { let that = this; let val = canvas.getActiveObject(); if (!val) { return; } let originAngle = parseFloat(val.angle); console.log("批改分组旋转角度---" + v); let [left, top] = [val.ownMatrixCache.value[4], val.ownMatrixCache.value[5]]; val.set({ originX: 'center', originY: 'center', angle: parseFloat(v), }).setCoords() val.set({ left, top, }).setCoords() canvas.renderAll(); let boxReqList = []; var groupId = ""; var groupAngle = ""; if (val.type == "group") { val._objects.forEach((obj, i) => { that.allData.forEach((item, k) => { if (item.id == obj.id) { groupId = obj.groupIdd; groupAngle = originAngle; item.rotationAngle = (parseFloat(val.angle) + parseFloat(obj.angle)) % 360 let gg = that.rotatoNi( item.x, item.y, left, top, (parseFloat(val.angle) - originAngle) % 360 // 同val.angle ); item.x = gg.x; item.y = gg.y; item.operateType = "manualRotate"; boxReqList.push(item); } }); obj._objects[2].set({ angle: -((parseFloat(val.angle) + parseFloat(obj.angle)) % 360) }).setCoords() }); } else if (val.type == "activeSelection") { val._objects[0]._objects.forEach((obj, i) => { that.allData.forEach((item, k) => { if (item.id == obj.id) { item.rotationAngle = (parseFloat(obj.angle) + parseFloat(val.angle)) % 360 let gg = that.rotatoNi( item.x, item.y, val.left, val.top, parseFloat(val.angle) ); item.x = gg.x; item.y = gg.y; item.operateType = "manualRotate"; boxReqList.push(item); } }); obj._objects[2].set({ angle: -((parseFloat(val.angle) + parseFloat(obj.angle)) % 360) }).setCoords() }); } // console.log(groupId); // this.handleData2('manualRotate') this.setUpdateBox(boxReqList, (res) => { // 获取箱体列表刷新画布 let arr = []; if (res.obj && res.obj.length > 0) { let array = res.obj; for (let i = 0; i < array.length; i++) { let item = array[i].list; for (let index = 0; index < item.length; index++) { let data = item[index]; arr.push(data); } } } arr = that.printaCoords_b(arr); that.allData = arr; this.handleData2('manualRotate') that.$nextTick(function () { handleDataUtil.doEnything( that.dataSource, that.allData, "canvas", that.groupList, '', groupId, groupAngle, v ); that.setDoBack(false); that.setDoUp(true); }); }, 1); }); this.$nextTick(() => { this.getFrame(); let that = this; let params = { params: {}, success (res) { }, error (res) { }, }; this.$store.dispatch('getGlobalSettings', params) this.originData = JSON.parse(JSON.stringify(this.sourceData)); this.initGrid(); this.initCanvas(); window.onresize = () => { this.initGrid(); }; document.getElementById("canvasBox").oncontextmenu = function (event) { if (event.button == 2) { //右键退出 rightKey = false; event.returnValue = false; that.setShowBack(false); that.setAddBoxMode(false); that.setMaskLeftMenu(false); //str--右键退出自定义连线状态 that.quitAddRect(); that.setActiveConnectLine(true); // if (that.selectedBoxes.length > 0) { if (that.selectedBoxes.length > 1) { // 单个箱体分组一期不做 that.setActiveMakeGroup(true); } } }; document.onkeydown = function (e) { let key = e || window.event.keyCode; // if(that.dowmMoseList.length == 3 && that.dowmMoseList.indexOf("Control") != -1 && that.dowmMoseList.indexOf("Shift") != -1 && that.dowmMoseList.indexOf("Shift")){ // } if (that.ctrlFlag && that.mode != "operateSource") { if (key.key == 'ArrowUp') { let boxReqList = [] let selectBoxes = canvas.getActiveObject() if (selectBoxes.isCheckTo) { //单个 selectBoxes.set({ top: selectBoxes.top - 1 }) that.allData.forEach((item) => { if (selectBoxes.id == item.id) { item.y = selectBoxes.top - 1 boxReqList.push(item) } }); } else { let obj = selectBoxes._objects selectBoxes.set({ top: selectBoxes.top - 1 }) if (selectBoxes.type == 'activeSelection') { obj.forEach((o) => { if (o.isCheckTo) {//框选中的多个箱体 that.allData.forEach((item) => { if (o.id == item.id) { item.y = o.matrixCache.value[5] - 1 boxReqList.push(item) } }); } else { //框选中的分组 o._objects.forEach((t) => { that.allData.forEach((item) => { if (t.id == item.id) { item.y = o.matrixCache.value[5] + t.top - 1 boxReqList.push(item) } }); }) } }) } else { obj.forEach((o) => { if (o.isCheckTo) {//纯分组 that.allData.forEach((item) => { if (o.id == item.id) { item.y = selectBoxes.ownMatrixCache.value[5] + o.top - 1 boxReqList.push(item) } }); } }) } } that.handleData2(''); canvas.renderAll(); if (boxReqList.length > 0) { that.setUpdateBox( boxReqList, (res) => { let arr = []; if (res.obj && res.obj.length > 0) { let array = res.obj; for (let i = 0; i < array.length; i++) { let item = array[i].list; for (let index = 0; index < item.length; index++) { let data = item[index]; arr.push(data); } } } arr = that.printaCoords_b(arr); that.allData = arr; that.allData2 = JSON.parse(JSON.stringify(that.allData)); }, 1 ); } } if (key.key == 'ArrowRight') { let boxReqList = [] let selectBoxes = canvas.getActiveObject() if (selectBoxes.isCheckTo) { //单个 selectBoxes.set({ left: selectBoxes.left + 1 }) that.allData.forEach((item) => { if (selectBoxes.id == item.id) { item.x = selectBoxes.left + 1 boxReqList.push(item) } }); } else { let obj = selectBoxes._objects selectBoxes.set({ left: selectBoxes.left + 1 }) if (selectBoxes.type == 'activeSelection') { obj.forEach((o) => { if (o.isCheckTo) {//框选中的多个箱体 that.allData.forEach((item) => { if (o.id == item.id) { item.x = o.matrixCache.value[4] + 1 boxReqList.push(item) } }); } else { //框选中的分组 o._objects.forEach((t) => { that.allData.forEach((item) => { if (t.id == item.id) { item.x = o.matrixCache.value[4] + t.left + 1 boxReqList.push(item) } }); }) } }) } else { obj.forEach((o) => { if (o.isCheckTo) {//纯分组 that.allData.forEach((item) => { if (o.id == item.id) { item.x = selectBoxes.ownMatrixCache.value[4] + o.left + 1 boxReqList.push(item) } }); } }) } } that.handleData2(''); canvas.renderAll(); if (boxReqList.length > 0) { that.setUpdateBox( boxReqList, (res) => { let arr = []; if (res.obj && res.obj.length > 0) { let array = res.obj; for (let i = 0; i < array.length; i++) { let item = array[i].list; for (let index = 0; index < item.length; index++) { let data = item[index]; arr.push(data); } } } arr = that.printaCoords_b(arr); that.allData = arr; that.allData2 = JSON.parse(JSON.stringify(that.allData)); }, 1 ); } } if (key.key == 'ArrowDown') { let boxReqList = [] let selectBoxes = canvas.getActiveObject() if (selectBoxes.isCheckTo) { //单个 selectBoxes.set({ top: selectBoxes.top + 1 }) that.allData.forEach((item) => { if (selectBoxes.id == item.id) { item.y = selectBoxes.top + 1 boxReqList.push(item) } }); } else { let obj = selectBoxes._objects selectBoxes.set({ top: selectBoxes.top + 1 }) if (selectBoxes.type == 'activeSelection') { obj.forEach((o) => { if (o.isCheckTo) {//框选中的多个箱体 that.allData.forEach((item) => { if (o.id == item.id) { item.y = o.matrixCache.value[5] + 1 boxReqList.push(item) } }); } else { //框选中的分组 o._objects.forEach((t) => { that.allData.forEach((item) => { if (t.id == item.id) { item.y = o.matrixCache.value[5] + t.top + 1 boxReqList.push(item) } }); }) } }) } else { obj.forEach((o) => { if (o.isCheckTo) {//纯分组 that.allData.forEach((item) => { if (o.id == item.id) { item.y = selectBoxes.ownMatrixCache.value[5] + o.top + 1 boxReqList.push(item) } }); } }) } } that.handleData2(''); canvas.renderAll(); if (boxReqList.length > 0) { that.setUpdateBox( boxReqList, (res) => { let arr = []; if (res.obj && res.obj.length > 0) { let array = res.obj; for (let i = 0; i < array.length; i++) { let item = array[i].list; for (let index = 0; index < item.length; index++) { let data = item[index]; arr.push(data); } } } arr = that.printaCoords_b(arr); that.allData = arr; that.allData2 = JSON.parse(JSON.stringify(that.allData)); }, 1 ); } } if (key.key == 'ArrowLeft') { let boxReqList = [] let selectBoxes = canvas.getActiveObject() if (selectBoxes.isCheckTo) { //单个 selectBoxes.set({ left: selectBoxes.left - 1 }) that.allData.forEach((item) => { if (selectBoxes.id == item.id) { item.x = selectBoxes.left - 1 boxReqList.push(item) } }); } else { let obj = selectBoxes._objects selectBoxes.set({ left: selectBoxes.left - 1 }) if (selectBoxes.type == 'activeSelection') { obj.forEach((o) => { if (o.isCheckTo) {//框选中的多个箱体 that.allData.forEach((item) => { if (o.id == item.id) { item.x = o.matrixCache.value[4] - 1 boxReqList.push(item) } }); } else { //框选中的分组 o._objects.forEach((t) => { that.allData.forEach((item) => { if (t.id == item.id) { item.x = o.matrixCache.value[4] + t.left - 1 boxReqList.push(item) } }); }) } }) } else { obj.forEach((o) => { if (o.isCheckTo) {//纯分组 that.allData.forEach((item) => { if (o.id == item.id) { item.x = selectBoxes.ownMatrixCache.value[4] + o.left - 1 boxReqList.push(item) } }); } }) } } that.handleData2(''); canvas.renderAll(); if (boxReqList.length > 0) { that.setUpdateBox( boxReqList, (res) => { let arr = []; if (res.obj && res.obj.length > 0) { let array = res.obj; for (let i = 0; i < array.length; i++) { let item = array[i].list; for (let index = 0; index < item.length; index++) { let data = item[index]; arr.push(data); } } } arr = that.printaCoords_b(arr); that.allData = arr; that.allData2 = JSON.parse(JSON.stringify(that.allData)); }, 1 ); } } } if (that.dowmMoseList.indexOf(key.key) == -1) { that.dowmMoseList.push(key.key); } if (key.key == "Delete") { if (!canvas.getActiveObject()) { return; } that.deleteBox(); } if (key.key == "Control") { that.ctrlFlag = true; } if (key.key == "Shift") { that.shiftFlag = true; } // console.log(that.dowmMoseList); if ((key.key == "z" || key.key == "Z") && (that.dowmMoseList.length == 3 && that.dowmMoseList.indexOf("Control") != -1 && that.dowmMoseList.indexOf("Shift") != -1) && that.ctrlShiftA_number == 0) { that.ctrlShiftA_number = 1; if (that.doUp == false) { console.log("我进入后退"); that.upMethods(); } } if ((key.key == "z" || key.key == "Z") && (that.dowmMoseList.length == 2 && that.dowmMoseList.indexOf("Control") != -1) && that.ctrlShiftA_number == 0) { that.ctrlShiftA_number = 1; if (that.doBack == false) { console.log("我进入后退"); that.backMethods(); } } if ((key.key == "a" || key.key == "A") && that.ctrlFlag) { console.log("全选"); let objs = canvas.getObjects(); if (objs.length == 1 || (that.mode != "canvas" && that.mode != "box")) { // 只有一个源,没有箱体 return; } canvas.discardActiveObject(); let sel = []; let boxes = []; objs.map((item) => { if (item.id != "source" && item.type == "group" && item.groupId == "box") { boxes.push(item); sel.push(item); } else if ( item.id != "source" && item.type == "group" && item.groupId != "box" ) { that.groupList.forEach(group => { if (group.id == item.id && !group.hidden) { boxes.push(item); sel.push(item); } }) } }); var selection = new fabric.ActiveSelection(sel, { canvas: canvas, }); canvas.setActiveObject(selection); canvas.requestRenderAll(); that.setSelectAll(true); that.setSelectedBoxes(boxes); return false; } if ((key.key == "c" || key.key == "C") && that.ctrlFlag) { console.log("复制"); that.cutBoxFlag = false; that.copyBoxFlag = true; } if ((key.key == "x" || key.key == "X") && that.ctrlFlag) { console.log("剪切"); that.copyBoxFlag = false; that.copyKeyNum = 1; that.cutBoxFlag = true; } if ((key.key == "v" || key.key == "V") && that.ctrlFlag) { if (that.selectedBoxes.length == 0) { return; } if (that.copyBoxFlag) { console.log("复制粘贴"); that.copyKeyNum += 1 let ports = []; let items = that.selectedBoxes; for (let i = 0; i < items.length; i++) { ports.push(items[i].networkPort); } that.copy2Me(ports); } else if (that.cutBoxFlag) { let canvasBoxDom = document.getElementById("canvasBox"); let [x, y, l, t, w, h] = [ that.mousePosition.x, that.mousePosition.y, that.getOffsetLeft(canvasBoxDom), that.getOffsetTop(canvasBoxDom), canvasBoxDom.offsetWidth, canvasBoxDom.offsetHeight, ]; if (!(x <= l || x >= l + w || y <= t || y >= t + h)) { that.cutBoxFlag = false; console.log("剪切粘贴"); let boxReqList = []; if ( that.selectedBoxes.length == 1 && that.selectedBoxes[0].type == "group" && that.selectedBoxes[0].groupId == "box" ) { for (let i = 0; i < that.allData.length; i++) { if ( that.allData[i].networkPort == that.selectedBoxes[0].networkPort && that.allData[i].index == that.selectedBoxes[0].index ) { that.allData[i].x = x - l; that.allData[i].y = y - t; boxReqList.push(that.allData[i]); } } } else { for (let i = 0; i < that.allData.length; i++) { for (let j = 0; j < that.selectedBoxes.length; j++) { if ( that.allData[i].networkPort == that.selectedBoxes[j].networkPort && that.allData[i].index == that.selectedBoxes[j].index ) { that.allData[i].x = x - l + that.selectedBoxes[j].left; that.allData[i].y = y - t + that.selectedBoxes[j].top; boxReqList.push(that.allData[i]); } } } } that.setUpdateBox(boxReqList, (res) => { if (that.selectedBoxes.length == 1) { that.selectedBoxes[0].set({ left: x - l, top: y - t }).setCoords(); } else { let selection = canvas.getActiveObject(); let ownMatrixCache = selection.ownMatrixCache; let changeX = x - l - ownMatrixCache.value[4]; let changeY = y - t - ownMatrixCache.value[5]; ownMatrixCache.value[4] = x - l; ownMatrixCache.value[5] = y - t; selection .set({ ownMatrixCache: ownMatrixCache, left: changeX + selection.left, top: changeY + selection.top, }) .setCoords(); let objs = selection._objects; objs.forEach((item) => { let matrixCache = item.matrixCache; matrixCache.value[4] = x - l + item.left; matrixCache.value[5] = y - t + item.top; item.set({ matrixCache: matrixCache }).setCoords(); }); } that.handleData2(""); canvas.renderAll(); }); } } that.$nextTick(function () { handleDataUtil.doEnything( that.dataSource, that.allData, "canvas", that.groupList, "" ); that.setDoBack(false); that.setDoUp(true); }); } if (key.key == "ArrowUp" && that.mode == "operateSource" && that.sourceMoveEnable && !that.focusPropertyFlag) { let sourceData = JSON.parse(JSON.stringify(that.sourceData)); that.setSourceData({ left: Math.round(sourceData.left), top: Math.round(sourceData.top - 1), width: Math.round(sourceData.width), height: Math.round(sourceData.height), }); that.moveSourceByKeyboard(); } if ( key.key == "ArrowDown" && that.mode == "operateSource" && that.sourceMoveEnable && !that.focusPropertyFlag ) { let sourceData = JSON.parse(JSON.stringify(that.sourceData)); that.setSourceData({ left: Math.round(sourceData.left), top: Math.round(sourceData.top + 1), width: Math.round(sourceData.width), height: Math.round(sourceData.height), }); that.moveSourceByKeyboard(); } if ( key.key == "ArrowLeft" && that.mode == "operateSource" && that.sourceMoveEnable && !that.focusPropertyFlag ) { let sourceData = JSON.parse(JSON.stringify(that.sourceData)); that.setSourceData({ left: Math.round(sourceData.left - 1), top: Math.round(sourceData.top), width: Math.round(sourceData.width), height: Math.round(sourceData.height), }); that.moveSourceByKeyboard(); } if ( key.key == "ArrowRight" && that.mode == "operateSource" && that.sourceMoveEnable && !that.focusPropertyFlag ) { let sourceData = JSON.parse(JSON.stringify(that.sourceData)); that.setSourceData({ left: Math.round(sourceData.left + 1), top: Math.round(sourceData.top), width: Math.round(sourceData.width), height: Math.round(sourceData.height), }); that.moveSourceByKeyboard(); } }; document.onkeyup = function (e) { let key = e || window.event.keyCode; for (var i = that.dowmMoseList.length - 1; i >= 0; i--) { if (that.dowmMoseList[i].toUpperCase() == key.key.toUpperCase()) { that.dowmMoseList.splice(i, 1); } } if (key.key == "Control") { that.ctrlFlag = false; // that.ctrlShiftA_number = 0; } if (key.key == "Shift") { that.shiftFlag = false; // that.ctrlShiftA_number = 0; } if (key.key == "Z" || key.key == "z") { that.ctrlShiftA_number = 0; } }; document.onmousemove = function (e) { e = e || window.event; if (e.pageX || e.pageY) { that.$set(that.mousePosition, "x", e.pageX); that.$set(that.mousePosition, "y", e.pageY); if (that.cutMaskFlag) { that.resizeMoving(); } } }; document.onmouseup = function (e) { if (that.cutMaskFlag) { that.cutMaskFlag = false; that.cutMaskType = ""; that.cutRate = 1; } }; }) }, beforeDestroy () { bus.$off("setToRightBox"); bus.$off("renderSource"); bus.$off("drawSource"); bus.$off("disableSource"); bus.$off("showMask"); bus.$off("setProCon"); bus.$off("toolDelete"); bus.$off("toolSelectAll"); bus.$off("disgardObjs"); bus.$off("makeGroup"); bus.$off("breakGroup"); bus.$off("hideShowGroup"); bus.$off("showHiddenGroups"); bus.$off("hideHiddenGroups"); bus.$off("changeLine"); bus.$off("breakLine"); bus.$off("selectGroup"); bus.$off("changePort"); bus.$off("copyToMe"); bus.$off("backChange"); bus.$off("copyDoEnything"); bus.$off("copyToOther"); bus.$off("deselectSource"); bus.$off("changeBoxType"); bus.$off("submitChangeType"); bus.$off("selectBoxesByPort"); bus.$off("useThisLineWay"); bus.$off("goBack"); bus.$off("goForward"); bus.$off("zoomIt"); bus.$off("scrollZoom"); bus.$off("zoomItDrop"); bus.$off("zoomToAllBoxes"); bus.$off("editGroupAngle"); }, watch: { allGroup (n) { this.setAllGroupData(n); }, currentMode (n, o) { var that = this; if (n.indexOf("canvas_") != -1) { handleDataUtil.signOutAll(that.dataSource); handleDataUtil.doEnything( that.dataSource, that.allData, "canvas_offline", that.groupList, "otherInit" ); } if (n.indexOf("canvas_") != -1 && n != "canvas") { this.setDoBack(true); this.setDoUp(true); } if (n == "canvas") { var returnData = handleDataUtil.getUpOrBack(this.dataSource, "canvas"); this.setDoBack(returnData.back); this.setDoUp(returnData.up); } if (n == "canvas_offline" || n == "canvas_online") { this.setNotAddBoxFlag(false); this.setActiveMakeGroup(false); } else { this.setNotAddBoxFlag(true); } if (n == 'canvas_connectionsLine') { this.groupIsbler(true) } // this.loadNumber++; }, isChangeLine (val) { this.groupIsbler(val) if (val) { this.getboxList(true, () => { canvas.forEachObject((obj, i) => { if (obj.type == "group") { obj.set({ selectable: false }); console.log("所有箱体禁止挪动"); } }); }) } else { this.getboxList(false, () => { canvas.forEachObject((obj, i) => { if (obj.type == "group") { obj.set({ selectable: true, evented: true }); console.log("所有箱体禁止挪动"); } }); }) } }, areaId (n) { // return; this.getboxList(false, () => { this.zoomCanvas(this.canvasZoom, 1); }); }, changeNetWork (n) { this.getboxList(); }, mode (n) { if (n != "box" && n != "canvas") { this.copyBoxFlag = false; this.copyKeyNum = 1; } if (n == "operateSource") { canvas.discardActiveObject(); sourceCanvas.set({ hoverCursor: "pointer", selectable: true, evented: true, }); canvas.forEachObject((obj) => { if (obj.type == "group" && obj.id != "source") { obj.set({ hoverCursor: "normal", selectable: false, evented: false, }); } }); this.canvasBox.renderAll(); } else { if (!this.isChangeLine) { if (sourceCanvas && sourceCanvas.id == "source") { sourceCanvas.set({ hoverCursor: "normal", selectable: false, evented: false, }); canvas.forEachObject((obj) => { if (obj.type == "group" && obj.id != "source") { if (obj.groupId == "box") { obj.set({ hoverCursor: "pointer", selectable: true, evented: true, }); } else { obj.set({ hoverCursor: "move", selectable: true, evented: true, }); } } }); this.canvasBox.renderAll(); } } } if (n == 'boxLine16') { // this.groupIsbler(true) } }, gridShow (n, o) { this.initGrid(); }, canvasColor (n) { this.initGrid(); }, canvasSpace (n) { this.initGrid(); }, canvasSize (n, o) { //console.log(n) this.initGrid(); // console.log(n.width * 2 * this.canvasZoom); var maxWidth = document.getElementById("canvasBox"); // console.log(maxWidth.offsetWidth); this.canvasBox.setWidth(n.width * 2 * this.canvasZoom < maxWidth.offsetWidth ? maxWidth.offsetWidth : n.width * 1.5 * this.canvasZoom); this.canvasBox.setHeight(n.height * 1.5 * this.canvasZoom); this.gridLeft = (n.width * this.canvasZoom) / 4 + "px"; this.gridTop = (n.height * this.canvasZoom) / 4 + "px"; this.setBlackCanvasBackGorund({ gridLeft: (n.width * this.canvasZoom) / 4, gridTop: (n.height * this.canvasZoom) / 4, }) this.canvasBox.renderAll(); this.getboxList_yg(); if (o.width && o.height) { let [gridLeft, gridTop] = [ this.canvasSize.width / 4, this.canvasSize.height / 4 ]; let [ogridLeft, ogridTop] = [ o.width / 4, o.height / 4 ]; let data = { left: this.sourceData.left - ogridLeft + gridLeft, top: this.sourceData.top - ogridTop + gridTop, width: this.sourceData.width, height: this.sourceData.height } sourceCanvas.set(data); this.setSourceData(data); this.canvasBox.renderAll(); } // 设置屏幕区域滚动条地位 let canvasZone = document.getElementById("canvasZone"); let [canvasZoneW, canvasZoneH] = [canvasZone.offsetWidth, canvasZone.offsetHeight]; if (n.width * this.canvasZoom > canvasZoneW / 3 * 2) { canvasZone.scrollLeft = (n.width / 4) * this.canvasZoom; } if (n.height * this.canvasZoom > canvasZoneH / 3 * 2) { canvasZone.scrollTop = (n.height / 4) * this.canvasZoom; } }, selectGroupIndex (n) { if (n > -1) { if (!this.groupList[n].hidden && this.mode != "boxLine16") { this.setActiveDeleteBox(true); } else { this.setActiveDeleteBox(false); } } }, selectedBoxes (n) { // console.log(canvas.getObjects); if (n.length == 0) { this.copyBoxFlag = false; this.copyKeyNum = 1; } //////用于高亮显示选中所有箱体 let objs_ = canvas.getActiveObjects(); var canList = canvas.getObjects(); if (this.mode == "boxLine16") { //这时候的选中要变色彩 for (var i = 0; i < canList.length; i++) { if (canList[i].type == "group" && canList[i].groupId != "box") { canList[i]._objects.forEach(o => { o._objects[0].set({ stroke: "#136094" }) }) } if (canList[i].groupId == "box") { canList[i].item(0).set({ stroke: "#136094", }) } } for (var i = 0; i < objs_.length; i++) { if (objs_[i].groupId == 'box') { objs_[i].item(0).set({ stroke: "#0099FF", }) } if (objs_[i].groupIdd != 0 && !objs_[i].groupIdd) { objs_[i]._objects.forEach(o => { o._objects[0].set({ stroke: "#0099FF", }) }) } } } if (objs_.length == 0) { for (var i = 0; i < canList.length; i++) { if (canList[i].type == "group" && canList[i].groupId != "box") { canList[i]._objects.forEach(o => { o._objects[0].set({ stroke: "#136094" }) }) } } } canvas.renderAll(); ///////////// if (n.length == 0 && this.mode != "operateSource" && this.mode != "boxLine16") { if (this.currentMode == 'canvas_editLine') { this.setMode("box"); } else { if (this.currentMode != "canvas_offline") { this.setMode("canvas"); } } this.setActiveBreakLine(false); this.setActiveDeleteBox(false); this.setSelectAll(false); } let objs = canvas.getActiveObject(); if (objs && objs.type == "group" && objs.groupId != "box") { if (this.mode != "boxLine16") { this.setActiveMakeGroup(false); if (this.currentMode != "canvas_editLine" && this.currentMode != "canvas_online" && this.currentMode != "canvas_offline") { this.setActiveBreakGroup(true); this.setActiveDeleteBox(true); this.setMode("group"); } } let groupId = objs.id; for (let i = 0; i < this.groupList.length; i++) { if ( this.groupList[i].areaId == this.areaId && this.groupList[i].id == groupId ) { this.setSelectGroupIndex(i); break; } } this.setActiveBreakLine(false); } else { this.setSelectGroupIndex(-1); this.setActiveBreakGroup(false); if ( objs && objs.id != "source" && this.mode != "operateSource" && this.mode != "boxLine16" ) { this.setMode("box"); this.setActiveBreakLine(true); if (this.currentMode != "canvas_online" && this.currentMode != "canvas_offline") { this.setActiveDeleteBox(true); } } } let niceP = canvas.getActiveObject(); if (niceP) { requestAnimationFrame(() => { bus.$emit("getRightBoxDetail", niceP); }) } else { bus.$emit("getRightBoxDetail", {}); } }, allData (n) { this.$store.state.allBoxData = n; }, maskLeft (n) { let maskWidth = this.sourceData.width - parseInt(n) - parseInt(this.maskRight); if (maskWidth < 140 && maskWidth >= 100) { this.handerWidth = 20; } else if (maskWidth < 100) { this.handerWidth = 10; } else if (maskWidth >= 140) { this.handerWidth = 40; } bus.$emit("changeCutMaskSize", { maskLeft: this.maskLeft, maskTop: this.maskTop, maskRight: this.maskRight, maskBottom: this.maskBottom, }); }, maskTop (n) { let maskHeight = this.sourceData.height - parseInt(n) - parseInt(this.maskBottom); if (maskHeight < 140 && maskHeight >= 100) { this.handerHeight = 20; } else if (maskHeight < 100) { this.handerHeight = 10; } else if (maskHeight >= 140) { this.handerHeight = 40; } bus.$emit("changeCutMaskSize", { maskLeft: this.maskLeft, maskTop: this.maskTop, maskRight: this.maskRight, maskBottom: this.maskBottom, }); }, maskRight (n) { let maskWidth = this.sourceData.width - parseInt(n) - parseInt(this.maskLeft); if (maskWidth < 140 && maskWidth >= 100) { this.handerWidth = 20; } else if (maskWidth < 100) { this.handerWidth = 10; } else if (maskWidth >= 140) { this.handerWidth = 40; } bus.$emit("changeCutMaskSize", { maskLeft: this.maskLeft, maskTop: this.maskTop, maskRight: this.maskRight, maskBottom: this.maskBottom, }); }, maskBottom (n) { let maskHeight = this.sourceData.height - parseInt(n) - parseInt(this.maskTop); if (maskHeight < 140 && maskHeight >= 100) { this.handerHeight = 20; } else if (maskHeight < 100) { this.handerHeight = 10; } else if (maskHeight >= 140) { this.handerHeight = 40; } bus.$emit("changeCutMaskSize", { maskLeft: this.maskLeft, maskTop: this.maskTop, maskRight: this.maskRight, maskBottom: this.maskBottom, }); }, }, methods: { ...mapMutations({ setSourceData: "setSourceData", setCut: "setCut", setSelectedBoxes: "setSelectedBoxes", setSelectAll: "setSelectAll", setActiveMakeGroup: "setActiveMakeGroup", setActiveBreakGroup: "setActiveBreakGroup", setActiveDeleteBox: "setActiveDeleteBox", setGroupList: "setGroupList", setSelectGroupIndex: "setSelectGroupIndex", setMode: "setMode", setShowBack: "setShowBack", setMaskLeftMenu: "setMaskLeftMenu", setIs_show_mask: "setIs_show_mask", setBoxType: "setBoxType", setAddBoxMode: "setAddBoxMode", setActiveChangeLine: "setActiveChangeLine", setActiveConnectLine: "setActiveConnectLine", setCanvasZoom: "setCanvasZoom", setActiveBreakLine: "setActiveBreakLine", setDoUp: "setDoUp", setDoBack: "setDoBack", setCurrentMode: "setCurrentMode", setNotAddBoxFlag: "setNotAddBoxFlag", setGroupAngle: "setGroupAngle", setBlackCanvasBackGorund: "setBlackCanvasBackGorund", setAllGroupData: "setAllGroupData", setEditCutFlag: "setEditCutFlag", }), // 吸附到箱体 adsorbentToBox (moveBox, direction, tlX, tlY, blX, blY, trX, trY, brX, brY, index1, index2, index3, line1, type) { let that = this; let arr = [tlX, tlY, blX, blY, trX, trY, brX, brY]; let [moveBoxLX, moveBoxRX, moveBoxTY, moveBoxBY] = []; if (type == "add") { if (moveBox.angle / 90 % 2 == 1) { [moveBoxLX, moveBoxRX, moveBoxTY, moveBoxBY] = [ moveBox.x - moveBox.height / 2, moveBox.x + moveBox.height / 2, moveBox.y - moveBox.width / 2, moveBox.y + moveBox.width / 2 ]; } else { [moveBoxLX, moveBoxRX, moveBoxTY, moveBoxBY] = [ moveBox.x - moveBox.width / 2, moveBox.x + moveBox.width / 2, moveBox.y - moveBox.height / 2, moveBox.y + moveBox.height / 2 ]; } // [moveBoxLX, moveBoxRX, moveBoxTY, moveBoxBY] = [ // moveBox.x - moveBox.width / 2, moveBox.x + moveBox.width / 2, // moveBox.y - moveBox.height / 2, moveBox.y + moveBox.height / 2 // ]; } else if (type == "move") { if (moveBox.angle / 90 % 2 == 1) { [moveBoxLX, moveBoxRX, moveBoxTY, moveBoxBY] = [ moveBox.left - moveBox.height / 2, moveBox.left + moveBox.height / 2, moveBox.top - moveBox.width / 2, moveBox.top + moveBox.width / 2 ]; } else { [moveBoxLX, moveBoxRX, moveBoxTY, moveBoxBY] = [ moveBox.left - moveBox.width / 2, moveBox.left + moveBox.width / 2, moveBox.top - moveBox.height / 2, moveBox.top + moveBox.height / 2 ]; } // [moveBoxLX, moveBoxRX, moveBoxTY, moveBoxBY] = [ // moveBox.left - moveBox.width / 2, moveBox.left + moveBox.width / 2, // moveBox.top - moveBox.height / 2, moveBox.top + moveBox.height / 2 // ]; } if (line1.indexOf("t") == 0) { if (moveBoxTY <= arr[index2] + that.adsorbent && moveBoxBY >= arr[index1] - that.adsorbent) { let top = isNaN(moveBox.top) ? moveBox.y : moveBox.top; if (Math.abs(moveBoxTY - arr[index2]) <= that.adsorbent) { top = arr[index2] + (direction == 'h' ? moveBox.height / 2 : moveBox.width / 2); } else if (Math.abs(moveBoxBY - arr[index1]) <= that.adsorbent) { top = arr[index1] - (direction == 'h' ? moveBox.height / 2 : moveBox.width / 2); } else if (Math.abs(moveBoxTY - arr[index1]) <= that.adsorbent) { top = arr[index1] + (direction == 'h' ? moveBox.height / 2 : moveBox.width / 2); } else if (Math.abs(moveBoxBY - arr[index2]) <= that.adsorbent) { top = arr[index2] - (direction == 'h' ? moveBox.height / 2 : moveBox.width / 2); } if (line1 == "tl") { if (type == "add") { moveBox.left = arr[index3] + (direction == 'h' ? moveBox.width / 2 : moveBox.height / 2); moveBox.top = top; } else if (type == "move") { moveBox.set({ left: arr[index3] + (direction == 'h' ? moveBox.width / 2 : moveBox.height / 2), top, }).setCoords(); } } else if (line1 == "tr") { if (type == "add") { moveBox.left = arr[index3] - (direction == 'h' ? moveBox.width / 2 : moveBox.height / 2); moveBox.top = top; } else if (type == "move") { moveBox.set({ left: arr[index3] - (direction == 'h' ? moveBox.width / 2 : moveBox.height / 2), top, }).setCoords(); } } } } else { if (moveBoxLX <= arr[index2] + that.adsorbent && moveBoxRX >= arr[index1] - that.adsorbent) { let left = isNaN(moveBox.left) ? moveBox.x : moveBox.left; if (Math.abs(moveBoxLX - arr[index2]) <= that.adsorbent) { left = arr[index2] + (direction == 'h' ? moveBox.width / 2 : moveBox.height / 2); } else if (Math.abs(moveBoxRX - arr[index2]) <= that.adsorbent) { left = arr[index2] - (direction == 'h' ? moveBox.width / 2 : moveBox.height / 2); } else if (Math.abs(moveBoxLX - arr[index1]) <= that.adsorbent) { left = arr[index1] + (direction == 'h' ? moveBox.width / 2 : moveBox.height / 2); } else if (Math.abs(moveBoxRX - arr[index1]) <= that.adsorbent) { left = arr[index1] - (direction == 'h' ? moveBox.width / 2 : moveBox.height / 2); } if (line1 == "add") { if (type == "add") { moveBox.left = left; moveBox.top = arr[index3] + (direction == 'h' ? moveBox.height / 2 : moveBox.width / 2); } else if (type == "move") { moveBox.set({ left, top: arr[index3] + (direction == 'h' ? moveBox.height / 2 : moveBox.width / 2), }).setCoords(); } } else if (line1 == "reduce") { if (type == "add") { moveBox.left = left; moveBox.top = arr[index3] - (direction == 'h' ? moveBox.height / 2 : moveBox.width / 2); } else if (type == "move") { moveBox.set({ left, top: arr[index3] - (direction == 'h' ? moveBox.height / 2 : moveBox.width / 2), }).setCoords(); } } } } }, groupIsbler (isbl) { if (isbl) { canvas.forEachObject((obj, i) => { if (obj.type == "group") { obj.set({ selectable: false }); console.log("所有箱体禁止挪动"); } }); } else { canvas.forEachObject((obj, i) => { if (obj.type == "group") { obj.set({ selectable: true, evented: true }); console.log("所有箱体能够挪动"); } }); } canvas.renderAll(); }, upMethods () { var that = this; var returnDate = handleDataUtil.upEnything(this.dataSource, this.currentMode); this.setDoBack(returnDate.isback); this.setDoUp(returnDate.isup); // if (returnDate.data) { this.setRestBox(returnDate.data, res => { if (res == "400" || res.status == 302) { var resStatus = handleDataUtil.backEnything(this.dataSource, this.currentMode); this.setDoBack(returnDate.isback); this.setDoUp(returnDate.isup); } if (res.status == 302) { Message({ duration: 2000, message: res.msg, type: "error", }); } if (res.status == 200) { var params = {}; params.obj = res.obj.box; this.changeGroupList(res.obj.groupList); this.refreshCanvas_backOrUp(params, true); that.$nextTick(function () { let item = canvas.getActiveObjects(); }); if ((res.obj.groupStatus == 1 || res.obj.groupStatus == 2) && this.mode == "group") { this.setMode("canvas"); } /** * 分组操作 */ if (this.mode == "group" && res.obj.groupStatus != 1 && res.obj.groupStatus != 2) { let objs = canvas.getObjects(); let groupList = JSON.parse(JSON.stringify(that.groupList)); objs.forEach((obj) => { if (obj.type == "group" && obj.id == returnDate.groupId) { canvas.discardActiveObject(); canvas.setActiveObject(obj); that.setGroupAngle(parseFloat(returnDate.groupAngle)) % 360; } }); that.setGroupList(groupList); } if (this.mode == "box") { let item = canvas.getActiveObjects(); let boxes = []; item.forEach(i => { if (i.id != "source" && i.type == "group" && i.groupId == "box") { boxes.push(i); } }) that.setSelectedBoxes(boxes); let niceP = canvas.getActiveObject(); if (niceP) { requestAnimationFrame(() => { bus.$emit("getRightBoxDetail", niceP); }) } else { bus.$emit("getRightBoxDetail", {}); } } } }, 1); // } console.log("复原"); }, backMethods () { var that = this; var returnDate = handleDataUtil.backEnything(this.dataSource, this.currentMode); this.setDoBack(returnDate.isback); this.setDoUp(returnDate.isup); this.setRestBox(returnDate.data, res => { if (res == "400" || res.status == 302) { var resStatus = handleDataUtil.upEnything(this.dataSource, this.currentMode); this.setDoBack(resStatus.isback); this.setDoUp(resStatus.isup); } if (res.status == 302) { Message({ duration: 2000, message: res.msg, type: "error", }); } if (res.status == 200) { var params = {}; params.obj = res.obj.box; // console.log(res.obj.groupList); this.changeGroupList(res.obj.groupList); this.refreshCanvas_backOrUp(params, true); that.$nextTick(function () { let item = canvas.getActiveObjects(); }); if ((res.obj.groupStatus == 1 || res.obj.groupStatus == 2) && this.mode == "group") { this.setMode("canvas"); } /** * 分组操作 */ if (this.mode == "group" && res.obj.groupStatus != 1 && res.obj.groupStatus != 2) { let objs = canvas.getObjects(); let groupList = JSON.parse(JSON.stringify(that.groupList)); objs.forEach((obj) => { if (obj.type == "group" && obj.id == returnDate.groupId) { canvas.discardActiveObject(); canvas.setActiveObject(obj); that.setGroupAngle(parseFloat(returnDate.groupAngle)) % 360; } }); that.setGroupList(groupList); } if (this.mode == "box") { let item = canvas.getActiveObjects(); let boxes = []; item.forEach(i => { if (i.id != "source" && i.type == "group" && i.groupId == "box") { boxes.push(i); } }) that.setSelectedBoxes(boxes); let niceP = canvas.getActiveObject(); if (niceP) { requestAnimationFrame(() => { bus.$emit("getRightBoxDetail", niceP); }) } else { bus.$emit("getRightBoxDetail", {}); } } } }, 1); // } console.log("撤销"); }, getZoom (num) { var e = event || window.event; var scrollx = document.documentElement.scrollLeft || document.body.scrollTop; var scrolly = document.documentElement.scrollTop || document.body.scrollTop; var x = e.pageX || e.clientX + scrollx; var y = e.pageY || e.clientY + scrolly; console.log(x, y, "-----"); console.log(this.canvasZoom); // if () { // } var moseIndex_x = this.moveMouseX * (1 + num); var moseIndex_y = this.moveMouseY * (1 + num); this.moveMouseX = moseIndex_x; this.moveMouseY = moseIndex_y; console.log(moseIndex_x); // if (n != o) { // console.log("iam login"); // var scrollTop = $("#canvasZone").scrollTop(); // var scrollLeft = $("#canvasZone").scrollLeft(); // if (n - o < 0) { // document.getElementById('canvasZone').scrollTop = scrollTop - 0.1 * this.canvasSize.height - 0.1 * this.canvasSize.height / 4; // document.getElementById('canvasZone').scrollLeft = scrollLeft - 0.1 * this.canvasSize.width - 0.1 * this.canvasSize.width / 4; // } else if (n - o > 0) { // document.getElementById('canvasZone').scrollTop = scrollTop + 0.1 * this.canvasSize.height + 0.1 * this.canvasSize.height / 4; // document.getElementById('canvasZone').scrollLeft = scrollLeft + 0.1 * this.canvasSize.width + 0.1 * this.canvasSize.width / 4; // } // } if (moseIndex_x - x > 0) { document.getElementById('canvasZone').scrollLeft = moseIndex_x - x + 100; } else { document.getElementById('canvasZone').scrollLeft = 0; } if (moseIndex_y - y > 0) { document.getElementById('canvasZone').scrollTop = moseIndex_y - y + 90; } else { document.getElementById('canvasZone').scrollLeft = 0; } let that = this let oldZoom = that.canvasZoom; if (this.canvasZoom + num <= 2 && this.canvasZoom + num > 0.1) { this.setCanvasZoom(Math.round((this.canvasZoom + num) * 10) / 10); } if (that.canvasZoom != oldZoom) { let params = { params: { scal: parseInt(that.canvasZoom * 100) }, success (res) { that.zoomCanvas(that.canvasZoom, oldZoom); }, error (res) { } } that.$store.dispatch("setScal", params); } }, zoomDrop (num) { let that = this let oldZoom = that.canvasZoom; if (num != oldZoom) { let params = { params: { scal: parseInt(num * 100) }, success (res) { that.setCanvasZoom(num); that.zoomCanvas(num, oldZoom); }, error (res) { } } that.$store.dispatch("setScal", params); } }, getFrame () { var that = this; this.$axios({ method: "post", parmas: { areaId: that.areaId }, url: "/system/getFrame", }).then((res) => { if (res.status == 200) { that.frameMessage = res.obj.frame; that.deepcolorMessage = res.obj.deepcolor; } }); }, zoomCanvas (n, o) { // return; canvas.setZoom(n); this.initGrid(); let zoomedGridWidth = this.canvasSize.width * 2 * this.canvasZoom; let zoomedGridHeight = this.canvasSize.height * 2 * this.canvasZoom; let maskSourceCut = document.getElementById("maskArea"); maskSourceCut.style.left = (0 + this.canvasSize.width / 4) * this.canvasZoom + "px"; maskSourceCut.style.top = (0 + this.canvasSize.height / 4) * this.canvasZoom + "px"; maskSourceCut.style.width = this.source_crop.width * this.canvasZoom + "px"; maskSourceCut.style.height = this.source_crop.height * this.canvasZoom + "px"; this.canvasBox.setWidth( Math.max(zoomedGridWidth, document.getElementById("canvasBox").offsetWidth) ); this.canvasBox.setHeight( Math.max(zoomedGridHeight, document.getElementById("canvasBox").offsetHeight) ); if (zoomedGridWidth <= document.getElementById("canvasZone").offsetWidth) { document.getElementById("canvasContainer").style.width = "100%"; } if (zoomedGridHeight <= document.getElementById("canvasZone").offsetHeight) { document.getElementById("canvasContainer").style.height = "100%"; } this.gridLeft = (this.canvasSize.width * this.canvasZoom) / 4 + "px"; this.gridTop = (this.canvasSize.height * this.canvasZoom) / 4 + "px"; this.canvasBox.renderAll(); this.handleData2("init"); canvas.renderAll(); this.$nextTick(() => { bus.$emit("refreshChange"); }); }, limitSourcePosition (p, type) { let canGrid = document.getElementById("canGrid"); let [gridLeft, gridTop] = [ this.canvasSize.width / 4, this.canvasSize.height / 4 ]; let num = this.limitSourceSpace; let { width, height } = p; if (type == "scaling") { width = Math.round(p.getScaledWidth()); height = Math.round(p.getScaledHeight()); } if (p.top + height <= gridTop + num) { p.top = gridTop + num - height; } if (p.left + width <= gridLeft + num) { p.left = gridLeft + num - width; } if (p.top >= gridTop + canGrid.height / this.canvasZoom - num) { p.top = gridTop + canGrid.height / this.canvasZoom - num; } if (p.left >= gridLeft + canGrid.width / this.canvasZoom - num) { p.left = gridLeft + canGrid.width / this.canvasZoom - num; } }, limitMovingPosition (p) { let [canvasWidth, canvasHeight] = [this.canvasBox.width / this.canvasZoom, this.canvasBox.height / this.canvasZoom]; let [minWidth, minHeight] = [0, 0]; let [rightWidth, bottomHeight] = [p.width, p.height]; if (p.id != "source" && p.groupId == "box") { [minWidth, minHeight] = [p.width / 2, p.height / 2]; [rightWidth, bottomHeight] = [p.width / 2, p.height / 2]; } p.left = Math.max(minWidth, p.left); p.left = Math.min(p.left, canvasWidth - rightWidth); p.top = Math.max(minHeight, p.top); p.top = Math.min(p.top, canvasHeight - bottomHeight); }, getGroupName () { let names = []; for (let i = 0; i < this.groupList.length; i++) { names.push(this.groupList[i].name); } for (let j = 0; j < this.groupList.length; j++) { if (names.indexOf(j + 1 + "") == -1) { return j + 1 + ""; } } return this.groupList.length + 1 + ""; }, copy2Me (ports) { ports = [...new Set(ports)]; let indexArr = new Array(ports.length); let items = this.selectedBoxes; let data = []; for (let i = 0; i < this.selectedBoxes.length; i++) { if (this.selectedBoxes[i].type == "group" && this.selectedBoxes[i].groupId != "box") { Message({ duration: 2000, message: this.$t('CannotCopyGroup'), type: "error", }); return; } } for (let j = 0; j < ports.length; j++) { let index = -1; for (let k = 0; k < this.allData.length; k++) { if (this.allData[k].networkPort == ports[j]) { if (this.allData[k].index >= index) { index = this.allData[k].index; } } } indexArr[j] = index; for (let i = 0; i < items.length; i++) { if (items[i].networkPort == ports[j]) { indexArr[j] += 1; let [x, y] = [0, 0]; if (items.length == 1) { [x, y] = [items[i].left, items[i].top]; } else { [x, y] = [items[i].matrixCache.value[4], items[i].matrixCache.value[5]]; } data.push({ rotationAngle: items[i].angle, areaId: this.areaId, networkPort: items[i].networkPort, index: indexArr[j], type: null, width: items[i].width, height: items[i].height, x: x + this.copyKeyNum * this.copyBoxSpace, y: y + this.copyKeyNum * this.copyBoxSpace, portId: items[i].portId, slotId: items[i].slotId, boxFileId: items[i].boxFileId, }); } } } let that = this; this.setAddBox(data, (res) => { res.obj.forEach((o) => { o.id = o.boxId; }); that.allData = that.allData.concat(res.obj); data.forEach((item, index) => { item.id = res.obj[index].boxId; canvas.add(this.groupAdd(item, canvas)); }); that.handleData2(""); that.$nextTick(function () { handleDataUtil.doEnything(that.dataSource, that.allData, "canvas", this.groupList, ""); that.setDoBack(false); that.setDoUp(true); }) }); }, //不删除矩形-->删除所有线段,三角,圆点,文字从新绘制 handleData (type) { let hiddenGroupIds = []; for (let i = 0; i < this.groupList.length; i++) { if (this.groupList[i].hidden) { hiddenGroupIds.push(this.groupList[i].id); } } //获取所有箱体数据处理 start canvas.forEachObject(function (obj, i) { if (["triangle", "line", "path", "textbox", "circle"].indexOf(obj.type) != -1) { canvas.remove(obj); } }); var typeWk = []; this.allData.forEach((item) => { if (typeWk.indexOf(item.networkPort) == -1) { typeWk.push(item.networkPort); } }); //console.log('一共有几个网口', typeWk) typeWk.forEach((item) => { var newarr = this.allData.filter(function (obj) { return obj.networkPort == item; }); newarr = newarr.sort((a, b) => { return a.index - b.index; }); newarr.forEach((m, n) => { m.index = n + 1; }); let result = []; newarr.forEach((item) => { if (hiddenGroupIds.indexOf(item.groupId) == -1) { result.push(item); } }); this.initLines(result, canvas, type); this.initMerge(result, canvas, type); }); //获取所有箱体数据处理 end }, //删除以后选中箱体 deleteBox () { let that = this; let item = canvas.getActiveObjects(); if (!item || !item.length) { return; } let boxReqList = []; let delGroups = []; for (let index = 0; index < item.length; index++) { if (item[index].type == "group" && item[index].groupId != "box") { delGroups.push(item[index]); let objs = item[index]._objects; for (let j = 0; j < objs.length; j++) { for (let h = that.allData.length - 1; h >= 0; h--) { if ( objs[j].networkPort == that.allData[h].networkPort && objs[j].index == that.allData[h].index ) { boxReqList.push({ id: that.allData[h].id, networkPort: that.allData[h].networkPort, }); continue; } } } } else if (item[index].type == "group" && item[index].groupId == "box") { that.allData.forEach((e, h) => { if (item[index].id == e.id) { boxReqList.push({ id: e.id, networkPort: e.networkPort, }); } }); } } this.$axios({ method: "post", url: "/box/deleteBox", data: { areaId: that.areaId, deleteBox: boxReqList, }, }).then((res) => { if (res && res.status == 200) { if (delGroups && delGroups.length) { let groupList = JSON.parse(JSON.stringify(that.groupList)); // 更新分组列表 for (let i = 0; i < delGroups.length; i++) { for (let j = 0; j < groupList.length; j++) { if (groupList[j].id == delGroups[i].id) { groupList.splice(j, 1); } } } that.setGroupList(groupList); } that.refreshCanvas(res); this.$nextTick(function () { handleDataUtil.doEnything( that.dataSource, that.allData, "canvas", that.groupList, "" ); that.setDoBack(false); that.setDoUp(true); }); canvas.discardActiveObject(); this.setActiveDeleteBox(false); this.setActiveBreakLine(false); this.setActiveMakeGroup(false); this.setActiveBreakGroup(false); } else { that.$message(that.$t(res.msg)) } }); let objs = canvas.getObjects(); if (objs.length == 1) { // 箱体全副删完 this.setSelectAll(false); this.setSelectedBoxes([]); } }, //删除连线 deleteLine () { let that = this; // 删除以后箱体上的连线 let item = canvas.getActiveObjects(); if (!item || item.length == 0) { this.$message({ duration: 2000, message: this.$t('NotChooseBox'), type: "error", }); return; } else if ( item.length == 0 && item[0].type == "group" && item[0].groupId != "box" ) { this.$message({ duration: 2000, message: this.$t('SelectBoxLine'), type: "error", }); return; } else { for (let i = 0; i < item.length; i++) { if (item[i].type == "group" && item[i].groupId != "box") { this.$message({ duration: 2000, message: this.$t('SelectBoxLine'), type: "error", }); return; } } } let boxReqList = []; for (let index = 0; index < item.length; index++) { that.allData.forEach((e, h) => { if (item[index].id == e.id) { boxReqList.push({ id: e.id, networkPort: 0, oldNetworkPort: item[index].networkPort, }); } }); } this.$axios({ method: "post", url: "/box/updateBox", data: { flag: 1, // 接口是否返回最新的箱体列表, 0否;1是 areaId: that.areaId, refreshIndex: true, list: that.printaCoords_y(boxReqList), frame: 1, // 给后盾传参帧率,用于带载校验 }, }).then((res) => { if (res && res.status == 200) { for (var i = 0; i < res.obj.length; i++) { for (var j = 0; j < res.obj[i].list.length; j++) { res.obj[i].list[j].slotId = res.obj[i].slotId; } } this.refreshCanvas(res); that.$nextTick(function () { handleDataUtil.doEnything(that.dataSource, that.allData, "canvas_editLine", this.groupList, ""); this.setDoBack(false); this.setDoUp(true); }); } else { that.$message(that.$t(res.msg)) } }); }, printaCoords_y (list) { let canvasSize = this.canvasSize let accMul1 = accMul(canvasSize.width, this.canvasZoom) let width = accDiv(accMul1, 4) //canvasSize.width * this.canvasZoom / 4 let accMul2 = accMul(canvasSize.height, this.canvasZoom) let height = accDiv(accMul2, 4) var result = [] let num1 = accDiv(width, this.canvasZoom) let num2 = accDiv(height, this.canvasZoom) for (var i = 0; i < list.length; i++) { var date = JSON.parse(JSON.stringify(list[i])); date.x = parseInt(accSub(date.x, num1)); date.y = parseInt(accSub(date.y, num2)); result.push(date); } // let result = { // x: x - width / this.canvasZoom, // y: y - height / this.canvasZoom, // } //console.log(result); return result; }, printaCoords_b (list) { // console.log(list); let canvasSize = this.canvasSize let width = canvasSize.width * this.canvasZoom / 4 let height = canvasSize.height * this.canvasZoom / 4 //console.log(width); var result = [] for (var i = 0; i < list.length; i++) { var date = JSON.parse(JSON.stringify(list[i])); date.x = date.x + width / this.canvasZoom; date.y = date.y + height / this.canvasZoom; result.push(date); } // let result = { // x: x - width / this.canvasZoom, // y: y - height / this.canvasZoom, // } //console.log(result); return result; }, // 批改箱体信息 setUpdateBox (boxReqList, successCallback, flag = 0) { if (boxReqList.length == 0) { return; } let that = this; return this.$axios({ method: "post", url: "/box/updateBox", data: { flag: flag, // 接口是否返回最新的箱体列表, 0否;1是 areaId: that.areaId, list: that.printaCoords_y(boxReqList), frame: 1, // 给后盾传参帧率,用于带载校验 }, }).then((res) => { this.movup = false; this.rotup = false; if (res && res.status == 200) { for (var i = 0; i < res.obj.length; i++) { for (var j = 0; j < res.obj[i].list.length; j++) { res.obj[i].list[j].slotId = res.obj[i].slotId; } } successCallback && successCallback(res); return res; } else { that.$message(that.$t(res.msg)) } }); }, // 复写所有箱体 setRestBox (boxReqList, successCallback, flag = 0) { let that = this; return this.$axios({ method: "post", url: "/box/saveBoxs", data: { areaId: that.areaId, list: that.printaCoords_y(boxReqList.dataSource), frame: 1, // 给后盾传参帧率,用于带载校验 groupList: boxReqList.groupList, }, }).then((res) => { if (res && (res.status == 200 || res.status == 302)) { successCallback && successCallback(res); return res } else { successCallback && successCallback("400"); return "400"; } }); }, //查问箱体 getboxList (isflag, callback) { var that = this; return this.$axios({ method: "post", url: "/box/selectBoxList", data: { id: this.areaId, }, }).then((res) => { if (res.status == 200) { canvas.forEachObject(obj => { if (obj.id != "source") { canvas.remove(obj); } }); let arr = []; this.portIds = []; if (res.obj && res.obj.length > 0) { let array = res.obj; for (let i = 0; i < array.length; i++) { let item = array[i].list; var param = { "portId": array[i].portId, "networkPort": array[i].networkPort, "outputId": array[i].outputId, "slotId": array[i].slotId } this.portIds.push(param); for (let index = 0; index < item.length; index++) { item[index].slotId = (array[i].slotId == undefined ? 0 : array[i].slotId); item[index].portId = (array[i].portId == undefined ? 0 : array[i].portId); arr.push(item[index]); } } } arr = that.printaCoords_b(arr); this.allData = arr; handleDataUtil.doEnything( this.dataSource, this.allData, "canvas", this.groupList, "init" ); this.handleData2("init"); for (let i = 0; i < arr.length; i++) { canvas.add(this.groupAdd(arr[i], canvas)); } if (!isflag) { this.initGroup(); } this.allData2 = JSON.parse(JSON.stringify(this.allData)); callback && callback(); return arr; } else { that.$message(that.$t(res.msg)); } }); }, getboxList_yg (isflag, callback) { var that = this; return this.$axios({ method: "post", url: "/box/selectBoxList", data: { id: this.areaId, }, }).then((res) => { if (res.status == 200) { canvas.forEachObject(obj => { if (obj.id != "source") { canvas.remove(obj); } }); let arr = []; this.portIds = []; if (res.obj && res.obj.length > 0) { let array = res.obj; for (let i = 0; i < array.length; i++) { let item = array[i].list; var param = { "portId": array[i].portId, "networkPort": array[i].networkPort, "outputId": array[i].outputId, "slotId": array[i].slotId } this.portIds.push(param); for (let index = 0; index < item.length; index++) { item[index].slotId = (array[i].slotId == undefined ? 0 : array[i].slotId); item[index].portId = (array[i].portId == undefined ? 0 : array[i].portId); arr.push(item[index]); } } } arr = that.printaCoords_b(arr); this.allData = arr; this.handleData2("init"); for (let i = 0; i < arr.length; i++) { canvas.add(this.groupAdd(arr[i], canvas)); } this.initGroup(); this.allData2 = JSON.parse(JSON.stringify(this.allData)); callback && callback(); return arr; } else { that.$message(that.$t(res.msg)); } }); }, //增加在线箱体 addOnlineQuery (data, callback) { let that = this; return this.$store.dispatch("addOnlineQuery", { params: { list: data, frame: 1, // 给后盾传参帧率,用于带载校验 }, success (res) { if (res.status == 200) { res.obj.forEach((item) => { for (let i = 0; i < that.allData.length; i++) { if ( that.allData[i].networkPort == item.networkPort && item.index == that.allData[i].index ) { that.allData[i] = item; that.allData[i].id = item.boxId; break; } } let objs = canvas.getObjects(); objs.forEach((o) => { if ( o.index == item.index && o.networkPort == item.networkPort && !o.id && o.type == "group" ) { o.set({ id: item.boxId, }); canvas.requestRenderAll(); } }); }); callback && callback(res); } else { that.allData.pop(); let objs = canvas.getObjects(); objs.forEach((o) => { if (o.id == null) { canvas.remove(o); } }); } }, error (res) { that.allData.pop(); let objs = canvas.getObjects(); objs.forEach((o) => { if (o.id == null) { canvas.remove(o); } }); }, }); }, //增加离线箱体 setAddBox (data, callback) { let that = this; console.log("setAddBox"); return this.$store.dispatch("setAddBox", { params: { list: that.printaCoords_y(data), frame: 1, // 给后盾传参帧率,用于带载校验 }, success (res) { console.log("success"); if (res.status == 200) { res.obj = that.printaCoords_b(res.obj); res.obj.forEach((item) => { for (let i = 0; i < that.allData.length; i++) { if ( that.allData[i].networkPort == item.networkPort && item.index == that.allData[i].index ) { that.allData[i] = item; that.allData[i].id = item.boxId; break; } } let objs = canvas.getObjects(); objs.forEach((o) => { o.set({ huadongbs: false, }); if ( o.index == item.index && o.networkPort == item.networkPort && !o.id && o.type == "group" ) { o.set({ id: item.boxId, }); canvas.requestRenderAll(); } }); }); callback && callback(res); } else { console.log("12311"); if (firstAdd) { canvas.remove(firstAdd); firstAdd = ""; this.addBoxParams = []; // console.log("isdrawBox = false"); // isdrawBox = false; } } }, error (res) { console.log("error"); that.allData.pop(); let objs = canvas.getObjects(); if (firstAdd) { canvas.remove(firstAdd); firstAdd = ""; this.addBoxParams = []; // console.log("isdrawBox = false"); // isdrawBox = false; } objs.forEach((o) => { if (o.id == null) { canvas.remove(o); } }); }, }); }, initGroup (isLine16) { if (this.mode == 'box' && this.currentMode == 'canvas_editLine') { return } // console.log("initGroup"); this.allGroup = []; let objs = canvas.getObjects(); if (objs.length == 1) { // 只有一个源,没有箱体 return; } canvas.discardActiveObject(); let boxes = []; objs.map((item) => { if (item.id != "source" && item.type == "group" && item.groupId == "box") { boxes.push(item); } }); let hiddenGroupIds = []; if (!isLine16) { for (let i = 0; i < this.groupList.length; i++) { if (this.groupList[i].hidden) { hiddenGroupIds.push(this.groupList[i].id); } } } for (let i = 0; i < this.groupList.length; i++) { let groupId = this.groupList[i].id; let groupItems = []; for (let j = 0; j < boxes.length; j++) { if (groupId == boxes[j].groupIdd) { groupItems.push(boxes[j]); } } if (groupItems.length) { var sel = new fabric.ActiveSelection(groupItems, { canvas: canvas, }); canvas.setActiveObject(sel); let group = canvas.getActiveObject().toGroup({}); group.set({ id: groupId, // borderColor: "blue", // selectionBackgroundColor: "red", }); if (hiddenGroupIds.indexOf(groupId) > -1) { group.set({ visible: false, }); } this.allGroup.push(group); canvas.requestRenderAll(); canvas.discardActiveObject(); } } }, //创立源 initSource (sourceData) { //console.log(sourceData); sourceCanvas = new fabric.Rect({ left: sourceData.left, top: sourceData.top, originX: "left", //绝对于坐标点地位 originY: "top", //绝对于坐标点地位 width: sourceData.width, height: sourceData.height, hoverCursor: "normal", fill: "green", borderColor: "black", //选中边框色 cornerStyle: "circle", // 手柄形态 正方形 rect||圆 circle cornerColor: "black", //手柄背景色 cornerStrokeColor: "black", //手柄框边框 hasControls: true, //手柄 hasBorders: true, //手柄线 visible: true, //是否可见 selectable: false, //是否可抉择的对象 evented: false, //是否拖动 centeredScaling: false, //居中缩放 transparentCorners: false, //选中框通明角 preserveObjectStacking: true, opacity: 0.2, id: "source", }); sourceCanvas.setControlsVisibility({ mt: true, mb: true, bl: true, br: true, tl: true, tr: true, mr: true, ml: true, mtr: false, }); var objs_ = canvas.getObjects(); for (var i = 0; i < objs_.length; i++) { if (objs_[i].id == 'source') { canvas.remove(objs_[i]); } } canvas.add(sourceCanvas); }, //挪动和旋转 movAndrotat (p, type) { let that = this; if (!rightKey || ((that.currentMode == "canvas_offline" || that.currentMode == 'canvas_online') && firstAdd == "")) { if (p) { if (p.isCheckTo) { //单选 p._objects[2].set({ angle: -parseFloat(p.angle) }); //单个旋转文字角度不变 that.allData.forEach((item, k) => { if (item.id == p.id) { item.rotationAngle = parseFloat(p.angle) % 360; item.x = p.calcOwnMatrix()[4]; item.y = p.calcOwnMatrix()[5]; item.operateType = "moving"; } }); } else { //多选箱体 if (p.type == "group" && p.groupId != "box") { // 页面间接抉择某分组 that.setGroupAngle(parseFloat(p.angle) % 360); let objs = p._objects; let ownMatrixCache = p.ownMatrixCache; objs.forEach((obj, objIndex) => { that.allData.forEach((item) => { if (item.id == obj.id) { if (type == "moving") { let gg = that.rotatoNi( obj.ownMatrixCache.value[4] + ownMatrixCache.value[4], obj.ownMatrixCache.value[5] + ownMatrixCache.value[5], ownMatrixCache.value[4], ownMatrixCache.value[5], parseFloat(p.angle) ); item.x = gg.x; item.y = gg.y; } else if (type == "rotating") { item.rotationAngle = (parseFloat(obj.angle) + parseFloat(p.angle)) % 360; let gg = that.rotatoNi( obj.ownMatrixCache.value[4] + ownMatrixCache.value[4], obj.ownMatrixCache.value[5] + ownMatrixCache.value[5], ownMatrixCache.value[4], ownMatrixCache.value[5], parseFloat(p.angle) ); item.x = gg.x; item.y = gg.y; } } }); obj._objects[2].set({ angle: -((parseFloat(p.angle) + parseFloat(obj.angle)) % 360) }).setCoords() }); } else { var arr = p._objects; if ( p.type == "activeSelection" && arr.length == 1 && arr[0].type == "group" && arr[0].id ) { // 拖动旋转的是分组 let objs = arr[0]._objects; let matrixCache = arr[0].matrixCache; objs.forEach((obj, objIndex) => { that.allData.forEach((item) => { if (item.id == obj.id) { if (type == "moving") { item.x = obj.ownMatrixCache.value[4] + matrixCache.value[4]; item.y = obj.ownMatrixCache.value[5] + matrixCache.value[5]; } else if (type == "rotating") { item.rotationAngle = (parseFloat(obj.angle) + parseFloat(p.angle)) % 360; let gg = that.rotatoNi( obj.ownMatrixCache.value[4] + matrixCache.value[4], obj.ownMatrixCache.value[5] + matrixCache.value[5], matrixCache.value[4], matrixCache.value[5], parseFloat(p.angle) ); item.x = gg.x; item.y = gg.y; } } }); obj._objects[2].set({ angle: -((parseFloat(p.angle) + parseFloat(obj.angle)) % 360) }).setCoords() }); } else { for (var i = 0; i < arr.length; i++) { if (arr[i].type == "group" && arr[i].groupId == "box") { let angle = parseInt(parseFloat(arr[i].angle) + parseFloat(p.angle)) % 360; arr[i]._objects[2].set({ angle: -angle }); //单个旋转文字角度不变 that.allData.forEach((item) => { if (item.id == arr[i].id) { item.rotationAngle = angle; item.x = arr[i].matrixCache.value[4]; item.y = arr[i].matrixCache.value[5]; } }); } else if (arr[i].type == "group" && arr[i].groupId != "box") { let _objs = arr[i]._objects; let groupValue = arr[i].matrixCache.value; //_objs.set({angle:_objs}) _objs.forEach((o, pp) => { that.allData.forEach((item) => { if (item.id == o.id) { // if (type == "moving") { // item.x = groupValue[4] + o.left; // item.y = groupValue[5] + o.top; // } else if (type == "rotating") { let x1 = groupValue[4] + o.left; let y1 = groupValue[5] + o.top; let gg = that.rotatoNi( x1, y1, groupValue[4], groupValue[5], p.angle ); item.x = gg.x; item.y = gg.y; let ang = (p.angle + parseFloat(o.angle)) % 360 item.rotationAngle = ang o._objects[2].set({ angle: 360 - ang }) //} } }); }); that.imrotat = true } } } } } that.handleDataMovingRotating(type); canvas.renderAll(); that.activeTpye = true; if (type == "moving") { that.movup = true; } if (type == "rotating") { that.rotup = true; } } } }, jsonAllData (id) { let arr = this.allData2; return arr.filter(function (obj, i) { return obj.id == id; }); }, //依据接口返回的箱体列表,刷新画布内容(除了源) refreshCanvas (res, selectBoxesFlag, activeObject, isLine16) { var that = this; canvas.forEachObject((o) => { if (o.id != "source") { canvas.remove(o); } }); let arr = []; if (res.obj && res.obj.length > 0) { let array = res.obj; for (let i = 0; i < array.length; i++) { let item = array[i].list; for (let index = 0; index < item.length; index++) { let data = item[index]; arr.push(data); } } } arr = that.printaCoords_b(arr); this.allData = arr; this.handleData2("init", isLine16); for (let i = 0; i < arr.length; i++) { let data = JSON.parse(JSON.stringify(arr[i])); let newItem = this.groupAdd(data, canvas); canvas.add(newItem); } this.initGroup(isLine16); selectBoxesFlag && this.activeBoxes(activeObject ? activeObject : this.selectedBoxes); }, //yg refreshCanvas_backOrUp (res, selectBoxesFlag, activeObject) { var that = this; canvas.forEachObject(o => { if (o.id != "source" && o.id != undefined && o.id != "") { canvas.remove(o); } }) let arr = []; if (res.obj && res.obj.length > 0) { let array = res.obj; for (let i = 0; i < array.length; i++) { let item = array[i].list; for (let index = 0; index < item.length; index++) { let data = item[index]; arr.push(data); } } } arr = that.printaCoords_b(arr); this.allData = arr; this.handleData2('init') for (let i = 0; i < arr.length; i++) { let data = JSON.parse(JSON.stringify(arr[i])); let newItem = this.groupAdd(data, canvas); canvas.add(newItem) } this.initGroup(); selectBoxesFlag && this.activeBoxes(activeObject ? activeObject : this.selectedBoxes); }, // 画布勾销以后选中箱体,选中selectedBoxes activeBoxes (selectedBoxes) { canvas.discardActiveObject(); let boxes = []; let sel = null; if (selectedBoxes.length == 1) { canvas.forEachObject((item) => { if ( item.type == "group" && item.groupId == "box" && item.id == selectedBoxes[0].id ) { sel = item; } else if ( item.type == "group" && item.groupId != "box" && item.id == selectedBoxes[0].id ) { sel = item; } }); } else { var number = []; var inNumber = []; selectedBoxes.forEach((o) => { if (o.group && o.group.id != 0) { number.push(o.group.id); } canvas.forEachObject((item) => { if ( item.id != "source" && item.type == "group" && item.groupId == "box" && item.id == o.id ) { boxes.push(item); } else if ( item.id != "source" && item.type == "group" && item.groupId != "box" && item.id == o.id ) { boxes.push(item); } }); }); for (var j = 0; j < this.groupList.length; j++) { for (var i = 0; i < number.length; i++) { if (number[i] == this.groupList[j].id) { inNumber.push(number[i]); } } } if (number.length != inNumber.length) { boxes = []; } sel = new fabric.ActiveSelection(boxes, { canvas: canvas, }); } canvas.setActiveObject(sel); canvas.requestRenderAll(); }, //初始化fabric画布 initCanvas () { let that = this; var canvasDom = document.getElementById("can"); var width_ = this.canvasSize.width ? this.canvasSize.width * 2 : 1920 * 2; // var height_ = this.canvasSize.height // ? this.canvasSize.height * 2 // : 1080 * 2; var domWidth = document.getElementById("canvasBox").style.width; canvasDom.width = width_ < domWidth ? domWidth : width_; canvasDom.width = this.canvasSize.width ? this.canvasSize.width * 2 : 1920 * 2; canvasDom.height = this.canvasSize.height ? this.canvasSize.height * 2 : 1080 * 2; canvas = this.canvasBox = new fabric.Canvas("can", { selection: true }); //selection 是否反对多选 canvas.on({ "object:moving": function (e) { var p = e.target; if (p) { bus.$emit("getRightBoxDetail", p); } that.limitMovingPosition(p); if (that.mode == "operateSource") { that.movingSoureFlag = true; // 限度源不能齐全拖出网格区域 that.limitSourcePosition(p, "moving"); that.setSourceData({ left: Math.round(p.left), top: Math.round(p.top), width: Math.round(p.width), height: Math.round(p.height), }); bus.$emit("refreshChange"); } else { setTimeout(() => { that.movAndrotat(p, "moving"); }, 1) that.movAndrotat(p, "moving"); } if (p.type == 'group' && !p.isCheckTo) { that.setMode("group"); //分组属性页 } else if (p.type == 'group' && p.isCheckTo) { that.setMode("box"); } }, "object:rotating": function (e) { var p = e.target; that.limitMovingPosition(p); if (p) { bus.$emit("getRightBoxDetail", p); setTimeout(() => { that.movAndrotat(p, "rotating"); }, 1) } //p && that.movAndrotat(p, "rotating"); }, "object:scaling": function (e) { if (that.mode == "operateSource") { var p = e.target; that.scalingSourceFlag = true; // 限度源不能齐全拖出网格区域 that.limitSourcePosition(p, "scaling"); if (p.left != that.sourceData.left || p.top != that.sourceData.top) { that.scaleOffsetFlag = true; } // console.log(p.getScaledWidth()); that.setSourceData({ left: Math.round(p.left), top: Math.round(p.top), width: Math.round(p.getScaledWidth()) - 1, height: Math.round(p.getScaledHeight()) - 1 }); bus.$emit("refreshChange"); } }, "mouse:down": function (e) { var p = e.target; that.copyNum = 1 //还原复制箱体次数 that.copyKeyNum = 1 //还原快捷键复制箱体次数 that.copyBoxFlag = false; isdrawBox = true; startDrawX = e.pointer.x; startDrawY = e.pointer.y; // console.log("点的坐标", p); if (p) { if (that.mode == 'canvas' && that.currentMode == 'canvas') { that.setMode("box"); bus.$emit("getRightBoxDetail", p); } canvas.forEachObject((obj, i) => { if (obj.type == "group") { obj._objects[0].set({ stroke: "#136094", }); } }); p._objects && p._objects[0].set({ stroke: "#0099FF", }); //右侧箱体坐标显示 if (that.isChangeLine && p.type == "group" && p.groupId == "box") { //激活自定义连线 if (that.addlineDash == 1) { //点终点箱体 that.startPort = { networkPort: p.networkPort, id: p.id, index: p.index, x: parseFloat(p.left), y: parseFloat(p.top), }; that.addlineDash = 2; } else if (that.addlineDash == 2) { //点的第起点箱体 that.endPort = { networkPort: p.networkPort, id: p.id, index: p.index, x: parseFloat(p.left), y: parseFloat(p.top), }; } that.lineDash = that.makeLine( [ that.startPort.x, that.startPort.y, that.startPort.x + 10, that.startPort.y + 10, ], "", [3, 2], "", that.startPort.id, that.endPort.id ); canvas.add(that.lineDash); that.drawArrow( canvas, that.startPort.x, that.startPort.y, that.startPort.x + 5, that.startPort.y + 5, 30, 10, 1, "#fff", that.startPort.id, that.endPort.id ); if (that.addlineDash == 2) { //点的起点箱体 if (that.startPort.networkPort != that.endPort.networkPort) { console.log("不同网口不能批改连线"); return; } if (that.startPort.index + 1 == that.endPort.index) { console.log("地位无批改"); return; } if (that.startPort.id == that.endPort.id) { console.log("间断点击同一个箱体"); return; } let list = that.allData.filter(function (obj, i) { return obj.networkPort == that.endPort.networkPort; }); let editLine = that.setArrIndex(that.startPort, that.endPort, list); // console.log("批改连线以后所有同网口数据", editLine); // that.startPort = {}; that.startPort = JSON.parse(JSON.stringify(that.endPort)); editLine.forEach((i) => { if (i.id == that.startPort.id) { that.startPort.index = i.index; } }) that.endPort = {}; // that.addlineDash = 1; canvas.forEachObject((obj, i) => { if ((obj.strokeDashArray && obj.strokeDashArray.length > 0) || obj.jt) { canvas.remove(obj); } }); // console.log("清空终点坐标", that.startPort); that.setUpdateBox( editLine, (res) => { // 获取箱体列表刷新画布 that.refreshCanvas(res); canvas.forEachObject((obj, i) => { if (obj.type == "group" && obj.groupId == "box") { obj.set({ selectable: false }); } }); }, 1 ); that.$nextTick(function () { handleDataUtil.doEnything( that.dataSource, that.allData, "canvas_editLine", this.groupList, "" ); this.setDoBack(false); this.setDoUp(true); }); } } } else { that.startPort = {}; // that.startPort = JSON.parse(JSON.stringify(that.endPort)); that.endPort = {}; that.addlineDash = 1; canvas.forEachObject((obj, i) => { if (obj.type == "group") { obj._objects[0].set({ stroke: "#136094", }); } if ((obj.strokeDashArray && obj.strokeDashArray.length > 0) || obj.jt) { canvas.remove(obj); } }); } if (p) { if (p.type == 'group' && !p.isCheckTo && that.currentMode != "canvas_editLine" && that.currentMode != 'canvas_connectionsLine') { that.setMode("group");//分组属性页 } else if (p.type == 'group' && p.isCheckTo && that.currentMode != "canvas_editLine" && that.currentMode != 'canvas_connectionsLine') { that.setMode("box"); } } else { if (that.mode != "operateSource" && that.mode != "boxLine16" && that.currentMode != "canvas_editLine" && that.currentMode != "canvas_offline" && that.currentMode != "canvas_online" && that.currentMode != 'canvas_connectionsLine') { that.setMode("canvas"); } } if ((rightKey) && that.addBoxParams.length) { //return; if (firstAdd == "" || that.newBoxes == []) { return; } if (that.newBoxes.length <= 1) { //点了没拖动 that.setAddBoxMode(true); let networkPort = that.parms.index; //网口 let indexIndex = that.allData.filter(function (obj, i) { return obj.networkPort == networkPort; }); let _index = indexIndex.length + 1; //序号 that.addBoxParams[0].areaId = that.areaId; that.addBoxParams[0].x = p.left; that.addBoxParams[0].y = p.top; that.addBoxParams[0].rotationAngle = that.addAngle; that.addBoxParams[0].index = _index; if (that.gridAdsorbent) { if (that.allData.length > 0) { // 增加第一个箱体不思考吸附 let moveBox = JSON.parse(JSON.stringify(that.addBoxParams[0])); let angle = moveBox.rotationAngle; if ([0, 90, 180, 270, 360].indexOf(Number(angle)) > -1) { // 增加单个箱体,且角度为90°倍数 主动吸附到左近箱体 let direction = that.getDirection(angle); for (let i = 0; i < that.allData.length; i++) { let data = that.allData[i]; that.adsorbentEvent(data, moveBox, direction, 'add'); }; } else { // 任意角度的箱体吸附 // that.allData.forEach(data => { // if (data.id && data.groupId == 0 && data.rotationAngle == angle) { // // 一期不做 // } // }); } that.addBoxParams[0].x = isNaN(moveBox.left) ? moveBox.x : moveBox.left; that.addBoxParams[0].y = isNaN(moveBox.top) ? moveBox.y : moveBox.top; canvas.renderAll(); } } if (that.parms.type == "offline") { console.log('mouse:down离线', that.newBoxes) that.newBoxes = []; let newBox = JSON.parse(JSON.stringify(that.addBoxParams[0])); newBox.huadongbs = true; that.newBoxes.push(newBox); for (var i = 0; i < that.newBoxes.length; i++) { // that.newBoxes[i].index = _index + that.newBoxes[i].index; yesSddBox = that.groupAdd(that.newBoxes[i], canvas); canvas.add(yesSddBox); } return; that.setAddBox(that.addBoxParams, (res) => { //console.log('看一看疾速点击能进来不', that.addBoxParams) // let yesSddBox = that.groupAdd(that.addBoxParams[0], canvas); // canvas.add(yesSddBox); // yesSddBox // .set({ // id: res.obj[0].boxId, // left: yesSddBox.left, // top: yesSddBox.top, // }).setCoords(); return; that.allData.push(newBox); that.handleData2("init"); that.$nextTick(function () { handleDataUtil.doEnything( that.dataSource, that.allData, "canvas_offline", this.groupList, "" ); this.setDoBack(false); this.setDoUp(true); }); }); } else { //在线增加的 if (that.onlineBoxLength <= _index - 1) { return; } var addData = that.parms.list[indexIndex.length]; for (let items of that.boxTypeList) { if (items.main_type == addData.mainType) { that.addBoxParams[0].width = items.scan_w; that.addBoxParams[0].height = items.scan_h; that.addBoxParams[0].boxFileId = items.id; that.addBoxParams[0].type = items.main_type; } } that.newBoxes = []; let newBox = JSON.parse(JSON.stringify(that.addBoxParams[0])); newBox.huadongbs = true; that.newBoxes.push(newBox); console.log('mouse:down在线', that.newBoxes) for (var i = 0; i < that.newBoxes.length; i++) { // that.newBoxes[i].index = _index + that.newBoxes[i].index; yesSddBox = that.groupAdd(that.newBoxes[i], canvas); canvas.add(yesSddBox); } return that.addOnlineQuery(that.addBoxParams, (res) => { let yesSddBox = that.groupAdd(that.addBoxParams[0], canvas); canvas.add(yesSddBox); yesSddBox .set({ id: res.obj[0].boxId, left: yesSddBox.left, top: yesSddBox.top, }) .setCoords(); let newBox = JSON.parse(JSON.stringify(that.addBoxParams[0])); newBox.id = res.obj[0].boxId; that.allData.push(newBox); that.handleData2("init"); that.$nextTick(function () { handleDataUtil.doEnything( that.dataSource, that.allData, "canvas_online", this.groupList, "" ); this.setDoBack(false); this.setDoUp(true); }); /**增加实现后,更新下一个 **/ that.addOnlineRect(that.parms, '1'); }); } } } }, "mouse:up": function (e) { isdrawBox = false; // canvas.forEachObject((obj, i) => { // if (obj.huadongbs) { // console.log("12312312313"); // canvas.remove(obj); // } // }); //console.log('只有抬起示意滑动增加完结', isdrawBox) var p = e.target; let item = canvas.getActiveObjects(); console.log(item); let niceP = canvas.getActiveObject(); //console.log(niceP); if (niceP) { requestAnimationFrame(() => { bus.$emit("getRightBoxDetail", niceP); }) } else { bus.$emit("getRightBoxDetail", {}); } let boxes = []; item.forEach((i) => { if (i.id != "source" && i.type == "group" && i.groupId == "box") { boxes.push(i); } }); if (item.length > 0) { that.setSelectedBoxes(item);//boxes } else { that.setSelectedBoxes([]); } /* -----------start 此处为 挪动或旋转 调用更新接口------------- */ if (that.movup || that.rotup) { let boxReqList = []; if (item.length > 0) { //如果有选中数据 for (let i = 0; i < item.length; i++) { if (item[i].type == "group" && item[i].groupId != "box") { // 以后操作的是一个分组 let _objs = item[i]._objects; for (let i = 0; i < _objs.length; i++) { that.allData.forEach((k, h) => { if (_objs[i].id == k.id) { console.log(_objs[i], "查看拖动的分组中箱体信息", k); k.rotationAngle = parseInt(k.rotationAngle) || 0; boxReqList.push(k); } }); } } else { //在allData中匹配出挪动或旋转的数据 that.allData.forEach((k, h) => { if (item[i].id == k.id) { k.rotationAngle = parseInt(k.rotationAngle); boxReqList.push(k); } }); } } } if (that.movup && that.gridAdsorbent) { // 箱体拖拽 吸附到安装 版本一只思考90°倍数无分组状况 if (item.length == 1 && item[0].type == "group" && item[0].groupId == "box") { let moveBox = item[0]; var copyMove = JSON.parse(JSON.stringify(moveBox)); let angle = moveBox.angle; if ([0, 90, 180, 270, 360].indexOf(Number(angle)) > -1) { // 拖拽单个箱体 且角度为90°倍数 箱体主动吸附到左近箱体 let direction = that.getDirection(angle); for (let i = 0; i < that.allData.length; i++) { let data = that.allData[i]; that.adsorbentEvent(data, moveBox, direction, 'move'); }; if (copyMove.left == moveBox.left && copyMove.top == moveBox.top) { that.adsorbentEvent_canvas(moveBox, direction, 'move'); } } else { // 任意角度的箱体吸附 // that.allData.forEach(data => { // if (data.id != moveBox.id && data.groupId == 0 && data.rotationAngle == angle) { // // 一期不做 // } // }); } boxReqList[0].x = moveBox.left; boxReqList[0].y = moveBox.top; that.allData.forEach(data => { if (data.id == moveBox.id) { data.x = moveBox.left; data.y = moveBox.top; } }); that.handleData2(''); canvas.renderAll(); } else { if (niceP.isCheckTo == true) { //选中单个箱体 } else { //多选箱体吸附操作 var left = niceP.left; var top = niceP.top; var width = niceP.width; var height = niceP.height; } } } //拖动实现鼠标抬起批改更新箱体信息 //return that.setUpdateBox( boxReqList, (res) => { // 获取箱体列表刷新画布 // that.refreshCanvas(res, true, item); //引发bug2854 // that.refreshCanvas(res, true, niceP); //引发bug2854 let arr = []; if (res.obj && res.obj.length > 0) { let array = res.obj; for (let i = 0; i < array.length; i++) { let item = array[i].list; for (let index = 0; index < item.length; index++) { let data = item[index]; arr.push(data); } } } arr = that.printaCoords_b(arr); that.allData = arr; that.allData2 = JSON.parse(JSON.stringify(that.allData)); }, 1 ); that.$nextTick(function () { handleDataUtil.doEnything( that.dataSource, that.allData, "canvas", this.groupList, "" ); this.setDoBack(false); this.setDoUp(true); }); } /* -----------end 此处为 挪动或旋转 调用更新接口------------- */ /* -----------start 此处为 鼠标抬起增加箱体------------- */ //|| (!rightKey && !isdrawBox) if ((rightKey) && that.addBoxParams.length) { if (firstAdd == "" || that.newBoxes == []) { return; } //console.log("看看单点时批量增加数据:", that.newBoxes); if (that.newBoxes.length <= 1) { //return //点了没拖动 that.setAddBoxMode(true); let networkPort = that.parms.index; //网口 let indexIndex = that.allData.filter(function (obj, i) { return obj.networkPort == networkPort; }); let _index = indexIndex.length + 1; //序号 that.addBoxParams[0].areaId = that.areaId; that.addBoxParams[0].x = that.newBoxes[0].x; that.addBoxParams[0].y = that.newBoxes[0].y; that.addBoxParams[0].rotationAngle = that.addAngle; that.addBoxParams[0].index = _index; if (that.allData.length > 0) { // 增加第一个箱体不思考吸附 let moveBox = JSON.parse(JSON.stringify(that.addBoxParams[0])); let angle = moveBox.rotationAngle; if ([0, 90, 180, 270, 360].indexOf(Number(angle)) > -1) { // 增加单个箱体,且角度为90°倍数 主动吸附到左近箱体 let direction = that.getDirection(angle); for (let i = 0; i < that.allData.length; i++) { let data = that.allData[i]; that.adsorbentEvent(data, moveBox, direction, 'add'); }; } else { // 任意角度的箱体吸附 // that.allData.forEach(data => { // if (data.id && data.groupId == 0 && data.rotationAngle == angle) { // // 一期不做 // } // }); } that.addBoxParams[0].x = isNaN(moveBox.left) ? moveBox.x : moveBox.left; that.addBoxParams[0].y = isNaN(moveBox.top) ? moveBox.y : moveBox.top; canvas.renderAll(); } if (that.parms.type == "offline") { that.setAddBox(that.addBoxParams, (res) => { //console.log('看一看疾速点击能进来不', that.addBoxParams) console.log('mouse:up离线', that.newBoxes) // let yesSddBox = that.groupAdd(that.addBoxParams[0], canvas); // canvas.add(yesSddBox); yesSddBox .set({ id: res.obj[0].boxId, left: yesSddBox.left, top: yesSddBox.top, }) .setCoords(); let newBox = JSON.parse(JSON.stringify(that.addBoxParams[0])); newBox.id = res.obj[0].boxId; that.allData.push(newBox); that.handleData2("init"); that.$nextTick(function () { handleDataUtil.doEnything( that.dataSource, that.allData, "canvas_offline", this.groupList, "" ); this.setDoBack(false); this.setDoUp(true); }); }); } else { //在线增加的 if (that.onlineBoxLength <= _index - 1) { // that.$message({ // duration: 2000, // message: that.$t('ExceedingTheLoadOfTheBox'), // type: "error", // }); return; } var addData = that.parms.list[indexIndex.length]; for (let items of that.boxTypeList) { if (items.main_type == addData.mainType) { that.addBoxParams[0].width = items.scan_w; that.addBoxParams[0].height = items.scan_h; that.addBoxParams[0].boxFileId = items.id; that.addBoxParams[0].type = items.main_type; } } that.addOnlineQuery(that.addBoxParams, (res) => { console.log('mouse:up在线', that.newBoxes) // let yesSddBox = that.groupAdd(that.addBoxParams[0], canvas); // canvas.add(yesSddBox); yesSddBox .set({ id: res.obj[0].boxId, left: yesSddBox.left, top: yesSddBox.top, }) .setCoords(); let newBox = JSON.parse(JSON.stringify(that.addBoxParams[0])); newBox.id = res.obj[0].boxId; that.allData.push(newBox); that.handleData2("init"); that.$nextTick(function () { handleDataUtil.doEnything( that.dataSource, that.allData, "canvas_online", this.groupList, "" ); this.setDoBack(false); this.setDoUp(true); }); /**增加实现后,更新下一个 **/ that.addOnlineRect(that.parms, '1'); }); } } else { //if (that.parms.type == "offline") { that.setAddBoxMode(true); that.setAddBox(that.newBoxes, (res) => { let boxes = res.obj; //let boxes = JSON.parse(JSON.stringify(that.newBoxes)); boxes.forEach((newBox) => { newBox.id = newBox.boxId; }); that.allData = that.allData.concat(boxes); that.handleData2("init"); that.$nextTick(function () { handleDataUtil.doEnything( that.dataSource, that.allData, "canvas_offline", this.groupList, "" ); this.setDoBack(false); this.setDoUp(true); }); }); } } /* -----------start 此处为 鼠标抬起增加箱体------------- */ // 操作源保留数据 if (p) { // 源拖拽 if ( that.mode == "operateSource" && (that.movingSoureFlag || that.scalingSourceFlag) ) { let params = {}; let [gridLeft, gridTop] = [ that.canvasSize.width / 4, that.canvasSize.height / 4 ]; var scaleEn_ = 0; var offsetEn_ = 0; if (that.cutEnable) { if (p.width != that.cutData.w || p.height != that.cutData.h) { scaleEn_ = 1; } } else { if (p.width != that.inputSource.initWidth || p.height != that.inputSource.initHeight) { scaleEn_ = 1; } } if (Math.round(p.left - gridLeft) != 0 || Math.round(p.top - gridTop) != 0) { offsetEn_ = 1; } if (that.movingSoureFlag) { that.movingSoureFlag = false; params = { params: { inputPortid: that.inputDetail[that.inputPortIndex].id, // 输出口表id cropEn: that.cropEn, // 视频裁剪使能 0:不使能; 1:使能; scaleEn: scaleEn_, // 视频缩放使能 0:不使能; 1:使能; // scaleEn暂定始终发1 offsetEn: offsetEn_, // 视频偏移使能 0:不使能; 1:使能; // offsetEn参数只有界面有偏移量就发1 cropX: 0, // 裁剪起始左上角横坐标X cropY: 0, // 裁剪起始左上角纵坐标Y cropWidth: that.cut.w, // 裁剪宽度 cropHeight: that.cut.h, // 裁剪高度 scaleWidth: p.width, // 缩放宽度 scaleHeight: p.height, // 缩放高度 offsetX: Math.round(p.left - gridLeft), // 视频源横向偏移量(p.left - that.originData.left) offsetY: Math.round(p.top - gridTop), // 视频源纵向偏移量(p.top - that.originData.top) x: Math.round(p.left - gridLeft), // 视频源左上角横坐标x y: Math.round(p.top - gridTop), // 视频源左上角纵坐标y }, success (res) { }, error (res) { }, }; } else if (that.scalingSourceFlag) { that.scalingSourceFlag = false; let [sourceW, sourceH] = [ Math.max(that.sourceData.width, that.limitSourceSpace), Math.max(that.sourceData.height, that.limitSourceSpace) ]; that.setSourceData({ left: that.sourceData.left, top: that.sourceData.top, width: sourceW, height: sourceH, }); params = { params: { inputPortid: that.inputDetail[that.inputPortIndex].id, // 输出口表id cropEn: that.cropEn, // 视频裁剪使能 0:不使能; 1:使能; scaleEn: scaleEn_, // 视频缩放使能 0:不使能; 1:使能; // scaleEn暂定始终发1 offsetEn: offsetEn_, // 视频偏移使能 0:不使能; 1:使能; // offsetEn参数只有界面有偏移量就发1 // offsetEn: that.scaleOffsetFlag ? 1 : 0, // 视频偏移使能 0:不使能; 1:使能; // offsetEn参数只有界面有偏移量就发1 cropX: 0, // 裁剪起始左上角横坐标X cropY: 0, // 裁剪起始左上角纵坐标Y cropWidth: that.cut.w, // 裁剪宽度 cropHeight: that.cut.h, // 裁剪高度 scaleWidth: that.sourceData.width, // 缩放宽度 scaleHeight: that.sourceData.height, // 缩放高度 offsetX: Math.round(that.sourceData.left - gridLeft), // 视频源横向偏移量that.sourceData.left offsetY: Math.round(that.sourceData.top - gridTop), // 视频源纵向偏移量that.sourceData.top x: Math.round(that.sourceData.left - gridLeft), // 视频源左上角横坐标x y: Math.round(that.sourceData.top - gridTop), // 视频源左上角纵坐标y }, success (res) { // that.setCut({ // cutLeft: 0, // cutTop: 0, // cutWidth: that.sourceData.width, // cutHeight: that.sourceData.height, // }); canvas.forEachObject(obj => { if (obj.id == "source") { canvas.remove(obj); } }); that.initSource(that.sourceData); sourceCanvas.set({ hoverCursor: "pointer", selectable: true, evented: true, }); canvas.setActiveObject(sourceCanvas); canvas.requestRenderAll(); bus.$emit("refreshChange"); that.scaleOffsetFlag = false; }, error (res) { that.scaleOffsetFlag = false; }, }; } that.$store.dispatch("saveSource", params); } } }, // 点击空白局部长按拖动箱体区域 "mouse:move": function (e) { // var that = this; let x = e.pointer.x; let y = e.pointer.y; that.moveMouseX = x; that.moveMouseY = y; let p = e.target; // console.log('鼠标按下触发滑动增加箱体条件', isdrawBox, rightKey) requestAnimationFrame(() => { //console.log("单个增加这里不应该进入", isdrawBox, rightKey); if (isdrawBox && rightKey && firstAdd != "") { //代表此时为增加箱体按下还未放开,可进行拖动增加多个箱体 var drawWidth = Math.abs(x - startDrawX); var drawHeight = Math.abs(y - startDrawY); if (drawWidth < 30 && drawHeight < 30) { //console.log(drawWidth, drawHeight, "避免单点过快 进入拖动增加多个箱体逻辑"); return } let width = 0; let height = 0; let boxTypeId = that.parms.id if (that.parms.type == "onLine") { boxTypeId = that.onLineBoxType } for (let items of that.boxTypeList) { if (items.id == boxTypeId) { width = items.scan_w; height = items.scan_h; } } width = that.addBoxParams[0].width || 100; //临时采纳离线默认箱体类型宽高 height = that.addBoxParams[0].height || 100; //临时采纳离线默认箱体类型宽高 width = width * that.canvasZoom; height = height * that.canvasZoom; var boxColumn = Math.floor(drawWidth / width) + 1; //拖拽生成箱体的列 var boxRow = Math.floor(drawHeight / height) + 1; //拖拽生成箱体的行 // var zouxian = ""; // var zouxianMode = ""; if (boxRow == 1 && boxColumn >= 2) { if (x > startDrawX) { that.zouxianMode = 1; } else if (x < startDrawX) { that.zouxianMode = 2; } } else if (boxRow >= 2 && boxColumn == 1) { if (y > startDrawY) { that.zouxianMode = 3; } else if (y < startDrawY) { that.zouxianMode = 4; } } // else if (boxRow == 1 && boxColumn == 1) { // zouxian = 0; // } //获取走线形式 if (that.zouxianMode == 1) { if (y >= startDrawY) { that.zouxian = 0; } else { that.zouxian = 2; } } else if (that.zouxianMode == 2) { that.zouxian = y >= startDrawY ? 1 : 3; } else if (that.zouxianMode == 3) { that.zouxian = x >= startDrawX ? 4 : 5; } else if (that.zouxianMode == 4) { that.zouxian = x >= startDrawX ? 6 : 7; } // if (zouxian != "") { // that.drawLineType = zouxian; // console.log(that.drawLineType); // } else { // zouxian = that.drawLineType; // console.log(zouxian); // } if (that.zouxian == null || that.zouxian < 0 || that.zouxian > 7) { that.zouxian = 0; } //依据走线形式生成箱体轨迹数据dragBoxes // zouxian = 4; var orderArray = connectionMode.orderArray(that.zouxian, boxRow, boxColumn); that.newBoxes = []; for (var row = 0; row < boxRow; row++) { for (var col = 0; col < boxColumn; col++) { if (boxRow == 3 && boxColumn == 3) { } var box = { // color: backgroundColor, width: width / that.canvasZoom, height: height / that.canvasZoom, index: 1 + orderArray[row][col], // ratioX:ratioX, // ratioY:ratioY, }; //获取几行几列箱体最左上角坐标 var startX = startDrawX; var startY = startDrawY; if (that.zouxian == 1 || that.zouxian == 5) { startX = startX - width * (boxColumn - 1); } else if (that.zouxian == 2 || that.zouxian == 6) { startY = startY - height * (boxRow - 1); } else if (that.zouxian == 3 || that.zouxian == 7) { startX = startX - width * (boxColumn - 1); startY = startY - height * (boxRow - 1); } box.x = (startX + width * col) / that.canvasZoom; box.y = (startY + height * row) / that.canvasZoom; //超出区域暗藏 var top = Math.abs(box.y); var right = width; var down = height; var left = Math.abs(box.x); if (box.x < 0 && box.y >= 0) { top = 0; } else if (box.x >= 0 && box.y < 0) { left = 0; } else if (box.x >= 0 && box.y >= 0) { top = 0; left = 0; } box.clipTop = top; box.clipRight = right; box.clipDown = down; box.clipLeft = left; box.boxFileId = that.boxType; //箱体类型id box.type = that.boxType; box.boxStatus = that.parms.type == "offline" ? 1 : 2; box.networkPort = that.parms.index; box.portId = that.parms.portId box.rotationAngle = that.addAngle; box.areaId = that.areaId; box.slotId = that.parms.slotId; box.huadongbs = true; that.newBoxes.push(box); } } // that.newBoxes.splice(0,1) let networkPort = that.parms.index; //网口 let indexIndex = that.allData.filter(function (obj, i) { return obj.networkPort == networkPort; }); let _index = indexIndex.length //序号 let addzaixianbox = that.newBoxes.length + 1 if (that.parms.type == "onLine") { let canAddBox = that.parms.list.length - indexIndex.length if (addzaixianbox > canAddBox) { that.$message({ duration: 2000, message: that.$t('ExceedingTheLoadOfTheBox'), type: "error", }); let arrSort = that.newBoxes.sort((a, b) => { return a.index - b.index }); that.newBoxes = arrSort.slice(0, canAddBox) } } var frameIn = that.frameMessage; var colorDep = that.deepcolorMessage; //console.log(frameIn + "_" + colorDep); var dzWidth = 0; //带载能力限度 for (var i = 0; i < indexIndex.length; i++) { dzWidth = dzWidth + indexIndex[i].width * indexIndex[i].height * frameIn * colorDep; } for (var j = 0; j < that.newBoxes.length; j++) { dzWidth = dzWidth + that.newBoxes[j].width * that.newBoxes[j].height * frameIn * colorDep; if (dzWidth > 1024 * 1024 * 930) { that.$message({ duration: 2000, message: that.$t('ExceedingTheLoadOfTheBox'), type: "error", }); if (j == 0) { that.newBoxes = [] } else { let arrSort = that.newBoxes.sort((a, b) => { return a.index - b.index }); that.newBoxes = arrSort.slice(0, j); } } } canvas.forEachObject((obj, i) => { if (obj.huadongbs) { canvas.remove(obj); } }); if (that.newBoxes.length > 0) { for (var i = 0; i < that.newBoxes.length; i++) { that.newBoxes[i].index = _index + that.newBoxes[i].index; let yesSddBox = that.groupAdd(that.newBoxes[i], canvas); canvas.add(yesSddBox); console.log('mouse:move箱体滑动连线', that.newBoxes) } that.initLines(that.newBoxes, canvas, "箱体滑动连线"); } } if (!isdrawBox) { that.newBoxes = []; } }); if (p) { //console.log('鼠标移开虚线追随', p) if (that.isChangeLine && that.startPort.x) { //批改自定义连线 that.endPort = { networkPort: p.networkPort, id: p.id, index: p.index, x: p.id == that.startPort.id ? x / that.canvasZoom : parseFloat(p.left), y: p.id == that.startPort.id ? y / that.canvasZoom : parseFloat(p.top), }; // console.log(that.endPort.x); canvas.forEachObject((obj, i) => { if ((obj.strokeDashArray && obj.strokeDashArray.length != 0) || obj.jt) { //删除虚线和箭头 canvas.remove(obj); } }); that.lineDash = that.makeLine( [that.startPort.x, that.startPort.y, that.endPort.x, that.endPort.y], "", [3, 2], "", that.startPort.id, that.endPort.id ); canvas.add(that.lineDash); that.drawArrow( canvas, that.startPort.x, that.startPort.y, (that.startPort.x + that.endPort.x) / 2, (that.startPort.y + that.endPort.y) / 2, 30, 10, 1, "#fff", that.startPort.id, that.endPort.id ); canvas.renderAll(); } // 鼠标滑入分组时,分组高亮显示 if (p.type == "group" && p.groupId != "box") { that.hoverGroupFlag = true; p._objects.forEach(o => { o._objects[0].set({ stroke: "#0099FF", }) }) canvas.renderAll(); } } else { if (that.isChangeLine && that.startPort.x) { //批改自定义连线 console.log("鼠标挪动查看终点坐标", that.startPort.x); that.endPort = { x: parseFloat(x) / that.canvasZoom, y: parseFloat(y) / that.canvasZoom, }; canvas.forEachObject((obj, i) => { if ((obj.strokeDashArray && obj.strokeDashArray.length != 0) || obj.jt) { //删除虚线和箭头 canvas.remove(obj); } }); that.lineDash = that.makeLine( [that.startPort.x, that.startPort.y, that.endPort.x, that.endPort.y], "", [3, 2], "", that.startPort.id, that.endPort.id, that.startPort.id, that.endPort.id ); canvas.add(that.lineDash); that.drawArrow( canvas, that.startPort.x, that.startPort.y, (that.startPort.x + that.endPort.x) / 2, (that.startPort.y + that.endPort.y) / 2, 30, 10, 1, "#fff", that.startPort.id, that.endPort.id ); canvas.renderAll(); } } /* -----------start 此处为 增加箱体状态箱体追随------------- */ if (firstAdd && rightKey) { firstAdd.set({ visible: true, left: x / parseFloat(that.canvasZoom), top: y / parseFloat(that.canvasZoom) }).setCoords(); canvas.renderAll(); bus.$emit("getRightBoxDetail", firstAdd, that.boxType, that.parms.type); } /* -----------start 此处为 增加箱体状态箱体追随------------- */ }, // 鼠标滚动画布放大放大 "mouse:wheel": function (e) { }, "mouse:over": function (e) { let t = e.target; if (t) { if (t.type == "circle") { t.set({ radius: 6 }); } else { t._objects && t._objects[0].set({ stroke: "#0099FF", }); t.set({ stroke: "#0099FF", }); that.allData.forEach((k, h) => { if (t.networkPort == k.networkPort && t.index == k.index) { let parm = k parm.aCoords = t.aCoords parm.angle = t.angle bus.$emit("getBoxDetail", k, true); } }); } canvas.renderAll(); } if (firstAdd) { //console.log('进入画布', true) rightKey = true; firstAdd.set({ visible: true }); canvas.renderAll(firstAdd); } }, //来到画布 "mouse:out": function (e) { let t = e.target; if (t) { t._objects && t._objects[0].set({ stroke: "#136094", }); let act = canvas.getActiveObject(); if (act && act.id == t.id) { t._objects && t._objects[0].set({ stroke: "#0099FF" }); } bus.$emit("getBoxDetail", {}, false); if (t.type == "circle") { t.set({ radius: 4 }); } if (that.hoverGroupFlag) { // 鼠标滑入分组时,分组高亮显示 if (t.type == "group" && t.groupId != "box") { t._objects.forEach(o => { o._objects[0].set({ stroke: "#136094", }) }) that.hoverGroupFlag = false; } } canvas.renderAll(); } //that.isdrawBox = false if (firstAdd && !that.isMouseoeut(e.e.x, e.e.y)) { if (!isdrawBox) { rightKey = false; } //console.log('来到画布', false) canvas.discardActiveObject(); firstAdd.set({ visible: false }); canvas.renderAll(firstAdd); } }, "selection:created": function (e) { //console.log('选中数据', e) }, "before:selection:cleared": function (e) { if (that.imrotat) { //console.log('cleared革除数据', e) that.getboxList(); that.getboxList(false, () => { that.imrotat = false }); } }, }); fabric.Group.prototype.hasControls = true; canvas.selectionLineWidth = 3; fabric.Group.prototype.setControlsVisibility({ mt: false, mb: false, bl: false, br: false, tl: false, tr: false, mr: false, ml: false, mtr: true, }); canvas.preserveObjectStacking = false; }, getDirection (angle) { if ([0, 180, 360].indexOf(Number(angle)) > -1) { return 'h'; } else { return 'v'; } }, get8Point (data) { // tlX, tlY, blX, blY, trX, trY, brX, brY if (data.rotationAngle / 90 % 2 == 1) { return [ data.x - data.height / 2, data.y - data.width / 2, data.x - data.height / 2, data.y + data.width / 2, data.x + data.height / 2, data.y - data.width / 2, data.x + data.height / 2, data.y + data.width / 2 ]; } else { return [ data.x - data.width / 2, data.y - data.height / 2, data.x - data.width / 2, data.y + data.height / 2, data.x + data.width / 2, data.y - data.height / 2, data.x + data.width / 2, data.y + data.height / 2 ]; } }, getMoveBox4Point (moveBox, type) { // moveBoxLX, moveBoxRX, moveBoxTY, moveBoxBY if (type == "add") { if (moveBox.angle / 90 % 2 == 1) { return [ moveBox.x - moveBox.height / 2, moveBox.x + moveBox.height / 2, moveBox.y - moveBox.width / 2, moveBox.y + moveBox.width / 2 ]; } else { return [ moveBox.x - moveBox.width / 2, moveBox.x + moveBox.width / 2, moveBox.y - moveBox.height / 2, moveBox.y + moveBox.height / 2 ]; } } else if (type == "move") { if (moveBox.angle / 90 % 2 == 1) { return [ moveBox.left - moveBox.height / 2, moveBox.left + moveBox.height / 2, moveBox.top - moveBox.width / 2, moveBox.top + moveBox.width / 2 ]; } else { return [ moveBox.left - moveBox.width / 2, moveBox.left + moveBox.width / 2, moveBox.top - moveBox.height / 2, moveBox.top + moveBox.height / 2 ]; } } }, adsorbentEvent (data, moveBox, direction, type) { //console.log("我进了吸附"); let [tlX, tlY, blX, blY, trX, trY, brX, brY] = this.get8Point(data); let [moveBoxLX, moveBoxRX, moveBoxTY, moveBoxBY] = this.getMoveBox4Point(moveBox, type); let leftWidth = this.canvasSize.width / 4; if (data.id != moveBox.id && !data.groupId && [0, 90, 180, 270, 360].indexOf(Number(data.rotationAngle)) > -1) { if (Math.abs(moveBoxLX - tlX) <= this.adsorbent) { // moveBox右边与data右边 平行且间隔小于that.adsorbent this.adsorbentToBox(moveBox, direction, tlX, tlY, blX, blY, trX, trY, brX, brY, 1, 3, 0, 'tl', type); } else if (Math.abs(moveBoxLX - trX) <= this.adsorbent) { // moveBox右边与data左边 平行且间隔小于that.adsorbent this.adsorbentToBox(moveBox, direction, tlX, tlY, blX, blY, trX, trY, brX, brY, 5, 7, 4, 'tl', type); } else if (Math.abs(moveBoxRX - tlX) <= this.adsorbent) { // moveBox左边与data右边 平行且间隔小于that.adsorbent this.adsorbentToBox(moveBox, direction, tlX, tlY, blX, blY, trX, trY, brX, brY, 1, 3, 0, 'tr', type); } else if (Math.abs(moveBoxRX - trX) <= this.adsorbent) { // moveBox左边与data左边 平行且间隔小于that.adsorbent this.adsorbentToBox(moveBox, direction, tlX, tlY, blX, blY, trX, trY, brX, brY, 5, 7, 4, 'tr', type); } if (Math.abs(moveBoxTY - tlY) <= this.adsorbent) { // moveBox上边与data上边 平行且间隔小于that.adsorbent this.adsorbentToBox(moveBox, direction, tlX, tlY, blX, blY, trX, trY, brX, brY, 2, 6, 1, 'add', type); } else if (Math.abs(moveBoxBY - blY) <= this.adsorbent) {// moveBox下边与data下边 平行且间隔小于that.adsorbent this.adsorbentToBox(moveBox, direction, tlX, tlY, blX, blY, trX, trY, brX, brY, 2, 6, 3, 'reduce', type); } else if (Math.abs(moveBoxBY - tlY) <= this.adsorbent) {// moveBox下边与data上边 平行且间隔小于that.adsorbent this.adsorbentToBox(moveBox, direction, tlX, tlY, blX, blY, trX, trY, brX, brY, 2, 6, 1, 'reduce', type); } else if (Math.abs(moveBoxTY - blY) <= this.adsorbent) {// moveBox上边与data下边 平行且间隔小于that.adsorbent this.adsorbentToBox(moveBox, direction, tlX, tlY, blX, blY, trX, trY, brX, brY, 2, 6, 3, 'add', type); } }; }, adsorbentEvent_canvas (moveBox, direction, type) { var canvas_width = this.canvasSize.width; var canvas_height = this.canvasSize.height; let [tlX, tlY, blX, blY, trX, trY, brX, brY] = [canvas_width / 4, canvas_height / 4, canvas_width / 4, canvas_height / 4 * 5, canvas_width / 4 * 5, canvas_height / 4 * 5, canvas_width / 4 * 5, canvas_height / 4]; let [moveBoxLX, moveBoxRX, moveBoxTY, moveBoxBY] = this.getMoveBox4Point(moveBox, type); if (Math.abs(moveBoxLX - tlX) <= this.adsorbent) { // moveBox右边与data右边 平行且间隔小于that.adsorbent this.adsorbentToBox(moveBox, direction, tlX, tlY, blX, blY, trX, trY, brX, brY, 1, 3, 0, 'tl', type); } else if (Math.abs(moveBoxLX - trX) <= this.adsorbent) { // moveBox右边与data左边 平行且间隔小于that.adsorbent this.adsorbentToBox(moveBox, direction, tlX, tlY, blX, blY, trX, trY, brX, brY, 5, 7, 4, 'tl', type); } else if (Math.abs(moveBoxRX - tlX) <= this.adsorbent) { // moveBox左边与data右边 平行且间隔小于that.adsorbent this.adsorbentToBox(moveBox, direction, tlX, tlY, blX, blY, trX, trY, brX, brY, 1, 3, 0, 'tr', type); } else if (Math.abs(moveBoxRX - trX) <= this.adsorbent) { // moveBox左边与data左边 平行且间隔小于that.adsorbent this.adsorbentToBox(moveBox, direction, tlX, tlY, blX, blY, trX, trY, brX, brY, 5, 7, 4, 'tr', type); } if (Math.abs(moveBoxTY - tlY) <= this.adsorbent) { // moveBox上边与data上边 平行且间隔小于that.adsorbent this.adsorbentToBox(moveBox, direction, tlX, tlY, blX, blY, trX, trY, brX, brY, 2, 6, 1, 'add', type); } else if (Math.abs(moveBoxBY - blY) <= this.adsorbent) {// moveBox下边与data下边 平行且间隔小于that.adsorbent this.adsorbentToBox(moveBox, direction, tlX, tlY, blX, blY, trX, trY, brX, brY, 2, 6, 3, 'reduce', type); } else if (Math.abs(moveBoxBY - tlY) <= this.adsorbent) {// moveBox下边与data上边 平行且间隔小于that.adsorbent this.adsorbentToBox(moveBox, direction, tlX, tlY, blX, blY, trX, trY, brX, brY, 2, 6, 1, 'reduce', type); } else if (Math.abs(moveBoxTY - blY) <= this.adsorbent) {// moveBox上边与data下边 平行且间隔小于that.adsorbent this.adsorbentToBox(moveBox, direction, tlX, tlY, blX, blY, trX, trY, brX, brY, 2, 6, 3, 'add', type); } // if (Math.abs(moveBoxLX - leftWidth) <= this.adsorbent) { //moveBox右边与画布右边 // this.adsorbentToBox(moveBox, direction, leftWidth, moveBoxTY, leftWidth, moveBoxBY, leftWidth, moveBoxBY, leftWidth, moveBoxTY, 1, 3, 0, 'tl', type); // } else if (Math.abs(moveBoxRX - leftWidth) <= this.adsorbent) { //moveBox左边与画布左侧邻近 // this.adsorbentToBox(moveBox, direction, leftWidth, moveBoxTY, leftWidth, moveBoxBY, leftWidth, moveBoxBY, leftWidth, moveBoxTY, 1, 3, 0, 'tr', type); // } else if (Math.abs(moveBoxLX - leftWidth * 5) <= this.adsorbent) { //moveBox右边与画布右侧 // this.adsorbentToBox(moveBox, direction, leftWidth * 5, moveBoxTY, leftWidth * 5, moveBoxBY, leftWidth * 5, moveBoxBY, leftWidth * 5, moveBoxTY, 5, 7, 4, 'tl', type); // } else if (Math.abs(moveBoxRX - leftWidth * 5) <= this.adsorbent) { //moveBox左边与画布右侧 // this.adsorbentToBox(moveBox, direction, leftWidth * 5, moveBoxTY, leftWidth * 5, moveBoxBY, leftWidth * 5, moveBoxBY, leftWidth * 5, moveBoxTY, 5, 7, 4, 'tr', type); // } // if (Math.abs(moveBoxTY - leftWidth) <= this.adsorbent) { //moave上边与画布上方 // this.adsorbentToBox(moveBox, direction, moveBoxLX, leftWidth, moveBoxLX, leftWidth, moveBoxRX, leftWidth, moveBoxRX, leftWidth, 2, 6, 1, 'add', type); // } }, moveSourceByKeyboard () { sourceCanvas.set(this.sourceData); canvas.renderAll(); this.saveSourceMoving(this.sourceData); }, saveSourceMoving (p) { let that = this; let [gridLeft, gridTop] = [ this.canvasSize.width / 4, this.canvasSize.height / 4 ]; let params = { params: { inputPortid: that.inputDetail[that.inputPortIndex].id, // 输出口表id cropEn: that.cropEn, // 视频裁剪使能 0:不使能; 1:使能; scaleEn: 1, // 视频缩放使能 0:不使能; 1:使能; // scaleEn暂定始终发1 offsetEn: 1, // 视频偏移使能 0:不使能; 1:使能; // offsetEn参数只有界面有偏移量就发1 cropX: 0, // 裁剪起始左上角横坐标X cropY: 0, // 裁剪起始左上角纵坐标Y cropWidth: p.width, // 裁剪宽度 cropHeight: p.height, // 裁剪高度 scaleWidth: p.width, // 缩放宽度 scaleHeight: p.height, // 缩放高度 offsetX: Math.round(p.left - that.originData.left), // 视频源横向偏移量 offsetY: Math.round(p.top - that.originData.top), // 视频源纵向偏移量 x: Math.round(p.left - gridLeft), // 视频源左上角横坐标x y: Math.round(p.top - gridTop), // 视频源左上角纵坐标y }, success (res) { bus.$emit("refreshChange"); }, error (res) { }, }; that.$store.dispatch("saveSource", params); }, //初始化生成矩形 initRects (list, canvas) { list = list.sort((a, b) => { return a.index - b.index; }); for (var i = 0; i < list.length; i++) { let tb = this.makeRect( list[i].x, list[i].y, { networkPort: list[i].networkPort, index: list[i].index, }, list[i].width, list[i].height, list[i].rotationAngle || 0, list[i].groupId, list[i].id, list[i].boxFileId ); canvas.add(tb); } }, //初始化中心点,直角三角形,文本 initMerge (list, canvas, type) { list = list.sort((a, b) => { return a.index - b.index; }); for (var i = 0; i < list.length; i++) { //中心点 let tb2 = this.makeCircle2(list[i]); canvas.add(tb2); //tb2.bringToFront() //直角三角形 //if (list[i].operateType != 'moving' && list[i].operateType != 'rotating') { let tPath = this.creatPath(list[i], i, type); canvas.add(tPath); //初始化生成文本 let tex = list[i].networkPort + "_" + list[i].index; let tb = this.makeText(tex, list[i], i, type); canvas.add(tb); //} } }, handleDataMovingRotating (type) { let that = this; let activeSelection = canvas.getActiveObject(); let activeRectIds = []; if (activeSelection) { if (activeSelection.isCheckTo) { activeRectIds.push(activeSelection.id); } else { let objs = activeSelection._objects; objs.forEach((o) => { if (o.type == "group" && o.groupId != "box") { let items = o._objects; items.forEach((item) => { activeRectIds.push(item.id); }); } else { activeRectIds.push(o.id); } }); } } canvas.forEachObject(function (obj, i) { if (["triangle", "line"].indexOf(obj.type) != -1) { if ( (obj.type == "line" && obj.startId && obj.strokeDashArray.length == 0) || obj.type == "triangle" ) { let startId = obj.startId; let endId = obj.endId; if ( activeRectIds.indexOf(startId) >= 0 || activeRectIds.indexOf(endId) >= 0 ) { let [x1, y1, x2, y2] = [0, 0, 0, 0]; that.allData.forEach((data) => { if (data.id == startId) { [x1, y1] = [data.x, data.y]; } else if (data.id == endId) { [x2, y2] = [data.x, data.y]; } }); if (obj.type == "line") { obj .set({ x1, y1, x2, y2, }) .setCoords(); } else if (obj.type == "triangle") { obj .set({ angle: that.getAngle(x1, y1, (x1 + x2) / 2, (y1 + y2) / 2), left: (x1 + x2) / 2, top: (y1 + y2) / 2, }) .setCoords(); } } } } }); }, //从新连线 handleData2 (type, isLine16) { let hiddenGroupIds = []; if (!isLine16) { for (let i = 0; i < this.groupList.length; i++) { if (this.groupList[i].hidden) { hiddenGroupIds.push(this.groupList[i].id); } } } //获取所有箱体数据处理 start canvas.forEachObject(function (obj, i) { if (["triangle", "line"].indexOf(obj.type) != -1) { canvas.remove(obj); } }); var typeWk = []; this.allData.forEach((item) => { if (typeWk.indexOf(item.networkPort) == -1) { typeWk.push(item.networkPort); } }); //console.log('一共有几个网口', typeWk) typeWk.forEach((item) => { var newarr = this.allData.filter(function (obj) { return obj.networkPort == item; }); newarr = newarr.sort((a, b) => { return a.index - b.index; }); newarr.forEach((m, n) => { m.index = n + 1; }); let result = []; newarr.forEach((item) => { if (hiddenGroupIds.indexOf(item.groupId) == -1) { result.push(item); } }); this.initLines(result, canvas, type); }); }, showHiddenLines () { //获取所有箱体数据处理 start canvas.forEachObject(function (obj, i) { if (["triangle", "line"].indexOf(obj.type) != -1) { canvas.remove(obj); } }); var typeWk = []; this.allData.forEach((item) => { if (typeWk.indexOf(item.networkPort) == -1) { typeWk.push(item.networkPort); } }); //console.log('一共有几个网口', typeWk) typeWk.forEach((item) => { var newarr = this.allData.filter(function (obj) { return obj.networkPort == item; }); newarr = newarr.sort((a, b) => { return a.index - b.index; }); newarr.forEach((m, n) => { m.index = n + 1; }); this.initLines(newarr, canvas, ""); }); }, //初始化生成线段 initLines (list, canvas, type) { list = list.sort((a, b) => { return a.index - b.index; }); for (var i = 0; i < list.length; i++) { var dot = list[i]; var todot = list[i]; if (parseInt(i) + 1 < list.length) { todot = list[parseInt(i) + 1]; } if (parseInt(i) + 1 != list.length) { lineArr["AAA" + i] = this.makeLine( [dot.x, dot.y, todot.x, todot.y], list[i], [], "", dot.id ? dot.id : dot.boxId, todot.id ? todot.id : todot.boxId ); canvas.add(lineArr["AAA" + i]); triangle["AAA" + i] = this.createArrowHead( dot.x, dot.y, (todot.x + dot.x) / 2, (todot.y + dot.y) / 2, 10, 10, list[i], type, dot.id ? dot.id : dot.boxId, todot.id ? todot.id : todot.boxId ); canvas.add(triangle["AAA" + i]); } } }, // rgb格局转换为rgba,透明度取0.5 getRGBA (rgb) { if (rgb == null) { return; } if (rgb.indexOf("rgb(") == 0) { let result = ["rgba("]; let startIndex = 4; let endIndex = rgb.indexOf(")"); result.push(rgb.substring(startIndex, endIndex)); result.push(", 0.5"); return result.join(""); } else { return rgb; } }, //初始化canvas画布背景点 initGrid () { var canvas = document.getElementById("canGrid"); canvas.width = this.canvasSize.width ? this.canvasSize.width * this.canvasZoom : 1920 * this.canvasZoom; canvas.height = this.canvasSize.height ? this.canvasSize.height * this.canvasZoom : 1080 * this.canvasZoom; var ctx = canvas.getContext("2d"); ctx.clearRect(0, 0, canvas.width, canvas.height); if (this.gridShow) { let space = this.canvasSpace * this.canvasZoom; //网格距离 let size = 1; //网格点宽高 let color = this.getRGBA(this.canvasColor); //网格点色彩 if (space < 5) { ctx.clearRect(0, 0, canvas.width, canvas.height); return; } let numX = Math.floor(canvas.width / space); let numY = Math.floor(canvas.height / space); for (let j = 1; j < numY; j++) { for (let i = 1; i < numX; i++) { ctx.beginPath(); ctx.fillStyle = color; ctx.fillRect(space * i, space * j, size, size); } } } }, resizeDown (e, type) { var that = this; console.log(that.cutData); this.cutMaskFlag = true; this.cutMaskType = type; this.cutRate = (this.source_crop.width - parseInt(this.maskLeft) - parseInt(this.maskRight)) / (this.source_crop.height - parseInt(this.maskTop) - parseInt(this.maskBottom)); console.log(this.cutRate); }, resizeMoving () { if (this.cutMaskFlag) { this.setEditCutFlag(true); let type = this.cutMaskType; let rate = this.cutRate; let [mouse, maskL, maskT] = [ this.mousePosition, this.getOffsetLeft(document.getElementById("maskSourceCut")), this.getOffsetTop(document.getElementById("maskSourceCut")) // this.source_crop.x + this.canvasSize.width / 4 + 100, // this.source_crop.y + this.canvasSize.height / 4 + 92, ]; let [greenMaskL, greenMaskT] = [parseInt(document.getElementById("maskSourceCut").style.left * this.canvasZoom), parseInt(document.getElementById("maskSourceCut").style.top * this.canvasZoom)]; // console.log(greenMaskT); // return; if (type.indexOf("c") == -1) { // 等比例裁剪 console.log(type); if ( type == "lt" && mouse.y >= maskT && mouse.y <= maskT + this.source_crop.height * this.canvasZoom - this.cutMinHeight * this.canvasZoom - parseInt(this.maskBottom) && mouse.x >= maskL && mouse.x <= maskL + this.source_crop.width * this.canvasZoom - this.cutMinWidth * this.canvasZoom - parseInt(this.maskRight) ) { if ((mouse.y - maskT) * rate >= mouse.x - maskL) { this.maskLeft = mouse.x - maskL + "px"; let width = this.source_crop.width * this.canvasZoom - parseInt(this.maskLeft) - parseInt(this.maskRight); let height = width / rate; this.maskTop = this.source_crop.height * this.canvasZoom - parseInt(this.maskBottom) - height + "px"; } else { this.maskTop = mouse.y - maskT + "px"; let height = this.source_crop.height * this.canvasZoom - parseInt(this.maskTop) - parseInt(this.maskBottom); let width = height * rate; this.maskLeft = this.source_crop.width * this.canvasZoom - parseInt(this.maskRight) - width + "px"; } } else if ( type == "rt" && mouse.y > maskT && mouse.y < maskT + this.source_crop.height * this.canvasZoom - this.cutMinHeight * this.canvasZoom - parseInt(this.maskBottom) && mouse.x < maskL + this.source_crop.width * this.canvasZoom && mouse.x > maskL + parseInt(this.maskLeft) + this.cutMinWidth * this.canvasZoom ) { if ((mouse.y - maskT) * rate >= maskL + this.source_crop.width * this.canvasZoom - mouse.x) { this.maskRight = maskL + this.source_crop.width * this.canvasZoom - mouse.x + "px"; let width = this.source_crop.width * this.canvasZoom - parseInt(this.maskLeft) - parseInt(this.maskRight); let height = width / rate; this.maskTop = this.source_crop.height * this.canvasZoom - parseInt(this.maskBottom) - height + "px"; } else { this.maskTop = mouse.y - maskT + "px"; let height = this.source_crop.height * this.canvasZoom - parseInt(this.maskTop) - parseInt(this.maskBottom); let width = height * rate; this.maskRight = this.source_crop.width * this.canvasZoom - parseInt(this.maskLeft) - width + "px"; } } else if ( type == "rb" && mouse.x < maskL + this.source_crop.width * this.canvasZoom && mouse.x > maskL + parseInt(this.maskLeft) + this.cutMinWidth * this.canvasZoom && mouse.y < maskT + this.source_crop.height * this.canvasZoom && mouse.y > maskT + parseInt(this.maskTop) + this.cutMinHeight * this.canvasZoom ) { console.log("我进入rb") if ( (maskT + this.source_crop.height * this.canvasZoom - mouse.y) * rate >= maskL + this.source_crop.width * this.canvasZoom - mouse.x ) { this.maskRight = maskL + this.source_crop.width * this.canvasZoom - mouse.x + "px"; let width = this.source_crop.width * this.canvasZoom - parseInt(this.maskLeft) - parseInt(this.maskRight); let height = width / rate; this.maskBottom = this.source_crop.height * this.canvasZoom - parseInt(this.maskTop) - height + "px"; } else { this.maskBottom = maskT + this.source_crop.height * this.canvasZoom - mouse.y + "px"; let height = this.source_crop.height * this.canvasZoom - parseInt(this.maskTop) - parseInt(this.maskBottom); let width = height * rate; this.maskRight = this.source_crop.width * this.canvasZoom - parseInt(this.maskLeft) - width + "px"; } } else if ( type == "lb" && mouse.x > maskL && mouse.x < maskL + this.source_crop.width * this.canvasZoom - this.cutMinWidth * this.canvasZoom - parseInt(this.maskRight) && mouse.y < maskT + this.source_crop.height * this.canvasZoom && mouse.y > maskT + parseInt(this.maskTop) + this.cutMinHeight ) { console.log("lb"); if ((maskT + this.source_crop.height * this.canvasZoom - mouse.y) * rate >= mouse.x - maskL) { this.maskLeft = mouse.x - maskL + "px"; // console.log(this.maskLeft); // console.log(this.maskRight); // return; let width = this.source_crop.width * this.canvasZoom - parseInt(this.maskLeft) - parseInt(this.maskRight); let height = width / rate; this.maskBottom = this.source_crop.height * this.canvasZoom - parseInt(this.maskTop) - height + "px"; } else { console.log("down"); this.maskBottom = maskT + this.source_crop.height * this.canvasZoom - mouse.y + "px"; let height = this.source_crop.height * this.canvasZoom - parseInt(this.maskTop) - parseInt(this.maskBottom); let width = height * rate; this.maskLeft = this.source_crop.width * this.canvasZoom - parseInt(this.maskRight) - width + "px"; } } } else { // 单边裁剪 console.log(type); console.log(mouse); if ( type == "ct" && mouse.y >= maskT && mouse.y <= maskT + this.source_crop.height * this.canvasZoom - this.cutMinHeight * this.canvasZoom - parseInt(this.maskBottom) ) { this.maskTop = mouse.y - maskT + "px"; } else if ( type == "cb" && mouse.y <= maskT + this.source_crop.height * this.canvasZoom && mouse.y >= maskT + parseInt(this.maskTop) + this.cutMinHeight * this.canvasZoom ) { this.maskBottom = maskT + this.source_crop.height * this.canvasZoom - mouse.y + "px"; console.log(this.maskBottom); } else if ( type == "lc" && mouse.x >= maskL && mouse.x <= maskL + this.source_crop.width * this.canvasZoom - this.cutMinWidth * this.canvasZoom ) { this.maskLeft = mouse.x - maskL + "px"; } else if ( type == "rc" && mouse.x <= maskL + this.source_crop.width * this.canvasZoom && mouse.x >= maskL + parseInt(this.maskLeft) + this.cutMinWidth * this.canvasZoom ) { console.log(mouse.x); this.maskRight = maskL + this.source_crop.width * this.canvasZoom - mouse.x + "px"; } } let canGrid = document.getElementById("canGrid"); let num = this.limitSourceSpace; console.log(num); let [left, top, width, height] = [this.source_crop.left + parseInt(this.maskLeft), this.source_crop.top + parseInt(this.maskTop), this.source_crop.width - parseInt(this.maskLeft) - parseInt(this.maskRight), this.source_crop.height - parseInt(this.maskTop) - parseInt(this.maskBottom)]; // //限度上边 // if (top + height <= parseInt(canGrid.style.top) + num) { // this.maskBottom = greenMaskT + this.sourceData.height - parseInt(canGrid.style.top) - num // } // // 限度右边 // if (left + width <= parseInt(canGrid.style.left) + num) { // console.log("12312"); // this.maskRight = greenMaskL + this.source_crop.width - parseInt(canGrid.style.left) - num; // } // // 限度底边 // if (top >= parseInt(canGrid.style.top) + canGrid.height - num) { // top = parseInt(canGrid.style.top) + canGrid.height - num; // this.maskTop = top - this.sourceData.top; // } // //限度左边 // if (left >= parseInt(canGrid.style.left) + canGrid.width - num) { // console.log("12312__"); // left = parseInt(canGrid.style.left) + canGrid.width - num; // this.maskLeft = left - this.sourceData.left; // } } }, resizeMove (e, type) { // 具体逻辑见 resizeMoving }, resizeUp (e, type) { this.cutMaskFlag = false; let clientX = e.clientX; let clientY = e.clientY; this.cutMaskType = ""; this.cutRate = 1; }, quitAddRect () { console.log("勾选敞开"); if ('canvas_online' == this.currentMode) { bus.$emit("backUpPortList", ""); this.leaveOnLine(); } this.addBoxParams = []; //点勾选清空上次新增追随箱体 //str--右键退出自定义连线状态 this.isChangeLine = false; this.startPort = {}; this.endPort = {}; this.addlineDash = 1; //end--右键退出自定义连线状态 rightKey = false; this.setActiveChangeLine(true); canvas.forEachObject((obj, i) => { if ((obj.strokeDashArray && obj.strokeDashArray.length != 0) || obj.jt) { canvas.remove(obj); } if (obj.type == "group" && obj.groupId == "box") { obj.set({ selectable: true }); } }); this.handleData2('') canvas.renderAll(); if (firstAdd) { canvas.discardActiveObject(); canvas.remove(firstAdd); firstAdd = ""; } this.setMode("canvas"); this.setCurrentMode("canvas"); }, //增加在离线箱体前抉择网口 addRect (parms) { //type:离线在线, group:卡槽 index:网口 if (firstAdd) { canvas.remove(firstAdd); firstAdd = ""; this.addBoxParams = []; this.newBoxes = []; } this.addAngle = 0; this.parms = parms; let ids = {}; rightKey = true; if (parms.type == "offline") { if (!parms.group) { //没选卡槽 网口 ids = { networkPort: 0, index: 0, portId: 0, slotId: 0 }; } else { ids = { networkPort: parms.index, index: 0, portId: parms.portId, slotId: parms.slotId }; } let boxList = this.boxTypeList.filter((obj, i) => { return obj.id == this.boxType; }); let par = { width: boxList.length>0?boxList[0].scan_w : 100, height: boxList.length>0?boxList[0].scan_h : 100, type: boxList.length>0?boxList[0].name :5, x: -100, y: -100, boxFileId: this.boxType, boxStatus: 1, rotationAngle: 0, visible: true, }; let arr = Object.assign(ids, par); this.addBoxParams.push(arr); firstAdd = this.groupAdd(arr, canvas); canvas.add(firstAdd); } }, clickOnLine (item) { var _this = this; let params = { params: { nSlotId: item.slotId, nPortId: item.portId, method: 2 }, success (res) { }, error (res) { // _this.$message.error(_this.$t('findBoxFileFail')); }, }; _this.$store.dispatch("sendOSD", params); }, leaveOnLine () { var _this = this; let params = { params: { method: 0 }, success (res) { }, error (res) { // _this.$message.error(_this.$t('findBoxFileFail')); }, }; _this.$store.dispatch("sendOSD", params); }, //增加在线箱体前抉择网口 addOnlineRect (parms, type) { this.addAngle = 0; // bus.$emit("updatePortList","1"); var that = this; if (firstAdd) { canvas.remove(firstAdd); firstAdd = ""; this.addBoxParams = []; } // parms.networkPort = parms.portId; this.parms = { type: "onLine", group: parms.networkPort, index: parms.networkPort, portId: parms.portId, slotId: parms.slotId, list: parms.list, networkPort: parms.networkPort, rotationAngle: 0, }; rightKey = true; let indexIndex = that.allData.filter(function (obj, i) { return obj.networkPort == parms.networkPort; }); let ids = { networkPort: parms.networkPort, index: 0, }; let _index = indexIndex.length + 1; this.onlineBoxLength = parms.list.length; if (_index > this.onlineBoxLength) { this.leaveOnLine(); if (type != "1") { this.setCurrentMode("canvas"); this.quitAddRect(); this.setShowBack(false); this.setAddBoxMode(false); this.setMaskLeftMenu(false); this.setActiveChangeLine(true); this.setActiveConnectLine(true); this.$message({ duration: 2000, message: that.$t('ExceedingTheLoadOfTheBox'), type: "error", }); } else { this.$message({ duration: 2000, message: that.$t("TheNetPortWithLoadBoxHasBeenAdded"), type: "error", }); } return } this.clickOnLine(parms); var addData = parms.list[_index - 1]; let addRectWidth = 100; let addRectHeight = 100; for (let items of this.boxTypeList) { if (items.main_type == addData.mainType) { addRectWidth = items.scan_w; addRectHeight = items.scan_h; this.onLineBoxType = items.id; //箱体类型id } } if (this.onLineBoxType == "") { this.$message({ duration: 2000, message: this.$t('checkBoxFile'), type: "error", }); this.setCurrentMode("canvas"); return; } let par = { width: addRectWidth, height: addRectHeight, type: this.onLineBoxType, x: -100, y: -100, boxFileId: this.onLineBoxType, boxStatus: 2, rotationAngle: 0, visible: true, portId: parms.portId, slotId: parms.slotId, }; let arr = Object.assign(ids, par); this.addBoxParams.push(arr); firstAdd = this.groupAdd(arr, canvas); canvas.add(firstAdd); }, getOffsetLeft (el) { //获取鼠标X轴 el = el.getBoundingClientRect(); return el.left + window.scrollX; }, getOffsetTop (el) { //获取鼠标Y轴 el = el.getBoundingClientRect(); return el.top + window.scrollY; }, activeBoxOption (array, type) { let that = this; array.forEach((pp) => { canvas.forEachObject((obj, i) => { let rectList = that.allData.filter(function (objs, i) { return objs.id == obj.id; }); if (obj.id == pp.id) { if (obj.type == "circle") { obj.set({ left: rectList[0].x, top: rectList[0].y, angle: rectList[0].rotationAngle, }); //console.log(i + 1, '输入多个矩形坐标角度:', pp.rotationAngle, obj.type, obj, pp) } else { let x1 = rectList[0].x - rectList[0].width / 2; let y1 = rectList[0].y - rectList[0].height / 2; let prot = that.rotatoNi( x1, y1, rectList[0].x, rectList[0].y, parseInt(rectList[0].rotationAngle) ); let x = (prot.x - rectList[0].x) / 1.5 + rectList[0].x; let y = (prot.y - rectList[0].y) / 1.5 + rectList[0].y; if (obj.type == "textbox") { obj.set({ left: x, top: y, }); } if (obj.type == "path") { //console.log(rectList, '以后箱体旋转类型:', obj.type, obj) obj.set({ left: prot.x, top: prot.y, angle: rectList[0].rotationAngle, }); } } } }); }); if (array.length > 1) { canvas.forEachObject((obj, i) => { if (["triangle", "line"].indexOf(obj.type) != -1) { canvas.remove(obj); } }); that.initLines(that.allData, canvas, "123"); } }, changeGroupList (groupList) { var that = this; groupList.forEach(item => { if (item.isShow == "0") { item.hidden = false; } else if (item.isShow == "1") { item.hidden = true; } }); that.setGroupList(groupList); // for (let i = 0; i < groupList.length; i++) { // if (groupList[i].areaId == that.areaId && groupList[i].id == groupId) { // that.setSelectGroupIndex(i); // break; // } // } }, },};</script><style lang="less" scoped> #canvasContainer { position: relative; width: calc(100% + 100px); height: calc(100% + 100px); } #canvasBox { position: relative; width: 100%; height: 100%; z-index: 1; } #canGrid { background: #262829; position: absolute; overflow: hidden; z-index: 1; } /deep/ .canvas-container { position: absolute !important; z-index: 2 !important; } #cutSourceZone { position: absolute; display: none; } #maskArea { z-index: 4; display: none; position: absolute; border: white dashed 1px; } #maskSourceCut { // background-color: green; opacity: 0.5; z-index: 5; display: none; position: absolute; .mask { position: absolute; background: #409eff; opacity: 0.3; z-index: 6; .hander { position: absolute; background-color: white; border-radius: 5px; } .hander_lt { left: -5px; top: -5px; cursor: se-resize; } .hander_ct { height: 10px; left: 50%; top: -5px; transform: translateX(-50%); border-radius: 5px 5px 0 0; cursor: s-resize; } .hander_rt { right: -5px; top: -5px; cursor: sw-resize; } .hander_rc { width: 10px; right: -5px; top: 50%; transform: translateY(-50%); border-radius: 0 5px 5px 0; cursor: w-resize; } .hander_rb { right: -5px; bottom: -5px; cursor: nw-resize; } .hander_cb { height: 5px; bottom: -5px; left: 50%; transform: translateX(-50%); border-radius: 0 0 5px 5px; cursor: n-resize; } .hander_lb { left: -5px; bottom: -5px; cursor: ne-resize; } .hander_lc { width: 10px; left: -5px; top: 50%; transform: translateY(-50%); border-radius: 5px 0 0 5px; cursor: e-resize; } .maskCenter { position: absolute; left: 0; top: 0; width: 100%; height: 100%; z-index: 5; background-color: #409eff; } } }</style>