ALLEGRO画PCB的软件生成的坐标文件里面没有原件的参数数值,比如没有电容容量,电阻阻值。如下图:
焊接厂生产的时候希望我在里面加上原件参数。我这边反复看了ALLEGRO设置,都无法在同一个文件输出左边文件和原件参数。
要想可口,自己动手。我琢磨自己合并一下。打算和BOM单合并一下就可以了。基本思路就是从BOM单只提取原件标号和参数,保存成一个bom文件。之后程序遍历坐标文件每一行,处理每一行时候,找到标号之后从bom里面根据标号找到参数,之后将见参数加到这一行就OK。
我们将BOM文件精简的只有两列,.BOM单一般是电子表格,我们删除无关列并且调整位置成为一下样子:
之后保存成我们能识别和解析的文本文件,
另存为.csv文件。我们用文本编辑软件打开这个csv文件看到是这样的
这里面我们看到用逗号来间隔每个字段,如果字段本身中有逗号就将此字段内容加引号。
接下来我们编写程序,合并这两个文件。代码如下:
#include "stdio.h"
static int strncmp(char *a,char *b,int len ){
int i ;
for(i=0;i<len;++i) if (a[i]!=b[i]) return 0;
return 1 ;
}
int strfind(char *word,char *line){
int r , i, word_len ,line_len ;
r=0;
// printf("strfind<%s> in <%s>\n",word,line);
word_len = strlen (word);
line_len = strlen (line);
for (i=0;i<line_len;++i)if ( strncmp(word,line+i,word_len) == 1 ) r = 1;
// printf("strfind result is %d \n",r );
// getchar();
return r ;
}
char * find_value (char * line){
static char buf[100] ;
int i,line_len ,t;
for(i=0;i<100;++i) buf[i] = 0 ;
i = line_len = strlen (line);
printf("line len is %d\r\n",i); //getchar () ;
while( i ) {
if (line[i] == ',') break;
i--;
}
if (i==0) return NULL;
t = 0 ;
i++;
if(line[i]==' ') i++;
for(;i<line_len;++i)
{
if (line[i] ==0x00) break;
if (line[i] ==0x0d) break;
if (line[i] ==0x0a) break;
buf[t++] = line[i] ;
}
return buf ;
}
char * get_name (char * line ){
static char buf[10];
int i ;
for(i=1;i<10;++i)buf[i]=0;
for(i=1;i<10;++i) if( line[i] == ' ' ) break ;
if (i==10) return NULL;
memcpy (buf,line,i);
return buf;
}
char * search_value (char *lable ){
FILE *fp;
int i ,t ,r;
static char str[1024],*p;
p=NULL;
/* opening file for reading */
fp = fopen("bom.csv" , "r");
if(fp == NULL) {
perror("Error opening file");
return(NULL);
}
while( fgets (str, 1024, fp)!=NULL ) {
puts(str);
r = strfind(lable,str);
if (r){
// printf("find a item in BOM !\n");
p = find_value(str);
puts(p);
// printf("is it ok?");
// getchar();
break;
}
}
fclose(fp);
return(p);
}
char * format_value (char *p){
static char buf[1200] ;
buf[0] = 0 ;
strcpy(buf,p) ;
strcat(buf," ");
buf[30] = 0 ;
buf[25] = '!';
return buf ;
}
int main () {
FILE *fp;
FILE *ft;
char str[1024],*p;
char *rp ;
/* opening file for reading */
fp = fopen("place.txt" , "r");
if(fp == NULL) {
perror("Error opening input file");
return(-1);
}
ft = fopen("place_bom.txt" , "w");
if(ft == NULL) {
perror("Error opening output file");
return(-1);
}
while( fgets (str, 1024, fp)!=NULL ) {
/* writing content to stdout */
puts(str);
p = get_name(str);
if (p){
rp = search_value(p);
if (rp==NULL) printf("<%s>not found",p);
if (rp==NULL)rp = format_value("NC");
else rp = format_value(rp);
strcat(rp,str);
fputs(rp,ft);
}
}
fclose(fp);
fclose(ft);
getchar();
return(0);
}
这个文件打开bom.txt和palce.txt并生成新的place_bom.txt文件,生成的文件内包含了原件的参数,如下所截图:
红色部分就是添加上的。
运行的时候你发现合并俩不大的文件需要十来秒的时间量级,原件执行效率很低的,因为是算法写的时候就“”偷懒”了,没有对BOM文件读到数组进行缓冲,而是每一次搜索都是打开bom.txt文件遍历一次,place.txt有n个条目就要打开n次bom.txt文件。不过10来秒时间咱们用户不在乎,电脑不会说话咱也不知道是否在乎,那就这样吧,无所谓了。
希望这个工具对大家有用,上述几个文件我压缩放在本文尾部的链接。其中bom.txt和place.txt分别是bom文件和坐标文件,palce_bom.txt是运行bom_palce_merge.exe产生的结果。其中bom_place_merge.c就是本文所贴源码。
链接:https://pan.baidu.com/s/1Wze_eHSBRE4t_TcI31QtMg
提取码:guuo