- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
Allegro修改anti etch 怎么让铺出来的铜能跟随变化呢
虽然可以通过select shape 修改铜皮,但是总觉得不爽,还是想知道有什么更好的办法没?请各位指示一下?谢谢~
(putd (quote prg_autoSpliting) nil)
(putd (quote prg_autoSplitingform) nil)
(putd (quote autoSpliting_callback) nil)
(axlShell "done")
(axlCmdRegister "fn_autoSpliting" (_backquote prg_autoSpliting) ?cmdType "general")
(setq film (axlGetParam "paramLayerGroup:etch"))
(setq film (getq film groupMembers))
(setq LayerCnt (length (axlSubclassRoute)))
(setq negFilm (quote nil))
(foreach film_e film (setq temp (strcat "ETCH/" film_e))
(if (equal (axlIsLayerNegative temp) t) then (setq negFilm (cons film_e negFilm))))
(setq negFilm (reverse negFilm))
(defun prg_autoSpliting nil (if (nequal (isFile "d:/script/I.bmp") t)
then (renameFile "d:/script/Inventec" "d:/script/I.bmp"))
(prg_autoSplitingform) (setq disp_autoSplitingform (axlFormCreate (gensym) "d:/script/autoSpliting.form" (_backquote ("e" "outer")) (_backquote autoSpliting_callback) t))
(axlFormDisplay disp_autoSplitingform)
(axlFormSetFieldEditable disp_autoSplitingform "create" nil)
(deleteFile "d:/script/autoSpliting.form")
(renameFile "d:/script/Inventec.bmp" "d:/script/Inventec"))
(defun autoSpliting_callback (disp_autoSplitingform) (case (getq disp_autoSplitingform curField) ("negLayer" (if (getq disp_autoSplitingform curValue) then (axlFormSetFieldEditable disp_autoSplitingform "create" t))) ("cancel" (axlFormClose disp_autoSplitingform)
(axlVisibleSet layerActive)
(axlWindowBoxSet windowBox)
(axlUIWRedraw nil)) ("create" (setq layerActive (axlVisibleGet)) (setq windowBox (axlWindowBoxGet))
(axlVisibleDesign nil) (setq negLayer (axlFormGetField disp_autoSplitingform "negLayer"))
(axlSetFindFilter ?enabled (list "noall" "Shapes") ?onButtons (list "noall" "Shapes")) (setq temp (strcat "ETCH/" negLayer))
(axlVisibleLayer temp t)
(axlAddSelectAll) (setq sel (axlGetSelSet))
(axlClearSelSet) (setq old_shape_num (length sel)) (setq shape_old (quote nil)) (setq shape_oldAll (quote nil)) (foreach sel_e sel (setq sel_en (getq sel_e net)) (setq sel_en (getq sel_en name)) (if (nequal sel_en "") then (setq sel_el (length (getq sel_e connect))) (setq sel_eb (getq sel_e bBox)) (setq temp (getq sel_e connect)) (setq sel_ec (quote nil)) (foreach temp_e temp (setq sel_ec (cons (getq temp_e xy) sel_ec))) (setq shape_old (cons sel_ec shape_old)) (setq shape_old (cons sel_eb shape_old)) (setq shape_old (cons sel_el shape_old)) (setq shape_old (cons sel_en shape_old)) (setq shape_oldAll (cons shape_old shape_oldAll))))
(axlVisibleDesign nil)
(axlSetFindFilter ?enabled (list "noall" "Shapes") ?onButtons (list "noall" "Shapes")) (setq temp (strcat "BOUNDARY/" negLayer))
(axlVisibleLayer temp t)
(axlAddSelectAll) (setq sel (axlGetSelSet))
(axlDeleteObject sel) (setq temp (strcat "ETCH/" negLayer))
(axlVisibleLayer temp t)
(axlAddSelectAll) (setq sel (axlGetSelSet))
(axlDeleteObject sel)
(axlVisibleDesign nil)
(axlVisibleLayer "ROUTE KEEPIN" t)
(axlAddSelectAll) (setq sel (nth 0 (axlGetSelSet)))
(axlClearSelSet) (setq sel_shape (axlPolyFromDB sel))
(axlVisibleDesign nil)
(axlSetFindFilter ?enabled (list "noall" "Shapes" "Lines") ?onButtons (list "noall" "Shapes" "Lines"))
(axlVisibleLayer "ANTI ETCH/ALL" t) (setq temp (strcat "ANTI ETCH/" negLayer))
(axlVisibleLayer temp t)
(axlAddSelectAll) (setq sel_anti (axlGetSelSet))
(axlClearSelSet) (setq sel_antiEtch nil) (foreach sel_anti_e sel_anti (setq antiElmPoly (axlPolyFromDB sel_anti_e ?endCapType (quote ROUND))) (setq sel_antiEtch (append antiElmPoly sel_antiEtch))) (setq splitPolyList (axlPolyOperation sel_shape sel_antiEtch (quote ANDNOT))) (if splitPolyList then (setq temp (strcat "BOUNDARY/" negLayer)) (foreach resPoly splitPolyList (axlDBCreateShape resPoly t temp nil nil)) else ((axlMsgPut list (axlPolyErrorGet))))
(axlClearSelSet)
(axlVisibleDesign nil)
(axlSetFindFilter ?enabled (list "noall" "Shapes") ?onButtons (list "noall" "Shapes")) (setq temp (strcat "BOUNDARY/" negLayer)) (axlVisibleLayer temp t)
(axlAddSelectAll) (setq sel (axlGetSelSet)) (setq new_shape_num (length sel)) (foreach sel_e sel (foreach shape_oldAll_e shape_oldAll (setq flag 0) (setq shape_oldAll_en (nth 0 shape_oldAll_e)) (setq shape_oldAll_ec (nth 3 shape_oldAll_e)) (setq flag_i 0) (setq flag_o 0) (foreach shape_oldAll_ece shape_oldAll_ec (if (equal (axlGeoPointInShape shape_oldAll_ece sel_e) t) then (postincrement flag_i) else (postincrement flag_o))) (if (greaterp flag_i flag_o) then (axlDBAssignNet sel_e shape_oldAll_en t))))
(axlDBRefreshId nil)
(axlClearSelSet)
(axlVisibleDesign nil)
(axlSetFindFilter ?enabled (list "noall" "Shapes") ?onButtons (list "noall" "Shapes"))
(setq temp (strcat "ETCH/" negLayer))
(axlVisibleLayer temp t)
(axlAddSelectAll) (setq sel (axlGetSelSet)) (setq new_shape_num (length sel)) (setq shape_new (quote nil)) (setq shape_newAll (quote nil)) (setq flag_dummyShape 0) (foreach sel_e sel (setq sel_en (getq sel_e net)) (setq sel_en (getq sel_en name)) (if (nequal sel_en "") then (setq sel_el (length (getq sel_e connect))) (setq sel_eb (getq sel_e bBox)) (setq temp (getq sel_e connect)) (setq sel_ec (quote nil)) (foreach temp_e temp (setq sel_ec (cons (getq temp_e xy) sel_ec))) (setq shape_new (cons sel_ec shape_new)) (setq shape_new (cons sel_eb shape_new)) (setq shape_new (cons sel_el shape_new)) (setq shape_new (cons sel_en shape_new)) (setq shape_newAll (cons shape_new shape_newAll)) else (postincrement flag_dummyShape) (axlHighlightObject (getq sel_e net) t))) (setq dir (getWorkingDir)) (setq dir (strcat dir "\\log")) (createDir dir) (setq dir (strcat dir "\\autoSpliting.txt")) (setq report (outfile dir)) (setq i 0) (foreach shape_newAll_e shape_newAll (postincrement i) (fprintf report "#%2d shape is assigned to net \"%s\"\n" i (nth 0 shape_newAll_e))) (foreach shape_newAll_e shape_newAll (foreach shape_oldAll_e shape_oldAll (if (and (equal (nth 0 shape_newAll_e) (nth 0 shape_oldAll_e)) (equal (nth 1 shape_newAll_e) (nth 1 shape_oldAll_e))) then (setq shape_newAll (remove shape_newAll_e shape_newAll)) (setq shape_oldAll (remove shape_oldAll_e shape_oldAll))))) (fprintf report "\nSummary:\n\n") (fprintf report "Total shape(s) before: %d\n" old_shape_num) (fprintf report "Total shape(s) after : %d\n" new_shape_num) (fprintf report "\n") (fprintf report "Total dummy shape(s) : %d\n" flag_dummyShape) (fprintf report "\n") (if (nequal shape_newAll nil) then (foreach shape_newAll_e shape_newAll (fprintf report "Via quantity is changed in a %s shape. \n" (nth 0 shape_newAll_e)) (foreach sel_e sel (setq sel_en (getq sel_e net)) (if (equal (getq sel_en name) (nth 0 shape_newAll_e)) then (axlHighlightObject (getq sel_en net) t))))) (fprintf report "\nNote: Please check each highlighted shape after running this program.\n") (close report)
(axlClearSelSet)
(axlVisibleSet layerActive)
(axlWindowBoxSet windowBox)
(axlUIWRedraw nil)
(axlUIViewFileCreate "./log/autoSpliting.txt" "Auto-generated Shape Status" nil))))
(defun prg_autoSplitingform nil (setq report (outfile "d:/script/autoSpliting.form"))
(fprintf report "FILE_TYPE=FORM_DEFN VERSION=2 \n")
(fprintf report "FORM \n")
(fprintf report "FIXED \n")
(fprintf report "PORT 44 20 \n")
(fprintf report "HEADER \"Plane Auto-Spliting Utility\" \n")
(if (geqp (length negFilm) 2)
then (fprintf report "POPUP <negLayer>")
(setq i 0)
(foreach negFilm_e negFilm (fprintf report "\"%s\" \"%s\"" negFilm_e negFilm_e)
(postincrement i) (if (equal i (length negFilm)) then (fprintf report ". ") else (fprintf report ", "))))
(fprintf report " \n")
(fprintf report "TILE \n")
(fprintf report "FLOC 30 14 \n")
(fprintf report "FSIZE 14 2 \n")
(fprintf report "ENDFIELD \n")
(fprintf report "TEXT \"Select layer for split plane creation:\" \n")
(fprintf report "FLOC 1 1 \n")
(fprintf report "ENDTEXT \n")
(fprintf report "TEXT \"Layer will have all shapes an thermal reliefs re-built.\" \n")
(fprintf report "FLOC 6 6 \n")
(fprintf report "ENDTEXT \n")
(fprintf report "FIELD create \n")
(fprintf report "FLOC 3 14 \n")
(fprintf report "MENUBUTTON \"Create\" 12 3 \n")
(fprintf report "ENDFIELD \n")
(fprintf report "FIELD cancel \n")
(fprintf report "FLOC 17 14 \n")
(fprintf report "MENUBUTTON \"Close\" 12 3 \n")
(fprintf report "ENDFIELD \n")
(if (geqp (length negFilm) 2)
then
(fprintf report "FIELD negLayer \n")
(fprintf report "FLOC 10 3 \n")
(fprintf report "ENUMSET 8 \n")
(fprintf report "STRFILLIN 15 15 \n")
(fprintf report "POP \"negLayer\" \n")
(fprintf report "ENDFIELD \n"))
(fprintf report "ENDTILE \n")
(fprintf report "ENDFORM \n")
(fprintf report " \n")
(close report))
没有吧
修改anti etch后要重新铺一遍。
修改量小的时候,都是手修一下。
感觉好不方便,非常谢谢。
你试试铺个动态铜。
谢谢 平面分割用的铜皮就是动态的铜皮
你说的功能16.6是有的 ,但是怎么操作暂时还没有发现,帮不了你了,不好意思啊 !
这是修改Anti etch自动铺shap的Skill代码, 其中文件存放的位置可以根据个人的习惯修改。
不错
7#牛人啊!
16.6 可以在完成 anti-etch 修改後 , 透過 Splite plane 的操作 , 自董記住原來的銅所歸屬的 Net 來自動鋪同.
不然映陽科技也有提供類似的 skill 可以用
谢谢啊 一定会试试的
哥 你这代码运行后提示这个错误啊 知道咋回事不?E- *Error* fprintf: argument #1 should be an I/O port (type template = "ptg") - nil
还不会用skill呢
Cadence Allegro 培训套装,视频教学,直观易学
上一篇:求助:如何在更改尽量少的基础上更换板框?
下一篇:allegro 16.3 无意间关闭visibility标签页,如何才能重新打开?