首页 > 其他分享 >使用joinjs绘制流程图(十)-实战-绘制流程图+自定义节点样式(优化)

使用joinjs绘制流程图(十)-实战-绘制流程图+自定义节点样式(优化)

时间:2024-05-16 23:41:17浏览次数:20  
标签:const 流程图 自定义 vertices node1 div node2 绘制 rect

问题

前面自定义节点的样式坐标位置不对,我们希望自定义节点的坐标和rect元素的位置是一样的

效果图

代码

<template>
  <div class="app">
    <div ref="myholder" id="paper"></div>
  </div>
</template>

<script>
import * as joint from '@joint/core'
import $ from 'jquery'
export default {
  data() {
    return {
      graph: null,
      rect_width: 100,
      rect_height: 40,
    }
  },
  mounted() {
    const namespace = joint.shapes
    var graph = new joint.dia.Graph({}, { cellNamespace: namespace })
    this.graph = graph

    var paper = new joint.dia.Paper({
      el: this.$refs.myholder,
      model: this.graph,
      width: 800,
      height: 300,
      cellViewNamespace: namespace,
      drawGrid: true,
      gridSize: 10,
      background: {
        color: 'rgba(0, 255, 0, 0.3)',
      },
      interactive: false,
      clickThreshold: 10,
    })

    this.paper = paper

    const node1 = this.drawRect(
      { x: 50, y: 30 },
      `<div> 
        <span class='right'>10</span> | 
        <span class='error'>20</span>
        <div class='desc'>正确数|错误数</div>
      </div>`
    )
    const node2 = this.drawRect({ x: 200, y: 30 }, '节点2')
    const node3 = this.drawRect({ x: 350, y: 30 }, '节点3')
    const node4 = this.drawRect({ x: 500, y: 30 }, '节点4')
    const node5 = this.drawRect({ x: 200, y: 100 }, '节点5')
    const node6 = this.drawRect({ x: 350, y: 100 }, '节点6')
    const node7 = this.drawRect({ x: 350, y: 150 }, '节点7')
    const node8 = this.drawRect({ x: 500, y: 150 }, '节点8')
    const node9 = this.drawRect({ x: 500, y: 200 }, '节点9')

    this.drawLine(node1, node2)
    this.drawLine(node2, node3)
    this.drawLine(node3, node4)
    this.drawLine(node1, node5)
    this.drawLine(node2, node6)
    this.drawLine(node2, node7)
    this.drawLine(node7, node8)
    this.drawLine(node7, node9)
  },
  methods: {
    drawRect({ x, y }, text) {
      var rect = new joint.shapes.standard.Rectangle()
      rect.position(x, y)
      rect.resize(this.rect_width, this.rect_height)
      rect.attr({
        // body选择器修改的是 svg元素  [selector for the <rect> SVGElement]
        body: {
          fill: '#2c3e50',
          // strokeWidth: 0,
          // strokeDasharray: '10,2',
          // fill: 'transparent',
          stroke: 'transparent',
        },

        // label选择器修改的是 text元素  [selector for the <text> SVGElement]
        label: {
          // text,
          text: '',
          fill: '#3498DB',
          fontSize: 18,
          fontWeight: 'bold',
          fontVariant: 'Microsoft YaHei',
        },
      })
      rect.addTo(this.graph)

      this.transformHtml(rect, text)
      return rect
    },
    drawLine(node1, node2, vertices) {
      const source_x = node1.attributes.position.x + this.rect_width + 1
      const source_y = node1.attributes.position.y + this.rect_height / 2
      const target_x = node2.attributes.position.x - 1
      const target_y = node2.attributes.position.y + this.rect_height / 2
      const source = {
        x: source_x,
        y: source_y,
      }
      const target = {
        x: target_x,
        y: target_y,
      }
      var link = new joint.shapes.standard.Link({
        source,
        target,
        router: null, // 不使用任何自动路由器
        connector: null,
        // connector: {
        //   name: 'jumpover',
        //   args: {
        //     size: 0.1,
        //   },
        // },
        attrs: {
          line: {
            stroke: 'gray',
          },
        },
      })

      // TODO:判断两点是否在同一直线,如果不是的话,动态计算转折点  --->这里按我们设计的去画
      // if (vertices && vertices.length) {
      //   link.vertices(vertices)
      // }
      if (source.y != target.y) {
        const vertices = this.calcVertices(source, target)
        link.vertices(vertices)
      }

      link.addTo(this.graph)
    },
    transformHtml(element, text) {
      var div = document.createElement('div')
      div.style.position = 'absolute'
      // div.style.background = 'red'
      // NOTE:取rect元素的坐标点
      const { x, y } = element.attributes.position
      div.style.left = x + 'px'
      div.style.top = y + 'px'
      div.style.width = this.rect_width + 'px'
      div.style.height = this.rect_height + 'px'
      div.innerHTML = text
      $(div).click(function () {
        console.log(this)
      })
      this.paper.el.appendChild(div)
    },
    calcVertices(node1, node2) {
      const vertices = []
      vertices.push(node1)

      const center_top_x = (node2.x - node1.x) / 2 + node1.x
      const center_top_y = node1.y
      const center_bottom_x = center_top_x
      const center_bottom_y = node2.y
      vertices.push({
        x: center_top_x,
        y: center_top_y,
      })
      vertices.push({
        x: center_bottom_x,
        y: center_bottom_y,
      })
      vertices.push(node2)
      return vertices
    },
  },
}
</script>

<style lang="less" scoped>
#paper {
  position: relative;
  border: 1px solid;
}

/deep/.right {
  color: green;
  font-weight: 700;
}

/deep/.error {
  color: red;
  font-weight: 700;
}
/deep/.desc {
  color: orange;
  font-size: 13px;
}
</style>

标签:const,流程图,自定义,vertices,node1,div,node2,绘制,rect
From: https://www.cnblogs.com/it774274680/p/18197002

相关文章

  • Django 自定义管理命令:从入门到高级
    title:Django自定义管理命令:从入门到高级date:2024/5/1618:34:29updated:2024/5/1618:34:29categories:后端开发tags:Django自定义命令入门教程高级技巧命令创建命令使用自定义管理第1章简介1.1 Django管理命令简介Django是一个流行的Python......
  • POI 重叠、并列柱状图(条形图),显示数据,自定义颜色
    1、pom.xml<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifac......
  • ansible自定义模板部署apache服务
    使用Ansible来部署Apache服务是一个很好的选择,因为它可以自动化部署过程,确保所有的服务器上都有相同的配置。以下是一个简单的步骤指南,展示如何使用Ansible来部署Apache服务:1创建角色目录首先,在/etc/ansible/roles下创建apache目录:mkdir-p/etc/ansible/roles/apache2......
  • C++:自定义异常
    #include<iostream>#include<stdexcept>//自定义异常类classMyException:publicstd::exception{public://重写what()函数以提供异常的描述,const表示函数不会改变类的成员变量,noexcept表示不会抛出异常constchar*what()constnoexceptoverride{......
  • 绘制贝塞而曲线
    辅助函数privatePenredPen=newPen(Color.Red,2);publicstaticPointFMulti(Pointp,floatfac){varpf=newPointF();pf.X=p.X*fac;pf.Y=p.Y*fac;returnpf;......
  • 使用joinjs绘制流程图(九)-实战-绘制流程图+节点路径自定义升级版
    效果图自定义路径设计本示例假设当前节点和其他节点不在同一纵坐标的情况下代码<template><divclass="app"><divref="myholder"id="paper"></div></div></template><script>import*asjointfrom'@joint/......
  • OpenPCDet训练自定义数据
    官网也提供了步骤,这里详细介绍下训练自己数据的过程以及中间遇到的一些问题。训练模型这里采用PointRCNN,具体的介绍参考:https://www.cnblogs.com/xiaxuexiaoab/p/18033887一、准备数据集数据集这一块我们需要准备好原始点云数据、物体目标标注文件、以及训练和验证对应的索引号,......
  • MindSponge分子动力学模拟——自定义控制器(2024.05)
    技术背景分子动力学模拟中的控制器(Controller)可以被用于修改模拟过程中的原子坐标和原子速度等参量,从而达到控制系统特定参量的目的。例如控温器可以用于实现NVT系综,控压器可用于实现NPT系综。而在MindSponge分子动力学模拟框架下,控温控压都可以基于控制器Controller来实现。关于......
  • fiddler自定义规则
     请求前拦截某个请求staticfunctionOnBeforeRequest(oSession:Session){if(oSession.url.indexOf("initialCid=")>-1&&oSession.url.indexOf("dm=cd")>-1){oSession.oRequest.FailSession(666,"Blocked",&......
  • 【django学习-24】自定义插件
    1.ModelForm可以帮助我们生成HTML标签,这种是普通的标签classUserModelForm(forms.ModelForm):classMeta:model=models.UserInfofields=["name","password",]form=UserModelForm()2.如果我们要使用bootstrap的标签,该怎么操作呢?2.1:自定义......