样条线
我们可以通过实例化一个 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);
}
}