找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 2309|回复: 37
打印 上一主题 下一主题

【分享源代碼】比較兩個Board file符號差異工具/比较两份PCB文件的零件差异

  [复制链接]

57

主题

1857

帖子

7919

积分

六级会员(60)

Rank: 6Rank: 6

积分
7919
跳转到指定楼层
1#
发表于 2016-2-17 09:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 XYX365 于 2016-2-17 15:17 编辑

【分享源代碼】比較兩個Board file符號差異工具/比较两份PCB文件的零件差异

;
;FileName:        
;Load:                load("fCS.il")
;Command:        cs
;
;功能:比較兩個PCB的Symbols差異
;使用方法:
;        1.開起一個新的brd
;        2.執行cs
;        3.會提示讀取一個舊的brd
;        4.選擇檔案後,再選擇開啟之後就開始比較,直到輸出結果
;
;; 程式特色:
;        1.源代碼分享,讓所有人都可以依照自己的方式加入其他功能,
;                例如加入輸出檔案為excel檔
;                或是其他功能,自己想像.






  1. ;
  2. ;FileName:        
  3. ;Load:                load("fCS.il")
  4. ;Command:        cs
  5. ;
  6. ;功能:比較兩個PCB的Symbols差異
  7. ;使用方法:
  8. ;        1.開起一個新的brd
  9. ;        2.執行cs
  10. ;        3.會提示讀取一個舊的brd
  11. ;        4.選擇檔案後,再選擇開啟之後就開始比較,直到輸出結果
  12. ;
  13. ;; 程式特色:
  14. ;        1.源代碼分享,讓所有人都可以依照自己的方式加入其他功能,
  15. ;                例如加入輸出檔案為excel檔
  16. ;                或是其他功能,自己想像.
  17. axlCmdRegister("cs" 'fnCompareSymbol ?cmdType "general")

  18. procedure(fnCompareSymbol()
  19.         prog((tBrdPathNew tBrdOld tBrdPathOld pPort tCmd tNewFile tOldFile lNewList lOldList)
  20.                
  21.                 ;取新舊brd檔案名稱
  22.                 axlMsgPut("M-Please select a brd file:")
  23.                 tBrdPathOld = axlDMFileBrowse("ALLEGRO_BRD" nil ?title "Compare Symbol" ?optFilters "Board file(*.brd)|*.brd|") ;瀏覽舊的brd
  24.                 unless(tBrdPathOld
  25.                         return(nil)
  26.                 )
  27.                 tBrdNew = axlCurrentDesign() ;目前所開啟的brd
  28.                 tBrdPathNew = strcat(simplifyFilename(tBrdNew) ".brd")
  29.                 ;要導出比較的資料
  30.                 fnCSExtractaData(tBrdPathNew tBrdPathOld)
  31.                
  32.                 ;讀取新brd所導出的資料Comp
  33.                 tNewFile = strcat(getWorkingDir() "/" cadr(axlDMFileParts(tBrdPathNew)) "_comp.txt")
  34.                 lNewCompList = fnCSReadFile(tNewFile)
  35.                 deleteFile(tNewFile)
  36.                                 
  37.                 ;讀取舊brd所導出的資料Comp
  38.                 tOldFile = strcat(getWorkingDir() "/" cadr(axlDMFileParts(tBrdPathOld)) "_comp.txt")
  39.                 lOldCompList = fnCSReadFile(tOldFile)
  40.                 deleteFile(tOldFile)
  41.                
  42.                 ;讀取新brd所導出的資料Sym
  43.                 tNewFile = strcat(getWorkingDir() "/" cadr(axlDMFileParts(tBrdPathNew)) "_sym.txt")
  44.                 lNewSymList = fnCSReadFile(tNewFile)
  45.                 deleteFile(tNewFile)
  46.                                 
  47.                 ;讀取舊brd所導出的資料Sym
  48.                 tOldFile = strcat(getWorkingDir() "/" cadr(axlDMFileParts(tBrdPathOld)) "_sym.txt")
  49.                 lOldSymList = fnCSReadFile(tOldFile)
  50.                 deleteFile(tOldFile)
  51.                
  52.                 ;比較新舊brd差異並輸出到檔案
  53.                 fnCSCompareData(tBrdPathNew tBrdPathOld lNewCompList lOldCompList lNewSymList lOldSymList)
  54.         )
  55. )
  56. procedure(fnCSReadFile(tFile)
  57.         let((pPort tLine lLines)
  58.                 if(tFile && isFile(tFile) then
  59.                         pPort = infile(tFile)
  60.                         rexCompile(".$")
  61.                         for(x 1 2 ;讀取前面兩行,這兩行不會處理
  62.                                 gets(tLine pPort)
  63.                         )
  64.                         while(gets(tLine pPort)
  65.                                 unless(blankstrp(tLine)
  66.                                         lLines = cons(rexReplace(tLine "" 0) lLines)
  67.                                 )
  68.                         )
  69.                         close(pPort)
  70.                         sort(lLines nil) ;排序所有資料
  71.                 else
  72.                         axlUIConfirm("E- Misssing file.")
  73.                 )
  74.         )
  75. )
  76. procedure(fnCSCompareData(tBrdPathNew tBrdPathOld lNewCompList lOldCompList lNewSymList lOldSymList)
  77.         let((oNewComp oOldComp oNewSym oOldSym lLines tRefDes tPartNum tValue tTol tDeviceType tXY tIsMirrored
  78.                 tRotation tMode tSymName)
  79.                 ;將Comp的Data存放到Table
  80.                 for(x 0 1
  81.                         if(zerop(x) then
  82.                                 oNewComp = makeTable("NEWCOMPDATA" nil)
  83.                         else
  84.                                 oOldComp = makeTable("OLDCOMPDATA" nil)
  85.                         )
  86.                         rexCompile("!!")
  87.                         foreach(tLine nth(x list(lNewCompList lOldCompList))
  88.                                 tLine = rexReplace(tLine "! !" 0)
  89.                                 lLines = parseString(tLine "!")
  90.                                 
  91.                                 tRefDes = cadr(lLines)
  92.                                 tPartNum = caddr(lLines)
  93.                                 tValue = nth(3 lLines)
  94.                                 tTol = nth(4 lLines)
  95.                                 tDeviceType = nth(6 lLines)
  96.                                                                
  97.                                 if(zerop(x) then
  98.                                         oNewComp[tRefDes] = list(tPartNum tValue tTol tDeviceType)
  99.                                 else
  100.                                         oOldComp[tRefDes] = list(tPartNum tValue tTol tDeviceType)
  101.                                 )
  102.                         )
  103.                 )
  104.                
  105.                 ;將Sym的Data存放到Table
  106.                 for(x 0 1
  107.                         if(zerop(x) then
  108.                                 oNewSym = makeTable("NEWSYMDATA" nil)
  109.                         else
  110.                                 oOldSym = makeTable("OLDSYMDATA" nil)
  111.                         )
  112.                         rexCompile("!!")
  113.                         foreach(tLine nth(x list(lNewSymList lOldSymList))
  114.                                 tLine = rexReplace(tLine "! !" 0)
  115.                                 lLines = parseString(tLine "!")
  116.                                 
  117.                                 tRefDes = cadr(lLines)
  118.                                 tXY = strcat("(" caddr(lLines) "," nth(3 lLines) ")")
  119.                                 tIsMirrored = nth(4 lLines)
  120.                                 if(tIsMirrored == "YES" then
  121.                                         tIsMirrored = "B"
  122.                                 else
  123.                                         tIsMirrored = "T"
  124.                                 )
  125.                                 tRotation = sprintf(nil "%.2f" readstring(nth(5 lLines)))
  126.                                 tMode = nth(6 lLines)
  127.                                 tSymName = nth(7 lLines)
  128.                                 
  129.                                 if(zerop(x) then
  130.                                         tPartNum = car(oNewComp[tRefDes])
  131.                                         unless(tPartNum
  132.                                                 tPartNum = ""
  133.                                         )
  134.                                         oNewSym[tRefDes] = list(tXY tIsMirrored tRotation tMode tSymName tPartNum)
  135.                                 else
  136.                                         tPartNum = car(oOldComp[tRefDes])
  137.                                         unless(tPartNum
  138.                                                 tPartNum = ""
  139.                                         )
  140.                                         oOldSym[tRefDes] = list(tXY tIsMirrored tRotation tMode tSymName tPartNum)
  141.                                 )
  142.                         )
  143.                 )
  144.                 fnCSOutputData(tBrdPathNew tBrdPathOld oNewComp oOldComp oNewSym oOldSym)
  145.         )
  146. )
  147. procedure(fnCSOutputData(tBrdPathNew tBrdPathOld oNewComp oOldComp oNewSym oOldSym)
  148.         let((lAdded lDeleted lChanged tFile pPort xItem tOne)
  149.                 ;判斷是否有新增資料
  150.                 foreach(tRefdes oNewSym
  151.                         unless(oOldSym[tRefdes]
  152.                                 lAdded = cons(tRefdes lAdded)
  153.                         )
  154.                 )
  155.                 lAdded = sort(lAdded nil)
  156.                
  157.                 ;判斷是否有減少資料
  158.                 foreach(tRefdes oOldSym
  159.                         unless(oNewSym[tRefdes]
  160.                                 lDeleted = cons(tRefdes lDeleted)
  161.                         )
  162.                 )
  163.                 lDeleted = sort(lDeleted nil)
  164.                
  165.                 ;判斷是否有改變資料
  166.                 foreach(tRefdes oNewSym
  167.                         when(oOldSym[tRefdes]
  168.                                 unless(oNewSym[tRefdes] == oOldSym[tRefdes]
  169.                                         lChanged = cons(tRefdes lChanged)
  170.                                 )
  171.                         )
  172.                 )
  173.                 lChanged = sort(lChanged nil)
  174.                
  175.                 ;輸出資料到檔案
  176.                 drain()
  177.                 tFile = strcat(getWorkingDir() "/" cadr(axlDMFileParts(tBrdPathNew)) "_OldNew.rpt")
  178.                 pPort = outfile(tFile)
  179.                 ;檔案顯示的標題
  180.                 fprintf(pPort "Compare Symbol report\n")
  181.                 fprintf(pPort "Date: %s\n" getCurrentTime())
  182.                 fprintf(pPort "%s.brd [Old]\n" cadr(axlDMFileParts(tBrdPathOld)))
  183.                 fprintf(pPort "%s.brd [New]\n\n" cadr(axlDMFileParts(tBrdPathNew)))
  184.                                                                
  185.                 fprintf(pPort "%s\n" "===============================================================================================================================")
  186.                 fprintf(pPort "%4s %-5s %-8s %20s %-20s %-4s %6s %-25s %-17s %-40s\n"  "#" "Brd" "Type" "Refdes" strcat("XY(" car(axlDBGetDesignUnits()) ")") "Side" "Rot" "Symtype" "Part number" "Device type")
  187.                 fprintf(pPort "%s\n" "===============================================================================================================================")
  188.                 xItem = 1
  189.                 ;輸出新增的資料到檔案
  190.                 foreach(tOne lAdded
  191.                         fprintf(pPort "%4d %-5s %-8s %20s %-20s %-4s %6s %-25s %-17s %-40s\n" xItem "[New]" "Added:" tOne car(oNewSym[tOne]) cadr(oNewSym[tOne]) caddr(oNewSym[tOne]) nth(4 oNewSym[tOne]) nth(5 oNewSym[tOne]) _ssfnEnsureNonNilValue(nth(3 oNewComp[tOne])))
  192.                         xItem++
  193.                 )
  194.                 fprintf(pPort "\n")
  195.                 ;輸出減少的資料到檔案
  196.                 xItem = 1
  197.                 foreach(tOne lDeleted
  198.                         fprintf(pPort "%4d %-5s %-8s %20s %-20s %-4s %6s %-25s %-17s %-40s\n" xItem "[Old]" "Deleted:" tOne car(oOldSym[tOne]) cadr(oOldSym[tOne]) caddr(oOldSym[tOne]) nth(4 oOldSym[tOne]) nth(5 oOldSym[tOne]) _ssfnEnsureNonNilValue(nth(3 oOldComp[tOne])))
  199.                         xItem++
  200.                 )
  201.                 fprintf(pPort "\n")
  202.                 ;輸出變更的資料到檔案
  203.                 xItem = 1
  204.                 foreach(tOne lChanged
  205.                         fprintf(pPort "%4d %-5s %-8s %20s %-20s %-4s %6s %-25s %-17s %-40s\n" xItem "[New]" "Changed:" tOne car(oNewSym[tOne]) cadr(oNewSym[tOne]) caddr(oNewSym[tOne]) nth(4 oNewSym[tOne]) nth(5 oNewSym[tOne]) _ssfnEnsureNonNilValue(nth(3 oNewComp[tOne])))
  206.                         fprintf(pPort "%4d %-5s %-8s %20s %-20s %-4s %6s %-25s %-17s %-40s\n" xItem "[Old]" "Changed:" tOne car(oOldSym[tOne]) cadr(oOldSym[tOne]) caddr(oOldSym[tOne]) nth(4 oOldSym[tOne]) nth(5 oOldSym[tOne]) _ssfnEnsureNonNilValue(nth(3 oOldComp[tOne])))
  207.                         fprintf(pPort "\n")
  208.                         xItem++
  209.                 )
  210.                 ;輸出總數量的訊息
  211.                 fprintf(pPort "\n\nTotal: %5d\n\n" length(lAdded)+length(lDeleted)+length(lChanged))
  212.                 fprintf(pPort "Summary:\n")
  213.                 fprintf(pPort "  %d Added symbols\n" length(lAdded))
  214.                 fprintf(pPort "  %d Deleted symbols\n" length(lDeleted))
  215.                 fprintf(pPort "  %d Changed symbols\n\n" length(lChanged))
  216.                 close(pPort)
  217.                
  218.                 axlUIViewFileCreate(tFile "Report Window" t (120:60)) ;觀看輸出結果
  219.         )
  220. )
  221. procedure(_ssfnEnsureNonNilValue(val)
  222.         unless(val
  223.                 val = ""
  224.         )
  225.         val
  226. )
  227. procedure(fnCSExtractaData(tBrdPathNew tBrdPathOld)
  228.         let((tFile pPort tBrdName tCmd)
  229.                 ;要導出比較的資料
  230.                 tFile = strcat(getWorkingDir() "/symbol.view")
  231.                 pPort = outfile(tFile)
  232.                 fprintf(pPort "SYMBOL\n\n")
  233.                 fprintf(pPort "REFDES\n")
  234.                 fprintf(pPort "SYM_X\n")
  235.                 fprintf(pPort "SYM_Y\n")
  236.                 fprintf(pPort "SYM_MIRROR\n")
  237.                 fprintf(pPort "SYM_ROTATE\n")
  238.                 fprintf(pPort "SYM_TYPE\n")
  239.                 fprintf(pPort "SYM_NAME\n")
  240.                 fprintf(pPort "END\n")
  241.                 fprintf(pPort "COMPONENT\n")
  242.                 fprintf(pPort "REFDES\n")
  243.                 fprintf(pPort "COMP_PART_NUMBER\n")
  244.                 fprintf(pPort "COMP_VALUE\n")
  245.                 fprintf(pPort "COMP_TOL\n")
  246.                 fprintf(pPort "COMP_PACKAGE\n")
  247.                 fprintf(pPort "COMP_DEVICE_TYPE\n")
  248.                 fprintf(pPort "COMP_CLASS\n")
  249.                 fprintf(pPort "COMP_DEVICE_LABEL\n")
  250.                 fprintf(pPort "END\n")
  251.                 close(pPort)
  252.                
  253.                 ;導出新舊brd的資料,使用axlRunBatchDBProgram()就不會開啟cmd視窗
  254.                 foreach(tBrdPath list(tBrdPathNew tBrdPathOld)
  255.                         tBrdName = cadr(axlDMFileParts(tBrdPath))
  256.                         sprintf(tCmd "extracta %L %s %s_sym.txt %s_comp.txt" tBrdPath tFile tBrdName tBrdName)
  257.                         axlRunBatchDBProgram("extracta" tCmd ?silent t ?noUnload t ?reloadDB nil)
  258.                         deleteFile(strcat(getWorkingDir() "/extract.log"))
  259.                 )
  260.                 deleteFile(tFile)
  261.         )
  262. )
复制代码

本帖子中包含更多资源

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

x

评分

参与人数 3威望 +14 收起 理由
ginooolu + 2 很给力!
deargds + 10 很给力!
penny190 + 2 支持!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏7 支持!支持!1 反对!反对!

57

主题

1181

帖子

1807

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1807
推荐
发表于 2016-2-17 10:45 | 只看该作者
本帖最后由 JIMDENG 于 2016-2-17 10:58 编辑

测试了一下,两个文件中元件坐标变动了,能直观的显示出来!很实用!新年的好礼物!谢谢楼主!

1

主题

30

帖子

1247

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1247
推荐
发表于 2016-4-12 14:10 | 只看该作者
這個skill比較出來的資料比較完整,又有原始碼可以研究
感謝感謝

0

主题

87

帖子

555

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
555
推荐
发表于 2016-2-21 20:18 | 只看该作者
這功能很不錯用
小弟常常在比對檔案阿
這是太謝謝了

116

主题

960

帖子

5983

积分

五级会员(50)

Rank: 5

积分
5983
5#
发表于 2016-2-17 15:51 | 只看该作者
謝謝大大 ~~ 又有新分享喔

1

主题

66

帖子

1062

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1062
6#
发表于 2016-2-17 15:54 | 只看该作者
真的这么好吗?谢谢

10

主题

126

帖子

1636

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1636
7#
发表于 2016-2-17 16:31 | 只看该作者
好东西,谢谢楼主分享!!!

26

主题

318

帖子

971

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
971
8#
发表于 2016-2-17 17:06 | 只看该作者
看看

98

主题

1043

帖子

5951

积分

五级会员(50)

Rank: 5

积分
5951
9#
发表于 2016-2-18 08:47 | 只看该作者
ding xiexie.

0

主题

19

帖子

188

积分

二级会员(20)

Rank: 2Rank: 2

积分
188
10#
发表于 2016-2-18 14:32 | 只看该作者
好东西

15

主题

346

帖子

3486

积分

五级会员(50)

Rank: 5

积分
3486
11#
发表于 2016-2-19 14:39 | 只看该作者
不错,赞一个!
skype:i_woods@hotmail.com

1

主题

49

帖子

464

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
464
12#
发表于 2016-2-19 14:53 | 只看该作者
感謝分享~

65

主题

297

帖子

904

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
904
13#
发表于 2016-2-21 08:38 | 只看该作者
看看 学习学习学习学习

1

主题

17

帖子

313

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
313
14#
发表于 2016-2-22 14:23 | 只看该作者
感谢分享,楼主威武

14

主题

314

帖子

549

积分

认证会员B类

Rank: 25

积分
549
15#
发表于 2016-2-23 20:20 | 只看该作者

好东西,谢谢楼主分享!!!

4

主题

222

帖子

688

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
688
16#
发表于 2016-3-4 16:43 | 只看该作者
厉害 支持哦  学习一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2024-11-25 17:29 , Processed in 0.075138 second(s), 39 queries , Gzip On.

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

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

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