fonts
本文回答:在
MainView的fonts配置中加入{ path, name, kind }即可加载 woff/ttf/otf(TrueType)或 shx(AutoCAD 形字体);MainView会为每个字体自动创建同名TextStyle,因此可以直接text.styleName = "<字体 name>"使用。
一、最小用法(直接用字体名作为 styleName)
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(需要宽度因子 / 倾斜角度时)
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。
四、注意
MainView自动同名TextStyle与你手动textStyles.add(style)是同一概念——TextStyle是无参构造,new TextStyle({name:'xxx'})传的对象会被忽略,名字要用style.name = 'xxx'赋值;手动创建时fontFileName必须等于fonts[].name。- 同一段
text切换styleName不会立即重绘,需要entity.setModified()+Engine.regen()。 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