编辑 | blame | 历史 | 原始文档

界面布局结构

  • palette(工具栏) :提供拖拽工具、框选工具、连线工具、基本图元等
  • contextPad(上下文面板):可以理解为快捷面板
  • propertiesPanel(属性面板):定义流程图中图形元素属性
  • shape(图形) 是所有图形的基类(比如Connection,Root)

导入与导出

## 导入
// 异步方式(推荐)
let result = await bpmnModeler.importXML(xml)

// 回调方式
bpmnModeler.importXML(xml, (result) => {} )

### 导出xml
// 异步方式
let { xml } = await bpmnModeler.saveXML()

// 回调方式
bpmnModeler.saveXML({ format: false },({ xml }) => {})

// 格式化导出的xml
let { xml } = await bpmnModeler.saveXML({ format: true })

### 导出svg
// 异步方式
let { svg } = await bpmnModeler.saveSVG()

// 回调方式
bpmnModeler.saveXML(( { svg } )=>{ })

## 导入的生命周期事件如下:
import.parse.start (即将从xml读取模型)
import.parse.complete (模型读取完成)
import.render.start (图形导入开始)
import.render.complete (图形导入完成)
import.done (一切都完成)

内部模块/供应商/服务

  • eventBus - 事件总线,管理bpmn实例中所有事件
  • canvas - 画布,管理svg元素、连线/图形的添加/删除、缩放等
  • commandStack - 命令堆栈,管理bpmn内部所有命令操作,提供撤销、重做功能等
  • elementRegistry - 元素注册表,管理bpmn内部所有元素
  • moddle - 模型管理,用于管理bpmn的xml结构
  • modeling - 建模器,绘图时用到,提供用于更新画布上元素的 API(移动、删除)
## 获取一个模块

// 第一个参数为模块名称,第二参数表示是否严格模式
bpmnModeler.get("模块名称",false)

事件总线 - eventBus

## 获取事件总线模块
let eventBus = bpmnModeler.get("eventBus")

## 监听事件
// 监听事件
eventBus.on('element.changed', (ev) => {})

// 监听多个事件
eventBus.on(
 ['shape.added', 'connection.added', 'shape.removed', 'connection.removed'],
 (ev) => { 
 }
)

// 设置优先级
eventBus.on('element.changed', 100, (ev) => {})

// 传入上下文
eventBus.on('element.changed', (ev) => {}, that)

// 使用所有参数
eventBus.on('事件名称', 优先级(可选), 回调函数, 上下文(可选))

## 只监听一次事件

// 用法同on
eventBus.once('事件名称', 优先级(可选), 回调函数, 上下文(可选))

## 取消监听事件
// 取消监听
eventBus.off('element.changed', callback)

// 取消监听多个事件
eventBus.off(['shape.added', 'connection.added', 'shape.removed', 'connection.removed'], callback)

## 触发事件
eventBus.fire('element.changed', data)

画布 - canvas

## 获取画布模块
let canvas = bpmnModeler.get("canvas")

## 缩放

/**
 *
 * @param {'fit-viewport' | 'fit-content' | number} lvl
 * @param {'auto'|{ x: number, y: number }} center
 */
function zoom(lvl, center) {
  let canvas = bpmnModeler.get('canvas')
  canvas.zoom(lvl, center)
}

// 适应容器缩放
zoom('fit-canvas','auto')

// 完全显示内容
zoom('fit-content','auto')

## 对齐(选择多个元素使用shift+鼠标左键)
/**
 * 获取当前选集并对齐
 * @param {'left'|'right'|'top'|'bottom'|'middle'|'center'} mode
 */
function align(mode) {
  const align = bpmnModeler.get('alignElements')
  const selection = bpmnModeler.get('selection')
  const elements = selection.get()
  if (!elements || elements.length === 0) {
    return
  }

  align.trigger(elements, mode)
}

元素注册表 - elementRegistry

## 获取元素注册表模块
let elementRegistry = bpmnModeler.get('elementRegistry')

## 遍历所有元素
elementRegistry.forEach((shape, svgElement) => { })

## 获取指定元素
let shape = elementRegistry.get(元素id或者SVGElement)

## 获取过滤后的元素
let shapes = elementRegistry.filter((shape) => shape.type === 'bpmn:Task')

## 更新元素ID
elementRegistry.updateId(shape, "123xxxxsssd")

## 删除一个元素
elementRegistry .remove(传入SVGElement)

## 模型 - moddle
基本上没有用到,具体类型定义见此

## 建模器 - modeling
获取建模器模块
let modeling= bpmnModeler.get('modeling')

## 修改元素显示文本(常用)
modeling.updateLabel(shape, '审核')

## 修改元素属性(常用)
modeling.updateProperties(shape, { 属性名称: 属性值 })

## 对齐元素集合
const selection = bpmnModeler.get('selection')
const elements = selection.get()
modeling.updateProperties(selection, 'left')