胡浩亮,陈 萍,张争艳,陶孟仑,陈定方,陈 琼
(1武汉理工大学智能制造与控制研究所,湖北 武汉430063;2南昌大学共青学院,江西 九江332020)
快速成型(Rapid Prototyping,RP)技术采用材料逐层堆积的方法来制造实体,可以直接、快速地将三维CAD模型制造出来,大大缩短制造周期,降低成本,具有良好的发展前景。虽然可以用不同的方法建立三维CAD模型,但制造实体的过程必须要依据这些模型的切片数据,因此切片方法将会直接影响加工质量以及生产效率。然而,即使是同一个模型,不同的切片方法也会产生不同的切片数据,如何将模型分割成单一的切片层并得到适宜的轮廓数据是一项至关重要的工作[1]。快速成型的切片方法分为基于STL模型的切片方法和基于三维CAD模型的直接分层切片方法[2]。前者先用小三角面片近似模拟三维CAD模型,再对近似模型进行切片获取轮廓数据。这种方法具有格式清晰、易于分割等优点,在快速成型发展初期得到了广泛运用,且被几乎所有的快速成型设备和CAD系统所支持。但STL格式仅仅是对三维CAD模型的近似模拟,且不包含拓扑信息,因此会产生一些诸如法向量错误、不共顶点、顶点分离、违反取向原则、重叠面片等缺陷。而基于三维CAD模型的直接分层切片方法则直接对原始模型切片获取轮廓数据,具有精度高、速度快等优点。基于上述原因,本文提出了一种基于AutoCAD的直接分层切片方法,实现了对三维CAD模型的直接切片。
AutoCAD不仅是提供基本功能的应用平台,更是可以进行二次开发的软件平台。在AutoCAD平台下对三维CAD模型直接分层切片的二次开发有两种方法[3]:一种方法是基于ObjectARX开发一个切片的动态链接库(DLL),通过使用AcBr库(libacbr.dll)查询三维实体任意方向上的剖面数据从而获得分层切片,这种方法难度较大,同时容易导致系统崩溃;另一种方法是借助于AutoCAD内嵌的Visual LISP语言,通过调用剖切命令实现对三维CAD模型的直接切片。该语言易于掌握,便于交互。
切片程序借助于AutoCAD软件平台,利用Visual LISP语言进行二次开发,得到直接切片的轮廓信息[4],同时得到快速成型机的驱动指令扫描路径。
首先利用command函数调用layer命令建立两个图层——countor和hatch,分别用于保存各个切片层的边界轮廓数据以及内部填充数据,便于后续数据的提取以及生成数控代码。接下来设置坐标系,将用户坐标系(UCS)设置在模型底部,Z轴方向指向切片方向。值得注意的是,在运行程序代码之前,必须关闭特征点捕捉、正交等自动功能,否则得到的不一定是预期高度的切片。完成上述工作后,进入切片过程。
1)用DCL语言编写一个用户对话框,得到模型的最低点坐标值bottom、最高点坐标值top、切片方向以及切片厚度delta(图1)。
图1 切片程序用户框界面
2)调用剖切(section)命令,对模型的指定位置进行剖切操作,得到子类标记为AcDbModelerGeometry的面域(Region)形式的切片,并添加至选择集A,置于图层0中。
3)调用提取边(xedges)命令。由于AutoDesk公司尚未公布DXF文件中关于保存面域的私有数据的格式细节,因此关于面域这一特殊图元的数据提取少有报道。考虑到AutoCAD 2008已经增加提取边命令,可以调用该命令对面域切片提取边得到一个由二维图元组成的轮廓线框。若提取得到的轮廓线框包含样条曲线(spline),可以调用编辑多段线(pedit)命令转化为指定拟合精度(一般20)的多段线,并调用炸开(explode)命令得到一系列符合工艺参数的内部填充直线。
4)调用填充(hatch)命令对面域切片进行平行线填充,并调用炸开(explode)命令炸开填充图案,得到一系列相互平行的直线,并添加至选择集C,置于hatch图层中。上述得到的直线可以作为后续驱动指令的扫描路径。若设置填充原点为左上角,则上述得到的直线按由上到下、由左到右的顺序记录,提取时可以不考虑顺序。
5)删除选择集B中的面域形式的切片,高度z增加一个切层厚度,将UCS置于当前位置,当z≤模型最大高度值top时,重复上述步骤2)~5)。
该过程的流程如图2所示。
(setvar"osmode"0);关闭目标对象捕捉
(setvar"blipmode"0);不显示光标痕迹
(setvar"hporiginmode"1);填充对象设置填充原点为左上角
(setvar"hpname""_user");设置填充的默认图案名称为用户自定义
(while(<=z top);变量控制为切片方向z
(command"section"A"""XY"(list 0 0z));对选择集A剖切,方向平行于XY平面
(command"ucs"(list 0 0z)"");设置用户坐标系
(command"xedges"B"");提取边,即轮廓线框
(command"change"C"""p""la""countor""");置于countor图层中
(if(or(< n 3)(> n layer))(setq filldelta 0.4)(setq filldelta 2));前后三层驱动指令扫描线间距较小,增加模型强度,中间层间距适当疏些,以节省材料
(setq ang(+ang(/pi 2)));相邻层的填充角度相差90°,增加打印时材料粘合度
(setvar"hpspace"filldelta);指定填充方案的间距
(setvar"hpang"ang);指定填充方案的角度
(command"hatch""""""""n"B"");填充
(command"explode""last""");炸开,获得直线
(command"change"D"""p""la""hatch""");置于hatch图层中)
以上只是最为核心的几个代码,并不能直接运行。
图2 技术流程图
建立图3所示的三维CAD模型,其中整体边界框为44mm×60mm×50mm。为了演示切片程序,将切片厚度定为3(实际应该为0.15~0.2),得到图4所示的切片数据。
图3 三维CAD模型
图4 模型切片
图5 为该模型高度分别为5mm、15mm、30 mm处的切片轮廓。其中直线为驱动指令的填充直线,线框为实体的切片轮廓。证明本程序可以实现对三维CAD模型的直接切片。
图5 模型指定层切片
[1] Cao W,Miyamoto Y.Direct slicng from AutoCAD solid models for rapid prototying[J].International Journal of Advanced Manufacturing Technology,2003,21(10-11):739-742.
[2] 马静静,胥光申.基于AutoCAD的CAD模型直接切层方法研究[J].计算机光盘软件与应用,2012(13):120-130.
[3] 马锦华,卢章平.AutoCAD环境下直接适应性切片方法及实现[J]机械设计与制造,2007(07):100-102.
[4] 李占利,胡德州.三维模型的直接分层软件研究与开发[J].西安科技学院学报,2002,22(02):189-193.