7. 友情提示
7.1 检查编辑器窗体是否为原理图类型
如果原理图编辑器服务器没有被安装在设计资源管理器中,当一个自定义的服务器尝试向原理图编辑器发请求时,设计资源管理器可能会崩溃。
因此这里有两个已写好的代码片段,您应该在进行任何Sch API调用前,把它插入到代码中。
·第一个代码片段当前编辑器窗体是否是原理图图表类型。
If MessageRouter_GetState_WindowKind(SchAPI_GetCurrentEditorWindow) <> 'Sch' Then Exit;
//检查当前的文档类型是否是Sch,即原理图,如果不是则退出。
//SchAPI_GetCurrentEditorWindow是返回当前文档对象的窗体句柄。
//MessageRouter_GetState_WindowKind函数使用编辑器窗体句柄返回表示编辑器窗体类型的字符串值。例如,Advanced PCB 编辑器返回“PCB”字符串,并且TextEdit服务器返回“TEXT” 字符串。
·第二个代码片段检查当前文档是否是一个库文档。
If MessageRouter_GetState_WindowKind(SchAPI_GetCurrentEditorWindow) <> 'SchLib' Then Exit;
·第三个代码片段将强制在设计资源管理器中加载原理图编辑器服务器,如果在设计资源管理器中此服务器没有被激活(停止)的话。
hModule := GetModuleHandle('AdvSch');
If hModule = 0 Then
Begin
P := AllocateParameterBlock(256);
//AllocateParameterBlock函数创建一个用空字符填充的内存块。返回指向已分配的内存句柄。
SetState_Parameter(P,'Action','Start');
SetState_Parameter(P,'Server','Sch');
//上述代码SetState_Parameter(P,'Action','Start')是在P指针所指向的参数块中插入“Action”参数,值为“Start”。SetState_Parameter过程插入一个参数到指定的参数文本块中,过程有三个参数,P为指定到一个参数文本块的指针,Name为指定要被插入的参数名称,Value为指定要被插入的参数值。
MessageRouter_SendCommandToModule('Client:SetupEDAServers',P,256,cProcessWindow_DontCare);
//MessageRouter_SendCommandToModule函数定义如下:
//FunctionMessageRouter_SendCommandToModule(Process : TString;Parameters: PChar;
MaxParameterSize: Integer;EditorWindow: HWnd) : Boolean;
//MessageRouter_SendCommandToModule函数运行指定的过程在指定的模块内,如果成功则返回True,否则返回Flase.此函数允许一个服务器来运行一个在其它服务器中的进程。
//Process参数为指定完整的进程名称。举例来说,“Macro:RunMacro”,此参数对大小写不敏感。
//Parameters为传递给进程的参数块。MaxParameterSize为参数分配的内存大小。
//EditorWindow为目标文档对象窗体句柄。无文档则为cProcessWindow_DontCare。
FreeParameterBlock(P,256);
//FreeParameterBlock过程释放先前为参数分配的内存,P指定指向参数内存块的指针,256为指定指向参数内存块的指针。
End;
7.2 产生一个包含元器件名称和引用库的输出报告文本文件
此代码例子根据原理图图表名称产生了一个文本文件,扩展名称是Txt,此文本文件中报告在原理图文档中查找到的元件的元件名称、引用库、流水号信息。
请见SDK例子\SAMPLES\NO3\API\Sch\Generate a Text document。
{....................................................................................}
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 WriteAndEmbedTextFileIntoDDB;
Var
CurrentSheet: TObjectHandle;
ComponentHandle : TObjectHandle;
Iterator: TObjectHandle;
PartHandle: TObjectHandle;
I : 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;
//SchAPI_GetCurrentSheetHandle函数返回当前原理图文档的指针(句柄)。
Iterator := SchAPI_CreateIterator(CurrentSheet,ePart);
//SchAPI_CreateIterator函数给定两个参数,返回一个迭代程序对象的句柄,对象句柄到当前图表文档和对象种类。此函数用于搜索指定对象种类的对象。