唯杰地图 logo唯杰地图
VJMAP
EN

zoom

vjcad/references/view/zoom.md 4.1 KB81 行
原文

本文回答:缩放走 Engine.zoomExtents() / zoomToEntities([...]) / zoomToFit([...]);zoomExtents 接受 options.wcsBounds(number[])限制范围;Engine.ZOOMFACTOR 只是鼠标滚轮步进百分比(默认 75),不是当前缩放倍数。没有 zoomToBounds;setZoom 在 Engine.currentSpace(BlockDefinition)上而不在 Engine 上。

一、最小用法

// 全图
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 的高级参数

Engine.zoomExtents(entities?: EntityBase[], options?: {
    dcsCorner1?: Point2D; dcsCorner2?: Point2D;
    wcsBounds?: number[];                  // [minX, minY, maxX, maxY]
    autoSetRenderOrigin?: boolean;
    padding?: { top?; bottom?; left?; right? };
}): boolean
// 缩放到指定 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 每格不缩放)。

四、命令版

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