加入收藏  ︱   设为首页  ︱   联络方式
    • 网站首页
    • 足球新闻
    关于我们
            足球新闻
    您当前所在位置:首页 >>
    • 365体育-365体育手机版-365体育官网
    • 足球新闻
  • MicroStation开发语言(MDL)应用教程

    发布时间:2019-12-01 17:53:35 来源:365体育-365体育手机版-365体育官网点击:18

      标准 C (ANSI C) 程序设计语言(当然有某些限制和扩展); 一整套开发工具(包括 C 编译器,连接器,链接库,资源编译器和资源库,Make程序以及调试工具); MicroStation 内部的用于执行 MDL 应用程序的伪码解释器; MicroStation 内部的 MDL 调试器; 大量的运行库函数; 可以改变 MicroStation 各种行为的钩子(Hooks)函数,所谓钩子函数是指那些在某种事件发生时被 MicroStation 自动执行的函数; GUI 开发工具,可以用于开发基于 Motif 的图形用户界面(包括:对话框,下拉菜单等); 资源管理器;

      四,运行及卸载 MDL 应用程序 在 MicroStation命令窗口中运行 MDL 应用时,可以指定一个应用名称和任务识别码(Task ID ),其中前者是必须的.具体 使用方法如下:

      MicroStation 将首先在当前目录下查找用户在命令行中指定的应用,如果找不到,再到由 MicroStation 环境变量 MS_EXE 和 MS_MDL 指定的目录下去寻找. 如果用户未指定应用程序的扩展名,MicroStation 将首先寻找无扩展名的文件,其次才是.MA 文件和.RSC 文件.因此运行时 最好键入应用程序的全名. 卸载 MDL应用的命令为: MDL UNLOADSILENTUNLOAD [任务识别码] MDL应用还可以在 MDL 对话框中装载运行,该对线 所示.通过 MDL 对话框也可以卸载 MDL 应用.

      在 MDL调试器中使用 QUIT 命令可以卸载一个应用程序.

      MDL开发环境使用一些变量来定义各种环境参数(表 1-1). 表 1-1,MDL 开发环境变量列表

      图 2-1,通过菜单激活变量设置对线,变量设置对话框

      一个 MDL 应用由两个主要的部分组成,即程序部分与资源部分.其中程序部分是必须的,而资源部分是可选的.

      程序文件以 .MC 为扩展名,该文件中包含实现各种功能的函数代码.M C文件中的函数可以有如下几种类型:

      与标准 C语言不同,MDL中的主函数可以缺省.主函数通常用于应用程序的初始化,在该应用载入时执行. 2,命令处理函数(Command Process Function) 该函数基于用户事件(User Events)定义应用程序的执行命令. 3,钩子函数(Hook Function) 这种函数通常与对话框或者对话框中的 Item 相联系,用于修改和增加其功能.

      资源文件以 .R为扩展名,用于定义应用程序的用户界面部分,以下是几种类型的资源组件.资源文件不是一个 MDL 应用 所必须的. 1. 2. 3. 对话框定义(Dialog Box Dinfintions)用于定义对话框以及对话框中的元素(Item). 命令表(Command Tables) 用于映射键入命令到命令处理函数. 消息列表(Message Lists)用于存储处理期间的消息及提示信息的文本字符串.

      五,头文件(Head Files) 头文件以 .H 为扩展名,用于给程序常量设置识别名以及定义将要在多个源码(程序)文件中使用的变量.使用时将头文件 包含(Include)到程序文件中.

      函数声明文件以 .FDF 为扩展名,用于声明函数原型(prototype).这有助于减少诸如函数提前引用(即在定义函数之前引 用)的编译错误,同时方便了调用函数时的参数检查.MDL使用 ANSI C语言的函数原型声明.在 MicroStaion 系统目录下 的 MDL\INCLUDE 目录中存放着 MDL内部函数的原型声明文件(*.FDF).

      描述 MDL源程序编译器(生成目标代码) 链接器(链接库文件中的有关目标代码到程序中) 对象库管理器(用于维护库文件中的目标代码) 资源编译器 资源库管理器(比如把多个资源文件链接到一个资源文件或者程序文件) 类型(Type)生成器(生成类型定义以便对话框管理器可在运行时模拟 C 表达式) MDL应用编译器 (用于编译工程文件中指定的应用程序)

      该工具用于联结资源目标代码文件和应用程序文件到一个单一 MDL 应用或者资源目标代码文件.默认的输出是 .RSC 文 件..RSC, .MP --- .MA .RSC

      语法: rlib [-参数 1 -参数 2 …] 输入文件 ? 参数 -ofile 指定输出文件(默认为输入文件名.MA) -v 冗余开关(若指定,将产生较多的输出信息)

      在 MDL开发应用过程中的不同阶段,将有不同类型的文件产生或使用到,不同的文件类型通过相应的文件扩展名来区别. 1,创建资源时用到的文件类型 表 2-2,创建资源时用到的文件类型 扩展名 cmd.r cmd.h cmd.rsc 扩展名 typ.mt typ.r typ.rsc 扩展名 .r .rsc 扩展名 msg.r 描述 包含命令表的资源源文件 包含应用命令号的头文件,由 rcomp -h 产生 编译后的命令表资源文件 描述 包含 C结构和联合的类型文件 rsctype产生的资源源文件 编译后的类型资源文件 描述 资源源文件 编译后的资源源文件 描述 包含消息资源的资源源文件

      编译后的消息资源文件 描述 包含对话框及其 item 资源的资源源文件 编译后的对话框及其 item 的资源文件

      2,创建程序时用到的文件类型 表 4,创建程序时用到的文件类型 扩展名 .h txt.h .fdf .mc .mo .mp .ml .mi .ma 描述 源程序用到的标准头文件 包含文本串的头文件 包含函数原型的函数声明文件 MDL 源程序文件 由.mc 文件编译成的目标文件 用 mlink 生成的程序文件 用 mlib生成的包含目标代码的库文件 rlib产生的中间文件 应用文件(MicroStation 中运行)

      图 4 表明了不同的 MDL应用组件是如何编译到一起的.

      以上提到的这些开发工具,在实际使用过程中都要键入大量命令行参数,有没有减少这种烦琐的参数输入的方法呢?有,那 就是使用参数文件(option files)把经常使用的参数设置写到一个文本文件中,然后在命令行中加上 @option_file,即: command @option_file

      bMake 工具允许用户使用工程文件编译整个 MDL 应用.工程文件定义了组成一个 MDL应用的各种宏并指定了各从属文件 的编译关联.bMake工具通过判断文件创建的时间可以识别工程文件中是否有文件被改变,删除等.

      宏是一种定义,它给字符串定义一个宏名,在使用时,这个宏名就代表该字符串.您可以引用已有的宏,当然也可以建立自 己的宏.下面是一些预定义的宏: 表 3-1,预定义的宏 宏 $@ $? $= $ $* $% msdos.IP32.unix.macintosh.vax.etc. 定义 当前目标文件 所有从属文件新于目标文件 最新从属文件 当前从属文件 目标文件的基名(忽略后缀) 第一个从属文件所在目录 指定操作系统的各种宏

      宏定义的几种方式: 1. 2. 3. 在工程文件内定义; 工程文件以外的可被作为宏引用的环境变量; 在命令行中使用-D 开关.

      Build命令是被从属和规则用来建立目标文件的一系列语句行.如果未定义 Build命令,预定义的规则将使用 mdl.mki 文件中 的内容. 表 3-3,各种 Build命令标志 标志 @ $ ~ 描述 命令不回显 强制回显,即使使用了 silent 模式 使用内嵌的 bmake命令,例如: ~CURRENT 设置目标文件的日期为当前日期; ~TIME 设置目标文件的时间为当前时间 把所有的命令行写入指定的文件中,直到出现 标志 关闭 标志指定的文件

       规则 用于定义如何使用给定扩展名的从属文件来建立指定扩展名的目标文件.许多规则都已经在 mdl.mki 中定义过了.如 果一个目标文件有多个从属文件,其中第一个文件的扩展名将用来寻找规则.如果对一个目标文件使用了多个规则,只有最 后一个有效.规则的语法:.从属文件扩展名 .目标文件扩展名 :build命令 以下的 mdl.mki 文件显示了规则的范例

      图 3-1 工程文件涉及到的 MDL文件类型

      十,工程文件涉及到的 MDL 文件类型细节

      图 3-2 工程文件涉及到的 MDL文件类型细节

      许多 MDL 应用都使用对话框.对话框实际上就是作为用户和 MDL应用之间交互界面的一种窗口.对话框元素是嵌入对话 框中的一种资源,用户通过它可以方便直观地修改特定的数据以及执行特定的动作.

      最简单的定义就是:资源是在源文件中声明并初始化以备后用的变量,但与作为一块内存区域的在程序中用来存储数据的变 量不同. 对话框以及对话框中的元素通常在源程序中定义成资源,常用的有:对话框(dialog boxs),对话框元素(dialog items),消息列 表(message lists),命令表(command tables)和同义列表(synonym lists) .

      资源管理器可以使用户快速存取资源文件而不必考虑其文件格式的细节; 把数据同程序分离开来有助于方便的修改诸如消息和提示信息之类的元素而不必重新编译源程序; 资源只是在需要的时候才调入内存,节省了内存空间; 在 MDL应用中可以使用 MicroStation 预定义的资源类型,加快了定义资源要素的速度,同时也使得 MDL 应用有 统一的风格.

      资源结构采用了类似 C 语言的结构定义. 表 4-1 资源结构的组成部分

      描述 C类型定义(Typedef)用于定义特定类型的资源实例(比如对话框或按钮);资源类型 是与一个特定资源类型相关联的唯一识别码. C类型定义用于声明一个资源实例而不是 资源类型. 资源识别码是一个 32 位无符号整数,用于唯一标志特定的资源.这个整数一般在程序文 件的头部定义. 指定资源属性的参数 通常情况下资源有一系列的成员.在初始化时,资源编译器会为数组中的每一个成员数 产生一个内部长整型值.

      每个资源类型都有自己的定义,因此,不同资源类型中各组件的类型和值都不相同.下例是资源文件的一部分:

      四,对话框的坐标单位 在对话框上放置对话框元素时自然会涉及到该元素在对话框中的位置和大小,那么度量这种位置和大小的单位是什么呢? MDL中的默认规定是把当前字体高度的 1/12作为对话框的纵坐标单位,当前字体的 1/6 作为对话框的横坐标单位.在 $(MS)/MDL/INCLUDE/DLOGBOX.H 文件中存放了有关的声明.

      所有的对话框都由对话框管理器控制,对话框管理器控制调入对话框资源,创建对话框,显示对话框以及维护对话框.

      对话框有模态和非模态两种.模态对话框要求用户必须作出响应后才能执行其它的任务,而非模态对话框则不然.一般警告 信息提示框使用模态对话框.

      对话框是在资源文件中定义的,其定义的基础是 dlogbox.h 中定义的对话框结构.

      定义对话框实际上就是定义对话框结构的各项成员变量.下面的例子仅仅定义一个没有任何元素的空对话框,其标题(Title) 为 示范对话框

      定义了对话框,也包含了头文件,现在只差最后一步 — 打开(显示)对话框了.打开对话框有两个函数可以使用: mdlResource_openFile 或 mdlDialog_open 以下是一个在 main()函数中显示对话框的示例:

      上一章讨论了如何创建对话框,本章将集中讨论如何在对话框上放置对话框元素(Items ).

      MicroStation 中有几种类型的对话框元素,每一种实现特定的功能.

      二,对线,标签(Label) 标签是一种静态文本,只显示一个文本字符串,并不接收用户输入.使用 标签不需引用资源,只需将对线,组合框(Group Box) 组合框是一个带标题的矩形图形框,用于把相 关联的一组元素框起来. 组合框不接收用户输入,使用时不需要引用资源,只需将对话框元素的 type 设置 为 GroupBox即可. 3,分隔线(Separator) 分隔线是一个垂直或水平的线段,用于分隔对话框上的元素.分隔线不接收用户输 入,使用时不必引用资源,元素列表中的 type 字段等于 Separator. 4,检查按钮(Check Button 或 Toggle Button) 设置为 Label 即可.

      命令按钮用于激活一个操作,用户选择此按钮后,与之相关联的代码就会被执行.元素列表中的 type 字 段等于 PushButton. 6,选项按钮(Option Button) 选项按钮允许用户在给出的多个选项中作出选择,选项菜单只显示当前的选择,占用较少的屏幕空 间.元素列表中的 type 字段等于 OptionButton.. 7,滚动条(Scroll Bar) 滚动条用于显示有 连续取值范围的值,如果滚动条代表某一值的话,必须有钩子 函数与之相连.元素列表中的 type 字段等于 ScrollBar. 8,文本框(Text)

      文本框允许用户键入并编辑文本,不过只允许一行,文本类型可以是字符串,整型值或者浮点数.元素列表中的 type 字段 等于 Text 9,多行文本框( Multi -line Text) 功能与文本框相似,正如其名称所暗示的那样,多行文本 框允许编辑多行 文本.元素列表 中的 type 字段 等于 MLText 或 MultiLineText. 10,颜色拾取框(Clor Picker )

      图层控制用于设置各个图层的打开或者关闭,以及设置当前激活图层,结果存于一个变量 中.元素列表中的 type 字段等于 LevelMap. 12,菜单条(menu Bar)

      列表框列出几个文本字符串以供用户选择,其功能同于选项按钮,不同点在于列表框可以同时显示多行字符串.元素列表中 的 type 字段等于 ListBox. 17,通用元素(Generic)

      通用元素是一个外观和行为都可以自定义的一种对话框元素,该元素需要钩子函数.元素列表中的 type 字段等于 Generic. 18,按钮组(Button Group)

      按钮组中可以放置一组图标在对话框中.元素列表中的 type 字段等于 ButtonGroup. 19,活动分隔线(Sash)

      活动分隔线用于分隔对话框,与分隔线不同的是,活动分隔线可以允 许用户改变被活动分隔线分隔的对话框两块区域的大小比例.该元素需要钩子函数.元素列表中的 type 字段等于 Sash. 20,Scale 滚动条( Scale)

      Scale 滚动条类似于滚动条,不同的是 Scale滚动条可以通过输入数值来改变滚动块的位置.元 素列表中的 type 字段等于 Scale. 21,弹出式菜单(Popup Menu) 弹出式菜单是一种活动菜单,弹出式菜单通常用一个热键激活.元素列表中的 type 字段等于 PopupMenu. 22,无线按钮(Radio Button) 用于在一组选项中设置一个选项的对话框元素.元素列表中的 type 字段等于 RadioButton.

      定义对话框元素需要对话框元素的资源规格说明.这种资源可以在一个应用的资源文件中定义,也可以从其他任何已经打开 的资源文件中引用.在对话框上放置一个元素需要在对话框的 itemList 数组中指定一个资源描述列表.

      要执行的命令,欲改变的变量以及标签等是对话框元素的资源规格中的典型信息.对大多数元素来说,资源规格代码存放于 资源文件中.资源规格描述涉及到很多参数,详情请参考《MDL 程序员手册》.以下是各种参数的列表和说明(表 51). 表 5-1,对话框元素的资源规格参数 参数 commandNumber commandSource 描述 与操作相关联的命令识别码(NOCMD 表示没有命令) 表明是 MicroStation 命令或是程序指定的命令(MCMD-MicroStation 命令, LCMD-程序指定的命 令) 命令参数( 表示无参数) 帮助的 ID 码(NOHELP-无有效帮助) 定位帮助的资源(MHELP-用 MicroStation的系统帮助或者没有帮助 ,LHELP — 程序指定帮助) 元素的钩子函数(NOHOOK-无钩子函数) 元素钩子函数的参数(NOARG-无参数) 元素的标签(标题) 指定与元素相关联的变量 指定同义元素的同义列表(NOSYNONYM-无同义列表)

      上例中的 type 字段的取值可以是下面列出各项中的任何一个:

      如果希望开发出功能强大而且界面美观的 MDL 应用的线. 对话框不要太大; 尽可能使用非模态对话框; 尽量少用字体类型; 限制使用的颜色数量; 尽可能使垂直对齐的元素有相同的宽度; 使用相同宽度的命令按钮; 使用 GENY宏来保持垂直距离的一直性; 不要把文本框,选项按钮和命令按钮的宽度设置为 0;

      对话框的另外一种使用方法就是创建工具条.工具条的元素有三种:

      图 6-1 工具条的组成 图标框架内既可以放置图标,也可以放置图标模板.我们建议最好垂直排放图标框架,也就是说行多于列比较好.如果要与 MicroStation 保持一致的话,图标框架最好排列成两列. 图标模板通常包含几组相关的图标,与图标框架一样,最好竖直排列.图标模板中只能放置图标,而不能放置另外的图标模 板.图标模板可以从图标框架中拉出来,以使其包含的所有图标都显示出来.

      图标实际上是一种图形按钮,用户可以通过选择图标来激活某种操作.如果一个图标有一组对话框元素相关联,那么这些元 素都放在下拉区,当图标选中时就可以显示出来.

      创建工具条时需要几种资源,别忘了在头文件中定义资源识别码. 1,创建对话框 为工具条创建对话框类似于为其他的对话框元素创建对话框,主要的区别在于在对话框元素列表规格描述中只有一个元素, 即:图标框架或者扩展的图标框架,分别用 IconCmdFrame 或者 IconCmdFrameX 来识别.尺寸字段没有意义,系统会根据 图标的数量来计算对线,创建框架 创建框架需要创建一个图标框架的资源规格描述.框架资源主要说明框架中有那些图标或者图标模板.在图标框架中可以有 3 种类型的元素.首先,可以将图标(以 IconCmd识别)直接放置在框架上,不过如果图标带有下拉区的话,最好不要把它 直接放在框架上, 因为直接放在框架上的图标不能自动显示下拉区.其次,可以将预定义的图标模板(以 IconCmdPaletteX )放在创建的框架 上.第三,可以放置用户自定义的图标模板(以 IconCmdPalette或者 IconCmdPaletteX).如果您创建的图标模板中包含了 由应用定义的来自一个共享资源号目录(shareids)的图标时,就需要使用 IconCmdPaletteX 类型来识别.

      如果使用 IconCmdFrameX 来创建框架,请使用下例中的调用格式.其格式类似于上例,包含了框架的属性描述和一个 iconPieces列表.不过可以看出,两例中的调用格式有两个区别:其一,下例中框架在 helpSource之后多出一个 attributes 参 数;其二,除了要指定资源识别码外,还需要指定一个任务识别码(taskID).对于每一个图标或者图标模板,必须给本应 用指定其资源来源于何处.若图标及图标模板在 MicroStation(dlogbox.h)定义的,可以使用 MTASKID 作为任务识别码; 如果是在本应用中定义的图标或图标模板,则使用 OTASKID;如果引用了另一个应用或一个 共享资源号 目录(shareids) 中文件里定义的图标或图标模板,则应把任务识别码设置为相应的 ID 值.

      程序员也可以创建自己的模板而不用从其他应用中引用.若使用 IconCmdPalette 定义模板,应当使用下例中的格式.其中的 图标可以来源于 dlogbox.h或者其他的应用.

      如果使用 IconCmdPaletteX 定义图标模板,请使用下例中的格式.其中任务码用法与创建框架相同.

      4,创建图标 如果要创建自己的图标,有三种资源必须创建:图标命令,小图标(icon),大图标(icon).图标命令定义了图标的属性,比如 定义了选择图标后要执行的代码.

      创建大,小图标可以使用栅格图形编辑器,比如 RASTICON或者 MDE 的图符编辑器.

      当您需要改变或者更新对话框中元素的值时,还有一些程序细节需要处理.同义列表是维护元素同步的一个方法,用于指定 当列表中的一个元素的值改变时需要通知哪些对话框元素.一旦某元素被通知到,元素外观显示将被强制与相连的变量值一 致.

      对话框元素的内部值用于决定元素的外观显示,而元素的外部值是元素所控制的应用程序中使用的变量. 访问字符串 (access string)是一个 C 表达式,用于指定应用程序变量名称,并用于获取元素的外部值.保持元素的内部值(或外观显 示内容)跟外部值一致的操作就是对话框元素的同步,也就是说,一旦某元素被同步,其内值和外值将是一致的. 如果同一个资源在屏幕上有多个显示实例,这些实例将自动保持一致.

      在某种情况下,不仅需要在元素的外值改变时更新其内值及外观显示,还需要同步更新其它一系列元素的内部状态.这种同 步改变可以通过同义资源来实现. 同义资源是一个简单的元素列表,列表给每一个元素指定了元素的类型和资源识别码.有些类型元素(比如检查按钮,文本 框,选项按钮)可以在其元素资源规格描述中包含同义资源识别码.无论何时这些类型元素的外值发生变化,将会发送一个 同步消息到所有与之相连的同义资源中,这就会强制使每一个同义资源的外观显示与相应的程序变量相匹配.

      使用同义资源有几个步骤.这个来自第五章《对话框元素》的例子将被用于示范同义资源如何合并到应用中的. 1,定义同义识别码 和其它资源一样,同义资源也必须有一个识别码.完成定义的方法如下: #define SYNONYMID_Sample 1 2,创建同义列表 同义列表是在资源文件中定义的.列表中指定了当一个元素改变时要被同步的元素.下例示范如何同步文本框和选项按钮:

      3,更新元素资源 还有一步必须完成,那就是增加同义识别码到相应的元素资源规格描述中.

      需要注意的是必须设置访问字符串字段,访问字符串包含了与元素相关的数据.如果同义列表中的一个元素的值被改变,其 它的元素会收到一个消息,并且其外观显示将被更新,使其与访问字符串中的值一致.

      消息列表和命令列表是另外两个用于增强 MDL 应用的资源类型.消息列表集中了应用中要显示的消息字符串.命令表是一 系列层状定义 MDL 应用中键入命令的结构.

      消息列表用于定义命令,提示信息和错误信息的文本字符串,消息列表中的每个字符串都有一个唯一的消息码. 使用消息列表有两个原因:首先,可以改变消息内容(比如翻译成其它国家的语言)而不用重新编译程序,只需要改变资源 文件就可以了;第二,消息只在需要时才调入内存,节省了 MDL 应用的使用内存. 1,创建消息列表 消息列表的结构定义于 $(MS)/mdl/include/rscdef.h 文件中.

      2,定义资源识别码 和其它资源一样,消息列表资源的识别码必须在头文件中定义,而且号码要以升序排列.

      有些函数,(比如 mdlOutput_rscPrintf)不仅需要消息识别码,同时还需要消息列表识别码作为参数.另一些函数(比如 mdlState_startPrimitive)只需要消息识别码作为参数.如果没有指定消息列表,系统会自动使用当前注册的消息列表.至于 如何注册消息列表,将在后面讨论. 3,注册消息列表 注册消息列表使用 mdlState_registerStringIdss函数.一般这种注册都在主函数中进行,以便以后可以使用消息字符串.

      一个应用可以在命令表中定义自己的命令语言.命令表用于定义键入命令的语法,使得 MDL 应用的命令如同 MicroStation 的命令一样.键入命令通过一个名为 Table 的结构在资源文件中定义,该结构在 $(MS)/mdl/include/rscdefs.h 中定义.

      name字段是可以键入的关键词.在有的平台上,关键词区分大小写.关键词要用引号括起来,其中不允许有空格,斜杠 (/)和等号(=).如果语法分析器找到两个匹配的命令表,MicroStation 将使用匹配得最好的那一个.如果几个应用中包 含同一个命令名称,MicroStation将忽略后调入的应用中的命令.

      编译命令行语法为: rcomp -h filecmd.r 编译后将产生两个输出文件:一个是 filecmd.rsc,用于对键入命令进行检查语法检查;另一个是 filecmd.h 包含了一系列 32 位无符号整数作为应用所支持命令的识别码.

      MDL源文件中的命令初始化函数使用关键词 cmdNumber来联结命令号.命令号给 MicroStation 用户提供了一个熟悉的执行 命令的方式.例如,用户可以键入 uSTN place myline 来执行一个命令.

      同消息列表一样,命令表也需要调入才能使用.一般都在主函数或者被主函数调用的初始化函数中调入.下例示范了如何使 用 mdlParse_loadCommandTable 函数调入命令表.

      本章将介绍创建功能强大的应用程序的其他一些程序设计工具和技术,这些功能强大的新的特征均为 MicroStation 所提供.

      1,明了事件驱动程序设计的基本概念 2,创建自己的简单应用

      MicroStation 定义了很多变量,常量以及函数可供编程者调用,使用系统提供的工具可以大大加快程序开发的进程.

      内置变量是可以被 MDL程序存取的全局变量.MDL 编译器知道变量名和变量类型名称,但并不知道类型定义.因此,编 译器无法确定诸如结构和联合的成员变量的特征,如变量名和变量类型等.任何内置的非基础数据类型(如 int,char,double 等等)都必须包含类型定义(内置变量的类型定义包含在 MDL开发软件包的头文件中).下面的表中列出了内置变量的变 量名,类型及其描述. 类型 变量名 描述

      MDL的强大功能在于它的很多内置的函数.MDL 应用提供了通过这些函数直接存取 MicroStation的CAD引擎 的能力.其 中有几千个函数可供使用,以提供直接创建和操纵元素以及界面的功能.这些函数与 MicroStation 内部使用的函数是完全一 致的.

      MicroStation 的函数使用它自己的特别的命名风格,而且建议使用者创建新的函数时也采用类似的规则,以形成良好的程序 设计风格.

      有两种基本的方法开发 MDL 程序.一种方法是使用输入处理函数,激活 MicroStation命令,模拟命令输入来完成;另一种 方法是调用 MDL的内置函数去完成相应的任务,而不用激活 MicroStation 命令.

      第一种方法可以称为顺序化程序设计方法.这种方法不善于完成复杂的任务.MicroStation倾向于采用事件驱动的程序设计 方法.如果您采用顺序化程序设计方法,那么您的应用看起来将不象一个 MicroStation 的应用程序. 优点

      容易完成简单的任务; 对 MicroStation的内部处理过程了解的程度要求较低.

      要求了解命令的输入; 难于使命令透明地使用; 多个应用的交互相当复杂; 很难与 MicroStation 保持一致. 事件驱动程序设计

      与第一种方法相比有较大的优势.MicroS tation 主要有以下几种事件:

      在事件驱动程序中,事件驱动程序的运行.MicroStation 是完全的事件驱动程序,MDL 应用也应该采用这种技术.可以把 MDL想象为处理一系列事件的函数集合.MDL 程序员只需创建处理应用产生的特定的事件的响应函数. 在 MicroStation中,所有的事件都由输入处理器(input handler)进行收集.每一种输入处理器收集特定的输入到 输入包 中, 输入包 验证事件并以标准格式将之放入输入队列中,事件就被发送到到输入队列中.当事件到达队列头部,任务调度 器开始处理该输入消息.调度器将该事件发送到相应的任务之中.整个事件处理的过程称为 MicroStation 输入主循环.

      学会将对话框与应用连接起来的几种方法.要在应用中使用对话框,必须将它们连接起来.有三种方法将应用与对话框连接 起来.

      使用命令号连接一个对话框和应用. 输出变量与结构 整合存取串到应用 废弃存取串

      作为对话框所用的存取串必须是为之可用的变量.

      对话框钩子函数是对话框及其元素设计功能最强大的工具之一.它提供了更为强大的功能和更大的灵活性.

      创建并连接对话框钩子函数. 创建并连接对话框元素钩子函数.

      对话框管理器提供的 Messages 对话框可以跟踪显示消息列表.最多可以显示 100 行,当超过时,将删除最前面 50 行.对话框 管理器可以响应请求,打印出发送到钩子函数的消息的信息.具体命令如下: DMSG ITEMDEBUG [ONOFF] 打开或关闭所有的对话框元素的消息显示,如果对话框元素没有钩子函数,将没有消息被显 示. DMSG DIALOGDEBUG [ONOFF] 打开或关闭所有的对话框的消息显示,如果对话框没有钩子函数,将没有消息被显示. DMSG CLEARDEBUG 是否显示跟踪的细节信息. DMSG OPENMSGFILE 文件名 将消息跟踪写入文件,如果文件已经存在,将被覆盖. DMSG APPENDMSGFILE 文件名 将消息跟踪写入文件,如果文件已经存在,将追加到末尾. DMSG CLOSEMSGFILE 将消息跟踪文件关掉. DMSG ACTION SHOWMNEMONIC 按照字母顺序显示活动对话框键盘存取串,如果想在命令窗口之外的其他地方显示,可 以使用 CTRL -ALT -SHIFT -M 或定义自己的功能键菜单. 关闭 Messages窗口将关闭所有的消息跟踪,要继续跟踪必须重新键入使用的命令.

      配置自动装入的应用程序 了解 OFF_Line方法的程序设计 学会怎样存取应用程序参数

      MS_DGNAPPS变量可以通过用户配置菜单来设置,该菜单允许用户选择自动启动的应用程序. MS_DGNAPPS指定的应用在 MicroStation启动到设计文件打开的时间内运行.当用户打开设计文件或从文件菜单中选择了 关闭并打开另一个设计文件是运行该程序. 如果用户键入 rd=command或从文件菜单中选择了打开时,该指定应用程序将不被运行. 典型处理 1. 打开资源文件

      装入命令表 打开工具条或其他非模式窗口,MS_DGNAPPS不支持模式窗口. 控制返回到 MicroStation.

      元素描述符(Element Descriptors)为程序员提供了另一种访问文件中元素的方法.它们实际上是一系列简单或复杂元素的 多连接列表,元素描述符中的指针允许程序员访问列表中的元素.

      元素描述符是一个多连接的元素列表.这种多连接给程序员提供了从多个方向纵横浏览列表的能力. MicroStation 会为元素描述符分配内存空间,这些空间是分配在 MicroStation 的内存堆里的.在应用程序中不能使用 malloc(sizeof(***))的方式为元素描述符分配内存空间,因为元素描述符的真正空间是根据其中所包含的元素的数量多少而动 态确定的,并非一个常量.尽管元素的内存空间是 MicroStation 分配的,MDL 应用仍然有使用 mdlElmdscr_freeAll函数释元素 描述符所占内存的责任. 复杂元素不能使用简单的结构来描述,它们拥有大小不等的各种元素.如果一个复杂元素的数据存放在 MSElementUnion结构 或者 dgnBuf 中,只能访问元素的头部信息,要访问整个元素的所有信息,则需使用元素描述符. 元素描述符确认复杂元素的头部信息,包括:范围,类别位图(Class Bitmap),级别指示器(Level Indicator),描述字,元素个 数,极数(Number of Poles),最大文本长度等等.当元素描述符写入设计文件时,元素的有效性将自动检查.

      MSElementUnion和 MSElement 的联合是相同的类型.请注意,当你使用其中一个代替另一个并包含标准头文件(.fdf)时,编 译器都会发出警告,因为编译器要执行严格的原型检查.这时您可以不去理会它.

      元素描述符因为其多连接特性,导致了它们自身被递归浏览.递归和元素描述符非常适合嵌套状的复杂元素,因为对于嵌套的 每一层,应用会简单地调用递归函数进行任何处理.因为难于确定嵌套级数,所以调试递归程序比较麻烦. 当连接一个递归程序时,可能不得不增加堆栈的大小,至于增加多少,这得看自动变量的数量. 1,创建元素描述符的两种基本方法

      2,需要记住的几件事 ? 使用完元素描述符后,一定要释放其内存; ? 元素描述符可能会使用大量内存; ? 千万别使用 sizeof(MSElement)来复制元素描述符.

      MDL应用最常用的一个操作就是定位和修改已有的元素或者元素组.

      元素操纵(manipulation)或者修改(modification)命令是 primitive 命令的一个子集.操纵命令和 primitive 命令之间的区别在 于操纵命令要求设计文件中有已经存在的元素. 元素的定位操作要求使用 MicroStation 的设备调用扫描器(Scanner).MDL在扫描器顶层提供一个界面(mdlLocate 等函数) 进行交互式的元素定位操作.通过指定搜索判别式,MDL 应用可以定位设计文件中的已有元素.应用中可以使用多种搜索判 别式,比如:元素类型,位置,属性,级别等. 要知道,在几乎所有的 MicroStation 的操纵命令中,均支持两种标定元素的方式.第一种方式是提示并等待用户标定一个或者 一组元素,另一种方式是在激活操纵命令之前先标定元素或元素组.大部分的 MDL命令都支持这两种方式.

      mdlLocate_restart 函数可以用于重新开始定位处理.它将重新初始化定位逻辑并提示用户标定下一个元素.栅栏操作不需要 这一步.

      下例中示范了如何使用操纵命令查找线和线串并把它们的颜色和风格修改成当前的激活值. 1,初始化定位操作

      参数必须设置为 TRUE).同时,为了让图形组作为一个组来处理,还需要把图形组的锁 打开 (turn on).值得注意的 是,选择集(selection set)和图形组(graphic group)是相互排斥的,并且选择集优先.比如,有一个激活的选择集,但选择集中 的一个成员正好在一个图形组中(而且图形组的锁有效),那么,只有选择集中的元素才会被处理.另一方面,如果没有选 择集,并且标定用于修改的元素属于一个图形组(同时,图形组锁为 on),那么属于这个组的其他元素将连同这个元素将 一起被修改. mdlModify_elementSingle 和 mdlModify_elementMuti 函数的参数: 参数 1— 处理的文件号; 参数 2— 元素在文件中的位置; 参数 3— 为复杂元素调用元素函数的标志; 参数 4— 表明修改元素所用步骤的修改标志; 参数 5— 元素函数:在修改元素时为每一个成员调用的函数; 参数 6— 指向包含元素参数的结构的指针; 参数 7— 对于 mdlModify_elementSingle函数,本参数与成员标志变量一起使用(参数 3);对于 mdlModify_elementMuti函 数,本参数用于决定是否处理图形组(如果为 TRUE,图形组以及选择集将被处理). 尽管 mdlModify_elementSingle和 mdlModify_elementMuti经常使用,有时也可以使用稍微低级一点的 mdlModify_elementDescr 函数来编写操纵函数.所有这 3 个函数最终都调用一个在应用中定义的元素函数(element Func(tion))来执行实际的元素修改操作(图 15-1 显示了这种层次结构).

      图 15-1,各修改函数之间的层次示意图 4. 元素处理

      因为本例中调用 mdlState_startFenceCommand函数时,数据点函数的指针参数设置为空(NULL),MDL 会自动设置 mdlFence_process函数为数据点处理函数.在进行栅栏锁和 裁减模式检查之后,元素被一个一个地传递给内容函数 acceptFenceContents. 虽然本例中数据点函数的指针参数设置为空,但在有的应用中需要自己的栅栏函数来记录用于预先处理栅栏的附加信息,比 如栅栏移动和栅栏复制所需的其他数据点.因此,数据点函数将在数据点处理结束后直接调用 mdlFence_process.必须注 意,调用 mdlFence_process函数时,栅栏必须已经定义,否则将有错误发生. 7,轮廓( outline)函数的附加信息 在上面的例子中,轮廓函数都被设置为空(NULL),但是在通常情况下,设置为空并不是最好的选择. 轮廓函数是在所有栅栏处理完成后执行的唯一函数.如果栅栏命令在处理完成之后继续进行,倘若该处理针对大量元素的 话,会有一个时钟错误.只有当轮廓函数执行之后才能确信栅栏处理已经完成.尽管您的命令可能并不需要绘出栅栏的轮 廓,栅栏函数也可以用来执行一个需要在内容函数执行完毕后进行的进一步处理.确信您已经对大的设计文件进行了栅栏命 令测试,以保证您的命令操作适合大量元素.

      MDL 调试器提供类似于 C表达式求值器的标准命令.

      MS_INITAPPS=应用程序名 在同一时刻,只能有一个应用的调试信息被载入.

      调试器首先在当前目录下查找被调试的源程序,如果未找到,然后查找环境变量 MS_DBGSOURCE 指定的目录.

      MDL调试器只能在 MicroStation 运行时使用(不一定是图形模式),装载的应用必须以 - g选项进行编译和连接.如果使用 BMAKE工具,需指定 - ddebug 选项.

      当 MDB 提示符出现在调试器输出设备上时,就可以在 MicriStation命令窗口输入调试命令. 可以在一行输入多个命令.命令之间用分号隔开.单独按 Enter 键将重复前一命令.调试器可以支持简单的命令行编辑(不同 平台有不同的高级命令),但仅使用插入模式.

      调试器可以接受标准操作符,变量和结构定义,以及内置的 MDL 标准 C函数,但不接受用户声明和用户函数调用. MDL 调试器命令

      设置断点: Break 断点位置可按函数名.当前地址或行号指定.

      继续:GO 函数名继续执行到下一断点,或执行到一指定函数. 帮助:HELP /帮助命令主题

  • Copyright © SUZHOUjinsuanpan 2015-2016 All Right Reserved
    su-icp 0235544198 DESIGN BY JUTOO
    苏ICP备15018128号
  • 首页 | 足球新闻