经验交流苑(28):我的排料功能开发记载

软件世界

  我曾从事眼镜工艺设计,现刚转行到制鞋行业,其工作主要是利用AutoCAD的二次开发(在AutoCAD的平台下,通过程序达到或者增强某种CAD印功能),开发过鞋样板辅助设计的优化或自动化产品,以提升制鞋行业的生产水平。最近致痢一个基于AutoCAD的自动排料系统的开发项目,适逢受到小编Builder的邀请,有幸在此与广大《电脑报》读者朋友们分享一下开发这个项目的一点经验。

  排料的概述

  排料技术的应用,在钣金、制鞋和服装等行业的CAD过程中都是必不可少的。排料就是将待排的、具有不规则形状的样板放到一定位置的行为过程。由于待排样板的形状不具有规律性,因此需要经过计算,得出最小面积的样板组合,才能以较高的用料率,完成排料工作。

  图1到图2就是通过AutoCAD的二次开发完成的排料测试过程。

  图1是排料前各待排的样板,图2是经过程序计算后得出的样板组合,在实际工作中,就可以按照该程序计算出来的结果进行操作了。

  排料过程的原理

  在排料过程中,要解决的是移动待排样板来确定它与已排物体之间最佳组合的问题,即排料中的移动问题。也就是寻找平面最优布局的优化问题,即将一系列如不规则形状的样板P1、P2、P3 ……Pn合理地排放在原料P中,使原料的利用率(零件面积/原料面积)最高,并满足以下约束条件:

  1) 每个样板Px (x= 1、2……n)互不重叠;

  2) Px必须放在P内;

  3) 满足一定工艺要求。

  排料的实现

  程序处理排料的过程是复杂,不便在此讲解全部程序,我就把主要的部分写出来与大家分享。

  通常,自动排样算法是采用大样板优先原则,即先排面积较大的样板。在一片样板的位置固定以后,再取下一片,在剩余的原料空间中继续排料,直到所有样板排完为止。

  排料前的工作准备

  a.在AutoCAD中先用ssget函数取得要进行排料的面域。 代码如下:

  (setq ss_lstA (ssget “x” '((0 。 “REGION”))))

  b. 对a步选的对象进一步处理,使之按照面积的大小,从大到小进行排列。代码如下:

  (setq bn_lst nil)

  (while (< i (sslength ss_lstA))

  (setq sbj1 (ssname ss_lstA i) )

  (vl-cmdf “.area” “o”sbj1 “”)

  (setq parea(getvar “area”))

  (setq bn_l (list parea sbj1))

  (setq bn_lst (append bn_lst(list bn_l)));把上面的表组合

  (setq i (1+ i)))

  ;

  (setq qq_lst(vl-sort bn_lst ; 把样片由面积从大到小排序.

  (function (lambda (P1 P2)(cond ((> (car P1) (car P2)) t)

  ((and (= (car P1) (car P2))(> (car P1) (car P2))) t)(t NIL))))))

  把所选到的面域旋转到使其包络框(样板的外切矩形)面积最小的位置。

  样板位置的确定

  样板位置的确定主要是采用样板靠试的方法,就是将要进行排料的样板慢慢向已排的样板靠近,直至相互接触而停下来,然后算出它们所占用的面积,动作完成后,再将该样板旋转一个角度。测试完成后,对比各个测试所得的面积数据,调出面积最小的样板位置,也就是该样板的最佳位置和角度了。

  后记

  由于我还在开发这个功能, 所以还有很多的地方需要加强和完善,这个方案也并不是最优化方法。在此也希望大家指出更好的方法和建议,谢谢。