自定义线型创建、复杂线型、LIN 文件加载、线型管理器 API。
WebCAD 支持三种类型的线型元素:
| 元素类型 | 类 | 说明 |
|---|
| 简单元素 | SimpleLinetypeElement | 实线、间隙、点 |
| 文字元素 | TextLinetypeElement | 嵌入文字 |
| 形状元素 | ShapeLinetypeElement | 嵌入 SHX 形状符号 |
| 值 | 含义 |
|---|
| 正数 | 实线段长度(单位与图纸单位一致) |
| 负数 | 间隙长度(绝对值为间隙大小) |
| 0 | 点(在该位置绘制一个点) |
const { LinetypeDefinition, SimpleLinetypeElement, Engine } = vjcad;
const ltManager = Engine.linetypeManager;
// 创建虚线:12单位实线,6单位间隙,循环...
const dashed = new LinetypeDefinition("MY_DASHED", "简单虚线 ---- ----");
dashed.addElement(new SimpleLinetypeElement(12)); // 12单位实线
dashed.addElement(new SimpleLinetypeElement(-6)); // 6单位间隙
ltManager.registerLinetype(dashed, "custom");
// 点划线:实线 - 间隙 - 点 - 间隙,循环...
const dashdot = new LinetypeDefinition("MY_DASHDOT", "点划线 ____ . ____");
dashdot.addElement(new SimpleLinetypeElement(12)); // 实线
dashdot.addElement(new SimpleLinetypeElement(-3)); // 间隙
dashdot.addElement(new SimpleLinetypeElement(0)); // 点
dashdot.addElement(new SimpleLinetypeElement(-3)); // 间隙
ltManager.registerLinetype(dashdot, "custom");
// 双点划线:实线 - 间隙 - 点 - 间隙 - 点 - 间隙
const dashdotdot = new LinetypeDefinition("MY_DASHDOTDOT", "双点划线 ____ . . ____");
dashdotdot.addElement(new SimpleLinetypeElement(12));
dashdotdot.addElement(new SimpleLinetypeElement(-3));
dashdotdot.addElement(new SimpleLinetypeElement(0)); // 第一个点
dashdotdot.addElement(new SimpleLinetypeElement(-3));
dashdotdot.addElement(new SimpleLinetypeElement(0)); // 第二个点
dashdotdot.addElement(new SimpleLinetypeElement(-3));
ltManager.registerLinetype(dashdotdot, "custom");
// 边界线:实线 - 间隙 - 实线 - 间隙 - 点 - 间隙
const border = new LinetypeDefinition("MY_BORDER", "边界线 __ __ . __ __ .");
border.addElement(new SimpleLinetypeElement(10));
border.addElement(new SimpleLinetypeElement(-4));
border.addElement(new SimpleLinetypeElement(10));
border.addElement(new SimpleLinetypeElement(-4));
border.addElement(new SimpleLinetypeElement(0)); // 点
border.addElement(new SimpleLinetypeElement(-4));
ltManager.registerLinetype(border, "custom");
const { TextLinetypeElement, TextRotationMode } = vjcad;
new TextLinetypeElement(text, style, options);
| 参数 | 说明 |
|---|
text | 显示的文字内容 |
style | 文字样式名(如 "STANDARD") |
options.scale | 缩放比例(默认 1.0) |
options.rotation | 旋转角度(度) |
options.rotationMode | 旋转模式(见下表) |
options.xOffset | X 方向偏移(正值沿线段方向) |
options.yOffset | Y 方向偏移(负值向下,约 -scale*0.3 可使文字居中) |
| 模式 | 说明 |
|---|
TextRotationMode.UPRIGHT ("U") | 正立,文字始终易读 |
TextRotationMode.RELATIVE ("R") | 相对,随线段角度旋转 |
TextRotationMode.ABSOLUTE ("A") | 绝对,相对于原点旋转 |
const {
LinetypeDefinition, SimpleLinetypeElement,
TextLinetypeElement, TextRotationMode, Engine
} = vjcad;
const ltManager = Engine.linetypeManager;
// 热水管线型:----HW----HW----
const hotWater = new LinetypeDefinition("HOT_WATER", "热水管 ----HW----");
hotWater.addElement(new SimpleLinetypeElement(15)); // 15单位实线
hotWater.addElement(new SimpleLinetypeElement(-2)); // 文字前间隙
hotWater.addElement(new TextLinetypeElement("HW", "STANDARD", {
scale: 2.0,
rotationMode: TextRotationMode.UPRIGHT, // 文字始终正立
yOffset: -0.6
}));
hotWater.addElement(new SimpleLinetypeElement(-8)); // 文字后间隙(需容纳文字宽度)
ltManager.registerLinetype(hotWater, "complex");
// 燃气管线型:----GAS----GAS----
const gasLine = new LinetypeDefinition("GAS_LINE", "燃气管 ----GAS----");
gasLine.addElement(new SimpleLinetypeElement(12));
gasLine.addElement(new SimpleLinetypeElement(-2));
gasLine.addElement(new TextLinetypeElement("GAS", "STANDARD", {
scale: 1.5,
rotationMode: TextRotationMode.UPRIGHT,
yOffset: -0.45
}));
gasLine.addElement(new SimpleLinetypeElement(-8));
ltManager.registerLinetype(gasLine, "complex");
const { ShapeLinetypeElement } = vjcad;
new ShapeLinetypeElement(shapeName, shapeFile, options);
| 参数 | 说明 |
|---|
shapeName | SHX 形状名称 |
shapeFile | SHX 形状文件名 |
options | 与 TextLinetypeElement 相同 |
const { ShapeLinetypeElement, TextRotationMode } = vjcad;
// 流向线:带箭头
const flowArrow = new LinetypeDefinition("FLOW_ARROW", "流向线 -->-->-->");
flowArrow.addElement(new SimpleLinetypeElement(12));
flowArrow.addElement(new SimpleLinetypeElement(-1));
flowArrow.addElement(new ShapeLinetypeElement("ARROW", "ltypeshp.shx", {
scale: 0.8,
rotation: 0,
rotationMode: TextRotationMode.RELATIVE // 随线段方向旋转
}));
flowArrow.addElement(new SimpleLinetypeElement(-1));
ltManager.registerLinetype(flowArrow, "complex");
// 轨道线:带方块
const track = new LinetypeDefinition("TRACK", "轨道线 --□--□--");
track.addElement(new SimpleLinetypeElement(10));
track.addElement(new SimpleLinetypeElement(-2));
track.addElement(new ShapeLinetypeElement("BOX", "ltypeshp.shx", {
scale: 1.2,
rotationMode: TextRotationMode.UPRIGHT // 方块保持正立
}));
track.addElement(new SimpleLinetypeElement(-2));
ltManager.registerLinetype(track, "complex");
;; 注释以分号开头
*线型名称,描述
A,模式元素1,模式元素2,...
*ACAD_ISO02W100,ISO 虚线 ____ ____
A,12,-3
*ACAD_ISO07W100,ISO 点划线 ____ . ____
A,24,-3,0,-3
const { LinetypeParser, Engine } = vjcad;
const ltManager = Engine.linetypeManager;
// .lin 格式定义字符串
const linDefinitions = `
*MY_DASHED,我的虚线 ____ ____
A,12,-3
*MY_DOTTED,我的点线 . . . .
A,0,-6
*MY_DIVIDE,我的分隔线 ____ . ____
A,12.7,-6.35,0,-6.35
`;
// 解析 .lin 格式
const parser = new LinetypeParser();
const definitions = parser.parse(linDefinitions);
console.log(`解析出 ${definitions.length} 个线型定义`);
// 注册解析出的线型
for (const def of definitions) {
if (parser.validateDefinition(def)) {
ltManager.registerLinetype(def, "imported");
console.log(`已注册: ${def.name}`);
}
}
// 或使用便捷方法一次性加载
const loadedCount = ltManager.loadFromLinDefinitions(linDefinitions, "imported");
console.log(`加载了 ${loadedCount} 个线型`);
const ltManager = Engine.linetypeManager;
// 注册线型
ltManager.registerLinetype(definition, "category");
// 获取线型定义
const def = ltManager.getLinetype("HIDDEN");
console.log(def.name); // 线型名
console.log(def.description); // 描述
console.log(def.elements); // 元素数组
console.log(def.patternLength);// 模式长度
console.log(def.isComplex); // 是否复杂线型
// 检查是否存在
const exists = ltManager.hasLinetype("MY_LINETYPE");
// 删除线型(不能删除内置线型)
ltManager.removeLinetype("MY_LINETYPE");
// 获取所有线型名称
const allNames = ltManager.getAllLinetypeNames();
const categoryNames = ltManager.getAllLinetypeNames("custom");
// 获取所有线型定义
const allDefs = ltManager.getAllLinetypes();
// 导出为 .lin 格式
const linString = ltManager.exportToLinFormat(["MY_LINE1", "MY_LINE2"]);
const categoryLin = ltManager.exportToLinFormat(null, "custom");
// 获取所有分类
const categories = ltManager.getCategories();
// 返回: ["builtin", "custom", "complex", "imported", ...]
// 检查是否为内置线型
const isBuiltin = ltManager.isBuiltinLinetype("CONTINUOUS"); // true
// 清除所有自定义线型
ltManager.clearCustomLinetypes();
// 重置为默认状态
ltManager.reset();
// 获取统计信息
const stats = ltManager.getStatistics();
console.log(stats.total); // 总线型数
console.log(stats.categories); // 每个分类的数量
// 导出为 JSON
const jsonDef = definition.toJSON();
// 从 JSON 恢复
const restoredDef = LinetypeDefinition.fromJSON(jsonDef);
const line = new LineEnt([0, 0], [100, 0]);
line.setDefaults();
line.lineType = "HOT_WATER"; // 线型名称
line.lineTypeScale = 1.0; // 线型比例
Engine.addEntities(line);
| lineTypeScale | 效果 |
|---|
| 0.5 | 更密(元素更小) |
| 1.0 | 默认 |
| 2.0 | 更稀(元素更大) |
提示:ISO 线型通常需要调整比例(如 0.5)才能正常显示。
WebCAD 内置以下常用线型:
| 名称 | 描述 |
|---|
CONTINUOUS | 实线(默认) |
HIDDEN | 虚线 |
CENTER | 中心线 |
PHANTOM | 幻影线 |
DASHED | 短划线 |
DASHDOT | 点划线 |
BORDER | 边界线 |
DIVIDE | 分隔线 |
const {
MainView, initCadContainer, LineEnt, Engine,
LinetypeDefinition, SimpleLinetypeElement,
TextLinetypeElement, TextRotationMode
} = vjcad;
// 初始化
const cadView = new MainView({...});
initCadContainer("map", cadView);
await cadView.onLoad();
const ltManager = Engine.linetypeManager;
// 1. 创建简单线型
const myDash = new LinetypeDefinition("MY_DASH", "自定义虚线");
myDash.addElement(new SimpleLinetypeElement(10));
myDash.addElement(new SimpleLinetypeElement(-5));
ltManager.registerLinetype(myDash, "custom");
// 2. 创建复杂线型(带文字)
const pipeLine = new LinetypeDefinition("PIPE", "管道线");
pipeLine.addElement(new SimpleLinetypeElement(12));
pipeLine.addElement(new SimpleLinetypeElement(-2));
pipeLine.addElement(new TextLinetypeElement("P", "STANDARD", {
scale: 2.0,
rotationMode: TextRotationMode.UPRIGHT,
yOffset: -0.6
}));
pipeLine.addElement(new SimpleLinetypeElement(-4));
ltManager.registerLinetype(pipeLine, "complex");
// 3. 应用线型
const line1 = new LineEnt([0, 0], [200, 0]);
line1.setDefaults();
line1.lineType = "MY_DASH";
line1.lineTypeScale = 1.0;
Engine.addEntities(line1);
const line2 = new LineEnt([0, 30], [200, 30]);
line2.setDefaults();
line2.lineType = "PIPE";
line2.lineTypeScale = 1.0;
Engine.addEntities(line2);
Engine.zoomExtents();