VUE3 中导入Visio 图形

        微软的Visio是一个功能强大的图形设计工具,它能够绘制流程图,P&ID,UML 类图等工程设计中常用的图形。它要比其它图形设计软件要简单许多。以后我的博文中将更多地使用VISO 来绘制图形。之前我一直使用的是corelDraw。

        Visio 已经在工程设计中得到广泛的应用。

本博客讨论如何将Visio 设计的SVG 导入webHMI。

目的与方法

        我的目标是使用Visio 绘制石化行业的工艺和仪表流程图(P&ID ),并将它导入VUE3 的前端显示出来。

  •   直接导入Web 不做任何的修改和添加
  •   图形要能够携带一些数据属性
  •   能够与后端的OPC UA 模型相对应
  • 实现图形可点击

之前我曾经使用其它的方式:

  • 使用autoCAD 绘制,输出DXF
  • 使用corelDaw ,Inkscape 等软件绘制,然后人工添加内置的javascript小程序
  • 使用javascript 的widget  canvas 绘制
  • 使用SVG和svidget 插件实现。

         在我过往的博文中可以找到我的实验,这些方法或多或少需要额外的编程,或者格式转换。这次我们尝试直接导入Visio 产生的SVG 图形。

实现 

简单的P&ID 图

使用Visio 就不多说了,我画了一个简单的P&ID图。

Visio 图形添加数据属性

        图形中需要包含一些数据,最常见的需要一个DataTag 能够将图形与后端数据相对应,我这里使用OPCUA 作为后端信息模型,所以,至少我们需要OPCUA 节点的基本信息:

  • NodeId
  • BrowseName
  • DisplayName
  • NodeType

        值得庆幸的是Visio 图形支持添加数据属性,它们成为形状数据,添加的具体方式是右键点击图形,选择”数据“=》”定义形状数据“

你可以点击新建,添加新的属性,在上图中,我们添加了NodeId 。

当从Visio 导出SVG 文件时,形状数据会作为专用属性(v:custProps)

<g id="group1-1" transform="translate(100.535,-89.6214)" v:mID="1" v:groupContext="group" v:layerMember="0"><v:custProps><v:cp v:nameU="Description" v:lbl="说明" v:type="0" v:sortKey="0" v:langID="2052"/><v:cp v:nameU="Material" v:lbl="材料" v:type="0" v:sortKey="1" v:langID="2052"/><v:cp v:nameU="Manufacturer" v:lbl="制造商" v:type="0" v:sortKey="2" v:langID="2052"/><v:cp v:nameU="Model" v:lbl="型号" v:type="0" v:sortKey="3" v:langID="2052"/><v:cp v:nameU="NodeId" v:lbl="NodeId" v:type="0" v:langID="2052" v:val="VT4(5401)"/></v:custProps>

在前端载入时,我们要读取NodeId 的值,将它填写到<g> 的onclick 参数中 (见下面的源代码)

SVG 嵌入到HTML 中

SVG 嵌入到HTML 网页中有许多的方法,之前我使用嵌入在<object> 中。

使用<object>
<objectid="svg-object"type="image/svg+xml"data="motor.svg"width="300"height="300"></object>

      作为HMI,SVG 图形中的每一个图形都是可以点击的(Click able),这需要在导入HTML 时添加到<g> 中,但是我发现,在<object> 内部的SVG 添加了onclick 之后,无法方位VUE3 中的OnClick 函数,即便增加了Window.οnclick=this.Click 也不行。<object>内部无法调用外部函数。

使用vite-svg-loader插件

第二种方式是使用vite-svg-loader插件,

<script setup>
import { onUpdated } from "vue";
import pid from "@/assets/pid.svg?component";
</script>
<template><div class="container"><h1 class="text-info">系统视图</h1>
<pid />
</template>

结果发现也不行。vite-svg-loader 只是装入了图形,将数据的内容都阉割掉了。

可行的方式-直接导入SVG到HTML

经过不断的尝试,采用了如下可行的方式:

将SVG 直接作为字符串插入到<div> 中去。读取SVG 的方式可以为两种:

  • 通过axios 从后端读取
  • 通过import pid from ”@/assets/pid.svg@raw"
最终的代码
<script setup>
import { onUpdated, onMounted } from "vue";
import Steam from "@/assets/demoA.svg?raw";
import $ from "jquery";
onMounted(() => {document.getElementById("svg-object").innerHTML = Steam;window.onClick = onClick;BrowseData();
});function BrowseData() {let groups = [];$("g").each(function () {let id = $(this).attr("id");var NodeId = null;$(this).find("v\\:cp").each(function () {let attributes = $(this)[0].attributes;if (attributes["v:lbl"].nodeValue == "NodeId") {if (id) {let regex = /\((.+?)\)/g;let str = attributes["v:val"].nodeValue;NodeId = str.match(regex)[0];console.log(id + NodeId);}}});if (NodeId) $(this).attr("onclick", "onClick('" + NodeId + "')");});
}
function onClick(id) {alert(id + " Clicked");
}
</script><template><div class="container"><h1 class="text-info">系统视图</h1><div id="svg-object"></div></div>
</template>
<style scoped>
</style>

小结

        在自动化系统中,HMI 逐步转向HTML5。但是这是标准化不够的部分,如何将HTML 的UI 与后台的信息模型建立对应关系,是值得探讨的。这里我们尝试了Visio 图形与前端HTML5 UI,后端OPCUA 信息模型建立简单,清晰的对应方式。尽管没有使用DEXPI 标准,但是SVG 似乎更加便捷。 

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

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

相关文章

grid新建主从一对多

目录 总结一、步骤前端1.第一步-编写tabs的modelBody2.第二步编辑表扩展js 后端--重写表的add和Update方法1.第一步 总结 编写tabs的modelBody后编辑表扩展js在重写后端partial的Service 一、步骤 前端 1.第一步-编写tabs的modelBody 复制下面代码该改的改 <template&…

猫头虎分享: All in AI时代来临,作为程序员我们应该做些什么?

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

Vue3自定义全局指令批量注册

指令封装代码&#xff1a; import type { App } from "vue";const content {mounted(el : any, binding : any) {console.dir(binding.value);el.remove();} };const operate {mounted(el : any, binding : any) {console.dir(binding.value);el.remove();} };cons…

centos服务器使用1PANEL安装部署Halo

接上文&#xff0c;我们购买好了服务器并登录成功后。就可以进行建站操作啦。博主这里主要是想试一下Halo的搭建。 上期文章&#xff1a; 前端仔浅浅复习一下服务器的购买与使用 Halo是类似于WordPress的CMS博客内容系统&#xff0c;不过Halo是国内开源的&#xff0c;技术和界…

冒泡排序及其优化

冒泡排序 int[] arr {1,3,2,9,4,7,2,8};//比较多少轮(n个数字比较n-1次)for(int i0,n arr.length;i<n-1;i) {//每轮比较多少次(n-1-i次)for(int j 0;j<n-1-i;j) {//两两比较if(arr[j] > arr[j1]) { //比较结果为升序排列&#xff0c;如果想要降序排列结果将 >…

shell运行原理

前言 前一段时间由于身体的缘故和一些琐事&#xff0c;好久没有更新Linux的博文了。从本篇博文开始会接着以前的内容一直持续更新&#xff01; 本期类容介绍 为什么存在shell外壳&#xff1f; 什么是shell外壳&#xff1f; shell外壳是如何工作的&#xff1f; 一、为什么存在…

【办公类-16-07-03】“2023下学期 周计划-户外游戏 每班1周五天相同场地,6周一次循环、有场地、贴墙版”(python 排班表系列)

作品展示——有场地说明 背景需求&#xff1a; 前期做了一份“贴周计划”用的班主任版的户外游戏安排表&#xff08;中X班19周&#xff0c;没有场地&#xff09; 【办公类-16-07-02】“2023下学期 周计划-户外游戏 每班1周五天相同场地&#xff0c;6周一次循环”&#xff08;…

认识TypeScript 中的接口和类

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 接口 类 江城开朗的豌豆 在 TypeScript 中&…

企业办公终端文件数据\资料防泄密管理系统——天锐绿盾 | 防泄密软件——自动智能透明加密保护核心数据资料,防止外泄

其“数据防泄密系统”是一套从源头上保障数据安全和使用安全的加密软件系统&#xff0c;已全面覆盖Linux、Mac、Windows系统&#xff0c;可进行各类型文档加密、音视频加密、源码加密、Cad图纸加密、多种类型设计稿源文件加密。 PC端&#xff1a;https://isite.baidu.com/site/…

移动通信相关知识学习笔记

一、移动通信架构简图 移动无线的接入网是专指各种基站设备。核心网就是各种交换机。 二、无线信号基本原理 无线网络中&#xff0c;使用AP设备和天线来实现有线和无线信号互相转换。如上图所示&#xff0c;有线网络侧的数据从AP设备的有线接口进入AP后&#xff0c;经AP处理为…

Maxwell - 增量数据同步工具

前言 今天来学习一个新的大数据小工具 Maxwell &#xff0c;它和 Sqoop 很像。Sqoop主要用于在 Hadoop &#xff08;比如 HDFS、Hive、HBase 等&#xff09;和关系型数据库之间进行数据的批量导入和导出&#xff0c;而 Maxwell 则主要用于监控数据库的变化&#xff08;通过监控…

基于MATLAB的QPSK调制解调仿真(仿真图超多,结果超清晰)

基于MATLAB的QPSK调制解调仿真(包含中间各个环节的时域波形、功率谱、频谱图、星座图和眼图、理论与仿真的误码率曲线) 目录 前言 一、QPSK调制解调过程 二、仿真结果 Ⅰ、码元信噪比eb/n010dB时 1、双极性不归零基带信号 2、成型滤波(根升余弦滤波)后 3、调制后 4、加入…

Linux CentOS stream 9 firewalld

随着互联网行业快速发展&#xff0c;服务器成为用户部署网络业务重要的网络工具&#xff0c;但随之而来的就是更密集的网络攻击&#xff0c;这给网站带来了很大的阻碍。防火墙作为保障网络安全的主要设备&#xff0c;可以很好的抵御网络攻击。 防火墙基本上使用硬件和软件两种…

深度学习(16)--基于经典网络架构resnet训练图像分类模型

目录 一.项目介绍 二.项目流程详解 2.1.引入所需的工具包 2.2.数据读取和预处理 2.3.加载resnet152模型 2.4.初始化模型 2.5.设置需要更新的参数 2.6.训练模块设置 2.7.再次训练所有层 2.8.测试网络效果 三.完整代码 一.项目介绍 使用PyTorch工具包调用经典网络架构…

PCIe学习笔记(2)错误处理和AER/DPC功能

文章目录 PCIe ErrorAER (Advanced Error Reporting)DPC (Downstream Port Containment) 处理器上错误通常可分为detected和undetected error。Undetected errors可能变得良性(benign)&#xff0c;也可能导致系统故障如silent data corruptions (SDC)。Detected errors则又可分…

MySQL基础学习

MySQL基础 注意&#xff1a;本文的图片截图自尚硅谷MySQL笔记。 一&#xff1a;基本概述&#xff1a; 什么是数据库&#xff1a; 数据库是一种用来存储和管理数据的系统。它是一个组织化的数据集合&#xff0c;可以通过计算机系统进行访问、管理和更新。数据库可以存储各种…

如何使用CloakQuest3r获取受安全服务保护的网站真实IP地址

关于CloakQuest3r CloakQuest3r是一款功能强大的纯Python工具&#xff0c;该工具可以帮助广大研究人员获取和查看受Cloudflare和其他安全服务商保护的网站真实IP地址。 Cloudflare是一种广泛采用的网络安全和性能增强服务&#xff0c;而CloakQuest3r的核心任务就是准确识别隐…

怎么在抖音带自己的货?带货方式和带货要求,如下所示

我是王路飞。 不管你是无货源的新手小白&#xff0c;还是有货源的厂家/供应链&#xff0c;想在抖音卖货的话&#xff0c;无非就两种方式&#xff1a;要么开店、要么开直播带货。 看似都是在抖音卖货&#xff0c;但其实这是两条不同的赛道。 这篇文章就给你们聊下想在抖音卖货…

【Redis】理论进阶篇------Redis的持久化

一、前言 前面学习了Redis的相关的十大数据类型以及用SpringBoot集成我们的Redis的工具代码的书写。从这篇文章开始&#xff0c;就会从Redis相关的一些理论&#xff08;也是面试和工作的热点知识&#xff09;如&#xff1a;Redis的持久化、Redis的订阅发布模型、Redis集群环境搭…

用python绘制黄金价格变化曲线

首先你得从mt4把数据导出为csv&#xff1a;mt4如何导出数据-CSDN博客 1、引入必要的库 import numpy as np import pandas as pd import matplotlib.pyplot as plt 2、然后通过pandas载入csv数据 raw pd.read_csv("XAUUSDm1.csv", headerNone, index_colNone, p…