bpmn.js + vue + vuex的业务实现-自定义连线、箭头的颜色和虚线

3,285 阅读3分钟

前言

上一章节我们介绍了关于bpmn.js如何与自定义renderer给节点增加图片和底色改变, 要是不了解的小伙请移步 bpmn.js + vue + vuex的业务实现——节点增加图片和样式改变 这一章节主要讲解的是关于bpmn.js如何自定义连线、箭头的颜色和实线改为虚线

开源链接

gitee:gitee.com/zh-howe/bpm…

设置连线颜色

原理

这里有必要简单补充一下bpmn.js关于连线和箭头的实现原理

image.png bpmn.js是用path标签实现连线,而箭头的标签是放在def标签里,marker-end里的是url是用箭头的id实现运用箭头

image.png

这时候思路就很明白了,我们需要在def里创建包含path标签的marker标签自定义不同样式的箭头,哪条连线需要哪个箭头,marker-end里就写了哪个的id

方法

官方API

const modeling = this.modeler.get('modeling')
modeling.setColor(element, {
  fill: 'blue',
  stroke: 'red'
})

通过 css 自定义连线和箭头的颜色

NavigatedViewerViewerModeler三种模式都适用 配合自定义渲染加上不同的类名,能够达到每条线有不一样的颜色 或者遍历链路获取节点的颜色,与节点保持相同颜色 主要 通过 css 改变颜色

  1. 引入 css
.djs-connection {
  path {
    stroke: blue !important;
    marker-end: url(#sequenceflow-arrow-normal) !important;
  }
}

注意 #sequenceflow-arrow-normal 为箭头下面要创建的箭头的 id

  1. 创建自定义箭头并放在def里
//customRenderer.vue

import {
  append as svgAppend,
  attr as svgAttr,
  create as svgCreate
} from 'tiny-svg'
import { query as domQuery } from 'min-dom';

this.bpmnModeler
    .importXML(resourceXml)
    .then(() => {
      const marker = svgCreate('marker');
      const markerActivities = svgCreate('marker');

      svgAttr(marker, {
        id: 'sequenceflow-arrow-normal',
        viewBox: '0 0 20 20',
        refX: '11',
        refY: '10',
        markerWidth: '10',
        markerHeight: '10',
        orient: 'auto',
      });

      svgAttr(markerActivities, {
        id: 'sequenceflow-arrow-activities',
        viewBox: '0 0 20 20',
        refX: '11',
        refY: '10',
        markerWidth: '10',
        markerHeight: '10',
        orient: 'auto',
      });

      const path = svgCreate('path');
      const pathActivities = svgCreate('path');

      svgAttr(path, {
        d: 'M 1 5 L 11 10 L 1 15 Z',
        style:
          ' stroke-width: 1px; stroke-linecap: round; stroke-dasharray: 10000, 1; stroke: #cccccc;fill:#ccc;',
      });
      svgAttr(pathActivities, {
        d: 'M 1 5 L 11 10 L 1 15 Z',
        style:
          ' stroke-width: 1px; stroke-linecap: round; stroke-dasharray: 10000, 1; stroke: #fdb039;fill:#fdb039;',
      });

      const defs = domQuery('defs');
      svgAppend(marker, path);
      svgAppend(defs, marker);
      svgAppend(markerActivities, pathActivities);
      svgAppend(defs, markerActivities);

      // 让图能自适应屏幕
      const canvas = this.bpmnModeler.get('canvas');
      canvas.zoom('fit-viewport', 'auto'); //画布自适应居中
      canvas.zoom(0.8); //缩写至0.8倍
      // 这里是成功之后的回调, 可以在这里做一系列事情
      this.success();
    })
    .catch(err => {
      if (err) {
        console.error(err);
      }
    });

我这里需要两种不同颜色的线和箭头,所以创建了两种箭头,在css中的marker-end分别赋予不同的id,这样就能与后端交互,实现特定的线用特定的颜色,那么问题来了,我们拿到后端返回的数据后该怎么实现交互呢?

虚线

虚线可以用stroke-dasharray来实现

.djs-connection {
  path {
    stroke: blue !important;
    stroke-dasharray: 8 !important; //间隔多少像素绘制一次  虚线
    marker-end: url(#sequenceflow-arrow-normal) !important;
  }
}

完整文件目录展示

image.png

  • custom 文件用于编写自定义renderer
  • utils用于存储图片及文字数据
  • customRenderer.vue是用于渲染流程图

系列文章目录