美文网首页JointJS
前端流程图之JointJS(四)

前端流程图之JointJS(四)

作者: 敬亭阁主 | 来源:发表于2019-04-12 21:11 被阅读0次

今天的工作重点分三块:

  1. 属性窗口,用于展示和修改单个节点的属性值
  2. Run to here(RTH)功能,任意选择一个节点,可以找出从根节点到当前节点到最短路径并进行着色
  3. 重新布局功能,对修改后的流程图进行重新布局
  4. 给页面加了一个外框架,感觉比较正式
  5. 重构了代码,集成到了require.js里

先上个效果图


效果图

有标题、菜单、缩进按钮、底部状态栏、中间的画布也可以通过拖拽进行resize,应该比较正规了。

属性窗口

这里使用的是rappid的Dialog和Inspector,代码是从rappid中扒出来的,这里只列一下使用方法。

Inspector,用于监控cell的值,并将其和input项关联起来。

var inspector = new joint.ui.Inspector({
    cell: element,
    live:false,
    inputs: {
        'name': {                              
             type: 'text',
             label: '文档名称',
             index:1
         },
         'name11': {
             type: 'text',
             label: '底数',
             index: 2
         }
    } 
}); 

Dialog显示弹出窗口,点击窗口外任何位置会关闭窗口

var dialog = new joint.ui.Dialog({
    type: 'inspector-dialog',
    width: 260,
    title: 'Edit Member', 
    closeButton: false,
    content: inspector.render().el,
    buttons: [{
        content: 'Cancel',
        action: 'cancel'
    }, {
        content: 'Apply',
        action: 'apply'
    }]

});

RTH
这里使用了graphlibdijkstra算法来计算两点之间的路径,然后对路径上所有点进行渲染。

RTH
showPath: function(src, dest) {
    var g = this.graph.toGraphLib();
    var result = graphlib.alg.dijkstra(g, src);
    var path = [];
    var target = dest;
    while (target != src) {
        path.push(target);
        target = result[target].predecessor;
    }
    path.push(target);
    path.reverse();
    this.resetGraph();
    path.forEach(function(id) {
        var cell = this.graph.getCell(id);
        if (cell) {
            cell.attr('rect/stroke', 'orange')
            cell.attr('rect/fill', 'orange')
        }
    }.bind(this))
},

重新布局
重新布局最关键的是要把joint的graph对象转换为graphlib对象,然后再转换回来,缺省的转换过程会把link的label丢掉,需要自己添加对应的回调函数来进行转换。

//joint graph -> graph lib
var g = this.graph.toGraphLib({
    setEdgeLabel: function(cell) {
        return cell.prop('labels/0/attrs/text/text');
    }
});

//graphlib -> joint graph
var self = this;
this.graph.fromGraphLib(g, {
    importNode: function(node) {
        this.addCell(self.makeElement(node));
    },
    importEdge: function(edge) {
        var label = g.edge(edge);
        this.addCell(self.makeLink(edge.v, edge.w, label));
    }
});

收集的代码(备用)

  //define the style of magnet links
  defaultLink: function(cellView, magnet) {
    return new joint.shapes.standard.Link({
        attrs: {
          line: {
            stroke: V(magnet).attr('port-group') === "blue-ports" ? "blue" : "red"
          }
        }
    }
  })

相关文章

  • 前端流程图之JointJS(四)

    今天的工作重点分三块: 属性窗口,用于展示和修改单个节点的属性值 Run to here(RTH)功能,任意选择一...

  • 前端流程图之JointJS(五)

    今天是本系列的最后一篇,基本功能都已经实现了。 今天完成的功能包括: 移动画布/缩放画布 完成和require.j...

  • 前端流程图之JointJS(一)

    JointJS是一个开源的前端流程图框架,基于SVG进行绘制,目前的版本是2.2.1,同时该项目已经开始了商业化运...

  • 前端流程图之JointJS(三)

    先上一张效果图 今天完成的功能包括 节点的deleteTool 上下文菜单(创建节点) 连接两个节点 重新布局 具...

  • 前端流程图之JointJS(二)

    先来看看paper的参数定义 其中: elementView用于定义个性化的组件渲染类,如果你希望你的组件显示得与...

  • [jointjs] 自定义shape

    前面一篇写了使用jointjs实现自动布局和拖拽缩放,这篇记录一下自定义图形。 首先jointjs内置的图形有很多...

  • jointjs 入门

    刚上线的项目中用到了jointjs,之前直接不知道它的存在,一个是由于知识面不够,一方面是对拓扑图这块几乎没...

  • jointjs Demo

  • 0418

    1.前端界面与数据的连接基本实现 最近的问题:读取数据且呈现流程图,呈现流程图到UI界面的控件graphviz上 ...

  • 产品页面流程图

    在前面《产品需要构建哪些流程图》中讲到产品需要的四种流程图:业务流程图、页面流程图、功能流程图、数据流程图。 下面...

网友评论

    本文标题:前端流程图之JointJS(四)

    本文链接:https://www.haomeiwen.com/subject/eufqwqtx.html