下面以一个PutOnGrid.il的实例,来具体分析一个Skill程序,这个程序是用来把不在格点上的图形,移到格点上,这里对每段代码都作了详细的解释,大家可以作个参考。
/*******这里是多行注释开始标志,程序的开始一般写上一些介绍的信息,结束为******/
/* 我们画45度的path线时,中心线的点在格点上,拐角处图形肯定不在格点上,本程序是通过把path转换成polygon,再对polygon的点做处理,CIW中load此程序,选中off grid图形,运行PutOnGrid(Grid), Grid工艺规定的最小格点,如0.005 */
;这里是单行注释,到行尾
;定义OnGrid函数
procedure( OnGrid( Point ) ;用procedure定义函数OnGrid if( listp(Point) then ;如果Point是list的话,对list的每个元素递归重复OnGrid()函数, ;lambda定义一个没有函数名的函数 ;mapcar函数用来根据一定的函数转换一个list,这里用递归的方法保留原来list的结构 ;如’((1.2 2.6) (3.3 4.8)),如果Grid=0.5,则结果为’((1.0 2.5) (3.5 5.0)) mapcar( lambda( (x) OnGrid(x) ) Point) else ;如果是一个数字的话,则通过Point/Grid取整,然后再乘以Grid,使图形的每个点移到格点上 round((Point/Grid))*Grid );if then … else 语句结束 );procedure
;定义PutOnGrid函数
procedure( PutOnGrid( Grid ) let((SelectObj ) ;定义局部变量 SelectObj = geGetSelSet() ;版图中选定图形的函数,返回包含所有选中图形信息的一个list foreach( Object SelectObj ;循环对每个选定的图形操作 cond( (Object~>objType == "path" ;判定图形的类型是不是path Polygon = leConvertShapeToPolygon(Object) ;path转成polygon ;Polygon对应的points属性(是一个list)中每个元素通过OnGrid函数移动到格点上, ;然后把转换后的list重新赋给Polygon~>points属性 Polygon~>points = OnGrid(Polygon~>points) ) (Object~>objType == "polygon" ;判定图形的类型是不是polygon Object~>points = OnGrid(Object~>points) ) (Object~>objType == "rect" ;判定图形的类型是不是rect ;需要改变的是rect的bBox属性(这里和polygon的points不同) Object~>bBox = OnGrid(Object~>bBox) ) (Object~>objType=="inst" || Object~>objType=="mosaic" ;判定图形的类型是不是inst/mosaic,这里改变的是inst/mosaic的xy坐标 Object~>xy = OnGrid(Object~>xy) ) );cond ;你可以加上其他的情况 );foreach );let );procedure加上关键词结尾的注释是个良好的习惯
程序的主要代码就是上面的这些,如果你还想要更方便的图形界面方式,一个快捷键就可以操作的话,可以参考Cadence User Interface中的Form相关的内容。
网友留言: