CAD图形导出为XAML实践

文章目录

  • 一、前言
  • 二、方法与实践
    • 2.1 画出原图,借第三方工具导出至指定格式
    • 2.2 CAD导出并转换
    • 2.3 两种方法的优劣
      • 2.3.1 直接导出代码量大
      • 2.3.2 导入导出需要调参
  • 三、总结


一、前言

上位机通常有一个设备/场景界面,该界面用于清晰直观地呈现设备状态。
如果界面要求不高,可以用组合简单图形和文字表示设备,并通过给图形变色等手段表示设备状态切换;如果画面要求高,需要做贴图动画甚至是三维模型以更炫酷的方式呈现设备状态。

题外话
有人可能会觉得这种画面做好看了没多大意义,炫酷画面加上动画不会带来实质性的软件提升,还会增加计算机资源消耗。
不过实际情况下,上位机通常是跑在单台主机上的。此时,计算机资源是过剩的,至少不会因为几个动画增加不好的体验。而且,用上位机画面的人和买上位机的人,往往不会关注性能上的东西,谁的上位机感觉更叼一点,画面一比就出结果了。(至少我遇到过几个老板,都是反复强调画面要做炫酷,要有"科技感"一点)。

“将CAD中的图形导出为XAML,以在WPF中使用。”
标题源于一个需求,
一家设备商要做一个上位机系统,功能上不复杂,无非是数据采集、存储、呈现、查询,还有一些业务相关的。但是画面要我尽量做好看些,这对我来说很难。因为这意味着,我不能用几个矩形框加文字的形式来节约工作量了。

此时,我想,该如何把画面做好看?
整体上,我认为的好看就是趋向于逼真,就是没有文字描述的情况下,一眼看过去就知道是哪台设备处于什么状态。
就像外行人评价一幅画画的好不好,通常就是指画的像不像。


二、方法与实践

那如何做的像,有两种思路:

  1. 自己动手画出大致外观,并对局部图形做变换动画;
  2. 获取设备图纸,图纸导出为上位机指定格式文件,再导入上位机。

刚开始,我对第二种方法可行性持怀疑态度(我知道可以直接将其导出,但是导出后如何组织以及效果都不确定),
所以果断选择了第一种。

2.1 画出原图,借第三方工具导出至指定格式

第一种方法思路其实很简单,通过矢量图编辑工具(如Inkscape、Adobe Illustrator等),画出大致图形,然后导出成XAML,在WPF中用UserControl将该图形做成控件。
原图形如下,

我在Inkscape中,画了它的大致形状,

很显然,它与实际外观有差,但勉强能用。
接着,在Inkscape中导出成XAML(AI也可以导出,但要装一个插件)。
在WPF中使用XAML,对该图形做中心旋转即可,成品就是下面效果(此时自我感觉良好~):

与二维图一对比,感觉效果还是差很多,更别说是上色后的图了。

对于一些更复杂的图形,就没那么好画了。当然,你也可以放弃细节,硬画。

注意
实际使用时,你可能需要对一个图形的局部做变换。
可以在Inkscape中将要变换的图形合并至一个图层。这样导出的XAML中,会将合并的图形放在一个Canvas中,你可以只对这个Canvas做变换。

2.2 CAD导出并转换

让我放弃第一种方法的,并不是某些图形很难画,而是我简单尝试了第二种方法。

如下,是一张CAD中的网片(DWG/DXF格式),

按照第一种方法,要画出它的大致图形并不难,但也挺繁琐的。
现在,在 Adobe Illustrator(后面简称AI)中打开它,在给AI安装了导出XAML的插件(XAMLExport64.aip)后,在 文件>导出>导出为 中会有该导出选项。

在这里插入图片描述

注意
导入AI前后,通常还需要对原图进行编辑,进行内容筛选。(“前”指的是在CAD软件中编辑,“后”指的是AI中编辑)
因为原图可能有边框,有标注,而这些内容在最终界面中是不需要的。
还有画板大小调整,去掉图像周围多余的空白画板区域,可以用AI的 对象>画板>适合图稿边界 调整。
在这里插入图片描述
总之,除了会导出这步操作外,你还需要对图形编辑软件有一定掌握。

导出后的文件内容是这样的,很标准的XAML,实际使用时建议将ViewBox中的尺寸去掉,

在这里插入图片描述

这是导入WPF的效果,

用Inkscape编辑也和AI类似。

2.3 两种方法的优劣

这样一对比,似乎CAD导出的方式更加好一点?
实际上不一定,这也是我写这篇博客的原因。
CAD导出固然方便,但导出的文件和原图是有偏差的。而这些偏差中,很多是不可控的。

注意
中间经过格式转换,不同软件转换时处理方式不同,会导致结果不同。
比如说原图中的一个圆转换后放大看,可能变成由多段弧组成了。

2.3.1 直接导出代码量大

比如上面那张网片图,你猜AI插件导出的XAML代码有多少行?
在去掉空白行的情况下,有1600+行(再去掉注释行,怎么也得1500行左右)。
在这里插入图片描述
这个代码量的图形,你要手动编辑还是比较困难的,只适合一些静态场景。

如果你用自己画的方式去实现,可能生成的代码中只有小几百甚至不到一百行,只需在一个Canvas中放一些线段。

实际项目中,我对一个场景图,使用了CAD直接导出的方式,发现生成的XAML有数十万行代码。这个量级,不要说编辑了,只是复制粘贴到VS编辑器中也得半天时间。在我对原图进行大量不必要元素的滤除后,导出的文件仍然有六万多行代码!
最终导出的XAML中图形元素数量保守估计在两万以上。此时,在AutoCAD中打开原CAD文件是不卡的;在AI中打开就比较卡顿了,严重影响编辑体验;而在Inkscape中直接是卡屏,无法编辑,有时还出现闪退!

所以对于较大的图,不建议直接导出
你可以对其做一些筛选,或分批部分导出。
具体限制数量没测过,尚未确定,但据我使用体验,我估计当图元的数量>500时,就要考虑分部分导出/或者绘制简化了。

2.3.2 导入导出需要调参

很多时候原图实际尺寸非常大,一个场景图实际可能表示一个房间、一个车间、一个工厂,而CAD绘图时比例往往是1:1。

你用AI打开CAD图时,会出现以下选项:
在这里插入图片描述
因为你需要将这么大的图,缩放到一个画板上(AI中画板的最大尺寸是57.8mx57.8m)。
显然一个几百甚至几千平的场地,缩放进一块画布中,有许多要考虑的东西。
这不是我的强项,也不是本文的重点,我这边只能建议你选 缩放以适合画板 ,然后根据显示效果做一些调整。
现在有一幅CAD中看起来好好的图片,按默认选项(缩放以适合画板,不勾选缩放线条粗细)导入AI后是这样的,图形以缩小形态出现在右中上边缘
在这里插入图片描述
将右侧图形区域放大后是这样的,线条变得很粗
在这里插入图片描述
接下来,我们分析一下,为什么会出现这种情况。
首先看原图,下面马赛克区域就是上图的图形部分,
在这里插入图片描述
原图外框左下角的点坐标为(1323218.8912,563081.0245),单位是mm。
所以转化成m,是(1323,563),在CAD中缩小全图相对坐标原点位置如下,
在这里插入图片描述
下面是导入AI后的,在坐标系中的情况,

  • 虽然AI和AutoCAD的默认坐标系不一样,但图形并没有出现颠倒的情况(直觉上来讲,如果坐标系颠倒的话,按原坐标导入的图形也会颠倒)。
  • 另外,至于为什么出现横纵坐标比例不一致的情况(原图坐标是(1323,563),AI中是(0.21,0.07)),我想是缩放到画板的过程中做了一些调整(或许和某些不可见图元也有关系)。
  • 大概的缩放比例,可以通过图形区域的尺寸比来得到(从下图来看,差不多是缩小6000倍)。宽高比看起来似乎有一点点偏差,可能是由于AI中缩的太小了,尺寸的小数精度的问题。
    在这里插入图片描述
    这步可以看出来,由于不同软件的解析方式不尽相同,图形出现偏差便很难完全把控(即使可以避免,你也得深入学习这些编辑软件,学习成本较高)。
    这是与自己绘制相比,一个最大的劣势。

回到上面两个问题的解决方案,

  1. 第一个问题是图形位置偏移且图形缩太小了。很简单, 前面也提到过,删掉多余的图元后,在工具栏 对象>画板>适合图稿边界
  2. 第二个问题是线条变粗,选择所有对象后,在工具栏 对象>变换>缩放 ,选择合适的倍数即可(实际上,该缩放多少倍才是实际使用中比较纠结的点)。
    在这里插入图片描述
    还有一种方式就是在AI打开CAD文件时,勾选 缩放线条粗细 。这样,整幅图缩小了,连线条也会被缩小,也可以解决线条粗的问题。但是,还是拿上面的图来说,在CAD中,原线条宽度是0.13mm,你跟着缩小6000倍,就变成了2e-5(即0.00002 )mm。你会发现最后导出的XAML显示后,根本看不到图了,因为线条太细了。所以我建议还是自己调整倍数比较好。

这两个问题解决后,至少在AI中,你的图形看起来就很正常了。
在Inkscape中,同样可以做这些操作。但是Inkscape性能方面做的比AI差很多。
在不考虑性能的情况下,我个人还是喜欢用Inkscape,因为它界面友好,导出的XAML也更紧凑。

这小节稍微有点偏题了,本来想说CAD导出这种方式调参太麻烦,结果变成介绍解决问题的方法了。


三、总结

篇幅有点长了,快速总结一下收尾。

  1. 如果原图形不复杂,建议用编辑工具自己绘制图形,然后转XAML(也可以从iconfont上找现成的图形使用);
  2. 反之,可以用CAD导出的方式:
    • 若CAD较大,筛选图元、裁剪画布后,分几部分导出,建议用AI(需要装脚本);
    • 若CAD不大,可以用Inkscape直接导出;
  3. 必要时,可结合两种方式。

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

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

相关文章

Yakit工具篇:子域名收集的配置和使用

简介(来自官方文档) 子域名收集是指通过各种技术手段,收集某个主域名下所有的子域名列表。子域名是指在主域名前面添加一级或多级名称的域名。例如,对于主域名example.com,其子域名可以是www.example.com、mail.example.com、blog.example.c…

触控笔哪个牌子好用?主动电容笔和被动电容笔的区别

主动式电容笔和被动式电容笔两者最大的不同之处在于主动式电容笔的应用范围更大,可以兼容各种不同的电容屏幕。随着人们对其认识的不断深入,其应用范围也在不断扩大。而且国产的主动式电容笔,也在不断的更新换代,重力越来越多&…

Django使用Token认证(simplejwt库的配置)

目录 官网文档安装项目配置拓展配置 官网文档 https://django-rest-framework-simplejwt.readthedocs.io/en/latest/ 安装 pip install djangorestframework-simplejwt项目配置 REST_FRAMEWORK {...DEFAULT_AUTHENTICATION_CLASSES: (...rest_framework_simplejwt.authent…

c#设计模式-行为型模式 之 访问者模式

🚀简介 封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下定义作用于这些元素的新的操作。 访问者模式包含以下主要角色 : 抽象访问者(Visitor)角色:定义了对每一个元素 (E…

pytorch3D Windows下安装经验总结

一、说明及准备工作 最近在安装pytorch3D的时候遇到了很多问题,查了很多博客,但发现讲的都不太全,所以特将自己的及收集到的安装过程经验总结如下。我是在Anaconda中虚拟环境下安装的。 1.1准备工作 官方安装教程如下:https://…

英特尔 SGX 技术概述

目录 介绍概述指示结构Memory安全区页面缓存Enclave Page Cache (EPC)安全区页面缓存映射Enclave Page Cache Map (EPCM) Memory ManagementStructures页面信息Page Information (PAGEINFO)安全信息Security Information (SECINFO)分页加密元数据Paging …

小程序入门——详细教程

🎬 艳艳耶✌️:个人主页 🔥 个人专栏 :《Spring与Mybatis集成整合》《Vue.js使用》 ⛺️ 生活的理想,为了不断更新自己 ! 1.微信小程序 入门 1.1什么是小程序? 2017年度百度百科十大热词之一 微信小程…

小程序的console中出现:。。。不在以下 request 合法域名列表中,请参考文档:。。。的报错解决

报错效果: 其实这个报错不代表自己的代码有问题 但是本强迫症研究了一下,按照以下方法关掉就不会显示这个报错了。 点微信开发者工具中的右上角的详情。点本地设置。勾选不校验。。。HTTPS证书。 即可关闭该报错:

java springboot VUE粮食经销系统开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot VUE 粮食经销系统是一套完善的完整信息管理类型系统,结合springboot框架和VUE完成本系统,对理解JSP java编程开发语言有帮助系统采用springboot框架(MVC模式开发) ,系统具有完整的源代码和数…

多域名证书

多域名证书是一种可以保护多个不同域名的SSL证书,最多可保护250个域名。与单域名证书相比,多域名证书具有更多的优势,比如可以更好地管理多个域名,减少部署证书的次数,提高网站安全性等。多域名证书有三种验证方式可以…

mac电脑安装雷蛇管理软件,实现调整鼠标dpi,移动速度,灯光等

雷蛇官网只给了win版本驱动 mac版本驱动到这里下载: GitHub - 1kc/razer-macos: Color effects manager for Razer devices for macOS. Supports High Sierra (10.13) to Monterey (12.0). Made by the community, based on openrazer. 安装后会显示开发者不明,请丢弃到垃圾桶.…

单片机综合小项目

一、单片机做项目常识 1.行业常识 2.方案选型 3.此项目定位和思路 二、单片机的小项目介绍 1.项目名称:基于51单片机的温度报警器 (1)主控:stc51; (2)编程语言:C语言 (…

00TD时尚儿童穿搭,这件小熊毛衣太好看了吧

寒冷的秋冬季怎么少的了毛衣呢 软糯亲肤又时尚百搭的款谁不爱 除了纯色还有条纹设计 可爱小熊图案可爱又吸睛 经典时尚的款怎么穿都好看哦!

css 特别样式记录

一、 这段代码神奇的地方在于, 本来容器的宽度只有1200px,如果不给img赋予宽度100%,那么图片 会超出盒子,如果给了img赋予了宽度100%,多个图片会根据自己图片大小的比例,去分完那1200px,如图二。…

Netty P1 NIO 基础,网络编程

Netty P1 NIO 基础,网络编程 教程地址:https://www.bilibili.com/video/BV1py4y1E7oA https://nyimac.gitee.io/2021/04/25/Netty%E5%9F%BA%E7%A1%80/ 1. 三大组件 1.1 Channel & Buffer Channel 类似 Stream,它是读写数据的双向通道…

华为9.20笔试 复现

第一题 丢失报文的位置 思路&#xff1a;从数组最小索引开始遍历 #include <iostream> #include <vector> using namespace std; // 求最小索引值 int getMinIdx(vector<int> &arr) {int minidx 0;for (int i 0; i < arr.size(); i){if (arr[i] …

【k8s总结】

资源下载&#xff1a;http://www.ziyuanwang.online/912.html Kubernetes(K8s) 一、Openstack&VM 1、认识虚拟化 1.1、什么是虚拟化 在计算机中&#xff0c;虚拟化&#xff08;英语&#xff1a;Virtualization&#xff09;是一种资源管理技术&#xff0c;是将计算机的…

力扣每日一题43:字符串相乘

题目描述&#xff1a; 给定两个以字符串形式表示的非负整数 num1 和 num2&#xff0c;返回 num1 和 num2 的乘积&#xff0c;它们的乘积也表示为字符串形式。 注意&#xff1a;不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 示例 1: 输入: num1 "2"…

多模态及图像安全的探索与思考

前言 第六届中国模式识别与计算机视觉大会&#xff08;The 6th Chinese Conference on Pattern Recognition and Computer Vision, PRCV 2023&#xff09;已于近期在厦门成功举办。通过参加本次会议&#xff0c;使我有机会接触到许多来自国内外的模式识别和计算机视觉领域的研究…

【云计算网络安全】DDoS 攻击类型:什么是 ACK 洪水 DDoS 攻击

文章目录 一、什么是 ACK 洪水 DDoS 攻击&#xff1f;二、什么是数据包&#xff1f;三、什么是 ACK 数据包&#xff1f;四、ACK 洪水攻击如何工作&#xff1f;五、SYN ACK 洪水攻击如何工作&#xff1f;六、文末送书《AWD特训营》内容简介读者对象 一、什么是 ACK 洪水 DDoS 攻…