LogicFlow:自定义 bpmn 用户节点(1)

news2024/11/25 7:17:49

切入正题之前,首先我们先了解下面板上面节点的几个重要属性,如下图:
在这里插入图片描述
虽然 logicflow 内置插件里面有用户节点(bpmn:userTask),但是你若是想实现下面这种形式,就需要自己重新写个节点了。
在这里插入图片描述
上面这种节点从图上看我们需要准备一个长方形(rect),在长方形里面添加左上角和底部中间的图标。代码如图:

import { RectNode, RectNodeModel, h } from "@logicflow/core";

const NODE_COLOR = '#187dff';
const circleMatter: 'M513.34 831.74C337.03 831.74 193.6 688.31 193.6 512c0-71.09 23.31-138.85 65.53-194.03v51.61c0 17.67 14.33 32 32 32s32-14.33 32-32V239.45c0-5.87-1.59-11.36-4.34-16.09-0.06-0.1-0.11-0.2-0.17-0.3-0.16-0.28-0.34-0.55-0.51-0.82-0.13-0.2-0.26-0.41-0.39-0.61-0.08-0.13-0.17-0.25-0.26-0.37a35.5 35.5 0 0 0-1.58-2.13c-6.81-8.35-16.96-12.35-26.95-11.69h-130c-17.67 0-32 14.33-32 32s14.33 32 32 32h55.35C159.8 339 129.6 423.35 129.6 512c0 51.79 10.15 102.05 30.17 149.38 19.33 45.7 46.99 86.74 82.23 121.97 35.23 35.23 76.27 62.9 121.97 82.23 47.33 20.02 97.59 30.17 149.38 30.17 17.67 0 32-14.33 32-32s-14.34-32.01-32.01-32.01zM855.38 762.3h-51.23c19.81-23 36.93-48.3 50.75-75.22 27.6-53.74 42.18-114.28 42.18-175.08 0-51.79-10.15-102.05-30.17-149.38-19.33-45.7-46.99-86.73-82.23-121.97-35.23-35.23-76.27-62.9-121.97-82.23-47.33-20.02-97.59-30.17-149.38-30.17-17.67 0-32 14.33-32 32s14.33 32 32 32c176.31 0 319.74 143.44 319.74 319.74 0 78.31-27.68 151.61-77.6 209.05l0.24-56.04c0.08-17.67-14.19-32.06-31.86-32.14h-0.14c-17.61 0-31.92 14.24-32 31.86l-0.55 129.43a31.988 31.988 0 0 0 9.32 22.71 31.68 31.68 0 0 0 5.33 4.3c0.02 0.01 0.04 0.02 0.06 0.04 0.48 0.31 0.97 0.61 1.47 0.89l0.15 0.09c0.5 0.28 1 0.54 1.51 0.8 0.03 0.01 0.05 0.03 0.08 0.04 1.64 0.8 3.34 1.46 5.1 1.98 0.01 0 0.02 0.01 0.03 0.01 0.55 0.16 1.1 0.3 1.66 0.43 0.07 0.02 0.15 0.03 0.22 0.05 0.5 0.11 1 0.21 1.5 0.3 0.1 0.02 0.2 0.04 0.3 0.05 0.48 0.08 0.96 0.15 1.44 0.21 0.11 0.01 0.23 0.03 0.34 0.04 0.48 0.05 0.95 0.09 1.43 0.12l0.34 0.03c0.53 0.03 1.07 0.04 1.61 0.05h132.31c17.67 0 32-14.33 32-32s-14.31-31.99-31.98-31.99z'

class CustomRectNode extends RectNode {
  getIconShape() {
    const { model } = this.props
    const { x, y,height,width } = model
    return [
      h('svg',
        {
          x: x - width / 2 + 5,
          y: y - height / 2 + 5,
          width: 20,
          height: 20,
          viewBox: "0 0 1222 1024"
        },
        h('path', {
          fill: NODE_COLOR, // 图标颜色
          d: 'M892.8 737.122c-20.8-49.2-50.6-93.4-88.5-131.3-37.9-37.9-82.1-67.7-131.3-88.5-11-4.7-22.2-8.8-33.5-12.5 63.3-40.6 105.2-111.6 105.2-192.3 0-126.1-102.2-228.3-228.3-228.3s-228.5 102.1-228.5 228.2c0 79.6 40.7 149.6 102.4 190.5-13.3 4.1-26.4 8.9-39.3 14.3-49.2 20.8-93.4 50.6-131.3 88.5-37.9 37.9-67.7 82.1-88.5 131.3-21.6 51-32.5 105.1-32.5 160.9v48H925.3v-48c0-55.7-11-109.8-32.5-160.8z', // 图标
        }),
      ),
      h('svg',
        {
          x: x - width / 2 + 40,
          y: y + height / 2 - 27,
          width: 25,
          height: 25,
          viewBox: "0 0 1274 1024"
        },
        h('path', {
          fill: NODE_COLOR,
          d: circleMatter,
        }),
      )]
  }

  getShape() {
    const { model, graphModel } = this.props;
    const { x, y, width, height, radius, points } = model;
    const style = model.getNodeStyle();
    return h(
      'g',
      {
      },
      [
        h('rect', {
          ...style,
          x: x - width / 2,
          y: y - height / 2,
          rx: radius,
          ry: radius,
          width,
          height
        }),
        ...this.getIconShape(),
      ]
    )
  }
}

class CustomRectModel extends RectNodeModel {
  constructor(data, graphModel) {
    data.text = {
      value: (data.text && data.text.value) || '',
      x: data.x,
      y: data.y + 50,
    }
    super(data, graphModel)
  }

  initNodeData(data) {
    super.initNodeData(data)
    const lenght = 80
    this.points = [
      [0, 0], // [x,y]
      [lenght + 20, 0],
      [lenght + 20, lenght],
      [0, lenght],
    ]
  }

  // 自定义锚点样式
  getAnchorStyle() {
    const style = super.getAnchorStyle()
    style.hover.r = 8
    style.hover.fill = 'rgb(24, 125, 255)'
    style.hover.stroke = 'rgb(24, 125, 255)'
    return style
  }

  getNodeStyle() {
    const style = super.getNodeStyle()
    style.stroke = NODE_COLOR
    return style
  }
}


export default {
  type: "custom-rect",
  view: CustomRectNode,
  model: CustomRectModel
};

代码中你需要了解的知识:

  1. 自定义节点view
  2. h函数
  3. SVG path

其他参考:

1、教程:https://docs.logic-flow.cn/docs/#/zh/guide/start;
2、API:https://docs.logic-flow.cn/docs/#/zh/api/logicFlowApi;
3、示例:https://docs.logic-flow.cn/examples/;
4、Bpmn 示例:https://docs.logic-flow.cn//demo/dist/examples/#/usage/bpmn?from=doc;
5、LogicFlow 实例:https://docs.logic-flow.cn/docs/#/zh/guide/basic/logic-flow
6、BPMN 元素 BpmnElement:https://docs.logic-flow.cn/docs/#/zh/guide/extension/bpmn-element

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/666277.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MongoDB_5.0.18下载及安装(CentOS7)

文章目录 MongoDB安装(Centos7)1、下载地址2、安装流程2.1 下载server包2.2 安装server包2.3 修改默认mongod.conf配置文件2.4 启动服务2.5 这样就可以通过远程工具进行链接使用,创建mongodb用户,详细请查看其他文档 3、分享远程工…

球王梅西的力量

这次阿根廷来中国参加友谊赛,场内场外都有很多值得大众思考的,无论是对主办方的各种吐槽,还是对球迷近乎疯狂的追星行为,又或者是疫情放开后,大众积压已久的情绪,好象以往国外球队来,无论是顶级…

Axure教程——滑动拼图解锁

本文将教大家如何用AXURE中的动态面板制作拼图解锁 一、效果 预览地址:https://74wxu6.axshare.com 二、功能 拖动图片到指定位置提示“验证成功”,如果没到指定位置则提示“验证没成功,请重新验证” 三、制作 1、制作拼图 加入底部验证图…

【Python 随练】乒乓球比赛名单

题目: 两个乒乓球队进行比赛,各出三人。甲队为 a,b,c 三人,乙队为 x,y,z 三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a 说他不和 x 比,c 说他不和 x,z 比,请编程序找出三队赛手的名单。 简介:…

【软考-中级】系统集成项目管理工程师【总】

持续更新中。。。。。。。。。。。。。。。 学习目标:完成2023上半年 软件中考任务 目标23年5月 考试前 完成 相关知识点学习 和练习 核心 十五至尊图: 上面图是考试的核心,需要背下来 一、信息化知识(重点)一般…

Selenium Web自动化测试框架实践

目录 前言: 项目背景 功能实现 项目架构 浏览器driver定义 用例运行前后的环境准备工作 工具方法模块 Pageobject页面对象封装 执行测试用例   前言: Selenium是一个基于Web的自动化测试框架,可以通过模拟用户在浏览器上的操作,…

直接选择排序及其稳定性分析

直接选择排序 直接选择排序是一种很直观的排序方法。其操作是这样:先在未排序的序列中选择最小的元素(或最大的元素),把它与第一个元素交换,放在第一个位置,再在剩余未排序序列中选择第二小的,…

驾驭Dubbo:探索其核心概念与突出特性,助力分布式系统升级

1、Dubbo简介 Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力, 利用 Dubbo 提供的丰富服…

147-Prolixe-KeygenMe#1

Exeinfo查壳,发现没有壳,是Delphi程序 OD字符串搜索,找到关键位置,发现一个关键的call,和一个strcmp比较函数。 进入关键call进行分析,结合IDA。 分析这个call,发现输入的name字符串长度必须…

北欧又一国家布局量子

光子盒研究院 6 月 8 日,挪威奥斯陆城市大学、Simula 研究实验室在内的QCNorway研讨会团队撰写了一份立场文件,其中,对新兴的挪威量子战略提出了建议。 “世界正在接近一场量子革命——一个为期40年的梦想,利用量子力学的现象使计…

学习笔记之法理学

目录 法理学第一节 法的概述一、法的概念二 法的特征三、法的作用(一)法的规范作用(教预引制评)1. 指引作用2.评价作用3.预测作用4.强制作用5.教育作用 (二)法的社会作用(考察较少,两个考点) 四…

浅谈医院电气火灾的起因与预防

摘要:医院属公共场所,建筑密集,人员集中,且弱势群体(病人)居多,一旦发生火灾,可能造成重大财产损失和人员伤亡。在引起医院火灾的各种因素中,电气火灾由于医院建筑功能与其他建筑不同…

网络安全自学秘籍

前言 想学网络安全但是无从下手的小白看过来,非常系统的学习资料,无数小白看了这份资料都已经成功入门,涵盖多个网络安全知识点,我愿称之为网络安全自学宝典。 一、概念性知识 1、了解什么是网络安全 2、清楚法律法规 3、网络安…

【Java】java中接口幂等性解决方案

文章目录 一、概念二、场景三、解决方案3.1、数据库唯一标识3.2、乐观锁3.3、悲观锁3.4、Token机制3.5、分布式锁 四、总结 一、概念 一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数…

shape_based_matching lineMod开源代码学习

github开源代码地址: https://github.com/meiqua/shape_based_matching 针对匹配精度问题,原作者采用了sub-pixel icp的方法进行了最后的finetune,涉及到的相关原理可以查看:亚像素边缘提取与ICP2D的理解 - 知乎 涉及到的论文…

Precision Neuroscience提出第7层皮层接口:可扩展的微创脑机接口平台

大脑皮层包含六层结构,美国精密神经科学公司(Precision Neuroscience Corporation)的研究人员提出了第7层皮层接口:可拓展的微创脑机接口平台。构建了一种模块化的和可拓展的脑机接口平台,包括高通量薄膜电极阵列和微创…

新加坡市场扩张指南:品牌布局策略与挑战解析

随着全球化的发展和市场竞争的加剧,越来越多的企业开始考虑将业务拓展到新的市场。其中,新加坡作为一个经济繁荣、政治稳定、文化多元的国家,成为许多品牌出海的首选目的地之一。然而,要在这个激烈竞争的市场中取得成功&#xff0…

绘制stm32最小系统板

原理图: 不使用串口烧录,所以BOOT0和BOOT1都接地。 VDD:就是单片机的供电电压。 VDDA:VDD后面有个A,AAnalog,表示模拟的意思,就是芯片内部模拟器件的工作电压。 VSSA:表示模拟器件…

2023 Softing暑期培训计划

通过以实践为导向的培训课程提高能力 Softing将在2023年暑期为您提供全面的培训课程。在Softing线上研讨会中,您将体验到结构紧凑的培训课程,包含实用的用户问题讨论以及完善的理论知识交流,而无需学习冗长而枯燥的标准。无论您是初学者还是…

Unittest二次开发实战

目录 前言 unittest.TestResult类简介 TestResult类定制目标 实现步骤 测试结果summary格式规划 单个用例结果格式规划 用例tags和level的实现 根据测试方法对象获取用例代码 单个用例结果类的实现 TestResult属性及初始化方法 测试开始和测试结束 用例开始和用例结束 1. 重写恢…