唯杰地图 logo唯杰地图
VJMAP
EN

get-string-number

vjcad/references/input/get-string-number.md 5.0 KB112 行
原文

本文回答:取字符串用 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 取实数

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 取整数(上下限需自校验)

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 取字符串

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 取关键字

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 上

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