in packages/maker.js/src/core/chain.ts [167:228]
onPath: function (walkedPath: IWalkPath) {
var layer = opts.byLayers ? walkedPath.layer : '';
if (!pointGraphsByLayer[layer]) {
pointGraphsByLayer[layer] = new PointGraph<IChainLink>();
}
const pointGraph = pointGraphsByLayer[layer];
var pathLength = measure.pathLength(walkedPath.pathContext);
//circles are loops by nature
if (
walkedPath.pathContext.type === pathType.Circle ||
(walkedPath.pathContext.type === pathType.Arc && round(angle.ofArcSpan(walkedPath.pathContext as IPathArc) - 360) === 0) ||
(walkedPath.pathContext.type === pathType.BezierSeed && measure.isPointEqual(walkedPath.pathContext.origin, (walkedPath.pathContext as IPathBezierSeed).end, opts.pointMatchingDistance))
) {
var chain: IChain = {
links: [{
walkedPath: walkedPath,
reversed: null,
endPoints: null,
pathLength: pathLength
}],
endless: true,
pathLength: pathLength
};
//store circles so that layers fire grouped
if (!chainsByLayer[layer]) {
chainsByLayer[layer] = [];
}
chainsByLayer[layer].push(chain);
} else {
//don't add lines which are 5x shorter than the tolerance
if (pathLength < opts.pointMatchingDistance / 5) {
if (!ignored[layer]) {
ignored[layer] = [];
}
ignored[layer].push(walkedPath);
return;
}
//gather both endpoints from all non-circle segments
const endPoints = point.fromPathEnds(walkedPath.pathContext, walkedPath.offset);
for (var i = 0; i < 2; i++) {
var link: IChainLink = {
walkedPath: walkedPath,
endPoints: endPoints,
reversed: i != 0,
pathLength: pathLength
};
let valueId = pointGraph.insertValue(link);
pointGraph.insertValueIdAtPoint(valueId, endPoints[i]);
}
}
}