乐趣区

关于fabric.js:fabricjs-矩形拖动效果ScreenCanvasvue

<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 yesSddBox
import 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>
退出移动版