电网智能调度IDAMMI界面单元设计.doc
IDAMMI界面单元设计项目名称:电网智能调度项目编号:JYF-IDA主管部门:电网自动化事业部当前版本:1.0目录一QT-OpenGL环境下中文字符的显示11字体引擎和绘制22字体编码转换33字体文件定位43.1Windows平台字体文件定位43.2Unix平台字体到字体文件的映射6二 智能调度人机界面整体设计91描述92MMI框架主要分布和功能设计103人机界面主体和场景管理:123.1术语解释:123.2MMI窗口与场景管理方案13一QT-OpenGL环境下中文字符的显示摘要OpenGL下中文显示是基于OpenGL环境应用开发必须面对的问题,本文提供了在Qt-OpenGL环境下显示中文字符的综合解决方案。目标:在OpenGL环境下,实现人机会话图形文本的任意显示,能兼容Qt的字体设置和格式设置 约束显示的字符能随图形一起缩放、旋转、变形,满足人机界面字符输出的要求能跨平台,采用矢量字体,缩放操作不会产生明显的效果下降主要技术难点1 字体引擎和绘制2 字体的编码转换3字体文件的查找与定位4 字体风格的实现5 字体缓存1 字体引擎和绘制OpenGL环境下绘制字体,必须能读取字体信息,并能使用OpenGL函数绘制在指定的位置,经过考察对比,引入开源项目FTGL作为OpenGL环境下的文字绘制引擎,FTGL使用另一个开源项目FreeType作为字体引擎,读取字体文件。FTGL的版本采用的是2.1,FreeType版本是2.3.5。FTGL和FreeType可以支持TTF字体的读取与绘制,但是目前的FTGL实现存在一个缺陷,即无法直接读取TTC字体文件中的第二个字体,比如在WindowsXP 环境中,字体“宋体”和“新宋体”使用的是同一个字体文件,FTGL只能读取默认的第一个字体,FreeType提供的接口,可以读取默认的字体,然后得到字体文件中的总数目,继续读取其他字体,在此可以考虑重新实现FTGL的部分字体绘制类,在指定字体文件的时候可以同时指定字体文件中的字体索引。FTGL文字绘制,默认的字符方向:原点在左下侧,轴向右为正,轴向上为正。一般的采用的是左上为原点,轴向右为正,轴向下为正,因此进行文字绘制之前,可以改变坐标系,进行镜像变换:glScale(1.0f,-1.0f,1.0f);在字体绘制过程中,可能出现部分字体小字号无法读取的问题,为此可以采用一种间接的方法,在制定字体的时候,采用实际字体的一个特定倍数,使实际设置的字体位于3072之间,并返回这个倍数,在进行坐标系镜像变换时,同时变换放大倍数,使实际绘制满足制定的尺寸,此时镜像变换变为:glScale(k,-k, k);为时FTGL满足应用需求,进行如下修改:1 修改FTFace、FTFont、FTPolygonFont等类,使打开字体文件添加一个传入字体索引的功能,保证能支持TTC类型的字体文件(一个字体文件中包含多个字体);2 修改FTPolygonFont的加载字体的方法,由原来的 FTLoad_NO_HINT 添加标志 No_Bitmap,保证使用多边形类型的字体忽略字体文件中内嵌的位图字体文件。在读取WindowsXP环境下 楷体_GB2312 字体时,发现无法正常显示,具体表现为字体上添加一个没有规则的曲线,导致轮廓字体和多边形字体都无法正常显示。比较该字体和其他能正常显示的字体文件(使用FontLibStudio5)发现,该字体的控制点都不在笔画轮廓曲线中,一般的字体都是在两个线上控制点之间一个线外控制点,跟踪FreeType发现,在读入字库文件,并进行贝塞尔差插值产生中间笔画点过程中,以最后一个线上控制点作为终止条件,在楷体这种情况下,无法正常终止,添加了许多人意曲线。修改该部分代码,读入控制点时,同时标志或点数目作为终止条件,可以解决该问题。2 字体编码转换FTGL的字体绘制类提供两种参数类型的接口,一个是Render( const char* string ),另一个是Render( const wchar_t* string ),当进行非英文字符输出时,只能采用wchar_t类型,QT内部采用的是Unicode编码方式保存文字信息,因此,可以直接使用QString进行文字转换。可能的几种转换方式如下:从单字节字符串得到QString:QString str = QString:fromLocal8Bit(char*);从Unicode字符串得到QString:QString u_str = QString:fromUcs2(wchar_t*);从QString得到单字节C风格字符串:const char* buf = QString.local8Bit.data();从QString 得到Unicode字符串:const wchar_t* u_buf = QString.ucs2();在Unix平台上,wcha_tr的长度是4个字节,而在Windows平台上,wchar_t是2个字节,Qt336版本QString内部使用2个字节保存Unicode编码的字符串,在进行转换时必须针对不同的操作系统进行处理,在Windows平台,直接通过QString:ucs2()可以转换成 wchar_t* 类型的指针,在Unix平台,通过字符串转换类进行转换。跨平台转换宏定义如下:#ifdef _unix #define JQSTRING2WCHAR(s) JWcharConverter(s).wcharData()#else#define JQSTRING2WCHAR(s) (wchar_t*)s.ucs2()#endif其中的JWcharConverter为数据类型转化类,其核心的实现代码如下:wchar_t* d;d = new wchar_tqs.length()+1;wchar_t * p = d;const unsigned short* ucsBuf = qs.ucs2();for(uint k=0;k<qs.length() + 1;+k)*p+ = *(ucsBuf + k);在转换器的构造函数内部分配内存并进行数据类型转换,在析构函数内部释放内存。需要把QString转换为wchar_t*类型的地方,统一使用宏定义JQSTRING2WCHAR,示例代码如下:m_ftgl_font->Render(JQSTRING2WCHAR(text);要正常使用wchar_t和unsigned short之间进行转换,VS2005 工程设置中,不能把wchar_t视为内部类型,具体设置方法为:工程 -> 属性 -> 配置属性 -> C/C+ -> 语言:将wchar_t视为内部类型:否如果不进行上述设置,在传递unsigned short 作为wchar_t时,会提示错误。3 字体文件定位FreeType加载字体,必须提供字体文件路径,而Qt没有提供直接访问操作系统字体文件的方法,因此这部分工作必须应用程序实现。编写一个专门的字体文件管理类,可以根据QFont查找字体文件的物理存储路径,实际的查找过程采用跨平台方法,即同样声明的函数,通过采用平台预处理命令来进行不同的实现,比如在Windows平台上,采用#if dfined(WIN32)来实现条件编译。不同的平台实现的方法各不相同,针对特定的平台,搜集相关资料,不断完善这一函数,最终实现系统跨平台运行。负责该字体到字体文件映射的函数声明为:bool GetFileNameFromFont(const QFont& targetFont, QString& fontFilePath,int& faceIndex, bool& need_bold, bool& need_italic,bool& exact_match);该函数的输入为QFont,输出为字体文件的路径以及是否绘制环节进行特殊的字体绘制风格处理,如是否需要斜体、是否需要粗体等等,以及所得到的字体文件是否精确匹配。该函数的实现采用跨平台方式,通过条件编译语句控制函数体的具体实现,现分别描述3.1 Windows平台字体文件定位Windows 平台上要定位字体文件需要解决三个问题:A. 系统字体文件保存路径,虽然默认的字体文件夹是 %SYSTEMDIR%Fonts,但是不能以此作为程序的依据;B. 字体名称到字体文件名称的对应;C. 字体家族、风格到字体名称的对应。字体文件保存路径可以通过Windows平台的API得到,具体使用的API是:SHGetSpecialFolderLocation():得到特殊文件夹的IDSHGetPathFromIDList():根据ID得到文件夹的字符串描述这两个的函数声明位于头文件:<shlobj.h>使用参数CSIDL_FONTS调用第一个函数,得到一个ID,根据第二个函数得到字体文件的保存文件夹。上述函数调用时,需要使用TCHAR作为参数,这是Windows平台为了适应单字节字符和Unicode编码而定义的数据类型,通过UNICODE宏定义来分别处理char和wchar_t,相关的定义和处理函数生命位于头文件 <tchar.h>和<strsafe.h>,TCHAR与QString转换代码为:TCHAR szPath MAX_PATH;QString path;#ifdef UNICODEpath = QString:fromUcs2(szPath);#elsepath = QString:fromLocal8Bit(szPath);#endif字体名称到字体文件名称的对应Windows平台,字体名称和字体文件的名称可以从注册表中查找,根据Windows版本不同,存储的位置不同,WindowsNT及之后的系统,注册表存储位置为:HKEY_LOCAL_MACHINESoftwareMicrosoftWindows NTCurrentVersionFontsWindowsNT之前的系统,注册表位置为:HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionFonts存储的形式是名称和字符串值,名称是字体的名称,字符串是字体文件的文件名称或者全路径。比如:"方正舒体 (TrueType)"="FZSTK.TTF"要根据字体名称查找字体文件,使用Windows注册表访问函数,遍历该处的所有键名称和键值,通过名称的比较得到合适的字符串。还有两个注册表键需要进一步研究:FontDPIFontLinkFontMapperFontSubsitutesHKEY _ NTCurrent VersionFontSubstitutes当程序调用对常见系统或对话框字体, FontSubsitution 映射用来查找有关计算机的系统区域设置相应字体字体家族、风格到字体名称的对应对于英文字体,每个家族中可能存在多个独立的字体文件,比如:"Arial (TrueType)"="ARIAL.TTF""Arial Bold (TrueType)"="ARIALBD.TTF""Arial Bold Italic (TrueType)"="ARIALBI.TTF""Arial Italic (TrueType)"="ARIALI.TTF"这类文件中,字体名称体现了家族、风格和字体文件类型,可以根据字体家族名称和风格,按照一定的规则形成字体名称,在字体列表中查找;有些字体文件中包含多个字体,命名为TTC,比如:"宋体 & 新宋体 (TrueType)"="SIMSUN.TTC""MS Mincho & MS PMincho (TrueType)"="MSMINCHO.TTC""MS Gothic & MS PGothic & MS UI Gothic (TrueType)"="MSGOTHIC.TTC""Gulim & GulimChe & Dotum & DotumChe (TrueType)"="gulim.ttc""Batang & BatangChe & Gungsuh & GungsuhChe (TrueType)"="batang.ttc""SimSun & NSimSun (TrueType)"="simsun.ttc""MingLiU & PMingLiU (TrueType)"="mingliu.ttc""Cambria & Cambria Math (TrueType)"="CAMBRIA.TTC"这类字体文件,采用“&”符号连接字体文件中的所有字体,可以通过在打开字体文件时指定字体的序号来确定加载字体。对于字体文件的搜索,可以按照下列逻辑:首先根据家族名称和风格名称形成字符串:“家族名称 Bold Italic”查找匹配的记录,如果没有,则把家族名称后面添加一个空格“家族名称 ” 然后查找所有的字体名称,如果找到,判断位置是否在名称的开始位置,如果是开始位置,直接可以使用对应的字体文件名称。如果不在开始位置,重新根据家族名称,得到字符串:“& 家族名称 ” 搜索上述字符串,如果找到,截取其左边的子串,查找“&”的个数(包括被找到的这个),该字体在字体文件中的索引即所有“&”的个数。对于中文字体,往往只有一个字体文件对应一个家族,没有专门的粗体和斜体字体文件,Windows是如何实现这类字体的斜体和粗体的,目前还没有查找清楚。3.2 Unix平台字体到字体文件的映射Unix操作系统有许多平台实现,每种实现中字体文件的保存位置都不相同,在XWindows标准中,XLib提供核心字体管理的操作函数,这些函数能查找匹配字体,并能生成虚拟字体,满足绘制的需求台,XWidnow核心字体管理的主要内容是字体搜索路径以及每个路径中保存有字体文件名和逻辑名(LFDP)对应关系的fonts.dir文件,对于矢量字体,还有fonts.scale文件,以及字体的别名文件fonts.alias,通过路径和这些文件,XWindows实现了对字体文件的管理。Qt字体信息中没有字体文件信息,只有在具有XFT选项的Qt内部,有对字体文件的信息的管理。但是Qt对字体的应用以及XWindows提供的对字体的操作,仅限于对光栅化之后字体显示和操作的管理,不能完全依赖之实现对OpenGL字体绘制的实现,因此具决定采用XLib函数自行进行矢量字体信息的访问。3.2.1 字体保存路径和字体文件的定位首先需要确定要查找的字体存放路径,XLib函数库中的函数:XGetFontPath()可以用来访问所有的字体搜索路径,该函数需要Display*作为参数,调用方式如下:int result=0;char * fontPath = XGetFontPath(QPaintDevice:x11AppDisplay(),&result);在对字符串使用完毕后,需要调用XFreeFontPath(fontPath)来释放返回的内存区域。之后通过查找字体路径是否含有fonts.scale,以此作为是否矢量字体的标志,如果存在该文件,则读取该文件,得到该目录下所有字体的XLFD到文件名的映射,如果存在fonts.alias,读取之建立简单名到XLFD的映射。提取文件名中的扩展选项,如“:”中间的内容,分离文件名本身和扩展内容,主要是获得字模序号,即在TTC、OTC类型的字体文件中,所使用字体在其中的编号,根据后台字体引擎的不同,编号的格式可能是“:n:”或者“:fn=n:”,通过正则表达式匹配查询搜索是否具有该类型的选项。在XLFD规范中,字体名称的特定字段为0表示矢量字体,包括:PIXEL_SIZE、POINT_SIZE、RESOLUTION_X、RESOLUTION_Y、AVERAGE_WIDTH,通过检查这些属性是否为0可以进一步确认是否矢量字体。可以将以上字体的信息通过读取XLFD字符串转换位可以快速访问的数据结构,供查询和匹配使用。3.2.2 字体的匹配字体匹配的目的是根据QFont对象的内容,确定其对应的XLFD,并根据到文件的映射关系和字模序号得到该字体对应的字体文件及其在文件中的编号。QFont提供的字体信息包括字体的家族名称、绘制风格、字体大小等信息,矢量字体文件匹配仅需要考虑字体的家族、和字体的绘制风格。由于Unix系统上,XLFD只支持英文描述的字体名称,因此不能使用“宋体”之类的字体家族描述,需要进行映射,可以通过配置文件,把常用的中文字体家族映射到Unix下对应的字体名称,如:宋体- song, songti,sung楷体- kai,kaiti黑体- hei,heiti仿宋体- fangsong,fangsongti从上面可见,映射不是唯一的,目的是确保在各种平台的适应性。完成字体名称映射后(如果有必要),根据字体名称和显示风格进行匹配,首先进行全部内容匹配,即根据字体名称和风格匹配,如果能得到精确匹配,则返回结果,如果无法得到结果,则只针对字体名称进行匹配,如果根据字体名称也无法匹配,则根据配置文件制定的中文字体范围,确定所查询的字体是中文字体还是英文字体,分别提供默认的字体,作为查询结果,保证显示的正常。3.2.3 字体文件的编码QString内部使用Unicode保存文本,因此要求字体文件必须使用Unicode或者兼容编码进行字模匹配。各种常见的编码与Unixode的关系:GB2312(1980年)一共收录了7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。 GB2312支持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符。GBK: 对GB2312的扩充, 以容纳GB2312字符集范围以外的Unicode 2.1的统一汉字部分, 并且增加了部分unicode中没有的字符GB 13000: 完全等同于ISO 10646-1/Unicode 2.1, 今后也将随ISO 10646/Unicode的标准更改而同步更改;GB 18030-2000: 基于GB 13000, 作为Unicode 3.0的GBK扩展版本, 覆盖了所有unicode编码, 地位等同于UTF-8, UTF-16, 是一种unicode编码形式. 变长编码, 用单字节/双字节/4字节对字符编码. GB18030向下兼容GB2312/GBK. GB 18030是中国所有非手持/嵌入式计算机系统的强制实施标准如果字体的编码不能与Unicode兼容,则需要查找兼容的编码字体,否则程序无法使用。FTGL支持的编码映射类型包括:FT_ENCODING_NONEFT_ENCODING_UNICODEFT_ENCODING_MS_SYMBOLFT_ENCODING_ADOBE_LATIN_1FT_ENCODING_OLD_LATIN_2FT_ENCODING_SJISFT_ENCODING_GB2312FT_ENCODING_BIG5FT_ENCODING_WANSUNGFT_ENCODING_JOHABFT_ENCODING_ADOBE_STANDARDFT_ENCODING_ADOBE_EXPERTFT_ENCODING_ADOBE_CUSTOMFT_ENCODING_APPLE_ROMAN当利用FTGL并通过FreeType读入字体时,可以制定所使用的字符集,每个字体至少包括一个字符映射,有些字体文件包含多个字符映射,通过制定字集可以指定所使用的映射。3.2.4 字体风格常见的字体有四种风格:普通、粗体、斜体、粗斜体,有些字体家族具有不同的字体文件,有些家族只有一个字体文件,在FreeType和FTGL都无法自动完成字体风格变换的情况下,可以考虑采用一定的技巧在OpenGL中实现不同风格字体的绘制:粗体:采用偏移一定距离,重新绘制的方式来实现粗体效果,偏移的量应根据字号动态调整,使不产生明显的重叠感,同时又能达到加粗效果为原则,一般可以选择:(字体宽度/(3050)。斜体:通过坐标系变换,实现字体倾斜绘制。在调用FTGL绘制前,使MODELVIEW矩阵乘上一个变形矩阵,目的是使字形中的点坐标满足:x=x+k*y,其中的k为斜体系数,矩阵的形式为:,k的取值范围一般在0.20.4之间。粗斜体:同时应用上述两种效果,得到粗斜体效果。下划线和删除线:对于下划线,通过FFont类的BBox方法得到字体的外接四边形的坐标,在(llx,(lly offset),llz)到(urx, (lly offset), llz)绘制一条直线即可,根据字体大小计算实际使了用的线宽,float width = (float)(int)(FaceSize / 50) + 1);其中的常数 50 可以根据界面效果灵活选定,+1为了保证小字号的下划线宽度不小于1个单位。为了使下划线可以离开文字,y坐标进行偏移offset,偏移量可以选择线宽。对于删除线,通过计算,在(llx,(lly+ury)/2,llz),(urx,(lly+ury)/2,urz)之间绘制一条线,线宽选择同上。实现一个字体管理功能模块,能根据QFont查找相应的字体文件,返回字体文件全路径、字体在文件中的索引、是否需要应用自己实现斜体、是否需要应用自己实现粗体、是否需要应用自己实现粗斜体,是否需要应用自己实现下划线、是否需要应用自己实现删除线等信息。如果调用者希望在无法找到字体时提供默认字体,则提供默认的中文和英文字符的字体信息。3.2.5 字体缓存使用FreeType访问字体文件,不能实现缓存,必须应用程序自己缓存。FTGL内部对字形进行了一定的缓存,创建OpenGL显示列表。程序中,需要对FTGL字体再进行缓存,模仿VTK,采用一个管理对象,使用单体模式,缓存所有的字体以及字体中的字形。二 智能调度人机界面整体设计1 描述本部分描述人界面中图形刷新和安全分析结果展示的原理。要求:1 对于保存在GRA文件中的监视数据,可以从智能监视服务器获取监视结果,控制3D可视化图元显示;2 对于安全分析结果,可以从安全分析服务器访问结果,经过解释,在人机界面上展示3 安全分析结果可以按照不同层次展示,允许用户选择特定的结果,并对结果进一步展开;4 可以采用多场景、多窗口的方式展示不同层次的结果系统结构图:JGLWindowDataSubscriber智能监视服务安全分析服务Topictopics.iniGRAStagetopic-dllSceneTopic:负责管理一个主题相关的图形和附加图形。topic的内容由配置文件读入,包括:标题、图形文件名称、数据来源、动态文件名称等。Topic对象包含一个Stage,Stage中包含多个Scene,同一个主题的不同场景显示相同的Gra,但显示的图层可以不同。不同的场景中可以显示不同的附加可视化对象。Stage:接受topic-dll创建场景和显示对象的操作,保存并解释添加的对象,在首次绘制时,创建显示列表,可以为每个对象创建一个显示列表。维护具有可操作性显示列表的属性,如显示对象的tooltip、接受操作的对象范围等。根据topic-dll提供的部件坐标,从gra文件获取图形坐标,进而创建显示场景中的对象。接受场景中的鼠标点击消息,如果能触发可操作的对象,则象topic-dll发送对象被操作消息,又dll决定用户的操作产生什么响应。DataSubscriber:负责刷新当前主题图形中的实时数据,实现方式类似600Pro MMI中的数据刷新器。数据刷新由JGLWindow中的数据刷新定时器触发。数据刷新器通过订单从智能监视服务器获取数据。topic-dll: 需要附加图元的主题都可以提供一个动态加载的dll,实现一个统一的接口。mmi根据ini配置加载dll库,并且创建对象。统一的接口实现初始化、释放操作,实现根据结果向给定的stage中添加 actors的工作,即访问安全分析或者其他可视化后台服务器,解释得到的结果,组织可视化展示场景,生成可视化图元,添加到stage和scene中。actor: 动态dll创建的3D可视化图元,采用文本方式(可以考虑是用xml)进行标记,包括:类型、对象编号、坐标、操作属性、图元属性等。类型可以包括:单柱、双柱、三柱;圆锥;圆筒;注视;连线;地形墙;颜色影射图对象编号:有DLL创建并维护,作为图形框架和dll交互的对象标识。坐标可以采用多种方式:固定坐标(Gra图形坐标系);部件中心坐标(指定部件类型和部件ID) + 偏移(上、下、左、右和偏移量);部件沿途坐标(如线路)操作属性:是否有ToolTip,是否可以被鼠标选中图元属性:采用名值对方式设置属性,如“r=10,h1=100,h2=200,color=rgb(1.0,0,5,0,5),aphpa=0.8”,不采用固定的数据结构,便于扩充。由于这种创建场景和对象不是实时性操作,采用字符串对性能影响较小,但非常有利于扩充。操作相应:部件选中、部件取消选中、部件被双击等。2 MMI框架主要分布和功能设计系统(S) 主题 视图 工具 帮助 界面提示区域 <<<消息滚动显示区域<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<预警列表主题列表主题细节界面主要说明:菜单:提供系统管理工具,包括常见的系统层次的操作、图形视角设置、屏幕刷新设置、主题切换、子主题信息,主体相信信息展示等。菜单栏在全屏时不能隐藏(?),布局在屏幕的最上端,如下图:系统(S) 主题 视图 工具 帮助工具栏:提供常见的操作快捷按钮,如保存当前视角、旋转操作、场景漫游等,工具栏在全屏时自动隐藏,工具栏上用于图形浏览操作的按钮,显示区域都有等效按钮,可以直接在显示区域操作。左边框左边框用于显示系统安全消息、主题列表和当前主题详细信息。<预警列表>显示当前智能监视服务器所得到的各种预警告警信息,按照严重级别排序,能显示辅助决策系统提供的针对前述信息和其它必要的决策方案列表。双击预警列表中的条目,可以通过无模式对话框的方式显示详细信息,如果有必要,也可以在OpenGL视图中显示相关的接线图和部件。相应的图形必须存在,并且在产生的预警条目和辅助决策条目中有相应的提示信息,包括图形或者场站文件名称,设备类型和设备ID等,便于人机界面显示和定位。<主题列表>显示所有系统可用的主题,并能显示当前主题,提供对主题的简要说明(展开可见),如果主题处理器能提供图形以外的其它展示方式,此处提供提示,用户触发后可以显示。由处理动态生成模式对话框,组织自行组织内部内容,并相应用户的操作。用户可以通过系统菜单重新加载所有主题,也可以针对制定的主题卸载或者加载。主题的状态:正常显示:所有数据正常,可用卸载:主题卸载,关闭图形文件,释放处理器,卸载后可以替换图形文件和动态链接库隐藏:某些主题暂时不关注,可以隐藏,界面显示有隐藏的主题,同时提供菜单或者按钮,恢复隐藏的主题。正在加载或卸载:主体正在加载或者卸载,显示中间动画过程优先级低。程序启动后,加载和卸载的过程应该由多线程机制来处理,保证界面的可操作性。<主题细节>对于一般的监视类主题,可以在一个图形文件中,通过不同的图层建立多个子主题,比如在同一个单线图中,可以展示变压器承载比,可以展示母线电压标尺,还可以展示线路潮流线。状态栏 分为两个区域,前面的区域显示菜单、工具栏等提示信息,和ToolTip结合,类似于Whats this? 提示,主要区域滚动显示各个主题发出的提示信息,每个主题可以发送当前最重要的提示信,成为通告。可以制定通告定时撤销,也可以主动撤销。在全屏模式时,OpenGL窗口下端滚动显示。主显示区域 分为几个功能区域,<左上区域>集中电网状态指示标志(一个滚动显示的球),球的颜色可以根据电网状变化(如在正常的情况下,显示国网绿色,接近预警是,现实黄色,有告警提示时显示红色。)紧接着显示当前主题的标题,根据主题配置信息得到。在全屏模式下,此处还提供一个主题切换菜单,可以切换当前主题。<右上区域>显示图形浏览操作空间,包括图形错放、平移、视角变换、旋转等操作。在全屏模式下,此处显示一个退出全屏模式按钮。当在单窗口模式下,进行场景切换时,操作区域下方显示两个按钮,分别对应返回上一个场景和返回主场景的按钮。<下边条区域>在全屏模式时,显示非全屏模式下状态栏通告消息。正常模式不显示该状态栏。3 人机界面主体和场景管理:3.1 术语解释:主题:一系列相关的信息展示集合成为一个主题。场景:同一主体内,在同一幅底图中显示的不同可视化图元。主题切换,涉及到重新显示底图、切换当前后台服务,场景切换则是在同一主题内实现展现不同的场景,场景切换可以分为两种:一种是图形内容的场景显示筛选,称为选择式场景变换;另一种是可操作主题中实现的场景变换,即通过鼠标点击等操作,由一个场景切换到另一个场景,称为漫游式场景变换。下表展示着两种场景切换的细节:对比选择式场景变换漫游示场景变换变换内容和实现方式同一GRA文件中不同图层分布不同的可视化图元,用于表述不同的主题,比如同一幅单线图,电压标尺监控、变压器热稳定监控等、线路热稳定监控等。同一主题处理DLL可以根据需求,组织不同层次、不同侧面的结果,用不同的试图展现,比如故障分析,可以展示全网结果概览,可以选择某个故障看中间层次结果,也可以看详细结果等。设定方法用户通过子主题列表,设置场景的显示或隐藏用户通过在可视化图元上鼠标操作,触发场景变换,可以通过界面提供的漫游按钮进行漫游,或者在不同的窗口中展示。应用视图只能应用于主视图在单视图模式下:只能在主视图中通过内容变换实现场景变换在多窗口模式下:在新窗口中打开场景。场景关系各个场景可以自由组合,即可以自由选择同一幅图中显示那些图层。不同场景不能在同一个视图中组合,只能单独显示,或者在不同的视图中同时显示。3.2 MMI窗口与场景管理方案3.2.1 单窗口模式所有显示、操作都在主窗口中显示。主窗口默认显示主题的主场景,选择性场景变换可以应用于主场景。当应用漫游式场景变换时,切换主窗口显示的画面,可以连续进行场景变换,形成场景栈。可以通过工具按钮回退到前一个场景,即进行弹栈操作,也可以直接回到主场景,即弹栈至栈底。回退操作后,原有的后续场景被清空,只能重新打开。3.2.2 多窗口模式主窗口永远显示主场景。在主场景中触发的场景变换,打开浮动窗口显示,浮动窗口仅有窗口操作的必要空间。浮动窗口可以停靠,不可以最大化。主场景进行多次场景变换的,每次都会打开新的浮动窗口进行显示。浮动窗口可以触发场景切换,默认会打开新的浮动窗口,如果对当前浮动窗口进行了锁定操作(通过图形图标操作和显示状态),则新场景会在当前窗口中显示,类似于单窗口操作,进行场景栈方式的管理 主窗口 浮动1(锁定) 浮动2 浮动33.2.3 MMI菜单设计: 菜单菜单项子菜单项 工具栏功能实现设计系统(S)打开(O)打开一个指定的GRA文件,用于浏览一般的图形页面关闭关闭当前打开的GRA页面图像保存当前主窗口图像保存到图像文件打印当前主窗口图像打印退出 推出MMI系统主题(O)当前主题(子菜单) 各个主题列表(选中菜单)设置当前主题下一主题是按顺序切换到下一个主题(循环)上一主题是按顺序切换到上一个主题(循环)主题配置 打开对话框,查看和编辑主题配置信息,包括每一个主题的:标题,说明,顺序,图形文件,动态链接库文件名称。重新加载所有关闭所有主题并重新加载卸载当前卸载当前主题(用于释放动态链接库文件并替换) 加载当前更新GRA或者动态链接库后重新加载重新加载当前详细信息是如果主题处理器提供详细信息,该命令可用视图(V)全屏显示是显示边框边框细节(子菜单)显示预警框显示主题框显示细节控制框显示工具栏显示状态栏视角类型透视视角平行视角图元智能变化设置动态变化响应曲线,用来控制在大图形缩放操作时,对可视化图元尺寸的动态调整。保存为默认视角当前视角保存为该主题打开时的默认视角(写入INI文件)开启动画是开启流水线等动画效果(占用较多资源)尽对主窗口有效导航自动隐藏主窗口导航栏在鼠标离开左上角区域自动隐藏,进入该区域后又出现工具(T)图形选项设置选项配置数据刷新率,动态数据默认服务器,是否使用默认视角,通告显示文字颜色,窗口(W)关闭针对浮动窗口关闭所有关闭所有子窗口帮助(H)使用帮助HTML使用手册(模仿QTAssistant)关于版本版权信息