编程读写CAD文件验证
背景
B/S应用系统,根据用户上传数据:业务数据和CAD坐标数据,经过一系列运筹算法运算后,输出一批坐标数据,作为给用户的规划结果。此时需要方便直观的给用户展示坐标数据。可选方式有两个:
- web页面画图直接展示,能够迅速展示给用户结果,但用户只能根据图形大概位置估计,不能够看到很精细的位置,故该方式只可作为预览使用
- 把坐标数据输出到CAD软件能够识别的文件中,用户下载文件后,直接用AutoCAD软件直接打开该文件,藉由CAD软件功能的丰富性,可以看到很精细的坐标位置,亦可利用AutoCAD二次人为调整加工。
故:需要调研编程读写CAD文件的可行性
AutoCAD文件格式
| 文件格式 | 共同点 | 不同点 |
|---|---|---|
| DWG | Autocad软件可直接读写并相互转换 | CAD的图形文件,DWG仅是CAD专用文件格式, |
| DXF | ^ | 用于CAD与其它软件之间进行CAD数据交换的CAD数据文件格式,文本文件,文件可能比dwg大很多 |
故选用dxf格式作为调研格式
目标运行环境
- Linux
编程语言考量
因项目中服务器端使用到了两种编程语言,故分别调研该两种编程语言
- Java
- Python
验证范围
本次验证是为了确认是否能够通过程序代码对CAD的dxf文件进行编辑,编辑以后保存的dxf文件能否被Autocad软件正确打开,数据是否会缺失,不同dxf年份格式的dxf文件是否可正确保存和打开。
各编程语言的可选开源包
Python
| 包名 | 版本 | 优缺点 |
|---|---|---|
| ezdxf | 0.13 | 直接读写dxf格式文件 |
| pyautocad | - | 必须运行在安装有AutoCAD软件的机器上 |
Java
| 包名 | 版本 | 优缺点 |
|---|---|---|
| kabeja | ||
| YCAD | ||
| JDXF | ||
| jdwglib | ||
| Teigha | 必须运行在安装有AutoCAD软件的机器上 | |
| dxf |
验证环境
- 硬件
设备为惠普笔记本电脑,win10系统,64位。 - 软件
- Python 3.7
- Java8
- Autocad2015
- Autocad2016
- 以及一张dwg格式的工程cad图纸
验证过程
- 用CAD软件将DWG格式的工程图转成各年份的dxf格式(dxf2000, dxf2004, dxf2007, dxf2010, dxf2013, R12)
- 编写代码读入dxf格式文件并新建图层,在新建的图层上用代码画几个圆形和正方形,保存为对应年份的dxf格式文件
- 通过AutoCAD软件重新打开代码编辑过并保存的各年份dxf文件,核对是否画图成功,文件大小是否有改变。
- 通过AutoCAD自带的文件数据提取功能遍历CAD图中的所有元素,输出execl,核对元素数量是否有出入
验证结果
Python
- ezdxf
能够正常读写dxf文件通过CAD软件打开dxf文件输出execl后发现原文件有887410个元素,代码画图保存后的文件有887415个元素,多出的五个元素为代码新增的一个圆形以及四条线段组成的矩形。元素数目是对应的
Java
Java各包文档偏少,多数是读取dxf文件,目前没有找到合适的用例或api去编写测试代码去编辑dxf文件,故目前给出验证可行性结论,有待继续深入研究
注意事项
- DWG文件转换为
R12dxf格式时,会出现转换后的文件过大(600M),并且转换后的文件打不开。(Auto2015和Auto2016均会出现这种情况),故不能选用该版本的dxf - ezdxf库保存的dxf文件转换成DWG格式时,打开会跳出错误弹框,需要修复才能打开展示,修复后内容展示正常并且元素没有减少。
参考
- http://docs.autodesk.com/ACD/2011/CHS/filesDXF/WSfacf1429558a55de185c428100849a0ab7-5f35.htm
- https://sourceforge.net/p/dxf/wiki/Home/
编程读写CAD文件验证的更多相关文章
- Python socket编程 (2)--实现文件验证登入
可以实现从客户端输入账号和密码然后发送到服务器进行验证,实现用户登入校正操作. 服务器: import socket import json server = socket.socket() serv ...
- HDFS文件系统基本文件命令、编程读写HDFS
基本文件命令: 格式为:hadoop fs -cmd <args> cmd的命名通常与unix对应的命令名相同.例如,文件列表命令: hadoop fs -ls 1.添加目录和文件 HDF ...
- Python I/O编程 --读写文件、StringIO/ BytesIO
I/O编程 Input/Output 输入/输出 Stream(流)是一个很重要的概念,可以把流想象成一个水管,数据就是水管里的水 Input Stream就是数据从外面(磁盘.网络)流进内存,Ou ...
- c# 利用动态库DllImport("kernel32")读写ini文件(提供Dmo下载)
c# 利用动态库DllImport("kernel32")读写ini文件 自从读了设计模式,真的会改变一个程序员的习惯.我觉得嘛,经验也可以从一个人的习惯看得出来,看他的代码编写习 ...
- (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- C# 读写INI 文件
INI 格式: [Section1] KeyWord1 = Value1 KeyWord2 = Value2 ... [Section2] KeyWord3 = Value3 KeyWord4 = V ...
- WIN32读写INI文件方法
在程序中经常要用到设置或者其他少量数据的存盘,以便程序在下一次执行的时候可以使用,比如说保存本次程序执行时窗口的位置.大小.一些用户设置的 数据等等,在 Dos 下编程的时候,我们一般自己产生一个 ...
- C#中读写INI文件
C#中读写INI文件 c#的类没有直接提供对ini文件的操作支持,可以自己包装win api的WritePrivateProfileString和GetPrivateProfileString函数实现 ...
- VC 使用msxml6.dll动态链接库中的函数读写XML文件
VC 使用msxml6.dll动态链接库中的函数读写XML文件 目录 1 引言 2 .dll使用方法 3 常用函数总结 4 实例应用 5 运行效果预览 6 补充说明 7 不足之处 8 更新 引言: ...
随机推荐
- IO多路复用详解
假如你想了解IO多路复用,那本文或许可以帮助你 本文的最大目的就是想要把select.epoll在执行过程中干了什么叙述出来,所以具体的代码不会涉及,毕竟不同语言的接口有所区别. 基础知识 IO多路复 ...
- Mybatis学习笔记-日志
日志工厂 如果一个数据库操作出现异常,在排错时,则需要日志 SLF4J Apache Commons Logging(COMMONS_LOGGING) LOG4J LOG4J2 JDK logging ...
- OSPF多区域
目录 一.OSPF的多区域 1.1 生成OSPF多区域的原因 1.2 路由器的类型 1.3 区域的类型 二.链路状态数据库 2.1 链路状态数据库的组成 2.2链路状态通告 三.OSPF多区域配置 四 ...
- Spring boot无法显示jsp页面问题汇总
问题1: o.s.w.s.r.ResourceHttpRequestHandler:Path with "WEB-INF" or "META-INF": [WE ...
- 去除Windows-XP系统下的关机功能
by han 去除Windows-XP系统下的关机功能 一.去除"开始菜单"中"关机"功能 1.点击左下角"开始",然后"运行&q ...
- 作为有经验的程序员如果不懂Lambda表达式就说不过去了吧,建议收藏!!!
最近刚好有空给大家整理下JDK8的特性,这个在实际开发中的作用也是越来越重了,本文重点讲解下Lambda表达式 Lambda表达式 Lambda 表达式,也可称为闭包,它是推动 Java 8 ...
- 一键部署lamp脚本
#!/bin/bash systemctl stop firewalld systemctl disable firewalld setenforce 0 #-------Apache------ # ...
- shell脚本——awk
目录 一.awk 1.1.awk简介 1.2.基本格式 1.3.工作原理 1.4.常见的内建变量(可直接用) 按字段输出文本 1.5.awk和getline 有重定向符 无重定向符 1.6.指定分隔符 ...
- Blind SQL injection:盲注详解
什么是盲注? 当应用程序易受SQL注入攻击,但其HTTP响应不包含相关SQL查询的结果或任何数据库错误的详细信息时,就会出现盲SQL注入. 对于盲目SQL注入漏洞,许多技术(如联合攻击)都是无效的,因 ...
- 06-SpringCloud Eureka
Eureka基础知识 什么是服务治理 Spring Cloud封装了Netflix 公司开发的Eureka模块来实现服务治理 在传统的RPC远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理 ...