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

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

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

发表时间:2007-9-9  特约撰稿人: 张浩 白二平 来源:e-works
本服务器根据用户在定制进程菜单时所输入的参数来产生一个不同格式的网络连线表。此服务器是本章中难度最大的一个服务器,如果您没有读第9小节,建议您先搞清楚第9小节后再来读本小节。作者邮箱:bullzhanghao@yahoo.com.cn 如有疑问,可直接与作者联系!

1.判断当前文档是否为原理图

SchematicServerHandle :=MessageRouter_ModuleHandle('Sch');

此过程先判断当前文档是否为原理图,如果不是,显示错误提示信息后退出。

2.创建TNetListOptions类实例

接下来创建一个存储如何产生网络连线表的设置选项对象NetListOptions,此对象中存储如原理图的类型、产生的文件是在本地硬盘还是DDB数据库内,如在本地硬盘上,存储的文件名称,产生的方法等等信息。类定义在NetFormat单元中。TNetListOptions类定义和Create方法

A.网络选项类定义

TNetListOptions = Class

WinFileName : TString;//产生的文件如果要写在硬盘中的文件名称。

CreateInDSN : Boolean;//为真网络连线表产生的数据库中,为假产生在本地硬盘中。

NetlistFormat : TNetListFormat; //网络连线表格式类型,有三种类型。

GenerateMethod :TNetListGenerateMethod;

//如何创建网络连线表的方法常量枚举,有三个选项,分别为eNetListGenerateAllGlobal, eNetListGeneratePortsGlobal, eNetListGenerateNoGlobal

AppendSheetNoToNets :TBoolean;

WriteNetsAfter_ConvertToConnective :TBoolean;

WriteNetsAfter_Resolve_Internal :TBoolean;

WriteNetsAfter_Resolve_Global :TBoolean;

Include_NetMergingInformation :TBoolean;

WriteNetDebugInformation :TBoolean;

DescendIntoSheetParts :TBoolean;

IncludeUnNamedSinglePinNets :TBoolean;

//输出所有网络名称,包括指示要跳过的引脚的网络名称。

SheetsToNetlist :TSheetsToNetlist;

Constructor Create;

Procedure SetState_Options; //设置网络表的格式。

End;

B.Create方法

Constructor TNetListOptions.Create;

Begin

SetState_Options;//调用设置网络连线表过程。

End;

1)SetState_Options

方法中调用SetState_Options过程来设置网络连线表的选项对象。

Procedure TNetListOptions.SetState_Options; //设置网络连线表选项。

Begin

WinFileName := '';//默认产生在硬盘中的文件名称为空。

CreateInDSN := True;//默认网络连线表是产生在DDB数据库中。

GenerateMethod := eNetListGenerateNoGlobal;//设置如何产生网络列表。

NetlistFormat := eProtel;//默认的格式是eProtel,即输出格式是eRunModeFlat,而不是eRunModeHierachical。

AppendSheetNoToNets := False;

WriteNetsAfter_ConvertToConnective := False;

WriteNetsAfter_Resolve_Internal := False;

WriteNetsAfter_Resolve_Global := False;

Include_NetMergingInformation := False;

WriteNetDebugInformation := False;

DescendIntoSheetParts := False;

IncludeUnNamedSinglePinNets := False;

//输出所有网络名称,包括指示要跳过的引脚的网络名称。

SheetsToNetlist := eActiveProject;//是原理图是prj文件,即不是一般的原理图,而是项目文件。

End;

请注意,默认的格式是eProtel,即输出格式是eRunModeFlat,而不是eRunModeHierachical。

3.得到所有advsch.dll输出方法和函数

程序接下来调用SetAllProcAddresses,SetAllProcAddresses不是一个常规的API方法,而是NETAPI中输出的一个函数。

4.得到运行模式

然后,使用Getstate_Parameter来读取用户在定制菜单项时所输入的参数值,使用函数GetState_RunModeFromString来返回不同的运行模式。GetState_RunModeFromString定义如下:

//S是从用户在定制菜单项时输入的参数块中的参数值。如果参数块为RunMode=value1形式。

Function GetState_RunModeFromString(S : String) : TRunModes;

Begin

Result := eRunModeFlat;//默认返回eRunModeFlat。

If TokenEqual(S,'Flat') Then

Result := eRunModeFlat //如果参数值是Flat,则返回eRunModeFlat。

Else

If TokenEqual(S,'Hierachical') Then

Result :=eRunModeHierachical;

//如果参数值是Hierachical,返回eRunModeHierachical。

//TokenEqual函数比较字符串S1和S2,如果它们精确地相同,函数返回一个真(True) 值,否则返回一个假(False)值。

End;

5.根据运行模式来设置运行对象NetListOptions中NetListFormat属性值

If RunMode = eRunModeHierachical Then

NetListOptions.NetListFormat := eProtel_H;

6.调用RunNetListGenerate过程来产生网络连线表

最后,程序调进RunNetListGenerate过程来产生网络连线表,参数为选项设置对象NetListOptions和用户在定制此进程菜单项时输入的参数Parameters。RunNetListGenerate定义在NetForms单元中。

10.2.4NetForms单元

NetForms单元很简单,只有一个过程RunNetListGenerate。

//参数网络连接表选项和用户在菜单定制时输入的参数

Procedure RunNetListGenerate(NetListOptions : TNetListOptions; Parameters : PChar);

Var

NetFormatter :TNetFormatter;

//TNetFormatter定义在NetFormat单元中。

Begin

NetFormatter := Nil;

//根据网络连接表的选项中NetlistFormat选项来创建不同的对象。

Case NetListOptions.NetlistFormat Of

//根据NetListOptions对象中NetlistFormat格式来创建对象。

eProtel_H : NetFormatter := TProtel_H.Create; //Hierachical格式,TProtel_H定义在Protel单元中。

eProtel: NetFormatter := TProtel.Create; //Flat格式,TProtel_H定义在Protel单元中。

End;

If NetFormatter <> Nil Then //NetFormatter建立成功,建立一个网络列表。

Begin

NetFormatter.Run(NetListOptions,Parameters);//建立网络列表。

Netformatter.Destroy;//释放NetFormatter对象。

End;

End;

此过程创建一个TNetFormatter类的NetFormatter对象空的实例,然后根据NetListOptions对象中NetlistFormat格式来创建不同对象,如果用户在定制菜单时输入的参数是RunMode = Hierachical,创建一个TProtel_H类对象实例,如果用户在定制菜单时输入的参数是RunMode = Flat,则创建一个TProtel类对象实例。请见10.2.3中第5点,TProtel_H和TProtel定义在单元Protel中。

调用NetFormatter对象实例中的Run方法来建立网络连线表。

完成后释放对象实例NetFormatter。

TNetFormatter类定义在NETFormat单元中。

下面先来分析TProtel_H和TProtel的类,请见10.2.5,再分析NetFormatter对象实例中的Run方法,请见10.2.6。

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

责任编辑:王阳