·例子2,统计每一个元件对象中的线对象
请见SDK例子\SAMPLES\NO4\API\PCB\Count Tracks of a Component。
{....................................................................................}
//此例子示范统计一个PCB文档中的一个组对象中内嵌的对象的方法,在此例子中,每一个元件对象(Component)的线(Tracks)被统计。
Procedure ObjectIteratorExample;
Var
TrackHandle : TObjectHandle;
TrackIteratorHandle : TObjectHandle;
ComponentHandle : TObjectHandle;
ComponentIteratorHandle : TObjectHandle;
Track : TPCBTrack;
TrackCount: Integer;
Component : TPCBComponent;
Begin
If PcbApi_GetCurrentBoardHandle = 0 Then Exit;
//如果当前激活的编辑器不是PCB编辑器则退出。
Component := TPCBComponent.Create(0);
//创建一个元件对象。
Track := TPCBTrack.Create(0);
//创建一个线对象。
TrackCount := 0;
//线总数先置为0。
ComponentIteratorHandle := PcbApi_CreateIterator(PcbApi_GetCurrentBoardHandle,
eComponentObject,//元件对象
eProcessAll,//处理所有
eIgnoreLayer);
//PcbApi_CreateIterator函数返回到一个迭代程序对象的对象句柄。
ComponentHandle := PcbApi_GetFirstObject(ComponentIteratorHandle);
// PcbApi_GetFirstObject函数使用给定的迭代程序(iterator)句柄返回第一个发现的PCB对象句柄。
While(ComponentHandle <> 0) Do //查找元件对象
Begin
Component.Objecthandle := Componenthandle;
//把查找的元件对象句柄赋予元件的对象句柄属性。
Component.QueryDatabase(eGetstate);
//用内部服务器数据同步外部服务器数据。
TrackIteratorHandle := PcbApi_CreateIterator(Component.Objecthandle,//元件对象。
eTrackObject,//线对象。
eProcessAll,//处理所有。
eTopOverlay);
//基于查找到的元件对象建立查找其内部线对象的迭代程序。
TrackHandle := PcbApi_GetFirstObject(TrackIteratorHandle);
//查找第一个线对象。
While(TrackHandle <> 0) Do //如果找到线对象。
Begin
Inc(TrackCount);//线对象计数。
TrackHandle := PcbApi_GetNextObject(TrackIteratorHandle);
//查找下一个线对象,在内循环中。
End;
If Not ConfirmNoYes('此元件(This Component) ' + Component.Pattern + ' 有(has) ' +
IntToStr(TrackCount)+ ' 线(Tracks)。' + #13 + #13 + '继续(Continue) ?') Then Break;
//提示用户当前查找到的元件有多少线对象并询问是否继续,如果不则中断。
TrackCount := 0;//线对象总数置空。
PcbApi_DestroyIterator(TrackIteratorHandle);//销毁线查找迭代程序
ComponentHandle := PcbApi_GetNextObject(ComponentIteratorHandle);
//查找下一个元件对象,在外循环中。
End;
PcbApi_DestroyIterator(ComponentIteratorHandle);
//销毁元件查找迭代程序。
Track.Free;//线对象释放。
Component.Free;//组件对象释放。
End;
这段代码做什么?
这里有两个循环,外循环在印制板数据库中查找元件对象,内循环在元件对象中查找线对象,迭代程序在元件(Component)对象内寻找线对象并且报告在每一个元件对象中查找到的线对象的总数。
5.3 空间迭代程序
空间迭代程序通过边界约束、层设置和对象种类集合来遍历印制板(PCB)编辑器数据库,参数有 (X1,X2,Y1,Y2)、层设置、被提供的对象类型集合。
5.3.1空间迭代程序函数
空间迭代程序函数是使用印制板句柄或组对象句柄、定义的区域、层设置和对象种类设置三个参数,来遍历数据库的迭代程序函数,当使用空间迭代程序时,内置在PCB编辑器中的数据库自动使用空间数据结构。
为建立迭代程序机制,需要使用下列的迭代程序API函数。
·PcbApi_CreateSpatialIterator
·PcbApi_DestroySpatialIterator
·PcbApi_GetNextSpatialObject
·PcbApi_GetFirstSpatialObject
这四个空间迭代程序是设置查找和检索机制的必需的方法,每一个函数和它们的参数将在其明细中被说明,例子说明了如何使用空间迭代程序。
PcbApi_CreateSpatialIterator
参数 |
描述 |
AparentObject |
AparentObject定义一个空间迭代机制将基于的容器。 |
X1,Y1,X2,Y2X1,Y1,X2,Y2 |
定义一个空间迭代机制将基于的区域。 |
SearchLayerSet |
SearchLayerSet定义了一个空间迭代机制将基于的一组层。 |
BoardPrimitiveSet |
BoardPrimitiveSet定义了一个空间迭代机制将基于的一组对象。 |
PcbApi_CreateSpatialIterator返回迭代程序对象的句柄,为了遍历一个选择的层组,您需要为SearchLayerSet参数来定义层的集合,为处理一个确定的图元组,您需要来定义BoardPrimitiveSet。
PcbApi_DestroySpatialObject
参数 |
描述 |
Iterator |
表示要销毁迭代程序的句柄。 |
PcbApi_DestroySpatialIterator被用在查找进程结束时销毁迭代程序对象。
PcbApi_GetFirstSpatialObject
参数 |
描述 |
Iterator |
一个迭代程序的句柄。 |
ObjectKind |
为迭代程序进程返回或设置对象的种类。 |
PcbAPI_GetFirstSpatialObject设立一个迭代程序并且返回第一个查找到的对象句柄。
PcbApi_GetNextSpatialObject
参数 |
描述 |
Iterator |
一个迭代程序的句柄。 |
ObjectKind |
为迭代程序进程返回或设置对象的种类。 |
PcbAPI_GetNextSpatialObject返回下一个查找到的对象句柄。
此进程使用基于While Do的空间迭代程序来查找指定的PCB对象,也就是说,循环体直到查找到PCB对象的句柄是零为止。
通过PcbApi_GetCurrentBoardHandle函数获得当前的印制板句柄。
PcbApi_CreateSpatialIterator函数通过使用其所支持的参数、父类句柄、对象类型、进程方法和层来创建空间迭代程序的句柄。
使用PcbApi_GetFirstSpatialObject函数得到第一个查找到的对象的句柄,使用PcbApi_GetNextSpatialObject函数继续查找,得到下一个查找到的一个对象的句柄。
用PcbApi_GetFirstSpatialObject函数取得第一个查找到的PCB对象的句柄,并且接着做一些处理,不要忘记对此PCB对象调用QueryDatabase(eGetState)和QueryDatabase(eSetState) ,再使用PcbApi_GetNextSpatialObject函数继续调用对象句柄来进行下一个对象的查找并且做处理。
一旦查找到的对象句柄为零,也就是说,再也没有更多的对象被查找到,最后使用PcbApi_DestroySpatialIterator函数来销毁此迭代程序对象。