> **本文回答**：在 `MainView` 的 `fonts` 配置中加入 `{ path, name, kind }` 即可加载 woff/ttf/otf（TrueType）或 shx（AutoCAD 形字体）；`MainView` 会**为每个字体自动创建同名 `TextStyle`**，因此可以直接 `text.styleName = "<字体 name>"` 使用。

## 一、最小用法（直接用字体名作为 styleName）

```js
const cadView = new MainView({
  appname: '唯杰CAD',
  version: 'v1.0.0',
  serviceUrl: env.serviceUrl,
  accessToken: env.accessToken,
  sidebarStyle: 'none',
  fonts: [
    { path: './fonts/simkai.woff',  name: 'simkai',   kind: 'woff' },
    { path: './fonts/_default.shx', name: '_default', kind: 'shx'  }
  ]
});
initCadContainer('map', cadView);
await cadView.onLoad();

const t = new TextEnt();
t.insertionPoint = [0, 0];
t.text = '楷体文字';
t.height = 8;
t.styleName = 'simkai';   // 直接使用字体名
t.setDefaults();
Engine.addEntities(t);
```

MCP 参考：`vjcad/example/entity/text/04fonts.js`。

## 二、`FontConfig` 字段

| 字段 | 类型 | 说明 |
|---|---|---|
| `path` | `string` | 字体文件路径：以 `http(s)://` 开头原样使用；其余路径（含 `./x`、`/x`）在配置了 `serviceUrl` 时一律解析为 `<服务根>/_webcad/<path>`（服务根 = `serviceUrl` 去掉 `api/…` 部分；开头的 `./` 会被去掉），未配置 `serviceUrl` 才相对当前页面。字体放自己站点 public 下时请写**绝对 URL** |
| `name` | `string` | 字体名（同时是自动创建的 `TextStyle` 名）；**建议必填**：省略时 WASM 按文件名（含扩展名，如 `simkai.woff`）注册，而自动创建的 `TextStyle` 名取解析后的完整 path，`styleName = 'simkai'` 对不上 |
| `kind` | `'woff' \| 'ttf' \| 'shx'`（也支持 otf） | 字体类型 |

- 不传 `fonts` = 默认加载 `simkai.woff` + `_default.shx`（同样按上面的规则解析到 `<服务根>/_webcad/fonts/`）；`fonts: []` = **不加载任何字体**。

源码依据：`MainView.resolveRelativeUrl()`、`MainView` 构造函数中的默认 `fonts`、`_createTextStylesForFonts()`（`fontConfig.name || fontConfig.path`）。

MCP 参考：`vjcad/doc/guide/quick-start.md`、`vjcad/example/entity/text/04fonts.js`。

## 三、自定义 TextStyle（需要宽度因子 / 倾斜角度时）

```js
const kaitiStyle = new TextStyle();
kaitiStyle.name = '楷体样式';
kaitiStyle.fontFileName = 'simkai';   // 对应 fonts 配置里的 name
kaitiStyle.widthFactor = 1.0;
kaitiStyle.obliqueAngle = 0;
Engine.currentDoc.textStyles.add(kaitiStyle);

const t = new TextEnt();
t.insertionPoint = [0, 100];
t.text = '使用自定义样式';
t.height = 10;
t.styleName = '楷体样式';
t.setDefaults();
Engine.addEntities(t);
```

MCP 参考：`vjcad/example/entity/text/04fonts.js`。

## 四、注意

1. `MainView` 自动同名 `TextStyle` 与你手动 `textStyles.add(style)` 是同一概念——**`TextStyle` 是无参构造**，`new TextStyle({name:'xxx'})` 传的对象会被忽略，名字要用 `style.name = 'xxx'` 赋值；手动创建时 `fontFileName` 必须等于 `fonts[].name`。
2. 同一段 `text` 切换 `styleName` 不会立即重绘，需要 `entity.setModified()` + `Engine.regen()`。
3. `MTextEnt` 也通过 `styleName` 应用样式（同 `TextEnt`）。

## 反例

- `fonts` 配了 `{ name: 'simkai' }` 但 `TextEnt` 写 `styleName = 'SimKai'`：大小写敏感，对不上。
- 手动创建 `TextStyle` 但 `fontFileName` 写错（不在 `fonts[].name` 列表里）：渲染时会回退到默认字体；且 `new TextStyle({...})` 传参无效（无参构造），字段必须逐个 setter 赋值。

## 参考（官方文档 MCP）

- 文档：`vjcad/doc/guide/quick-start.md`
- 示例：`vjcad/example/entity/text/04fonts.js`
