gpml2pvjson
Version:
convert GPML (XML) to pvjson (json)
251 lines • 25 kB
JavaScript
//import * as createSVGPathCalculator from "point-at-length";
export const createSVGPathCalculator = require("point-at-length");
import { toPoints } from "svg-points";
export class SVGPointElement {
constructor(x, y) {
this.x = x;
this.y = y;
}
}
export class SVGPathSegment {
constructor(type, values) {
this.type = type;
this.values = values;
}
}
export class SVGPath {
constructor(points, getPathDataFromPoints) {
this.getPathStringFromPathData = (pathData) => {
return pathData
.map(function (pathSegment) {
return pathSegment.type + pathSegment.values.join(",");
})
.join("");
};
this.getPointAtLength = (length) => {
const [x, y] = this.pathCalculator.at(length);
return new SVGPointElement(x, y);
};
this.getTotalLength = () => {
return this.pathCalculator.length();
};
this.getPathData = (settings) => {
return this.pathData;
};
this.setPathData = (pathData) => {
this.pathData = pathData;
this.d = this.getPathStringFromPathData(this.pathData);
this.pathCalculator = createSVGPathCalculator(this.d);
};
this.getPointAtPosition = (position) => {
const totalLength = this.getTotalLength();
return this.getPointAtLength(position * totalLength);
};
this.getPathDataFromPoints = getPathDataFromPoints;
this.pathData = getPathDataFromPoints(points);
this.d = this.getPathStringFromPathData(this.pathData);
this.points = toPoints({
type: "path",
d: this.d
});
this.pathCalculator = createSVGPathCalculator(this.d);
}
}
export function changeDirection(currentDirection) {
var xDirection = Math.abs(Math.abs(currentDirection[0]) - 1);
var yDirection = Math.abs(Math.abs(currentDirection[1]) - 1);
return [xDirection, yDirection];
}
export class StraightLine extends SVGPath {
constructor(points) {
super(points, function getPathDataFromPoints(points) {
const { x: x0, y: y0 } = points[0];
const { x: x1, y: y1 } = points[points.length - 1];
return [
new SVGPathSegment("M", [x0, y0]),
new SVGPathSegment("L", [x1, y1])
];
});
}
}
export class ElbowLine extends SVGPath {
constructor(points) {
super(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;
});
}
}
export class SegmentedLine extends SVGPath {
constructor(points) {
super(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;
});
}
}
// 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.
const d3_svg_lineBasisBezier1 = [0, 2 / 3, 1 / 3, 0];
const d3_svg_lineBasisBezier2 = [0, 1 / 3, 2 / 3, 0];
const 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));
}
export class CurvedLine extends SVGPath {
constructor(points, markerStart, markerEnd) {
super(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) {
const orientation = firstPoint.orientation;
direction.push(orientation[0]);
direction.push(orientation[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.pathData = this.getPathDataFromPoints(points, markerStart, markerEnd);
this.d = this.getPathStringFromPathData(this.pathData);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRnZURyYXdlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZWRnZS9lZGdlRHJhd2Vycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw2REFBNkQ7QUFDN0QsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFDbEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQVd0QyxNQUFNLE9BQU8sZUFBZTtJQU0xQixZQUFZLENBQVMsRUFBRSxDQUFTO1FBQzlCLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDYixDQUFDO0NBTUY7QUEwQkQsTUFBTSxPQUFPLGNBQWM7SUFHekIsWUFBWSxJQUFxQixFQUFFLE1BQWdCO1FBQ2pELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7Q0FDRjtBQVFELE1BQU0sT0FBTyxPQUFPO0lBYWxCLFlBQVksTUFBeUIsRUFBRSxxQkFBcUI7UUFVNUQsOEJBQXlCLEdBQUcsQ0FBQyxRQUEwQixFQUFVLEVBQUU7WUFDakUsT0FBTyxRQUFRO2lCQUNaLEdBQUcsQ0FBQyxVQUFTLFdBQVc7Z0JBQ3ZCLE9BQU8sV0FBVyxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN6RCxDQUFDLENBQUM7aUJBQ0QsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2QsQ0FBQyxDQUFDO1FBQ0YscUJBQWdCLEdBQUcsQ0FBQyxNQUFjLEVBQW1CLEVBQUU7WUFDckQsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM5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