4

We are trying to build a Visualization Framework using JointJS (we are not using Rappid). SVG is used to render graphical data on the browser. We have a scenario where we have a model with approximately 4500 ports. We have used ports as elements and NOT as attributes. Meaning to say that we have embedded ports as cells inside a model. There is a certain reason why need such a setup.

When such a model is added onto the graph, it takes roughly 8 to 9 seconds to render. Once the model is rendered, moving and repositioning the model works okay. However, when we try to add further models the browser tends to crash.

This is how we have created the Paper object

 function createPaper(options) {
     var paper = new joint.dia.Paper({ 
        el: options.el,
        width: options.width,
        height: options.height,
        model: options.graph,
        gridSize: 1,
        label:options.name,
        async : { batchSize: 250} 
    });
    return paper;
 }

This is how we have created the model

function createModel(options) {
    var model = new joint.shapes.devs.Model({
        position:options.position,
        size:options.size,
        attrs:  options.attrs   
    });
    return model;
}

This is how we have created the port as a custom model

    joint.shapes.custom = {};

    joint.shapes.custom.Port = joint.shapes.basic.Generic.extend(_.extend({},    joint.shapes.basic.PortsModelInterface, {

    markup: '<g class="rotatable"><g class="scalable"><path class="port-body" d = "M 0 0 L 0 0 L 15 5 L 0 10 L 0 10 z"></path></g><text class="port-label"/></g>',

    defaults: joint.util.deepSupplement({

    type: 'devs.Port',
    size: { width: 10, height: 10 },
    position : {x : 0, y : 0},
    attrs: {
        '.': { magnet: false },
        '.body': {
            width: 150, height: 250,
            stroke: '#000000'
        },
        '.port-body': {
            r: 5,
            magnet: true,
            stroke: '#000000',
            fill : 'yellow'
        },
        text: {
            'pointer-events': 'none'
        },
      }

   }, joint.shapes.basic.Generic.prototype.defaults),


}));

 joint.shapes.custom.PortView = joint.dia.ElementView.extend(joint.shapes.basic.PortsViewInterface);





 function createPort(options){
    var port=new joint.shapes.custom.Port({
        position:options.position,
        size:options.size,
        attrs:  options.attrs
    });

    return port;    
}

Below is the way we are adding models and ports to the graph

                    var cells = [];
                    var model = createModel(options);
                    //Add the cell to the graph
                    cells.push(model);

                    var totalInports=options.inPorts.length;
                    var totalOutports=options.outPorts.length;


                    //Add the inports 
                    for (var portIndex = 0; portIndex < totalInports; portIndex++) {
                        port = createPort(options.inPorts[portIndex]);
                        model.embed(port);
                        cells.push(port);
                    } 

                    //Add the outports
                    for (var portIndex = 0; portIndex < totalOutports; portIndex++) {
                        port = createPort(options.outPorts[portIndex]);
                        model.embed(port);
                        cells.push(port);
                    }
                    graph.addCells(cells);

Could anybody kindly give some answers to the below questions -

Are we using the paper and models in the right way ?

Are there better ways of adding cells to the graph which could improve the performance ?

Thanks in Advance

Manoj
  • 41
  • 3

1 Answers1

1

I know that this is an old question that has been left unanswered for a long time. My take is to use:

graph.fromJSON or graph.addCells(/*Array of json cells*/)

Then, try to translate all the operations as a compound json that will be passed to graph.fromJSON or graph.addCells.

orabis
  • 2,749
  • 2
  • 13
  • 29