唯杰地图 logo唯杰地图
VJMAP
EN

base-point

vjcad/references/input/base-point.md 3.1 KB89 行
原文

本文回答:PointInputOptions.useBasePoint = true + basePoint = startPoint 即可显示默认橡皮筋线;如果想自定义预览(颜色 / 端点圆 / 标尺等),加 hideRubberBand = true 关掉默认线,再用 callback(canvasPt) 在每次鼠标移动时 Engine.clearPreview() + Engine.drawPreviewEntities([...])。

一、默认橡皮筋线

const opt = new PointInputOptions('指定终点:');
opt.useBasePoint = true;     // 启用橡皮筋
opt.basePoint    = startPoint;
const r = await getPoint(opt);

MCP 参考:vjcad/example/input/02getpointwithbase.js、vjcad/doc/guide/quick-start.md("获取点"小节)。

二、自定义回调预览(隐藏默认橡皮筋)

const opt = new PointInputOptions('指定终点:');
opt.useBasePoint   = true;
opt.basePoint      = startPoint;
opt.hideRubberBand = true;   // 隐藏默认

opt.callback = (canvasPt) => {
  const wp = Engine.canvasToWcs(canvasPt);

  const previewLine = new LineEnt(
    [startPoint.x, startPoint.y],
    [wp.x, wp.y]
  );
  previewLine.setDefaults();
  previewLine.color = 1;       // 红色

  const endMark = new CircleEnt([wp.x, wp.y], 3);
  endMark.setDefaults();
  endMark.color = 3;           // 绿色

  Engine.clearPreview();
  Engine.drawPreviewEntities([previewLine, endMark]);
};

const r = await getPoint(opt);
Engine.clearPreview();

MCP 参考:vjcad/example/input/02getpointwithbase.js。

三、连续画线(每段都带基点)

const points = [];

const opt1 = new PointInputOptions('指定第一点:');
const r1 = await getPoint(opt1);
if (r1.status !== InputStatusEnum.OK) return;
points.push(r1.value);

while (true) {
  const lastPt = points[points.length - 1];
  const opt = new PointInputOptions('指定下一点 (ESC 结束):');
  opt.useBasePoint = true;
  opt.basePoint    = lastPt;

  const r = await getPoint(opt);
  if (r.status !== InputStatusEnum.OK) break;

  const newPt = r.value;
  const line = new LineEnt([lastPt.x, lastPt.y], [newPt.x, newPt.y]);
  line.setDefaults();
  Engine.addEntities(line);
  points.push(newPt);
}

MCP 参考:vjcad/example/input/02getpointwithbase.js。

四、与状态机配合

在 step2_getNextPoints 里把上一个点设成 basePoint,就能让 PLINE 状态机显示真实的"虚线连接"预览。完整示例见 command/state-machine,源 vjcad/example/command/04statemachine.js。

反例

  • 不设 useBasePoint = true 只设 basePoint:没有橡皮筋、也没有相对基点的正交约束;但 callback 仍会每次鼠标移动触发(自定义预览照常可用)。
  • 在 callback 里直接用 canvasPt.x / canvasPt.y 创建实体:屏幕坐标 ≠ 图纸坐标。
  • 命令结束后没 Engine.clearPreview():自定义预览图永久残留。

参考(官方文档 MCP)

  • 文档:vjcad/doc/command/api-reference.md、vjcad/doc/guide/quick-start.md
  • 示例:vjcad/example/input/02getpointwithbase.js、vjcad/example/command/04statemachine.js、vjcad/example/input/06getkeyword.js