VUE3 中导入Visio 图形

news2024/11/24 10:42:09

        微软的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>
<object
      id="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.coloradmin.cn/o/1457530.html

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

相关文章

新增长100人研讨会:快消零售专场探讨招商加盟数字化转型实战

2024年2月2日下午&#xff0c;一场由纷享销客与杨国福集团联合主办的招商加盟数字化转型研讨会在上海成功举办。本次研讨会汇聚了众多快消零售业界的领军人物&#xff0c;共同探讨行业未来的新增长点。 会议伊始&#xff0c;杨国福集团数字化中心负责人王林林发表了主题演讲&a…

php伪协议之phar

一.phar协议 用于将多个 PHP 文件、类、库、资源&#xff08;如图像、样式表&#xff09;等打包成一个单独的文件。这个归档文件可以像其他 PHP 文件一样被包含&#xff08;include&#xff09;或执行。PHAR 归档提供了一种方便的方式来分发和安装 PHP 应用程序和库&#xff0c…

【unity实战】使用unity制作一个类似Rust的3D生存建造建筑系统(附项目源码)

配置连接点 材质 连接器控制 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Connector : MonoBehaviour {[Header("连接器位置")]public ConnectorPosition connectorPosition;[Header("连接器所属建筑类型&qu…

以太坊 Dencun 升级与潜在机会

撰文&#xff1a;Biteye 核心贡献者 Fishery Isla 文章来源Techub News专栏作者&#xff0c;搜Tehub News下载查看更多Web3资讯。 以太坊网络升级 Dencun 测试网版本在 2024 年 1 月 17 日上线了 Goerli 测试网&#xff0c;1 月 30 日成功上线了 Sepolia 测试网&#xff0c;D…

RocketMQ—RocketMQ消息重复消费问题

RocketMQ—RocketMQ消息重复消费问题 重复消费问题的描述 什么情况下会发生重复消费的问题&#xff1a; 生产者多次投递消息&#xff1a;如果生产者发送消息时&#xff0c;连接有延迟&#xff0c;MQ还没收到消息&#xff0c;生产者又发送了一次消息&#xff1b; 消费者方扩容…

两步为软件设置开机自启动(Windows)

两步为软件设置开机自启动&#xff08;Windows&#xff09; 有些软件本身没有开机自启动的设置&#xff0c;以下是两种解决的方式&#xff0c;在这里主要介绍第二种&#xff08;更简单更推荐&#xff09; 第一种方法&#xff1a; 使用任务计划程序 第二种方法&#xff1a; …

gRPC 备查

简介 HTTP/2 HTTP/2 的三个概念 架构 使用流程 gRPC 的接口类型 1.单一RPC 2.服务器流式RPC 3.客户端式流式RPC 4.双向流式RPC

vue3-动画技巧

Vue 提供了 <Transition> 和 <TransitionGroup> 组件来处理元素进入、离开和列表顺序变化的过渡效果。但除此之外&#xff0c;还有许多其他制作网页动画的方式在 Vue 应用中也适用。这里我们会探讨一些额外的技巧。 基于 CSS class 的动画 对于那些不是正在进入或…

kali虚拟机桥接模式快速设置

第一步&#xff1a;配置 IP、掩码、网关 vim /etc/network/interfaces第二步&#xff1a;配置 DNS&#xff1a; vi /etc/resolv.conf第三步&#xff1a;重启网卡 service networking restart如果还不行建议重启一下虚拟机

c# #if 与 Conditional属性宏的区别

测试代码 using System; using System.Diagnostics;namespace ConsoleApp1 {public class TestClass{[Conditional("Debug1")]public static void Func1(){Console.WriteLine("Conditional 宏");}public static void Func2(){ #if Debug2Console.WriteLin…

Rabbitmq入门与应用(六)-rabbitmq的消息确认机制

rabbitmq的消息确认机制 确认消息是否发送给交换机 配置 server:port: 11111 spring:rabbitmq:port: 5672host: 192.168.201.81username: adminpassword: 123publisher-confirm-type: correlated编码RabbitTemplate.ConfirmCallback ConfirmCallback 是一个回调接口&#xf…

Leetcode3011. 判断一个数组是否可以变为有序

Every day a Leetcode 题目来源&#xff1a;3011. 判断一个数组是否可以变为有序 解法1&#xff1a;分组循环 排序 适用场景&#xff1a;按照题目要求&#xff0c;数组会被分割成若干组&#xff0c;每一组的判断/处理逻辑是相同的。 核心思想&#xff1a; 外层循环负责遍…

2024年TIOBE编程语言排行榜

1. 2024年TIOBE编程语言排行榜&#xff0c;我为C打Call&#xff0c;你呢&#xff1f; https://www.tiobe.com/tiobe-index/

大模型量化技术原理-LLM.int8()、GPTQ

近年来&#xff0c;随着Transformer、MOE架构的提出&#xff0c;使得深度学习模型轻松突破上万亿规模参数&#xff0c;从而导致模型变得越来越大&#xff0c;因此&#xff0c;我们需要一些大模型压缩技术来降低模型部署的成本&#xff0c;并提升模型的推理性能。 模型压缩主要分…

【Java中23种设计模式-单例模式2--懒汉式2线程安全】

加油&#xff0c;新时代打工人&#xff01; 简单粗暴&#xff0c;学习Java设计模式。 23种设计模式定义介绍 Java中23种设计模式-单例模式 Java中23种设计模式-单例模式2–懒汉式线程不安全 package mode;/*** author wenhao* date 2024/02/19 09:38* description 单例模式…

三防平板丨三防工业平板电脑丨三防平板电脑有哪些优势?

三防平板电脑通常使用特殊材料和制造工艺来达到防水、防尘、防摔的目的&#xff0c;这样可以在极端条件下使用&#xff0c;并保证设备的稳定性和可靠性。因此&#xff0c;三防平板电脑适用于各种恶劣环境&#xff0c;如户外野营、物流、工业制造等应用场景。那么相比于普通消费…

Python Selenium 爬虫淘宝案例

爬虫专栏&#xff1a;http://t.csdnimg.cn/WfCSx 前言 在前一章中&#xff0c;我们已经成功尝试分析 Ajax 来抓取相关数据&#xff0c;但是并不是所有页面都可以通过分析 Ajax 来完成抓取。比如&#xff0c;淘宝&#xff0c;它的整个页面数据确实也是通过 Ajax 获取的&#x…

Radware Alteon负载均衡-基于域名的七层负载均衡

Radware Alteon作为一款高性能的负载均衡器&#xff0c;其基于域名的七层负载均衡功能为众多企业提供了灵活、高效的解决方案。 该案例实现如下需求&#xff1a;客户端访问服务器&#xff0c;当访问域名为www.iisstart.com时&#xff0c;默认访问Server1&#xff0c;当配置七层…

数据结构-最短路径(Dijkstra算法与Floyd算法)

介绍 对于网图来说&#xff0c;最短路径是指两顶点之间经过的边上权值之和最少的路径&#xff0c;其路径上第一个点记为源点&#xff0c;最后一个为终点。 计算最短路径有两个经典算法&#xff0c;即迪杰斯特拉&#xff08;Dijkstra&#xff09;算法与弗洛伊德&#xff08;Fl…

蓝桥杯嵌入式STM32G431RBT6知识点(主观题部分)

目录 1 前置准备 1.1 Keil 1.1.1 编译器版本及微库 1.1.2 添加官方提供的LCD及I2C文件 1.2 CubeMX 1.2.1 时钟树 1.2.2 其他 1.2.3 明确CubeMX路径&#xff0c;放置芯片包 2 GPIO 2.1 实验1&#xff1a;LED1-LED8循环亮灭 ​编辑 2.2 实验2&#xff1a…