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)