UNPKG

@antv/x6

Version:

JavaScript diagramming library that uses SVG and HTML for rendering.

139 lines 5.98 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { if (ar || !(i in from)) { if (!ar) ar = Array.prototype.slice.call(from, 0, i); ar[i] = from[i]; } } return to.concat(ar || Array.prototype.slice.call(from)); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.loop = void 0; var geometry_1 = require("../../geometry"); function rollup(points, merge) { if (merge != null && merge !== false) { var amount = typeof merge === 'boolean' ? 0 : merge; if (amount > 0) { var center1 = geometry_1.Point.create(points[1]).move(points[2], amount); var center2 = geometry_1.Point.create(points[1]).move(points[0], amount); return __spreadArray(__spreadArray([center1.toJSON()], points, true), [center2.toJSON()], false); } { var center = points[1]; return __spreadArray(__spreadArray([__assign({}, center)], points, true), [__assign({}, center)], false); } } return points; } var loop = function (vertices, options, edgeView) { var width = options.width || 50; var height = options.height || 80; var halfHeight = height / 2; var angle = options.angle || 'auto'; var sourceAnchor = edgeView.sourceAnchor; var targetAnchor = edgeView.targetAnchor; var sourceBBox = edgeView.sourceBBox; var targetBBox = edgeView.targetBBox; if (sourceAnchor.equals(targetAnchor)) { var getVertices = function (angle) { var rad = geometry_1.Angle.toRad(angle); var sin = Math.sin(rad); var cos = Math.cos(rad); var center = new geometry_1.Point(sourceAnchor.x + cos * width, sourceAnchor.y + sin * width); var ref = new geometry_1.Point(center.x - cos * halfHeight, center.y - sin * halfHeight); var p1 = ref.clone().rotate(-90, center); var p2 = ref.clone().rotate(90, center); return [p1.toJSON(), center.toJSON(), p2.toJSON()]; }; var validate = function (end) { var start = sourceAnchor.clone().move(end, -1); var line = new geometry_1.Line(start, end); return (!sourceBBox.containsPoint(end) && !sourceBBox.intersectsWithLine(line)); }; var angles = [0, 90, 180, 270, 45, 135, 225, 315]; if (typeof angle === 'number') { return rollup(getVertices(angle), options.merge); } var center = sourceBBox.getCenter(); if (center.equals(sourceAnchor)) { return rollup(getVertices(0), options.merge); } var deg = center.angleBetween(sourceAnchor, center.clone().translate(1, 0)); var ret = getVertices(deg); if (validate(ret[1])) { return rollup(ret, options.merge); } // return the best vertices for (var i = 1, l = angles.length; i < l; i += 1) { ret = getVertices(deg + angles[i]); if (validate(ret[1])) { return rollup(ret, options.merge); } } return rollup(ret, options.merge); } { var line = new geometry_1.Line(sourceAnchor, targetAnchor); var parallel = line.parallel(-width); var center = parallel.getCenter(); var p1 = parallel.start.clone().move(parallel.end, halfHeight); var p2 = parallel.end.clone().move(parallel.start, halfHeight); var ref = line.parallel(-1); var line1 = new geometry_1.Line(ref.start, center); var line2 = new geometry_1.Line(ref.end, center); if (sourceBBox.containsPoint(center) || targetBBox.containsPoint(center) || sourceBBox.intersectsWithLine(line1) || sourceBBox.intersectsWithLine(line2) || targetBBox.intersectsWithLine(line1) || targetBBox.intersectsWithLine(line2)) { parallel = line.parallel(width); center = parallel.getCenter(); p1 = parallel.start.clone().move(parallel.end, halfHeight); p2 = parallel.end.clone().move(parallel.start, halfHeight); } if (options.merge) { var line_1 = new geometry_1.Line(sourceAnchor, targetAnchor); var normal = new geometry_1.Line(center, line_1.center).setLength(Number.MAX_SAFE_INTEGER); var intersects1 = sourceBBox.intersectsWithLine(normal); var intersects2 = targetBBox.intersectsWithLine(normal); var intersects = intersects1 ? Array.isArray(intersects1) ? intersects1 : [intersects1] : []; if (intersects2) { if (Array.isArray(intersects2)) { intersects.push.apply(intersects, intersects2); } else { intersects.push(intersects2); } } var anchor = line_1.center.closest(intersects); if (anchor) { edgeView.sourceAnchor = anchor.clone(); edgeView.targetAnchor = anchor.clone(); } else { edgeView.sourceAnchor = line_1.center.clone(); edgeView.targetAnchor = line_1.center.clone(); } } return rollup([p1.toJSON(), center.toJSON(), p2.toJSON()], options.merge); } }; exports.loop = loop; //# sourceMappingURL=loop.js.map