信息化 频道

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

Begin

EntityHandle :=

ClientAPI_FindEntityByDataHandle(MessageRouter_GetState_CurrentEditorWindow);

//MessageRouter_GetState_CurrentEditorWindow函数返回当前在项层的文档的窗体句柄。

//当前在项层在文档的窗体句柄。

//ClientApi_FindEntityByDataHandle 函数使用一个编辑器窗体句柄来返回查找返回一个实体的句柄。

If EntityHandle = 0 Then Exit;

BinderHandle := ClientAPI_GetDocumentOwnerBinder(EntityHandle);

//ClientApi_GetDocumentOwnerBinder函数获得在其内部存有文档的封装对象的句柄,

//一个封装对象表现为包含实体的容器,一个实体可为一个设计文档或文件来。

ClientAPI_RepopulateDocumentEntity(BinderHandle,False);

//刷新当前实体。

//Spread单元自动格式化auto formatting of Spread cells

GetMem(P,1024);//申请1024字节内存。

StrPCopy(P,'');//用空字符初始化内存。

SetState_Parameter(P,'C1','-1');

//SetState_Parameter过程插入一个参数到指定的参数文本块中。

{初始列 Initial column }

SetState_Parameter(P,'C2','0');

{ 最后的列Final column}

SetState_Parameter(P,'ColumnWidth','AUTO');//宽度为自动适应。

MessageRouter_SendCommandToModule('Spread:FormatColumn',P,1024,SpreadHandle);

//发送命令给Spread服务器的FormatColumn过程,命令参数为P中存放的参数,内存大小为

//1024,目标对象句柄为SpreadHandle。

FreeMem(P,1024);

EntityHandle := ClientAPI_FindEntityByDataHandle(SpreadAPI_GetCurrentSpreadHandle);

//SpreadAPI_GetCurrentSpreadHandle函数返回一个当前在设计资源管理器99中打开的spread文档的句柄。

End;

{................................................................................}

//主程序。

Function ExportComponentInfo : PCBTypes.TObjectHandle;

Var

BoardFileName: TString;//印制板DOS型路径名称。

TempFileName: TString;//输出临时文本文件名称。

SpreadHandle: TSPHandle;//Spread型文档句柄。

ComponentHandle: TObjectHandle;//元件对象句柄。

Board: TPCBBoard;//印制板对象句柄。

ComponentRowNumber : Integer;//元件统计总数。

TotalInfoList: TStringlist;//存放完整元件信息的列表。

ComponentInfoList: TStringlist;//存放元件信息的列表。

BoardUnit: TUnit;

P: PChar;

ComponentIteratorHandle : TObjectHandle;//迭代程序。

Begin

SetAllPCBProcAddresses;

//SetAllPCBProcAddresses过程初始化并且设置所有PCB编辑器调用。即取得所有AdvPcb.dll

//中输出的函数和过程的地址指针。

If PcbApi_GetCurrentBoardHandle = 0 Then Exit;

//如果当前激活的编辑器不是PCB编辑器则退出。

//PcbApi_GetCurrentBoardHandle函数返回当前在设计资源管理器中的PCB文档的句柄,

//如果印制板没有找到则返回值是空(nil)。

Board := TPCBBoard.Create(PcbApi_GetCurrentBoardHandle);//建立一个印制板对象。

Board.QueryDatabase(PCBTypes.eGetState);//用内部服务器数据同步外部服务器数据。

BoardFileName := ExtractFileName(ConvertToNormalFilePath(Board.FileName));

//ConvertToNormalFilePath函数转换一个抽象的地址到一个常规的DOS文件路径。

//ExtractFileName获取文件名称和扩展路径。

BoardFileName := ForceFileNameExtension(BoardFileName,'XLS');

//ForceFileNameExtension函数用新的扩展名称替代已存在的文件扩展名称。

BoardUnit:= Board.DisplayUnit;

Board.Free;

GetMem(P, 4048);//申请内存。

SetState_Parameter(P,'Server','Spread');//设置命令参数。

SetState_Parameter(P,'Action','Start'); //设置命令参数。

MessageRouter_SendCommandToModule('Client:SetupEDAServers', P, 4048, 0);

//发送命令给Client服务器的SetupEDAServers过程,命令参数存在P中,内存大小为4048。此过程设置EDA服务器。

FreeMem(P, 4048);//释放内存。

SetupApiCalls;//设置一个Spread API调用。

SpreadHandle := CreateASpreadDocument(BoardFileName);//创建一个XLS型的spread文档。

If SpreadHandle = 0 Then Exit;

ComponentIteratorHandle := PcbApi_CreateIterator(PcbApi_GetCurrentBoardHandle,

eComponentObject,//元件对象

eProcessAll,//处理所有

eIgnoreLayer);

//建立对象迭代程序。

ComponentHandle := PcbApi_GetFirstObject(ComponentIteratorHandle);//查找第一个元件对象。

//PcbApi_GetFirstObject函数使用给定的迭代程序(iterator)句柄返回第一个发现的PCB对象句柄。

ComponentRowNumber := 0;//元件统计总数初始化为0。

TotalInfoList := TStringList.Create;//建立存放整个元件对象的列表。

While (ComponentHandle <> 0) Do//查找到有元件对象。

Begin

Inc(ComponentRowNumber);//元件对象数目统计。

ComponentInfoList := TStringList.Create;//建立存放当前元件对象的列表。

ExtractAttributesOfAComponentObject(ComponentRowNumber,ComponentHandle,

ComponentInfoList);

//调用ExtractAttributesOfAComponentObject过程来把当前元件中信息输出到列表ComponentInfoList中。

ExportComponentInfoToSpread(SpreadHandle,ComponentRowNumber,ComponentInfoList);

TotalInfoList.Add(ComponentInfoList.Text);

//ExportComponentInfoToTotalInfoList(TotalInfoList,ComponentInfoList);

//把ComponentInfoList列表中信息输出到一个XLS型的spread文档中。

ComponentInfoList.Free;//列表释放。

ComponentHandle := PcbApi_GetNextObject(ComponentIteratorHandle);//查找下一个元件对象。

End;

SpreadAPI_SetColumnName(SpreadHandle,1,'序号');//设置第一列为序号。

SpreadAPI_SetColumnName(SpreadHandle,2,'名称');//设置第二列为名称。

SpreadAPI_SetColumnName(SpreadHandle,3,'流水号');//设置第三列为流水号。

SpreadAPI_SetColumnName(SpreadHandle,4,'备注'); //设置第四列为备注。

TempFileName := ForceFileNameExtension(BoardFileName,'TXT');

//建立与印制板名称相同但扩展名为TXT的输出文本文件名称。

ExportComponentInfoToTempFile(TempFileName,TotalInfoList);

//把整个存放元件信息列表中的内容输出到本地文本文件。

TotalInfoList.Free;//释放存放整个元件信息的列表。

PcbApi_DestroyIterator(ComponentIteratorHandle);//销毁迭代程序。

RefreshDesignDatabase(SpreadHandle);//刷新spread文档,使其每一列内容和宽度相适应。

End;

{....................................................................................}

Procedure Command_ExportComponentInfoToSpread(Window : TServerWindow; Parameters : PChar);

Begin

ExportComponentInfo;

End;

(e-works)

0
相关文章