> **本文回答**：UCS（用户坐标系）= "在 WCS 之上叠一个偏移 + 旋转"。设置走 `Engine.currentSpace.UCSORG = new Point2D(x, y)` + `Engine.currentSpace.UCSXANG = angleInRadians`，并 `Engine.undoManager.ucs_undoMark(oldOrg, oldAng)` + `Engine.pcanvas.updateUcsIsWcs()` + `Engine.view.coordsBar.updateCoordsTitle()` + `Engine.pcanvas.redraw()`。命令 `UCS` 走交互式输入 / `UCS W` 重置回 WCS。

## 一、基本概念

| 坐标系 | 含义 |
|---|---|
| WCS（世界） | 固定不变 |
| UCS（用户） | 可移动 / 旋转 |
| `UCSORG` | UCS 原点（Point2D） |
| `UCSXANG` | UCS X 轴相对 WCS 的角度（弧度） |

MCP 参考：`vjcad/example/view/10ucs.js`、`vjcad/doc/view/index.md`。

## 二、读

```js
const org = Engine.currentSpace.UCSORG;     // Point2D
const ang = Engine.currentSpace.UCSXANG;    // 弧度

console.log('UCS原点:', org.x, org.y);
console.log('UCS角度°:', ang * 180 / Math.PI);
```

## 三、写（**带 undo + 刷新的标准模板**）

```js
function setUCS(origin, angleInDegrees) {
  const angRad = angleInDegrees * Math.PI / 180;

  const oldOrg = Engine.currentSpace.UCSORG;
  const oldAng = Engine.currentSpace.UCSXANG;

  Engine.currentSpace.UCSORG  = new Point2D(origin[0], origin[1]);
  Engine.currentSpace.UCSXANG = angRad;

  Engine.undoManager.ucs_undoMark(oldOrg, oldAng);
  Engine.pcanvas.updateUcsIsWcs();

  if (Engine.view.coordsBar) {
    Engine.view.coordsBar.updateCoordsTitle();
  }

  Engine.pcanvas.redraw();
}

setUCS([50, 50], 30);          // 移到 (50, 50)，旋转 30°
```

MCP 参考：`vjcad/example/view/10ucs.js`。

## 四、重置回 WCS

```js
function resetToWCS() {
  setUCS([0, 0], 0);
}
```

或用命令：

```js
Engine.editor.executerWithOp('UCS');     // 交互
// 在命令里输入 W 重置为 WCS
```

MCP 参考：`vjcad/example/view/10ucs.js`。

## 五、与坐标系转换

```js
// 在新 UCS 下，[0, 0] 实际对应 WCS [50, 50]
const wcs = Engine.ucsToWcs(new Point2D(0, 0));   // ≈ Point2D(50, 50) (rotation 后)

// 鼠标点 → UCS
const wcsPt = Engine.canvasToWcs(new Point2D(e.offsetX, e.offsetY));   // 参数是 Point2D 对象
const ucsPt = Engine.wcsToUcs(wcsPt);
```

详见 [core/coordinate](../core/coordinate.md)。

## 六、UCS 命令的输入

```
UCS
指定基准点（新 UCS 原点）
指定第二点（确定 X 轴方向）
（输入 W 重置为 WCS）
```

MCP 参考：`vjcad/example/view/10ucs.js`。

## 反例

- 直接修改 `UCSORG` / `UCSXANG` 不调用 `updateUcsIsWcs`：缓存的 `ucsIsWCS` 过时，只影响 UCS 图标样式与坐标栏 "WCS"/"UCS" 标题，实体渲染与坐标数值不受影响。
- 没 `ucs_undoMark`：`Ctrl+Z` 不会回滚 UCS。
- 把"视图旋转"和"UCS 旋转"混淆：视图旋转用 `twistAngle`（[plan-view](plan-view.md)），UCS 旋转用 `UCSXANG`。

## 参考（官方文档 MCP）

- 文档：`vjcad/doc/view/index.md`、`vjcad/doc/core/coordinate.md`（如有）
- 示例：`vjcad/example/view/10ucs.js`、`vjcad/example/view/08coordinate.js`
