创建自定义 SmartArt 图形以用于 2007 Office 系统中
中国IT站 www.chinaitz.com 2009-3-3

  本文示例源代码或素材下载

  本文讨论:

  SmartArt 图形数据模型

  创建 XML 以自定义 SmartArt 图形

  算法、限制和规则

  测试和调试自定义 SmartArt 图形

  本文使用了以下技术:

  2007 Microsoft Office 系统

创建自定义 SmartArt 图形以用于 2007 Office 系统中目录

  设计图形布局

  布局节点和算法

  布局树和数据模型映射

  形状属性

  限制、规则和 Text 属性

  打包布局定义文件

  测试图形布局

  错误类型和错误日志

  带有设计错误的有效文件

  修改现有图形布局定义

  未来计划

  2007 Microsoft Office 系统提供了一种向 Office 文件(包括 Word 文档、Excel® 电子表格、PowerPoint® 演示文稿和 Outlook® 电子邮件消息)快速添加完善的图形和图表的全新方法。这种新功能称为 SmartArt™ 图形,它将模板和预定义形状合并成一个图库(库),您可快速地插入这些模板和预定义形状并进行配置。它具备自动调整大小和自动对齐的功能,同时允许您编辑对象和属性(请参见图 1 中的几个示例)。但是当您在操作这些图形时试验了所有的可能性后,很容易想象出希望图库中出现的其他图形。这不是问题 - SmartArt Graphics 是完全可扩展的,它允许您创建自己的布局。

  SmartArt 布局图库中的每个图形布局都具备自身的基础 XML 文件,该文件定义了 SmartArt 图形如何根据用户输入的数据集构造对象(在图 1 中,此数据集包括三个文本字符串:“Design”、“Create”和“Test”)。SmartArt 图形布局使用可提供各种布局选项的算法的特定集合,其中包括线性流程算法、循环算法,并可将两种算法配合使用,来创建层级图表。它还提供了一种复合算法,该算法可让您确定调整和放置各种形状的确切方式,这样您便可以灵活地创建各种类型的图形。在本文中,我将详述创建自己的 SmartArt 图形布局的基础知识。

创建自定义 SmartArt 图形以用于 2007 Office 系统中

  图 1a使用 SmartArt 图形创建的示例图表

创建自定义 SmartArt 图形以用于 2007 Office 系统中

  图 1b

创建自定义 SmartArt 图形以用于 2007 Office 系统中

  图 1c

创建自定义 SmartArt 图形以用于 2007 Office 系统中

  图 1d

  设计图形布局

  创建 SmartArt 图形布局的第一步是确定图形的外观。确定了外观后,您可以开始分析 SmartArt 图形,以找出创建方法。

  假设您要创建与图 2 中所显示图形类似的图形。需要完成若干步骤才能创建出该 SmartArt 图形,我将在本文中介绍每一步的详细信息。首先,确定创建图形时需要的形状 - 在本例中,您需要用于蓝色形状的圆角矩形、用于白色线条的矩形,以及用于文本区域的没有线条或填充的矩形。

创建自定义 SmartArt 图形以用于 2007 Office 系统中

  图 2目标图形布局

  然后,看一下形状的排列方式。在本例中,蓝色矩形位于水平线上,且从绘图区域的左侧开始;白色方块与蓝色方块组合在一起,创建了一个复合形状,每个复合形状之间都存在空白区域。形状的排列方式由其中一种 SmartArt 算法决定,这些算法包括线性流程、弯曲线性流程、循环、层级和复合(或者固定位置)布局。

  现在看一下如何在形状中显示文本。所有 SmartArt 图形会映射回可视为分级列表的基础数据模型。例如,图 2 中图形内显示的文本基于图 3 中所显示的列表。

创建自定义 SmartArt 图形以用于 2007 Office 系统中Figure3模型

设计
第一步
第二步
第三步
创建
第一步
第二步
第三步
测试
第一步
第二步
第三步

  在 SmartArt 图形中,每个形状可以支持多级文本,它们会映射回该结构。在图 2 的示例中,每个复合形状都包含两级文本。第一级有时被称为父文本或一级项。第二级有时被称为子文本或二级项。通常,子文本前会带有项目符号,以表示它从属于父文本。

  最后一步是在从特定数据集中进行提取时,确定它的显示方式。SmartArt 图形布局提供了许多可能的方案。

  静态图形布局,如果您始终希望显示相同数量的形状,则可创建一个静态图形布局。例如,我可以创建一个始终包含三个形状的布局。用户前三个一级项的文本将显示在图形中,但添加到后续一级项中的任何文本都不会显示。

  半动态图形布局,使用半动态图形布局,您可以仅显示与复合形状数量相同的一级项,其最大数量为指定的最大形状数。对于此示例,我可以创建一个包含从零到三个复合形状的图形。用户添加一级文本的后续行时,将添加新的形状。但是,如果他们添加三行以上的一级文本,则不会添加新的形状。

  动态图形布局,动态图形布局不限于特定数量的形状。拥有多少个复合形状,就可具有多少行一级文本。随着形状的逐渐增加,这些形状会根据需要变得越来越小,以适合绘图区域的大小。对于我们的示例图形,动态图形布局是最佳选择。

  布局节点和算法

  SmartArt 图形布局在 XML 文件中创建,这些文件说明创建什么样的形状、它们如何映射回数据模型,以及采用哪种算法对形状进行布局。(XML 文件是开放文档包的一部分,它与用于 Word 和 PowerPoint 的新文件格式相类似。)这些文件的其中之一,即 layout1.xml,提供了主要的布局定义。

  布局定义的基本组成部分是布局节点。布局中的每个节点都具有一个相关的算法,该算法指定如何为其子布局节点制定大小和位置,或者如何为其形状内的文本制定大小。最后,布局中的所有节点均互相嵌套,且位于一个布局节点之下(请参见图 4)。

创建自定义 SmartArt 图形以用于 2007 Office 系统中

  图 4图形布局定义

  布局定义中的布局节点构成了一个分级布局树。而事实上,用户数据模型中的每个父文本项在树中都应具有一个复合布局节点和一个空间布局节点。但是,由于此布局节点及其后代的定义都相同,因此布局定义文件仅需一次性指定这一组布局节点,而且它还具有控制创建此模式的图形布局节点次数的一些附加信息。图 5 显示了本示例的 XML 的基本结构。

创建自定义 SmartArt 图形以用于 2007 Office 系统中Figure5XML 结构定义示例布局树

<?xml version="1.0" encoding="utf-8"?>
<layoutDef xmlns=
    "http://schemas.openxmlformats.org/drawingml/2006/diagram">
  <layoutNode name="diagram">
    <alg type="lin" />
    <presOf />
    <forEach axis="ch" ptType="node">
      <layoutNode name="composite">
        <alg type="composite" />
        <presOf />
        <layoutNode name="roundRect">
          <alg type="sp" />
          <presOf axis="self" />
        </layoutNode>
        <layoutNode name="parentText">
          <alg type="tx" />
          <presOf axis="self" />
        </layoutNode>
        <layoutNode name="whiteRect">
          <alg type="sp" />
          <presOf />
        </layoutNode>
        <layoutNode name="childText">
          <alg type="tx" />
          <presOf axis="des" ptType="node" />
        </layoutNode>
      </layoutNode>
      <forEach axis="followSib" ptType="sibTrans" cnt="1">
        <layoutNode name="space">
          <alg type="sp" />
          <presOf axis="self" />
        </layoutNode>
      </forEach>
    </forEach>
  </layoutNode>
</layoutDef>

  请注意,在 XML 中,所有的布局节点均具有指定的名称。在本示例中,这些名称是可选的,但在定义的其他部分引用时可能是必需的。此外,这种命名方式可帮助您组织 XML 的结构并识别各个区域。

  布局树和数据模型映射

  您将会注意到除了布局节点和算法标记之外,XML 示例还包含 forEach 和 presOf 标记。这些标记指示了如何将布局节点映射到用户的数据模型。

  SmartArt 图形中的底层数据模式是节点和关系的集合。SmartArt 图形中有两种关系:父/子转换和兄弟转换。父/子转换构造了节点之间的分级关系。兄弟转换是相邻节点之间的关系,这些节点具有针对相同父项的父/子关系。图 6 说明了这些关系。

创建自定义 SmartArt 图形以用于 2007 Office 系统中Figure6SmartArt Graphics 中的关系

  示例项目符号列表

o 父项一
  o 子项一
  o 子项二
o 父项二
  o 子项一
相应的数据模型o 根元素
  o 父/子转换:根到“父项一”
  o 节点:“父项一”
    o 父/子转换:“父项一”
         到“子项一”
    o 节点:“子项一”
    o 兄弟转换:“子项一”
         到“子项二”
    o 父/子转换:“父项一”
         到“子项二”
    o 节点:“子项二”
    o 兄弟转换:“子项二”
         到“子项一”
  o 兄弟转换:“父项一”到“父项二”
  o 父/子转换:根到“父项二”
  o 节点:“父项二”
    o 父/子转换:“父项二”到“子项一”
    o 节点:“子项一”
  o 兄弟转换:“父项二”到“父项一”

  布局定义 XML 中的 forEach 元素在数据模型中移动以选择一组节点,而 presOf(表示)元素将布局节点映射到数据模型中的特定项。图 7 中对属性元素进行了概述。

创建自定义 SmartArt 图形以用于 2007 Office 系统中Figure7forEach 和 presOf 属性

属性描述
它确定如何在数据模型中定位,并在其移动时设置上下文节点。上下文节点始终以数据模型的根元素开始。通常,以下轴值用于 SmartArt 图形布局中:self(返回当前上下文节点)、child(返回当前上下文节点的直接子节点)、des(返回当前上下文节点的所有后代)、desOrSelf(返回当前上下文节点及其所有后代),以及 followingSib(返回数据模型中的下一项,无论它是节点还是转换)。
ptType它确定要选择的数据模式项的类型,且可筛选轴值所返回的项。ptType 可具有以下三个值的其中之一:node(文本项,在 SmartArt 图形文本区域内显示为项目符号点)、parChTrans(父子转换)或者 sibTrans(兄弟转换)。
st对于“start”,它表示首先选择返回组中的哪一项。此属性的默认值为 1,因此它经常被忽略。
cnt对于“count”,它表示返回组中要选择项目的数量。此属性的默认值为 0,也就是选择所有的项目。
hideLastTrans此标志确定是否将返回组中的最后一个兄弟转换筛选出组。此属性的默认值为 true,但某些情况下(例如循环图表)您可能需要将其设置为 false。

  示例图形布局 XML 中包含两个 forEach 元素,如下所示:

<forEach axis="ch" ptType="node">
<forEach axis="followSib" ptType="sibTrans" cnt="1">

  第一个元素选择了作为根元素直接子项的所有节点,主要选择项目符号列表中的每个一级文本项。然后它会为所选的每个数据模式项,创建嵌套在 forEach 元素中的布局节点。随着每一项的操作,上下文项将重置为所选组中的下一个节点。

  第二个 forEach 元素依据当前的上下文元素选择兄弟转换项。因为此 forEach 元素嵌套在上面的 forEach 元素中,所以它主要选择项目符号列表中每个项目之间的兄弟转换。

  在示例 XML 中,每个 layoutNode 都具有一个 presOf 语句。例如:

<presOf />
<presOf axis="self" />
<presOf axis="des" ptType="node" />

  空的 presOf 元素 (<presOf />) 表示 layoutNode 不映射到数据模型中的任何项。这些标记用于不带有文本的形状,以及不带有形状(算法将其用于对实际形状进行布局)的布局节点。

  axis="self" 的 presOf 用于将上下文项与生成的布局节点相关联。在示例 XML 中,此 presOf 将父文本放入父文本区域形状中。

  axis="des" 和 ptType="node" 的 presOf 用于将上下文项的所有后代与生成的布局节点相关联。对于本示例,此 presOf 将特定父项的所有子文本放入相同的文本区域形状中。

  形状属性

  现在已建立图形的结构并已将布局节点映射到数据模式,您可以添加关于要创建的形状的信息。SmartArt 图形布局可使用任何标准 Office 形状。

  并非所有的布局节点都必须显示形状;某些布局节点用于组织图形的结构,或于布局期间在生成的图形中提供额外的空间。在示例图形中,用于线性流程和复合算法,且用于复合形状之间空白的布局节点不显示形状。每个这些节点都将会指定一个空的形状元素,如图 8 中 XML 内所示。

创建自定义 SmartArt 图形以用于 2007 Office 系统中Figure8指定空的形状元素

<layoutNode name="diagram">
  <alg type="lin" />
  <presOf />
  <shape />
  <forEach axis="ch" ptType="node">
    ...
  </forEach>
</layoutNode>
<layoutNode name="composite">
  <alg type="composite" />
  <presOf />
  <shape />
  ...
</layoutNode>
<layoutNode name="space">
  <alg type="sp" />
  <presOf axis="self" />
  <shape />
</layoutNode>

  空的形状元素不是必需的且它通常是默认值(实际默认值由与布局节点关联的算法确定)。然而,显式包含空标记表示您未将形状分配给布局节点。

  现在我们可以开始添加实际图形的形状了。正如我所介绍的那样,每个复合形状都由两个可见矩形组成:圆角蓝色矩形和规则白色矩形。通过将形状 ID 指定为形状标记中的类型来对形状进行识别。对于圆角矩形,该值为 roundRect。

  圆角矩形是一种 Office 形状,这种 Office 形状具有可让您调整形状外观各个方面的手柄。对于此图形,我们不希望形状像默认形状一样圆。因此,我们使用 XML 设置调整点以及形状类型。

  最后,为了确保图形为矩形指定适当的外观(例如,当默认主题用于 PowerPoint 时,为蓝色),我们使用 XML 为布局节点指定样式标签。与数据模式节点关联的形状的默认样式标签为 node1。但是,该样式通常使用不同的彩色线条且不会与白色矩形对得很整齐。因此对于此示例,我选择使用样式标签 alignNode1:

<layoutNode name="roundRect" styleLbl="alignNode1" >
  <alg type="sp" />
  <presOf axis="self" />
  <shape type="roundRect">
    <adjLst>
      <adj idx="1" val="0.1" />
    </adjLst>
  </shape>
</layoutNode>

  现在,您可能会想,如果不从参考资料中查找值,您如何知道调整手柄时所使用的值,以及如何确定形状类型。这里有一个小窍门。新的 PowerPoint 文件格式类似于新的 Word 和 Excel 文件格式,它们都基于 XML。可以向空白幻灯片添加所需的形状,设置调整手柄,然后保存文件。通过查看生成的 XML(首先重命名生成的 PowerPoint 文件使其具有 .zip 扩展名,然后打开 ZIP 压缩包访问 XML 数据),您便可推断出相应的形状名并调整手柄的值。但是请注意,PowerPoint 形状和 SmartArt 图形布局使用不同的测量比例,因此您需要对值进行调整。例如,下面是示例图形中所使用圆角矩形的 PowerPoint 文件中的 XML:

<a:prstGeom prst="roundRect">
  <a:avLst>
    <a:gd name="adj" fmla="val 10000" />
  </a:avLst>
</a:prstGeom>

  白色矩形更为简单。对于此形状,所需的就是形状类型 - 此示例中为 rect。而对于样式标签,您需要确保在设置了 3D 属性后,该方块保持与圆角矩形形成对照,并且位于上层。样式标签 fgAcc1(前景重音 1)定义相应的外观:

<layoutNode name="whiteRect" styleLbl="fgAcc1" >
  <alg type="sp" />
  <presOf />
  <shape type="rect" />
</layoutNode>

  最后,我们的图形包含两个文本区域形状,它们也同样都是简单的矩形。如果您不希望用户看到这些形状,则可使用 hideGeom(隐藏几何)属性来隐藏线条和填充值的显示。且由于您希望文本看起来好像是蓝色矩形的一部分,因此对这些形状使用与您用于圆角矩形相同的样式标签。

<layoutNode name="parentText" styleLbl="alignNode1" >
  <alg type="tx" />
  <presOf axis="self" />
  <shape type="rect" hideGeom="true" />
</layoutNode>
<layoutNode name="childText" styleLbl="alignNode1" >
  <alg type="tx"/>
  <presOf axis="des" ptType="node" />
  <shape type="rect" hideGeom="true" />
</layoutNode>

  限制、规则和 Text 属性

  指派给布局节点的算法确定后续布局节点及其形状在画布上的组织方式。虽然算法支持默认形状尺寸和回退行为,但是您几乎总是希望通过布局定义来控制形状尺寸和文本字体行为的若干方面。

  限制可让您为每个形状、每个形状的字体大小和边距值,指定理想的(或起点)尺寸。规则可让您在需要更多空间用于额外形状或文本时,指定如何在一定范围内对这些限制值进行修改。

  例如,在线性流程的矩形中,所需的尺寸可能为 2 英寸宽 1 英寸高,且文本字体大小为 65 磅。但是,如果您向标准页面添加 10 个形状,每个形状都具有一段文本,则它们将不会适合页面。您可以对它们进行缩放,但这样做可能不会显示出您想要的外观。作为一个替代方案,您可以添加规则,该规则允许将形状高度更改到 5 英寸,并将字体大小缩小到 10 磅(但不能再小)。这些限制和规则将使用下面的 XML:

<constrLst>
  <constr type="w" val="50" />
  <constr type="h" val="25" />
  <constr type="primFontSz" val="65" />
</constrLst>
<ruleLst>
  <rule type="h" val="125" />
  <rule type="primFontSz" val="10" />
</ruleLst>

  创建规则和限制时,将以毫米为单位指定值,并以磅为单位指定字体大小。将按顺序应用规则,因此在上面所示的 XML 中,形状会先增大至 125 毫米,然后字体大小将会缩小。规则值不是绝对的,这意味着如果文本在 14 磅时比较合适,则将停止缩小字体大小。

  限制和规则也可被指定为引用值。例如,如果您希望矩形的高度以它们宽度的一半开始,然后增大至宽度的两倍,则 XML 将显示如下:

<constrLst>
  <constr type="w" val="50" />
  <constr type="h" refType="w" fact="0.5" />
  <constr type="primFontSz" val="65" />
</constrLst>
<ruleLst>
  <rule type="h" fact="2" />
  <rule type="primFontSz" val="10" />
</ruleLst>

  添加限制和规则后,布局定义文件 XML 便完成了。现在让我们看一下示例布局的限制和规则。

  首先应用图表布局节点限制,您需要确定放置各个限制和规则的位置。这些可通过父布局节点或布局节点自身指定。该位置取决于许多因素。

  方便 – 将所有布局节点的字体大小信息存储于同一位置,会使将来对其更改变得更为轻松。

  引用 - 当一个限制或规则引用另一个限制或规则时,通常需要将这两者定义于同一位置。

  算法 – 某些算法需要在特定位置存在限制。例如,如使用复合算法,则必须在复合布局节点的级别指定子布局节点的大小和位置。

  在示例布局中,复合布局节点的宽度和高度应与布局区域一样大。默认情况下,根布局节点始终继承画布的尺寸,因此列表中的第一个限制应将复合节点的宽度和高度设置为与根布局节点的宽度和高度相等。

  其次,应该根据图形缩放复合节点之间的空间,以便随着复合节点的不断加入,空间不会占满图形。要完成此操作,应将空间宽度设置为复合节点宽度的 10%。

  最后,将所有布局节点的字体大小设置为 65 磅,并包括一个等同值,以确保它们在图形中保持同样的大小。图 9 中的代码显示了带有新元素的完整 XML。

创建自定义 SmartArt 图形以用于 2007 Office 系统中Figure9带有限制的图表布局节点

<layoutNode name="diagram">
  <alg type="lin" />
  <presOf />
  <shape />
  <constrLst>
    <constr type="w" for="ch" forName="composite"
        refType="w" fact="1" />
    <constr type="h" for="ch" forName="composite"
        refType="h" fact="1" />
    <constr type="w" for="ch" forName="space"
        refType="w" refFor="ch" refForName="composite"
        fact=".1" />
    <constr op="equ" type="primFontSz" for="des"
        ptType="node" val="65" />
  </constrLst>
  <ruleLst />
  <forEach axis="ch" ptType="node">
    ...
  </forEach>
</layoutNode>

  复合布局节点限制,复合算法在 SmartArt 算法中是唯一的,因此它实际上并没有控制形状的大小和位置。而大小和位置的值会被指定为限制,且复合算法使用这些值对形状进行布局。因此,复合算法定位的任何布局节点,都需要在复合布局节点的限制块中定义其限制。

  指定形状的大小和位置时,需要确定沿着水平轴和竖直轴的值。这两个轴都在布局区域的左上角开始,开始处值为 0。这些限制值通常会表示为复合布局节点的宽度和高度的百分比。

  沿着水平轴,复合算法确定左侧、中间和右侧位置,以及整体宽度。同样,沿着竖直轴,复合算法确定顶部、中部和底部的位置,以及整体高度。必须指定沿着任一轴的两个值,然后其余的值便可通过计算得出。

  指定复合限制时需要考虑的另一个问题是,必须以与嵌套的布局节点相同的顺序来指定限制。尽管如有必要,您可指定堆叠顺序替代来获得正确的外观,但默认情况下,仍会按照布局节点的顺序确定形状的堆叠顺序。示例图形布局的限制会在图 10 中显示。

创建自定义 SmartArt 图形以用于 2007 Office 系统中Figure10复合布局节点限制

<layoutNode name="composite">
  <alg type="composite" />
  <presOf />
  <shape />
  <constrLst>
    <!--roundRect 的限制 -->
    <constr type="w" for="ch" forName="roundRect"
        refType="w" fact="1" />
    <constr type="h" for="ch" forName="roundRect"
        refType="h" fact="1" />
    <constr type="l" for="ch" forName="roundRect" val="0" />
    <constr type="t" for="ch" forName="roundRect" val="0" />
    <!--parentText 的限制 -->
    <constr type="w" for="ch" forName="parentText"
        refType="w" fact="1" />
    <constr type="h" for="ch" forName="parentText"
        refType="h" fact=".175" />
    <constr type="l" for="ch" forName="parentText" val="0" />
    <constr type="t" for="ch" forName="parentText" val="0" />
    <!--whiteRect 的限制 -->
    <constr type="w" for="ch" forName="whiteRect"
        refType="w" fact="1" />
    <constr type="h" for="ch" forName="whiteRect"
        refType="h" fact=".025" />
    <constr type="l" for="ch" forName="whiteRect" val="0" />
    <constr type="t" for="ch" forName="whiteRect"
        refType="h" fact=".175" />
    <!--childText 的限制 -->
    <constr type="w" for="ch" forName="childText"
        refType="w" fact="1" />
    <constr type="h" for="ch" forName="childText"
        refType="h" fact=".8" />
    <constr type="l" for="ch" forName="childText" val="0" />
    <constr type="t" for="ch" forName="childText"
        refType="h" fact=".2" />
  </constrLst>
  <ruleLst />
  <layoutNode name="roundRect" styleLbl="node1" >
    ...
  </layoutNode>
  <layoutNode name="parentText" styleLbl="node1" >
    ...
  </layoutNode>
  <layoutNode name="whiteRect" styleLbl="fgAcc1" >
    ...
  </layoutNode>
  <layoutNode name="childText" styleLbl="node1" >
    ...
  </layoutNode>
</layoutNode>

  roundRect 和 whiteRect 布局节点的限制,roundRect 和 whiteRect 形状不包含文本且不具有特定的调整大小的方式。它们的宽度、高度和位置都会在复合节点的限制块中指定,因此不需要任何其他的限制或规则。为了顾及完整性,此处会包含空限制和规则列表元素标记,但这些是可选的(请参见图 11)。

  parentText 和 childText 布局节点的限制,parentText 形状的高度、宽度和位置在复合节点的限制中指定,因此该布局节点仅有的附加限制和标准为相关文本属性。对于 SmartArt 形状中的多数文本,字体大小受主要字体大小 (primFontSz) 限制控制。在我们的示例中,此限制在根布局节点处指定,且起始值为 65 磅。

  对于大部分图形,65 磅显得过大。因此,您可添加一条标准,允许字体大小最小缩小到 5 磅:

<layoutNode name="parentText" styleLbl="node1" >
  <alg type="tx" />
  <presOf axis="self" />
  <shape type="rect" hideGeom="true" />
  <constrLst />
  <ruleLst>
    <rule type="primFontSz" val="5" />
  </ruleLst>
</layoutNode>

  如果字体大小为 5 磅时,文本仍不适合,则它将超出形状。

  childText 布局节点也具有与调整字体大小相关的限制和规则。此外,为了使文本正确对齐,需要文本参数(如算法元素中嵌套的元素),如图 12 中所示。

创建自定义 SmartArt 图形以用于 2007 Office 系统中Figure12算法元素中的文本参数

<layoutNode name="childText" styleLbl="node1" >
  <alg type="tx">
    <param type="stBulletLvl" val="1" />
    <param type="parTxLTRAlign" val="l" />
    <param type="parTxRTLAlign" val="r" />
    <param type="txAnchorVert" val="t" />
  </alg>
  <presOf axis="des" ptType="node" />
  <shape type="rect" hideGeom="true" />
  <constrLst>
    <constr type="secFontSz" refType="primFontSz" />
  </constrLst>
  <ruleLst>
    <rule type="primFontSz" val="5" />
  </ruleLst>
</layoutNode>

  在此布局节点中,图形显示文本的项目符号列表,而不是单个文本项。我们希望项目符号从此布局节点中显示的文本的第一级别开始,而默认方式是在形状内的第二级别开始项目符号。stBulletLvl(开始项目符号级别)参数控制此行为。对于此处的图形,此值应为 1 而不是 2(默认值)。请注意,1 和 2 是此参数仅支持的两个值。

  由于此文本是项目符号列表,因此它应该左对齐且顶端对齐。对于形状中第一级别的文本,默认设置是使文本在垂直和水平方向居中,因此使用参数 parTxLTRAlign(父文本 LTR 对齐)和 txAnchorVert(垂直定位文本)更改这些行为,将它们分别设置为 l(左侧)和 t(顶端)。

  当然,如果此图形用于从右向左显示文本的语言设置,则文本应该向右侧对齐。根据系统设置,有两个可确定要使用值的父文本对齐参数。因此,对于此图形,您还应该包括 parTxRTLAlign(父文本从右向左对齐)并将此值设置为 r(右侧)。

  所有形状还支持次要字体大小 (secFontSz)。这些值与形状中项目符号的开始位置相对应。如果一行具有项目符号,则它使用次要字体大小。如果不具有项目符号,则使用主要字体大小。默认情况下,次要字体大小是主要字体大小的 78%。

  每个形状还具有边距值,且默认情况下,这些值与主要字体大小成比例。如果形状中仅具有次要文本,则使边距采用次要字体大小将会更加合理。对于示例图形,没有必要使次要文本比主要文本小,因此您只需将这两个值设置为相等即可,这样还可确保边距选取适当的值。

  空间布局节点限制,空间算法用作占位符以指示不需要调整大小,或在其他布局节点之间保留最少量的空间。对于此布局节点,在复合形状之间应有水平空间;因此,您要为布局节点设置宽度限制。但是,由于此值是在图表布局节点上定义的,因此实际空间布局节点的限制和规则列表应与图 11 所示的布局节点的限制和规则列表相同,均为空。现在让我们研究一下打包布局文件。

创建自定义 SmartArt 图形以用于 2007 Office 系统中Figure11空限制和规则列表元素

<layoutNode name="roundRect" styleLbl="node1" >
  <alg type="sp" />
  <presOf axis="self" />
  <shape type="roundRect">
    <adjLst>
      <adj idx="1" val="0.1" />
    </adjLst>
  </shape>
  <constrLst />
  <ruleLst />
</layoutNode>
<layoutNode name="whiteRect" styleLbl="fgAcc1" >
  <alg type="sp" />
  <presOf />
  <shape type="rect" />
  <constrLst />
  <ruleLst />
</layoutNode>

  打包布局定义文件

  我所讨论过的 XML 是整体开放文档包的一部分。它实质上是扩展名为 .glox 且具有以下文件夹和文件结构的压缩 ZIP 文件:

  _rels

  .rels

  图表

  layout1.xml

  layout1header.xml

  [Content_Types].xml

  下面我将详细介绍所有这些文件和文件夹。

  rels 文件夹和文件,.rels 文件定义了 .glox 文件格式中各部分之间的关系。它是一个文本文件,且包含以下 XML:

<?xml version="1.0" encoding="utf-8"?>
<Relationships xmlns=
    "http://schemas.openxmlformats.org/package/2006/relationships">
  <Relationship
    Type="http://schemas.openxmlformats.org/officeDocument/2006/
       relationships/diagramLayoutHeader"
    Target="/diagrams/layoutHeader1.xml" Id="rId1" />
  <Relationship
    Type="http://schemas.openxmlformats.org/officeDocument/2006/
       relationships/diagramLayout"
    Target="/diagrams/layout1.xml" Id="rId2" />
</Relationships>

  图表文件夹和布局定义部分,图表文件夹包含构成 SmartArt 图形布局的两个 XML 布局定义文件。Layout1.xml 是主要定义文件,它包含本文中说明的 XML,且介绍了图形的布局和映射。

  Layout1header.xml 包含布局定义的标头信息,其中包括唯一 ID、标题和说明:

<?xml version="1.0" encoding="utf-8"?>
<layoutDefHdr uniqueId="msdn/sampleGraphicLayout"
   xmlns="http://schemas.openxmlformats.org/drawingml/2006/diagram">
  <title val="MSDN 图形布局示例" />
  <desc val=" " />
  <catLst>
    <cat type="list" pri="500" />
  </catLst>
</layoutDefHdr>

  每个图形布局都需要一个 uniqueID。如果另一个布局定义具有与其相同的 uniqueID,则不会加载文件。

  标题和说明显示在用户界面中。您可以使用此区域提供有关使用图形布局的时机和方法的特定信息。

  类别和优先级信息确定图形布局在 SmartArt 布局图库中显示的位置。SmartArt 图形支持以下类别类型:列表、进程、循环、关系、棱锥、矩阵以及其他。内置布局文件在每个类别中以优先级 1000 开始,且增量为 1000。您可以使用任何正整数作为优先级。

  [Content_Types].xml 文件,构成整个包的结构和命名空间区域的内容类型文件。它应位于根级别,并包含以下 XML:

<?xml version="1.0" encoding="utf-8"?>
<Types xmlns="http://schemas.openxmlformats.org/package/2006/
       content-types">
  <Default Extension="xml" ContentType="application/
    vnd.openxmlformats-officedocument.drawingml.
    diagramLayoutHeader+xml" />
  <Default Extension="rels" ContentType="application/
    vnd.openxmlformats-package.relationships+xml" />
  <Override PartName="/diagrams/layout1.xml"
    ContentType="application/vnd.openxmlformats-
      officedocument.drawingml.diagramLayout+xml" />
</Types>

  测试图形布局

  将您的布局定义打包为 .glox 文件后,必须将其置于正确的目录中,以使其包含在 SmartArt 布局图库内。默认情况下,SmartArt 图形布局文件存储在本地设置模板目录中,其位置为:%APPDATA%MicrosofttemplatesSmartArt Graphics。

  还可以建立一个注册表项,将模板目录更改为其他位置。但是请注意,注册表项适用于所有的 Office 模板,包括 Word 中 normal.dotx 文件的位置。此注册表项会作为 UserTemplates,以字符串形式存储在 HKEY_CURRENT_USERSoftwareMicrosoftOffice12.0CommonGeneral 下。作为值,会为常规模板文件夹指定一个新的路径,然后,SmartArt 图形功能便会在指定的路径中查找 SmartArt 图形文件夹。

  将图形布局文件放置在模板目录中后,启动一个支持 SmartArt 图形的应用程序,并单击 Insert SmartArt(插入 SmartArt)按钮。如果未立即发生错误,则您创建的图形布局会显示在图库中,且在您所指定的类别下。

  如果您一旦需要更正任何 XML 文件中的任何错误,则需要重新启动 Office 应用程序会话,以使修改过的 XML 文件重新加载到图库中。

  错误类型和错误日志

  SmartArt 图形提供了一个 XML 日志文件,该文件跟踪与布局定义文件相关的错误和警告。日志文件可帮助您确定图形布局中需要解决的问题。布局文件的错误通常可分为三类:不唯一的 uniqueID 值、XML 或架构错误,以及布局验证错误。

  当 uniqueID 实际上不唯一时,其中一个具有重复 uniqueID 的布局文件将无法加载,且会在打开 SmartArt 布局图库时显示一条错误消息。如果发生这种情况,会向日志文件添加与以下类似的条目:

<entry>
  <time>2006-10-20T15:51:14.650</time>
  <sev>err</sev>
  <host>POWERPNT.EXE</host>
  <file>example.glox</file>
  <type>nonUniqueId</type>
  <desc>具有此 uniqueId 的用户自定义的或内置的定义
     已经加载。</desc>
  <context>example</context>
</entry>

  XML 格式或架构验证错误还将阻止布局定义正确加载。如果错误发生在 layoutHeader1.xml 文件中,则不会加载文件的任何部分。但是,如果错误发生在 layout1.xml 文件中,则文件将会加载,但会在图库中显示一个红色的 X。如果您尝试从图库中选取此布局,则会显示一条错误消息。以下日志条目显示了一个典型的 XML 格式错误:

<entry>
  <time>2006-10-20T15:53:39.619</time>
  <sev>err</sev>
  <host>POWERPNT.EXE</host>
  <file>example.glox</file>
  <type>xmlError</type>
  <desc>未提供错误详细信息</desc>
  <context></context>
  <line>58</line>
  <col>35</col>
</entry>

  此错误最有价值的部分便是表示出错误发生处的行和列位置。

  布局验证错误与 XML 错误相似,但它们仅在 SmartArt 图形尝试运行布局时发生。以下日志条目显示了两个布局节点具有相同 name 属性时所发生的错误:

<entry>
  <time>2006-10-20T15:59:25.650</time>
  <sev>err</sev>
  <host>POWERPNT.EXE</host>
  <file>example.glox</file>
  <type>invalidName</type>
  <desc>name 属性必须唯一。</desc>
  <context>&lt;layoutNode name='sibTrans'/&gt;</context>
  <line>131</line>
  <col>17</col>
</entry>

  SmartArt 图形引用了三个注册表项(存储在 HKEY_CURRENT_USERSoftwareMicrosoftOffice12.0CommonSmartArt Graphics 下),用于控制日志文件:LogFileSeverityLevel、LogFileMaxSize 和 LogFileNumEntriesToRemove。

  LogFileSeverityLevel 是设置要报告的错误或警告的严重级别的 DWORD。0 仅报告错误,而级别 1 到 4 报告不同级别的警告,其中 1 是最高严重级别。LogFileMaxSize 是设置可在日志文件中存储的最大字节数的 DWORD。如果达到此值,则会从日志中删除一组条目以提供额外空间。LogFileNumEntriesToRemove 是指定在超出最大日志文件大小时将删除条目数量的 DWORD。

  带有设计错误的有效文件

  成功加载了图形布局文件后,您需要检查设计错误。一些常见的错误如:

  以错误的形状显示文本。

  根本不显示文本。

  在形状中,形状大小或字体大小不一致。

  形状的位置不正确。

  添加形状时,图形不按照您所预期的那样做出反应。

  更正这些问题确实是一件需要进行反复尝试的事情。随着您在创建定义文件时获得更多的经验,您会发现识别和更正错误变得更加容易了。

  测试您的图形布局时,应通过各种 SmartArt 图形样式和颜色并在不同主题中检查它的外观,以确保外观在大多数情况下都没有问题。但是请注意,并非每个图形在使用每种样式和颜色时其外观都不错。

  修改现有图形布局定义

  从头开始创建图形布局是了解 SmartArt 图形布局文件的结构和语法的好方法。但是,您可能只希望修改现有的图形布局以获得您想要的外观。

  您向文档添加 SmartArt 图形并保存时,图形布局文件的副本也会和文档的其他部分一起存储。如果您查看包的内部,并且导航至图表目录,您可找到与文档中每个 SmartArt 图形布局相对应的布局和布局标头 XML 文件。您可将此文件从包中删除,将其重命名为 layout1.xml,修改相应的部分,然后将此文件放置到新的 .glox 中。

  如果您正修改现有的文件,您可能会注意到一些本文中未讨论的其他标记和属性,或者会注意到缺少一些其他的标记和属性。通常,新属性是可选的,或是我已为其假设了默认值的属性。缺少的属性是那些使用默认值的属性。

  未来计划

  我已经介绍了 SmartArt 图形布局可扩展性的基础知识,但却几乎未涉及到创建 SmartArt 图形布局文件的复杂性。如果您希望进一步探究,我建议您从架构开始,仔细阅读现有的图形布局定义,以了解可以进行的操作。

责任编辑:admin本文仅代表作者观点,与中国IT站立场无关。
收藏】 【推荐】 【投稿】 【 】 【打印】 【关闭
评论加载中...