CGM图形解析技术在民用航空交互性电子手册中的应用
2022-02-19上海航空工业集团有限公司邱昱
上海航空工业(集团)有限公司 邱昱
随着国内民用航空业的不断进步和发展,交互性电子手册(IETM)也逐渐成为民用航空业在生产、交付、运营流程中的一个重要应用。为了能够使民航飞机提供便捷高效的维修、技术支持保障。对民用航空交互性电子手册的研究就显得尤为重要。其中CGM作为民用航空交互性电子手册的重要插图格式,对电子手册的交互性提升、信息查询效率有显著提升效果。本文展示了一种基于Web的CGM解析技术,介绍了CGM图片在交互性电子手册的应用。
1 CGM发展背景
CGM(Computer Graphics Metafile)计算机图形元文件,是一种广泛应用于航空航天、石油天然气、船舶制造业等领域技术出版物的通用插图格式。CGM图形最早出现于20世纪80年代。早期,在许多图形预览类型和CAD的应用程序中对CGM的支持非常常见,然而随着其他图片格式的发展和CGM标准的不断演变,一些供应商和图片软件编码制作者并没有对CGM的格式支持进行随时更新。1999年,一些致力于CGM文件结构的组织共同成立了CGM OPEN基金会,致力于加速CGM文件的进一步使用和实施[1]。
在航空航天、国防安全、汽车制造商、石油天然气等领域的IETM电子技术出版物的应用系统中,无论是基于S1000D标准、HDBK-511标准还是ATA标准,均使用CGM矢量图作为技术出版物插图,在这些行业内部开发使用的交互性电子手册系统中,普遍使用了CGM作为主要图形类型[2]。使用CGM作为技术出版物的插图,在信息查询、数据格式化处理、图片信息热点跳转、内容导航方面具有众多优点。
2 CGM的应用局限性
随着因特网的发展,以浏览器为中心的B/S网络结构逐渐开始替代传统的C/S网络模式。目前,航空业基于S1000D标准实现的交互性电子手册系统,都是基于B/S浏览器结构的。虽然CGM OPEN基金会早在1999年就发布了Web CGM1.0标准,以满足CGM在浏览器的浏览需求。但是随着互联网技术的进步,现代浏览器和HTML5技术发展迅速,CGM仅能实现在传统的支持Active X的IE浏览器中实现预览访问功能。如今,谷歌和微软纷纷表示放弃对IE浏览器的支持,所以在现代浏览器高速发展的今天,现代浏览器并不能对CGM类型的图片支持做到及时更新。
目前,在航空业的IETM系统中,预览和访问CGM类型图片一直依赖于商业化插件集成系统,如Larson公司的VizEx插件。CGM图形的解析技术主要掌握在少数供应商如PTC软件和Larson软件公司,PTC软件公司的Arbortext IsoDraw产品和Larson公司提供的前端开发组件VizEx,提供了编辑、预览和解析CGM图形的功能。这些成品的商用软件,这些商业软件广泛的应用于波音、空客等飞机制造商或航空公司的各类技术出版物编辑与开发工作中,但商业软件封闭性和可控性始终是难以解决的问题[3]。
3 CGM结构解析
3.1 CGM元文件结构概述
CGM元文件整体结构如图1所示,所有基本元素都编码为统一的编码格式。其中,图片组成部分由多个图片元素组成,每个图片元素相对于其他图片元素都是相对独立的。换言之,每个单独的图片元素在得到解释时,画面就能够实现即时渲染和随机存取了,这些图片之前没有任何的前趋、先后关系,因此各个图片元素的改变不影响画面整体的结构和展示[4-7]。
图1 CGM元文件结构图Fig.1 The structure of computer graphics metafile
其中向量元素的定义有以下十类:
(1)分隔符元素。在CGM元文件中用以界定元素范围、维持文件的结构性、如文件开始标记、图片开始标记。
(2)元文件描述符元素。包含描述文件功能内容、默认条件、文件版本标识和CGM特征。
(3)图片描述符元素。包含解释和描述图片内容的各种类型,如图片包含的字体列表、图片所包含的元素列表、字符集、图片颜色模式、颜色校准元素集、字体属性、字形映射等各类描述图片的基本元素。
(4)控制元素。包含控制类基本数据类型如SI(Signed Integer)、UI(Unsigned Integer)、C(Character)、FP(Fixed Point Real)、FP(Floating Point Real)五种类型,除了字符类型外,每种类型都可以使用多种精度定义。这些控制类的数据类型用以表达图片中存在的数字变量和文本变量。
(5)原始图像元素。CGM图片的原始图像元素由折线PolyLine、多点标记PolyMarker、文本Text、限制性文本Restricted Text、扩展文本Append Text、多边形PolyGon、多边形集合PolyGon Set组成,这些最基础的图像图形共同构成了CGM文件的图形结构,是CGM图片的实现基础[8-9]。
(6)属性元素。用以描述原始图像元素的基本属性,如线条宽度、字体大小、多边形填充效果、填充颜色等。
(7)转义元素。用以描述图片和设备相关、系统相关的元素,如不同设备之间的字体编码不同,需要用转移元素进行控制和描述。
(8)外部元素。用以描述与图形图像本身没有直接关联的其他信息。
(9)段元素。用以对图片进行操作的元素,如对图片进行复制、分组。
(10)应用程序结构元素。用以对图片进行响应应用的元素,如热点链接、检索和其他特定的应用程序相关的操作。
3.2 CGM元文件二进制编码结构
CGM元文件的二进制编码是由8位二进制的顺序集合组成的逻辑数据结构,即CGM数据以8字节作为基本数据单位。根据源文件不同元素的数据长度及二进制数据对齐方式,在文件结构中使用两种不同大小的字段定义,这两种不同大小的字段用于说明元素的类别、结构和参数的内容。在8字节基础上,CGM使用两个8字节作为一个“字”,用以在多平台计算机上优化二进制元文件的处理。所以,CGM基本指令的二进制表示如图2所示,CGM图片的所有基本元素遵照短格式指令模式或长格式指令模式构成[10]。
图2 短指令格式和长格式指令模式结构图Fig.2 The structure diagram of short and long instruction format mode
其中,元素类别是指在3-1章节中定义的元素类别,表1是相应元素类别编码所对应的二进制编码表。对于每个类别都包含了一个类别的详细定义,定义CGM元文件元素、元素ID、参数类型、参数列表长度和参数规范。根据CGM的文件结构和二进制编码结构定义,我们使用Java语言实现了CGM解析工具。
表1 元素类别定义表Tab.1 Element category definition table
4 CGM文件解析及实现
根据对CGM元文件结构和CGM元文件二进制编码的研究,我们将CGM的实现分为结构定义、元素解析、图形渲染三个部分。
4.1 结构定义
根据CGM的指令结构,定义指令基础类,并实现CGM结构读取,Command基类实现了CGM基础数据的读取,其实现如下。
public class Command implements Cloneable {
protected int args[];
protected String fileName=null ;
protected int currentArg=0;
private int posInArg=0;
private final int elementClass;
private final int elementCode;
public Command(int ec,int eid,int l,DataInput i n) throws IOException {
this.elementClass = ec;
this.elementCode = eid;
if (l != 31) {
this.args = new int[l];
for (int i = 0; i < l; i++)
this.args[i] = in.readUnsignedByte();
if (l % 2 == 1) {
int skip = in.readUnsignedByte();
}
}else{
boolean done=true;
int a=0;
do{
l=read16(in);
if(l == -1)
break;
if((l&(1<<15))!=0){
done=false;
l = l&~(1<<15);
}
else{
done=true;
}
if(this.args==null) {
this.args=new int[l];
}
else {
this.args=Arrays.copyOf(this.args,this.args.length+l);
}
for(int i=0;i this.args[a++] =in.readUnsignedByte(); if (l % 2==1){ int skip=in.readUnsignedByte(); assert(skip==0):"skipping data"; } } while (!done); } } } 在实现了结构定义和基本数据读取的基础上,根据CGM文件结构的向量元素分类,进行分类数据读取。每个元素类别都定义了一个抽象类,用以描绘这个类别的共有特性和方法,每个类别都有若干个实现类,用以实现具体的向量元素,抽象类的读取分类方法如下,由于目前基于交互性电子手册系统应用场景限制,在日常的CGM图片中,通常不存在段元素和应用程序元素,所以CGM中的段元素和应用程序结构元素尚未实现,但是CGM图片的整体和细节都不会受到影响[11]。 protected static Command readCommand(DataIn put in,int ec,int eid,int l,String fileName,String... params) throws IOException { switch (ElementClass.getElementClass(ec)) { case DELIMITER_ELEMENTS:// 0 return Delimiter.readDelimiterElements(in,ec,eid,l,fileName,params); case METAFILE_DESCRIPTOR_ELEMENTS://1 return MetafileDescriptor.readMetaFileDescriptor Elements(in,ec,eid,l,fileName); case PICTURE_DESCRIPTOR_ELEMENTS://2 return PictureDescriptor.readPictureDescriptorEle ments(in,ec,eid,l); case CONTROL_ELEMENTS://3 return Control.readControlElements(in,ec,eid,l); case GRAPHICAL_PRIMITIVE_ELEMENTS://4 return GraphicalPrimitive.readGraphicalPrimitive Elements(in,ec,eid,l,fileName); case ATTRIBUTE_ELEMENTS://5 return Attributes.readAttributeElements(in,ec,ei d,l); case ESCAPE_ELEMENTS://6 return Escape.readEscape(ec,eid,l,in,fileName); case EXTERNAL_ELEMENTS://7 return External.readExternalElements(in,ec,eid, l,fileName); case SEGMENT_ELEMENTS://8 unsupported(ec,eid); return new Command(ec,eid,l,in); case APPLICATION_STRUCTU_ELEMENTS: //9 unsupported(ec,eid);//10-15 return new Command(ec,eid,l,in); default: assert(10<=ec && ec <=15):"unsupported eleme nt class"; unsupported(ec,eid); return new Command(ec,eid,l,in); } } CGM是由多个元素向量组成的图形,如果要做到图形渲染,需要将向量映射到设备的虚拟空间坐标中,形成绝对的二维坐标,CGM的VDC空间用以定义图像元素的方向、尺寸、坐标原点[4]。由于VDC空间的定义,可以将整个CGM的向量元素约定在一定的范围之内,这个范围就是VDC范围,VDC范围由属性左下角、右上角、和坐标夹角组成共同建立了VDC空间的意义和所属坐标象限,VDC图形一般处于第一象限和第四象限,某些属性如文本属性、字符方向、所有图形内的枚举值的方向都与这些变量有关,根据VDC范围的可以按照比例的将图形渲染到相应大小的Java图形中,相关代码如下。 public void scale(Graphic s g,int w,int h){ this.g2d = (Graphics2D)g; if (this.extent==null) return; double extentWidth=Math.abs(this.extent[1].x - this.extent[0].x); double extentHeight=Math.abs(this.extent[1].y - this.extent[0].y); double fx=w/extentWidth; if (fx*(extentHeight)>h){ fx=h/extentHeight; } this.canvasWidth=(int)(fx*extentWidth); this.canvasHeight=(int)(fx*extentHeight); this.isScaled =true; } 经过4-1、4-2、4-3的CGM文件解析步骤后,可以将CGM图片使用Java Graphics2D展示到桌面端,点击图片内容则可实现放大、缩小。在我国航空业内实现的交互性电子手册系统中广泛使用了CGM作为插图格式[12],为了使CGM图片更好的在Web浏览器中展示,我们将已经成功渲染的Java Graphics2D图形转化为SVG格式,SVG格式能够保存CGM格式的热点信息、向量信息并同样可以实现放大缩小功能,其实现效果如图3所示。 图3 交互性电子手册插图实现Fig.3 The implementation of IETP's illustrations IETM系统作为飞机维修、运营流程中的重要组成部分,承担着信息交流、数据共享等功能。CGM作为其中重要的数据载体之一,对IETM系统的作用也至关重要,本文从CGM的背景、目前应用局限性出发,经过对CGM文件的结构进行分析描述,对CGM元文件二进制编码进行解析和加载。最终实现了一种自主可控的CGM解析技术,从而摒弃对商业软件的依赖性。本文对CGM在民用航空业交互性电子手册的应用研究,将应用于国内航空业的技术出版物手册系统。4.2 元素解析
4.3 图形渲染
4.4 图形应用
5 结语