gpml2pvjson
Version:
convert GPML (XML) to pvjson (json)
288 lines • 27.1 kB
JavaScript
;
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.CurvedLine = exports.SegmentedLine = exports.ElbowLine = exports.StraightLine = exports.changeDirection = exports.SVGPath = exports.SVGPathSegment = exports.SVGPointElement = exports.createSVGPathCalculator = void 0;
//import * as createSVGPathCalculator from "point-at-length";
exports.createSVGPathCalculator = require("point-at-length");
var svg_points_1 = require("svg-points");
var SVGPointElement = /** @class */ (function () {
function SVGPointElement(x, y) {
this.x = x;
this.y = y;
}
return SVGPointElement;
}());
exports.SVGPointElement = SVGPointElement;
var SVGPathSegment = /** @class */ (function () {
function SVGPathSegment(type, values) {
this.type = type;
this.values = values;
}
return SVGPathSegment;
}());
exports.SVGPathSegment = SVGPathSegment;
var SVGPath = /** @class */ (function () {
function SVGPath(points, getPathDataFromPoints) {
var _this = this;
this.getPathStringFromPathData = function (pathData) {
return pathData
.map(function (pathSegment) {
return pathSegment.type + pathSegment.values.join(",");
})
.join("");
};
this.getPointAtLength = function (length) {
var _a = _this.pathCalculator.at(length), x = _a[0], y = _a[1];
return new SVGPointElement(x, y);
};
this.getTotalLength = function () {
return _this.pathCalculator.length();
};
this.getPathData = function (settings) {
return _this.pathData;
};
this.setPathData = function (pathData) {
_this.pathData = pathData;
_this.d = _this.getPathStringFromPathData(_this.pathData);
_this.pathCalculator = exports.createSVGPathCalculator(_this.d);
};
this.getPointAtPosition = function (position) {
var totalLength = _this.getTotalLength();
return _this.getPointAtLength(position * totalLength);
};
this.getPathDataFromPoints = getPathDataFromPoints;
this.pathData = getPathDataFromPoints(points);
this.d = this.getPathStringFromPathData(this.pathData);
this.points = svg_points_1.toPoints({
type: "path",
d: this.d
});
this.pathCalculator = exports.createSVGPathCalculator(this.d);
}
return SVGPath;
}());
exports.SVGPath = SVGPath;
function changeDirection(currentDirection) {
var xDirection = Math.abs(Math.abs(currentDirection[0]) - 1);
var yDirection = Math.abs(Math.abs(currentDirection[1]) - 1);
return [xDirection, yDirection];
}
exports.changeDirection = changeDirection;
var StraightLine = /** @class */ (function (_super) {
__extends(StraightLine, _super);
function StraightLine(points) {
return _super.call(this, points, function getPathDataFromPoints(points) {
var _a = points[0], x0 = _a.x, y0 = _a.y;
var _b = points[points.length - 1], x1 = _b.x, y1 = _b.y;
return [
new SVGPathSegment("M", [x0, y0]),
new SVGPathSegment("L", [x1, y1])
];
}) || this;
}
return StraightLine;
}(SVGPath));
exports.StraightLine = StraightLine;
var ElbowLine = /** @class */ (function (_super) {
__extends(ElbowLine, _super);
function ElbowLine(points) {
return _super.call(this, points, function getPathDataFromPoints(points) {
var pointCount = points.length;
var firstPoint = points[0], lastPoint = points[pointCount - 1];
var pathData = [new SVGPathSegment("M", [firstPoint.x, firstPoint.y])];
var direction = [];
if (firstPoint.orientation) {
direction.push(firstPoint.orientation[0]);
direction.push(firstPoint.orientation[1]);
}
else {
console.error("points");
console.error(points);
throw new Error("No orientation specified for elbowline edge w/ points logged above");
}
points.forEach(function (point, index) {
if (index > 0 && index < pointCount) {
var x0 = Math.abs(direction[0]) * (points[index].x - points[index - 1].x) +
points[index - 1].x, y0 = Math.abs(direction[1]) * (points[index].y - points[index - 1].y) +
points[index - 1].y;
pathData.push(new SVGPathSegment("L", [x0, y0]));
direction = changeDirection(direction);
}
});
pathData.push(new SVGPathSegment("L", [lastPoint.x, lastPoint.y]));
return pathData;
}) || this;
}
return ElbowLine;
}(SVGPath));
exports.ElbowLine = ElbowLine;
var SegmentedLine = /** @class */ (function (_super) {
__extends(SegmentedLine, _super);
function SegmentedLine(points) {
return _super.call(this, points, function getPathDataFromPoints(points) {
var firstPoint = points[0];
var pathData = [new SVGPathSegment("M", [firstPoint.x, firstPoint.y])];
points.forEach(function (point, index) {
if (index > 0) {
pathData.push(new SVGPathSegment("L", [point.x, point.y]));
}
});
return pathData;
}) || this;
}
return SegmentedLine;
}(SVGPath));
exports.SegmentedLine = SegmentedLine;
// Returns the dot product of the given four-element vectors.
function d3_svg_lineDot4(a, b) {
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];
}
// Matrix to transform basis (b-spline) control points to bezier
// control points. Derived from FvD 11.2.8.
var d3_svg_lineBasisBezier1 = [0, 2 / 3, 1 / 3, 0];
var d3_svg_lineBasisBezier2 = [0, 1 / 3, 2 / 3, 0];
var d3_svg_lineBasisBezier3 = [0, 1 / 6, 2 / 3, 1 / 6];
// Pushes a "C" Bézier curve onto the specified path array, given the
// two specified four-element arrays which define the control points.
function lineBasisBezier(pathData, x, y) {
var pointsForBezier = [];
pointsForBezier.push([
d3_svg_lineDot4(d3_svg_lineBasisBezier1, x),
d3_svg_lineDot4(d3_svg_lineBasisBezier1, y)
]);
pointsForBezier.push([
d3_svg_lineDot4(d3_svg_lineBasisBezier2, x),
d3_svg_lineDot4(d3_svg_lineBasisBezier2, y)
]);
pointsForBezier.push([
d3_svg_lineDot4(d3_svg_lineBasisBezier3, x),
d3_svg_lineDot4(d3_svg_lineBasisBezier3, y)
]);
pathData.push(new SVGPathSegment("C", pointsForBezier));
}
var CurvedLine = /** @class */ (function (_super) {
__extends(CurvedLine, _super);
function CurvedLine(points, markerStart, markerEnd) {
var _this = _super.call(this, points, function getPathDataFromPoints(elbowPoints, markerStart, markerEnd) {
// modified from d3js: https://github.com/mbostock/d3/blob/ed54503fc7781d8bfe9e9fe125b76b9bbb5ac05c/src/svg/line.js
// TODO this code is kind of hacky. it seems to work OK, but it's probably confusing and should be refactored for readability/maintainability.
var elbowPointCount = elbowPoints.length;
var firstPoint = elbowPoints[0];
var lastPoint = elbowPoints[elbowPointCount - 1];
var points = [];
points.push(firstPoint);
var lastSegment = [];
var pathData = [new SVGPathSegment("M", [firstPoint.x, firstPoint.y])];
var direction = [];
if (firstPoint.orientation) {
var orientation_1 = firstPoint.orientation;
direction.push(orientation_1[0]);
direction.push(orientation_1[1]);
}
else {
console.error("points");
console.error(points);
throw new Error("No orientation specified for curvedline edge w/ points logged above");
}
// for curves, I'm calculating and using the points representing the elbow vertices, from the given points (which represent the first point, any elbow segment mid-points and the last point).
// I'm making sure the curve passes through the midpoint of the marker side that is furthest away from the node it is attached to
// TODO this code might be confusing, because it involves redefining the points. Look at refactoring it for readability.
var markerHeightFactor = 0.75;
if (!!markerStart &&
firstPoint.orientation &&
typeof firstPoint.orientation[0] !== "undefined" &&
typeof firstPoint.orientation[1] !== "undefined") {
var firstPointWithOffset = {};
var firstOffset;
var firstMarkerData = { x: 0, y: 0, markerWidth: 12, markerHeight: 12 };
if (!!firstMarkerData) {
firstOffset = markerHeightFactor * firstMarkerData.markerHeight;
}
else {
firstOffset = 12;
}
firstPointWithOffset.x =
firstPoint.orientation[0] * firstOffset + firstPoint.x;
firstPointWithOffset.y =
firstPoint.orientation[1] * firstOffset + firstPoint.y;
pathData.push(new SVGPathSegment("L", [
firstPointWithOffset.x,
firstPointWithOffset.y
]));
points[0] = firstPointWithOffset;
}
if (!!markerEnd &&
lastPoint.orientation &&
typeof lastPoint.orientation[0] !== "undefined" &&
typeof lastPoint.orientation[1] !== "undefined") {
lastSegment.push(new SVGPathSegment("L", [lastPoint.x, lastPoint.y]));
var lastPointWithOffset = {};
var lastOffset;
var lastMarkerData = { x: 0, y: 0, markerWidth: 12, markerHeight: 12 };
if (!!lastMarkerData) {
lastOffset = markerHeightFactor * lastMarkerData.markerHeight;
}
else {
lastOffset = 12;
}
lastPointWithOffset.x =
lastPoint.orientation[0] * lastOffset + lastPoint.x;
lastPointWithOffset.y =
lastPoint.orientation[1] * lastOffset + lastPoint.y;
elbowPoints[elbowPointCount - 1] = lastPoint = lastPointWithOffset;
}
elbowPoints.forEach(function (elbowPoint, index) {
var x0, y0, x1, y1;
if (index > 0 && index < elbowPointCount) {
x0 =
Math.abs(direction[0]) *
(elbowPoints[index].x - elbowPoints[index - 1].x) +
elbowPoints[index - 1].x;
y0 =
Math.abs(direction[1]) *
(elbowPoints[index].y - elbowPoints[index - 1].y) +
elbowPoints[index - 1].y;
points.push({ x: x0, y: y0 });
direction = changeDirection(direction);
}
});
points.push(lastPoint);
var i = 1, n = points.length, pi = points[0], x0 = pi.x, y0 = pi.y, px = [x0, x0, x0, (pi = points[1]).x], py = [y0, y0, y0, pi.y];
pathData.push(new SVGPathSegment("L", [
d3_svg_lineDot4(d3_svg_lineBasisBezier3, px),
d3_svg_lineDot4(d3_svg_lineBasisBezier3, py)
]));
points.push(points[n - 1]);
while (++i <= n) {
pi = points[i];
px.shift();
px.push(pi.x);
py.shift();
py.push(pi.y);
lineBasisBezier(pathData, px, py);
}
points.pop();
pathData.push(new SVGPathSegment("L", [pi.x, pi.y]));
pathData = pathData.concat(lastSegment);
return pathData;
}) || this;
_this.pathData = _this.getPathDataFromPoints(points, markerStart, markerEnd);
_this.d = _this.getPathStringFromPathData(_this.pathData);
return _this;
}
return CurvedLine;
}(SVGPath));
exports.CurvedLine = CurvedLine;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRnZURyYXdlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZWRnZS9lZGdlRHJhd2Vycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkRBQTZEO0FBQ2hELFFBQUEsdUJBQXVCLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFDbEUseUNBQXNDO0FBV3RDO0lBTUUseUJBQVksQ0FBUyxFQUFFLENBQVM7UUFDOUIsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDWCxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNiLENBQUM7SUFNSCxzQkFBQztBQUFELENBQUMsQUFmRCxJQWVDO0FBZlksMENBQWU7QUF5QzVCO0lBR0Usd0JBQVksSUFBcUIsRUFBRSxNQUFnQjtRQUNqRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBQ0gscUJBQUM7QUFBRCxDQUFDLEFBUEQsSUFPQztBQVBZLHdDQUFjO0FBZTNCO0lBYUUsaUJBQVksTUFBeUIsRUFBRSxxQkFBcUI7UUFBNUQsaUJBU0M7UUFDRCw4QkFBeUIsR0FBRyxVQUFDLFFBQTBCO1lBQ3JELE9BQU8sUUFBUTtpQkFDWixHQUFHLENBQUMsVUFBUyxXQUFXO2dCQUN2QixPQUFPLFdBQVcsQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekQsQ0FBQyxDQUFDO2lCQUNELElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNkLENBQUMsQ0FBQztRQUNGLHFCQUFnQixHQUFHLFVBQUMsTUFBYztZQUMxQixJQUFBLEtBQVMsS0FBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQXRDLENBQUMsUUFBQSxFQUFFLENBQUMsUUFBa0MsQ0FB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