# 编辑与变换

实体的移动、复制、旋转、缩放、镜像、删除等操作。

---

## 移动

```javascript
const { Engine } = vjcad;

// move(from, to) —— 支持 [x,y] 数组
entity.move([0, 0], [50, 30]);
Engine.regen();
```

---

## 复制

```javascript
const { Engine } = vjcad;

const copy = entity.clone();        // 深拷贝
copy.move([0, 0], [100, 0]);        // 移动副本
copy.color = 2;                     // 修改副本属性
Engine.addEntities(copy);
```

---

## 旋转

```javascript
const { Point2D, Engine } = vjcad;

// rotate(基点, 角度) —— 角度为弧度；基础实体的基点可传 Point2D 或 [x,y]（标注 / MLeader 只收 Point2D）
entity.rotate(new Point2D(50, 50), Math.PI / 4);  // 旋转 45°
Engine.regen();
```

---

## 缩放

```javascript
const { Point2D, Engine } = vjcad;

// scale(基点, 缩放因子)
entity.scale(new Point2D(0, 0), 2.0);  // 放大 2 倍
entity.scale(new Point2D(0, 0), 0.5);  // 缩小到 0.5 倍
Engine.regen();
```

---

## 镜像

```javascript
const { Point2D, Engine } = vjcad;

// mirror(p1, p2) —— 沿 p1-p2 直线镜像
entity.mirror(new Point2D(100, 0), new Point2D(100, 100));  // 沿 x=100 垂直线镜像
Engine.regen();
```

---

## 删除

```javascript
const { Engine } = vjcad;

Engine.eraseEntities(entity);              // 删除单个
Engine.eraseEntities([ent1, ent2, ent3]);   // 批量删除

// 删除后 entity.isAlive 变为 false
```

---

## 重要注意事项

- 基础实体（Line/Circle/Arc/Pline/Text/MText/Hatch/Insert…）的 `move()`、`rotate()`、`scale()`、`mirror()` 点参数是 `PointInput`——`Point2D` 或 `[x,y]` 数组均可；**标注族（`*DimensionEnt`）与 `MLeaderEnt` 的这四个方法只收 `Point2D`**（内部直接读 `.x/.y`，传数组得到 NaN 坐标）；标注构造、`initBy3Pt` 等同样只收 `Point2D`
- 变换后**必须**调用 `Engine.regen()` 才能看到变化
- 添加新实体后用 `Engine.zoomExtents()` 即可

---

## 修改已有实体属性（支持撤销）

```javascript
const { Engine } = vjcad;

const undoMgr = Engine.undoManager;
undoMgr.start_undoMark();
try {
    Engine.markModified(entity);   // 先标记（记录修改前状态）
    entity.color = 1;              // 再修改属性
    entity.layer = "新图层";
    entity.setModified();          // 通知修改完成
} finally {
    undoMgr.end_undoMark();
}
```

---

## 批量变换（支持撤销）

```javascript
const { Point2D, Engine } = vjcad;

const undoMgr = Engine.undoManager;
undoMgr.start_undoMark();
try {
    const from = new Point2D(0, 0);
    const to = new Point2D(50, 0);

    entities.forEach(ent => ent.move(from, to));
    undoMgr.moved_undoMark(entities, from, to);

    Engine.regen();
} finally {
    undoMgr.end_undoMark();
}
```

其他撤销标记方法：
- `undoMgr.rotate_undoMark(entities, basePoint, angle)`
- `undoMgr.scaled_undoMark(entities, basePoint, scale)`
- `undoMgr.mirrored_undoMark(entities, p1, p2)`

---

## 绘图顺序

```javascript
const { Engine } = vjcad;

await Engine.editor.executerWithOp('ENTDRAWFRONT');  // 选中图形置于最前
await Engine.editor.executerWithOp('ENTDRAWBACK');   // 选中图形置于最后
```

---

## 高亮（临时视觉效果）

```javascript
const { Engine } = vjcad;

Engine.highLightEntities([entity1, entity2]);  // 高亮
Engine.clearHighLight();                       // 清除高亮
```

---

## 视图操作

```javascript
const { Engine, Point2D } = vjcad;

Engine.zoomExtents();                    // 缩放到全图
Engine.zoomToEntities(entities);         // 缩放到指定实体
Engine.regen();                          // 局部刷新（只刷新修改过的实体）
Engine.regen(true);                      // 完全重绘（较慢）
Engine.setCenter(new Point2D(100, 100)); // 设置视图中心

// 预览（临时显示）
Engine.drawPreviewEntity(entity);
Engine.drawPreviewEntities([ent1, ent2]);
Engine.clearPreview();
```

---

## 主题与背景色

```javascript
const { Engine } = vjcad;

Engine.THEME_MODE = 0;   // 深色画布主题：setter 内部已自动 setBgc(0)（→ #212830）并重绘
Engine.THEME_MODE = 1;   // 浅色画布主题：自动 setBgc(255)（→ #FFFFFF）
// 只想换底色才单独调 Engine.setBgc(灰度)（0→#212830、255→#FFFFFF、其余→对应灰度），它自带重绘；
// 不要在 THEME_MODE 之后再 setBgc(33)——会覆盖主题默认底色

Engine.isDarkTheme();    // 检查当前主题
```
