UNPKG

ngx-diagrams

Version:

> Light Weight, Modular, Typed Diagram Engine for Angular

61 lines 8.42 kB
import { Injectable } from '@angular/core'; import * as dagre from 'dagre'; import { PointModel } from '../models'; export class DagreEngine { instantiate() { try { this.g = new dagre.graphlib.Graph({ multigraph: true }); } catch (error) { console.warn("`dagre` packages isn't installed, please install it before using the DagreEngine plugin"); } } redistribute(model, options = {}) { this.instantiate(); this.g.setGraph(options.graph || {}); this.g.setDefaultEdgeLabel(() => { return {}; }); const processedlinks = {}; // set nodes model.getNodes().forEach((node) => { this.g.setNode(node.id, { width: node.getWidth(), height: node.getHeight() }); }); model.getLinks().forEach((link) => { // set edges if (link.getSourcePort() && link.getTargetPort()) { processedlinks[link.id] = true; this.g.setEdge({ v: link.getSourcePort().getNode().id, w: link.getTargetPort().getNode().id, name: link.id }); } }); // layout the graph dagre.layout(this.g, options.layout); this.g.nodes().forEach((v) => { const { x, y } = this.g.node(v); model.getNode(v).setCoords({ x, y }); }); // also include links? if (options.includeLinks) { this.g.edges().forEach((e) => { const edge = this.g.edge(e); const link = model.getLink(e.name); const points = [link.getFirstPoint()]; for (let i = 1; i < edge.points.length - 2; i++) { points.push(new PointModel(link, { x: edge.points[i].x, y: edge.points[i].y })); } link.setPoints(points.concat(link.getLastPoint())); }); } } } DagreEngine.decorators = [ { type: Injectable } ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFncmUtZW5naW5lLnBsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi9saWJzL25neC1kaWFncmFtcy9zcmMvIiwic291cmNlcyI6WyJsaWIvcGx1Z2lucy9kYWdyZS1lbmdpbmUucGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFFL0IsT0FBTyxFQUFnQixVQUFVLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFZckQsTUFBTSxPQUFPLFdBQVc7SUFHdEIsV0FBVztRQUNULElBQUk7WUFDRixJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztTQUN6RDtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsT0FBTyxDQUFDLElBQUksQ0FBQyx5RkFBeUYsQ0FBQyxDQUFDO1NBQ3pHO0lBQ0gsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFtQixFQUFFLFVBQThCLEVBQUU7UUFDaEUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRW5CLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7UUFFckMsSUFBSSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUU7WUFDOUIsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sY0FBYyxHQUE4QixFQUFFLENBQUM7UUFFckQsWUFBWTtRQUNaLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNoQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFO2dCQUN0QixLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDdEIsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUU7YUFDekIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDaEMsWUFBWTtZQUNaLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRTtnQkFDaEQsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO29CQUNiLENBQUMsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRTtvQkFDcEMsQ0FBQyxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFO29CQUNwQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUU7aUJBQ2QsQ0FBQyxDQUFDO2FBQ0o7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILG1CQUFtQjtRQUNuQixLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXJDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDM0IsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLENBQUMsQ0FBQyxDQUFDO1FBRUgsc0JBQXNCO1FBQ3RCLElBQUksT0FBTyxDQUFDLFlBQVksRUFBRTtZQUN4QixJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUMzQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBRW5DLE1BQU0sTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7Z0JBQ3RDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQy9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDakY7Z0JBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDckQsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7OztZQWhFRixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgZGFncmUgZnJvbSAnZGFncmUnO1xuaW1wb3J0IHsgRWRnZUNvbmZpZywgR3JhcGhMYWJlbCwgTm9kZUNvbmZpZyB9IGZyb20gJ2RhZ3JlJztcbmltcG9ydCB7IERpYWdyYW1Nb2RlbCwgUG9pbnRNb2RlbCB9IGZyb20gJy4uL21vZGVscyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGFncmVFbmdpbmVPcHRpb25zIHtcbiAgZ3JhcGg/OiBHcmFwaExhYmVsO1xuICBsYXlvdXQ/OiBHcmFwaExhYmVsICYgTm9kZUNvbmZpZyAmIEVkZ2VDb25maWc7XG4gIC8qKlxuICAgKiBXaWxsIGFsc28gbGF5b3V0IGxpbmtzXG4gICAqL1xuICBpbmNsdWRlTGlua3M/OiBib29sZWFuO1xufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRGFncmVFbmdpbmUge1xuICBnOiBkYWdyZS5ncmFwaGxpYi5HcmFwaDtcblxuICBpbnN0YW50aWF0ZSgpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5nID0gbmV3IGRhZ3JlLmdyYXBobGliLkdyYXBoKHsgbXVsdGlncmFwaDogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKFwiYGRhZ3JlYCBwYWNrYWdlcyBpc24ndCBpbnN0YWxsZWQsIHBsZWFzZSBpbnN0YWxsIGl0IGJlZm9yZSB1c2luZyB0aGUgRGFncmVFbmdpbmUgcGx1Z2luXCIpO1xuICAgIH1cbiAgfVxuXG4gIHJlZGlzdHJpYnV0ZShtb2RlbDogRGlhZ3JhbU1vZGVsLCBvcHRpb25zOiBEYWdyZUVuZ2luZU9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICAgIHRoaXMuaW5zdGFudGlhdGUoKTtcblxuICAgIHRoaXMuZy5zZXRHcmFwaChvcHRpb25zLmdyYXBoIHx8IHt9KTtcblxuICAgIHRoaXMuZy5zZXREZWZhdWx0RWRnZUxhYmVsKCgpID0+IHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHByb2Nlc3NlZGxpbmtzOiB7IFtpZDogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XG5cbiAgICAvLyBzZXQgbm9kZXNcbiAgICBtb2RlbC5nZXROb2RlcygpLmZvckVhY2goKG5vZGUpID0+IHtcbiAgICAgIHRoaXMuZy5zZXROb2RlKG5vZGUuaWQsIHtcbiAgICAgICAgd2lkdGg6IG5vZGUuZ2V0V2lkdGgoKSxcbiAgICAgICAgaGVpZ2h0OiBub2RlLmdldEhlaWdodCgpXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIG1vZGVsLmdldExpbmtzKCkuZm9yRWFjaCgobGluaykgPT4ge1xuICAgICAgLy8gc2V0IGVkZ2VzXG4gICAgICBpZiAobGluay5nZXRTb3VyY2VQb3J0KCkgJiYgbGluay5nZXRUYXJnZXRQb3J0KCkpIHtcbiAgICAgICAgcHJvY2Vzc2VkbGlua3NbbGluay5pZF0gPSB0cnVlO1xuICAgICAgICB0aGlzLmcuc2V0RWRnZSh7XG4gICAgICAgICAgdjogbGluay5nZXRTb3VyY2VQb3J0KCkuZ2V0Tm9kZSgpLmlkLFxuICAgICAgICAgIHc6IGxpbmsuZ2V0VGFyZ2V0UG9ydCgpLmdldE5vZGUoKS5pZCxcbiAgICAgICAgICBuYW1lOiBsaW5rLmlkXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gbGF5b3V0IHRoZSBncmFwaFxuICAgIGRhZ3JlLmxheW91dCh0aGlzLmcsIG9wdGlvbnMubGF5b3V0KTtcblxuICAgIHRoaXMuZy5ub2RlcygpLmZvckVhY2goKHYpID0+IHtcbiAgICAgIGNvbnN0IHsgeCwgeSB9ID0gdGhpcy5nLm5vZGUodik7XG4gICAgICBtb2RlbC5nZXROb2RlKHYpLnNldENvb3Jkcyh7IHgsIHkgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBhbHNvIGluY2x1ZGUgbGlua3M/XG4gICAgaWYgKG9wdGlvbnMuaW5jbHVkZUxpbmtzKSB7XG4gICAgICB0aGlzLmcuZWRnZXMoKS5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgIGNvbnN0IGVkZ2UgPSB0aGlzLmcuZWRnZShlKTtcbiAgICAgICAgY29uc3QgbGluayA9IG1vZGVsLmdldExpbmsoZS5uYW1lKTtcblxuICAgICAgICBjb25zdCBwb2ludHMgPSBbbGluay5nZXRGaXJzdFBvaW50KCldO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGVkZ2UucG9pbnRzLmxlbmd0aCAtIDI7IGkrKykge1xuICAgICAgICAgIHBvaW50cy5wdXNoKG5ldyBQb2ludE1vZGVsKGxpbmssIHsgeDogZWRnZS5wb2ludHNbaV0ueCwgeTogZWRnZS5wb2ludHNbaV0ueSB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgbGluay5zZXRQb2ludHMocG9pbnRzLmNvbmNhdChsaW5rLmdldExhc3RQb2ludCgpKSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==