# 动画 XML 辅助

`fsys.openXml.pptx.animation` 是生成器与编辑器共用的整形状/逐段落时间轴与切换构建，不加载 Office、MSXML、ZIP 读取器或 .NET。

- timing(effects,shapes) 返回 p:timing XML，空 effects 为空字符串；失败 null,err。
- shapes 描述 id,name,hasText；target 为 id 或唯一名称。逐段落还需 `paragraphCount`，可选 `paragraphIndices`（递增、不重复、从1开始的非空段序号）；builder/editor 自动生成。
- transition(options) 返回 Office 2010 Choice + 标准 Fallback 切换 XML；null 返回空串。

参数、触发器语义和已支持效果见 [生成器动画](../builder/index.html)。不要将 COM MsoAnimEffect 数值作为本 API 名称或直接当 XML presetID。

```aardio
import fsys.openXml.pptx.animation;
var xml,err=fsys.openXml.pptx.animation.timing(
    [{target="T";effect="fade";trigger="click";duration=0.5}],
    [{id=2;name="T";hasText=true}]
);
if(xml===null) return null,err;
return xml;
```

## 0.9.0：逐段落与 Morph

- `byParagraph=true`：首次用 `trigger/delay`，后续用 `paragraphTrigger`（click/with/after，默认 click）与 `paragraphDelay`（默认0秒）。每段独立，不按缩进层级合组；builder/editor 略过空段，软换行不拆段。
- `paragraph=N`：仅指定第 N 段，序号从1开始；与 byParagraph 互斥。仅支持 entrance/exit 的 appear/fade/fly/wipe/zoom；不支持 spin/grow 的逐段落模式。
- 展开后每页最多10000个效果，所有行为节点均绑定同一个目标段；同次逐段落效果共享 build 分组，不与后续强调/退场串组。
- `transition({effect="morph";option="byObject";duration=1.4})`：option 为 byObject/byWord/byChar。p159 优先，p14 淡出保留精确时长，标准 Fallback 为 fade；所有分支保留 advanceAfter=0 / advanceOnClick=false。
- Morph 跨页匹配可用相同且唯一的 `!!` 前缀形状名，例如 `!!Focus`；不保证任意版本或任意对象都能平滑插值。

```aardio
import fsys.openXml.pptx.animation;
var xml,err=fsys.openXml.pptx.animation.timing(
    [{target="Body";effect="fade";byParagraph=true;paragraphTrigger="after";duration=0.5;paragraphDelay=0.2}],
    [{id=2;name="Body";hasText=true;paragraphCount=3}]
);
if(xml===null) return null,err;
return xml;
```

不合并已有时间轴、不渲染动画。输出为可编辑 OOXML，不是视频帧。本机 PowerPoint 16 已验证逐段点击和 Morph 中间帧；WPS/旧 Office 的实际回退尚未验收。
