1 MS Visio软件的XML文档结构
Visio是一款功能强大、拥有大量客户群的办公室矢量绘图软件系统,以其独具特色的模 具、模板、拖曳式绘图方式及智能化绘图等技术而风靡全球。为了促进Visio文档信息与其他 应用系统的充分融合与共享,特别是适应于基于Internet的应用模式,微软公司于2004年宣 布以免费授权的方式提供Visio文档的Reference Schema for Visio——“DataDiagramML” 。
Visio XML文档以“VisioDocument”作为根标记,其子节点则主要以“表(Sheet)”、 “节(Section)”、“行(Row)”及“单元(Cell)”的层次结构描述文档的形状信息、 文本信息、数据信息、控制信息、结构信息及部分元信息。文档高层节点的子孙关系如图1所 示,“StyleSheets”、“Masters”和“Pages”是Visio XML文档的三个重要一级子节点标 记,分别定义了文档所基于的样式、主控形状和页面构成,而隶属于“Pages”层次结构中的 “Shape”节点则是文档的基本、核心和主要的组成要素,并可作为“Masters”层次结构下 相应主控形状的实例而被初始化,同时可继承“StyleSheets”中所定义线型、填充和文本等 样式属性。此外,“Shape”节点的“类型(Type)”属性设有“Group”和“Shape”选项, 这样便可利用前者对形状进一步分组,使得“Shape”节点自身又可组成复杂的树型结构,而 其中的底层节点又可继承高层节点的部分属性。此外,“Masters”层次下的“Shape”节点 除作为“Pages”层次下“Shape”对象的“基类”外,还是用户自定义的线型、线段端点和 填充形状的定义与描述区域。
与微软其他的Office软件相类似,Visio规定了其内部的变量类型、度量单位及运算函数,但 Visio利用公式的范围更加宽泛,特别是单元(Cell)级节点中属性的定义几乎全部规定为公 式。而这种公式的应用又具备其鲜明的特点:其一,尽管随着用户利用Visio软件所进行的文 档编辑操作其取值可能随时变化,但每个公式在任何时点的相应取值均被计算出来并在XML文 档中被静态地记录,这样就使得第三方的程序不必涉及过多的函数及公式的解析与运算;其 二是对于长度单位来说,无论用户指定何种度量单位,Visio均将其转化为内部的单位(英寸 )并记录在XML文档之中,这样亦使得第三方程序不必涉及过多的单位换算。
2 Shape对象的构造2.1 Shape的坐标体系及变换
Visio以ShapeSheet表格对Shape对象的几 何结构及文本属性进行描述,其中含有两个重要的节,即“Shape Transform. Section”和“Text Transform. Section”,在Visio的XML文档中,这两个 节的标记分别为“XForm”和“TextXForm”,其中分别描述了Shape对 象的几何形状和文本的位置与范围。以“XForm”节点为例,通过其子节点 “PinX”、“PinY”、“Width”、“Height” 、“LocPinX”、“LocPinY”、“Angle”、 “FlipX”、“FlipY”的节点值即可完全确定形状的几何位置、大小 、旋转角度及水平或垂直翻转状态,其原理如图2所示。
利用Java AWT中的AffineTransform类可以容易地实现这种变换。假设Shape所基于的“ 上下文坐标变换”——对Visio文档显示进行缩放、平移及翻转等变换或其 所属组对象的变换——为Tx,则为正确显示Shape所进行的坐标变换应该为:
Tx.clone().translate(PinX, PinY). rotate(Angle). Translate(-LocPinX,- LocPinY).scale(-FlipX,-FlipY)