Skip to content

viewer.explodeEdit — ExplodeEditManager

设计意图

viewer.explodeEdit编辑态爆炸——和浏览态的 viewer.explode 是两件不同的事,值得先分清:

viewer.explode 浏览态viewer.explodeEdit 编辑态
写到哪独立的乘法预览通道变换 D 通道(与 viewer.transform 同一条)
进撤销吗不进进,一次拖拽 = 一条撤销步
能存盘吗不能(纯视图态,reset() 即消失)能,随变换覆盖一起持久化
能叠加吗不能,set(scale) 是绝对量能,改设定后从当前位置继续叠加
典型用途滑块「看一眼内部」制作一张拆装图并保存下来

换句话说:浏览态爆炸是预览,编辑态爆炸是摆位——它把算出来的散开位移固化成零件的编辑位置,和手动拖 gizmo 挪零件是同一性质的改动。

散开量由四个设定决定:scope 炸什么(全部 / 仅选中)、dir 往哪散(X / Y / Z 轴向或 radial 径向)、levels 展开多深(一级 / 二级 / 全部)、center 径向中心取装配还是选中集;轴向另有 polarity 决定是向两侧对称散(both)还是全员朝一个方向(pos / neg,拆装图常用)。

交互形状是三段式的 beginpreviewcommit,对应滑块的按下、拖动、松手:拖动期间连续预览且不入栈,松手才把这次净变化压成一条撤销步。

何时用它:制作拆装图 / 装配说明的分步摆位。只想临时看内部,用 viewer.explode

典型用法

滑块驱动的完整会话:

ts
viewer.explodeEdit.setOptions({
  scope: "all", // "all" | "sel"
  dir: "Z", // "X" | "Y" | "Z" | "radial"
  levels: "l1", // "l1" | "l2" | "all"
  center: "asm", // "asm" | "sel"(仅 radial 有意义)
  polarity: "pos", // "both"(默认) | "pos" | "neg"
});

slider.onpointerdown = () => viewer.explodeEdit.begin(); // 解析会话 + 快照基线
slider.oninput = () => viewer.explodeEdit.preview(Number(slider.value)); // 0..1,不入栈
slider.onpointerup = () => viewer.explodeEdit.commit(); // 压一条撤销步

getAffectedCount() gate 滑块(当前设定下没有可炸目标时禁用):

ts
slider.disabled = viewer.explodeEdit.getAffectedCount() === 0;

复原当前范围内的零件到装配态(同样是一条撤销步):

ts
resetBtn.onclick = () => viewer.explodeEdit.reset();

注意事项

  • 改设定会重置叠加基准:setOptions()getAmount() 归 0,但已经散开的位移留在 D——新设定从当前位置继续叠加。想回到装配态先 reset()
  • preview 必须夹在 begin / commit 之间:begin 负责解析范围与快照基线,跳过它直接 preview 不会有正确的增量基准。
  • 一次拖拽 = 一条撤销步:commit()begin 到此刻的净变化压成一步;拖动过程中的中间态不入栈。
  • 位移写进变换 D 通道:所以它与手动 transform 编辑相互可见——transform.resetAll() 会一并清掉编辑态爆炸的位移,transform.getOverrides() 导出的数据里也包含它。
  • 与浏览态爆炸可以叠加显示:两条通道正交,viewer.explode.set(0.5) 会在编辑态摆位的基础上再预览散开。
  • scope: "sel" 取当前选中集,由 viewer.selection 提供;选中集变了要重新 begin() 才生效。

完整签名与延伸