<连载>Protel二次开发从入门到精通
--正文篇——第七章第9节
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。
- 上一篇文章:基于VHDL逻辑电路设计与应用
- 下一篇文章:EDA工具最好理念:端到端流程优化
