唯杰地图 logo唯杰地图
VJMAP
EN

dimension-mleader

vjcad/references/entity/dimension-mleader.md 5.0 KB118 行
原文

本文回答:vjcad 标注按形状分 7 个类——LinearDimensionEnt / AlignedDimensionEnt / RadialDimensionEnt / DiametricDimensionEnt / AngleDimensionEnt / ArcDimensionEnt / OrdinateDimensionEnt,每个类的构造签名不同;多重引线用 MLeaderEnt + contentType / textContent / textPosition / addLeaderLine(arrowEnd)。关联标注(reactor)见 reactor/dimension-association。

一、构造签名速查

// 线性(水平 / 垂直,轴向 0 弧度水平)
new LinearDimensionEnt(
  new Point2D(x1, y1),    // 测量起点 startPoint
  new Point2D(x2, y2),    // 测量终点 endPoint
  new Point2D(tx, ty),    // 尺寸线位置 dimensionLinePoint(定标注线在哪,不是文字)
  0                       // 角度 dimensionAngle(弧度,0 = 水平测量)
);

// 对齐(沿测量两点连线方向)
new AlignedDimensionEnt(
  new Point2D(x1, y1),
  new Point2D(x2, y2),
  new Point2D(tx, ty)
);

// 半径(圆 / 弧)
new RadialDimensionEnt(
  new Point2D(cx, cy),     // 圆心
  new Point2D(rx, ry),     // 圆周点
  10                        // 引出长度
);

// 直径
new DiametricDimensionEnt(
  new Point2D(p1x, p1y),    // 直径上一点 chordPoint
  new Point2D(p2x, p2y)     // 直径上对侧点 farChordPoint
  // 可选第三参 leaderLength?: number(引出长度)
);

// 角度(顶点 + 两条边上的点 + 半径)
new AngleDimensionEnt(
  new Point2D(vx, vy),
  new Point2D(b1x, b1y),
  new Point2D(b2x, b2y),
  22                         // 弧线半径
);

// 弧长
new ArcDimensionEnt(
  new Point2D(cx, cy),       // 圆心
  new Point2D(p1x, p1y),     // 弧端点 A
  new Point2D(p2x, p2y),     // 弧端点 B
  new Point2D(tx, ty)        // 标注位置
);

// 坐标
new OrdinateDimensionEnt(
  new Point2D(ox, oy),       // 原点
  new Point2D(px, py),       // 测量点
  new Point2D(tx, ty),       // 标注位置
  'xy'                       // 'x' / 'y' / 'xy'(OrdinateDisplayMode;兼容 boolean 用法)
);

角度标注另有两个变体类 ThreePointAngularDimensionEnt(三点定角)与 TwoLineAngularDimensionEnt(两直线夹角),同继承 DimensionBase,按三点/两线输入选对应类。

MCP 参考:vjcad/example/entity/all/01entities.js、vjcad/example/entity/dimension/01linear.js ~ 08ordinate.js。

二、相联标注(关联反应器)

详见 reactor/dimension-association 与 vjcad/example/entity/dimension/09associative.js。基本思路:原图实体改了,绑定的标注通过反应器自动更新数值。

三、MLeaderEnt(多重引线)

const ml = new MLeaderEnt();
ml.contentType  = MLeaderContentType.MText;
ml.textContent  = '标注';
ml.textPosition = new Point2D(textX, textY);
ml.textHeight   = 6;
ml.addLeaderLine(new Point2D(arrowX, arrowY));
ml.setDefaults();
ml.color = 5;
Engine.addEntities(ml);

MCP 参考:vjcad/example/entity/all/01entities.js、vjcad/example/entity/mleader/01create.js。

字段 / 方法 说明
contentType 内容类型枚举(MLeaderContentType.MText 等)
textContent 文字内容
textPosition 文字位置
textHeight 文字高度
addLeaderLine(arrowEnd) 增加一条引线(从 arrowEnd 拉出箭头)

四、标注样式

参见 vjcad/example/entity/dimension/03style.js、vjcad/doc/entity/index.md(标注样式 / 文字 / 箭头)。样式对象字段是驼峰名(DimensionStyle.scaleFactor / textHeight / arrowSize / extensionLineOffset / extensionLineExtend 等);dimscale / dimtxt 这类小写 AutoCAD 名只出现在 DbDimensionStyle 序列化层,不能直接对 Engine.currentDoc.dimensionStyles.itemByName(name) 返回的样式对象赋值。

⚠️ 代码创建的标注默认不用文档样式:构造时 _style = DefaultDimensionStyle.clone()(全局默认样式副本),setDefaults() 也不吸文档样式,所以改 dimensionStyles.itemByName('Standard').scaleFactor 对 new XxxDimensionEnt(...) 无效。做法二选一:

// A:文档比例 + 吸取当前文档样式(内置标注命令同此两步)
Engine.currentDoc.DIMSCALE = 50;
dim.setDefaults();
dim.applyCurrentDocStyle();   // 克隆文档当前样式,scaleFactor 覆盖为 DIMSCALE

// B:逐个设快捷属性
dim.scaleFactor = 50;  dim.textHeight = 2.5;  dim.arrowSize = 2.5;

反例

  • 给 LinearDimensionEnt 的第四参当度数:实际是弧度。
  • 圆心半径填错位置:RadialDimensionEnt 第一参是圆心、第二参是圆周上一点。
  • MLeaderEnt 没设 textPosition / addLeaderLine:渲染不出箭头与文字位置。

参考(官方文档 MCP)

  • 文档:vjcad/doc/entity/index.md(标注示例列表)
  • 示例:vjcad/example/entity/all/01entities.js、vjcad/example/entity/dimension/01linear.js ~ 09associative.js、vjcad/example/entity/mleader/01create.js