使用dagre-d3制作流程图


dagre-d3插件github地址:https://github.com/dagrejs/dagre-d3

简易版github网址: https://github.com/xuhuihui/svg/tree/master/demo/demo2

csdn引入:

<script src="https://d3js.org/d3.v4.min.js" charset="utf-8"></script>
<script src="../dist/dagre-d3.js"></script>
index.html

<svg id="svg-canvas" width=960 height=900></svg>
index.js

1.声明数组state(点)和edg(边)

 var state = [
    { label: 'project_etl_start\n虚节点', class: 'type-suss' }, 
    { label: 'project_etl_start\n虚节点', class: 'type-TOP' },   
    { label: 'project_etl_start\n虚节点', class: 'type-TOP' },  
    { label: 'project_etl_start\n虚节点', class: 'type-TOP' },  
    { label: 'project_etl_start\n虚节点', class: 'type-TOP' },   
    { label: 'project_etl_start\n虚节点', class: 'type-TOP' },    
    { label: 'project_etl_start\n虚节点', class: 'type-TOP' },    
    { label: 'project_etl_start\n虚节点', class: 'type-TOP' },    
    { label: 'project_etl_start\n虚节点', class: 'type-TOP' },    
    { label: 'project_etl_start\n虚节点', class: 'type-TOP' },    
    { label: 'project_etl_start\n虚节点', class: 'type-TOP' },    
    { label: 'project_etl_start\n虚节点', class: 'type-TOP' },    
    { label: 'project_etl_start\n虚节点', class: 'type-TOP' },    
    { label: 'project_etl_start\n虚节点', class: 'type-TOP' },    
    { label: 'project_etl_start\n虚节点', class: 'type-TOP' }
]  
var edg = [
    { start: 1, end: 4, option: {} },
    { start: 1, end: 3, option: {} },
    { start: 1, end: 2, option: {} },
    { start: 6, end: 7, option: {} },
    { start: 5, end: 6, option: {} },
    { start: 9, end: 10, option: {} },
    { start: 8, end: 9, option: {} },
    { start: 11, end: 12, option: {} }, 
    { start: 8, end: 11, option: {} },
    { start: 5, end: 8, option: {} },
    { start: 1, end: 5, option: {} },
    { start: 13, end: 14, option: {} },
    { start: 1, end: 13, option: {} },
    { start: 0, end: 1, option: {} }
  ]
2.创建对象graph。
  var g = new dagreD3.graphlib.Graph()
        .setGraph({})
        .setDefaultEdgeLabel(function () { return {}; });
3.声明并添加树节点和边。

  for (let i in state) { //画点
    let el = state[i]
    g.setNode(i, {
      id: i,
      label: el.label,
      class: el.class
    });
  }
  for (let i in edg) { // 画连线
    let el = edg[i]
    g.setEdge(el.start, el.end, {
      style: "stroke: #0fb2cc; fill: none;",
      arrowheadStyle: "fill: #0fb2cc;stroke: #0fb2cc;",
      arrowhead: 'vee'
    });
  }
4.渲染dag图。

   var render = new dagreD3.render();
    var svg = d3.select("#svgCanvas"); //声明节点
    svg.select("g").remove(); //删除以前的节点,清空画面
    var svgGroup = svg.append("g");
    var inner = svg.select("g");
    var zoom = d3.zoom().on("zoom", function () { //添加鼠标滚轮放大缩小事件
      inner.attr("transform", d3.event.transform);
    });
    svg.call(zoom);
    this.drawNode();//画点
    this.drawEdg();// 画连线
    render(d3.select("svg g"), this.g); //渲染节点
    let max = svg._groups[0][0].clientWidth>svg._groups[0][0].clientHeight?svg._groups[0][0].clientWidth:svg._groups[0][0].clientHeight;
    var initialScale = max/779; //initialScale元素放大倍数,随着父元素宽高发生变化时改变初始渲染大小
    var tWidth = (svg._groups[0][0].clientWidth  - this.g.graph().width * initialScale) / 2; //水平居中
    var tHeight = (svg._groups[0][0].clientHeight  - this.g.graph().height * initialScale) / 2; //垂直居中
    svg.call(zoom.transform, d3.zoomIdentity.translate(tWidth, tHeight).scale(initialScale)); //元素水平垂直居中
5.添加鼠标右键事件,样式如图:

  //主要代码如下:
  var svgCanvas = document.getElementById('svg-canvas'); //svg
  var myMenu = document.getElementById("myMenu"); //右键菜单
 
  svgCanvas.addEventListener('mouseover', function (e) {//监听鼠标右键
    e.preventDefault();
    if (e.target.tagName === 'rect') {
          myMenu.style.top = event.clientY + "px"; //获取鼠标位置
          myMenu.style.left = event.clientX + "px";
          myMenu.style.display = 'block';      //显示相应右键内容
    }
  })
  document.addEventListener("click", (event) => {
     myMenu.style.display = 'none';
  });
 

--------------------- 
作者:长是人千离 
来源:CSDN 
原文:https://blog.csdn.net/qq_30227429/article/details/79878660 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要自定义 Dagre-D3 流程图节点,您需要了解以下几个方面: 1. 节点数据结构:在 Dagre-D3 中,节点通常是一个 JavaScript 对象,包含一些必要的属性,如节点的 ID、宽度、高度、位置等。您可以根据您的需求来定义自己的节点数据结构。 2. 节点渲染:Dagre-D3 通过 SVG 来渲染节点。您可以使用 SVG 的各种元素(如 rect、circle、path 等)来定义您的节点外观和样式。您可以使用 Dagre-D3 提供的一些默认样式,也可以根据自己的需求来定义自己的样式。 3. 节点交互:如果您需要为节点添加交互功能,例如鼠标悬停、点击等,您可以使用 D3.js 提供的事件处理函数来实现。您可以在节点元素上绑定事件处理函数,并在函数中实现您的逻辑。 下面是一个简单的自定义节点的示例代码: ```javascript // 定义节点数据结构 var node = { id: 'node1', width: 80, height: 40, x: 100, y: 100 }; // 渲染节点 var svg = d3.select('svg'); var g = svg.append('g'); var rect = g.append('rect') .attr('width', node.width) .attr('height', node.height) .attr('x', node.x) .attr('y', node.y) .attr('fill', '#ccc'); // 添加节点交互 rect.on('mouseover', function() { d3.select(this).attr('fill', '#f00'); }).on('mouseout', function() { d3.select(this).attr('fill', '#ccc'); }); ``` 在这个示例中,我们首先定义了一个简单的节点数据结构,然后使用 SVG 的 rect 元素来渲染节点。最后,我们为 rect 元素添加了鼠标悬停和鼠标移出事件,以改变节点的填充颜色。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值