?? etch_cross_plane.il
字號:
;load("etch_cross_plane.il")
;Revision:1.0
;Writen: WG2005
;date:2009-12-26
;功能查找走線跨平面
;可實現(xiàn)走線跨分割有兩種方法,其一:判斷線段某點是否在銅皮上。其二:判斷線段的box內(nèi)銅皮個數(shù)是否不等于1。走線如在平面上,他的box內(nèi)銅皮個數(shù)應該是1,利用這個進行判斷。
;本程序詳細講解利用第一種方法實現(xiàn)走線跨分割的查找。
axlCmdRegister("ecp" 'create_etch_cross_form ) ;定義執(zhí)行此程序命令的名字為“ecp”
(defun create_etch_cross_form () ;創(chuàng)建面板
FORMFILE = outfile("./c_e_c.form") ;輸出面板
fprintf( FORMFILE "FILE_TYPE=FORM_DEFN VERSION=2\n") ;面板固定格式
fprintf( FORMFILE "FORM\n") ;面板固定格式
fprintf( FORMFILE "FIXED\n") ;面板固定格式
fprintf( FORMFILE "PORT 55 30\n") ;定義面板可視大小
fprintf( FORMFILE "HEADER \"Check Etch Cross Plane\"\n") ;顯示面板標題
fprintf( FORMFILE "\n")
fprintf( FORMFILE "TILE\n") ;面板固定格式
fprintf( FORMFILE "TEXT \"Select Etch Layer:\"blue_a \n") ;面板顯示文字“Select Etch Layer” 并定義顯示的顏色 如果去掉blue_a顯示的是傳統(tǒng)黑色
fprintf( FORMFILE "TLOC 2 1\n") ;文字在面板上顯示的X和Y坐標
fprintf( FORMFILE "ENDTEXT\n\n") ;結(jié)束此段文字語句
fprintf( FORMFILE "FIELD etch_list\n") ;顯示Etch Layer 名字表格 此“etch_list”將在后面程序中調(diào)用
fprintf( FORMFILE "FLOC 2 3\n") ;表格在面板上顯示的X和Y坐標
fprintf( FORMFILE "LIST \"\" 20 8\n") ;表格在面板上顯示寬度和長度范圍
fprintf( FORMFILE "ENDFIELD\n\n") ;結(jié)束此段表格語句
fprintf( FORMFILE "TEXT \"Select Plane Layer:\"blue_b \n") ;顯示文字“Select Plane Layer”
fprintf( FORMFILE "TLOC 28 1\n") ;內(nèi)容同上,下如有內(nèi)容意義同樣不在描述
fprintf( FORMFILE "ENDTEXT\n\n")
fprintf( FORMFILE "FIELD Plane_list\n") ;顯示Plane Layer 名字表格
fprintf( FORMFILE "FLOC 28 3\n")
fprintf( FORMFILE "LIST \"\" 20 8\n")
fprintf( FORMFILE "ENDFIELD\n\n")
fprintf( FORMFILE "GROUP \"Display Select Layer\" \n") ;顯示一個框 標題為Display Select Layer
fprintf( FORMFILE "GLOC 2 20\n") ;顯示框的X和Y坐標
fprintf( FORMFILE "GSIZE 45 8\n") ;顯示框的寬度和長度范圍
fprintf( FORMFILE "ENDGROUP\n")
fprintf( FORMFILE "TEXT \"Etch Layer ->:\"blue_c \n") ;顯示文字“Etch Layer ->:”
fprintf( FORMFILE "TLOC 4 22\n")
fprintf( FORMFILE "ENDTEXT\n\n")
fprintf(FORMFILE "TEXT\n") ;顯示選中的ETCH 層名字
fprintf(FORMFILE "TLOC 15 22\n")
fprintf(FORMFILE "INFO s_e_layer 30\n")
fprintf(FORMFILE "FSIZE 30 2\n")
fprintf(FORMFILE "ENDTEXT\n")
fprintf( FORMFILE "TEXT \"Plane Layer ->:\"blue_d \n") ;顯示文字“Plane Layer ->:”
fprintf( FORMFILE "TLOC 4 25\n")
fprintf( FORMFILE "ENDTEXT\n\n")
fprintf(FORMFILE "TEXT\n") ;顯示選中的Plane 層名字
fprintf(FORMFILE "TLOC 15 25\n")
fprintf(FORMFILE "INFO s_p_layey 30\n")
fprintf(FORMFILE "FSIZE 30 2\n")
fprintf(FORMFILE "ENDTEXT\n")
fprintf( FORMFILE "FIELD sel_check\n") ;Check按鈕
fprintf( FORMFILE "FLOC 10 32\n")
fprintf( FORMFILE "MENUBUTTON \"Check\" 9 3\n") ;顯示Check 并定義按鈕的長度和寬度
fprintf( FORMFILE "ENDFIELD\n")
fprintf( FORMFILE "FIELD exit\n") ;退出按鈕
fprintf( FORMFILE "FLOC 32 32\n")
fprintf( FORMFILE "MENUBUTTON \"Exit\" 9 3\n") ;顯示Exit
fprintf( FORMFILE "ENDFIELD\n")
fprintf( FORMFILE "\n")
fprintf( FORMFILE "ENDTILE\n") ;結(jié)束TILE
fprintf( FORMFILE "\n")
fprintf( FORMFILE "ENDFORM\n") ;結(jié)束FORM
close( FORMFILE) ;關(guān)閉FORMFILE
form = (axlFormCreate (gensym) "c_e_c.form" `("E" "OUTER") `c_etch_Callback t) ;創(chuàng)建窗口 并將程序帶到下面c_etch_Callback中
axlFormDisplay( form) ;顯示窗口
select_layername() ;調(diào)用下面提取PCB板層的名字程序
axlFormColorize( form "blue_a" 'text 'blue) ;定義面板顯示的文字用藍色 根據(jù)個人習慣可以更改
axlFormColorize( form "blue_b" 'text 'blue)
axlFormColorize( form "blue_c" 'text 'blue)
axlFormColorize( form "blue_d" 'text 'blue)
axlFormColorize( form "s_e_layer" 'text 'red) ;定義面板選中的ETCH層用紅色顯示
axlFormColorize( form "s_p_layey" 'text 'red) ;定義面板選中的PALNE層用紅色顯示
etchlist = "ETCH/TOP" ;定義初始走線層為ETCH/TOP
planelist = "ETCH/BOTTOM" ;定義初始走線層為ETCH/BOTTOM
axlUIWPrint(form "Writen : WG2005 Revision : REV2.0 date : 2009-12-26") ;在面板窗體的下面顯示一些信息
deleteFile( "c_e_c.form") ;刪除面板文件
);defun
(defun c_etch_Callback (form) ;連接上面指定的程序form = (axlFormCreate (gensym) "c_e_c.form" `("E" "OUTER") `c_anti_Callback t) 的“c_anti_Callback”
(prog ()
case( form->curField ; C語言中也提到case用法,意義大致相同 中文不好表達意義,個人理想選擇相匹配的執(zhí)行
("etch_list" ;定義面板"etch_list"需要執(zhí)行什么命令
etchlist = form->curValue
axlFormSetField( form "s_e_layer" etchlist) ;如果選中etch_list里面一個層將顯示到上面定義的s_e_layer中
axlVisibleDesign(nil) ;關(guān)閉所有層顯示
axlVisibleLayer( planelist t ) ;顯示選中Plane層面
axlVisibleLayer( etchlist t ) ;顯示選中Etch層面
axlVisibleUpdate(t) ;刷新顯示層
t)
("Plane_list" ;定義面板"Plane_list"需要執(zhí)行什么命令
planelist = form->curValue
axlFormSetField( form "s_p_layey" planelist) ;如果選中planelist里面一個層將顯示到上面定義的s_p_layey中
axlVisibleDesign(nil) ;關(guān)閉所有層顯示
axlVisibleLayer( planelist t ) ;顯示選中Plane層面
axlVisibleLayer( etchlist t ) ;顯示選中Etch層面
axlVisibleUpdate(t) ;刷新顯示層
t) ;括號內(nèi)大致意思是:Plane層名字 顯示到上面定義的Plane_list中,如果選中etch_list一個層名將顯示上面定義的s_p_layey中
("sel_check" ;面板Check對應的按鈕命令
e_c_plane() ;調(diào)用Check Cline 跨平面主程序
t)
("exit" ;面板exit對應的按鈕命令
axlFormClose( form) ;關(guān)閉面板窗口
t)
);case
);prog
);defun
;下面程序?qū)⒌玫綄用?
defun( select_layername () ;上面鏈接名字
prog( ()
etchparam = axlGetParam("paramLayerGroup:ETCH")
l_layers = etchparam->groupMembers ;得到層名 如 ("TOP" "GND02" "POWER03" "BOTTOM")
etchlist = nil ;定義list為nil
planelist = nil
foreach(nlayer l_layers ;將層的名字逐個循環(huán),待后面進行判斷是平面層還是走線層
layerlista = strcat("ETCH/" nlayer ) ;由于上面得到的層名字是("TOP" "GND02" "POWER03" "BOTTOM") 所以通過strcat將"ETCH/"插入layerlista中變成 ("ETCH/TOP" "ETCH/GND02" "ETCH/POWER03" "ETCH/BOTTOM")
when(axlDBGetLayerType(layerlista)=="PLANE" ;利用when語法判斷如果得到的層是PLANE屬性的將層名字放到planelist中,必須在此程序前定義planelist = nil
planelist = cons(layerlista planelist) ;cons( item list ),將單個元素插入到列表的最前面成為列表的一個元素;
);end when 結(jié)束when PLANE判斷
when(axlDBGetLayerType(layerlista)=="CONDUCTOR" ;判斷如果得到的層是CONDUCTOR屬性的將層名字放到etchlist中,必須在此程序前定義etchlist = nil
etchlist = cons(layerlista etchlist)
) ;end when 結(jié)束when CONDUCTOR判斷
);foreach 結(jié)束foreach判斷
etchlist = reverse(etchlist) ;reverse 將層名字反向排序,便于習慣看法,如果不加reverse也可以的,只是顯示效果是("ETCH/BOTTOM" "ETCH/TOP")
planelist = reverse(planelist) ;顯示效果是("ETCH/GND02" "ETCH/POWER03")
axlFormSetField( form "etch_list" etchlist) ;最終在面板窗口etch_list欄里面顯示所有走線層名字
axlFormSetField( form "Plane_list" planelist) ;在面板窗口Plane_list欄里面顯示所有平面層名字
);prog
);defun
;執(zhí)行走線跨平面主程序
(defun e_c_plane ()
(prog ()
axlSetFindFilter(?enabled '(noall clinesegs) ?onButtons '(noall clinesegs)) ;定義Find面板中 clinesegs 勾選上,對clinesegs進行操作
clines_a = axlGetSelSet(axlAddSelectAll()) ;指定clines_a = “獲得選擇對象”
axlSetFindFilter(?enabled '(noall shapes) ?onButtons '(noall shapes)) ;定義Find面板中 Shape
shape_a = axlGetSelSet(axlAddSelectAll()) ;指定shape_a = “獲得選擇對象”
axlClearSelSet() ;清除所選擇的對象 養(yǎng)成良好習慣 避免誤操作
axlHighlightObject(clines_a) ;高亮所有走線 程序用了反高亮法
foreach( Cline clines_a ;逐個循環(huán)判斷每段走線
Clinc_xy = Cline->startEnd ;獲得每段Cline的起始和終點坐標 如得到 Clinc_xy =("2009.12 2010.26" "2010.10 2010.26")
c_xy_a = car(Clinc_xy) ;獲得每段Cline起始坐標 如c_xy_a = ("2009.12 2010.26")
c_xy_b = cadr(Clinc_xy) ;獲得每段Cline的終點坐標 如c_xy_b = ("2010.10 2010.26")
foreach( shape shape_a ;逐個循環(huán)每塊銅皮
if(axlGeoPointInShape( c_xy_b shape) && axlGeoPointInShape( c_xy_a shape) ;判斷shape上面得到的起始和終點坐標是否有走線
then ;如果上面的假設成立 將執(zhí)行下面命令
axlDehighlightObject(Cline) ;如果上面的假設成立 將執(zhí)行去亮所有走線 ;那么剩下高亮的部分就是跨分割的走線
);end if(axlGeoPointInShape( c_xy_b shape) 結(jié)束if的判斷
);end foreach( Shape shape_a 結(jié)束foreac的循環(huán)
);end foreach( Cline clines_a
);prog
);defun ;程序結(jié)束 上面的解釋可能不是佷完全,如果能給您帶來一點點的幫助,記住幫忙頂一下,多謝!
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -