> **本文回答**：`PointInputOptions.useBasePoint = true` + `basePoint = startPoint` 即可显示默认橡皮筋线；如果想自定义预览（颜色 / 端点圆 / 标尺等），加 `hideRubberBand = true` 关掉默认线，再用 `callback(canvasPt)` 在每次鼠标移动时 `Engine.clearPreview()` + `Engine.drawPreviewEntities([...])`。

## 一、默认橡皮筋线

```js
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`（"获取点"小节）。

## 二、自定义回调预览（隐藏默认橡皮筋）

```js
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`。

## 三、连续画线（每段都带基点）

```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](../command/state-machine.md)，源 `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`
