> **本文回答**：取字符串用 `Engine.getString` + `StringInputOptions`，取整数用 `Engine.getInteger` + `IntegerInputOptions`（字段 `defaultValue / lowerLimit / upperLimit` 虽存在但**处理器从不读取**，需自校验），取实数用 `Engine.getReal` + `RealInputOptions`，取关键字用 `Engine.getKeyword` + `KeywordInputOptions`。**空回车不返回 `EnterOrSpace`**：`getReal` → `OK` + `defaultValue`（默认 0；设为 `null` 才返回 `None`）；`getInteger` / `getString` → `None`；`getKeyword` 有 `defaultKeyword` → `OK`。`EnterOrSpace` 只有 `getEntity` 会返回。

## 一、`getReal` 取实数

```js
const opt = new RealInputOptions('输入圆的半径:');
opt.defaultValue = 30;

const r = await getReal(opt);
if (r.status === InputStatusEnum.OK) {
  return r.value;                       // 用户输入的数字；空回车时也是 OK，value = defaultValue（30）
}
return null;                             // 取消(Cancel) / 非数字(Error) / defaultValue 为 null 时空回车(None)
```

MCP 参考：`vjcad/example/input/04getreal.js`、`vjcad/doc/command/api-reference.md`。

## 二、`getInteger` 取整数（上下限需自校验）

```js
const opt = new IntegerInputOptions('输入数量 <10>:');   // 默认值只能自己写进提示
// opt.defaultValue / lowerLimit / upperLimit 字段存在，但 IntegerInputHandler 从不读取——设了也无效

const r = await Engine.getInteger(opt);
let n;
if (r.status === InputStatusEnum.OK) n = r.value;          // 注意 Number('3.5') 也会是 OK，不校验整数
else if (r.status === InputStatusEnum.None) n = 10;        // 空回车 → None（不是 EnterOrSpace），自己套默认值
else return null;                                          // Cancel
if (!Number.isInteger(n) || n < 1 || n > 100) return null; // 上下限 / 整数自己校验
return n;
```

MCP 参考：`vjcad/doc/command/api-reference.md`、`vjcad/example/input/05getinteger.js`（官方示例按 `EnterOrSpace` 分支取默认值、依赖 `lowerLimit/upperLimit`，与源码行为不符；上面已按 `IntegerInputHandler` 修正）。

## 三、`getString` 取字符串

```js
const opt = new StringInputOptions('输入文本:');
const r = await Engine.getString(opt);
if (r.status === InputStatusEnum.OK) {
  console.log('文本:', r.value);
} else if (r.status === InputStatusEnum.None) {
  // 空回车
}
```

MCP 参考：`vjcad/doc/command/api-reference.md`。

## 四、`getKeyword` 取关键字

```js
const opt = new KeywordInputOptions('选择模式 [窗口(W)/交叉(C)]:');
opt.keywords        = ['W', 'C'];
opt.defaultKeyword  = 'W';

const r = await Engine.getKeyword(opt);
if (r.status === InputStatusEnum.OK) {
  switch (r.value) {
    case 'W': /* 窗口模式 */ break;
    case 'C': /* 交叉模式 */ break;
  }
}
```

MCP 参考：`vjcad/doc/command/api-reference.md`。

## 五、关键字也可以挂在 `PointInputOptions` 上

```js
const opt = new PointInputOptions('指定点 [直线(L)/圆(C)/圆弧(A)/退出(E)]:');
opt.keywords = ['L', 'C', 'A', 'E'];

const r = await getPoint(opt);
if (r.status === InputStatusEnum.OK) {
  // 真实坐标
} else if (r.status === InputStatusEnum.Keyword) {
  switch (r.stringResult.toUpperCase()) {
    case 'L': /* ... */ break;
    case 'C': /* ... */ break;
  }
} else if (r.status === InputStatusEnum.Cancel) {
  // 退出
}
```

MCP 参考：`vjcad/example/input/06getkeyword.js`。

## 六、`InputStatusEnum` 速查

| 值 | 名称 | 何时出现 |
|---|---|---|
| `5100` | `OK` | 用户输入了具体值（点/字符串/数字） |
| `-5002` | `Cancel` | 用户按 Esc |
| `-5005` | `Keyword` | 用户输入了关键字 |
| `3` | `EnterOrSpace` | 仅 `getEntity`：点选时直接回车/空格（且未设 `defaultKeyWord`）；`getReal/getInteger/getString/getKeyword/getPoint` 的空回车都**不**返回它 |
| `4` | `IsNumber` | 用户输入数字（`PointInputOptions.allowNumberResult` 时） |
| `5000` | `None` | 无输入（`getInteger` / `getString` 空回车；`getReal` 在 `defaultValue = null` 时空回车；`getPoint` 无 `defaultKeyword` 时空回车） |
| `-5001` | `Error` | 出错 |

MCP 参考：`vjcad/doc/command/api-reference.md`。

## 反例

- 写 `r.status === InputStatusEnum.EnterOrSpace` 分支等"回车默认值"：`getReal/getInteger/getString/getKeyword` 永远走不到这个分支。`getReal` 空回车直接是 `OK` + `defaultValue`；`getInteger/getString` 空回车是 `None`。
- `getReal` 的 `defaultValue` 设成 `null`：空回车返回 `None`（不是 OK）。
- 以为 `IntegerInputOptions.lowerLimit/upperLimit/defaultValue` 会生效：处理器不读这些字段，要自己校验。

## 参考（官方文档 MCP）

- 文档：`vjcad/doc/command/api-reference.md`、`vjcad/doc/guide/quick-start.md`
- 示例：`vjcad/example/input/04getreal.js`、`vjcad/example/input/05getinteger.js`、`vjcad/example/input/06getkeyword.js`
