If EntityHandle = 0 Then Exit; //无对象则退出。
BinderHandle := ClientApi_GetDocumentOwnerBinder(EntityHandle);
//ClientApi_GetDocumentOwnerBinder函数获得在其内部存有文档的封装对象的句柄,一个封装对象表现为包含实体的容器,一个实体可为一个设计文档或文件来。
ClientApi_RepopulateDocumentEntity(BinderHandle,False);
//ClientApi_RepopulateDocumentEntity 过程在封装对象中刷新文档实体的内容依赖于Recursive参数值,如果参数为false,当前实体被刷新,否则实体的封装对象被刷新。它在当文档被增加到一个封装对象中您需要刷新封装对象来让设计资源管理器知道有新的文档时情况下很有用。
End;
{....................................................................................}
//以下这段代码是把列表中的字符串输出到文本文档中
Procedure GenerateTextFile(AFileNameList : TStringList);
var
CurrentSheetEntity : ClientTypes.TObjecthandle;
F: TextFile;
S: TString;
I: Integer;
Begin
CurrentSheetEntity:=ClientApi_FindEntityByDataHandle(SchAPI_GetCurrentEditorWindow);
//通过当前原理图编辑器顶层对象取得窗体句柄作为查找实体对象的参数来获得实体对象句柄
ClientApi_GetDocumentEntityAbsoluteAddress(CurrentSheetEntity,S);
//取得实体对象的绝对地址并作为字符串放在S中,绝对地址中有很多标识符,如$RP表示设计数据库Full name, $RN表示设计数据库中的文件Full name,等等。
S := ForceFileNameExtension(S, 'TXT');
//用TXT扩展文件名称代替现有的文件扩展名,即把S扩展名称改为TXT。
//产生并且在当前ddb中放入文件
AssignDDB(F,S,'Admin');
//把文本文件F关联到DDB库,把S中内容放到文件F中,操作用户为“Admin”
Rewrite(F);//建立一个文件
Writeln(F,'Project Hierarchy Report...');
Writeln(F,'===========================');
Writeln(F,'');
For I := 0 to AFileNamelist.Count - 1 Do //按共有多少图表数量建立循环。
Writeln(F,AFileNameList.Strings[I]);
CloseFile(F);
Repopulate;//刷新实体对象
End;
{....................................................................................}
//以下代码计算图表总计,为此小章节例子的主程序。
Procedure RunCountSubSheets;
Var
Sheet: TSchSheetOptions;
J: Integer;
SheetHandle: SchAPITypes.TObjectHandle;
CurrentSheet : SchAPITypes.TObjectHandle;
TopSheet : SchAPITypes.TObjectHandle;
SheetCount : Integer;
FileNameList : TStringList;
Begin
If MessageRouter_GetState_WindowKind(SchAPI_GetCurrentEditorWindow) <> 'Sch' Then Exit;
//检查当前的文档类型是否是Sch,即原理图,如果不是则退出。
//SchAPI_GetCurrentEditorWindow是返回当前文档对象的窗体句柄。
//MessageRouter_GetState_WindowKind函数使用编辑器窗体句柄返回表示编辑器窗体类型的字符串值。例如,Advanced PCB 编辑器返回“PCB”字符串,并且TextEdit服务器返回“TEXT” 字符串。
SheetHandle := SchAPI_GetCurrentSheetHandle;
SheetCount:= SchAPI_GetDocumentCountInProject(SheetHandle);
//SchAPI_GetDocumentCountInProject调用仅统计在设计资源管理器中打开的图表。。
If SheetCount = 0 Then Exit;
FileNameList := TStringList.Create;
If SheetCount = 1 Then //仅有一个原理图图表。
Begin
Sheet := TSchSheetOptions.Create(SheetHandle);//创建原理图图表对象。
Sheet.QueryDatabase(SchAPITypes.eGetState);//同步内外部数据库。
FileNameList.Add(ConvertToNormalFilePath(Sheet.DocumentName) +
' is the only one open schematic document.');
//显示文档文件名称。
GenerateTextFile(FileNameList);
Sheet.Free;
End
Else
Begin //多图表项目。
SheetCount := SchAPI_GetDocumentCountInProject(SheetHandle);
//在当前项目中统计打开的原理图图表
For J := 1 to SheetCount Do
Begin
CurrentSheet := SchAPI_GetDocumentHandleByIndex(J-1, SheetHandle, False);
//返回给定索引对象的句柄。
Sheet:= TSchSheetOptions.Create(CurrentSheet);
Sheet.Querydatabase(SchAPITypes.eGetState);
FileNameList.Add(ConvertToNormalFilePath(Sheet.DocumentName));
Sheet.Free;
End;
//以下代码在文件名称列表第三行插入抬头,第一行为图表总数,第二行为文件说明,第三行为空。
FileNameList.Insert(0,'The multi level Project consists of ' + IntToStr(SheetCount) + ' open sheets.');
FileNameList.Insert(1,'The schematic documents'' filenames are : ');
FileNameList.Insert(2,'');
GenerateTextFile(FileNameList);
End;
FileNameList.Free;
End;
此段代码片段所使用了下列的重要的函数和过程。
|
MessageRouter_GetState_WindowKind |
SchAPI_GetDocumentHandleByIndex |
|
SchAPI_GetCurrentEditorWindow |
Querydatabase |
|
SchAPI_GetCurrentSheetHandle |
SetState_Parameter |
|
SchAPI_GetDocumentCountInProject |
MessageRouter_SendCommandToModule |
这段代码做什么?
MessageRouter_GetState_WindowKind返回一个当前被使用的文档编辑器类型字符串描述,如果此字符串不是一个“Sch”格式,服务器停止,否则,通过SchAPI_GetDocumentCountInProject函数获得图表总计,SchAPI_GetCurrentSheetHandle函数得到当前原理图文档句柄,句柄被传递到SchAPI_GetDocumentCountInProject函数,此函数返回在设计资源管理器打开的原理图图表总计。
接着一个由原理图图表的文档名称组成的字符串和一列描述字符串被输出到文本文档,如果产生的总计是超出一个,那么循环机制被使用,对于每一个参数的传递,函数SchAPI_GetDocumentHandleByIndex接受三个参数,第一个参数J值为循环变量,第二个参数为当前的图表句柄,最后的参数为是否设置项目图表为焦点,此函数返回句柄到一个项目的原理图图表。带有句柄的TSchSheetOptions类在当前原理图编辑器的图表中创建一个图表对象,图表对象被使用来获取它的文件名称和路径。
最后,GenerateText过程被调用,在设计资源管理器中输出数据到一个文本文档,这个文本文档中将有当前打开的多个图表项目图表文件名称或一个打开的原理图图表的文件名称。
6.4 显示关于原理图元件信息的例子
此例子将示范对象迭代程序和组迭代程序的使用。对象迭代程序收集每一个发现的元件对象句柄,获得元件对象容器并且传递到组迭代程序。
组迭代程序接着收集此特定的元件的图元,进程继续直到在当前原理图图表中没有更多的元件对象被找到。每一个元件的信息和它的引脚位置被显示在设计资源管理器的文本编辑器中。