Cadence Skill 论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
楼主: vivienluo

[初级篇] 第9课:skill中对文件的操作方法详解——简单SKILL小功能的实现

  [复制链接]
发表于 2019-1-21 10:12:32 | 显示全部楼层
浩浩浩浩奥号好啊后好啊后好啊后
发表于 2019-1-23 17:05:01 | 显示全部楼层
相见恨晚的帖子,不知道还有没有高级篇。
交作业
  1. ;   Change protel to allegro
  2. ;        Author WWZZSS
  3. ;        Version 1.00
  4. ;        Date 2019/01/23

  5. axlCmdRegister("p2a" 'change_p2A)
  6. filePath = axlDMFileBrowse(nil nil ?optFilters "Protel Net File(*.net)|*.net|")  ;通过axlDMFileBrowse手动选择网表文件路径,将选择的路径传递给变量filePath
  7. protelNet = infile(filePath)
  8. allegroNet = outfile("./p2a.txt")

  9. procedure( change_p2A()    ;@optional str
  10.      namelist = list()   ;定义一个空的列表namelist
  11.      m = 0 o = 0         ;定义两个初始值为0的计数变量
  12. while( gets(str protelNet)  ;while循环 按行读取内容包括换行符\n
  13.     str = car(parseString(str))      ; parseString将str按\n分成list,car取list中第一个值并赋予str
  14.     namelist = cons(str namelist)         ; 将每个读取的str放进空的namelist中,注意此时的namelist是反的[]
  15.   when( str == "]"    ;当读取到]时即是第一个protel里[]中的内容,此时格式为  ] 100nF C0603 C1  [ printf("%L" namelist)确认
  16.          m = m +1     ; []中为packages内容应打印 $PACKAGES 但每次遇见]都会打印所以计数,只在第一次出现时打印 可用m++替代
  17.              when( m == 1 ; 条件判断,只在第一次遇见]时打印$PACKAGES 暂未想出好的替代方法
  18.                  fprintf(allegroNet "$PACKAGES\n") ;打印 $PACKAGES
  19.                  )        ; 此条件判断独立于下面内容
  20.          namelist1 = namelist        ;将列表namelist 赋予namelist1
  21.          namelist = list()                ;清空列表namelist
  22.          namelist1 = remove("[" namelist1)  ;移除[
  23.          namelist1 = remove("]" namelist1)  ;移除]
  24.                  namelist1 = reverse(namelist1)     ;反转列表
  25.                  SymVale = nth(2 namelist1) ;取
  26.              SymPkg = nth(1 namelist1) ;值 
  27.              SymRef = nth(0 namelist1)
  28.                   fprintf(allegroNet "'%s' ! '%s' ! '%s'; %s\n" SymPkg SymPkg SymVale SymRef );格式比较固定用此方法输出
  29.                   namelist1 = list();清空列表namelist1
  30.         )  ;end when
  31.   when( str == ")"   ;()内容为net,当取值到)时开始处理
  32.          o = o +1   
  33.              when( o == 1
  34.                  fprintf(allegroNet "$NETS")
  35.                   )   ;以上同打印$PACKAGES
  36.              namelist2 = namelist              ;此
  37.                  namelist = list()                 ;处
  38.                  namelist2 = remove("(" namelist2) ;同
  39.                  namelist2 = remove(")" namelist2) ;上一when判断,注意此时列表为反但是并没有reverse
  40.                  together = list()  ;定义一个空的列表together
  41.                  foreach( i namelist2            
  42.                   apartlist = parseString(i "-") ; parseString将namelist2中的数按-分开为list,如C1-1变为("C1" "1") 并赋值给apartlist
  43.                   individual = buildString(apartlist ".") ;buildString将apartlist中间加"."整合成字符串C1.1 ,遍历整个namelist2
  44.                   together = cons(individual together);将字符串放入together列表中,此时上面没有反转的列表刚好反转过来
  45.                         );此foreach循环目地是将"-"替换为"."
  46.                                
  47.                  when( length(together) < 6   ;NETs内容的格式输出,小于6(包括net名)个
  48.                  fprintf(allegroNet "\n'%s'; " car(together));输出第一个net名,注意\n的使用
  49.                      together = remove(car(together) together);去除net名,便于下面循环,此处可用 together = cdr(together) 代替
  50.                      foreach( i together
  51.                          fprintf(allegroNet " %s" i)
  52.                             )
  53.                   ) ;循环输出net数小于5个时的内容                         
  54.                  
  55.                  when( length(together) >= 6  ;NETs内容的格式输出,大于等于6(包括net名)个
  56.                      fprintf(allegroNet "\n'%s'; " car(together)); 输出net名
  57.                      together = remove(car(together) together) ;此处可用 together = cdr(together) 代替
  58.                          for( j 1 5                                ;NETS等于5个时循环
  59.                           fprintf(allegroNet " %s" car(together))
  60.                       together = remove(car(together) together);每循环一次则消除一个输出的net,此处可用 together = cdr(together) 代替
  61.                             )
  62.                      fprintf(allegroNet ",\n\t  ");等于5个时循环的输出格式
  63.                          
  64.                          num = 0                      ;定义一个初始值为0的计数变量
  65.                          foreach( k together          ;将together剩下的用foreach循环输出
  66.                           fprintf(allegroNet " %s" k)
  67.                           num = num + 1               ; 可用num++替代
  68.                                when( num == 5         ; 当存在第五个元素时
  69.                                              fprintf(allegroNet ",\n\t  ") ;输出格式
  70.                                              num = 0          ; 清空计数器,继续计数查看剩下内容并决定输出格式
  71.                                        )
  72.                                 )
  73.                      )
  74.                          ;上面两个when的判断< 6, >=6可以用if语句替代
  75.                  together = list();清空together
  76.         );end when

  77.   );end while
  78.     fprintf(allegroNet "\n$END\n")
  79.     close(protelNet)
  80.     close(allegroNet)       
  81. ); end procedure
复制代码
谢谢罗老师!

本帖子中包含更多资源

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

x
发表于 2019-1-25 15:39:01 | 显示全部楼层
上一课已学,加油加油
发表于 2019-2-12 14:40:23 | 显示全部楼层
学习一下 支持罗老师!@!!!
发表于 2019-2-13 06:17:33 | 显示全部楼层
看一看 多谢
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|网站地图|Cadence Skill 论坛 ( 蜀ICP备13024417号 )

GMT+8, 2024-11-24 02:16 , Processed in 0.122952 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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