LogicFlow 学习笔记——10. LogicFlow 进阶 边

我们可以基于 Vue 组件自定义边,可以在边上添加任何想要的 Vue 组件,甚至将原有的边通过样式隐藏,重新绘制。
如 Example3 中所示:
在这里插入图片描述

锚点

默认情况下,LogicFlow 只记录节点与节点的信息。但是在一些业务场景下,需要关注到锚点,比如在 UML 类图中的关联关系;或者锚点表示节点的入口和出口之类。这个时候需要重写连线的保存方法,将锚点信息也一起保存。

class CustomEdgeModel2 extends LineEdgeModel {// 重写此方法,使保存数据是能带上锚点数据。getData() {const data = super.getData();data.sourceAnchorId = this.sourceAnchorId;data.targetAnchorId = this.targetAnchorId;return data;}
}

动画

由于 LogicFlow 是基于 svg 的流程图编辑框架,所以我们可以给 svg 添加动画的方式来给流程图添加动画效果。为了方便使用,我们也内置了基础的动画效果。在定义边的时候,可以将属性isAnimation设置为 true 就可以让边动起来,也可以使用lf.openEdgeAnimation(edgeId)来开启边的默认动画。

class CustomEdgeModel extends PolylineEdgeModel {setAttributes() {this.isAnimation = true;}getEdgeAnimationStyle() {const style = super.getEdgeAnimationStyle();style.strokeDasharray = "5 5";style.animationDuration = "10s";return style;}
}

下面我们对上面的内容写一个简单的样例:
样例中使用了 JSX 所以需要进行配置,在项目中,运行pnpm install @vitejs/plugin-vue-jsx并在vite.config.js增加如下配置:

import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import vueJsx from '@vitejs/plugin-vue-jsx';export default defineConfig({plugins: [vue(), vueJsx()]
});

新建src/views/Example/LogicFlowAdvance/Edge/Example01/CustomCard.vue代码如下:

<script setup lang="tsx">
import { ref } from 'vue'const props = defineProps({properties: {type: Object,required: true}
})type Answer = {text: stringid: string
}type Properties = {title: stringcontent: stringanswers: Answer[]
}// Example props passed to the component
const properties = ref(props.properties as Properties)
</script>
<template><div class="html-card"><!-- <ElButton οnclick="alert(123)" type="primary" style="margin-left: 15px">Title</ElButton> --><div class="html-card-header">{{ properties.title }}</div><div class="html-card-body">{{ properties.content }}</div><div class="html-card-footer"><div v-for="answer in properties.answers" :key="answer.id" class="html-card-label">{{ answer.text }}</div></div></div>
</template>
<style scoped>
.html-card {width: 240px;height: 100%;box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);border-radius: 4px;border: 1px solid #ebeef5;background-color: #fff;overflow: hidden;color: #303133;transition: 0.3s;box-sizing: border-box;padding: 5px;
}
/* 定义节点不被允许连接的时候,节点样式 */
.lf-node-not-allow .html-card {border-color: #f56c6c;
}
.lf-node-allow .html-card {border-color: #67c23a;
}
.html-card-header {font-size: 12px;line-height: 24px;margin-left: 14px;
}
.html-card-header:before {content: '';position: absolute;left: 5px;top: 13px;display: block;width: 7px;height: 7px;border: 1px solid #cbcef5;border-radius: 6px;
}
.html-card-body {font-size: 12px;color: #6f6a6f;margin-top: 5px;
}.html-card-footer {display: flex;position: absolute;bottom: 5px;
}
.html-card-label {font-size: 12px;line-height: 16px;padding: 2px;background: #ebeef5;margin-right: 10px;
}
</style>

新建src/views/Example/LogicFlowAdvance/Edge/Example01/CustomCard.tsx代码如下:

import { HtmlNode, HtmlNodeModel } from '@logicflow/core'
import { createApp, h, App, VNode, render } from 'vue'
import CustomCard from './CustomCard.vue'class HtmlCard extends HtmlNode {isMounted: booleanapp: App<Element>r: VNodeconstructor(props: any) {super(props)this.isMounted = falsethis.r = h(CustomCard, {properties: props.model.getProperties(),text: props.model.inputData})this.app = createApp({render: () => this.r})}// 重写HtmlNode的setHtml,来控制html节点内容。setHtml(rootEl: HTMLElement) {if(!this.isMounted) {this.isMounted = trueconst node = this.getCardEl()render(node, rootEl)} else {if (this.r.component) {this.r.component.props.properties = this.props.model.getProperties();}}}getCardEl() {const { properties } = this.props.modelreturn <><CustomCard properties={properties} /></>}
}
class HtmlCardModel extends HtmlNodeModel {initNodeData(data: any) {super.initNodeData(data)// 禁止节点文本可以编辑this.text.editable = falsethis.width = 240// 定义连接规则,只允许出口节点连接入口节点const rule = {message: '只允许出口节点连接入口节点',validate: (sourceNode: any, targetNode: any, sourceAnchor: any, targetAnchor: any) => {console.log(sourceNode, targetNode)console.log(sourceAnchor, targetAnchor)return sourceAnchor.type === 'sourceAnchor' && targetAnchor.type === 'targetAnchor'}}this.sourceRules.push(rule)}setAttributes() {const {properties: { content }} = this// 动态计算节点的高度const rowSize = Math.ceil(content.length / 20)this.height = 60 + rowSize * 18}/*** 计算每个锚点的位置*/getDefaultAnchor() {const { height, x, y, id, properties } = thisconst anchorPositon = []anchorPositon.push({x,y: y - height / 2,type: 'targetAnchor',id: `${id}_targetAnchor`})if (properties.answers) {let preOffset = 5properties.answers.forEach((answer: any) => {const text = answer.text// 计算每个锚点的位置,锚点的位置一般相对节点中心点进行偏移const offsetX = preOffset + (this.getBytesLength(text) * 6 + 4) / 2 - this.width / 2preOffset += this.getBytesLength(text) * 6 + 4 + 10const offsetY = height / 2anchorPositon.push({x: x + offsetX,y: y + offsetY,type: 'sourceAnchor',id: answer.id})})}return anchorPositon}getBytesLength(word: any) {if (!word) {return 0}let totalLength = 0for (let i = 0; i < word.length; i++) {const c = word.charCodeAt(i)if (word.match(/[A-Z]/)) {totalLength += 1.5} else if ((c >= 0x0001 && c <= 0x007e) || (c >= 0xff60 && c <= 0xff9f)) {totalLength += 1.2} else {totalLength += 2}}return totalLength}
}export default {type: 'html-card',view: HtmlCard,model: HtmlCardModel
}

新建src/views/Example/LogicFlowAdvance/Edge/Example01/CustomEdge.tsx代码如下:

import { BezierEdge, BezierEdgeModel } from '@logicflow/core'class CustomEdge extends BezierEdge {}class CustomEdgeModel extends BezierEdgeModel {getEdgeStyle() {const style = super.getEdgeStyle()// svg属性style.strokeWidth = 1style.stroke = '#ababac'return style}/*** 重写此方法,使保存数据是能带上锚点数据。*/getData() {const data: any = super.getData()data.sourceAnchorId = this.sourceAnchorIddata.targetAnchorId = this.targetAnchorIdreturn data}setAttributes() {this.isAnimation = true;}
}export default {type: 'custom-edge',view: CustomEdge,model: CustomEdgeModel
}

新建src/views/Example/LogicFlowAdvance/Edge/Example01/data.ts,内容如下:

const data = {nodes: [{id: 'node_id_1',type: 'html-card',x: 340,y: 100,properties: {title: '普通话术',content: '喂,您好,这里是XX装饰,专业的装修品牌。请问您最近有装修吗?',answers: [{ id: '1', text: '装好了' },{ id: '2', text: '肯定' },{ id: '3', text: '拒绝' },{ id: '4', text: '否定' },{ id: '5', text: '默认' }]}},{id: 'node_id_2',type: 'html-card',x: 160,y: 300,properties: {title: '推荐话术',content:'先生\\女士,您好!几年来,我们通过对各种性质的建筑空间进行设计和施工,使我们积累了丰富的管理、设计和施工经验,公司本着以绿色环保为主题,对家居住宅、办公、商铺等不同特点的室内装饰产品形成了独特的装饰理念。',answers: [{ id: '1', text: '感兴趣' },{ id: '2', text: '不感兴趣' },{ id: '3', text: '拒绝' }]}},{id: 'node_id_3',type: 'html-card',x: 480,y: 260,properties: { title: '结束话术', content: '抱歉!打扰您了!', answers: [] }},{id: 'node_id_4',type: 'html-card',x: 180,y: 500,properties: {title: '结束话术',content: '好的,我们将安排师傅与您联系!',answers: []}}],edges: [{id: 'e54d545f-3381-4769-90ef-0ee469c43e9c',type: 'custom-edge',sourceNodeId: 'node_id_1',targetNodeId: 'node_id_2',startPoint: { x: 289, y: 148 },endPoint: { x: 160, y: 216 },properties: {},pointsList: [{ x: 289, y: 148 },{ x: 289, y: 248 },{ x: 160, y: 116 },{ x: 160, y: 216 }],sourceAnchorId: '2',targetAnchorId: 'node_id_2_targetAnchor'},{id: 'ea4eb652-d5de-4a85-aae5-c38ecc013fe6',type: 'custom-edge',sourceNodeId: 'node_id_2',targetNodeId: 'node_id_4',startPoint: { x: 65, y: 384 },endPoint: { x: 180, y: 461 },properties: {},pointsList: [{ x: 65, y: 384 },{ x: 65, y: 484 },{ x: 180, y: 361 },{ x: 180, y: 461 }],sourceAnchorId: '1',targetAnchorId: 'node_id_4_targetAnchor'},{id: 'da216c9e-6afe-4472-baca-67d98abb1d31',type: 'custom-edge',sourceNodeId: 'node_id_1',targetNodeId: 'node_id_3',startPoint: { x: 365, y: 148 },endPoint: { x: 480, y: 221 },properties: {},pointsList: [{ x: 365, y: 148 },{ x: 365, y: 248 },{ x: 480, y: 121 },{ x: 480, y: 221 }],sourceAnchorId: '4',targetAnchorId: 'node_id_3_targetAnchor'},{id: '47e8aff3-1124-403b-8c64-78d94ec03298',type: 'custom-edge',sourceNodeId: 'node_id_1',targetNodeId: 'node_id_3',startPoint: { x: 327, y: 148 },endPoint: { x: 480, y: 221 },properties: {},pointsList: [{ x: 327, y: 148 },{ x: 327, y: 248 },{ x: 476, y: 161 },{ x: 480, y: 221 }],sourceAnchorId: '3',targetAnchorId: 'node_id_3_targetAnchor'}]
}export default data

最后新建src/views/Example/LogicFlowAdvance/Edge/Example01/Example01.vue内容如下:

<script setup lang="ts">
import LogicFlow from '@logicflow/core'
import '@logicflow/core/dist/style/index.css'
import { onMounted } from 'vue'
import data from './data'
import CustomCard from './CustomCard'
import CustomEdge from './CustomEdge'
import CustomEdge2 from './CustomEdge2'// 在组件挂载时执行
onMounted(() => {// 创建 LogicFlow 实例const lf = new LogicFlow({container: document.getElementById('container')!, // 指定容器元素grid: true // 启用网格})lf.register(CustomCard)lf.register(CustomEdge)lf.register(CustomEdge2)lf.setDefaultEdgeType('custom-edge')lf.render(data)
})
</script><template><h3>Example01</h3><div id="container"></div><!-- 用于显示 LogicFlow 图表的容器 -->
</template><style>
#container {/* 容器宽度 */width: 100%;/* 容器高度 */height: 600px;
}
</style>

样例运行如下:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为数据驱动的企业数字化转型之路

华为数据驱动的企业数字化转型之路 数据驱动的数字化转型是企业未来发展的关键。通过构建完善的数据治理体系&#xff0c;包括差异化的数据管理、面向业务的信息架构、数据底座建设和自助数据服务&#xff0c;企业可以提升数据的利用效率和决策能力。本文将根据华为数据治理相…

服务端⾼并发分布式结构演进之路

在进行技术学习过程中&#xff0c;由于大部分读者没有经历过一些中大型系统的实际经验&#xff0c;导致无法从全局理解一些概念&#xff0c;所以本文以一个"电子商务"应用为例&#xff0c;介绍从一百个到千万级并发情况下服务端的架构的演进过程&#xff0c;同时列举…

JavaEE多线程(2)

文章目录 1..多线程的安全1.1出现多线程不安全的原因1.2解决多线程不安全的⽅法1.3三种典型死锁场景1.4如何避免死锁问题2.线程等待通知机制2.1等待通知的作用2.2等待通知的方法——wait2.3唤醒wait的方法——notify 1…多线程的安全 1.1出现多线程不安全的原因 线程在系统中…

一名女DBA的感谢信,到底发生了什么?

昨日我们收到这样一通来电 “早上九点刚上班便收到业务投诉电话&#xff0c;系统卡顿&#xff0c;接口失败率大增&#xff0c;怀疑数据库问题。打开运维平台发现是国产库&#xff0c;生无可恋&#xff0c;第一次生产环境遇到国产库性能问题&#xff0c;没什么排查经验&#xf…

数学建模基础:线性模型

目录 前言 一、线性方程组 二、线性规划 三、线性回归 四、线性模型的应用 五、实例示范&#xff1a;医疗成本预测 步骤 1&#xff1a;导入数据 步骤 2&#xff1a;数据预处理 步骤 3&#xff1a;建立多元线性回归模型 步骤 4&#xff1a;模型验证 步骤 5&#xff1…

2024 年最新 windows 操作系统部署安装 redis 数据库详细教程(更新中)

Redis 数据库概述 Redis 是一个开源的&#xff0c;内存中的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中介。Redis&#xff08;Remote Dictionary Server &#xff09;&#xff0c;即远程字典服务&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基…

遥感图像地物覆盖分类,数据集制作-分类模型对比-分类保姆级教程

遥感图像地物覆盖分类,数据集制作-分类模型对比-分类保姆级教程 在遥感影像上人工制作分类数据集采用python+gdal库制作数据集挑选分类模型(RF、KNN、SVM、逻辑回归)选择随机森林模型建模分类遥感图像预测在遥感影像上人工制作分类数据集 1.新建shp文件 地理坐标系保持和影像…

紫光展锐芯片进入烧录模式

实验平台&#xff1a;移远通信SC200L搭载SMART-EVB-G5开发板 软件进入&#xff1a; SPRD平台芯片可以通过adb进入fastboot模式&#xff0c;由fastboot flash boot等指令烧录&#xff1a; $ adb root $ adb reboot fastboot $ fastboot flash boot boot.img 由于usb传输一般都…

2020年中国1km格网耕地破碎度数据集

摘要 耕地破碎度是对耕地破碎化的定量描述&#xff0c;耕地破碎化是指由于自然或人为因素&#xff0c;耕地图斑数量增加&#xff0c;斑块大小减小&#xff0c;隔离程度增加&#xff0c;呈现出分散和无序格局。破碎化不仅会影响生态系统的结构和功能&#xff0c;同时不利于提高耕…

开源AGV调度系统OpenTCS中的路由器(router)详解

OpenTCS中的任务分派器router详解 1. 引言2. 路由器(router)2.1 代价计算函数&#xff08;Cost functions&#xff09;2.2 2.1 Routing groups2.1 默认的停车位置选择2.2 可选停车位置属性2.3 默认的充电位置选择2.4 即时运输订单分配 3. 默认任务分派器的配置项4. 参考资料与源…

想要高效回复客户消息?来看看这个款微信神器

不管是销售还是客服来说&#xff0c;能及时回复客户的反馈和问题&#xff0c;是确保顾客满意度的关键因素。 今天&#xff0c;就给大家分享一个职场必备神器——个微管理系统&#xff0c;帮助大家提高回复效率&#xff01; 首先&#xff0c;你可以在系统上设置自动通过好友后自…

Windows10安装Docker Desktop(实操步骤版)

1&#xff0c;下载Docker Desktop 官网下载地址&#xff1a; https://desktop.docker.com/win/stable/amd64/Docker%20Desktop%20Installer.exe 国内镜像下载地址&#xff08;本人下载这个&#xff09;&#xff1a; https://smartidedl.blob.core.chinacloudapi.cn/docker/2…

基于Quartus Prime18.1的安装与FPGA的基础仿真(联合Modelsim)教程

Quartus是一种美国科技公司Intel&#xff08;英特尔&#xff09;公司开发的FPGA&#xff08;现场可编辑门阵列&#xff09;设计编译软件&#xff0c;用作设计、仿真、综合和布局、支持多种编程语言&#xff0c;包括VHDL、Verilog等&#xff0c;并具有丰富的功能和工具库&#x…

T200HSA单路SDI/HDMI+1路3.5音频高清万能采集卡

产品简介&#xff1a; 同三维T200HSA单路高清万能采集卡&#xff0c;可以采集1路SDI/HDMI高清信号1路3.5音频信号&#xff0c;卡上有1个是HDMI接口1个是SDI接口1个3.5音频口&#xff0c;配件有&#xff1a; 1个小档板&#xff0c;PCI-E2.0 X1&#xff0c;分辨率最高可以达到10…

可信计算和数字水印技术

可信计算 可信计算可信计算基础概述可信计算关键技术要素可信性认证可信计算优劣 数字水印技术数字版权保护技术 可信计算 可信计算基础概述 可信计算&#xff08;Trusted Computing&#xff0c;TC&#xff09;&#xff1a;在计算和网络通信系统中广泛使用的、基于硬件安全模块…

【我是产品经理_注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞 …

【单片机】DS2431芯片,读写128个字节,程序

ds2431pt&r stm32读写程序&#xff1a; 部分程序&#xff1a; #include "sys.h" #include "delay.h" #include "usart.h"#include <stdio.h> #include <stdlib.h> #include <string.h>#include "sys.h" #incl…

二开的精美UI站长源码分享论坛网站源码 可切换皮肤界面

二开的精美UI站长源码分享论坛网站源码 可切换皮肤界面 二开的精美UI站长源码分享论坛网站源码 可切换皮肤界面

C语言入门系列:数据类型之字面量类型

文章目录 一&#xff0c;什么是字面量二&#xff0c;字面量为什么需要类型&#xff1f;三&#xff0c;变量类型和字面量类型的区别1&#xff0c;作用不同2&#xff0c;方式不同 四&#xff0c;编译器如何推断字面量类型1&#xff0c;整数2&#xff0c;浮点数3&#xff0c;字面量…

2024最新AI大模型-LLm八股合集(八)-Transformer模型

更多2024最新AI大模型-LLm八股合集可以拉到文末&#xff01;&#xff01;&#xff01; MHA & MQA & MGA &#xff08;1&#xff09;MHA 从多头注意力的结构图中&#xff0c;貌似这个所谓的多个头就是指多组线性变换层&#xff0c;其实并不是&#xff0c;只有使用了一…