唯杰地图 logo唯杰地图
VJMAP
EN

break-transform

vjcad/references/geometry/break-transform.md 3.2 KB83 行
原文

本文回答:打断(BREAK)= 在指定点把直线 / 圆弧 / 多段线拆成两段;几何变换 = Point2D / BoundingBox 等基础类型也支持 move/rotate/scale,与实体的 move/rotate/scale/mirror 行为一致;多框合并 mergeBoundingBoxes([...])。

一、打断(BREAK)

命令: BREAK
选择对象: <选择>
指定第二个打断点 或 [第一点(F)]: F
指定第一个打断点: <点击或输入坐标>
指定第二个打断点: <点击或输入坐标>

⚠️ vjcad 没有 BREAK 命令(CommandRegistry 无此注册项,executerWithOp('BREAK') 会打"未知命令")。打断要用几何算法自己实现——vjcad/example/geometry/16break.js 演示了在给定点把直线 / 弧 / 多段线打断为两段的算法(删除原实体、加两段新实体)。基本流程:

  1. 选定实体 + 拾取点,调用 GeometryCalculator.LineExtToLineExt(或 ArcExt 等)找到打断点位置参数。
  2. entity.startPoint = ... / endPoint = ... 切成两段,或新建两段。
  3. Engine.eraseEntities([原]) + Engine.addEntities([段1, 段2]) + Engine.regen()。

MCP 参考:vjcad/example/geometry/16break.js、vjcad/doc/geometry/calculations.md。

二、纯几何变换(不操作实体)

// Point2D 自身可变换
const p = new Point2D(100, 0)
  .rotate(Math.PI / 4)
  .scale(2)
  .offset(new Point2D(50, 50));

// BoundingBox 移动
const bb = new BoundingBox(new Point2D(0, 0), new Point2D(100, 100));
bb.move(new Point2D(0, 0), new Point2D(50, 30));

MCP 参考:vjcad/doc/geometry/point2d.md、vjcad/doc/geometry/bounding-box.md、vjcad/example/geometry/17transform.js。

三、点数组的整体变换

import { Point2D } from 'vjcad';

function transformPoints(pts, fromPt, toPt, angle, scale) {
  return pts.map(p => {
    const pt = new Point2D(p.x, p.y)
      .move(fromPt, toPt)
      .rotate(angle, toPt)
      .scale(scale, toPt);
    return pt;
  });
}

点数组通用变换没有内置 "一行函数",但 Point2D 自身链式 + Array.map 已经够用。vjcad/example/geometry/17transform.js 给出实战示例。

四、合并 / 扩展 BoundingBox

import { mergeBoundingBoxes, BoundingBox, Point2D } from 'vjcad';

const merged = mergeBoundingBoxes([bb1, bb2, bb3]);

// 自己写:扩展 / 求交
function expand(bb, m) {
  return new BoundingBox(
    new Point2D(bb.minX - m, bb.minY - m),
    new Point2D(bb.maxX + m, bb.maxY + m)
  );
}

MCP 参考:vjcad/doc/geometry/bounding-box.md、vjcad/example/geometry/15mergebounds.js。

反例

  • 打断后忘记删除原实体:图纸里同时有原直线 + 两段新直线,重叠显示。
  • 用 entity.move 后又改 Point2D 自身:重复变换,错位。
  • 直接 bb1.move(...) 修改了上层逻辑共享的 bbox:先 bb1 复制再操作。

参考(官方文档 MCP)

  • 文档:vjcad/doc/edit/edit-commands.md、vjcad/doc/geometry/point2d.md、vjcad/doc/geometry/bounding-box.md、vjcad/doc/geometry/calculations.md
  • 示例:vjcad/example/geometry/15mergebounds.js、16break.js、17transform.js