ucs
本文回答: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。
二、读
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 + 刷新的标准模板)
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
function resetToWCS() {
setUCS([0, 0], 0);
}
或用命令:
Engine.editor.executerWithOp('UCS'); // 交互
// 在命令里输入 W 重置为 WCS
MCP 参考:vjcad/example/view/10ucs.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。
六、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),UCS 旋转用UCSXANG。
参考(官方文档 MCP)
- 文档:
vjcad/doc/view/index.md、vjcad/doc/core/coordinate.md(如有) - 示例:
vjcad/example/view/10ucs.js、vjcad/example/view/08coordinate.js