找回密码
 注册
查看: 8547|回复: 58
打印 上一主题 下一主题

【分享源代碼】自动创建板边的Anti Etch

  [复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2016-1-13 12:30 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 XYX365 于 2016-1-13 12:43 编辑

自动创建板边的Anti Etch

skill用于自动创建板边的Anti Etch。


主要功能如下:
1.可选择内缩方式和外扩方式。外扩一般用于板内的开窗部分。
2.可自行设置Anti Etch线宽。
3.可选择创建的层面。(主要用于创建Anit Etch,如有其它需要可以在其它层面创建)


加載:      load("fCreateAntiLine.il")
命令执行:cal


适用版本:allegro 16.3 以上
注:Anti Etch主要用于负片层的分割,当灌铜时,有Anti Etch的部分将会将铜皮隔断。
      只能选择outline来创建,且outline必须为shape(铜皮)或line形式,如果为line形式,必须为单一且闭合的line


fCreateAntiLine.rar (2.23 KB, 下载次数: 69)

  1. ;
  2. ;FileName:        fCreateAntiLine.il
  3. ;Load:                load("fCreateAntiLine.il")
  4. ;Command:        cal
  5. ;
  6. axlCmdRegister("cal" 'fnCreateAntiLine ?cmdType "interactive" ?doneCmd 'fnCALPopupDone ?cancelCmd 'fnCALPopupCancel)
  7. procedure(fnCreateAntiLine() ;主程式
  8.         let((frmCAL)
  9.                 frmCAL = fnCALBuildForm()
  10.                 fnCALSetVariables(frmCAL)
  11.                 fnCALSetFormField(frmCAL)
  12.                 fnCALStart(frmCAL)
  13.         )
  14. )
  15. procedure(fnCALBuildForm()
  16.         let((tFile pPort frmCAL)
  17.                 drain()
  18.                 tFile = axlTempFile()
  19.                 pPort = outfile(tFile)
  20.                 fprintf(pPort "FILE_TYPE=FORM_DEFN VERSION=2\nFORM\nFIXED\nPORT 1 1\n\n")
  21.                 fprintf(pPort "HEADER \"\"\n")
  22.                
  23.                 fprintf(pPort "POPUP <class> \"class\"\n")
  24.                 fprintf(pPort "POPUP <subclass> \"subclass\"\n")
  25.                
  26.                 fprintf(pPort "TILE\n\n")
  27.        
  28.                 fprintf(pPort "GROUP \"Create Anti Etch Layer\"\n")
  29.                 fprintf(pPort "GLOC 1 1\n")
  30.                 fprintf(pPort "GSIZE 25 10\n")
  31.                 fprintf(pPort "ENDGROUP\n")
  32.                        
  33.                 fprintf(pPort "FIELD class\n")
  34.                 fprintf(pPort "FLOC 5 4\n")
  35.                 fprintf(pPort "ENUMSET 18\n")
  36.                 fprintf(pPort "OPTIONS prettyprint\n")
  37.                 fprintf(pPort "POP \"class\"\n")
  38.                 fprintf(pPort "ENDFIELD\n")
  39.        
  40.                 fprintf(pPort "FIELD subcolor\n")
  41.                 fprintf(pPort "FLOC 2 7\n")
  42.                 fprintf(pPort "COLOR 2 1\n")
  43.                 fprintf(pPort "OPTIONS colorchooser\n")
  44.                 fprintf(pPort "ENDFIELD\n")
  45.        
  46.                 fprintf(pPort "FIELD subclass\n")
  47.                 fprintf(pPort "FLOC 5 7\n")
  48.                 fprintf(pPort "ENUMSET 18\n")
  49.                 fprintf(pPort "OPTIONS prettyprint ownerdrawn\n")
  50.                 fprintf(pPort "POP \"subclass\"\n")
  51.                 fprintf(pPort "ENDFIELD\n")
  52.        
  53.                 fprintf(pPort "GROUP \"Line Options\"\n")
  54.                 fprintf(pPort "GLOC 1 11\n")
  55.                 fprintf(pPort "GSIZE 25 10\n")
  56.                 fprintf(pPort "ENDGROUP\n")
  57.        
  58.                 fprintf(pPort "TEXT \"Size:\"\n")
  59.                 fprintf(pPort "TLOC 2 13\n")
  60.                 fprintf(pPort "ENDTEXT\n\n")
  61.        
  62.                 fprintf(pPort "FIELD contract\n")
  63.                 fprintf(pPort "FLOC 7 14\n")
  64.                 fprintf(pPort "CHECKLIST \"Contract\" \"ExpandOrContract\"\n")
  65.                 fprintf(pPort "ENDFIELD\n\n")
  66.        
  67.                 fprintf(pPort "FIELD expand\n")
  68.                 fprintf(pPort "FLOC 7 16\n")
  69.                 fprintf(pPort "CHECKLIST \"Expand\" \"ExpandOrContract\"\n")
  70.                 fprintf(pPort "ENDFIELD\n\n")
  71.        
  72.                 fprintf(pPort "TEXT \"Line Width: \"\n")
  73.                 fprintf(pPort "TLOC 2 18\n")
  74.                 fprintf(pPort "ENDTEXT\n\n")
  75.        
  76.                 fprintf(pPort "FIELD lineWidth\n")
  77.                 fprintf(pPort "FLOC 11 18\n")
  78.                 fprintf(pPort "REALFILLIN 8 12\n")
  79.                 fprintf(pPort "REALMIN 0.0\n")
  80.                 fprintf(pPort "DECIMAL %d\n" cadr(axlDBGetDesignUnits()))
  81.                 fprintf(pPort "ENDFIELD\n\n")
  82.                
  83.                 fprintf(pPort "ENDTILE\n")
  84.                 fprintf(pPort "ENDFORM\n")
  85.                 close(pPort)
  86.                 axlControlRaise('options)
  87.                 frmCAL = axlMiniStatusLoad(gensym() tFile nil t)
  88.                 frmCAL
  89.         )
  90. )
  91. procedure(fnCALCreateAntiEtch(dObj nExpand tLayer @optional (bIsShape t))
  92.         prog((lStartPoint lEndPoint rPath dTmpShape dPolygon dPoly dShape)
  93.                 axlVisibleLayer(tLayer t)
  94.                 unless(bIsShape
  95.                         lStartPoint = car(car(dObj->segments)->startEnd)
  96.                         lEndPoint = cadr(nthelem(dObj->nSegs dObj->segments)->startEnd)
  97.                         if(lStartPoint == lEndPoint then
  98.                                 rPath = axlDB2Path(dObj)
  99.                                 dTmpShape = car(axlDBCreateShape(rPath t tLayer))
  100.                                 dObj = dTmpShape
  101.                         else
  102.                                 printf("E-Not a closed polygon or Line.\n")
  103.                                 return(nil)
  104.                         )
  105.                 )
  106.                 dPolygon = car(axlPolyFromDB(dObj))
  107.                 when(dTmpShape
  108.                         axlDeleteObject(dTmpShape)
  109.                 )
  110.                 dPoly = car(axlPolyExpand(dPolygon (nExpand / 2.0) 'NONE))
  111.                 dShape = car(axlDBCreateShape(dPoly t tLayer))
  112.                 rPath = axlDB2Path(dShape)
  113.                 axlDeleteObject(dShape)
  114.                 axlDehighlightObject(axlChangeWidth(car(axlDBCreatePath(rPath tLayer 'line)) abs(nExpand)))
  115.                 return(t)
  116.         )
  117. )
  118. procedure(fnCALPopupCancel()
  119.         when(frmCAL->xTransMark
  120.                 axlDBTransactionRollback(frmCAL->xTransMark)
  121.         )
  122.         axlClearSelSet()
  123.         axlCancelEnteRFun()
  124.         axlUICmdPopupSet(nil)
  125.         axlUIPopupSet(nil)
  126. )
  127. procedure(fnCALPopupCallback(rEvent)
  128.         fnCATPopupCheck(frmCAL)
  129. )
  130. procedure(fnCATPopupCheck(frmCAL)
  131.         ;解決執行Oops後Popup變成灰色的
  132.         axlUICmdPopupSet(frmCAL->rPopupOrign)
  133.         if(frmCAL->xMarkCount >= 1 then
  134.                 axlUIPopupSet(frmCAL->rPopupOrign)
  135.         else
  136.                 axlUIPopupSet(frmCAL->rPopupGray)
  137.         )
  138. )
  139. procedure(fnCALPopupDone()
  140.         when(frmCAL->xTransMark
  141.                 axlDBTransactionCommit(frmCAL->xTransMark)
  142.         )
  143.         axlClearSelSet()
  144.         axlFinishEnterFun()
  145.         axlUICmdPopupSet(nil)
  146.         axlUIPopupSet(nil)
  147. )
  148. procedure(fnCALPopupInit()
  149.         ;定義Popup
  150.         frmCAL->rPopupOrign = axlUIPopupDefine(nil
  151.                 list(list("Done" 'fnCALPopupDone)
  152.                         list("Oops" 'fnCALPopupOops)
  153.                         list("Cancel" 'fnCALPopupCancel)
  154.                 )
  155.         )
  156.         frmCAL->rPopupGray = axlUIPopupDefine(nil
  157.                 list(list("Done" 'fnCALPopupDone)
  158.                         ;list("Oops" 'fnCALPopupOops)        ;沒有任何選擇時會變成灰色
  159.                         list("Cancel" 'fnCALPopupCancel)
  160.                 )
  161.         )
  162. )
  163. procedure(fnCALPopupOops()
  164.         if(!axlDBTransactionOops(frmCAL->xTransMark) then
  165.                 frmCAL->xMarkCount = 0
  166.         else
  167.                 axlUIWPrint(nil "Oops")
  168.                 frmCAL->xMarkCount = sub1(frmCAL->xMarkCount)
  169.                 axlClearSelSet()
  170.         )
  171.         fnCATPopupCheck(frmCAL)
  172. )
  173. procedure(fnCALSetFormField(frmCAL)
  174.         axlFormSetField(frmCAL "Contract" t)
  175.         axlFormSetField(frmCAL "lineWidth" frmCAL->nLineWidth)
  176.         axlFormSetActiveField(frmCAL "lineWidth")
  177.         axlSetActiveLayer("ANTI ETCH/ALL")
  178. )
  179. procedure(fnCALSetVariables(frmCAL)
  180.         frmCAL->tProgName = "CreateAntiLine"
  181.         ;設定線寬值
  182.         case(car(axlDBGetDesignUnits())
  183.                 ("millimeters"
  184.                         frmCAL->nLineWidth = 0.6
  185.                 )
  186.                 ("mils"
  187.                         frmCAL->nLineWidth = 20.0
  188.                 )
  189.         )
  190.         ;設定滑鼠右鍵選單相關變數
  191.         frmCAL->xTransMark = nil
  192.         frmCAL->xMarkCount = 0
  193.         frmCAL->rPopupOrign = nil
  194.         frmCAL->rPopupGray = nil
  195. )
  196. procedure(fnCALStart(frmCAL)
  197.         let(((bDoFlag t) lEventMask rEventID lSelObj nLineWidth tActivelayer)
  198.                 fnCALPopupInit()
  199.                 axlEventSetStartPopup('fnCALPopupCallback)
  200.                 frmCAL->xTransMark = axlDBTransactionStart()
  201.             lEventMask = list('PICK)
  202.                 axlSetFindFilter(?enabled list("noall" "shapes" "lines") ?onButtons list("noall" "shapes" "lines"))
  203.                 axlClearSelSet()
  204.                 while(bDoFlag
  205.                         printf("M-Please select a outline...\n")
  206.                         rEventID = axlEnterEvent(lEventMask nil nil)
  207.                         caseq(rEventID->type
  208.                                 (PICK ;滑鼠按下左鍵一次
  209.                                         axlDBTransactionMark(frmCAL->xTransMark)
  210.                                         frmCAL->xMarkCount = add1(frmCAL->xMarkCount)
  211.                                         axlSingleSelectPoint(rEventID->xy)
  212.                                         dSelObj = car(setof(x axlGetSelSet() (x->layer == "BOARD GEOMETRY/OUTLINE"))) ;過濾Object必須是outline層面
  213.                                         axlClearSelSet()
  214.                                         if(dSelObj then
  215.                                                 nLineWidth = atof(axlFormGetField(frmCAL "lineWidth"))
  216.                                                 tActivelayer = axlGetActiveLayer()
  217.                                                 when(axlFormGetField(frmCAL "Contract") == "1"
  218.                                                         nLineWidth = -nLineWidth
  219.                                                 )
  220.                                                 case(dSelObj->objType
  221.                                                         ("polygon"
  222.                                                                 fnCALCreateAntiEtch(dSelObj nLineWidth tActivelayer t)
  223.                                                         )
  224.                                                         ("path"
  225.                                                                 fnCALCreateAntiEtch(dSelObj nLineWidth tActivelayer nil)
  226.                                                         )
  227.                                                 )
  228.                                         else
  229.                                                 ;恢復沒有選到任一object
  230.                                                 if(!axlDBTransactionOops(frmCAL->xTransMark) then
  231.                                                         frmCAL->xMarkCount = 0
  232.                                                 else
  233.                                                         frmCAL->xMarkCount = sub1(frmCAL->xMarkCount)
  234.                                                 )
  235.                                         )
  236.                                         fnCATPopupCheck(frmCAL)
  237.                                 )
  238.                                 (DONE ;滑鼠按下右鍵,選擇done
  239.                                         bDoFlag = nil
  240.                                 )
  241.                                 (CANCEL ;滑鼠按下右鍵,選擇cancel
  242.                                         bDoFlag = nil
  243.                                 )
  244.                         )
  245.                 )
  246.                 axlEventSetStartPopup()
  247.         )
  248. )
复制代码



评分

参与人数 1威望 +10 收起 理由
deargds + 10 赞一个!

查看全部评分

该用户从未签到

推荐
 楼主| 发表于 2016-1-25 17:34 | 只看该作者

附件必須是三級會員以上,才可以下載,
你回覆後應該有看到隱藏內容,就是源碼,直接拷貝.

该用户从未签到

推荐
发表于 2016-10-28 14:04 | 只看该作者
请教大神,15.5版本怎么内缩?
axlPolyExpand在15.5版本不允许expand值为负数

该用户从未签到

推荐
发表于 2016-4-20 10:39 | 只看该作者
謝謝大神 終於看到源碼了,謝謝啦 再多來點源碼 可以慢慢學習

该用户从未签到

5#
发表于 2016-1-13 13:14 来自手机 | 只看该作者
本帖最后由 JIMDENG 于 2016-1-13 13:50 编辑

谢谢大师的分享!点个赞!

该用户从未签到

7#
发表于 2016-1-13 16:50 | 只看该作者
感谢大师无私的分享

该用户从未签到

8#
发表于 2016-1-13 20:54 | 只看该作者

自动创建板边的Anti Etch [修改]

该用户从未签到

9#
发表于 2016-1-14 09:12 | 只看该作者
感谢分享,非常不错

该用户从未签到

10#
发表于 2016-1-19 11:37 | 只看该作者
謝謝大神 終於看到源碼了,謝謝啦 再多來點源碼 可以慢慢學習

该用户从未签到

11#
发表于 2016-1-19 14:43 | 只看该作者
感謝大大分享

该用户从未签到

12#
发表于 2016-1-20 10:34 | 只看该作者
感谢楼主的分享,非常好的skill!

该用户从未签到

13#
 楼主| 发表于 2016-1-20 14:08 | 只看该作者
補充圖片

  • TA的每日心情
    无聊
    2023-3-13 15:12
  • 签到天数: 43 天

    [LV.5]常住居民I

    16#
    发表于 2016-1-25 17:24 | 只看该作者
    附件下不了啊

    点评

    附件必須是三級會員以上,才可以下載, 你回覆後應該有看到隱藏內容,就是源碼,直接拷貝.  详情 回复 发表于 2016-1-25 17:34
  • TA的每日心情
    无聊
    2023-3-13 15:12
  • 签到天数: 43 天

    [LV.5]常住居民I

    17#
    发表于 2016-2-1 16:30 | 只看该作者
    好吧,我现在还是2级
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2024-11-23 03:48 , Processed in 0.125000 second(s), 33 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表