UNPKG

jointjs

Version:

JavaScript diagramming library

106 lines (93 loc) 3.9 kB
(function(joint) { var fta = joint.shapes.fta; var graph = new joint.dia.Graph; var paper = new joint.dia.Paper({ el: document.getElementById('paper'), width: 900, height: 800, model: graph, defaultConnectionPoint: { name: 'boundary', args: { extrapolate: true }}, defaultConnector: { name: 'rounded' }, defaultRouter: { name: 'orthogonal' }, async: true, interactive: false, frozen: true, sorting: joint.dia.Paper.sorting.APPROX }); paper.on({ 'element:mouseenter': function(elementView) { var tools = new joint.dia.ToolsView({ tools: [joint.elementTools.FTABoundary.factory()] }); elementView.addTools(tools); }, 'element:mouseleave': function(elementView) { elementView.removeTools(); }, 'element:gate:click': function(elementView) { var element = elementView.model; var gateType = element.gate(); var gateTypes = Object.keys(element.gateTypes); var index = gateTypes.indexOf(gateType); var newIndex = (index + 1) % gateTypes.length; element.gate(gateTypes[newIndex]); } }); function layout(graph) { var autoLayoutElements = []; var manualLayoutElements = []; graph.getElements().forEach(function(el) { if (el.get('type') === 'fta.ConditioningEvent') { manualLayoutElements.push(el); } else { autoLayoutElements.push(el); } }); // Automatic Layout joint.layout.DirectedGraph.layout(graph.getSubgraph(autoLayoutElements), { setVertices: true, marginX: 20, marginY: 20 }); // Manual Layout manualLayoutElements.forEach(function(el) { var neighbor = graph.getNeighbors(el, { inbound: true })[0]; if (!neighbor) return; var neighborPosition = neighbor.getBBox().bottomRight(); el.position(neighborPosition.x + 20, neighborPosition.y - el.size().height / 2 - 20); }); } // Original FTA Diagram: https://www.edrawsoft.com/templates/pdf/scaffolding-fall-fault-tree.pdf var events = [ fta.IntermediateEvent.create('Fall from Scaffolding').gate('inhibit'), fta.IntermediateEvent.create('Fall from the Scaffolding', 'and').gate('and'), fta.IntermediateEvent.create('Safety Belt Not Working', 'or').gate('or'), fta.IntermediateEvent.create('Fall By Accident', 'or').gate('or'), fta.IntermediateEvent.create('Broken By Equipment', 'or').gate('or'), fta.IntermediateEvent.create('Did not Wear Safety Belt', 'or').gate('or'), fta.UndevelopedEvent.create('Slip and Fall'), fta.UndevelopedEvent.create('Lose Balance'), fta.UndevelopedEvent.create('Upholder Broken'), fta.BasicEvent.create('Safety Belt Broken'), fta.BasicEvent.create('Forgot to Wear'), fta.ExternalEvent.create('Take off When Walking'), fta.ConditioningEvent.create('Height and Ground Condition') ]; var links = [ fta.Link.create(events[0], events[1]), fta.Link.create(events[1], events[2]), fta.Link.create(events[1], events[3]), fta.Link.create(events[2], events[4]), fta.Link.create(events[2], events[5]), fta.Link.create(events[3], events[6]), fta.Link.create(events[3], events[7]), fta.Link.create(events[4], events[8]), fta.Link.create(events[4], events[9]), fta.Link.create(events[5], events[10]), fta.Link.create(events[5], events[11]), fta.Link.create(events[0], events[12]) ]; graph.resetCells(events.concat(links)); layout(graph); paper.unfreeze(); })(joint);