<script>
export default {
data () {
return {
setColor: ['#FF0000', '#F2C94C', '#EBFF00', '#9B51E0', '#6FCF97',
'#F2F2F2', '#00FFF0', '#33FF00', '#00A3FF', '#FF00C7', '#FF7A00', '#0075FF']
}
},
mounted () {
},
methods: {
oCoords (w, h, x2, y2, reg) {
return {
tl: this.rotatoNi(x2 - w / 2, y2 - h / 2, x2, y2, reg),
tr: this.rotatoNi(x2 + w / 2, y2 - h / 2, x2, y2, reg),
bl: this.rotatoNi(x2 - w / 2, y2 + h / 2, x2, y2, reg),
br: this.rotatoNi(x2 + w / 2, y2 + h / 2, x2, y2, reg)
}
},
rotatoNi (x1, y1, x2, y2, reg) {
// 在平面坐标上,任意点P(x1,y1),绕一个坐标点Q(x2,y2)逆时针旋转θ角度后,新的坐标设为(x, y)的计算公式:
// x= (x1 - x2)*cos(θ) - (y1 - y2)*sin(θ) + x2 ;
// y= (x1 - x2)*sin(θ) + (y1 - y2)*cos(θ) + y2 ;
let x = parseInt((x1 - x2) * Math.cos(Math.PI * reg / 180) - (y1 - y2) * Math.sin(Math.PI * reg / 180) + x2);
let y = parseInt((x1 - x2) * Math.sin(Math.PI * reg / 180) + (y1 - y2) * Math.cos(Math.PI * reg / 180) + y2);
return { x: x, y: y } //旋转后的坐标(x,y)
},
rotatoNi2 (x1, y1, x2, y2, reg) {
let x = ((x1 - x2) * Math.cos(Math.PI * reg / 180) - (y1 - y2) * Math.sin(Math.PI * reg / 180) + x2);
let y = ((x1 - x2) * Math.sin(Math.PI * reg / 180) + (y1 - y2) * Math.cos(Math.PI * reg / 180) + y2);
return { x: x, y: y } //旋转后的坐标(x,y)
},
//左上角直角三角形
creatPath (list, i, type) {
//console.log('当前箱体左上角直角三角形数据', list, i, type)
let wc = 0
let x1 = list.x - list.width / 2 + wc
let y1 = list.y - list.height / 2 + wc
let prot = this.rotatoNi(x1, y1, list.x, list.y, list.rotationAngle)
let x = prot.x
let y = prot.y
let u = 'M ' + x + ' ' + y + ' L ' + (x + 10) + ' ' + y + ' L ' + x + ' ' + (y + 10) + ' z'
var path = new fabric.Path(u);
//console.log(i + '三角形的坐标点', x, y)
return path.set({
angle: list.rotationAngle,
left: x, //距离画布上边的距离
top: y, //距离画布左侧的距离,单位是像素
fill: '#FFFFFF', //填充的颜色
selectable: false,
stroke: '#FFFFFF', // 边框颜色
opacity: 0.3,
strokeWidth: 1,
id: list.id,
networkPort: list.networkPort,
operateType: type,
});
},
//创建中心点
makeCircle2 (list) {
var circle = new fabric.Circle({
originX: "center",
originY: "center",
left: list.x, //距离画布上边的距离
top: list.y, //距离画布左侧的距离,单位是像素
radius: 4, //圆形半径
fill: '#000', //填充的颜色
stroke: this.setColor[list.portId % 12] ? this.setColor[list.portId % 12] : '#fff', // 边框颜色
selectable: false,
evented: false,
id: list.id,
networkPort: list.networkPort,
index: list.index,
hoverCursor: "pointer",//鼠标指针方式
strokeWidth: 2 // 边框大小
});
return circle
},
//创建文本
makeText (t, list, i, type) {
let x1 = list.x - list.width / 2
let y1 = list.y - list.height / 2
let prot = this.rotatoNi(x1, y1, list.x, list.y, list.rotationAngle)
let x = (prot.x - list.x) / 1.5 + list.x
let y = (prot.y - list.y) / 1.5 + list.y
//console.log(i + '文本的坐标点', x, y)
var textBox = new fabric.Textbox(t, {
/* originX: "left",
originY: "top", */
originX: "center",
originY: "center",
left: x,
top: y,
centeredRotation: true, //中心旋转
fontSize: 12,
selectable: false,
evented: false,
networkPort: list.networkPort,
fill: '#fff',
id: list.id,
operateType: type,
});
return textBox
},
//创建矩形
makeRect (left, top, ids, width, height, angle, groupId, boxId, boxFileId) {
let rect = new fabric.Rect({
//rx: 4, //圆角半径
// ry: 4, //圆角半径
angle: angle,
left: left,
top: top,
originX: "center", //相对于坐标点位置
originY: "center", //相对于坐标点位置
width: width,
height: height,
//hoverCursor: "pointer",
fill: "rgba(0,153,255,0.20)",//"#1C445E",
stroke: '#136094', // 边框颜色
strokeWidth: 2, // 边框大小
borderColor: "#0099FF", //选中边框色
cornerStyle: "circle", // 手柄形状 正方形 rect||圆 circle
cornerColor: "#0099FF", //手柄背景色
cornerStrokeColor: "#0099FF", //手柄框边框
hasControls: true, //手柄
hasBorders: true, //手柄线
visible: true, //是否可见
selectable: true, //是否可选择的对象
evented: true, //是否拖动
centeredRotation: true, //中心旋转
centeredScaling: true, //居中缩放
transparentCorners: false, //选中框透明角
preserveObjectStacking: true,
// opacity: 0.5,
networkPort: ids.networkPort,//网口
index: ids.index,//序号
groupId: groupId,
id: boxId ? boxId : null,
boxFileId: boxFileId,
//lockRotation: true,//锁定对象旋转
});
rect.setControlsVisibility({
mt: false,
mb: false,
bl: false,
br: false,
tl: false,
tr: false,
mr: false,
ml: false,
mtr: true,
});
return rect;
},
//创建线段
/*
coords 坐标
list 当前对象
arr虚线
jt, 虚线箭头
*/
makeLine (coords, list, arr, jt, startId, endId) {
//console.log('list.networkPort', list.networkPort)
return new fabric.Line(coords, {
fill: this.setColor[list && list.portId % 12] ? this.setColor[list && list.portId % 12] : '#fff',
stroke: this.setColor[list && list.portId % 12] ? this.setColor[list && list.portId % 12] : '#fff',
strokeWidth: 2,
originX: "center",
originY: "center",
selectable: false,
evented: false,
hasControls: false,
hasBorders: false,
hasRotatingPoint: false,
hoverCursor: "default",
index: list.index,
networkPort: list && list.networkPort,
jt: jt || '',
id: list && list.id,
startId,
endId, //myJoker: arr,
strokeDashArray: arr || [],
huadongbs: list.huadongbs || false
});
},
//创建连线上的实体三角形箭头
createArrowHead (x1, y1, x2, y2, width, height, list, type, startId, endId) {
return new fabric.Triangle({
angle: this.getAngle(x1, y1, x2, y2),
fill: "white",
top: y2,
left: x2,
width: width,
height: height,
originX: "center",
originY: "center",
selectable: false,
evented: false,
id: list.id,
index: list.index,
networkPort: list.networkPort,
startId,
endId,
huadongbs: list.huadongbs || false
});
},
/* 绘制箭头函数 ------->--------
fromX, fromY:起点坐标(也可以换成p1,只不过它是一个数组)
toX, toY:终点坐标 (也可以换成p2,只不过它是一个数组)
theta:三角斜边一直线夹角
headlen:三角斜边长度
width:箭头线宽度
color:箭头颜色 */
drawArrow (canvas, fromX, fromY, toX, toY, theta, headlen, width, color) {
width = 1;//箭头宽度设置为1
var theta = theta || 30,
headlen = headlen || 10,
width = width || 1,
color = color || '#000',
angle = Math.atan2(fromY - toY, fromX - toX) * 180 / Math.PI,
angle1 = (angle + theta) * Math.PI / 180,
angle2 = (angle - theta) * Math.PI / 180,
topX = headlen * Math.cos(angle1),
topY = headlen * Math.sin(angle1),
botX = headlen * Math.cos(angle2),
botY = headlen * Math.sin(angle2);
var arrowX, arrowY;
arrowX = toX + topX; //箭头结尾左边坐标
arrowY = toY + topY;
canvas.add(this.makeLine([arrowX, arrowY, toX, toY], '', [], 'jt'));
//ctx.moveTo(arrowX, arrowY);
//ctx.lineTo(toX, toY); //箭头开始坐标
arrowX = toX + botX; //箭头结尾右边坐标
arrowY = toY + botY;
canvas.add(this.makeLine([arrowX, arrowY, toX, toY], '', [], 'jt'));
// ctx.lineTo(arrowX, arrowY);
},
//三角形角度计算
getAngle (x1, y1, x2, y2) {
var dx = x2 - x1,
dy = y2 - y1,
angle = Math.atan2(dy, dx);
angle *= 180 / Math.PI;
angle += 90;
return angle;
},
// //改变画布大小
// zoomIt (factor) { // factor: 比例
// let cWidth = canvas.width;
// canvas.setWidth(cWidth * factor);
// canvas.setHeight(cWidth * factor);
// if (canvas.backgroundImage) {
// var bi = canvas.backgroundImage;
// bi.width = bi.width * factor;
// bi.height = bi.height * factor;
// }
// var objects = canvas.getObjects();
// for (var i in objects) {
// var scaleX = objects[i].scaleX;
// var scaleY = objects[i].scaleY;
// var left = objects[i].left;
// var top = objects[i].top;
// var tempScaleX = scaleX * factor;
// var tempScaleY = scaleY * factor;
// var tempLeft = left * factor;
// var tempTop = top * factor;
// objects[i].scaleX = tempScaleX;
// objects[i].scaleY = tempScaleY;
// objects[i].left = tempLeft;
// objects[i].top = tempTop;
// objects[i].setCoords();
// }
// canvas.renderAll();
// canvas.calcOffset();
// },
//阻止右键默认行为
preventYj () {
$(document).contextmenu(function (ev) {
if (ev.preventDefault) {
ev.preventDefault();
} else {
window.event.returnValue = false;
}
})
},
getTanDeg (tan) {
var result = Math.atan(tan) / (Math.PI / 180);
result = parseInt(result);
return result;
},
//自定义修改序号重新排序
setArrIndex (str, end, list) {
for (var i = 0; i < list.length; i++) {
if (end.index > list[i].index && list[i].index > str.index) {
list[i].index = list[i].index + 1
}
if (end.id == list[i].id) {
list[i].index = str.index + 1
}
}
list = list.sort((a, b) => {
return a.index - b.index
});
return list;
},
//自定义修改序号重新排序
setArrIndex2 (str, end, list) {
//序号2和4 实际就是3和4调换位置
if (str.index < end.index) {
list[str.index] = list.splice(end.index - 1, 1, list[str.index])[0];
for (var i = 0; i < list.length; i++) {
list[i].index = i + 1
}
} else {
list[end.index - 1].index = str.index
for (var i = 0; i < list.length; i++) {
if (str.index > list[i].index && list[i].index > end.index) {
list[i].index = list[i].index - 1
}
}
list[str.index - 1].index = str.index - 1
list = list.sort((a, b) => {
return a.index - b.index
});
}
return list;
},
compare (pro) {
return function (obj1, obj2) {
var val1 = obj1[pro];
var val2 = obj2[pro];
if (val1 < val2) { //正序
return 1;
} else if (val1 > val2) {
return -1;
} else {
return 0;
}
}
},
isMouseoeut (x, y) {
let that = this
var a = -15
let cdiv = document.getElementById("canvasZone")
var X1 = that.getOffsetLeft(cdiv) - a
var Y1 = that.getOffsetTop(cdiv) - a
var X2 = that.getOffsetLeft(cdiv) + cdiv.offsetWidth + a
var Y2 = that.getOffsetTop(cdiv) + cdiv.offsetHeight + a
if (x < X2 && x > X1 && y < Y2 && y > Y1) {
return true
} else {
return false
}
},
groupAdd (list, canvas) {
//console.log('新式分组')
/* x.y表示左上角点 */
var x1 = -50, y1 = -50, width = 100, height = 100;
let x = list.x - list.width / 2
let y = list.y - list.height / 2
let u = 'M ' + x + ' ' + y + ' L ' + (x + 10) + ' ' + y + ' L ' + x + ' ' + (y + 10) + ' z'
var path2 = new fabric.Path(u);
//左上角三角形
path2.set({
left: this.face == true ? (-(list.width / 2)) : (list.width / 2),
left: this.showFace == true ? (-(list.width / 2)) : (list.width / 2), top: -(list.height / 2),
fill: '#dadcdb', //填充的颜色
opacity: list.boxStatus == 1 ? 0.3 : 1,
strokeWidth: 1,
angle: this.face == true ? 0 : 90,
angle: this.showFace == true ? 0 : 90,
})
var t = list.index == 0 ? '' : (list.slotId ? list.slotId : 0) + "_" + (list.portId ? list.portId : 0) + "_" + list.index
//文字
// console.log(this.face);
var text2 = new fabric.Text(t, {
angle: -list.rotationAngle,
fontSize: 12,
originX: 'center',
originY: 'center',
fill: '#fff',
left: this.face == true ? (-(list.width / 2) + 20) : (list.width / 2 - 20),
left: this.showFace == true ? (-(list.width / 2) + 20) : (list.width / 2 - 20),
top: -(list.height / 2) + 20,
});
//中心点
var circle2 = new fabric.Circle({
originX: "center",
originY: "center",
radius: 4, //圆形半径
fill: '#000', //填充的颜色
stroke: this.setColor[list.portId] ? this.setColor[list.portId] : '#fff', // 边框颜色
selectable: false,
evented: false,
hoverCursor: "pointer",//鼠标指针方式
strokeWidth: 2 // 边框大小
});
//矩形
var rect2 = new fabric.Rect({
width: list.width,
height: list.height,
originX: 'center',
originY: 'center',
fill: "rgba(0,153,255,0.20)",//"#1C445E",
stroke: '#136094', // 边框颜色
strokeWidth: 2, // 边框大小
borderColor: "#0099FF", //选中边框色
cornerStyle: "circle", // 手柄形状 正方形 rect||圆 circle
cornerColor: "#0099FF", //手柄背景色
cornerStrokeColor: "#0099FF", //手柄框边框
centeredRotation: true,
portId: list.portId,
slotId: list.slotId,
isSwitch: list.isSwitch,
});
var group2 = new fabric.Group([rect2, circle2, text2, path2], {
left: list.x,
top: list.y,
width: list.width,
height: list.height,
originX: 'center',
originY: 'center',
isCheckTo: true, //有这个字段表示单选,没有多选
networkPort: list.networkPort,//网口
index: list.index,//序号
groupId: 'box',
groupIdd: list.groupId,
id: list.id,
angle: list.rotationAngle,
centeredRotation: true,
fill: "#0099FF",//"#1C445E",
stroke: '#0099FF', // 边框颜色
strokeWidth: 2, // 边框大小
borderColor: "#0099FF", //选中边框色
cornerStyle: "circle", // 手柄形状 正方形 rect||圆 circle
cornerColor: "#0099FF", //手柄背景色
cornerStrokeColor: "#0099FF", //手柄框边框
huadongbs: list.huadongbs || false,
boxFileId: list.boxFileId,
portId: list.portId,
slotId: list.slotId,
isSwitch: list.isSwitch,
//scaleX: this.canvasZoom,
//scaleY: this.canvasZoom
});
return group2
}
},
};
</script>
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。