上海航空工業(yè)(集團(tuán))有限公司 邱昱
隨著國(guó)內(nèi)民用航空業(yè)的不斷進(jìn)步和發(fā)展,交互性電子手冊(cè)(IETM)也逐漸成為民用航空業(yè)在生產(chǎn)、交付、運(yùn)營(yíng)流程中的一個(gè)重要應(yīng)用。為了能夠使民航飛機(jī)提供便捷高效的維修、技術(shù)支持保障。對(duì)民用航空交互性電子手冊(cè)的研究就顯得尤為重要。其中CGM作為民用航空交互性電子手冊(cè)的重要插圖格式,對(duì)電子手冊(cè)的交互性提升、信息查詢效率有顯著提升效果。本文展示了一種基于Web的CGM解析技術(shù),介紹了CGM圖片在交互性電子手冊(cè)的應(yīng)用。
CGM(Computer Graphics Metafile)計(jì)算機(jī)圖形元文件,是一種廣泛應(yīng)用于航空航天、石油天然氣、船舶制造業(yè)等領(lǐng)域技術(shù)出版物的通用插圖格式。CGM圖形最早出現(xiàn)于20世紀(jì)80年代。早期,在許多圖形預(yù)覽類型和CAD的應(yīng)用程序中對(duì)CGM的支持非常常見,然而隨著其他圖片格式的發(fā)展和CGM標(biāo)準(zhǔn)的不斷演變,一些供應(yīng)商和圖片軟件編碼制作者并沒有對(duì)CGM的格式支持進(jìn)行隨時(shí)更新。1999年,一些致力于CGM文件結(jié)構(gòu)的組織共同成立了CGM OPEN基金會(huì),致力于加速CGM文件的進(jìn)一步使用和實(shí)施[1]。
在航空航天、國(guó)防安全、汽車制造商、石油天然氣等領(lǐng)域的IETM電子技術(shù)出版物的應(yīng)用系統(tǒng)中,無論是基于S1000D標(biāo)準(zhǔn)、HDBK-511標(biāo)準(zhǔn)還是ATA標(biāo)準(zhǔn),均使用CGM矢量圖作為技術(shù)出版物插圖,在這些行業(yè)內(nèi)部開發(fā)使用的交互性電子手冊(cè)系統(tǒng)中,普遍使用了CGM作為主要圖形類型[2]。使用CGM作為技術(shù)出版物的插圖,在信息查詢、數(shù)據(jù)格式化處理、圖片信息熱點(diǎn)跳轉(zhuǎn)、內(nèi)容導(dǎo)航方面具有眾多優(yōu)點(diǎn)。
隨著因特網(wǎng)的發(fā)展,以瀏覽器為中心的B/S網(wǎng)絡(luò)結(jié)構(gòu)逐漸開始替代傳統(tǒng)的C/S網(wǎng)絡(luò)模式。目前,航空業(yè)基于S1000D標(biāo)準(zhǔn)實(shí)現(xiàn)的交互性電子手冊(cè)系統(tǒng),都是基于B/S瀏覽器結(jié)構(gòu)的。雖然CGM OPEN基金會(huì)早在1999年就發(fā)布了Web CGM1.0標(biāo)準(zhǔn),以滿足CGM在瀏覽器的瀏覽需求。但是隨著互聯(lián)網(wǎng)技術(shù)的進(jìn)步,現(xiàn)代瀏覽器和HTML5技術(shù)發(fā)展迅速,CGM僅能實(shí)現(xiàn)在傳統(tǒng)的支持Active X的IE瀏覽器中實(shí)現(xiàn)預(yù)覽訪問功能。如今,谷歌和微軟紛紛表示放棄對(duì)IE瀏覽器的支持,所以在現(xiàn)代瀏覽器高速發(fā)展的今天,現(xiàn)代瀏覽器并不能對(duì)CGM類型的圖片支持做到及時(shí)更新。
目前,在航空業(yè)的IETM系統(tǒng)中,預(yù)覽和訪問CGM類型圖片一直依賴于商業(yè)化插件集成系統(tǒng),如Larson公司的VizEx插件。CGM圖形的解析技術(shù)主要掌握在少數(shù)供應(yīng)商如PTC軟件和Larson軟件公司,PTC軟件公司的Arbortext IsoDraw產(chǎn)品和Larson公司提供的前端開發(fā)組件VizEx,提供了編輯、預(yù)覽和解析CGM圖形的功能。這些成品的商用軟件,這些商業(yè)軟件廣泛的應(yīng)用于波音、空客等飛機(jī)制造商或航空公司的各類技術(shù)出版物編輯與開發(fā)工作中,但商業(yè)軟件封閉性和可控性始終是難以解決的問題[3]。
CGM元文件整體結(jié)構(gòu)如圖1所示,所有基本元素都編碼為統(tǒng)一的編碼格式。其中,圖片組成部分由多個(gè)圖片元素組成,每個(gè)圖片元素相對(duì)于其他圖片元素都是相對(duì)獨(dú)立的。換言之,每個(gè)單獨(dú)的圖片元素在得到解釋時(shí),畫面就能夠?qū)崿F(xiàn)即時(shí)渲染和隨機(jī)存取了,這些圖片之前沒有任何的前趨、先后關(guān)系,因此各個(gè)圖片元素的改變不影響畫面整體的結(jié)構(gòu)和展示[4-7]。
圖1 CGM元文件結(jié)構(gòu)圖Fig.1 The structure of computer graphics metafile
其中向量元素的定義有以下十類:
(1)分隔符元素。在CGM元文件中用以界定元素范圍、維持文件的結(jié)構(gòu)性、如文件開始標(biāo)記、圖片開始標(biāo)記。
(2)元文件描述符元素。包含描述文件功能內(nèi)容、默認(rèn)條件、文件版本標(biāo)識(shí)和CGM特征。
(3)圖片描述符元素。包含解釋和描述圖片內(nèi)容的各種類型,如圖片包含的字體列表、圖片所包含的元素列表、字符集、圖片顏色模式、顏色校準(zhǔn)元素集、字體屬性、字形映射等各類描述圖片的基本元素。
(4)控制元素。包含控制類基本數(shù)據(jù)類型如SI(Signed Integer)、UI(Unsigned Integer)、C(Character)、FP(Fixed Point Real)、FP(Floating Point Real)五種類型,除了字符類型外,每種類型都可以使用多種精度定義。這些控制類的數(shù)據(jù)類型用以表達(dá)圖片中存在的數(shù)字變量和文本變量。
(5)原始圖像元素。CGM圖片的原始圖像元素由折線PolyLine、多點(diǎn)標(biāo)記PolyMarker、文本Text、限制性文本Restricted Text、擴(kuò)展文本Append Text、多邊形PolyGon、多邊形集合PolyGon Set組成,這些最基礎(chǔ)的圖像圖形共同構(gòu)成了CGM文件的圖形結(jié)構(gòu),是CGM圖片的實(shí)現(xiàn)基礎(chǔ)[8-9]。
(6)屬性元素。用以描述原始圖像元素的基本屬性,如線條寬度、字體大小、多邊形填充效果、填充顏色等。
(7)轉(zhuǎn)義元素。用以描述圖片和設(shè)備相關(guān)、系統(tǒng)相關(guān)的元素,如不同設(shè)備之間的字體編碼不同,需要用轉(zhuǎn)移元素進(jìn)行控制和描述。
(8)外部元素。用以描述與圖形圖像本身沒有直接關(guān)聯(lián)的其他信息。
(9)段元素。用以對(duì)圖片進(jìn)行操作的元素,如對(duì)圖片進(jìn)行復(fù)制、分組。
(10)應(yīng)用程序結(jié)構(gòu)元素。用以對(duì)圖片進(jìn)行響應(yīng)應(yīng)用的元素,如熱點(diǎn)鏈接、檢索和其他特定的應(yīng)用程序相關(guān)的操作。
CGM元文件的二進(jìn)制編碼是由8位二進(jìn)制的順序集合組成的邏輯數(shù)據(jù)結(jié)構(gòu),即CGM數(shù)據(jù)以8字節(jié)作為基本數(shù)據(jù)單位。根據(jù)源文件不同元素的數(shù)據(jù)長(zhǎng)度及二進(jìn)制數(shù)據(jù)對(duì)齊方式,在文件結(jié)構(gòu)中使用兩種不同大小的字段定義,這兩種不同大小的字段用于說明元素的類別、結(jié)構(gòu)和參數(shù)的內(nèi)容。在8字節(jié)基礎(chǔ)上,CGM使用兩個(gè)8字節(jié)作為一個(gè)“字”,用以在多平臺(tái)計(jì)算機(jī)上優(yōu)化二進(jìn)制元文件的處理。所以,CGM基本指令的二進(jìn)制表示如圖2所示,CGM圖片的所有基本元素遵照短格式指令模式或長(zhǎng)格式指令模式構(gòu)成[10]。
圖2 短指令格式和長(zhǎng)格式指令模式結(jié)構(gòu)圖Fig.2 The structure diagram of short and long instruction format mode
其中,元素類別是指在3-1章節(jié)中定義的元素類別,表1是相應(yīng)元素類別編碼所對(duì)應(yīng)的二進(jìn)制編碼表。對(duì)于每個(gè)類別都包含了一個(gè)類別的詳細(xì)定義,定義CGM元文件元素、元素ID、參數(shù)類型、參數(shù)列表長(zhǎng)度和參數(shù)規(guī)范。根據(jù)CGM的文件結(jié)構(gòu)和二進(jìn)制編碼結(jié)構(gòu)定義,我們使用Java語言實(shí)現(xiàn)了CGM解析工具。
表1 元素類別定義表Tab.1 Element category definition table
根據(jù)對(duì)CGM元文件結(jié)構(gòu)和CGM元文件二進(jìn)制編碼的研究,我們將CGM的實(shí)現(xiàn)分為結(jié)構(gòu)定義、元素解析、圖形渲染三個(gè)部分。
根據(jù)CGM的指令結(jié)構(gòu),定義指令基礎(chǔ)類,并實(shí)現(xiàn)CGM結(jié)構(gòu)讀取,Command基類實(shí)現(xiàn)了CGM基礎(chǔ)數(shù)據(jù)的讀取,其實(shí)現(xiàn)如下。
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); } } } 在實(shí)現(xiàn)了結(jié)構(gòu)定義和基本數(shù)據(jù)讀取的基礎(chǔ)上,根據(jù)CGM文件結(jié)構(gòu)的向量元素分類,進(jìn)行分類數(shù)據(jù)讀取。每個(gè)元素類別都定義了一個(gè)抽象類,用以描繪這個(gè)類別的共有特性和方法,每個(gè)類別都有若干個(gè)實(shí)現(xiàn)類,用以實(shí)現(xiàn)具體的向量元素,抽象類的讀取分類方法如下,由于目前基于交互性電子手冊(cè)系統(tǒng)應(yīng)用場(chǎng)景限制,在日常的CGM圖片中,通常不存在段元素和應(yīng)用程序元素,所以CGM中的段元素和應(yīng)用程序結(jié)構(gòu)元素尚未實(shí)現(xiàn),但是CGM圖片的整體和細(xì)節(jié)都不會(huì)受到影響[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是由多個(gè)元素向量組成的圖形,如果要做到圖形渲染,需要將向量映射到設(shè)備的虛擬空間坐標(biāo)中,形成絕對(duì)的二維坐標(biāo),CGM的VDC空間用以定義圖像元素的方向、尺寸、坐標(biāo)原點(diǎn)[4]。由于VDC空間的定義,可以將整個(gè)CGM的向量元素約定在一定的范圍之內(nèi),這個(gè)范圍就是VDC范圍,VDC范圍由屬性左下角、右上角、和坐標(biāo)夾角組成共同建立了VDC空間的意義和所屬坐標(biāo)象限,VDC圖形一般處于第一象限和第四象限,某些屬性如文本屬性、字符方向、所有圖形內(nèi)的枚舉值的方向都與這些變量有關(guān),根據(jù)VDC范圍的可以按照比例的將圖形渲染到相應(yīng)大小的Java圖形中,相關(guān)代碼如下。 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; } 經(jīng)過4-1、4-2、4-3的CGM文件解析步驟后,可以將CGM圖片使用Java Graphics2D展示到桌面端,點(diǎn)擊圖片內(nèi)容則可實(shí)現(xiàn)放大、縮小。在我國(guó)航空業(yè)內(nèi)實(shí)現(xiàn)的交互性電子手冊(cè)系統(tǒng)中廣泛使用了CGM作為插圖格式[12],為了使CGM圖片更好的在Web瀏覽器中展示,我們將已經(jīng)成功渲染的Java Graphics2D圖形轉(zhuǎn)化為SVG格式,SVG格式能夠保存CGM格式的熱點(diǎn)信息、向量信息并同樣可以實(shí)現(xiàn)放大縮小功能,其實(shí)現(xiàn)效果如圖3所示。 圖3 交互性電子手冊(cè)插圖實(shí)現(xiàn)Fig.3 The implementation of IETP's illustrations IETM系統(tǒng)作為飛機(jī)維修、運(yùn)營(yíng)流程中的重要組成部分,承擔(dān)著信息交流、數(shù)據(jù)共享等功能。CGM作為其中重要的數(shù)據(jù)載體之一,對(duì)IETM系統(tǒng)的作用也至關(guān)重要,本文從CGM的背景、目前應(yīng)用局限性出發(fā),經(jīng)過對(duì)CGM文件的結(jié)構(gòu)進(jìn)行分析描述,對(duì)CGM元文件二進(jìn)制編碼進(jìn)行解析和加載。最終實(shí)現(xiàn)了一種自主可控的CGM解析技術(shù),從而摒棄對(duì)商業(yè)軟件的依賴性。本文對(duì)CGM在民用航空業(yè)交互性電子手冊(cè)的應(yīng)用研究,將應(yīng)用于國(guó)內(nèi)航空業(yè)的技術(shù)出版物手冊(cè)系統(tǒng)。4.2 元素解析
4.3 圖形渲染
4.4 圖形應(yīng)用
5 結(jié)語