您所在的位置:e-works首页 > 产品创新数字化(PLM) > EDA

<连载>Protel二次开发从入门到精通

--正文篇——第七章第9节

发表时间:2007-9-8  特约撰稿人: 张浩 白二平 来源:e-works
GetState_BOM File Extension得到BOM表的扩展名称。Force Filename Extension函数用新的扩展名称替代已存在的文件扩展名称。把filename的扩展名称改为net,并且打开输出文件,关联到BOMFile。作者邮箱:bullzhanghao@yahoo.com.cn 如有疑问,可直接与作者联系!

1)OpenFile方法

调用OpenFile方法来产生文件,OpenFile方法如下:

//把要产生的文件名称插入到GeneratedFileNames列表中,并在DDB数据库中或硬盘上创建产生的文件。

Procedure TSchBOMFormatter.OpenFile(Var F : Text; S : TString);

Var

P :TDynamicString;

Count :TShortInt;

Begin

Inc(GeneratedFilesCount);//已产生的文件数量加1。

If GeneratedFilesCount <= GeneratedFileNames.Count then //如果已产生的文件数量小于等于存储已产生的文件名称的总数量。

Begin

P := GeneratedFileNames[GeneratedFilesCount - 1]; //把数组中最后一个元素赋予P。

If ValidDosFileName(P) then//ValidDosFilename返回一个逻辑值,表示文件名称字符串是否是一个有效的DOS文件名称。

S := P

Else

P := S;//把产生的文件名称S赋予P。

End Else

Begin

P := S;//把产生的文件名称S赋予P。

GeneratedFileNames.Insert(0,P); //把产生的文件名称插入到GeneratedFileNames数组中。

End;

If (GlobalSchBOMListOptions <> Nil) And (Not GlobalSchBOMListOptions.CreateInDSN) Then

Assign(F, GlobalSchBOMListOptions.WinFileName)//文件产生的硬盘中。

Else

AssignDDB(F, S, GetState_CurrentUserId);

//AssignDDB过程联合F到一个设计数据库的实体直到F被关闭为止。文件产生在数据库中。

Rewrite(F);实际写产生的文本类型的文件。产生了BOMFile输出文本对象。

End;

B.WriteFileHeader输出文件标题

在输出BOM表写文件的标题和文件中各列的说明。

Procedure TSchBOMFormatter.WriteFileHeader;

Begin

Writeln(BOMFile,'================原理图BOM表================');

Write(BOMFile,'元件序号;流水号;包装形式;元件名称;描述;Library Field Name1;Library Field Name2;Library Field Name3;Library Field Name4;Library Field Name5;');Write(BOM File,'Library Field Name6;Library Field Name7;Library Field Name8;Library Field Name9;Library Field Name10;Library Field Name11;Library Field Name12;');Write(BOM File,'Library Field Name13;Library Field Name14;Library Field Name15;Library Field Name16;LIBRARY FIELD1;LIBRARY FIELD2;LIBRARY FIELD3;LIBRARY FIELD4;LIBRARY FIELD5;LIBRARY FIELD6;LIBRARY FIELD7;LIBRARY FIELD8;原理图名称');

End;

C.缩进层次

Design.Sheets.For Each(@SetMax Min Indent For Sheet)调用SetMaxMinIndentForSheet来设置最小、最大原理图缩进层次。Set Max Min Indent ForSheet过程定义在SheetsForEach过程。并使用用一个循环来处理缩进层次。

D.处理每一个原理图

Design.Sheets.ForEach(@ProcessSheet)处理每一个原理图,ProcessSheet过程定义在SheetsForEach过程中。这是一个核心过程,其中包括以下几个核心过程:

1)WriteSheetHeader写当前原理图名称

//在处理每一个原理图前,写原理图的文件名称到文件。

Procedure TSchBOMFormatter.WriteSheetHeader(IndentLevel : TShortInt);

Begin

//没有具体代码。

End;

2)WriteComponentListHeader写组件标题,没有具体实现功能,您可以增加功能

//写组件列表标题,没有具体实现功能,您可以增加功能。

Procedure TSchBOMFormatter.WriteComponentListHeader;

Begin

//没有实现代码。

End;

3)WriteAllComponents把所有元件和图表符号的属性写到文件

//把所有的组件信息写到文件。

Procedure TSchBOMFormatter.WriteAllComponents;

Procedure WritePartIfZeroPins(P : TPart); Far;

Begin

if P <> Nil Then

ifP.GetState_PartPinCount = 0 Then

Begin

Setnumber;

WriteComponent(P,Getnumber);

End;

End;

//元件中引脚数为0。

Procedure WritePartIfNotZeroPins(P : TPart); Far;

Begin

if P <> Nil Then

ifP.GetState_PartPinCount <> 0 Then

Begin

Setnumber;

WriteComponent(P,Getnumber);

End;

End;

//元件中引脚数不为0。

Begin

ifCurrentPartList <> Nil Then

//CurrentPartList函数把当前原理图对象的parts列表对象读出来。parts列表存储所有元件对象。

Begin

CurrentPartList.ForEach(@WritePartIfZeroPins);

//遍历元件列表,调用WritePartIfZeroPins过程把每一个元件中无引脚对象的元件属性写到文件。

CurrentPartList.ForEach(@WritePartIfNotZeroPins);

//遍历元件列表,调用WritePartIfZeroPins过程把每一个元件中有引脚对象的元件属性写到文件。

End;

End;

{………………………………………………………………………………………………………………}

此代码中调用WriteComponent,把元件的属性和所在原理图名称写到输出文件。

//把元件对象的属性写出文件。

Procedure TSchBOMFormatter.WriteComponent(SpatialPart : TPart; PartNumber:Integer);

Begin

If SpatialPart <> Nil Then

Begin

Writeln(BOMFile,'');

Write(BOMFile,'元件'+Inttostr(PartNumber)+';');

Write(BOMFile,SpatialPart.GetState_Designator+';');//流水号。

Write(BOMFile,SpatialPart.GetState_FootPrint+';');//包装形式。

Write(BOMFile,SpatialPart.GetState_PartType+';'); //元件名称。

Write(BOMFile,SpatialPart.GetState_Description+';');//描述。

Write(BOMFile,SpatialPart.GetState_PartField1+';');

Write(BOMFile,SpatialPart.GetState_PartField2+';');

Write(BOMFile,SpatialPart.GetState_PartField3+';');

Write(BOMFile,SpatialPart.GetState_PartField4+';');

Write(BOMFile,SpatialPart.GetState_PartField5+';');

Write(BOMFile,SpatialPart.GetState_PartField6+';');

Write(BOMFile,SpatialPart.GetState_PartField7+';');

Write(BOMFile,SpatialPart.GetState_PartField8+';');

Write(BOMFile,SpatialPart.GetState_PartField9+';');

Write(BOMFile,SpatialPart.GetState_PartField10+';');

Write(BOMFile,SpatialPart.GetState_PartField11+';');

Write(BOMFile,SpatialPart.GetState_PartField12+';');

Write(BOMFile,SpatialPart.GetState_PartField13+';');

Write(BOMFile,SpatialPart.GetState_PartField14+';');

Write(BOMFile,SpatialPart.GetState_PartField15+';');

Write(BOMFile,SpatialPart.GetState_PartField16+';');

Write(BOMFile,SpatialPart.GetState_LibraryField1+';');

Write(BOMFile,SpatialPart.GetState_LibraryField2+';');

Write(BOMFile,SpatialPart.GetState_LibraryField3+';');

Write(BOMFile,SpatialPart.GetState_LibraryField4+';');

Write(BOMFile,SpatialPart.GetState_LibraryField5+';');

Write(BOMFile,SpatialPart.GetState_LibraryField6+';');

Write(BOMFile,SpatialPart.GetState_LibraryField7+';');

Write(BOMFile,SpatialPart.GetState_LibraryField8+';');

Write(BOMFile,UpperCase(ExtractWholeFileNameFromPath(CurrentSheet.GetState_SheetFileName)));//可写上当前原理图名称。write不换行,Writeln换行

End;

End;

本文为e-works原创投稿文章,未经e-works书面许可,任何人不得复制、转载、摘编等任何方式进行使用。如已是e-works授权合作伙伴,应在授权范围内使用。e-works内容合作伙伴申请热线:editor@e-works.net.cn tel:027-87592219/20/21。

责任编辑:王阳