> **本文回答**：缩放走 `Engine.zoomExtents() / zoomToEntities([...]) / zoomToFit([...])`；`zoomExtents` 接受 `options.wcsBounds`（`number[]`）限制范围；`Engine.ZOOMFACTOR` 只是**鼠标滚轮步进百分比**（默认 75），不是当前缩放倍数。**没有 `zoomToBounds`**；`setZoom` 在 `Engine.currentSpace`（BlockDefinition）上而不在 `Engine` 上。

## 一、最小用法

```js
// 全图
Engine.zoomExtents();

// 指定实体（单个或数组都行）
Engine.zoomToEntities([circle1, line1]);
Engine.zoomToFit([circle1, line1]);        // 同类：实体 + padding + autoSetRenderOrigin

// 视图中心（shouldRedraw 默认 true，可传 padding）
Engine.setCenter(new Point2D(500, 500));

// ZOOMFACTOR 是滚轮步进百分比（默认 75），赋值不改变当前视图
Engine.ZOOMFACTOR = 80;                    // 每格滚轮缩放比 = 80/100（越接近 100 每格越慢）
const z = Engine.ZOOMFACTOR;

// 直接改当前缩放：currentSpace.zoom 是普通可写字段，推荐 setZoom（会派发 ViewZoomed）
Engine.currentSpace.setZoom(Engine.currentSpace.zoom * 2);
Engine.redraw();
```

MCP 参考：`vjcad/example/view/01zoomextents.js`、`02zoomtoentities.js`、`05setcenter.js`、`09zoomfactor.js`、`vjcad/doc/view/index.md`。

## 二、`zoomExtents` 的高级参数

```ts
Engine.zoomExtents(entities?: EntityBase[], options?: {
    dcsCorner1?: Point2D; dcsCorner2?: Point2D;
    wcsBounds?: number[];                  // [minX, minY, maxX, maxY]
    autoSetRenderOrigin?: boolean;
    padding?: { top?; bottom?; left?; right? };
}): boolean
```

```js
// 缩放到指定 WCS 范围 [minX, minY, maxX, maxY] —— 想"缩放到一个矩形"就传这个
// （Engine 无 zoomToBounds；空间级缩放可用 Engine.currentSpace.setZoom(v)）
Engine.zoomExtents(undefined, {
  wcsBounds: [-120, -120, -30, -30]
});

// 或者先算实体包围盒再喂给 wcsBounds
const box = Engine.getBoundsByEntities(ents);
Engine.zoomExtents(undefined, { wcsBounds: [box.minPoint.x, box.minPoint.y, box.maxPoint.x, box.maxPoint.y] });
```

MCP 参考：`vjcad/example/view/01zoomextents.js`。

## 三、缩放因子与 `currentSpace.zoom`

`vjcad/example/view/09zoomfactor.js` 显示：

- `Engine.ZOOMFACTOR`（get/set 属性）是**滚轮步进百分比**（默认 75）：setter 只做 `pcanvas.zoomRatio = ZOOMFACTOR / 100`，仅鼠标滚轮使用，赋值**不改变当前视图**。每格滚轮按 `zoomRatio` 缩放，值越小每格幅度越大，=100 时滚轮不再缩放；`ZOOMFACTOR` 命令只接受 ≥ 60 的值（setter 本身不校验）
- `Engine.currentSpace.zoom` 是当前空间（BlockDefinition）的缩放比例，**普通可写字段**；建议用 `Engine.currentSpace.setZoom(v)`（会派发 `ViewZoomed`）
- 缩放变化后通常需要 `Engine.redraw()` / `Engine.pcanvas.redraw()`

> 官方 `09zoomfactor.js` 把 `ZOOMFACTOR = 50` 标成"缩放更慢"、`= 100` 标成"缩放更快"，与源码相反（50 每格 ×2，100 每格不缩放）。

## 四、命令版

```js
Engine.editor.executerWithOp('ZOOMEXTENTS');
Engine.editor.executerWithOp('ZOOM');           // ZOOM（别名 Z）：只有 E（对象范围，默认）/ W（窗口）两个关键字，或直接点两点框选范围；无 A 等选项
```

详见 `vjcad/doc/view/view-commands.md`。

## 反例

- 调 `Engine.zoomToEntities([])` 传空数组：实际行为不可预期，先判空。
- 把 `Engine.ZOOMFACTOR` 当缩放倍数（如 `= 2` 想放大 2 倍）：它只是滚轮步进百分比，当前视图不变，之后滚轮每格会缩放 50 倍；`≥ 100` 时滚轮不缩放或方向反转。合理范围同 `ZOOMFACTOR` 命令：60–99。
- 一次性循环 `zoomToEntities([single])` N 次：等价多次画面跳变；通常应该一次性 `mergeBoundingBoxes` 出总包围盒后喂 `zoomExtents(_, {wcsBounds})`。

## 参考（官方文档 MCP）

- 文档：`vjcad/doc/view/index.md`、`vjcad/doc/view/view-commands.md`
- 示例：`vjcad/example/view/01zoomextents.js`、`02zoomtoentities.js`、`05setcenter.js`、`09zoomfactor.js`
