5.3.2空间迭代程序例子
请见SDK例子\SAMPLES\NO4\API\PCB\SearchAndHighLightFreePrims。
此代码例子查找并且在边界约束内高亮查找到的对象。
{....................................................................................}
Procedure UpdateDisplay;
Var
P : PChar;
Begin
GetMem(P, 255);//创建一个动态的内存变量并且指针到内存块的地址,大小为255。
StrPCopy(P,'');//复制一个空字符到一个空值终止的字符串,即用空值初始化内存块。
SetState_Parameter(P,'Action','All');
//SetState_Parameter过程插入一个参数到指定的参数文本块中,为动作,参数为All。
MessageRouter_SendCommandToModule('PCB:Zoom',P,255,0);
//MessageRouter_SendCommandToModule函数运行指定的过程在指定的模块内,如果成功则返回True,否则返回Flase.此函数允许一个服务器来运行一个在其它服务器中的进程。即调用PCB服务器中的Zoom缩放进程。
FreeMem(P,255);//释放变量
End;
{....................................................................................}
Procedure SearchForObjectsWithinTheBoundaryRectangle;
Var
BoardHandle: TObjectHandle;
PCBObject: TPCBObject;
Iterator: TObjectHandle;
X1,Y1,X2,Y2: Tcoord;
ASetOfLayers: TSetOfLayers;
ASetOfObjects : TSetOfObjects;
ObjectKind: TObjectID;
ObjectHandle: TObjecthandle;
Begin
BoardHandle := PcbApi_GetCurrentBoardHandle;
//PcbApi_GetCurrentBoardHandle函数返回当前在设计资源管理器中的PCB文档的句柄,
//如果印制板没有找到则返回值是空(nil)。
If BoardHandle = 0 Then //当前激活文档并非是PCB文档则退出
Begin
ShowMessage('在客户端中没有PCB文档当前被打开。(No PCB document is currently open in Client.)');
Exit;
End;
If Not (PcbApi_ChooseRectangleByCorners(BoardHandle,
'请选择第一个角(Choose first corner)',
'请选择第二个角(Choose final corner)',
x1,y1,x2,y2)) Then Exit;
//通过用户光标选择第一个角和第二外角来确定一个区域,PcbApi_ChooseRectangleByCorners
//函数提示用户来在印制板上两次点击来返回一个矩形的坐标。
//为空间迭代程序设置定义。
ASetOfLayers:= [eTopLayer,eBottomLayer];//设置层,eTopLayer、eBottomLayer。
ASetOfObjects := [eArcObject,eTrackObject];//设置要查找的对象,弧对象、线对象。
Iterator := PcbApi_CreateSpatialIterator(BoardHandle,//当前印制板句柄。
X1,Y1,X2,Y2,//边界坐标。
ASetOfLayers,//查找基于的层。
ASetOfObjects);//要查找到的对象。
//创建一个空间迭代程序。
//空间迭代程序在一个循环中。
ShowInfo('这里将高亮显示查找到的对象(getting there)...');
For ObjectKind := eArcObject To eTrackObject Do //外循环控制要查找的对象集合。
Begin
ObjectHandle := PcbApi_GetFirstSpatialObject(Iterator, ObjectKind);
//PcbApi_GetFirstSpatialObject函数使用给定的空间迭代程序句柄来返回第一个查找到的对象的句柄。
While ObjectHandle <> 0 Do //查找直到找不到为止。
Begin
PCBObject := TPCBObject.Create(0);//新建立PCB对象。
PCBOBject.ObjectHandle := ObjectHandle;//把查找到的对象句柄赋予新建的PCB对象。
PCBObject.QueryDataBase(eGetState);
//用内部服务器数据同步外部服务器数据,即把查找到的PCB对象中数据赋予新建的PCB对象。
PCBObject.SetState_Selection(True);//设置PCB对象的选择状态。
PCBObject.QueryDataBase(eSetState);//内外部服务器数据同步内部服务器数据。
PCBObject.Free;//新建的PCB对象释放。
ObjectHandle := PcbApi_GetNextSpatialObject(Iterator, ObjectKind);
//PcbApi_GetNextSpatialObject函数使用给定的空间迭代程序句柄返回下一个查找
//到的对象句柄连同对象种类值。
End;
End;
PcbApi_DestroySpatialIterator(Iterator);
//销毁空间迭代程序。
UpdateDisplay;//更新显示。
End;
此段代码使用了下列重要的函数或过程。
PcbApi_CreateSpatialIterator |
PcbApi_GetCurrentBoardHandle |
PcbApi_GetFirstSpatialObject |
QueryDatabase |
PcbApi_GetNextSpatialObject |
PcbApi_DestroySpatialIterator |
这段代码做什么?
如果需要此代码能有效地工作,您需要在设计资源管理器99中打开一个PCB文档,使用函数PcbApi_ChooseRectangleByCorners来为此空间迭代程序对象选取一个边界矩形的坐标,在PCB文档上使用一个边界矩形,是为了让空间迭代程序在此区域中查找对象,一旦弧对象和线对象被在此边界矩形内查找到,它们的选择属性被激活,这些对象将被高亮显示。(e-works)