nicecode-v2/packages/meta/es/ImageEditor/viewer/shape.js

257 lines
11 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
// @ts-nocheck
import { isNil, isArray, isFunction } from '@zhst/func';
import * as turf from '@turf/turf';
import booleanPointInPolygon from '@turf/boolean-point-in-polygon';
import { rectToPolygon } from "./helper";
import { SHAPE_TYPE_RECT, SHAPE_TYPE_CIRCLE, EVENT_SHAPE_SELECT } from "./constants";
import { dispatchEvent } from "../utils";
export default {
//store
shapeList: [],
hoverShapId: null,
selectShapId: null,
//是否开启人脸
isEyeOpen: false,
//是否移动
movable: true,
//是否放大缩小
zoomable: true,
//禁止添加shap
disableAdd: false,
//自定义画框的颜色
color: '',
changeEyeModel: function changeEyeModel(isOpen) {
if (isOpen) {
this.isEyeOpen = true;
this.changeMoveAble(false);
this.changeZoonAble(false);
} else {
this.isEyeOpen = false;
this.changeMoveAble(true);
this.changeZoonAble(true);
}
},
//method添加矩形
addShape: function addShape(shape) {
var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : SHAPE_TYPE_RECT;
this.color = shape.color ? shape.color : '';
if (isNil(shape) || this.disableAdd) return;
var _this$shapeList = this.shapeList,
preShapeList = _this$shapeList === void 0 ? [] : _this$shapeList;
var _shapeList = isArray(shape) ? shape : [shape];
_shapeList = _shapeList.map(function (v) {
return _objectSpread(_objectSpread({}, v), {}, {
__SHAPE_TYPE__: type
});
});
this.shapeList = [].concat(_toConsumableArray(preShapeList), _toConsumableArray(_shapeList));
},
//
setSelectShapId: function setSelectShapId(id) {
this.selectShapId = id;
dispatchEvent(this.element, EVENT_SHAPE_SELECT, id);
},
getSelectShape: function getSelectShape() {
var _this = this;
var contain = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
var selectShapeList = [];
var selectShape = this.shapeList.find(function (v) {
return v['id'] === _this.selectShapId;
});
selectShape && selectShapeList.push(selectShape);
if (contain && selectShape) {
var originFeature = rectToPolygon(this.imgRectAxisToCanvasAxisRect(selectShape));
for (var i = 0; i < this.shapeList.length; i++) {
var shape = this.shapeList[i];
if (shape['id'] !== this.selectShapId) {
var feature = rectToPolygon(this.imgRectAxisToCanvasAxisRect(shape));
var isContain = turf.booleanContains(originFeature, feature);
isContain && selectShapeList.push(shape);
}
}
}
return selectShapeList;
},
replaceShape: function replaceShape(shape) {
var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : SHAPE_TYPE_RECT;
if (isNil(shape)) return;
var _this$shapeList2 = this.shapeList,
preShapeList = _this$shapeList2 === void 0 ? [] : _this$shapeList2;
var _shape;
if (isFunction(shape)) {
_shape = shape(preShapeList);
} else {
_shape = shape;
}
var shapList = isArray(_shape) ? _shape : [_shape];
shapList = shapList.map(function (v) {
return _objectSpread(_objectSpread({}, v), {}, {
__SHAPE_TYPE__: type
});
});
this.shapeList = _toConsumableArray(shapList);
},
clearShape: function clearShape() {
this.shapeList = [];
},
calcSelectShape: function calcSelectShape(canvasPoint) {
// todo:有问题
var shapeList = this.shapeList,
image = this.image;
var selectAbleShape = shapeList.filter(function (_ref) {
var _ref$selectAble = _ref.selectAble,
selectAble = _ref$selectAble === void 0 ? true : _ref$selectAble;
return !!selectAble;
});
//判断落点离哪个形状最近
var minId = null;
var minDis = Number.MAX_VALUE;
var pt = turf.point([canvasPoint.x, canvasPoint.y]);
for (var i = 0; i < selectAbleShape.length; i++) {
var shape = selectAbleShape[i];
var axisRect = this.imgRectAxisToCanvasAxisRect(shape);
var polygon = turf.polygon([[[axisRect.x, axisRect.y], [axisRect.x2, axisRect.y], [axisRect.x2, axisRect.y2], [axisRect.x, axisRect.y2], [axisRect.x, axisRect.y]]]);
var isPtInPolygon = booleanPointInPolygon(pt, polygon);
if (isPtInPolygon) {
//如果点在多变形内 判断距离是否是最短
var line = turf.polygonToLine(polygon);
var distance = turf.pointToLineDistance(pt, line, {
method: 'planar'
});
if (distance < minDis) {
minDis = distance;
minId = shape['id'];
}
}
}
return minId;
},
clearSelectShape: function clearSelectShape() {
this.setSelectShapId(null);
},
changeMoveAble: function changeMoveAble() {
var movable = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
this.movable = movable;
},
changeZoonAble: function changeZoonAble() {
var zoomable = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
this.zoomable = zoomable;
},
disabledAddShap: function disabledAddShap() {
var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
this.disableAdd = value;
},
renderShape: function renderShape(ctx) {
var shapeList = this.shapeList;
//先排序
var selectShapeList = [];
var hoverShapeList = [];
var normalShapeList = [];
for (var i = 0; i < shapeList.length; i++) {
var shape = shapeList[i];
var isSelectShape = this.selectShapId === shape['id'];
var isHoverShape = this.hoverShapId === shape['id'];
if (isSelectShape) {
selectShapeList.push(shape);
} else if (isHoverShape) {
hoverShapeList.push(shape);
} else {
normalShapeList.push(shape);
}
}
// const sortShapeList = shapeList.sort((a, b) => (this.isHightLight(a) ? 1 : -1));
//渲染
for (var _i = 0; _i < normalShapeList.length; _i++) {
var _shape2 = normalShapeList[_i];
var __SHAPE_TYPE__ = _shape2.__SHAPE_TYPE__;
switch (__SHAPE_TYPE__) {
case SHAPE_TYPE_RECT:
this.renderRect(ctx, _shape2, 'normal');
break;
case SHAPE_TYPE_CIRCLE:
this.renderPoint(ctx, _shape2, 'normal');
break;
default:
break;
}
}
for (var _i2 = 0; _i2 < hoverShapeList.length; _i2++) {
var _shape3 = hoverShapeList[_i2];
var _SHAPE_TYPE__ = _shape3.__SHAPE_TYPE__;
switch (_SHAPE_TYPE__) {
case SHAPE_TYPE_RECT:
this.renderRect(ctx, _shape3, 'hover');
break;
default:
break;
}
}
for (var _i3 = 0; _i3 < selectShapeList.length; _i3++) {
var _shape4 = selectShapeList[_i3];
var _SHAPE_TYPE__2 = _shape4.__SHAPE_TYPE__;
switch (_SHAPE_TYPE__2) {
case SHAPE_TYPE_RECT:
this.renderRect(ctx, _shape4, 'select');
break;
default:
break;
}
}
},
// 绘制矩形
renderRect: function renderRect(ctx, shape, type) {
//算rect
var axisRect = this.imgRectAxisToCanvasAxisRect(_objectSpread(_objectSpread({}, shape), {}, {
image: ctx.canvas
}));
var rect = {
x: axisRect.x2 > axisRect.x ? axisRect.x : axisRect.x2,
y: axisRect.y2 > axisRect.y ? axisRect.y : axisRect.y2,
w: Math.abs(axisRect.x2 - axisRect.x),
h: Math.abs(axisRect.y2 - axisRect.y)
};
//画
ctx.save();
if (type === 'normal') {
ctx.strokeStyle = this.color ? this.color : '#FFF566';
ctx.lineWidth = 2;
ctx.strokeRect.apply(ctx, _toConsumableArray(Object.values(rect)));
}
if (type === 'hover') {
ctx.fillStyle = 'rgba(0, 153, 255, 0.3)';
ctx.fillRect.apply(ctx, _toConsumableArray(Object.values(rect)));
ctx.strokeStyle = 'rgba(92, 219, 211, 1)';
ctx.lineWidth = 2;
ctx.strokeRect.apply(ctx, _toConsumableArray(Object.values(rect)));
}
if (type === 'select') {
ctx.strokeStyle = 'rgba(255, 0, 0, 1)';
ctx.lineWidth = 2;
ctx.strokeRect.apply(ctx, _toConsumableArray(Object.values(rect)));
}
ctx.restore();
},
renderPoint: function renderPoint(ctx, shape) {
var originAxis = this.imgAxisToOriginAxis(shape);
var canvasAxis = this.originAxisToCanvasAxis(originAxis);
//画
ctx.save();
ctx.beginPath();
ctx.arc(canvasAxis.x, canvasAxis.y, 2, 0, 2 * Math.PI);
ctx.fillStyle = '#DF0101';
ctx.fill();
ctx.restore();
}
};