基于DXF 和STL 文件实现AutoCAD 与MATLAB 高效交互

2022-01-11 10:10沈良朵
关键词:多边形绘制网格

王 超,沈良朵

(1.浙江海洋大学海洋工程装备学院,浙江舟山 316022;2.大连海事大学航海学院,辽宁大连 116023)

Auto CAD 是国际上广为流行的绘图工具,凭借其良好的用户界面,通过交互菜单或命令行方式可根据需要快速画出由基本线单元构成的图形。MATLAB 拥有强大的数学函数库,可轻松绘制各种由复杂函数控制的数学图形。如何实现AutoCAD 和MATLAB 两者高效交互是本文所要研究和解决的问题。和平安等[1]借助Excel 实现了两者简单交互,但其方式繁琐、占用内存高且容易出错,完全依靠手动操作。贺云花[2]提出了利用SCR 脚本实现二维曲线、三维曲线的转换以及初步提到利用DXF 文件实现简单的二维曲线的绘制。王蔚[3]利用MATLAB 生成的SCR 脚本文件实现了AutoCAD 中复杂曲线/曲面的绘制。于志伟等[4]受以上文献的启发,集合不同方法的优势,通过MATLAB 直接编写DXF 文件来实现复杂曲线、曲面和文字组织等绘制以及通过DXF 和STL 读取函数来读取AutoCAD 中的二维和三维图像信息并绘制。本文利用承载AutoCAD 重要的数据交换功能的DXF 和STL 文件,实现了AutoCAD 及MATLAB 高效交互,以充分结合二者的优势,快速绘制所需的复杂图形。

1 交互方法

1.1 AutoCAD 图形交换文件(DXF)

DXF 文件是AutoCAD 中的图形交换文件。作为一种开放的矢量格式,分为ASII 格式和二进制格式;前者可读性优秀同时占用的空间相对较大;后者读取性略差但胜在读取速度快且占用内存小。DXF 文件的组成单位为“组”,一个“组”代码和一个“组值”构成一个“组”,每个“组”代码和“组值”各单独占用一行,用以指定之后的值的类型以及用途。多个组组成“段”,每个段的开头是以组码“0”和字符串“SECTION”,之后是组码“2”和表示段名的字符串。段的中间,可以使用组码和值定义段中的元素。段的结尾,可以使用组码“0”和字符串“ENDSEC”来定义。

1.2 AutoCAD 图形交换文件(STL)

STL 文件是在计算机图形应用系统中用来表示三角形网格的一种文件形式,其格式简单,应用广泛,是计算机图形学处理CG,数字几何处理如CAD,数字几何工业应用如3D 打印机支持的最常见文件格式。STL 文件分为二进制格式和ASCII 明码格式,只能用来表示封闭的面或者体。ASCII 码格式的STL 文件每一行以1 个或2 个关键字开头,逐行给出三角面片几何信息。Auto CAD 三维实体文件可以转化为STL 格式文件,用于和其他软件如MATLAB 之间的交互。

1.3 CAD 读取MATLAB 图形文件

实现AutoCAD 读取MATLAB 图形文件,首先要让MATLAB 生成AutoCAD 可识别的DXF 文件,如图1 所示。MATLAB 对于DXF 的编写需要用到dxflib 库,dxflib 是一个用于读写AutoCAD(R)DXF 文件的开源C+库。它提供了读取和写入许多基本实体的功能,以及有关层和块的信息。dxflib 是一个状态库,即在不被更改的情况下它能保留某些参数值在不同函数的后续调用。

图1 CAD 读取MATLAB 图形文件过程Fig.1 The process of reading matlab graphics files with Auto CAD

利用dxflib 库可建立生成DXF 文件的接口程序,可通过其主要的功能函数实现特定操作,如通过dxf_open 函数新建一个dxf 文件,通过dxf_close 函数关闭编写完成的dxf 文件,通过dxf_set 函数设置dxf文件的属性(层数,颜色等),通过dxf_polyline、dxf_polymesh、dxf_point 等函数分别实现对应折线、多边形网格、点等功能的操作。

1.4 MATLAB 读取AutoCAD 图形文件

实现MATLAB 读取AutoCAD 图形文件,首先要将二维AutoCAD 图形文件另存为DXF 文件,三维AutoCAD 图形文件转化为STL 文件。然后需解析DXF 和STL 文件中的各种基本的几何图形数据,包括点、线段、多段线、圆弧、圆和各种基本三维实体等,其过程分别如图2 和图3 所示。

图2 MATLAB 读取二维Auto CAD 图形文件过程Fig.2 The process of reading two-dimensional Auto CAD graphics files with MATLAB

图3 MATLAB 读取三维Auto CAD 图形文件过程Fig.3 The process of reading 3D Auto CAD graphics files with MATLAB

2 交互实例

2.1 AutoCAD 读取MATLAB 图形文件

AutoCAD 对不同类型的MATLAB 图形文件的读取需要借助dxf_函数创建的DXF 图形文件。DXF 文件能够被AutoCAD 直接打开,包括但不限于三维基本体、多边形网格以及彩色多边形网格图像等。

2.1.1 三维基本体读取

复杂曲线、曲面的创建离不开基元,通过DXF 文件接口程序可以得到自己想要的各种基元图像,如球体,四面体,六面体等。在MATLAB 中运行接口程序,实例如下:

生成的dxf 文件用Auto CAD 打开后如图4 所示。

图4 AutoCAD 打开由MATLAB 生成的基元图像Fig.4 Opening the primitive image generated by MATLAB with AutoCAD

2.1.2 多边形网格图像读取

多边形网格的创建需要用到dxf_polyline 函数,它可以利用MATLAB 的矩阵数据创建多个面的dxf 数据,并且允许为每个面指定颜色(1 个面只能指定1 个颜色)。以MATLAB 最经典的peaks 函数为例,在MATLAB中运行接口程序:

在这个程序中需要使用surf2patch 函数将图像的几何形状和颜色数据转换为补片格式。输出fvc 是包含面、顶点以及颜色数据的结构体,可以将此结构体直接传递给patch 命令。利用这些矩阵数据来构建多边形网格图形。这里默认颜色为黄色,如图5 所示。

图5 AutoCAD 打开由MATLAB 生成的peaks 图像Fig.5 Opening the image of peaks generated by MATLAB with AutoCAD

2.1.3 彩色多边形网格图像创建

很多时候利用到多边形网格的时候,是需要给不同的高度或者区域区分颜色的,所以彩色多边形网格的创建就尤为必要。DXF 原本是不支持surf2patch 函数的颜色输出类型的,即逐顶点颜色矩阵。因此,需要通过z 坐标来实现不同高度的颜色区分。通过给每个面的矩阵都准备好相应的颜色,并将原本DXF 不支持的RGB 颜色方案通过dxf_rgb2aci 函数转化为aci 着色方案,就可以实现彩色多边形网格的绘制。同样以peaks 函数为例,在MATLAB 中运行如下接口程序生成dxf 文件,结果如图6 所示。

图6 AutoCAD 环境下的彩色多边形网格图像Fig.6 Color polygon mesh image in AutoCAD environment

配置颜色后的图像相比纯色的图像更加形象且获得的信息也更多,配合AutoCAD 进行编辑的能力也更出色,真正意义实现了AutoCAD 和MATLAB 通过DXF 文件共同编辑复杂图像的目标,将MATLAB 强大的函数功能和AutoCAD 出色的图形编辑相结合。

2.2 MATLAB 读取Auto CAD 图形文件

MATLAB 读取Auto CAD 图形文件时需要利用多种不同的函数,对应不同种类的AutoCAD 图形文件输出格式。不同类型、维度的CAD 图形不能一概而论,必须输出为适当类型的图形文件才能被MATLAB对应的函数读取。下文介绍了比较典型的2 种案例。

2.2.1 基本图元读取

将二维Auto CAD 图形文件另存为DFX 文件,利用dxf2mat 函数可读取DXF 文件中基本图元数据,包括直线、多段线、圆或圆弧等,一旦识别DXF 文件中的基本图元信息,则可利用MATLAB 相应的绘图命令快速得到与DXF 文件一致的图形,如图7 所示。

图7 MATLAB 读取Auto CAD 基本图元Fig.7 Reading basic elements from AutoCAD with MATLAB

2.2.2 三维实体读取

将三维Auto CAD 图形文件转化为STL 文件,利用stlread 函数可读取STL 文件中的三角面片的几何信息,一旦识别STL 文件中的信息,则可利用MATLAB 相应的绘图命令快速得到与STL 文件一致的图像,如图8 所示。

图8 MATLAB 读取Auto CAD 三维实体Fig.8 Reading 3D entity from AutoCAD with MATLAB

相较于AutoCAD,MATLAB 读取后的三维实体曲面不那么圆润,线条感更足;但是相对的,其读取的平面也更加平滑,肉眼几乎看不见类似锯齿。侧面反映了MATLAB 的特点,即通过参数绘制图形,在处理此类规则图形时占据巨大优势。MATLAB 将图形的每个图形元素(如坐标轴、曲线、文字等)看做一个独立的对象,系统给每个对象分配一个句柄,可以通过句柄对该图形元素进行操作,而不影响其他部分。

3 结论

本文以DXF 和STL 图形处理文件为媒介,实现了AutoCAD 和MATLAB 的数据高效互通,将两者的优势相结合共同绘图,从而实现1+1 大于2 的效应。对于既有线性元素,又有函数元素构成的复杂图形,本方法将大幅提高绘图效率并实现精准绘图。

猜你喜欢
多边形绘制网格
绘制童话
作品赏析
网格架起连心桥 海外侨胞感温馨
多边形的艺术
绘制世界地图
追逐
多边形内外角问题的巧解
神秘的不速之客
有关多边形边数问题的思考方法
精析多边形