> **本文回答**：`SplineEnt` 用 `setControlPoints([...])` 设控制点（也支持拟合点 / 闭合 / 权重），`EllipseEnt(center, major, minor, rotation)` 构造椭圆；椭圆弧通过同一个 `EllipseEnt` 加 `startAngle / endAngle` 完成。

## 一、Spline（控制点）

```js
const sp = new SplineEnt();
sp.setControlPoints([
  [-45, 0],
  [-15, 28],
  [ 15, -28],
  [ 45, 0]
]);
sp.setDefaults();
sp.color = 6;
Engine.addEntities(sp);
```

MCP 参考：`vjcad/example/entity/all/01entities.js`、`vjcad/example/entity/spline/01create.js`。

## 二、Spline（闭合 / 权重 / 拟合点）

| 想要的 | 示例 |
|---|---|
| 闭合 | `vjcad/example/entity/spline/02closed.js` |
| 带权重的控制点（NURBS 影响曲线形状） | `vjcad/example/entity/spline/03weight.js` |
| 拟合点（曲线精确经过指定点） | `vjcad/example/entity/spline/05fitpoints.js` |

具体 API 请按 `vjcad/doc/entity/spline-ent.md` 与对应示例查阅。⚠️ `SplineEnt` **没有 `setWeights`**——权重用 `setControlPoints([[x, y], weight]` 混合格式或 `getControlPointWithWeight`/`getControlPointsWithWeight`；闭合相关只有**只读** getter `isClosed` / `endPtIsClosed` / `areaIsClosed`（无 setter，闭合要在创建/编辑 API 里处理——可设闭合的是 `PolylineEnt.isClosed`/`closed`/`setClosed`）。⚠️ 空 SplineEnt（无控制点/拟合点）上读这些闭合 getter **抛 `TypeError: Cannot read properties of undefined (reading 'point2d')`**——内部 spline 对象未初始化；须先 `setControlPoints`/`setFitPoints` 再读。

## 三、Ellipse（椭圆）

```js
// 完整椭圆
const e = new EllipseEnt(
  [cx, cy],
  45,           // 长半轴
  22,           // 短半轴
  Math.PI / 6   // 旋转（弧度）
);
e.setDefaults();
Engine.addEntities(e);
```

## 四、Ellipse（椭圆弧）

```js
const arc = new EllipseEnt([cx, cy], 40, 20, 0);
arc.startAngle = 0;
arc.endAngle   = Math.PI * 1.2;
arc.setDefaults();
Engine.addEntities(arc);
```

MCP 参考：`vjcad/example/entity/all/01entities.js`、`vjcad/example/entity/ellipse/01create.js`、`02arc.js`。

## 五、变换

`SplineEnt` / `EllipseEnt` 都继承 `EntityBase`，通用变换方法：

```js
ent.move(from, to);
ent.rotate(center, angle);
ent.scale(center, factor);
ent.mirror(p1, p2);
```

详见 [edit/](../edit/overview.md)，对应示例 `vjcad/example/entity/spline/04transform.js`、`vjcad/example/entity/ellipse/03transform.js`。

## 反例

- `setControlPoints` 之后又 `addControlPoint`：注意是否双倍添加（按你的 SDK 版本验证）。
- 椭圆参数顺序写反：`new EllipseEnt(center, minor, major, ...)` 会得到一个"竖椭圆"（看上去和你预期不同）。
- 椭圆弧用 `start / end` 度数：是**弧度**。

## 参考（官方文档 MCP）

- 文档：`vjcad/doc/entity/spline-ent.md`、`vjcad/doc/entity/ellipse-ent.md`
- 示例：`vjcad/example/entity/spline/01create.js`～`05fitpoints.js`、`vjcad/example/entity/ellipse/01create.js`～`03transform.js`、`vjcad/example/entity/all/01entities.js`
