唯杰地图 logo唯杰地图
VJMAP
EN

编辑与变换

vjcad/references/autodraw/editing-transforms.md 4.6 KB189 行
原文

实体的移动、复制、旋转、缩放、镜像、删除等操作。


移动

const { Engine } = vjcad;

// move(from, to) —— 支持 [x,y] 数组
entity.move([0, 0], [50, 30]);
Engine.regen();

复制

const { Engine } = vjcad;

const copy = entity.clone();        // 深拷贝
copy.move([0, 0], [100, 0]);        // 移动副本
copy.color = 2;                     // 修改副本属性
Engine.addEntities(copy);

旋转

const { Point2D, Engine } = vjcad;

// rotate(基点, 角度) —— 角度为弧度;基础实体的基点可传 Point2D 或 [x,y](标注 / MLeader 只收 Point2D)
entity.rotate(new Point2D(50, 50), Math.PI / 4);  // 旋转 45°
Engine.regen();

缩放

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();

镜像

const { Point2D, Engine } = vjcad;

// mirror(p1, p2) —— 沿 p1-p2 直线镜像
entity.mirror(new Point2D(100, 0), new Point2D(100, 100));  // 沿 x=100 垂直线镜像
Engine.regen();

删除

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() 即可

修改已有实体属性(支持撤销)

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();
}

批量变换(支持撤销)

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)

绘图顺序

const { Engine } = vjcad;

await Engine.editor.executerWithOp('ENTDRAWFRONT');  // 选中图形置于最前
await Engine.editor.executerWithOp('ENTDRAWBACK');   // 选中图形置于最后

高亮(临时视觉效果)

const { Engine } = vjcad;

Engine.highLightEntities([entity1, entity2]);  // 高亮
Engine.clearHighLight();                       // 清除高亮

视图操作

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();

主题与背景色

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();    // 检查当前主题