<连载>Protel二次开发从入门到精通
--正文篇——第九章第2节
2.4.2.6 CreatePartList提取元器件
Create PartList过程是本进程的核心过程,其主要功能是从原理图和印制板中提供元器件。为了使程序清楚易读,我们把此过程放在一个单独的单元CreatePartListUnit中。
在主程序中,如下定义
……
CreatePartList(BinderHandle, FileLocation + NewExternalFileName,Source.Root.Name);
//从原理图和印制板中创建元器件输出文件清单,第一个参数是当前DDB包对象,第二个参数是输出文件名称,第三个名称是当前DDB包名称字符串。实际上,第一个参数和第三个参数都起到同样的作用,那就是控制程序只对当前DDB包进行处理,其它在设计资源管理器中打开的DDB包不作处理。如果在CreatePartList过程中建立的迭代程序查找范围是对所有在设计资源管理器中打开的DDB进行处理,那么,我们就可以把各个DDB包中信息分别提取出来,放在各自输出文件中。从而精确控制程序处理行为。
……
·CreatePartList过程定义
在CreatePartListUnit单元中,CreatePartList过程定义如下:
Procedure CreatePartList(DDBBinderHandle: TObjectHandle; PathNmae : String; DDBName:String);
Var
DocumentEntity: TDocumentEntity;//文档实体对象。
Iterator: ClientTypes.TObjectHandle;//迭代程序对象。
AbsoluteStorageName : TString;//抽象地址字符串。
EntityHandle: ClientTypes.TObjectHandle;//查找到的实体句柄变量。
Document: TObjectHandle;
AbsolutePath: TString;//查找到的文档的抽象地址路径。
DDBItem: TDDBItem;//查找到的文档通过建立临时项目方式取得一些信息。
Params: PChar;//传递给客户端服务器命令参数。
I: Integer;
TempPartListFile: TextFile;
GetIniFile: TIniFile;//配置文件。
ExportFileName: TString;//输出文件名称。
DDBSource: TDDBAddress;//临时地址对象,用来取得当前DDB包名称。
Begin
CheckOptionFile;//检查配置文件是否存在,如不在则建立。
GetIniFile := TIniFile.Create(GetSystemPath + '\' + 'GetInfoOption.ini');
//创建一个INI读取对象。
If ((GetIniFile.ReadString('GetOption','SCH','选择')='不选择') and
(GetIniFile.ReadString('GetOption','PCB','选择')='不选择')) then
Begin
ShowInfo('在配置文件中[GetOption]段,原理图或印制板必须有一个选择');
GetIniFile.Free;
Exit;
End;
//如果SCH和PCB都没有选择,则提示选择。
SchPartslist:=TStringList.Create;
PCBPartslist:=TStringList.Create;
AbsoluteStorageName := '';
//EnteredFileName := Uppercase(FileName);//文件名称转换为大写。
//Iterator := ClientApi_CreateIterator(0,[eDocument],eAll);
Iterator := ClientApi_CreateIterator(DDBBinderHandle,[eDocument],eAll);
//建立迭代程序对象查找所有文档。如果第一个参数为0,表示将对在设计资源管理器中
//所有打开的对象进行迭代查找。参数为BinderHandle表示对当前DDB包进行迭代。
EntityHandle := ClientApi_GetFirstEntity(Iterator);
//查找第一个文档。
While EntityHandle <> 0 Do
Begin
DocumentEntity := TDocumentEntity.Create(EntityHandle);
//根据查找到的文档句柄建立文档对象。
DocumentEntity.QueryDataBase(ClientTypes.eGetState);//同步数据。
AbsoluteStorageName := DocumentEntity.GetAbsoluteAddress;
//把文档实体的抽象地址赋予AbsoluteStorageName字符串。
DocumentEntity.Free;//释放文档对象。
DDBSource := TDDBAddress.Create(AbsoluteStorageName);//创建要输出的源对象。
If DDBSource.Root.Name = DDBName then
//仅对当前DDB文件中进行处理,非当前DDB包中文件不作处理。实际上在上面建立迭代程序时,
//就已经指定查找范围是当前DDB包,这里在进行对当前文档所在的DDB包名和传递过程的
//包名称进行比较是多进的工作。这样的目的仅是为了做说明,我们可以从多个方面进行控制。
Begin
If AbsoluteStorageName <> '' Then //如果抽象地址不为空,说明为有效文档。
Begin
DDBItem:= TDDBItem.Create('Admin',AbsoluteStorageName);
//根据查找到的文档的抽象地址创建一个项目
If GetIniFile.ReadString('GetOption','SCH','选择')='选择' then
Begin
If UpperCase(DDBItem.Address.EditorKind) = 'SCH' Then //原理图文件。
Begin
GetMem(Params,1024);//分配内存。
StrPCopy(Params,'FileName ='+ DDBItem.Address.Root.Path +'\'+ DDBItem.Address.Root.Name);
//合成命令参数"FileName=根路径+根名称",FileName是当前DDB包的全路径名称。
MessageRouter_SEndCommandToModule('Client: OpenDocument',Params,255,0);
//把参数发送到客户端服务器,打开DDB包文档。
AbsolutePath := DDBItem.Address.AsParameters;
//查找到的文档的抽象地址路径。
Document := ClientApi_FindEntityByStorageName(AbsolutePath,[eDocument]);
//ClientApi_FindEntityByStorageName函数使用一个实体的抽象地址和实体种类参数返回一个实体的句柄。
ClientApi_OpenDocumentEntity(Document,False);//打开文档。
ClientApi_SetAsCurrentDocument(Document);//置为当前激活。
Freemem(Params,1024);//释放内存。
ReadPartListInfo(SchPartslist);//从原理图中提取元件器信息。
End;
End;
If GetIniFile.ReadString('GetOption','PCB','选择')='选择' then
Begin
If UpperCase(DDBItem.Address.EditorKind) = 'PCB' Then //印制板文件。
Begin
GetMem(Params,1024);//分配内存。
StrPCopy(Params,'FileName ='+ DDBItem.Address.Root.Path +'\'+ DDBItem.Address.Root.Name);
//合成命令参数"FileName=根路径+根名称",FileName是当前DDB包的全路径名称。
MessageRouter_SEndCommandToModule('Client: OpenDocument',Params,255,0);
//把参数发送到客户端服务器,打开DDB包文档。
AbsolutePath := DDBItem.Address.AsParameters;
//查找到的文档的抽象地址路径。
Document := ClientApi_FindEntityByStorageName(AbsolutePath,[eDocument]);
//ClientApi_FindEntityByStorageName函数使用一个实体的抽象地址和实体种类参数返回一个实体的句柄。
ClientApi_OpenDocumentEntity(Document,False);//打开文档。
ClientApi_SetAsCurrentDocument(Document);//置为当前激活。
Freemem(Params,1024);//释放内存。
ReadPCBComponentListInfo(PCBPartslist);
//从印制板中提取元器件信息。
End
End;
DDBItem.Free;//释放DDB对象。
End;//AbsoluteStorageName <> ''处理结束。
End;//仅对当前文档进行处理判断处理结束。
DDBSource.Free;//释放DDB对象。
EntityHandle := ClientApi_GetNextEntity(Iterator);//查找下一个文档实体。
End;
ClientApi_DestroyIterator(Iterator);//销毁迭代程序对象。
//以下代码分别输出从原理图和印制板中提取的元器件信息。
If GetIniFile.ReadString('GetOption','SCH','选择')='选择' then
Begin
ExportFileName := GetIniFile.ReadString('GetOption','原理图元器件输出文件名称','SchPartList.TXT');
AssignFile(TempPartListFile,PathNmae +'\'+ ExportFileName);//输出文件清单列表文件。
ReWrite(TempPartListFile);//新建文件
Try
For I:=0 to SchPartslist.Count-1 do
Writeln(TempPartListFile,SchPartslist.Strings[I]);
Finally
Closefile(TempPartListFile);
End;
End;
//把原理图列表中内容输出到文本文件中。
If GetIniFile.ReadString('GetOption','PCB','选择')='选择' then
Begin
ExportFileName := GetIniFile.ReadString('GetOption','印制板元器件输出文件名称','PCBPartList.TXT');
AssignFile(TempPartListFile,PathNmae +'\'+ ExportFileName);//输出文件清单列表文件。
ReWrite(TempPartListFile);//新建文件
Try
For I:=0 to PCBPartslist.Count-1 do
Writeln(TempPartListFile,PCBPartslist.Strings[I]);
Finally
Closefile(TempPartListFile);
End;
End;
//把印制板列表中内容输出到文本文件中。
GetIniFile.Free;//释放对象。
SchPartslist.Free;//释放存放原理图信息元器件的列表。
PCBPartslist.Free;//释放存放印制板元件信息的列表。
End;
本文为e-works原创投稿文章,未经e-works书面许可,任何人不得复制、转载、摘编等任何方式进行使用。如已是e-works授权合作伙伴,应在授权范围内使用。e-works内容合作伙伴申请热线:editor@e-works.net.cn tel:027-87592219/20/21。
- 上一篇文章:<连载>Protel二次开发从入门到精通
- 下一篇文章:EDA工具最好理念:端到端流程优化
