> **本文回答**：`Engine.ssGetFirst() / ssSetFirst([...])` 操作"当前选择集"，`Engine.getEntities() / getEntitiesByType()` 查询全部 / 按类型；按图层用 `Engine.getEntities(e => e.layer === name)`（**没有** `getEntitiesByLayer`）；`Engine.getEntities(filter)` 用任意条件过滤。

## 一、当前选择集

```js
// 设置：传数组（空数组 = 清空）
Engine.ssSetFirst([line1, line2, circle]);
Engine.ssSetFirst([]);

// 获取：返回 EntityBase[]
const sel = Engine.ssGetFirst();
console.log(sel.length);

// 追加（保留已选）
Engine.ssSetFirst([...Engine.ssGetFirst(), newEntity]);

// 全选：getEntities() 含已 erase 的实体（isAlive=false），也不排除关闭/冻结/锁定层，不能直接用
Engine.ssSetFirst(Engine.currentSpace.aliveItems.filter(
  e => Engine.currentDoc.layers.isLayerSelectable(e.layerId)
));
// 或交互命令：await Engine.editor.executerWithOp('SELECTALL');
```

MCP 参考：`vjcad/example/selection/01setselection.js`、`02getselection.js`、`vjcad/doc/selection/index.md`。

## 二、按类型 / 图层 / 过滤函数取实体

```js
// 1. 单类型
const lines   = Engine.getEntitiesByType('LINE');
const circles = Engine.getEntitiesByType('CIRCLE');

// 2. 多类型：getEntitiesByType 只收单个 string，多类型用 getEntities 过滤
const lac = Engine.getEntities(e => ['LINE','CIRCLE','ARC'].includes(e.type));

// 3. 按图层（无 getEntitiesByLayer；e.layer 返回图层名）
const layerA = Engine.getEntities(e => e.layer === '图层A');

// 4. 自由过滤
const redLines = Engine.getEntities(ent => ent.type === 'LINE' && ent.color === 1);
const bigCircles = Engine.getEntities(
  ent => ent.type === 'CIRCLE' && ent.radius > 10
);
```

MCP 参考：`vjcad/example/selection/03getbytype.js`、`04getbyfilter.js`、`vjcad/doc/selection/index.md`。

## 三、`type` 字符串

| `type` | 类 |
|---|---|
| `LINE` / `CIRCLE` / `ARC` / `PLINE` / `ELLIPSE` / `SPLINE` / `BEZIER` | 几何 |
| `RAY` / `XLINE` / `DOT` / `PIXELPOINT` | 辅助 |
| `TEXT` / `MTEXT` | 文字 |
| `HATCH` / `SOLID` | 填充 |
| `MESH` | 网格 |
| `INSERT` / `GROUP` / `IMAGEREF` | 块 / 组 / 图像 |
| `CUSTOM` | 自定义实体（含全部标注与多重引线）：`type` 固定为 `'CUSTOM'`，按 `customType` 区分 `LINEAR_DIMENSION` / `ALIGNED_DIMENSION` / `ANGLE_DIMENSION` / `ARC_DIMENSION` / `RADIAL_DIMENSION` / `DIAMETRIC_DIMENSION` / `ORDINATE_DIMENSION` / `TWO_LINE_ANGULAR_DIMENSION` / `THREE_POINT_ANGULAR_DIMENSION` / `MLEADER`；**没有** `DIMLINEAR` 这类 type |

```js
const dims = Engine.getEntities(e => e.isAlive && e.type === 'CUSTOM' && e.customType?.endsWith('_DIMENSION'));
```

完整对照见 `vjcad/doc/selection/index.md` 与 `vjcad/doc/command/api-reference.md`。

## 四、与交互式选择互通

```js
// 交互式选择后再覆盖到选择集
const result = await getSelections(new SelectionInputOptions());   // 无参构造
if (result.status === InputStatusEnum.OK) {
  Engine.ssSetFirst(result.value);
}
```

详见 [input/get-selections](../input/get-selections.md)。

## 五、综合：选择 + 高亮 + 编辑模板

```js
const lines = Engine.getEntitiesByType('LINE');
Engine.ssSetFirst(lines);
Engine.highLightEntities(lines);

setTimeout(() => Engine.clearHighLight(), 3000);
```

## 反例

- `Engine.getEntities('LINE')` 把 `getEntities` 当 `getEntitiesByType` 用：`getEntities` 接受**过滤函数**，不是字符串。
- `ssSetFirst(entity)` 传单个实体：得传**数组**。
- 选完后没高亮 / 没设进 `ssSetFirst`：用户面板看不到反馈。
- ⚠️ `getEntities()` / `getEntitiesByType()` **包含已删除实体**：erase 是软删（`isAlive=false`，留在 `items` 供 undo），这两个 API 返回 `[...items]` 不过滤。统计/遍历存活实体用 `currentSpace.aliveItems` 或 `getEntities(e => e.isAlive)`。

## 参考（官方文档 MCP）

- 文档：`vjcad/doc/selection/index.md`、`vjcad/doc/selection/entity-selection.md`
- 示例：`vjcad/example/selection/01setselection.js` ~ `04getbyfilter.js`
