UNPKG

graphology-layout-noverlap

Version:

Noverlap anti-collision layout algorithm for graphology.

72 lines (58 loc) 2.2 kB
/** * Graphology Noverlap Layout * =========================== * * Library endpoint. */ var isGraph = require('graphology-utils/is-graph'); var iterate = require('./iterate.js'); var helpers = require('./helpers.js'); var DEFAULT_SETTINGS = require('./defaults.js'); var DEFAULT_MAX_ITERATIONS = 500; /** * Asbtract function used to run a certain number of iterations. * * @param {boolean} assign - Whether to assign positions. * @param {Graph} graph - Target graph. * @param {object|number} params - If number, params.maxIterations, else: * @param {number} maxIterations - Maximum number of iterations. * @param {object} [settings] - Settings. * @return {object|undefined} */ function abstractSynchronousLayout(assign, graph, params) { if (!isGraph(graph)) throw new Error( 'graphology-layout-noverlap: the given graph is not a valid graphology instance.' ); if (typeof params === 'number') params = {maxIterations: params}; else params = params || {}; var maxIterations = params.maxIterations || DEFAULT_MAX_ITERATIONS; if (typeof maxIterations !== 'number' || maxIterations <= 0) throw new Error( 'graphology-layout-force: you should provide a positive number of maximum iterations.' ); // Validating settings var settings = Object.assign({}, DEFAULT_SETTINGS, params.settings), validationError = helpers.validateSettings(settings); if (validationError) throw new Error('graphology-layout-noverlap: ' + validationError.message); // Building matrices var matrix = helpers.graphToByteArray(graph, params.inputReducer), converged = false, i; // Iterating for (i = 0; i < maxIterations && !converged; i++) converged = iterate(settings, matrix).converged; // Applying if (assign) { helpers.assignLayoutChanges(graph, matrix, params.outputReducer); return; } return helpers.collectLayoutChanges(graph, matrix, params.outputReducer); } /** * Exporting. */ var synchronousLayout = abstractSynchronousLayout.bind(null, false); synchronousLayout.assign = abstractSynchronousLayout.bind(null, true); module.exports = synchronousLayout;