VUE3 中导入VISO 图形

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

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

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

目的与方法

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

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

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

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

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

实现 

简单的P&ID 图

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

VISO 图形添加数据属性

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

  • NodeId
  • BrowseName
  • DisplayName
  • NodeType

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

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

当从VISO 导出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 与后台的信息模型建立对应关系,是值得探讨的。这里我们尝试了VISO 图形与前端HTML5 UI,后端OPCUA 信息模型建立简单,清晰的对应方式。尽管没有使用DEXPI 标准,但是SVG 似乎更加便捷。 

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

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

相关文章

AbstractQueuedSynchronizer

重要类 Node Node中的属性&#xff1a;prev next 重要方法 这个方法主要有两种实现 一个是公平 一个是非公平 公平&#xff1a; /*** Fair version of tryAcquire. Dont grant access unless* recursive call or no waiters or is first.*/protected final boolean tryAcq…

IOC理解总结

IOC 控制反转&#xff08;Inversion of Control&#xff0c;缩写为IoC&#xff09;&#xff0c;是面向对象编程中的一种设计原则&#xff0c;可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&#xff09…

[深度学习] 卷积神经网络“卷“在哪里?

​ &#x1f308; 博客个人主页&#xff1a;Chris在Coding &#x1f3a5; 本文所属专栏&#xff1a;[深度学习] ❤️ 热门学习专栏&#xff1a;[Linux学习] ⏰ 我们仍在旅途 目录 1.卷积的定义 2.卷积的"卷"在哪里 3.什么又是卷积神…

⭐北邮复试刷题589. N 叉树的前序遍历__DFS (力扣每日一题)

589. N 叉树的前序遍历 给定一个 n 叉树的根节点 root &#xff0c;返回 其节点值的 前序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示&#xff0c;每组子节点由空值 null 分隔&#xff08;请参见示例&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [1,null,…

【干货分享】测试开发必须要知道的Python面试题!

互联网寒冬&#xff0c;大家过得还好吗&#xff1f;年终奖发了多少&#xff1f; 最近感觉不少朋友都在刷 leetcode 了&#xff0c;年后打算看机会的&#xff0c;应该都蠢蠢欲动了吧。 我这里有一份精选的python面试题&#xff0c;测试开发方向的&#xff0c;由我和同行们在实…

云原生概念

云原生是一条使用户能&#xff1a; 1.低运维、 2.敏捷的、 3.以可扩展、可复制的方式&#xff0c; 最大化的利用”云“的能力、发挥”云“的价值的最 佳路径 云原生&#xff0c;是一条最佳路径或实践 参考&#xff1a;https://edu.aliyun.com/course/314164/lesson/7815

Spring MVC(基于 Spring4.x)基础学习

一、SpringMVC概述 二、SpringMVC的HelloWorld 三、使用RequestMapping映射请求 四、映射请求参数&请求头 五、处理模型数据 六、视图和视图解析器 七、RESTful CRUD 八、SpringMVC表单标签&处理静态资源 九、数据转换&数据格式化&数据校验 十、处理JSON:使用…

用过才知道,X5真的是移动办公的天花板 !

春节过后&#xff0c;我们又重新投入到工作的热情中&#xff0c;继续出发。新的一年&#xff0c;新的奋斗目标&#xff0c;新的开始。自从用过华为Mate X5办公后&#xff0c;不得不说&#xff0c;大屏幕办公就很友好&#xff0c;而且操作更快捷&#xff0c;成为了我高效办公的新…

微信小程序启动自动检测版本更新,检测到新版本则提示更新

UpdateManager 对象&#xff0c;用来管理更新&#xff0c;可通过 wx.getUpdateManager 接口获取实例在app.js中的示例代码onShow() {// 获取小程序更新机制的兼容&#xff0c;由于更新的功能基础库要1.9.90以上版本才支持&#xff0c;所以此处要做低版本的兼容处理if (wx.canIU…

AIGC专题:生成式人工智能在能源和材料领域中的新机遇

今天分享的是AIGC系列深度研究报告&#xff1a;《AIGC专题&#xff1a;生成式人工智能在能源和材料领域中的新机遇》。 &#xff08;报告出品方&#xff1a;McKinsey & Company&#xff09; 报告共计&#xff1a;11页 来源&#xff1a;人工智能学派 利用人工智能的力量…

Terminus:介绍+使用教程+技巧【全网保姆级教程】

一、起因 当我把电脑从win系统换成mac系统时候&#xff0c;我知道XShell已经不能在使用了&#xff0c;我需要找到最好的s sh客户端去登陆服务器 二、心路历程 我找了很多的软件&#xff1a; SSH Config Editor ProZOCVanDyke SecureCRTFinalShell 每个下载都试用了几天&#xf…

FL Studio Producer Edition v21.2.3.4004 最新版本作为 Windows 离线安装程序2024免费下载

Fl Studio 21.2.3.4004最新中文版直装版是最新的音乐制作工具。它可以与各种音乐制作令人惊叹的音乐工作。它提供了一个相当简单和用户友好的集成开发环境工作。这整个音乐工作站是由比利时公司图像线开发的。其先进的理念帮助初学者和专业人士创作、安排、录制、编辑和混合音乐…

【知识整理】PHP研发组代码规范要求

一、目标 统一代码风格、命名规范&#xff0c;增强代码可读性和可维护性&#xff0c;供日常开发工作中时参考&#xff0c;以提高团队协作的开发效率。 二、编程规约 PHP代码规范[PSR-12] 特别注意&#xff1a; 1、业务代码内对 常量、变量(分页值、版本号、向下参数等)、魔法值…

AI嵌入式K210项目(29)-模型加载

文章目录 前言一、下载部署包二、C部署三、搭建文件传输环境四、文件传输五、调试六、MicroPython部署总结 前言 上一章节介绍了如何进行在线模型训练&#xff0c;生成部署包后&#xff0c;本章介绍加载模型&#xff1b; 一、下载部署包 训练结束后&#xff0c;在训练任务条…

Python Django路由详解

1.路由Router 在实际开发过程中&#xff0c;一个Django 项目会包含很多的 app&#xff0c;这时候如果我们只在主路由里进行配置就会显得杂乱无章&#xff0c;所以通常会在每个app 里&#xff0c;创建各自的 urls.py 路由模块&#xff0c;然后从根路由出发&#xff0c;将 app 所…

idea快捷键使用

文章目录 快捷键的使用通用型编码源文件时快捷键使用操作文件类结构、查找和查看源码查找、替换与关闭调整格式Debug快捷键 查看快捷键已知快捷键操作名&#xff0c;未知快捷键已知快捷键&#xff0c;不知道对应的操作名自定义快捷键 切换其它平台快捷键 快捷键的使用 通用型 …

《白话C++》第10章 STL和boost,Page85 std::shared_ptr常用功能

std::shared_ptr基本用法包括&#xff1a; &#xff08;1&#xff09;取裸指针 //get()成员取回裸指针 std::shared_ptr <int> pa(new int(5)); int* p pa.get(); /**< 取回裸指针 */ &#xff08;2&#xff09;判断是否为空 肯定可以这样写&#xff1a; std::s…

MobaXterm下载安装及SSH远程教程

一、MobaXterm的简介 MobaXterm是一款功能强大的远程计算工具&#xff0c;集成了诸多网络工具和便利功能&#xff0c;包括SSH、X11服务器、SFTP等&#xff0c;支持Windows系统。用户可以使用MobaXterm来轻松管理远程服务器&#xff0c;进行文件传输&#xff0c;远程桌面显示等操…

8、内网安全-横向移动RDPKerberos攻击SPN扫描WinRMWinRS

用途&#xff1a;个人学习笔记&#xff0c;有所借鉴&#xff0c;欢迎指正 目录 一、域横向移动-RDP-明文&NTLM 1.探针服务&#xff1a; 2.探针连接&#xff1a; 3.连接执行&#xff1a; 二、域横向移动-WinRM&WinRS-明文&NTLM 1.探针可用&#xff1a; 2.连接…

语义相关性评估指标:召回率、准确率、Roc曲线、AUC;Spearman相关系数、NDCG、mAP。代码及计算示例。

常规的语义相关性评价可以从检索、排序两个方面进行。这里只贴代码。详细可见知乎https://zhuanlan.zhihu.com/p/682853171 检索 精确率 def pre(true_labels[],pre_labels[]):""":param true_labels: 正样本索引:param pre_labels: 召回样本索引:return: 精…