浩浩浩浩奥号好啊后好啊后好啊后
相见恨晚的帖子,不知道还有没有高级篇。
交作业
; Change protel to allegro
; Author WWZZSS
; Version 1.00
; Date 2019/01/23
axlCmdRegister("p2a" 'change_p2A)
filePath = axlDMFileBrowse(nil nil ?optFilters "Protel Net File(*.net)|*.net|");通过axlDMFileBrowse手动选择网表文件路径,将选择的路径传递给变量filePath
protelNet = infile(filePath)
allegroNet = outfile("./p2a.txt")
procedure( change_p2A() ;@optional str
namelist = list() ;定义一个空的列表namelist
m = 0 o = 0 ;定义两个初始值为0的计数变量
while( gets(str protelNet);while循环 按行读取内容包括换行符\n
str = car(parseString(str)) ; parseString将str按\n分成list,car取list中第一个值并赋予str
namelist = cons(str namelist) ; 将每个读取的str放进空的namelist中,注意此时的namelist是反的[]
when( str == "]" ;当读取到]时即是第一个protel里[]中的内容,此时格式为] 100nF C0603 C1[ printf("%L" namelist)确认
m = m +1 ; []中为packages内容应打印 $PACKAGES 但每次遇见]都会打印所以计数,只在第一次出现时打印 可用m++替代
when( m == 1 ; 条件判断,只在第一次遇见]时打印$PACKAGES 暂未想出好的替代方法
fprintf(allegroNet "$PACKAGES\n") ;打印 $PACKAGES
) ; 此条件判断独立于下面内容
namelist1 = namelist ;将列表namelist 赋予namelist1
namelist = list() ;清空列表namelist
namelist1 = remove("[" namelist1);移除[
namelist1 = remove("]" namelist1);移除]
namelist1 = reverse(namelist1) ;反转列表
SymVale = nth(2 namelist1) ;取
SymPkg = nth(1 namelist1) ;值
SymRef = nth(0 namelist1)
fprintf(allegroNet "'%s' ! '%s' ! '%s'; %s\n" SymPkg SymPkg SymVale SymRef );格式比较固定用此方法输出
namelist1 = list();清空列表namelist1
);end when
when( str == ")" ;()内容为net,当取值到)时开始处理
o = o +1
when( o == 1
fprintf(allegroNet "$NETS")
) ;以上同打印$PACKAGES
namelist2 = namelist ;此
namelist = list() ;处
namelist2 = remove("(" namelist2) ;同
namelist2 = remove(")" namelist2) ;上一when判断,注意此时列表为反但是并没有reverse
together = list();定义一个空的列表together
foreach( i namelist2
apartlist = parseString(i "-") ; parseString将namelist2中的数按-分开为list,如C1-1变为("C1" "1") 并赋值给apartlist
individual = buildString(apartlist ".") ;buildString将apartlist中间加"."整合成字符串C1.1 ,遍历整个namelist2
together = cons(individual together);将字符串放入together列表中,此时上面没有反转的列表刚好反转过来
);此foreach循环目地是将"-"替换为"."
when( length(together) < 6 ;NETs内容的格式输出,小于6(包括net名)个
fprintf(allegroNet "\n'%s'; " car(together));输出第一个net名,注意\n的使用
together = remove(car(together) together);去除net名,便于下面循环,此处可用 together = cdr(together) 代替
foreach( i together
fprintf(allegroNet " %s" i)
)
) ;循环输出net数小于5个时的内容
when( length(together) >= 6;NETs内容的格式输出,大于等于6(包括net名)个
fprintf(allegroNet "\n'%s'; " car(together)); 输出net名
together = remove(car(together) together) ;此处可用 together = cdr(together) 代替
for( j 1 5 ;NETS等于5个时循环
fprintf(allegroNet " %s" car(together))
together = remove(car(together) together);每循环一次则消除一个输出的net,此处可用 together = cdr(together) 代替
)
fprintf(allegroNet ",\n\t");等于5个时循环的输出格式
num = 0 ;定义一个初始值为0的计数变量
foreach( k together ;将together剩下的用foreach循环输出
fprintf(allegroNet " %s" k)
num = num + 1 ; 可用num++替代
when( num == 5 ; 当存在第五个元素时
fprintf(allegroNet ",\n\t") ;输出格式
num = 0 ; 清空计数器,继续计数查看剩下内容并决定输出格式
)
)
)
;上面两个when的判断< 6, >=6可以用if语句替代
together = list();清空together
);end when
);end while
fprintf(allegroNet "\n$END\n")
close(protelNet)
close(allegroNet)
); end procedure谢谢罗老师!
上一课已学,加油加油
有难度啊
謝謝
学习一下 支持罗老师!@!!!
看一看 多谢
谢谢
学习
学习学习