信息化 频道

<连载>Protel二次开发从入门到精通

  3. 理解设计资源管理器环境
  3.1 什么是设计资源管理器?

Protel 99 是构建在很成熟的、艺术、智能的技术基础上。SmartTool技术使Protel编辑器和Active编辑器一起揉合在一个单一的用户界面上,组成设计资源管理器;SmartDoc技术使文档集成和文档管理有可能被一起揉合,所有的设计组文档存储到一个单一的集成设计数据库中;SmartTeam技术允许设计组之间协同,也就是设计组成员在同一时间,可工作在相同的设计数据库中,一当组成员被指定,它就可以严格地控制每一个成员有哪一个文件夹和文档的访问权限。

Protel 99是设计资源管理器应用程序和以插件方式加入在服务器的中主要系统和基本系统。Protel的设计资源管理器是基于客户/服务器模式架构的,每一端单独分开工作,在个人计算机上执行各种各样的应用程序。设计资源管理器是运行在Windows平台上,为所有与设计资源管理器兼容的应用程序提供一个集成的工作环境,应用程序将以插件方式加入到资源管理器内的服务器中。例如,如果您有已安装的Protel原理图编辑器作为您的原理图工具,原理图编辑器将被作为工具,在设计资源管理器内使用(作为一个服务器引用)。如果您想要开始一个新的原理图,或打开一个已存在的原理图,设计资源管理器将为您自动启动原理图编辑器服务器,作为一个工具来使用。在设计资源管理器中,所有已安装的程序作为服务器连接到设计资源管理器环境中,并且能在其它所有服务器程序单独需要时被运行。设计资源管理器的核心是客户端模块,其将处理服务器接口和用户界面。

设计资源管理器提供很多服务,对所有的服务器而言,这些服务是通用的。例如,创建一个新的文档,您希望的文档类型能在不经意之间完成。设计资源管理器有一个强大的开放的构架,不仅支持Protel的服务器,而且支持运行任何开发者所希望的服务器,开发者揉合他们自己的软件工具到设计资源管理器环境中。资源管理器有完整应用程序接口(API)访问到SCH原理图编辑器,PCB编辑器和其它以插件方式加入到其中的编辑器。

  3.2 开放的架构

Protel的设计资源管理器和EDA服务器是基于客户/服务器模式构建的,其所有的工具运行在一个单一的完整客户化环境中,在此环境下,用户能创建和修改菜单,工具条和热键。此环境具有宏功能、一个已安装的文本编辑器、图表和spread应用程序,并且完全地支持以插件方式加入的其它EDA服务器。客户/服务器架构支持独立的客户端和服务器端的开发工具,能单独地被升级。这允许设计组可从多个的供应商中选择非常好的的解决方案,这些独立的升级单元能通过客户支持层无缝的联结。

设计文档在设计资源管理器后台,服务器制作向导运行在前台,此向导创建构造一个新的EDA服务器所必须的文件。客户/服务器模式打破任务到交互式的“客户端”和分布式“服务器”进程,此方法适合于多工具EDA任务模式,客户/服务器模式是基于开放的构架,在此架构中,容易为EDA应用程序以插件方式加入并运行在集成的环境中。

Protel设计环境是智力开发环境,此环境是一个高度地集成工具集,在其中,设计任务是中心,并且软件工具简单地提供需要的服务来进行开发设计。此集成概念能在微软Office产品中看到,焦点在工作应用程序内部移动,正如,Word和Excel,随着文档在工作,文档或许是一个工作簿或一个文本文档。

  3.3 什么是EDA服务器?

 


图1-36 EDA服务器

图1-36显示设计资源管理器和以插件方式加入的服务器。设计资源管理器为所有以插件方式加入的服务器提供一个集成的工作环境。EDA服务器是一个应用程序,运行在设计资源管理器中,来执行某一个指定的任务。服务器本质上是一个安装在设计资源管理器中的模块,执行指定的算法和数据结构,来提供指定的服务。此服务器在用户和计算机之间通信,使用设计资源管理器的接口单元。

设计资源管理器技术为多个服务器提供一个标准化的用户环境和平台。服务器可能包括一个较宽范围的EDA工具,包括原理图(SCH)捕捉、PCB设计、模拟装置(simulators)、PLD、FPGA设计和客户化文档工具等,实际可以包括以开放设计资源管理器架构开发的任何工具。

一个服务器将支持一组进程,一个进程承担一个特别的任务,如重绘屏幕,或产生一个物料清单表(BOM)。服务器被编译为一个动态连接库文件,设计资源管理器当需要时会加载来提供功能服务。

  3.3.1服务器类型

设计资源管理器平台接受三种类型的服务器,分别如下:

·编辑器服务器

编辑服务器是一个允许用户在设计资源管理器内部编辑文档而定义的文档类型的服务器。文档浏览服务器便是其中一种,其允许用户在设计资源管理器内部来浏览服务器定义的文档。例如,PCB和SCH原理图服务器包括两个文档编辑器。PCB和SCH原理图编辑器被用来创建、编辑和校验PCB和SCH原理图设计,在PCB或SCH原理图编辑器中创建组件Footprint(包装形式)和管理组件Footprint(包装形式)库,只要您愿意,您就能打开许许多多SCH原理图或PCB文档和组件Footprint(包装形式)库,仅受您的计算机的内存限制。

在设计资源管理器中,编辑器服务器有一个面板关联到文档窗口,此面板服务器是一个可视化的界面,如列表框、按扭等,与文档相互作用。每一个文档类型有它自己的面板和文档窗口。每当有一个文档在设计资源管理器中打开时,此文档服务器将被激活。

·向导服务器

向导服务器是一个多页的对话框,通过询问问题并且根据用户的回答来帮助用户快速完成一个任务。例如,在原理图(SCH)编辑器中使用物料清单(BOM)向导,并且根据用户的回答来获得一个原理图文档的客户化格式的BOM报表。

·实用服务器

实用服务器没有任何默认的用户界面,它们在设计资源管理器内部,在其它服务器创建的文档上被执行操作。它们常被以“附件”方式来调用,其目的是为在设计资源管理器内部的一个服务器增强或提供附加的特征。

  3.4 服务器如何联接设计资源管理器?

    服务器在设计资源管理器环境中提供服务功能,为了提供这些服务功能,服务器通过进程接口联接到设计资源管理器。一个进程能被认为如软件的执行任务次序,此任务可以是一个简单如重绘屏幕动作,或较复杂的如产生一个物料清单(BOM)报表,也就是说,一个进程执行一个动作(如打开一个文件,打印一个文件)。因此,EDA服务器通过一组进程来提供它们的“服务”,进程是设计资源管理器环境的基本单元,所有的任务和动作在设计资源管理器内的执行都是以启动进程方式来进行的。


图1-37 服务器如何连接资源管理器

图1-37显示通常的用户接口,用户通过的客户端界面执行任务,客户端执行来自一个服务器所提供的服务。

 

当一个用户请求一个指定的任务时,实际上用户是通过设计资源管理器用户界面开始请求这个任务,然后设计资源管理器在内部为指定的功能请求恰当的服务,接着服务器提供需要的服务,执行相应的功能。

  3.5 设计资源管理器用户接口原理

设计资源管理器开放的本质意味着附加的服务能在任何时间内,以插件方式加入到设计资源管理器中,来扩展服务器的能力。设计资源管理器是一个软件平台,使用动态连接库(DLL),在整个环境中几乎仅可执行一个EXE文件(Client99SE.exe),此可执行文件控制设计资源管理器用户界面,当服务器DLL集中起来,每一个单独地提供EDA功能时,设计资源管理器提供一个混合的接口模式,在运行时同时向用户(操作者)和程序两者暴露其功能,在设计资源管理器中,一个被暴露的功能是通过服务器DLL作为一个进程来提供。

 

 


所涉及的服务器都以插件方式加入到设计资源管理器中,文档编辑器/浏览器服务器有一些资源,这些资源有启动进程的进程启动器。文档编辑器处理指定类型的,在设计资源管理器中所激发的文档。举个实际的例子,印制板(PCB)服务器处理PCB文档,原理图(SCH)服务器仅处理原理图文档。一个文档编辑服务器能支持超过一种以上的文档类型,每一个编辑器或浏览器有如上图所分配的一些资源,资源被组成超过一个以上的进程启动者,来启动指定的进程。

  3.5.1什么是进程和进程参数

进程是非常强大的,并且能在较高的抽象层次被模块化的模块。举例来说,报告电子规则违犯(electrical rules violations)在较低层实现系统功能(例如,在设计资源管理器中获得一个文档的图表句柄)。为更多地增强服务器进程控制能力,进程可有“参数”,参数允许一个进程带有所需要的信息,当进程被调用时,信息被传递,传递进程参数是进程强大的特征,其允许直接地控制进程,从头到尾操作一个进程。进程启动者通过菜单命令、工具条上的按扭和热键执行进程。这些进程启动者是可客户化定制的。

每一个被调用的进程都有一个进程标识符,进程标识符被通过冒号分成两个部分,第一个部分指出此进程的服务器名称,第二个部分是进程的名称。例如,进程“Sch:ZoomIn”是由Protel的SCH原理图服务器提供的,当此进程被启动时,或者通过选择菜单项、键入热键或激活工具条按扭(在设计资源管理器中,按扭被定义作为一个进程启动者),它将在当前活动的原理图图表中执行缩放任务。

    当您激活一个进程启动者时(如点击工具条上按扭,或按下一个热键或选择一个菜单项),一个进程被启动,请见图1-39中进程启动者。您不能改变一个进程所执行的任务功能,但您能选择通过特定的进程启动者来启动哪一个进程。

当一个菜单项被选择后,进程标识符所连接到的那个菜单项被传送到服务器,如有参数也可以已被定义。PCB、SCH和其它Protel服务器通过允许在服务器中的使用任何可用的进程,来提供一个强大的生产力,并可映射到任何进程启动者,也允许您定义自己的菜单,工具条和热键。

一般情况下,一个进程被通过选择一个进程启动者来执行,然而,您也许希望来手动地运行一个进程。图1-39中显示有三种不同类型的启动者,能被使用来启动相同的进程。

如果希望试一试在设计资源管理器中,手动启动不同的进程,可从设计资源管理器中选择“Run Process...”,系统将打开运行进程对话框,在对话框中允许您以从下拉进程列表方式,或使用“Browse”按扭来浏览一个进程方式选择一个进程,已选择好进程后,可在参数字段中输入任何参数,并且点击“Ok”按扭来启用此进程。

图1-40 按扭对话框属性

图1-40显示分配到工具条一个按扭的进程,此特殊的按扭启动原理图服务器(SCH)的“Sch:PlaceRectangle”进程。

在参数对话框中输入的参数是Location.X = 100 | Location.Y = 100 | Corner.X = 500 | Corner.Y = 500 | IsSolid= True | Color= 255 | AreaColor = 65280

通过参数文本字段传递进程参数的语法是:

parameter1 = value1 | parameter2=value2 | parameter3 = value3...

(参数1=值1|参数2=值2|参数3=值3…)

每一个参数被垂直条“|”符号分开,参数可按任意次序放置,并且不是每一个参数都必须被传递,那些没有被传递的参数被服务器以默认参数值设置。为一个进程输入相关参数,并赋予到一个按扭,可双击设计资源管理器的工具条,工具条属性对话框将显示出来,点击鼠标左键并且从“Menu”中选择增加项(Add),再次左击鼠标左键,选择“properties”(属性),按扭对话框将弹出来,接着输入详细的信息,如图1-40显示。

3.5.2什么是菜单?

一个文档服务器通常有菜单,菜单被组织起来,使Window用户感觉此界面与其它Windows是一致的,换句话说,一些基本的操作,如打开和保存、打印,或使用标准的窗体编辑操作,如剪切和复制等操作,在文档服务器中的操作方法与其它Windows程序是同样的。这样,使得用户在集成环境下,很容易上手,从而有更多的生产力。在此集成环境中,您通常使用数个窗体应用程序来协同工作。菜单能被编辑,并可创建新的菜单,在设计资源管理器中,任何当前可用的进程都能被连接到任何菜单项。

  3.5.3什么是弹出菜单?

文档服务器的弹出菜单包括访问菜单的指定的热键,例如,按下“E”将弹出编辑菜单,“M”将弹出移动子菜单。这种方式提供了从键盘中直接访问菜单和子菜单的途径,使用起来非常方便。在菜单中有下划线字母是此菜单或菜单项的热键。

  3.5.4什么是工具条?

所有在设计资源管理器中的工具条,都能被固定在任何工作空间或设置为浮动。在工作空间中,它们能被重新摆放到任何位置。您能创建新的工具条和编辑已存在的工具条,来连接在设计资源管理器中当前可用的任意工具条到任意按扭,可分配常用的进程到工具条上,并提供一个方便的热键,这样能在设计资源管理器中为编辑文档实现快速化操作。

  3.5.5什么是键盘快捷键?

文档编辑器能由一个键盘热键列表开始,此列表能被编辑,您能够创建新的热键列表。热键可包括键的组合,如CTRL、SHIFT和ALT,在其组合中有一个或两个键。列表也能被影射键盘热键,直接连接到进程,键也能被影射到菜单。如果一个键被错误地同时影射到菜单和一个进程,则菜单影射优先。

  3.5.6什么是资源?

    在设计资源管理器环境中,您开始执行的所有操作都是通过菜单、工具条和热键进行。菜单、工具条和键盘热键,在设计资源管理器环境中是资源,这点从所周知,请见图1-41。在设计资源管理器中所有的可用的资源都是完全可用户化定制的,如您能增加按扭到一个工具条、重组菜单、并增加您自己的热健等。在设计资源管理器服务器中的所有的功能对用户而言都是可利用的,如放置一个图元、修改缩放层次等都是通过进程执行的,您能通过这些资源来访问进程。在服务器初始化安装过程中,默认的资源定义被加载到设计资源管理器中。

图1-41显示一个服务器的资源,一个文档服务器有三种类型的进程启动者:菜单、工具条和热键。所有进程能被以三种方式中任何一种方式来启动(事实上,任何在设计资源管理器环境中的任何服务器的可用的进程,能被通过任何资源来启动)。设计资源管理器有一个强大的特征,即您有能力来构建自己的资源,并分配进程到这些资源,例如分配您自己的用户资源到特定的文档编辑器,按此方法,您能准确地为每一类型的文档创建想要引入的环境。

对每一个文档服务器来说,必然有资源被分配给它。每一资源被制作成一个或多个进程启动者来启动指定的进程。每一个服务器的默认的资源被定义在资源文件中(*.RCS),此文件定义的默认的菜单、工具条和热键表。客户化的资源不被存储在服务器RCS文件中。当一个服务器第一次被安装到设计资源管理器中时,资源定义被从此服务器中读出并增加到设计资源管理器的RCS文件中。所有的客户化资源在客户端的RCS文件中定义,所有的客户化定制能被在设计资源管理器内完成,当然也可以手工地编辑RCS文件。

  3.5.7什么是服务器安全?

设计资源管理器为您的服务器提供一个方法,来锁定某些特征,直到用户输入一个安全的口令为止。设计资源管理器维护所有的键值(访问口令),相当于每一个服务器来维护锁定,并且操作任何硬件保护校检等等。当一个服务器在设计资源管理器被启动时,将尝试所有它的访问口令,设计资源管理器也能够在任何时间被再次尝试所有访问代码。相当于每一个单独的进程来检验适当的锁和它们的访问级别,并且响应操作。目标是安全防止对把您的服务器非授权的复制到其它处再利用。

  3.5.8什么是宏?

宏制作服务器被包含在设计资源管理器的每一份拷贝中,并且允许您来为任何服务器编写宏脚本,宏脚本运行在设计资源管理器中。宏脚本用ClientBasic编写,宏脚本是一个程序设计语言的专业用语,基本的.Macro脚本能被在设计资源管理器中编写,来执行一个任务,例如,一个重复的进程顺序,弹出对话框的复杂向导,响应用户选择并且在其它Windows应用程序中通过OLE自动化方式执行操作等。宏服务器包含一个综合性的错误标志机制,当遇到一个错误被后,脚本文件被在文本编辑器中打开,错误行被高亮地显示出来,并且一个带有错误条件描述信息的对话框也被弹出来。

  3.5.9什么是设计数据库?

多个文件能被存储在单个的设计数据库中,这些文档可以是Protel文档,如原理图图表、PCB文件,以及其它种类的通过微软Windows应用程序创建的文档等等。

每一个打开的设计数据库存在一个单一个文档编辑窗体,此窗体被归类作为设计窗体。您从一个设计数据库中打开的每一个文档被用一个单独的标签分开在相同的设计窗体中,这使您易于管理从一个单个的图表设计,上到一个大的包括多套原理图和PCB以及文本文档的任何项目。

一个设计数据库默认包含一个叫做设计组(Design Team)工作组文件夹,和一个回收站文件夹(Recycle)。设计组文件夹有三个子文件夹成员,分别是Permissions、Sessions和recycle bin。在设计数据库中,用户可增加、删除文档和任何层次文件夹,但用户不能删除设计组和回收站文件夹。设计数据库以能通过DDB扩展而著称。

Protel 99在一个设计数据库表单中存储所有的单个设计的要素,以.DDB为扩展名的数据库文件,物理地存储在您的硬盘或网络上,数据库中包括您的设计原理图图表、PCB布局、报表、模拟和PLD文档等等,所有的这些,都以项目(items)方式存在此设计数据库中,您修改您的某个设计工作,实际上是设计资源管理器在设计数据库中操作这个项目(items)。

设计数据库能包含文件夹,文件夹可包含文件和其它文件夹。允许您在设计中组织和分组文档,文件夹和文档的组织方式与Windows在硬盘上组织文件夹和文档的方式相同。

设计资源管理器提供许多的不同的数据库的编辑浏览方法,使用设计资源管理器来浏览和操作一个设计数据库,可使用各种各样的方法,例如,当您打开一个设计数据库部份时,原理图信息数据可被导出到原理图图表表格中,您可使用Protel原理图工具来编辑它,同样的,PCB印制板信息能被作为一个PCB布局文档导出。Protel 99能包括各种各样的任何类型的文档,如果您选择了一个被外部的应用程序所创建的设计文档,设计资源管理器将使用创建此文档的应用程序来打开此文档。

我们清楚了解在Protel 99中,所有的设计文档是一个设计数据库的一部份,是一件很重要的事情,所有的文档和它们的权限是不可分开的。您能从Protel 99设计中输入和输出文档,但是当您在Proel 99设计中进行文档设计工作时,您实际上是在设计数据库中工作。

  3.6 定制服务器资源

当服务器被安装时,将有默认的一组资源被分配给它,在设计资源管理器中,您有能力来改变默认的资源或分配扩展的资源到任何文档编辑器,允许您来为每一套文档类型定制其工作环境。

当您安装服务器到设计资源管理器中,您将看到默认的资源已被安装好,例如打开和保存文件菜单,常用工具条和菜单项,并且菜单或热键已被分配。您可分配您的服务器的一个进程到某一个热键、工具条或菜单项,所有的这些都可在设计资源管理器完成。

选择Protel 99 SE客户端中菜单“Customize…”菜单项,系统弹出定制资源对话框。此对话框允许您定制当前可用的资源到激活文档编辑器。如果当前激活文档是原理图,定制资源对话框将让您访问到当前可用资源到原理图文档编辑器。

图1-42 启动定制菜单项

为定制激活文档编辑器资源,选择Protel 99 SE客户端中菜单“Customize…”菜单项。此项定制包括从可用资源列表中选择其它资源到文档编辑器(多半是选择您自己的指定菜单),编辑选择的资源并且标志工具条的显示状态。

当Protel 99 SE 安装完成后,第一次启动后,就在操作系统的WINNT 目录中产生一个“CLIENT99SE.rcs”文件和一个“CLIENT99SE.ndr”文件,“CLIENT99SE.rcs”文件中存放菜单资源。在前一小节中加入的“我的第一个服务器”菜单能在此文件中找到,形式为:

MenuItem '我的第一个服务器'MyFirstServer:MyFirstProcess

如果此时您把Protel 99 SE重新安装了一遍,在启动时仍然能看到“我的第一个服务器”菜单项,但是不能运行,即点击无反应。如果把“CLIENT99SE.rcs”文件和“CLIENT99SE.ndr”文件删除了,系统会恢复默认菜单,因为系统又动态产生了一个“CLIENT99SE.rcs” 和一个“CLIENT99SE.ndr”文件。

那么,系统是根据什么来产生“CLIENT99SE.rcs”文件呢?仔细找找,我们就会在Protel 99 SE的安装目录的System子目录下找到很多扩展名为RCS的文件,就是这些文件合成产生了“CLIENT99SE.rcs”文件。

扩展名为RCS的文件是文本文件,所以,对这些文件进行一些处理,如加一些功能,汉化菜单等是完全可能的。因此,我们需要了解这些资源的格式,才能有效地定制服务器的资源文件。

图1-43 定制服务器资源

  3.6.1定制您的服务器资源文件

这里有一种情况,当您需要在设计资源管理器中,为一个附加的服务器提供一个某些类型的脚本,来安装它的新进程启动。例如,您开发的附加服务器被用来增强某些PCB编辑器特征,并且希望有一个菜单项(将一个启动进程指向到您的开发的服务器)增加到PCB编辑器的“Tools”菜单中,为达到此目的,您需要建立一个附加的服务器的资源(RCS)文件,并且按下列格式构建一个“脚本”:

一个用来增加或删除一个进程启动的资源文件语法如下所示:

如构建UpdateResource菜单。

======================================================================================

UpdateResource

Begin

<MenuItem>

...

End

·语法定义

============

<MenuItem> = <Kind> | <Name> | <Action> | <ReferencePosition> | <ReferenceItem>

<Description> | <SubMenu>

<Kind> = Kind <KindMenu>

<KindMenu> = Menu | Toolbar | HotkeyTable

<Name> = Name <String>

<Action> = Action <ActionMenu>

<ActionMenu> = Add | Delete

<ReferencePosition> = ReferencePosition <ReferencePositionMenu>

<ReferencePositionMenu> = End | Begin | Before | After

<ReferenceItem> = ReferenceItem <ReferenceItemMenu>

<ReferenceItemMenu> = <MenuTitle>

<MenuTitle> = <String>

<Description> = <String>

<SubMenu> =

Begin

<SubMenuItem>

...

End

<SubMenuItem> = <Separator> | <MenuTitle> <Process Description>| <Separator>

<Process Description> = <ServerName> : <ProcessId>

<Separator> = Separator

<Servername> = <String>

<ProcessId> = <String>

<String> = <Char>

<Char> = a | b | ... | z | A | B | ... | Z | 0 | 1 | ... | 9

<Number> = <Digit>

<Digit> = 0 | 1 | 2 ... | 9

·资源文件的在进程启动赋值语义

标识符

 

描述

 

Kind

 

种类

 

此标识符是进程启动器,其映射到一个菜单项,一个工具条或热键。可用的种类参数有:Menu, Toolbar HotKeyTable

 

Name

 

名称

 

此标识符是进程启动器准备连接到的编辑器名称。可用的名称参数有:“ALL”、“Current”、或指定文档编辑器例如PCBMenu

 

Action

 

动作

 

此标识是删除或增加新的菜单项动作。一个菜单项能包含一个进程或者一个分隔符,此分隔符插入一根横线到菜单中。可用的动作参数有:“Add”或“Delete”。

 

ReferencePosition

 

参考位置

 

此标识符是新菜单项的位置,并不影响被参考的菜单项。

 

ReferenceItem

 

参考项

 

此标识符是参考菜单项,是一个在文档编辑器中已存在的菜单项。

 

MenuTitle

 

菜单标题

 

此标识符实际上是将出现或已出现在服务器菜单条的菜单项。

 

&

 

此标识符插入一个字母在菜单项前,制作成为Windows菜单或子菜单的热键。

 

ServerName

 

服务器名称

 

此标识符必须为一个已安装的EDA服务器名称。一般地它将要么是您的服务器名称,或者设计资源管理器客户端组件名称。偶尔情况下,一些服务器想要能够来调用由其它服务器提供的进程,但这种情况很少见。

 

ProcessID

 

进程ID

 

此标识符必须为在相应的INS文件中注册的一个进程ID号之一。如果不是,客户端将不启动进程,并且没有任何事件或动作发生。

 

这里有一个较适合的例子来说明,例子来自“FileFind”服务器资源文件“FileFind.rcs”。

UpdateResource

Begin

KindHotKeyTable

NameNoDocument

ActionAdd

ReferencePositionBefore

ReferenceItem'Client:RunDesignExplorerSysCommand(Command=NextTab)' *

Description

Begin

Key FileFind:FindFileF3EndKey

End

End

UpdateResource

Begin

KindMenu

NameFolderMenu

ActionAdd

ReferencePositionAfter

ReferenceItem'&Delete'

Description

Begin

MenuItem SEPARATOR

MenuItem '&FindFile''FileFind:FindFile'

MenuItem SEPARATOR

End

End

  3.6.2在RCS文件中菜单的语法

菜单条目资源文件的语法如下所示:

·菜单结构

============================

MENU '<MenuName>'

BEGIN

POPUP <MenuItemOrSubMenu>

...

END

MenuItemOrSubMenu表示菜单名称。

·菜单的语法定义

============

<MenuName> = <String>

<MenuItemOrSubMenu> = <MenuItem> | <Separator> | <SubMenu>

<MenuItem> = MenuItem '<ItemName>' <ProcessDescription>

<Separator> = MenuItem SEPARATOR

<SubMenu> =

POPUP '<SubMenuName>'

BEGIN

<MenuItemOrSubMenu>

...

END

<SubMenuName> = <MenuTitle> | <MenuTitle> {<HotKey>}

<MenuTitle> = <String>

<ItemName> = <String>

<HotKey> = <Char>

<ProcessDescription> = <ServerName>:<ProcessID> | '<ServerName>:<ProcessID><ParameterList>'

<ParameterList> =(<Parameter>) |(<Parameter> | <Parameter> ...)

<Parameter> = <ParameterName> = <ParameterValue>

<ParameterName> = <String>

<ParameterValue> = <String>

<ServerName> = <String>

<ProcessID> = <String>

<String> = <Char> ...

<Char> = a | b | ... | z | A | B | ... | Z | 0 | 1 | ... | 9 | & | \ | sp

·RCS文件菜单条目的语义描述如下:

标识符

 

描述

 

MenuName

 

菜单名称

 

此标识符是在INS文件中规定的菜单名称(从服务器设计文件产生)

 

MenuTitle

 

菜单标题

 

此标识符是菜单标题,将出现在菜单条,或在某些情况下作为一种子菜单的父菜单项。

 

&

 

此标识符插入一个字母到菜单条目前,将使此字母成为菜单项或子菜单的Windows的热键。

 

Key

 

 

此标识符是一个单个的字符,将使设计资源管理器弹出菜单项,无论在何时,只要此键被键入,如当前无进程在活动,就会弹出菜单项。

 

HotKey

 

热键

 

此标识符是一个单个的字符,设计资源管理器将关联子菜单,所以无论什么时候,如无进程在活动,键入此键将弹出子菜单。

 

ItemName

 

项目名称

 

此标识符是一个字符串,将出现在菜单或子菜单上作为描述。

 

\t

 

此标识符被使用来增加热键描述到菜单条目。

 

ServerName

 

服务器名称

 

此标识符必须为一个已安装的EDA服务器名称。一般地它将是您的服务器名称,或者是设计资源管理器客户端组件的名称。偶尔情况下,一些服务器想要能够来调用被其它服务器提供的进程,但这种情况少见。

 

ProcessID

 

进程ID

 

此标识符必须为在相应的INS文件中注册的一个进程ID号之一。如果不是,客户端将不启动进程,并且没有任何事件或动作发生。

 

例如

MenuItem '&Copy\tCtrl+Ins'Sch:Copy

此例子将增加一个菜单项来调用原理图编辑器的Copy命令,在菜单上相同行会有“Ctrl+Ins”文本串,如果“C”在此菜单中是唯一快捷键键值,在激活菜单后键入“C”将直接选择到此菜单项并激活Copy命令,“Ctrl+Ins”热键必须被定义到在RCS文件的热键表中。在理论上的没有限制子菜单的深度,也就是说,子菜单可以有一个下级子菜单,下级子菜单还可以有下级子菜单,等等。

  3.6.3两个菜单例子

·例子1

此例子定义一个有两个子菜单的菜单条,“File”菜单和“Edit”菜单。使用鼠标来选择“Edit”->“Edit Fruit-Apples”菜单项将调用服务器“MyServer”的进程“EditApples”,此进程同样将可被键入“e”->“a”调用,或键入Alt-E, “e”, “a”来调用。

“//”符号是笔者为了使易读加上的,实际请去除“//”符号和其后说明内容。

MENU 'MyServerMenu'

BEGIN

POPUP '&File {F}'//文件菜单。

BEGIN

MENUITEM '&New'Client:CreateNewDocument

MENUITEM '&Open...'Client:OpenDocument

MENUITEM 'Open Pro&ject...' Client:OpenProject

MENUITEM '&Close'Client:CloseDocument

MENUITEM 'Close Projec&t'Client:CloseProject

MENUITEM SEPARATOR

MENUITEM '&Save'Client:SaveDocument

MENUITEM 'Save &As...'Client:SaveDocumentAs

MENUITEM 'Save A&ll'Client:SaveAllDocuments

POPUP '&SubMenu1' //子菜单。

BEGIN

MENUITEM '&Item 1'MYSERVER:MyService1

MENUITEM 'I&tem 2'MYSERVER:MyService2

END

MENUITEM SEPARATOR //“-”横线分隔符。

MENUITEM 'E&xit'Client:QuitFromEDAClient

END

POPUP '&Edit' //编辑菜单。

BEGIN

MENUITEM '&Undo\tAlt+BkSp'MYSERVER:DoUndo

MENUITEM '&Redo\tCtrl+BkSp' MYSERVER:DoRedo

MENUITEM SEPARATOR

MENUITEM 'Cu&t\tShift+Del'MYSERVER:DoCut

MENUITEM '&Copy\tCtrl+Ins'MYSERVER:DoCopy

MENUITEM '&Paste\tShift+Ins' MYSERVER:DoPaste

MENUITEM 'C&lear\tCtrl+Del' MYSERVER:DoClear

MENUITEM SEPARATOR

POPUP '&Edit Fruit {E}'//子菜单,E是快捷键。

BEGIN

MENUITEM '&Apples'MYSERVER:EditApples

//表示调用MYSERVER服务器中的EditApples进程,A是快捷键。

MENUITEM '&Oranges'MYSERVER:EditOranges

MENUITEM '&Pears'MYSERVER:EditPears

END

END

END

·例子2

Client99SE.Rcs文件内容,此文件能在Protel 99 SE的安装目录中System子目录下找到,此文件是在Protel 99 SE没有打开任何文档时,显示的菜单。您可以启动Protel 99 SE对一下,看是不是这样的。

Menu 'NoDocument'//菜单名称为NoDocument

Begin

Popup '&File {F}'//文件菜单。

Begin

MenuItem '&New'CreateNewDocument

MenuItem '&Open...'OpenDocument

MenuItem SEPARATOR

MenuItem 'E&xit'QuitFromEDAClient

End

Popup '&View {V}'//视图菜单。

Begin

MenuItem 'Design &Manager'ToggleDocumentManager

MenuItem '&Status Bar'ToggleClientStatusBar

MenuItem 'Command Status'ToggleProcessStatusBar

End

Popup '&Help {H}'//帮助菜单。

Begin

MenuItem '&Contents''Client:RunHelpTopic(FileName=\Help\Protel.hlp|Topic=contents)'

MenuItem SEPARATOR

Popup 'Help &On'

Begin

MenuItem '&Using the Design Explorer''Client:RunHelpTopic(FileName=\Help\Protel.hlp|Topic=UsingTheDesignExplorer)'

MenuItem '&Creating a New Design''Client:RunHelpTopic(FileName=\Help\Protel.hlp|Topic=CreatingANewDesign)'

MenuItem 'Creating a New &Document or Folder' 'Client:RunHelpTopic(FileName=\Help\Protel.hlp|Topic=NewDocumentDocuments)'

MenuItem '&Working in a Design Window''Client:RunHelpTopic(FileName=\Help\Protel.hlp|Topic=WorkingWithTheDesignWindow)'

MenuItem SEPARATOR

MenuItem '&Managing Design Teams''Client:RunHelpTopic(FileName=\Help\Protel.hlp|Topic=ManagingDesignTeams)'

End

MenuItem '&Shortcut Keys''Client:RunHelpTopic(FileName=\Help\Protel.hlp|Topic=ShortcutKeys)'

MenuItem 'Process &Reference''Client:RunHelpTopic(FileName=\Help\Client.hlp|Topic=contents)'

MenuItem SEPARATOR

MenuItem '&About...'HelpAbout

End

End

//以下定义热键。

HotKeyTable 'NoDocument'

Begin

Key 'Client:RunDesignExplorerSysCommand(Command=NextTab)'TABCtrlEndKey

Key 'Client:RunDesignExplorerSysCommand(Command=PrevTab)'TABShift CtrlEndKey

Key 'Client:RunDesignExplorerSysCommand(Command=NextView)'F6CtrlEndKey

Key 'Client:RunDesignExplorerSysCommand(Command=PrevView)'F6Shift CtrlEndKey

Key 'Client:RunDesignExplorerSysCommand(Command=ToggleFocus)'TABEndKey

Key 'Client:RunDesignExplorerSysCommand(Command=ToggleFocus)'TABShiftEndKey

Key Client:CloseDocumentF4CtrlEndKey

Key 'Client:RunDesignExplorerSysCommand(Command=Refresh)'F5EndKey

End

//以下定义工具条。

ToolBar 'NoDocument' 'Fixed Top' 13 1 50 'True' 5000

Begin

Button 'PROJMAN.BMP'Client:ToggleDocumentManager

Button 'FILEOPEN.BMP' Client:OpenDocument

Button 'HELP.BMP''Client:RunHelpTopic(FileName=\Help\Protel.hlp|Topic=Contents)'

End

BMP文件为工具条上各按扭要显示的图形内容,如图1-44:

图1-44 无文档打开时的工具条

  3.6.4在一个RCS文件中的工具条语法

工具条条目资源文件的语义如下:

·工具条条目结构

============================

TOOLBAR '<ToolBarName>' '<Position>' <Left> <Top>

BEGIN

<ButtonOrSeperator>

...

END

·语法定义

============

<ToolBarName> = <String>

<Position> = FIXED TOP | FIXED BOTTOM | FIXED LEFT | FIXED RIGHT | FLOATING

<Left> = <Number>

<Top> = <Number>

<ButtonOrSeperator> = <Button> | <Separator>

<Button> = BUTTON '<BMPFile>' <ProcessDescription>

<Separator> = SEPARATOR

<BMPFile> = <String>

<ProcessDescription> = <ServerName>:<ProcessID> | '<ServerName>:<ProcessID><ParameterList>'

<ParameterList> =(<Parameter>) |(<Parameter> | <Parameter> ...)

<Parameter> = <ParameterName> = <ParameterValue>

<ParameterName> = <String>

<ParameterValue> = <String>

<ServerName> = <String>

<ProcessID> = <String>

<String> = <Char> ...

<Char> = a | b | ... | z | A | B | ... | Z | 0 | 1 | ... | 9

<Number> = <Digit> ...

<Digit> = 0 | 1 | 2 ... | 9

·一个RCS文件工具条的语义如下

标识符

 

描述

 

ToolbarName

 

工具条名称

 

此标识符是这个工具条的名称。

 

Position

 

位置

 

此标识符告诉设计资源管理器应用程序在何处放置工具条。如果工具条是浮动的,那么用户将能够在窗体中拖动工具条,并能放到任意位置。

 

Top and Left

 

上和左

 

这些标识符是工具条的左上角,相对于主客户端窗体左上角的像素坐标。

 

BMPFile

 

BMP文件

 

此标识符是一个被用来绘制工具条上快捷按扭的BMP图形文件的名称。

 

ServerName

 

服务器名称

 

此标识符必须为一个已安装的EDA服务器名称。一般地它是您的服务器名称,或者设计资源管理器客户端的组件名称。偶尔情况下,一些服务器想要能够来调用被其它服务器提供的进程,但这种情况很少见。

 

ProcessID

 

进程ID

 

此标识符必须为在相应的INS文件中注册的一个进程ID号之一。如果不是,客户端将不启动进程,并且没有任何事件或动作发生。

 

Separator

 

分隔符

 

此标识符在一个固定的工具条上相邻的按扭间,放置一个小的分隔符或在一个浮动的工具条上启动一个新的行。

 

  3.6.5一个工具条例子

下列是一个例子定义一个有10个按扭的工具条,分开在三个组。

TOOLBAR 'MyServerToolbar1' 'Fixed Top' 100 1

BEGIN

Button PROJMANClient:ToggleDocumentManager

Button FILEOPENClient:OpenDocument

Button SPECOPENClient:OpenDocument(DocumentName = MyFile.ABC)

Button FILESAVEClient:SaveDocument

Button PRINTMyServer:SetupPrinter

SEPARATOR //分隔符横线

Button CUTMyServer:DoCut

Button PASTEMyServer:DoPaste

Button DESELALLMyServer:DoSelectAll

SEPARATOR //分隔符横线

Button APPLESMyServer:EditApples

Button ORANGEMyServer:EditOranges

Button PEARSMyServer:EditPears

End

  3.6.6 RCS文件中的键盘快捷键语法

键盘快捷键条目语法资源文件如下:

·键盘快捷键结构

=================================

HOTKEYTABLE '<TableName>'

BEGIN

KEY <ProcessDescription> <KeyName> <Modifiers> ENDKEY

...

END

·定义

============

<TableName> = <String>

<KeyName> = A | B | ... | Z | 0 | 1 | ... | 9 | F1 | F2 ... | F12 | BACKSPACE | INSERT | DELETE | ENTER | PGUP | PGDN | HOME | END | UP | DOWN | LEFT | RIGHT | + | - | / | * | . | TAB | ESC | SPACE | LEFT_CLICK | RIGHT_CLICK | LEFT_DBL_CLICK | RIGHT_DBL_CLICK | LEFT_HOLD_DOWN | RIGHT_HOLD_DOWN

<Modifer> = <ModifierKey> ...

<ModifierKey> = ALT | SHIFT | CTRL

<ProcessDescription> = <ServerName>:<ProcessID> | '<ServerName>:<ProcessID><ParameterList>'

<ParameterList> =(<Parameter>) |(<Parameter> | <Parameter> ...)

<Parameter> = <ParameterName> = <ParameterValue>

<ParameterName> = <String>

<ParameterValue> = <String>

<ServerName> = <String>

<ProcessID> = <String>

<String> = <Char> ...

<Char> = a | b | ... | z | A | B | ... | Z | 0 | 1 | ... | 9

·键盘快捷键RCS文件语义如下

标识符

 

描述

 

TableName

 

表名

 

此标识符是一个热键表名称,列在INS文件和SDK数据库中。

 

KeyName

 

键名

 

此标识符是一个键盘上键的名称,或者是鼠标单击名称。

 

Modifier

 

修饰语

 

此标识符限制进程的活动,除非恰当地修改键,否则被抑制。

 

ServerName

 

服务器名称

 

此标识符必须为在相应的INS文件中注册的一个进程的ID号之一。如果不是,客户端将不启动进程,并且没有任何事件或动作发生。

 

ProcessID

 

进程ID

 

此标识符在一个固定的工具条上相邻的按扭间,放置一个小的分隔符或在一个浮动的工具条上启动一个新的行。

 

  3.6.7键盘快捷键例子

这个例子定义了一组热键,当键入“Ctrl-BackSpace”将调用MyServer的“DoRedo”进程,“Alt-BackSpace”将调用“DoUndo”进程。

HOTKEYTABLE 'MyServerHotKeys'

BEGIN

KEY MyServer:DoRedoBACKSPACECTRLENDKEY //“Ctrl-BackSpace” 键。

KEY MyServer:DoUndoBACKSPACEALTENDKEY // “Alt-BackSpace” 键。

KEY MyServer:EditApplesACTRLENDKEY

KEY MyServer:EditOrangesOCTRLENDKEY

KEY MyServer:EditPearsPCTRLENDKEY

KEY MyServer:HelpIndexF1ENDKEY

KEY MyServer:DoCopyINSERTCTRLENDKEY

KEY MyServer:DoCutDELETESHIFTENDKEY

KEY MyServer:DoPasteINSERTSHIFTENDKEY

END

  3.7 调用进程
  3.7.1进程

任何进程可以被使用在“Rt_forms”单元中的“MessageRouter_SendCommandToModule”函数调用。参数是:

ProcessName : String

Parameters:PChar

MaxParameterSize: Word

ServerWindow:HWnd

此函数返回一个字符串,要么是一个空的字符串,或者是被调用的进程返回的一些快捷键字符串。

此服务器窗体参数定义目标在目标服务器内部的窗体,当无特别的窗体是目标窗体时,请使用cProcessWindow_DontCare($FFFF)常量(rt_Types单元定义的常量)。

例子:

GetMem(Parameters, 4048);//申请内存。

Parameters := ''; {your code to fill the Parameters您的代码来填充此参数}

MessageRouter_SendCommandToModule('YourServer:YourProcess',Parameters,4048, ProcessWindow_DontCare);

{your code to handle the results您的代码来处理此结果}

...

FreeMem(Parameters, 4048); //释放内存。

To run a process on the currently active window

如在当前活动窗体中运行一个进程:

Var

H :HWnd;

Begin

H :=MessageRouter_GetState_CurrentEditorWindow;

MessageRouter_SendCommandToModule(‘YourServer:YourProcess',’’,0,H);

...

  3.7.2处理进程参数

在此格式中,参数从一个单个的以Null为终止符串字符(零个字符)到最多32000个字符。

< Name> = <Value> | <Name> = <Value> | ...

名称可以是任何的语言和数字字符串,没有空格字符或垂线条“|”。

值可以是任何不包括垂线条的字符串。

任何遗漏参数将使用一个默认值,或者提示用户。参数名称大小写不敏感,所以DocumentName和documentname是一样的。

这里有一些基本的参数。

DocumentName = 文件路径和名称。(File path and name)

DocumentType = 项目,原理,PCB,等等。(Project, Schematic, PCB, and so on)

LocationX= 有关此进程被调用的X坐标系。(The X Coordinate relevant to the Process being called.)

LocationY= 有关此进程被调用的Y坐标系。(The Y Coordinate relevant to the Process being called.)

参数名称的使用上没有限制,但是建议您遵守设计资源管理器的约定(整个单词每一个开头为大写),这样将易于被用户学习您的服务器进程,也将改善服务器、设计资源管理器、和其它服务器之间的集成。请确保分配足够的内存到参数列表,来同时处理您的输入参数和任何返回参数。

由于参数通常分配和释放在一个本地内存,万一您需要增加更多的参数,因此,我们建议您一次分配4KB内容。

设计资源管理器为构建和访问参数列表提供一些基本的函数(在RT_FORMS单元定义):

Function GetState_NextParameter(VarParameterString : PChar; VarNextParameter : String) : Boolean;

Function GetState_Parameter(VarParameterList : PChar; ParameterName : String; VarParamValue : String) : Boolean;

Procedure SetState_Parameter(ParameterList : PChar; ParameterName : String;ParamValue : String);

·GetState_NextParameter

放入一个参数(名称和值)到Pascal字符串“NextParameter”,并且从“ParameterString”删除它,此函数是有破坏性的。

·GetState_Parameter

在“ParameterList”内查看匹配“ParameterName”的参数并且返回结果(仅值),如果有,放置到“ParameterValue”中,此函数是没有破坏性的,因为原始的“ParameterList”没有改变。

·SetState_Parameter

SetState_Parameter函数被用于构建参数列表。如果传递的“ParameterList”已经有一个匹配“ParameterName”,它的值将被替换为“ParameterValue”。如果在列表中没有已存在的参数,参数将被增加到列表的末尾。请记住参数名称是大小写不敏感的,所以“DocumentName”和“documentname”是同样的参数。

举个实际的例子来说明。

例子1。

Procedure RefreshCurrentBoard;

Var

P:PChar;

Windowhandle : HWND;

Begin

GetMem(P,256);

SetState_Parameter(P,'Action','All');

WindowHandle :=MessageRouter_GetState_CurrentEditorWindow;

MessageRouter_SendCommandToModule('PCB:Zoom',P,256,WindowHandle);

FreeMem(P,256);

End;

此代码片段使用一个MessageRouter_SendCommandToModule方法来缩放PCB设计文档,来显示所有PCB对象。如果您想要来使用此代码片段的话,不要忘记在工程中引用单元 “Windows”,“Rt_Forms”,“Rt_Util”和“Rt_Param”。您需要来检查窗体名柄是否指向一个PCB文档窗体。(为达到此目标,您需要MessageRouter_GetState_WindowKind函数,此函数返回一个编辑器类型字符串。)

例子2

GetMem(P, 4048);//申请内存。

SetState_Parameter(P,'Dialog','Color');//设置参数。

SetState_Parameter(P,'Color', '0'); //设置参数。

MessageRouter_SendCommandToModule('Client:RunCommonDialog',P,4048,0);//发送命令来运行彩色的对话框进程。

GetState_Parameter(P,'Result',S);//返回结果。

If(S = 'True') Then //如果S为True,取回颜色值。

Begin

GetState_Parameter(P,'Color',S);

Color :=StrToInt(S);

End;

FreeMem(P, 4048);//释放内存。

此代码片段在设计资源管理器中调用一个彩色的对话框并且高亮黑色颜色值,如果您改变颜色并且点击“OK”,那么返回“True”,您将得到一个新的颜色值。这时,您无需传递一个文档的窗体句柄到MessageRouter_SendCommandToModule函数,因为客户端的CommonDialog会自动成功在运行设计资源管理器中。

在客户端RunCommonDialog进程获取一个对话框参数,此参数能为下列几种之一:“Color”“ProcessList”,“ChooseDocument”,“FileOpensave”,为得到更多详细信息,请参考客户端进程联机帮助。如果已安装好SDK,此代码是放在“\SDK\Examples\API Examples\Client\CommonDialog process”文件夹中,您可以仔细研究和用此代码做实验。(e-works)

0
相关文章