• 编程读写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图纸

    验证过程

    1. 用CAD软件将DWG格式的工程图转成各年份的dxf格式(dxf2000, dxf2004, dxf2007, dxf2010, dxf2013, R12)
    2. 编写代码读入dxf格式文件并新建图层,在新建的图层上用代码画几个圆形和正方形,保存为对应年份的dxf格式文件
    3. 通过AutoCAD软件重新打开代码编辑过并保存的各年份dxf文件,核对是否画图成功,文件大小是否有改变。
    4. 通过AutoCAD自带的文件数据提取功能遍历CAD图中的所有元素,输出execl,核对元素数量是否有出入

    验证结果

    Python

    • ezdxf
      能够正常读写dxf文件

      通过CAD软件打开dxf文件输出execl后发现原文件有887410个元素,代码画图保存后的文件有887415个元素,多出的五个元素为代码新增的一个圆形以及四条线段组成的矩形。元素数目是对应的

    Java

    Java各包文档偏少,多数是读取dxf文件,目前没有找到合适的用例或api去编写测试代码去编辑dxf文件,故目前给出验证可行性结论,有待继续深入研究

    注意事项

    • DWG文件转换为R12 dxf格式时,会出现转换后的文件过大(600M),并且转换后的文件打不开。(Auto2015和Auto2016均会出现这种情况),故不能选用该版本的dxf
    • ezdxf库保存的dxf文件转换成DWG格式时,打开会跳出错误弹框,需要修复才能打开展示,修复后内容展示正常并且元素没有减少。

    参考

    作者:九州浪子
    出处:http://www.cnblogs.com/juforg/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    Medium | LeetCode 148. 排序链表 | 归并排序(递归)
    Hard | LeetCode 4. 寻找两个正序数组的中位数 | 二分法
    Medium | LeetCode 341. 扁平化嵌套列表迭代器 | 递归 | 栈
    Hard | LeetCode 312. 戳气球 | 递归+记忆化数组 | 动态规划
    如何删除万能输入法
    javaweb 怎么获取路径
    Controller 返回 json那些小事
    螺旋矩阵
    javaweb怎么使用html
    tomcat中文乱码
  • 原文地址:https://www.cnblogs.com/juforg/p/15238805.html
Copyright © 2020-2023  润新知