唯杰地图 logo唯杰地图
VJMAP
EN

fonts

vjcad/references/setup/fonts.md 3.7 KB81 行
原文

本文回答:在 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。

四、注意

  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