ant X6高亮

先附上效果图
在这里插入图片描述
// 节点内属性的点击事件:node:port:click
graph.on(‘node:port:click’, ({ node, port }) => {
resetAllHighlights();
highlightPort(node, port, true);
highlightEdgesForPort(port, new Set());
});
// 以下为源码

<template><div id="container"></div>
</template>
<script setup lang="ts">
import {onMounted} from "vue";
import { Graph, Cell, Shape } from '@antv/x6'const LINE_HEIGHT = 24
const NODE_WIDTH = 150Graph.registerPortLayout('erPortPosition',(portsPositionArgs) => {return portsPositionArgs.map((_, index) => {return {position: {x: 0,y: (index + 1) * LINE_HEIGHT,},angle: 0,}})},true,
)Graph.registerNode('er-rect',{inherit: 'rect',markup: [{tagName: 'rect',selector: 'body',},{tagName: 'text',selector: 'label',},],attrs: {rect: {strokeWidth: 1,stroke: '#5F95FF',fill: '#5F95FF',},label: {fontWeight: 'bold',fill: '#ffffff',fontSize: 12,},},ports: {groups: {list: {markup: [{tagName: 'rect',selector: 'portBody',},{tagName: 'text',selector: 'portNameLabel',},{tagName: 'text',selector: 'portTypeLabel',},],attrs: {portBody: {width: NODE_WIDTH,height: LINE_HEIGHT,strokeWidth: 1,stroke: '#5F95FF',fill: '#EFF4FF',cursor: 'pointer',},portNameLabel: {ref: 'portBody',refX: 6,refY: 6,fontSize: 10,},portTypeLabel: {ref: 'portBody',refX: 95,refY: 6,fontSize: 10,},},position: 'erPortPosition',},},},},true,
)onMounted(() => {const graph = new Graph({container: document.getElementById('container'),interacting: false, // 节点不可拖动connecting: {router: {name: 'er',args: {offset: 25,direction: 'H',},},createEdge() {return new Shape.Edge({attrs: {line: {stroke: '#A2B1C3',strokeWidth: 2,},},})},},})const resetAllHighlights = () => {const nodes = graph.getNodes(); // 获取所有nodesnodes.forEach((node) => {const ports = node.getPorts(); // 获取所有portsports.forEach((port) => {node.portProp(port.id, 'attrs/portBody/fill', '#EFF4FF');node.portProp(port.id, 'attrs/portNameLabel/fill', '#000000');node.portProp(port.id, 'attrs/portTypeLabel/fill', '#000000');});});const edges = graph.getEdges();edges.forEach((edge) => {edge.attr('line/stroke', '#A2B1C3');edge.attr('line/strokeWidth', 2);});};const highlightPort = (node: Cell, portId: string, highlight: boolean) => {if (highlight) {node.portProp(portId, 'attrs/portBody/fill', 'yellow');node.portProp(portId, 'attrs/portNameLabel/fill', 'red');node.portProp(portId, 'attrs/portTypeLabel/fill', 'red');} else {node.portProp(portId, 'attrs/portBody/fill', '#EFF4FF');node.portProp(portId, 'attrs/portNameLabel/fill', '#000000');node.portProp(portId, 'attrs/portTypeLabel/fill', '#000000');}};const highlightEdgesForPort = (portId: string, visitedPorts: Set<string>) => {if (visitedPorts.has(portId)) return;visitedPorts.add(portId);const edges = graph.getEdges();edges.forEach((edge) => {const sourcePortId = edge.getSourcePortId();const targetPortId = edge.getTargetPortId();if (sourcePortId === portId || targetPortId === portId) {edge.attr('line/stroke', 'red');edge.attr('line/strokeWidth', 2);const sourceNode = edge.getSourceNode();const targetNode = edge.getTargetNode();// 递归if (sourcePortId === portId && targetNode) {highlightPort(targetNode, targetPortId, true);highlightEdgesForPort(targetPortId, visitedPorts); // Recursively highlight connected ports} else if (targetPortId === portId && sourceNode) {highlightPort(sourceNode, sourcePortId, true);highlightEdgesForPort(sourcePortId, visitedPorts); // Recursively highlight connected ports}}});};graph.on('node:port:click', ({ node, port }) => {resetAllHighlights();highlightPort(node, port, true);highlightEdgesForPort(port, new Set());});const data = [{"id": "1","shape": "er-rect","label": "学生","width": 150,"height": 24,"position": {"x": 24,"y": 150},"ports": [{"id": "1-1","group": "list","attrs": {"portNameLabel": {"text": "ID"},"portTypeLabel": {"text": "STRING"}}},{"id": "1-2","group": "list","attrs": {"portNameLabel": {"text": "Name"},"portTypeLabel": {"text": "STRING"}}},{"id": "1-3","group": "list","attrs": {"portNameLabel": {"text": "Class"},"portTypeLabel": {"text": "NUMBER"}}},{"id": "1-4","group": "list","attrs": {"portNameLabel": {"text": "Gender"},"portTypeLabel": {"text": "BOOLEAN"}}}]},{"id": "2","shape": "er-rect","label": "课程","width": 150,"height": 24,"position": {"x": 250,"y": 210},"ports": [{"id": "2-1","group": "list","attrs": {"portNameLabel": {"text": "ID"},"portTypeLabel": {"text": "STRING"}}},{"id": "2-2","group": "list","attrs": {"portNameLabel": {"text": "Name"},"portTypeLabel": {"text": "STRING"}}},{"id": "2-3","group": "list","attrs": {"portNameLabel": {"text": "StudentID"},"portTypeLabel": {"text": "STRING"}}},{"id": "2-4","group": "list","attrs": {"portNameLabel": {"text": "TeacherID"},"portTypeLabel": {"text": "STRING"}}},{"id": "2-5","group": "list","attrs": {"portNameLabel": {"text": "Description"},"portTypeLabel": {"text": "STRING"}}}]},{"id": "3","shape": "er-rect","label": "老师","width": 150,"height": 24,"position": {"x": 480,"y": 350},"ports": [{"id": "3-1","group": "list","attrs": {"portNameLabel": {"text": "ID"},"portTypeLabel": {"text": "STRING"}}},{"id": "3-2","group": "list","attrs": {"portNameLabel": {"text": "Name"},"portTypeLabel": {"text": "STRING"}}},{"id": "3-3","group": "list","attrs": {"portNameLabel": {"text": "Age"},"portTypeLabel": {"text": "NUMBER"}}}]},{"id": "4","shape": "edge","source": {"cell": "1","port": "1-1"},"target": {"cell": "2","port": "2-4"},"attrs": {"line": {"stroke": "#A2B1C3","strokeWidth": 2}},"zIndex": 0},{"id": "5","shape": "edge","source": {"cell": "2","port": "2-4"},"target": {"cell": "3","port": "3-1"},"attrs": {"line": {"stroke": "#A2B1C3","strokeWidth": 2}},"zIndex": 0},{"id": "6","shape": "edge","source": {"cell": "1","port": "1-2"},"target": {"cell": "2","port": "2-2"},"attrs": {"line": {"stroke": "#A2B1C3","strokeWidth": 2}},"zIndex": 0},]const cells: Cell[] = []data.forEach((item: any) => {if (item.shape === 'edge') {cells.push(graph.createEdge(item))} else {cells.push(graph.createNode(item))}})graph.resetCells(cells)graph.zoomToFit({ padding: 10, maxScale: 1 })})
</script>

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

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

相关文章

Python GNN图神经网络代码实战;GAT代码模版,简单套用,易于修改和提升,图注意力机制代码实战

1.GAT简介 GAT&#xff08;Graph Attention Network&#xff09;模型是一种用于图数据的深度学习模型&#xff0c;由Veličković等人在2018年提出。它通过自适应地在图中计算节点之间的注意力来学习节点之间的关系&#xff0c;并在节点表示中捕捉全局和局部信息。 GAT模型的核…

AI文章互评:得分最高的竟然不是GPT-4!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

实力!云起无垠晋级“第九届安全创客汇”年度10强

2024年5月28日&#xff0c;第九届“安全创客汇”复赛在重庆圆满落幕。在本次国内最具影响力的网络安全创业大赛中&#xff0c;云起无垠凭借其技术的创新性和巨大市场价值&#xff0c;成功跻身年度十强。 随着人工智能技术的不断发展&#xff0c;特别是在大模型技术的推动下&…

【图像处理与机器视觉】XJTU期末考点

题型 选择&#xff1a;1 分10 填空&#xff1a;1 分15 简答题&#xff08;也含有计算和画图&#xff09;&#xff1a;10 分*4 计算题&#xff1a;15 分20 分 考点 选择题&#xff08;部分&#xff09; 数字图像处理基础 p(x,y),q(s,t)两个像素之间的距离由公式&#xff1a…

湖南(品牌调研)源点咨询 企业品牌调研侧重点分析

本文由湖南长沙&#xff08;市场调研&#xff09;源点咨询编辑发布 企业建立品牌&#xff0c;往往都需进行科学性的品牌调研。因为只有这样&#xff0c;才能让企业更好的把握市场的发展趋势&#xff0c;进而为品牌的建立和发展提供更有价值的数据参考&#xff01;那么品牌的调…

AI精选付费资料包【37GB】

课程介绍 一、人工智能论文合集 二、AI必读经典书籍 三、超详细人工智能学习大纲 四、机器学习基础算法教程 五、深度学习神经网络基础教程 六、计算机视觉实战项目 课程获取 资料&#xff1a;AI精选付费资料包&#xff08;37.4GB&#xff09;获取&#xff1a;扫码关注公z号…

esp8266阿里云上线(小程序控制)

此wechatproject已上传在页面最上方 由图可见&#xff0c;项目只有两个页面&#xff0c;一个是获取该产品下的设备信息列表&#xff0c;一个是某设备对应的详情控制页面&#xff0c;由于这个项目只利用esp8266板子上自带的led&#xff0c;功能简单&#xff0c;只需要控制开关即…

Update! 基于RockyLinux9.3离线安装Zabbix6.0

链接&#xff1a; Ansible离线部署 之 Zabbixhttp://mp.weixin.qq.com/s?__bizMzk0NTQ3OTk3MQ&mid2247487434&idx1&sn3128800a0219c5ebc5a3f89d2c8ccf50&chksmc3158786f4620e90afe440bb32fe68541191cebbabc2d2ef196f7300e84cde1e1b57383c521a&scene21#we…

YOLOv9改进策略 | Conv篇 | 利用YOLOv10提出的SCDown魔改YOLOv9进行下采样(附代码 + 结构图 + 添加教程)

一、本文介绍 本文给大家带来的改进机制是利用YOLOv10提出的SCDown魔改YOLOv9进行下采样,其是更高效的下采样。具体而言,其首先利用点卷积调整通道维度,然后利用深度卷积进行空间下采样。这将计算成本减少到和参数数量减少到。同时,这最大限度地保留了下采样过程中的信息,…

创新指南|提高人才回报率的重要举措和指标

员工是组织最大的投资&#xff0c;也是最深层的价值源泉。人才系统必须同时强调生产力和价值创造。让合适的人才担任合适的职位&#xff0c;并为员工提供成功所需的支持和机会&#xff0c;这是实现回报的关键。本文将介绍组织可以采取的五项行动&#xff0c;以最大化企业的人才…

postgresql常用命令#postgresql认证

PostgreSQL 是一个功能强大的开源关系数据库管理系统&#xff0c;提供了一系列命令行工具来管理和操作数据库。以下是一些常用的 PostgreSQL 命令&#xff0c;涵盖数据库和用户管理、数据操作以及查询和维护等方面。 #PostgreSQL培训 #postgresql认证 #postgreSQL考试 #PG考试…

汽车识别项目

窗口设计 这里的代码放在py文件最前面或者最后面都无所谓 # 创建主窗口 window tk.Tk() window.title("图像目标检测系统") window.geometry(1000x650) # 设置窗口大小# 创建背景画布并使用grid布局管理器 canvas_background tk.Canvas(window, width1000, height…

【Hive SQL 每日一题】统计各个商品今年销售额与去年销售额的增长率及排名变化

文章目录 测试数据需求说明需求实现分步解析 测试数据 -- 创建商品表 DROP TABLE IF EXISTS products; CREATE TABLE products (product_id INT,product_name STRING );INSERT INTO products VALUES (1, Product A), (2, Product B), (3, Product C), (4, Product D), (5, Pro…

英码科技推出鸿蒙边缘计算盒子:提升国产化水平,增强AI应用效能,保障数据安全

当前&#xff0c;随着国产化替代趋势的加强&#xff0c;鸿蒙系统Harmony OS也日趋成熟和完善&#xff0c;各行各业都在积极拥抱鸿蒙&#xff1b;那么&#xff0c;边缘计算要加快实现全面国产化&#xff0c;基于鸿蒙系统开发AI应用势在必行。 关于鸿蒙系统及其优势 鸿蒙系统是华…

ROS2从入门到精通4-3:全局路径规划插件开发案例(以A*算法为例)

目录 0 专栏介绍1 路径规划插件的意义2 全局规划插件编写模板2.1 构造规划插件类2.2 注册并导出插件2.3 编译与使用插件 3 全局规划插件开发案例(A*算法)常见问题 0 专栏介绍 本专栏旨在通过对ROS2的系统学习&#xff0c;掌握ROS2底层基本分布式原理&#xff0c;并具有机器人建…

2023-2025年最值得选择的Java毕业设计选题大全:1000个热门选题推荐✅✅✅

&#x1f497;博主介绍&#xff1a;✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还…

冥想第一千一百七十八天

1.周末&#xff0c;早上先骑着电车到绿谷公园拿了姐给的精油&#xff0c;40分钟到家。 2.早上带着媳妇吃了饭&#xff0c;等丈母娘和小侄子。一起去荥泽水乡特别的推荐。感受特别好玩。 3.晚上带着丈母娘和小侄子吃了饭&#xff0c;给送到中原福塔。回来都都12点了。 4.累的&am…

JDK安装目录

1、bin 该路径下存放了各种工具命令&#xff0c;其中比较重要的有&#xff1a;javac和java javac&#xff1a;jdk提供的编译工具&#xff0c;我们可以通过这个工具&#xff0c;把当前路径下的 .java 文件编译成 .class 字节码文件java&#xff1a;jdk提供的一个工具&#xff0…

计算机视觉与模式识别实验1-4 图像的傅立叶变换

文章目录 &#x1f9e1;&#x1f9e1;实验流程&#x1f9e1;&#x1f9e1;1. 傅立叶变换1.a 绘制一个二值图像矩阵,并将其傅立叶函数可视化。1.b 利用傅立叶变换分析两幅图像的相关性&#xff0c;定位图像特征。读入图像‘text.png&#xff0c;抽取其中的字母‘a’ 2. 离散余弦…

2024年5月2日 Go生态洞察:Go 1.22中的安全随机性

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a;…