进阶实体
大约 5 分钟
进阶实体
标注、填充、块插入等高级实体类型。
HatchEnt - 填充
const { HatchEnt, PolylineEnt, Edge, Edges, EdgeType, Engine } = vjcad;
// 1. 创建边界(闭合多段线)
const boundary = new PolylineEnt();
boundary.setPoints([
[0, 0],
[100, 0],
[100, 60],
[0, 60]
]);
boundary.isClosed = true;
boundary.setDefaults();
// 2. 创建填充
const hatch = new HatchEnt();
hatch.patternName = "ANSI31"; // 图案名称
hatch.patternScale = 1.0; // 图案比例
hatch.patternAngle = 0; // 图案角度
// 3. 设置边界
const edge = new Edge();
edge.edgeType = EdgeType.Polyline;
edge.bulgePoints = boundary.bulgePoints.clone();
const edges = new Edges();
edges.add(edge);
hatch.setLoops(edges);
hatch.setDefaults();
hatch.color = 4;
Engine.addEntities([boundary, hatch]);常用填充图案:
| 图案名 | 说明 |
|---|---|
SOLID | 实心填充 |
ANSI31 | 斜线 |
ANSI32 | 交叉线 |
ANSI33 | 斜线(更密) |
ANSI34 | 斜线(更稀) |
属性:
patternName- 图案名称patternScale- 图案比例patternAngle- 图案角度color- 填充颜色
标注实体
LinearDimensionEnt - 线性标注
const { LinearDimensionEnt, Point2D, Engine } = vjcad;
const dim = new LinearDimensionEnt(
new Point2D(0, 0), // startPoint: 标注起点
new Point2D(100, 0), // endPoint: 标注终点
new Point2D(50, 20), // thirdPoint: 标注线位置
0 // dimAngle: 0=水平, PI/2=垂直
);
dim.setDefaults();
dim.textHeight = 5;
dim.arrowSize = 3;
dim.textOverride = "L=<>"; // <> 会被替换为测量值
dim.color = 3;
Engine.addEntities(dim);AlignedDimensionEnt - 对齐标注
const { AlignedDimensionEnt, Point2D, Engine } = vjcad;
const dim = new AlignedDimensionEnt(
new Point2D(0, 0), // startPoint
new Point2D(100, 50), // endPoint
new Point2D(50, 40) // thirdPoint
);
dim.setDefaults();
Engine.addEntities(dim);RadialDimensionEnt - 半径标注
const { RadialDimensionEnt, Point2D, CircleEnt, Engine } = vjcad;
// 先创建圆
const circle = new CircleEnt([50, 50], 30);
circle.setDefaults();
Engine.addEntities(circle);
// 创建半径标注
const dim = new RadialDimensionEnt(
new Point2D(50, 50), // center: 圆心
new Point2D(80, 50), // chordPoint: 圆周点
10 // leaderLength: 引线延伸长度
);
dim.setDefaults();
Engine.addEntities(dim);DiametricDimensionEnt - 直径标注
const { DiametricDimensionEnt, Point2D, Engine } = vjcad;
const dim = new DiametricDimensionEnt(
new Point2D(20, 50), // chordPoint1: 直径端点1
new Point2D(80, 50), // chordPoint2: 直径端点2
10 // leaderLength
);
dim.setDefaults();
Engine.addEntities(dim);AngleDimensionEnt - 角度标注
const { AngleDimensionEnt, Point2D, Engine } = vjcad;
const dim = new AngleDimensionEnt(
new Point2D(0, 0), // center: 角度顶点
new Point2D(100, 0), // xLine1Point: 第一条边上的点
new Point2D(50, 80), // xLine2Point: 第二条边上的点
new Point2D(60, 40) // arcPoint: 标注弧位置
);
dim.setDefaults();
Engine.addEntities(dim);ArcDimensionEnt - 弧长标注
const { ArcDimensionEnt, Point2D, Engine } = vjcad;
const dim = new ArcDimensionEnt(
new Point2D(50, 50), // center
new Point2D(80, 50), // xLine1Point: 圆弧起点
new Point2D(50, 80), // xLine2Point: 圆弧终点
new Point2D(70, 70) // arcPoint: 标注位置
);
dim.setDefaults();
Engine.addEntities(dim);OrdinateDimensionEnt - 坐标标注
const { OrdinateDimensionEnt, Point2D, Engine } = vjcad;
const dim = new OrdinateDimensionEnt(
new Point2D(100, 50), // definingPoint: 被标注点
new Point2D(120, 70), // leaderEndPoint: 引线终点
true // useXAxis: true=X坐标, false=Y坐标
);
dim.setDefaults();
Engine.addEntities(dim);标注通用属性:
| 属性 | 说明 |
|---|---|
textHeight | 文字高度 |
arrowSize | 箭头大小 |
textOverride | 文字覆盖(<> 被替换为测量值) |
scaleFactor | 缩放因子 |
decimalPlaces | 小数位数 |
标注方法:
getMeasurement()- 获取测量值getFormattedMeasurement()- 获取格式化后的文本
关联标注
标注可以关联到源实体,源实体移动时标注自动更新。
const { LinearDimensionEnt, LineEnt, Point2D, Engine } = vjcad;
// 创建直线
const line = new LineEnt([0, 0], [100, 0]);
line.setDefaults();
Engine.addEntities(line);
// 创建标注
const dim = new LinearDimensionEnt(
new Point2D(0, 0),
new Point2D(100, 0),
new Point2D(50, 20),
0
);
dim.setDefaults();
Engine.addEntities(dim);
// 建立关联(必须在 addEntities 之后)
dim.setSourceEntities(
line.id, -1, // 起点关联实体和线段索引(-1=整条线)
line.id, -1, // 终点关联实体
'start', // 起点端点类型
'end' // 终点端点类型
);
// 检查关联状态
console.log("isAssociative:", dim.isAssociative);端点类型:
'start'- 起点'end'- 终点'center'- 中心点'midpoint'- 中点
精确定位:
// 使用 parameterT(0~1 表示在线段上的比例位置)
dim.setSourceEntities(
line.id, -1,
line.id, -1,
undefined, // 不使用 pointType
undefined,
0.25, // startParameterT: 1/4 处
0.75 // endParameterT: 3/4 处
);InsertEnt - 块插入
创建块定义
const { LineEnt, CircleEnt, Engine } = vjcad;
const doc = Engine.currentDoc;
const blockName = "MySymbol";
// 检查是否已存在
let blockDef = doc.blocks.itemByName(blockName);
if (!blockDef) {
// 创建块定义
blockDef = doc.blocks.add(blockName);
blockDef.basePoint = [0, 0]; // 基点
// 添加块内实体
const line1 = new LineEnt([-10, 0], [10, 0]);
const line2 = new LineEnt([0, -10], [0, 10]);
const circle = new CircleEnt([0, 0], 5);
line1.setDefaults();
line2.setDefaults();
circle.setDefaults();
blockDef.addEntity(line1);
blockDef.addEntity(line2);
blockDef.addEntity(circle);
}插入块引用
const { InsertEnt, Engine } = vjcad;
const insert = new InsertEnt();
insert.blockId = blockDef.blockId; // 块ID(必须)
insert.insertionPoint = [50, 50]; // 插入点
insert.scaleFactor = 1.5; // 缩放因子
insert.rotation = Math.PI / 4; // 旋转角度(弧度)
insert.setDefaults();
insert.color = 5;
Engine.addEntities(insert);炸开块
// 获取块内实体(炸开)
const explodedEnts = insert.getNestEnts(true);
explodedEnts.forEach(ent => {
Engine.addEntities(ent);
});
Engine.eraseEntities(insert);属性:
blockId- 块ID(必须,从 blockDef.blockId 获取)insertionPoint- 插入点scaleFactor- 缩放因子rotation- 旋转角度(弧度)
方法:
getNestEnts(explode?)- 获取嵌套实体(true 时返回独立实体用于炸开)
符号管理
从本地存储加载符号
const {
getLocalStorageService,
parseSymbolVcadData,
mergeSymbolToDocument,
Point2D, Engine
} = vjcad;
const localService = getLocalStorageService();
// 获取分类和符号列表
const categories = await localService.getLocalSymbolCategories();
const symbols = await localService.getLocalSymbolList(categories[0].id);
const symbol = await localService.getLocalSymbol(symbols[0].id);
// 解析符号数据
const symbolDoc = await parseSymbolVcadData(symbol.vcadData);
// 合并到文档
const addedEntities = mergeSymbolToDocument(
symbolDoc,
new Point2D(100, 100), // insertPoint
symbol.basePoint, // basePoint
1.5, // scale
45, // rotation (度)
false // clearSourceInfo
);
Engine.zoomExtents();交互式插入符号
const { insertSymbolInteractive } = vjcad;
const entities = await insertSymbolInteractive(
symbolData,
basePoint,
{
allowScale: true, // 允许指定缩放
allowRotation: true, // 允许指定旋转
clearSourceInfo: false
}
);创建本地符号
const {
getLocalStorageService,
buildSymbolVcadData,
generateThumbnailFromEntities
} = vjcad;
const localService = getLocalStorageService();
// 创建分类
const category = await localService.createLocalSymbolCategory("我的符号");
// 创建符号内容
const entities = [line1, circle1];
// 生成符号数据
const vcadData = await buildSymbolVcadData(entities, false);
const thumbnail = await generateThumbnailFromEntities(entities, 128, 128);
// 保存符号
const symbol = await localService.saveLocalSymbol({
categoryId: category.id,
name: "十字符号",
basePoint: [0, 0],
thumbnail: thumbnail,
vcadData: vcadData
});MLeaderEnt - 多重引线
const { MLeaderEnt, Point2D, Engine } = vjcad;
const mleader = new MLeaderEnt();
mleader.leaderPoints = [
new Point2D(0, 0), // 箭头位置
new Point2D(50, 50), // 拐点
new Point2D(100, 50) // 文字位置
];
mleader.text = "标注内容";
mleader.textHeight = 5;
mleader.arrowSize = 3;
mleader.setDefaults();
Engine.addEntities(mleader);GroupEnt - 组
const { GroupEnt, LineEnt, CircleEnt, Engine } = vjcad;
// 创建实体
const line = new LineEnt([0, 0], [100, 0]);
const circle = new CircleEnt([50, 50], 20);
line.setDefaults();
circle.setDefaults();
// 创建组
const group = new GroupEnt("MyGroup", [line, circle]);
group.setDefaults();
Engine.addEntities(group);
// 访问组内实体
group.items.forEach((item, index) => {
console.log(`${index}: ${item.type}`);
});
// 炸开组
const explodedEntities = group.explode();
explodedEntities.forEach(ent => {
Engine.addEntities(ent);
});
Engine.eraseEntities(group);