返回顶部
首页 > 资讯 > 前端开发 > JavaScript >VUE使用canvas绘制管线管廊实现思路
  • 242
分享到

VUE使用canvas绘制管线管廊实现思路

VUE canvas绘制管线管廊VUE canvas绘制 2023-05-18 05:05:35 242人浏览 薄情痞子
摘要

目录正文Vue使用canvas绘制管线实现思路 正文 最近接到公司项目中的一个需求,需要绘制一个展示管线平面图的功能,除了展示以外,还需要进行内容的编辑,UI人员给的最终效果图如下:

正文

最近接到公司项目中的一个需求,需要绘制一个展示管线平面图的功能,除了展示以外,还需要进行内容的编辑,UI人员给的最终效果图如下:

经过分析后,觉得使用canvas,能够将此效果实现。最终将功能拆分为以下三点:

  • canvas 绘制图形并填充
  • canvas 绘制图片
  • canvas 绘制文字

其中,绘制图形并填充对应的为管线,绘制图片对应的为设备图标,绘制文字则对应设备上方的文字描述及其他部分的文字信息,例如:一供、二回等。

因上述功能为项目中的功能的一部分,项目整体由VUE搭建,所以,此功能需要在VUE的项目结构上进行建立。

查阅大量资料及论坛后,没有找到合适的案例,那只能由本人亲自来手搓了,此案例涉及到以下知识点:

  • js的鼠标事件: onmousedown onmousemove onmouseup
  • canvas 坐标轴与浏览器坐标轴的计算
  • canvas 实时绘制
  • canvas 旋转
  • 构造函数的运用

先分享一下最后的成果吧~

因时间及此案例代码量的关系

vue使用canvas绘制管线实现思路

首先,因canvas的绘制离不开JS,但是在vue页面中来书写,又会导致vue页面代码量过多,所以,我单独写了一个js文件,通过 export 进行导出,在vue页面中进行调用,下面来看代码:

index.vue

<template>
    <div class="canvas-container">
        <div class="canvas-icon-content">左侧选项列表</div>
        <div class="canvas-content">
            <div class="canvas" id="canvas">
                <canvas id="myCanvas" ref="myCanvas"></canvas>
            </div>
            <div class="canvas-options">下方操作按钮</div>
        </div>
    </div>
</template>
<script>
import canvas from '../utils/canvas'
let myCanvas = {}
export default {
    name: 'index',
    data() {
        return {}
    },
    mounted() {
        myCanvas = canvas.init('myCanvas')
    },
}
</script>

在 vue 页面中,主要是针对整体界面的搭建,CSS样式进行编写,其中除了界面外,还有 管线设备 信息修改的弹窗界面编写,如下图

针对信息编辑后的 “确定” 及 “取消” 事件,全部通过调用 myCanvas 中的方法来进行。

JS文件

在JS文件中,

首先定义一个 allElementCollection 数组,这个数组最终需要提交给后端,同时,页面中元素的绘制主要来自于这个主要数组。

剩下的就是来添加绘制的工作,以及JS中数据传入vue页面,vue页面的数据,传入JS中。

数据传输这里,我是这样做的,定义了一个对象 canvasDraw ,里面部分方法,如下代码:

const canvasDraw = {
    init(element) {
        canvas = document.getElementById(element)
        ctx = canvas.getContext('2d')
        const w = 1200, h = 800;
        canvas.width = w * devicePixelRatio;
        canvas.height = h * devicePixelRatio;
        canvas.style.width = w + 'px';
        canvas.style.height = h + 'px';
        return canvas
    },
    // 回传鼠标抬起事件
    canvasMouseUp: (e) =&gt; {},
    // 绘制类型切换
    drawTypeChange: (ele) =&gt; {},
    // 修改管线类型(冷热水)
    changePipelineType: (type) =&gt; {},
    // 设备参数修改
    canvasModifyInfo: (info) =&gt; {},
    // 显示设备可拖动的区域范围
    showEquipmentIconArea: ()  =&gt; {},
    commit: () =&gt; {
        // todo
        // 提交事件
    },
    // 清除整个画布
   clearAll: (info) =&gt; {},
    // 数据回显
    echoData: (data) =&gt; {}
}
export default canvasDraw

上述代码中,所有的 canvas 相关的方法,都通过对象 canvasDraw 导出,在vue页面,就可以通过 myCanvas 来进行调用了。

接下来,我们需要一个构造函数,这个函数的作用是,通过构造函数,可以 new 多个对象,每个对象里面有鼠标按下的起点坐标 startXstartY,鼠标抬起的重点坐标 endXendY,以及绘制的类型、绘制不同类型的信息对象、绘制形状的方法、绘制文字的方法、绘制图片的方法:


class ElementFactory {
    constructor(startX, startY, endX, endY) {
        this.startX = startX;  // 鼠标 按下 X点
        this.startY = startY;  // 鼠标 按下 Y点
        this.endX = endX;      // 鼠标 抬起 X点
        this.endY = endY;      // 鼠标 抬起 Y点
        this.type = 0;       // 绘制类型:图形、文字、图片
        this.pipelineInfo = {};  // 图形(管线)私有信息
        this.equipmentInfo = {};  // 图片(设备)私有信息
        this.textInfo = {};      // 文字(文字)私有信息
    }
    get minX() {
        return Math.min(this.startX, this.endX);
    }
    get maxX() {
        return Math.max(this.startX, this.endX);
    }
    get minY() {
        return Math.min(this.startY, this.endY);
    }
    get maxY() {
        return Math.max(this.startY, this.endY);
    }
    get middleX() {
        return this.endX - (this.endX - this.startX) / 2
    }
    get middleY() {
        return this.endY - (this.endY - this.startY) / 2
    }
    // 判断点击的是否存在元素绘制的范围之内
    isInside(x, y) {
        return x &gt;= this.minX &amp;&amp; x &lt;= this.maxX &amp;&amp; y &gt;= this.minY &amp;&amp; y &lt;= this.maxY
    }
    // 绘制管线
    drawPipeline() {}
    // 绘制设备
    drawEquipment() {}
    // 绘制设备上方文字
    drawEquipmentText() {}
    // 绘制纯文本
    drawText() {}
    // 根据条件来调用不同的绘制方法
    drawAllElement() {
        parseInt(this.type) === 0 ? this.drawPipeline() : (parseInt(this.type) === 1 ? this.drawEquipment() : this.drawText())
    }
}

基本的方法已经写完了,那接下来,就剩下一些鼠标的管理事件了。

在函数 canvasMousedown 中,主要处理三件事情:

1、鼠标按下事件;

2、鼠标移动事件;

3、鼠标抬起事件。

鼠标按下的那一刻,有以下几个方面需要注意:

  • 鼠标是左键点击还是右键点击;
  • 当前鼠标点击的位置,即startXstartY
  • 当前鼠标点击的位置是否是存在了已经绘制的内容;

具体代码如下:

const canvasMousedown = (e) =&gt; {
    const rect = canvas.getBoundinGClientRect();
    const clickX = e.clientX - rect.left;
    const clickY = e.clientY - rect.top;
    // 查询所点击元素是否存在
    const shape = getElement(clickX, clickY);
    if (shape) {
        moveAllElement(e, clickX, clickY, rect, shape);
        canvas.style.cursor= "move";
    } else {
        if (e.buttons === 1) {
            draw_element_type === 0 ? drawRealTimePipeline(e, clickX, clickY, rect) : (draw_element_type === 1 ? drawRealTimeEquipment(e, clickX, clickY, rect) : drawRealTimeText(e, clickX, clickY, rect))
        }
    }
};

其中 getElement 方法为:

// 鼠标点击canvas查看是否点击到了已经绘制的路线,若是,则返回相关线的对象,若否,返回null
const getElement = (x, y) =&gt; {
    for (let i = allElementCollection.length - 1; i &gt;= 0; i--) {
        if (element.isInside(x, y)) return element;
    }
    return null
};

鼠标按下后,获取到 clickXclickY,判断当前点击的位置是否已经绘制了元素shape,如果shape存在,执行移动事件,如果不存在,则执行绘制事件。

大致的思路就是上述分享内容,接下来的文章中,我会将具体的方法及注意事项进行细化,

以上就是VUE使用canvas绘制管线管廊实现思路的详细内容,更多关于VUE canvas绘制管线管廊的资料请关注编程网其它相关文章!

--结束END--

本文标题: VUE使用canvas绘制管线管廊实现思路

本文链接: https://lsjlt.com/news/211706.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • VUE使用canvas绘制管线管廊实现思路
    目录正文vue使用canvas绘制管线实现思路 正文 最近接到公司项目中的一个需求,需要绘制一个展示管线平面图的功能,除了展示以外,还需要进行内容的编辑,UI人员给的最终效果图如下:...
    99+
    2023-05-18
    VUE canvas绘制管线管廊 VUE canvas绘制
  • VUE 使用canvas绘制管线管廊示例详解
    目录引言drawRealTimePipeline:绘制实时管线drawRealTimeEquipment:绘制实时设备:drawRealTimeText:绘制实时文本:moveAll...
    99+
    2023-05-18
    VUE canvas绘制管线/管廊 VUE canvas绘制
  • 详解vue各种权限控制与管理的实现思路
    本篇文章给大家带来了关于vue的相关知识,其中主要详细介绍了vue各种权限控制与管理的实现思路,感兴趣的朋友下面一起来看一下吧,希望对大家有帮助。一、 菜单权限菜单权限:控制用户在系统中能够看到哪些菜单项菜单权限指的就是后台系统中的左侧的菜...
    99+
    2023-05-14
    前端 Vue.js Vuex
  • 怎么使用Vue+Echarts实现绘制动态折线图
    今天小编给大家分享一下怎么使用Vue+Echarts实现绘制动态折线图的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1 引入...
    99+
    2023-07-05
  • 怎么使用Vue+Echarts实现基本K线图的绘制
    本篇内容介绍了“怎么使用Vue+Echarts实现基本K线图的绘制”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1 引入Echarts1.1...
    99+
    2023-07-05
  • 如何使用HTML5 Canvas画线技巧来实现绘制一个像素宽的细线
    如何使用HTML5 Canvas画线技巧来实现绘制一个像素宽的细线,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 ...
    99+
    2024-04-02
  • 使用canvas怎么实现橡皮筋式线条绘图应用
    使用canvas怎么实现橡皮筋式线条绘图应用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。什么叫橡皮筋式指画图时橡皮筋一样伸缩自如。。例子如下:point_down:思路思路很...
    99+
    2023-06-09
  • Vue使用sign-canvas实现在线手写签名的实例
    目录更新日志安装全局方式局部方式效果图: sign-canvas 一个基于 canvas 开发,封装于 Vue 组件的通用手写签名板(电子签名板),支持 pc 端和移动端。 更新...
    99+
    2024-04-02
  • Vue怎么使用sign-canvas实现在线手写签名
    这篇文章主要讲解了“Vue怎么使用sign-canvas实现在线手写签名”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue怎么使用sign-canvas实现在线手写签名”吧!效果图:sig...
    99+
    2023-06-30
  • Vue使用openlayers实现绘制圆形和多边形
    目录绘制圆形绘制多边形绘制编辑多边形完成绘制这个地方我就简单点写吧,因为一些东西比较乱,有的包啥的就按照官网API开发文档根据报错提示自己添加就可以了,我这个地方就不重复写了。 绘制...
    99+
    2024-04-02
  • vue使用echarts绘制中国地图的实现代码
    1. 插入echarts 所需模块 import echarts from "echarts"; import 'echarts/map/js/china' // 使用中国地图需...
    99+
    2024-04-02
  • vue中使用pinia全局状态管理的实现
    目录与vuex的区别安装引入pinia创建状态目录pinia模块组成创建pinia模块在组件中使用该状态机pinia模块实例中的api讲解状态持久化与vuex的区别 去除了 muta...
    99+
    2024-04-02
  • 使用vue怎么实现身份认证管理和租户管理功能
    本篇文章为大家展示了使用vue怎么实现身份认证管理和租户管理功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。按钮级权限src\utils\abp.js:export function&n...
    99+
    2023-06-15
  • 怎么在html5中使用canvas 实现光线沿不规则路径运动
    这篇文章将为大家详细讲解有关怎么在html5中使用canvas 实现光线沿不规则路径运动,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。svg让动画沿着不规则路径运动查阅svg文档后发现,sv...
    99+
    2023-06-09
  • 用JavaSpringBoot+Vue+uniapp小程序实现在线房屋装修管理系统
    目录一、前言介绍:1.1 课题背景1.2研究内容:二、主要技术:2.1  Spring Boot框架:2.2 MYSQL数据库:三、系统设计:3.1 系统功能设计...
    99+
    2023-03-23
    SpringBoot房屋管理系统 Vue房屋管理系统 uniapp房屋管理系统 小程序房屋管理系统
  • 怎么使用js+canvas实现可自动吸附闭合的鼠标绘制多边形
    这篇文章主要介绍“怎么使用js+canvas实现可自动吸附闭合的鼠标绘制多边形”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用js+canvas实现可自动吸附闭合的鼠标绘制多边形”文章能帮助大...
    99+
    2023-07-02
  • vue中使用Echarts map图实现下钻至县级的思路详解
    今天给大家分享echarts map地图下钻至县级,因为项目需求需要实现 map 图下钻至县级,也找了很多博客,但是基本都是同一篇博客。 好在最终还是实现了,先上动图: 基本思路都...
    99+
    2024-04-02
  • 如何使用springboot及vue实现垃圾分类管理系统
    本篇内容介绍了“如何使用springboot及vue实现垃圾分类管理系统”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、项目概述1.项目内...
    99+
    2023-07-06
  • 怎么使用Vuex实现Vue后台管理中的角色鉴权
    这篇文章主要介绍“怎么使用Vuex实现Vue后台管理中的角色鉴权”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用Vuex实现Vue后台管理中的角色鉴权”文章能帮助大家解决问题。功能分析在常见管...
    99+
    2023-06-30
  • 如何使用 Python 接口和路径来实现日志记录和管理?
    在软件开发中,日志记录和管理是非常重要的一环。通过记录日志,开发人员可以更好地了解程序在运行时发生了什么,以及如何处理错误和异常。Python是一种广泛使用的编程语言,也有着强大的日志记录和管理功能。本文将介绍如何使用Python接口和路径...
    99+
    2023-10-09
    接口 path 日志
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作