技术开发 频道

SAP 2007创新技术论坛于本月25日在京举行

此例子代码从当前原理图中查找元件对象,然后再查找此一个元件对象的引用库对象共有多少个元件,可能元件库中包含多个元件,一般是一个元件,对元件库中的每一个元件对象进行组迭代程序查找,找到其下所有的子对象,包含引脚对象和非引脚对象,把引脚对象信息加到列表中,对象引用库的查找直到引用库中所有的元件全部迭代完毕为止,再返回查找当前原理图中下一个元件对象,重复上面的过程,直到把当前原理图中所有的元件对象全部查找完毕为止,最后把列表打印出来。

请见SDK例子\SAMPLES\NO3\API\Sch\Report Sch Parts。

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

Implementation

Var

Partslist : TStringList;

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

//以下这段代码是根据当前原理图文档来取得其容器对象,代码主要是用在对象发生改变后,刷新容器对象。

Procedure Repopulate;

Var

EntityHandle: ClientTypes.TObjectHandle;

BinderHandle: ClientTypes.TObjectHandle;

Begin

EntityHandle:=ClientAPI_FindEntityByDataHandle(MessageRouter_GetState_CurrentEditorWindow);

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

//ClientApi_FindEntityByDataHandle 函数使用一个编辑器窗体句柄来返回查找返回一个实体的句柄。此实体能表现为设计资源管理器编辑器窗体内的一个文档。您能通过使用ClientAPI_QueryEntity 或ClientAPI_QueryDocumentEntity 查询此实体来检查文档类型,名称等等。

If EntityHandle = 0 Then Exit;

BinderHandle := ClientApi_GetDocumentOwnerBinder(EntityHandle);

//ClientApi_GetDocumentOwnerBinder函数获得在其内部存有文档的封装对象的句柄,一个封装对象表现为包含实体的容器,一个实体可为一个设计文档或文件来。

ClientApi_RepopulateDocumentEntity(BinderHandle,False);

//ClientApi_RepopulateDocumentEntity 过程在封装对象中刷新文档实体的内容依赖于Recursive参数值,如果参数为false,当前实体被刷新,否则实体的封装对象被刷新。它在当文档被增加到一个封装对象中您需要刷新封装对象来让设计资源管理器知道有新的文档时情况下很有用。

End;

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

//以下这段代码在给定元件中把元件内引脚对象信息取出来。把元件对象看成一个组件,组件中再包含元件对象即引脚。建立组迭代程序来取得引脚对象的信息。

Procedure IterateInsidePartContainerList(APartContainerList : TObjectHandle; APart : TSchPart);

Var

ObjectKind: TObjectKind;

GroupIterator : TObjecthandle;

Primitive : TObjectHandle;

Pin : TSchPin;

Handle: TObjectHandle;

Begin

GroupIterator:= SchAPI_CreateGroupIterator(APartContainerList);

//创建组迭代程序对象,此代码是从主程序中传入中的引脚对象和非引脚对象建立迭代程序对象

If GroupIterator <> Nil Then //如果组迭代程序对象建立成功

Begin

Partslist.Add('Part Object Information: Library Reference = ' +

StrPas(APart.LibReference) +

' Designator = ' + GetStringFromTextObject(APart.PartDesignator));

//把元件对象的属性“库参照”(LibReference)和“元件流水号”(PartDesignator)和说明字符串一起加到Partslist列表中,作为一行字符串。

Partslist.Add('Pins of this part object:');

Primitive := SchAPI_GetFirstGroupObject(GroupIterator);

//查找第一个组对象。

//以下代码对引脚对象中具体的每一根引脚线进行查询,并把其坐标值放到列表中。

While Primitive <> Nil Do //循环查找引脚对象,直到找完。

Begin

If SchAPI_GetObjectIDFromObjectHandle(Primitive) = ePin Then

//SchAPI_GetObjectIdFromObjectHandle函数通过给定对象句柄参数据返回原理图对象的ID,如果ID是ePin,即表明是引脚对象。

Begin

Handle := SchAPI_ReplicatePartItem(Primitive,APart.Objecthandle);

//根据元件对象句柄和引脚图元对象的句柄返回引脚对象句柄。必须通过单独建立引脚对象方式取得引脚的属性,不能用引用对象句柄直接从元件中读取。

Pin := TSchPin.Create(Handle);//建立一个新的引脚对象。

Pin.Querydatabase(eGetState);//同步数据库。

Partslist.Add('Pin located at(x=' + IntToStr(Pin.LocationX) +

' ,y= ' + IntToStr(Pin.LocationY) + ')');

//把引脚对象的位置值加到Partslist列表中

Pin.Free;//释放引脚对象

SchAPI_DestroyPartItem(Handle); //释放引脚对象句柄

End;

Primitive := SchAPI_GetNextGroupObject(GroupIterator);//再查找下一个引脚对象。

End;

SchAPI_DestroyGroupIterator(GroupIterator); //释放组迭代程序对象。

End;

End;

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

//以下代码是此章节例子的主程序。

Procedure GetPinInformationAboutParts;

Var

CurrentSheet: TObjectHandle;

ComponentHandle : TObjectHandle;

PartContainerList : TObjecthandle;

Iterator: TObjectHandle;

PartHandle: TObjectHandle;

I, PartCount: Integer;

SchPart : TSchPart;

F : TextFile;

S : TString;

CurrentSheetEntity: ClientTypes.TObjecthandle;

Begin

If MessageRouter_GetState_WindowKind(SchAPI_GetCurrentEditorWindow) <> 'Sch' Then Exit;

//检查当前的文档类型是否是Sch,即原理图,如果不是则退出。

//SchAPI_GetCurrentEditorWindow是返回当前文档对象的窗体句柄。

//MessageRouter_GetState_WindowKind函数使用编辑器窗体句柄返回表示编辑器窗体类型的字符串值。例如,Advanced PCB 编辑器返回“PCB”字符串,并且TextEdit服务器返回“TEXT” 字符串。

CurrentSheet := SchAPI_GetCurrentSheetHandle;//取当前原理图文档的句柄。

Iterator := SchAPI_CreateIterator(CurrentSheet,ePart);

//创建元件对象迭代程序,对元件对象进行搜索。

If Iterator <> Nil Then //元件对象迭代程序建立成功。

Begin

Partslist := TStringList.Create;//建立存放取出的信息的列表。

PartHandle := SchAPI_GetFirstObject(Iterator); //查到第一个元件对象。

While PartHandle <> Nil Do //循环查找元件对象,直到找不到为止。

Begin

SchPart := TSchPart.Create(Nil);//建立一个空的元件对象。

SchPart.ObjectHandle := PartHandle;

//把找到的元件对象句柄赋予新建元件对象句柄。

SchPart.Querydatabase(eGetState);

//同步内部数据库和外部数据库,用内部数据刷新外部数据库。

ComponentHandle := SchAPI_GetLibraryComponentHandle(

SchPart.LibReference,kShortStringLength);

//取得当前元件对象所在的库组件对象的句柄。库组件中可能包含超过一个以上的元件对象。

//SchAPI_GetLibraryComponentHandle函数用给定的库引用字符串和字符串的长度参数返回一个元件库组件的句柄。kShortStringLength是常量,为256。此处的库引用字符串是元件的库引用字符串,往往与元件名称一样。SchPart.LibReference是指元件在元件库中的名称。

PartCount := SchAPI_GetLibraryPartCount(ComponentHandle);

//统计当前元件所在的库组件中有多少元件对象,库中可能包含超过一个以上的元件。

//SchAPI_GetLibraryPartCount函数返回给定库组件的元件的数量。如果给定的句柄不是一个组件对象句柄,则返回值为0。即在元件库中查此共有多少子元件,即元件库中包括多少元件(可能元件库中包含两个或两个以上元件)。

For I := 1 To PartCount Do

Begin

PartContainerList := SchAPI_GetLibraryPartContainer(

ComponentHandle,I,eCompDisplayNormal);

//SchAPI_GetLibraryPartContainer函数返回一个库组件容器的句柄,在此库中,每一个组件有三个容器,并且每一个容器保存一个组件元件。参数是此库组件的对象句柄,元件ID和组件显示模式(Normal, DeMorgan and IEEE)。

//此代码返回库组件中的第i个元件(库组件中可能有超过一个以上的元件)的句柄。

IterateInsidePartContainerList(PartContainerList,SchPart);

//对元件中每一个子对象(包括引脚对象和非引脚对象进行处理)

//第一个参数是当前元件库组件库中的某个元件的句柄,第二个参数是当前元件的句柄。

End;

SchPart.Free;//释放新建的元件对象

PartHandle := SchApi_GetNextObject(Iterator);//查下一个元件对象

Partslist.Add('');

End;

SchAPI_DestroyIterator(Iterator);//销毁对象迭代程序对象

Partslist.Add('Report created on '+ DateToStr(Date) + ' ' + TimeToStr(Time));

End;

CurrentSheetEntity :=ClientApi_FindEntityByDataHandle(SchAPI_GetCurrentEditorWindow);

//ClientApi_FindEntityByDataHandle 函数使用一个编辑器窗体句柄来返回查找返回一个实体的句柄。此实体能表现为设计资源管理器编辑器窗体内的一个文档。您能通过使用ClientAPI_QueryEntity 或ClientAPI_QueryDocumentEntity 查询此实体来检查文档类型,名称等等。

ClientApi_GetDocumentEntityAbsoluteAddress(CurrentSheetEntity,S);

//ClientApi_GetDocumentEntityAbsoluteAddress在关联的设计数据文档内获得一个文档实体的绝对地址。

S := ForceFileNameExtension(S, 'TXT');

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

//产生并且放入文件到当前DDB中

AssignDDB(F,S,'Admin');//在当前DDB中建立输出文件S

Rewrite(F);

Writeln(F,'Schematic Parts Report...');

Writeln(F,'=========================');

Writeln(F,'');

Writeln(F,'');

For I := 0 To PartsList.Count - 1 Do

Writeln(F,PartsList.Strings[I]);

//把列表中数据输出到输出文件S

Writeln(F,'');

CloseFile(F);

Repopulate;//刷新实体对象

Partslist.Free;//释放列表对象

End;

此段代码片段所使用了下列的重要的函数和过程。

MessageRouter_GetState_WindowKind

SchApi_GetFirstIterator

SchAPI_GetCurrentEditorWindow

SchApi_GetNextIterator

SchAPI_GetCurrentSheetHandle

SchApi_CreateGroupIterator

SchAPI_CreateIterator

SchApi_DestroyGroupIterator

SchAPI_GetLibraryComponentHandle

SchApi_GetFirstGroupIterator

SchAPI_GetLibraryPartCount

SchApi_GetNextGroupIterator

SchAPI_GetLibraryPartContainer

Querydatabase

SchApi_CreateIterator

SetState_Parameter

SchApi_DestroyIterator

SchAPI_ReplicatePartItem

SchAPI_DestroyPartItem

0
相关文章