@joint/core
Version: 
JavaScript diagramming library
77 lines (65 loc) • 2.9 kB
JavaScript
import { Line, Point } from '../g/index.mjs';
import { isPercentage } from '../util/index.mjs';
function connectionRatio(view, _magnet, _refPoint, opt) {
    var ratio = ('ratio' in opt) ? opt.ratio : 0.5;
    return view.getPointAtRatio(ratio);
}
function connectionLength(view, _magnet, _refPoint, opt) {
    var length = ('length' in opt) ? opt.length : 20;
    return view.getPointAtLength(length);
}
function _connectionPerpendicular(view, _magnet, refPoint, opt) {
    var OFFSET = 1e6;
    var path = view.getConnection();
    var segmentSubdivisions = view.getConnectionSubdivisions();
    var verticalLine = new Line(refPoint.clone().offset(0, OFFSET), refPoint.clone().offset(0, -OFFSET));
    var horizontalLine = new Line(refPoint.clone().offset(OFFSET, 0), refPoint.clone().offset(-OFFSET, 0));
    var verticalIntersections = verticalLine.intersect(path, { segmentSubdivisions: segmentSubdivisions });
    var horizontalIntersections = horizontalLine.intersect(path, { segmentSubdivisions: segmentSubdivisions });
    var intersections = [];
    if (verticalIntersections) Array.prototype.push.apply(intersections, verticalIntersections);
    if (horizontalIntersections) Array.prototype.push.apply(intersections, horizontalIntersections);
    if (intersections.length > 0) return refPoint.chooseClosest(intersections);
    if ('fallbackAt' in opt) {
        return getPointAtLink(view, opt.fallbackAt);
    }
    return connectionClosest(view, _magnet, refPoint, opt);
}
function _connectionClosest(view, _magnet, refPoint, _opt) {
    var closestPoint = view.getClosestPoint(refPoint);
    if (!closestPoint) return new Point();
    return closestPoint;
}
export function resolveRef(fn) {
    return function(view, magnet, ref, opt) {
        if (ref instanceof Element) {
            var refView = this.paper.findView(ref);
            var refPoint;
            if (refView) {
                if (refView.isNodeConnection(ref)) {
                    var distance = ('fixedAt' in opt) ? opt.fixedAt : '50%';
                    refPoint = getPointAtLink(refView, distance);
                } else {
                    refPoint = refView.getNodeBBox(ref).center();
                }
            } else {
                // Something went wrong
                refPoint = new Point();
            }
            return fn.call(this, view, magnet, refPoint, opt);
        }
        return fn.apply(this, arguments);
    };
}
function getPointAtLink(view, value) {
    var parsedValue = parseFloat(value);
    if (isPercentage(value)) {
        return view.getPointAtRatio(parsedValue / 100);
    } else {
        return view.getPointAtLength(parsedValue);
    }
}
// joint.linkAnchors
export { connectionRatio, connectionLength };
export const connectionPerpendicular = resolveRef(_connectionPerpendicular);
export const connectionClosest = resolveRef(_connectionClosest);