UNPKG

jointjs

Version:

JavaScript diagramming library

180 lines (143 loc) 4.48 kB
import * as g from '../../g/index.mjs'; import * as util from '../../util/index.mjs'; function portTransformAttrs(point, angle, opt) { var trans = point.toJSON(); trans.angle = angle || 0; return util.defaults({}, opt, trans); } function lineLayout(ports, p1, p2) { return ports.map(function(port, index, ports) { var p = this.pointAt(((index + 0.5) / ports.length)); // `dx`,`dy` per port offset option if (port.dx || port.dy) { p.offset(port.dx || 0, port.dy || 0); } return portTransformAttrs(p.round(), 0, port); }, g.line(p1, p2)); } function ellipseLayout(ports, elBBox, startAngle, stepFn) { var center = elBBox.center(); var ratio = elBBox.width / elBBox.height; var p1 = elBBox.topMiddle(); var ellipse = g.Ellipse.fromRect(elBBox); return ports.map(function(port, index, ports) { var angle = startAngle + stepFn(index, ports.length); var p2 = p1.clone() .rotate(center, -angle) .scale(ratio, 1, center); var theta = port.compensateRotation ? -ellipse.tangentTheta(p2) : 0; // `dx`,`dy` per port offset option if (port.dx || port.dy) { p2.offset(port.dx || 0, port.dy || 0); } // `dr` delta radius option if (port.dr) { p2.move(center, port.dr); } return portTransformAttrs(p2.round(), theta, port); }); } // Creates a point stored in arguments function argPoint(bbox, args) { var x = args.x; if (util.isString(x)) { x = parseFloat(x) / 100 * bbox.width; } var y = args.y; if (util.isString(y)) { y = parseFloat(y) / 100 * bbox.height; } return g.point(x || 0, y || 0); } /** * @param {Array<Object>} ports * @param {g.Rect} elBBox * @param {Object=} opt opt Group options * @returns {Array<g.Point>} */ export const absolute = function(ports, elBBox, opt) { //TODO v.talas angle return ports.map(argPoint.bind(null, elBBox)); }; /** * @param {Array<Object>} ports * @param {g.Rect} elBBox * @param {Object=} opt opt Group options * @returns {Array<g.Point>} */ export const fn = function(ports, elBBox, opt) { return opt.fn(ports, elBBox, opt); }; /** * @param {Array<Object>} ports * @param {g.Rect} elBBox * @param {Object=} opt opt Group options * @returns {Array<g.Point>} */ export const line = function(ports, elBBox, opt) { var start = argPoint(elBBox, opt.start || elBBox.origin()); var end = argPoint(elBBox, opt.end || elBBox.corner()); return lineLayout(ports, start, end); }; /** * @param {Array<Object>} ports * @param {g.Rect} elBBox * @param {Object=} opt opt Group options * @returns {Array<g.Point>} */ export const left = function(ports, elBBox, opt) { return lineLayout(ports, elBBox.origin(), elBBox.bottomLeft()); }; /** * @param {Array<Object>} ports * @param {g.Rect} elBBox * @param {Object=} opt opt Group options * @returns {Array<g.Point>} */ export const right = function(ports, elBBox, opt) { return lineLayout(ports, elBBox.topRight(), elBBox.corner()); }; /** * @param {Array<Object>} ports * @param {g.Rect} elBBox * @param {Object=} opt opt Group options * @returns {Array<g.Point>} */ export const top = function(ports, elBBox, opt) { return lineLayout(ports, elBBox.origin(), elBBox.topRight()); }; /** * @param {Array<Object>} ports * @param {g.Rect} elBBox * @param {Object=} opt opt Group options * @returns {Array<g.Point>} */ export const bottom = function(ports, elBBox, opt) { return lineLayout(ports, elBBox.bottomLeft(), elBBox.corner()); }; /** * @param {Array<Object>} ports * @param {g.Rect} elBBox * @param {Object=} opt Group options * @returns {Array<g.Point>} */ export const ellipseSpread = function(ports, elBBox, opt) { var startAngle = opt.startAngle || 0; var stepAngle = opt.step || 360 / ports.length; return ellipseLayout(ports, elBBox, startAngle, function(index) { return index * stepAngle; }); }; /** * @param {Array<Object>} ports * @param {g.Rect} elBBox * @param {Object=} opt Group options * @returns {Array<g.Point>} */ export const ellipse = function(ports, elBBox, opt) { var startAngle = opt.startAngle || 0; var stepAngle = opt.step || 20; return ellipseLayout(ports, elBBox, startAngle, function(index, count) { return (index + 0.5 - count / 2) * stepAngle; }); };