Skip to content

样条线

我们可以通过实例化一个 McDbSpline() 对象创建样条线对象。通过调用 McDbSpline() 实例对象的 setFitPoints() 方法来设置样条线的拟合数据绘制样条线。其中,setFitPoints()的参数 data 对象中有四个属性,它们分别是:

  • degree: 样条曲线的次数(degree),表示曲线的数学阶次。通常,AutoCAD 中的样条曲线是三次曲线(degree 为 3),意味着它们是三阶多项式。
  • fitTolerance: 拟合公差,这是一个数值,代表了拟合点到实际生成的样条曲线之间的最大允许距离。较小的值意味着样条曲线将更紧密地跟随拟合点,但可能会导致曲线更加复杂。
  • tangentsExist: 一个布尔值,指示是否指定了起点切线和终点切线。如果为 true,则表示存在自定义的起始和结束切线方向,这可以控制曲线在端点处的方向。
  • startTangent: 如果 tangentsExist 为 true,此参数是一个 McGeVector3d 对象,表示曲线起点的切线方向。它决定了曲线开始时的方向。
  • endTangent: 类似于 startTangent,但如果 tangentsExist 为 true,这个参数指定的是曲线结束时的切线方向,影响曲线如何到达其终点。
  • fitPoints: 这是一个 McGePoint3dArray 类型的数组,包含了一系列的三维点(McGePoint3d),这些点是样条曲线要经过的拟合点。根据这些点的位置,mxcad 会计算出一条平滑通过所有点的曲线。

点击 McDbSpline()setFitPoints() 查看详细属性和方法说明。

ts
import { MxCpp, MxCADUiPrPoint, McDbSpline, McGePoint3dArray, McGeVector3d } from "mxcad";

// 绘样条线函数
async function Mx_drawSpline() {
  const getPoint = new MxCADUiPrPoint();
  getPoint.setMessage("\n指定第一点:");
  let prvPoint = await getPoint.go();
  if (!prvPoint) return;
  getPoint.setMessage("\n指定下一个点:");
  let fitPoints = new McGePoint3dArray();
  fitPoints.append(prvPoint);
//  样条线循环取点
  while (true) {
    getPoint.setBasePt(prvPoint as any);
    if (fitPoints.length() == 1) {
      getPoint.setUseBasePt(true);
    } else {
      getPoint.setUseBasePt(false);
      getPoint.setUserDraw((pt, pw) => {
        let tmpFitPoints = new McGePoint3dArray();
        tmpFitPoints.copy(fitPoints);
        tmpFitPoints.append(pt);
        // 创建样条线
        let tmpSPline = new McDbSpline();
        tmpSPline.setFitPoints({
          degree: 3,
          fitTolerance: 0.000001,
          tangentsExist: false,
          startTangent: McGeVector3d.kIdentity,
          endTangent: McGeVector3d.kIdentity,
          fitPoints: tmpFitPoints,
        });
        pw.drawMcDbEntity(tmpSPline);
      });
    }

    let pt = await getPoint.go();
    if (!pt) break;
    fitPoints.append(pt);
    prvPoint = pt;
  }

  if (fitPoints.length() > 2) {
    let sp = new McDbSpline();
    sp.setFitPoints({
      degree: 3,
      fitTolerance: 0.000001,
      tangentsExist: false,
      startTangent: McGeVector3d.kIdentity,
      endTangent: McGeVector3d.kIdentity,
      fitPoints: fitPoints,
    });
    MxCpp.getCurrentMxCAD().drawEntity(sp);
  }
}