图形图像
赵平
(大连理工大学自动化系,大连116024)
摘要:本文介绍了电路设计软件包Protel产生的PCB文件的格式,并在此基础上给出了一种使用c语言将位图 文件转换为制作印刷电路板所需的PCB文件的实用方法。
关键词:PCB文件;C语言;位图
引
言
下兼容该版本PCB文件,本文中着重对AUTO— TRAX格式的PCB文件格式予以介绍,由澳大利亚Protel Intemational Pty Ltd公司制 作的Protel软件包,由于其功能完善,易学易用,对 复杂电路有较高的布通率等特点,在国内电子设计
转换完成
的PCB文件也以此格式保存。
文件总体结构如下: (1)PCB FILE 4一一文件标f2)COMP 识 行业有着广泛的应用。但该软件包对印刷电路板
的设计只提供了Sans Serif及Serif两种英文字体
的字库,因此印刷电路板设计中字符串始终不能使 用中文,需外挂第三方程序才支持中ENDCOMP一一元件参数描述文字符,并且
绘制好的标志性图案、商标等无法方便地插人到板 图中。解决此类问题通常需借助于COREDRAW等 软件,将绘制好的文字或图片作为块打散为由线段 和圆弧组成的矢量图形,然后以DXF格式导入 PCB文件,或在制板过程中人工将电路板图及图 片合并,其过程繁琐不便于施行。
本文针对上述问题,提出了一种通过C语言 PCB 编程,将位图文件转换为PCB文件格式板图的实 用方法,其生成的PCB文件作为块(Block)可直接
(3)l’I' 6 422 220 424 220 2 0一一自由图元描述
(4)NETDEF一一网络表 (5)ENDPCB一一文件结束标志
其中(1)为PCB文件标识,包含了生成该文件的软件版本信息,(5)为文件结束标志,此两部 分格式固定不可更改。
元件参数描述区(2),由元件描述起始标识 (COMP);元件基本参数描述,包括元件标号(Desig-
现
代 1 PC B文件格式 计
插入到设计完成的电路板中使用。
算
机
^
Protel软件包由80年代的Tango升级至DOS 版的Protel,90年代初该公司推出了该软件的 Windows版,并逐渐升级至现在的Protel99SE,其
nator)、封装(Pattern)、注释(Comment)及对标号和
注释字符的描述;构成元件基本图元描述,如线条
(CT),焊盘(CP)等及元件描述结束标识(END— COMP)组成。此部分对整张板中的所含元件进行
了说明,每一元件描述均有上述四部分结构。本文 中所介绍的方法不使用元件描述部分,对该部分不
作详细介绍,具体可参考文献【1]。总 生成的PCB板文件格式不断改进,大体上有二进 第
制文件(Binary File)和文本文件(ASCII File)两类。
-_
一
考虑到Dos版的Protel仍然拥有相当的用户数量,
_-
--
其AUTOTRAX仅支持ASCII格式,而高版本可向
期
、一
④MODERN COMPUTER 万方数据
2001.8
图形图像
自由图元部分(3),该部分基本组成元素有圆 弧FA(Free Arc)、填充块FF(Free Fill)、焊盘FP
lmil在底层(Bottom Layer)的一线条网络表(4),该 部分描述了此电路板图中元件(Component)的网络 连接结构,由网络报表文件(.net)导入。 Track)和
PCB文件的五部分中,除首尾标识必不可少外, (Free Pad)、字符串FS(Free String)、线条FT(Free 过孔Fv(Free Via)。此类图元的描述格式
为上述标识加一行描述性字符串组成。自由图元 描述格式相似,差别仅在于描述字符串的个数及含 义不同。在此仅就本文中用到的自由图元一线条予
其余三部分根据需要均可缺失。本文介绍的方法只使
用了自由图元,生成的PCB文件只包含文件头(1)、 自由图元描述区(3)和文件结束标志(5)三部分。 2
以详细介绍,其余图元的参量含义可参考【2】。
线条的描述格式如下:
Fr
Xl Y1 X2 Y2 Width LayerNum
其中,(X1,Y1)为起点坐标,(X2,v2)为终点
标,Width为线宽,Layer为线条所在板层标记,
Num用于描述绘图,具体意义不详,通常为O或1, 实测无影响,在此取0即可。绘制出的线条中间为
一实心矩形,两端为实心园,参见图1,线条方向可为水平、垂直或倾斜三类。
图l
相同。当线条的宽度选取较小,如角为坐标原点,逻辑单位为
0.001英寸(mil)的坐标系中。线条宽度(Width)单 位为lmil,板层标识(Layer)取值范围为(1-13),具 体含义如下:
1-Top Layer; 2一l Mid Layer; 3-2 Mid Layer; 4-3 Mid Layer; 5—4 Mid Layer: 6—-Bottom Layer; 7-Top Overlay; 8-Bottom Overlay; 9-Ground Plane; IO-Power Plane; 11-Board Layer; 12——Keep Out Layer; 13一Multi Layer。
通过改变该参数即可控制线条所在的图层。 例如:FT
289 134 291 134 1 6 0
即表示从(289,134)到(291,134),宽度为
万
方数据 格式转换原理转换方法采取矢量化图形的基本思想,先对图
像进行预处理,通过二值化将图像与背景分离,然 坐重新描述后,以PCB文件格式重新储存即可由 Protel软件读取使用。
矢量化过程中为简化搜索算法,转换结果不使 用多角度直线及圆弧对图形进行描述。而全部采 用水平线条描述。转换中通过对图像进行逐行扫 描,对于在同一水平线上连通的黑像素使用同一线 条描述(参考图2)。其中斜线方格为图像点,线条
化后线条的实体部分长度与原黑像素点所占长度 lmil时,此尺寸 各坐标位于以左下已经小于通常印刷电路板生产所能达到的精度,此 时线条端点的圆弧造成的图形边缘不光滑的影响 已非常小,制板后不影响视觉效果。 髟 ·:
髟∥ ·] 髟∥ ∥ .] 髟 ∥ ∥ ∥ ·]
图2
转换时由BMP图像的左下角开始,由左向右、
由下至上逐行对图像点进行扫描。在搜索到第一
个值小于阈值的点(黑色一即图像实体元素),将其 作为线条的起点,继续向右搜索。在搜索到第一个
现 值大于阈值的点(白色一即背景元素),将其作为线
代 条的终点,继续搜索直至到达本行末。同理处理其
计 余行就得到了当前图片的线条描述。
算 线条的端点坐标计算方法:在PCB板图中左 机
^
下角为坐标原点,X轴向右,Y轴向上为正方向。与
总
上述位图像像素点的搜索方向相同。设像素搜索
第
-● 坐标为第x行第Y列。则该点坐标转换后即为(xx一 Width+100,yxWidth+100),其中Width为设定的线
-I
●-
MODERN COMPUTER 2叭8④
期
v
后对提取出的图像使用矢量图元进行描述。图像
图形图像
宽,在像素点有限而需要生成的印刷电路板上图片 m_lpBMIH=(LPBITMAPINFOHEADER)’ 较大时,该线宽可设为较大值。该坐标中X,Y坐标 new char[nSize]; 各加100,是为将生成电路板中图像起始坐标平移
移到(100,100),以确保起始行的线宽不被截取。
以下为一实际图片转换效果(如图3),图片大 小为512×512点,256级灰度,(a)为原始图像,(b) 为二值化后图像,(c)为转换后由Protel软件打印 输出效果。
图3
3
程序结构
程序采用VC++6.0编制,为便于使用在此给
出位图至PCB文件的转换部分的完整代码,鉴于 篇幅不再给出流程图。具体细节可参考程序中注 释部分。
在程序的调用部分将BMP文件名BMPFile. Name(8位色),PCB文件名PCBFileName,二值化 阈值Contrast,线条宽度Width,转换结果所在层 Layer等参数传给该函数即可完成转换过程。
BOOL CBmp2PcbView::WritePCB(CString BMPFileName, CString PCBFileName,BYTE Contrast,int Width,int Layer) {int nCount,nSize;
BITMAPFILEHEADER broth;
LPBITMAPINFOHEADER m_lpBMIH=NULL;
DWORD m_dwSizeImage=0;
LPBY'IE m_lpImage; CFile BMPFile; CStdioFile PCBFile;
if((BMPFile.Open(BMPFileName,Cfde::modeRead))==0)
return FALSE; //打开位图失败
try{
nCount=BMPFile.Read((LPVOID)&bmfh,
sizeof(BITMAPFILEHEADER));//读头信息
if(nCount!=sizeof(BITMAPFILEHEADER))
throw new CException;//读头信息错误
近bmfh.brrype!=0x4d421
throw new CException;∥非位图文件
一一
nSize=bmth.bfOffBits—sizeof(BITMAPFILEHEADER);
一柏彤v @MODERN COMPUTER 2001.8
万
方数据 nCount=BMPFile.Read(mlpBMIH,nSize);
if(m_lpBMIH->biSize!=sizeof(BITMAPINFOHEADER))
throw new CException;//非Windows位图
if(mlpBMIH一>biBitCount!=8)
throw new CException;∥非256色位图
if(m_lpBMIH一>biCompression)
throw new CException;//压缩格式
m_dwSizelmage=m_lpBMIH->biSizelmage; if(m_dwSizelmage==01 V/计算位图尺寸 DWORD“Bytes=((DWORD)HI-lpBMIH一>
biWidth。m_lpBMIH一>biBitCount)-/32; if(((DWORD)m_lpBMIH->biWidth+ mlpBMIH->biBitCount)%32)
dwBytes++; dwBytes+=4:
m_dwSizelmage=dwBytes+
m lpBMIH一>biHeight;
l∥将点读入内存
m_lplmage=(LPBYTE)new
char[m_dwSizelmage];
nCount=BMPFile.Read(m_lplmage.m_dwSizelmage); int LoopX=m_lpBMIH->biWidth,∥位图列数
LoopY=m_lpBMIH->biHeight;
//位图行数
int BlankByt,t。d’; CString LineContent;
PCBFile.Open(PCBFileName,CFile::modeCreatel
CFile::modeWrite);
LineContent=\"PCB F1LE钆”://PCB文件头
PCBFile.WriteString(HneContent);
BlankByt=m_lpBMIH一>biWidth%4:
if(BlankByt!=0)∥计算位图行填充字节数
BlankByt--4一BlankByt; LPBYTE MyPoint=m_lplmage; BOOL BlackPointBegine=FALSE; int BeginX,EndX,CoordinateY;
for(i=0;i BlackPointBegine=TRUE; CoordinateY=i*Width+100; )) 图形图像 else{//背景点 结语 本文提出了一种将位图文件转换为Protel可 读取的PCB文件的实用方法,并给出了转换部分 完整的C语言代码。该方法为在Protel印刷电路板 设计中使用图片和文字提供了解决方案。 程序全部代码在VC++6.0,Windows2000/98 平台下调试通过,转换结果经实际制板使用效果十 分满意。 if(BlackPointBegine){ EndX=(j+Width)+100; LineContent.Format(\"lZIXn%d%d%d %d%d%d 0Ln\.Coordinate Y,EndX,CoordinateY,Width,Layer); PCBFile.WriteString(LineContent); BlackPointBegine=FALSE; }}j MyPoint+=(BlankB蚋;) LineContent=\"ENDPCB”: 参考文献 [1]明军等.TANG03.16版印刷电路板数据文件结构分析.合 肥:安徽大学学报(自然科学版),1996 f21t纪川.ProtelTRAXEDIrI’PCB文件中基本图元的数据结 构.沈阳:小型微型计算机系统,1994 [3]David KrugliIlski.Programming Visual C++6.0技术内幕(第 五版)(修订版).希望图书工作室.北京:希望电子出版社, 1999 PCBFile.WriteString(LineContent); PCBFile.Close();//close the file BMPFile.Close();1 catch(CException+pe){ AfxMessageBox(\"Convert error'3; pe一>Delete(); BMPFile.Close(); return FALSE;} (收稿日期:2001-07—30) retum TRUE; } le a A Method to Convert Bitmap Fi File into PCB ZHAO Ping 116024 China) University ofTechnology,Dalian (Department ofAutomation,Dalian written in C language is also given file used in Protel is discussed in this paper.A program Almtmet:The format of the PCB to demonstrate how to convert the bitmap file into PCB wD喇S:PCB File:C file. Key Language;Bitmap -一 2001.8 MODERN COMPUTER m 一相彤v 万方数据 因篇幅问题不能全部显示,请点此查看更多更全内容