EDA365电子工程师网

标题: 【分享源代碼】自动创建板边的Anti Etch [打印本页]

作者: XYX365    时间: 2016-1-13 12:30
标题: 【分享源代碼】自动创建板边的Anti Etch
本帖最后由 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


[attach]107238[/attach]

[hide=d160]
  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. )
复制代码


[/hide]



作者: JIMDENG    时间: 2016-1-13 13:14
本帖最后由 JIMDENG 于 2016-1-13 13:50 编辑

谢谢大师的分享!点个赞!
作者: huzf    时间: 2016-1-13 14:54
看看
作者: zhangjunxuan21    时间: 2016-1-13 16:50
感谢大师无私的分享
作者: 86232648    时间: 2016-1-13 20:54

自动创建板边的Anti Etch [修改]
作者: mistletoe    时间: 2016-1-14 09:12
感谢分享,非常不错
作者: mmyutian    时间: 2016-1-19 11:37
謝謝大神 終於看到源碼了,謝謝啦 再多來點源碼 可以慢慢學習

作者: 蠵龜    时间: 2016-1-19 14:43
感謝大大分享

作者: nanosoc    时间: 2016-1-20 10:34
感谢楼主的分享,非常好的skill!
作者: XYX365    时间: 2016-1-20 14:08
補充圖片
[attach]107655[/attach]

作者: huangkai0814hk    时间: 2016-1-22 15:58
路过看下

作者: feixiang1210    时间: 2016-1-25 13:55
谢谢奉献
作者: huangkai0814hk    时间: 2016-1-25 17:24
附件下不了啊
作者: XYX365    时间: 2016-1-25 17:34
huangkai0814hk 发表于 2016-1-25 17:24
附件下不了啊

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

作者: huangkai0814hk    时间: 2016-2-1 16:30
好吧,我现在还是2级
作者: koncc    时间: 2016-2-2 11:42
很實用的工具
感謝 XYX365 分享

作者: 361553894    时间: 2016-2-3 17:16
支持开放源代码

作者: wendao_liu    时间: 2016-2-3 20:58
感谢分享

作者: defir    时间: 2016-2-6 11:16
很赞!!
作者: kuaihai485    时间: 2016-2-6 12:58
谢谢楼主分享

作者: 卫冬冬    时间: 2016-2-9 11:24
学习学习 了解了解


作者: henry201    时间: 2016-2-14 17:24
ganxiewusifenxiang
作者: yaoshasha    时间: 2016-2-19 15:36
谢谢分享
作者: zqy610710    时间: 2016-2-26 12:12
谢谢分享
作者: snow6333    时间: 2016-4-12 14:27
這個功能很常用到,終於有原始碼可以學習了
謝謝
作者: dengbaba    时间: 2016-4-20 10:39
謝謝大神 終於看到源碼了,謝謝啦 再多來點源碼 可以慢慢學習
作者: bcyj    时间: 2016-5-31 11:50
感谢分享
作者: michaell    时间: 2016-6-1 13:46
下载不了
作者: hy20060614    时间: 2016-6-5 10:23
谢谢分享
作者: hayatokoc    时间: 2016-6-5 22:11
非常實用的工具
感謝 XYX365大分享
作者: cx032302    时间: 2016-6-16 00:03
感谢分享,非常不错
作者: 361553894    时间: 2016-10-28 14:04
请教大神,15.5版本怎么内缩?
axlPolyExpand在15.5版本不允许expand值为负数

作者: hy20060614    时间: 2016-11-2 10:56
谢谢分享
作者: hy20060614    时间: 2016-11-3 09:10
谢谢分享
作者: hy20060614    时间: 2016-11-4 09:31
谢谢分享
作者: hy20060614    时间: 2016-11-5 13:28
谢谢分享
作者: 挑战极限    时间: 2016-12-19 12:32
搂住真系高银啊!
作者: rasytc    时间: 2016-12-22 11:37
下来看一下
作者: 2000    时间: 2016-12-22 17:06
分享!点个赞!
作者: hy20060614    时间: 2016-12-26 09:52
谢谢分享
作者: lovesweet33    时间: 2016-12-27 22:59
谢谢分享
作者: vivian0802    时间: 2017-3-15 11:03
谢谢分享^^
作者: wcjcn    时间: 2017-6-5 16:30
学习中。。。。。。
作者: startlin    时间: 2017-6-17 15:49
感謝大大分享,謝謝囉!
作者: 夕阳下_g7oc6    时间: 2017-6-19 11:49
:):):)
作者: 夕阳下_g7oc6    时间: 2017-6-19 11:50
:victory::victory:
作者: 夕阳下_g7oc6    时间: 2017-6-19 11:50
:victory:
作者: weigz    时间: 2017-6-19 12:27
谢谢分享
作者: mentorkk    时间: 2017-6-20 00:19
谢谢分享!
作者: jet2001    时间: 2017-6-20 07:27
謝謝分享!

作者: rainner777    时间: 2017-6-21 02:13
謝謝分享




欢迎光临 EDA365电子工程师网 (https://bbs.elecnest.cn/) Powered by Discuz! X3.2