在前端开发中,cmmnjs模型和bpmnjs模型有许多类似可参照的地方,本文聚焦于cmmnjs的使用,与bpmn中类似的点将不做赘述。主要说明cmmn和bpmn的不同之处和节点的相关操作。
示例:项目地址 ,基于vue实现,但cmmnjs相关逻辑与框架无关,可直接迁移至其它框架。
代码中涉及到功能模块的部分,将直接以对应模块名称代替,实际开发时需要通过cmmnModeler.get('模块名')获取。
一、用新节点替换旧节点
在画布上创建好节点后,如果想用新节点替换旧节点,可以使用modeling.replaceShape方法。
// 获取旧节点 创建新节点
let oldShape = elementRegistry.get(id)
let newShape = elementFactory.createPlanItemShape("cmmn:DecisionTask");
// 指定newShape的位置,不指定会因为找不到节点位置而报错
newShape.x = oldShape.x + newShape.width / 2;
newShape.y = oldShape.y + newShape.height / 2;
// 传递oldShape中需要保留的值,注意不要替换掉newShape.businessObject.definitionRef定义本身
newShape.businessObject.definitionRef.name =
oldShape.businessObject?.definitionRef?.name;
modeling.replaceShape(oldShape, newShape);
二、改变节点属性/渲染形状
在cmmn中,可以通过自定义渲染模块renderer来自定义节点形状,与bpmn类似。 可能也会出现,在节点已经渲染完成后,又需要改变节点渲染形状的情况。 如果只需要改变样式,比如改变颜色,可以通过
const gfx = elementRegistry.getGraphics(shape)
gfx.style.fill = 'blue';
gfx.style.stroke = 'red';
或添加类名
canvas.addMarker(shape.id, 'highlight')
bpmn中可以通过modeling.setColor来更改节点颜色,cmmn中没有对应函数,需要手动实现。 如果有比较大的形状变动,不能通过改变样式实现时,可以使用modeling.updateProperties方法更新节点属性,以触发节点的重新渲染,在自定义渲染函数中实现新的形状渲染方法。
三、删除节点
// 参数为数组,可以一次删除多个节点
modeling.removeElements([shape])