您所在的位置: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 如有疑问,可直接与作者联系!

3. GetState_DesignfileName函数

Function TDesign.GetState_DesignFileName :TString;

Begin

GetState_DesignFileName := GetStringFromAPIFunction(DataHandle,

GetDesign_DesignFileName);

//得到设计文件名称。GetDesign_DesignFileName是advsch.dll输出的方法。

End;

并根据设计文件名称创建一个文本文件对象DDBItem。

4. TSchBOMFormatter类的SheetsForEach方法

//对存储原理图的列表每一个进行处理,产生BOM

Procedure TSchBOMFormatter.SheetsForEach;

Var

i :TShortInt;

MaxSheetIndent : TShortInt; //最大缩进。

MinSheetIndent : TShortInt; //最小缩进。

SheetIndent :TShortInt;

//设置最小和最大缩进层次。

Procedure SetMaxMinIndentForSheet(P : TSheet); Far;

Begin

If P <> Nil Then

Begin

If P.GetState_SheetIndent > MaxSheetIndent Then

MaxSheetIndent :=P.GetState_SheetIndent;

If P.GetState_SheetIndent < MinSheetIndent Then

MinSheetIndent :=P.GetState_SheetIndent;

End;

End;

//处理每一个原理图,把信息输出到文件。

Procedure ProcessSheet(P : TSheet); Far;

Begin

If P <> Nil Then

Begin

If P.GetState_SheetIndent = SheetIndent Then

Begin

CurrentSheetName :=

UpperCase(ExtractWholeFileNameFromPath(P.GetState_SheetFileName));

//P.GetState_SheetFileName得到原理图图表的文件名称,包括扩展名称。

//ExtractWholeFilenameFromPath函数提取Path字符串中名称和扩展名称。

CurrentSheet := P;

//把要处理的原理图赋予CurrentSheet,成为当前图表,从而可对当前原理图进行处理,如调用GetState_SheetFileName读取原理图名称等。

WriteSheetHeader(SheetIndent);

//写当前原理图名称。

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

WriteAllComponents;//把所有元件和图表符号的属性写到文件。

WriteComponentListTrailer;//写组件列表结尾,没有具体实现功能,您可以增加功能。

WriteSheetTrailer(SheetIndent); //一个原理图处理完成后写结尾。

End;

End;

End;

Begin

OpenBOMFile;

//打开BOM表输出文件。得到当前原理图顶层父原理图的名称,把其扩展名称改为BOM,成为输出网络文件名称。

WriteFileHeader; //输出文件标题。

MaxSheetIndent := 0;

MinSheetIndent := 9999; //原理图的缩进层次。

Design.Sheets.ForEach(@SetMaxMinIndentForSheet);

//调用SetMaxMinIndentForSheet来设置最小、最大原理图缩进层次。

For SheetIndent := MaxSheetIndentDownToMinSheetIndent Do//从最大的缩进层次到最小的缩进层次。

Design.Sheets.ForEach(@ProcessSheet);

//所有的原理图存储在Design对象的Sheets列表中。ForEach把Sheets列表中的所有原理图使用一个循环来分别进行处理各个原理图,循环中调用的处理过程是ProcessSheet。

WriteFileTrailer;//写文件的结尾。

CloseBOMFile; //关闭BOM表文件。

End;

A.OpenBOMFile方法

OpenBOMFile方法打开并创建一个文本文件,实现如下:

Procedure TSchBOMFormatter.OpenBOMFile;

Begin

OpenFile(BOMFile,ForceFileNameExtension(FileName,GetState_BOMFileExtension));

//FileName是当前原理图顶层父原理图的名称,即如果当前原理图是一个abc.Prj文件,其下有五个原理图,无论在哪一个原理图上运行此进程,filename都是abc.prj。GetState_BOMFileExtension得到BOM表的扩展名称。ForceFilenameExtension函数用新的扩展名称替代已存在的文件扩展名称。把filename的扩展名称改为net,并且打开输出文件,关联到BOMFile。

End;

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

责任编辑:王阳
3