【数据流图】用JointJs实现数据流图(二)

一、流图如何绑定绘制的元素?

通过打印JointJs生成的属性可知,id是不允许被覆盖修改的,但是cid可以。所以通过绑定元素的cid,可实现后续的操作,如查找元素、更改元素属性等。

1. 绑定cid方式示例

let textEle = new joint.shapes.standard.TextBlock();
textEle.attributes.attrs.label = {
   text: '例子',
};
textEle.attr('label/text', '例子');
textEle.resize(10, 10);
textEle.position(0, 0);
// 绑定cid
textEle.cid = cid;
textEle.addTo(this.graph);

2. 根据cid查找画布上的元素

let findEleByCid(cid){
    // 获取所有元素
    let eleList = this.graph.getElements();
    // 返回cid匹配上的元素
    return eleList.find((ele) => ele.cid === cid);
}

3. 改变属性,以改变文本内容为例

// 将textEle这个文本框元素的内容改为123
textEle.attr('label/text', '123');

二、流图中绘制使用的JointJs的API及函数封装

1. 绘制文本框

  • 使用API:shapes.standard.TextBlock
  • 常用属性
    • attributes.attrs.label.text:文本内容
    • attributes.attrs.label.style:文本样式,与css保持一致
    • attr(‘label/text’, text):标签内容
    • attr(‘body/stroke’, ‘none’):文本框的外边框
    • resize(width,height):文本框尺寸
    • position(x,y):文本框位置
  • 绘制文本框函数示例
 drawText(text, position, size, textStyle) {
    let textEle = new joint.shapes.standard.TextBlock();
    textEle.attributes.attrs.label = {
      text: text,
      style: textStyle
    };
    textEle.attr('label/text', text);
    textEle.attr('body/stroke', 'none');
    textEle.resize(size[0], size[1]);
    textEle.position(position[0], position[1]);
    textEle.addTo(this.graph);
}

2. 绘制图片

  • 使用API:shapes.standard.Image
  • 常用属性
    • attr(‘image/xlinkHref’, imgSrc):指定图片地址
    • resize(width,height):图片尺寸
    • position(x,y):图片位置
  • 绘制图片函数示例
drawImg(imgSrc, position, size) {
    let ele = new joint.shapes.standard.Image();
    ele.attr('image/xlinkHref', imgSrc);
    ele.position(position[0], position[1]);
    ele.resize(size[0], size[1])
    ele.addTo(this.graph);
},

3. 绘制线条

  • 使用API:shapes.standard.Link&dia.Link&dia.LinkView
  • 常用属性
    • attr(‘line/stroke’, ‘#FF620C’):连线颜色
    • attr(‘line/strokeWidth’, 1.5):连线宽度
    • .connector(‘curve’, {}):贝塞尔三次曲线

贝塞尔三次曲线计算较为复杂,若不指定,按官方默认的来绘制,会呈现s型曲线

  • 绘制线条函数示例
// linkInfo:连线信息
// color:圆点颜色
// sourceDirection:连线起点位置
// targetDirection:连线终点位置
drawLink(linkInfo, color, sourceDirection, targetDirection) {
      let link = new joint.shapes.standard.Link(linkInfo);
      link.attr('line/stroke', '#FF620C');
      link.attr('line/strokeWidth', 1.5);
      link.attr({
        line: {
          targetMarker: {
            type: 'path',
            'stroke-width': 1,
            fill: '#FF620C',
            d: 'M 8 -4 0 0 8 4 Z'
          }
        }
      });
      let paperLink = new joint.dia.Link(linkInfo);
      paperLink.attr({
        '.connection': { stroke: 'none' }
      });
      if (sourceDirection && targetDirection) {
        link.connector('curve', {
          sourceDirection: sourceDirection,
          targetDirection: targetDirection,
          distanceCoefficient: 0.4
        });
        paperLink.connector('curve', {
          sourceDirection: sourceDirection,
          targetDirection: targetDirection,
          distanceCoefficient: 0.4
        });
      } else {
        link.connector('curve', {
          distanceCoefficient: 0.4
        });
        paperLink.connector('curve', {
          distanceCoefficient: 0.4
        });
      }
      paperLink.addTo(this.graph);
      let vCircle = V('circle', {
        r: 5,
        fill: color
      });
      let paperLinkView = paperLink.findView(this.paper);
      paperLinkView.sendToken(vCircle, 4000);
      this.dataInterval = setInterval(() => {
        paperLinkView.sendToken(vCircle, 4000);
      }, 5000);
      link.addTo(this.graph);
    },

三、流图中绘制使用JointJs的方法总结

1. 触摸连线事件(link:mouseover)

this.paper.on('link:mouseover', (cell) => {
    // cell即为鼠标悬停的连线元素
});

2. 移出连线事件(link:mouseleave)

this.paper.on('link:mouseleave', () => {
   // cell即为鼠标离开的连线元素
});

3. 触摸元素事件(element:mouseover)

this.paper.on('element:mouseover', (cell) => {
   // cell即为鼠标悬停的元素
});

4. 移出元素事件(element:mouseleave)

this.paper.on('element:mouseleave', (cell) => {
   // cell即为鼠标移出的元素  
});

5. 鼠标点击元素事件(element:pointerclick)

this.paper.on('element:pointerclick', (cell) => {
   // cell即为鼠标点击的元素  
});

6. 获取所有画布上的元素(getElements)

// eleList即为画布上的元素
let eleList = this.graph.getElements();

7. 获取所有画布上的连线

// links即为画布上的连线
let links = this.graph.getLinks();

8. 移除画布上的元素(removeCells)

// cells为要移除的元素的数组
this.graph.removeCells(cells);

9. 画布自适应(paper.scale)

resizeCanvas() {
  let paperWidth = window.innerWidth;
  // 示例为1250,可自行更改
  if (paperWidth > 1250) {
      let scale = paperWidth / 1250;
      this.paper.scale(scale, scale);
      // this.$refs.canvas为vue获取canvas元素的方式
      if (this.$refs.canvas) {
        this.$refs.canvas.style.width = `${800 * scale}px`;
        this.$refs.canvas.style.height = `${520 * scale}px`;
      }
  }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关联系统-整车控制器VCU

整车驱动原理 如上图所示,电池组输出直流电给DC/AC逆变器,逆变器将直流电转化为交流电输入给电机,电机在电磁力的作用下转动,通过传动机构将驱动力输送到车轮,其中整车控制器VCU可以根据用户油门/刹车的输入控制输出功…

国际化业务、全球化团队沟通难?浅析跨文化沟通的挑战和应对措施

在全球化背景下,发展出海业务相比以往更具有巨大的前景和潜力,是企业寻找“第二增长点”和提升综合实力的优先选择。近几年“中企出海”大热,中国企业在世界各地开展业务拓展国际市场,获得更加国际化的营商经验与客户资源。与此同…

【数据结构】单链表和双链表

文章目录 一、链表的概念及结构二、链表的分类三、无头单向非循环链表1.单链表创建2.尾插和头插3.尾删和头删4.打印5.查找6.插入7.删除8.销毁 四、带头双向循环链表1.双链表的创建2.初始化3.判断链表是否为空4.尾插和头插5.尾删和头删6.查找7.插入8.删除9.销毁 五、总结链表和顺…

《窄门》安德烈·纪德

究竟会不会有这样一种爱情,即使毫无希望,一个人也可以将它长久地保持在心中;即使生活每天吹它,也始终无法把它吹灭……? 在《窄门》中,纪德将爱情中的神秘主义体验推向极致,为我们讲述了一段纯…

C语言(指针)3

Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,关注收藏,欢迎欢迎~~ 💥个人主页:小羊在奋斗 💥所属专栏:C语言 本系列文章为个人学习笔记&#x…

YOLOv9改进策略 | 添加注意力篇 | 利用YOLO-Face提出的SEAM注意力机制优化物体遮挡检测(附代码 + 修改教程)

一、本文介绍 本文给大家带来的改进机制是由YOLO-Face提出能够改善物体遮挡检测的注意力机制SEAM,SEAM(Spatially Enhanced Attention Module)注意力网络模块旨在补偿被遮挡面部的响应损失,通过增强未遮挡面部的响应来实现这一目…

链表第4/9题--翻转链表--双指针法

LeetCode206:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2: 输入:head [1,2] 输出:[2,1]示例…

鸿蒙OpenHarmony开发板解析:【特性配置规则】

特性 特性配置规则 下面介绍feature的声明、定义以及使用方法。 feature的声明 开发前请熟悉鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 在部件的bundle.json文件中通过feature_list来声明部件的feature列…

生信技能45 - 基于docker容器运行生信软件

1. 获取docker镜像 以运行xhmm CNV分析软件为例。 # 搜索仓库镜像 sudo docker search xhmm# 拉取镜像 sudo docker pull ksarathbabu/xhmm_v1.0# 启动镜像,非后台 sudo docker run -it ksarathbabu/xhmm_v1.0 /bin/bash # -i: 交互式操作。 # -t: 终端。 # ksarathbabu/xhmm…

爆爽,英语小白怒刷 50 课!像玩游戏一样学习英语~

重点!!!(先看这) 清楚自己学英语的目的, 先搞清楚目标,再行动自身现在最需要的东西:词汇量?口语?还是阅读能力?找对应的书籍,学习资料往兴趣靠拢:网上有大量的推荐美剧学习、小说学习,不要被他…

机器学习算法应用——K近邻分类器(KNN)

K近邻分类器(KNN)(4-2) K近邻分类器(K-Nearest Neighbor,简称KNN)是一种基本的机器学习分类算法。它的工作原理是:在特征空间中,如果一个样本在特征空间中的K个最相邻的样…

【一刷《剑指Offer》】面试题 17:合并两个排序的链表

力扣对应题目链接:21. 合并两个有序链表 - 力扣(LeetCode) 核心考点:链表合并。 一、《剑指Offer》内容 二、分析题目 这道题的解题思路有很多: 可以一个一个节点的归并。可以采用递归完成。 三、代码 1、易于理解的…

Linux-基础命令第三天

1、命令:wc 作用:统计行数、单词数、字符数 格式:wc 选项 文件名 例: 统计文件中的行数、单词数、字符数 说明:59代表行数,111代表单词数,2713代表字符数,a.txt代表文件名 选项…

c语言查找字符串中指定字符串的个数

目录 一、测试思路二、方式1三、方式2 一、测试思路 使用C语言来查找一个字符串中指定数量的子字符串&#xff0c;使用 strncmp 函数或者 memcmp 函数&#xff0c;遍历主字符串并计数子字符串出现的次数。或者使用 strstr 函数&#xff0c; strstr 函数是 C 语言标准库 <str…

Java 集合-List

集合主要分为两组(单列集合, 双列集合) Connection 接口有两个重要的子接口LIst 和 Set, 它们的实现子类都是单列集合, Map 接口的实现子类是双列集合, 存放的是 K-V Connection 接口 Collection 接口和常用方法 下面以 ArrayList 演示一下 add: 添加单个元素remove: 删除指…

基于GIS地理技术+智慧巡检解决方案(Word原件)

传统的巡检采取人工记录的方式&#xff0c;该工作模式在生产中存在很大弊端&#xff0c;可能造成巡检不到位、操作失误、观察不仔细、历史问题难以追溯等现象&#xff0c;使得巡检数据不准确&#xff0c;设备故障隐患得不到及时发现和处理。因此建立一套完善的巡检管理系统是企…

【C语言】——联合体与枚举

【C语言】——联合体与枚举 一、联合体1.1、联合体类型的声明1.2、联合体的特点1.3、相同成员的结构体和联合体对比1.4、联合体的大小计算1.5、联合体的应用举例 二、枚举2.1、枚举类型的声明2.2、枚举类型的优点 一、联合体 1.1、联合体类型的声明 联合体也叫做共用体   与…

TLF35584 Windows Watchdog

1、相关寄存器 1&#xff09;WWDCFG0 - Protected Window watchdog configuration request 0 *R2 offset Address&#xff1a;09H&#xff1b;Reset Value&#xff1a;06H&#xff1b; 窗口看门狗关窗口的周期默认值&#xff1a;350wd cycles 350ms。 2&#xff09;WWDCFG1…

国产银河麒麟V10SP1系统下搭建TiDB数据库操作步骤图文

开发目的&#xff1a;在国产银河麒麟系统中搭建TiDB数据库运行环境。 开发工具&#xff1a;银河麒麟系统V10SP1TiDBMySql数据库8.0。 具体步骤&#xff1a; 1、在VmWare虚拟机中安装好国产银河麒麟V10Sp1操作系统。 2、打开终端命令&#xff0c;安装TiDB相关软件&#xff1…

调试记录 CPU PCIE 找不到设备,AC 耦合电容的问题

1. 问题 现象&#xff1a; 1. 国产CPU的主板&#xff0c;主板内的PCIE 设备找的到&#xff0c;但是另一块板子上连接的PCIE 设备找不到。 2. 排查问题在哪里的计划 1. 检查原理图先排除信号定义的问题&#xff0c; TXRX是否反接。 2. 示波器检查PCIE 的时钟频率是否正确。 3. …