|
|
|
@ -8,11 +8,11 @@ import { CSGIntersect } from "../../Common/CSGIntersect";
|
|
|
|
|
import { Board } from "../../DatabaseServices/Entity/Board";
|
|
|
|
|
import { ExtrudeSolid } from "../../DatabaseServices/Entity/Extrude";
|
|
|
|
|
import { Line } from "../../DatabaseServices/Entity/Line";
|
|
|
|
|
import { Polyline } from "../../DatabaseServices/Entity/Polyline";
|
|
|
|
|
import { Polyline, PolylineProps } from "../../DatabaseServices/Entity/Polyline";
|
|
|
|
|
import { BSPGroupParse } from "../../Geometry/BSPGroupParse";
|
|
|
|
|
import { Box3Ext } from "../../Geometry/Box";
|
|
|
|
|
import { CreateContour2 } from "../../Geometry/CreateContour2";
|
|
|
|
|
import { MoveMatrix, equaln, equalv3 } from "../../Geometry/GeUtils";
|
|
|
|
|
import { AsVector2, AsVector3, MoveMatrix, equaln, equalv3 } from "../../Geometry/GeUtils";
|
|
|
|
|
/**
|
|
|
|
|
* @Finish 目前已实现
|
|
|
|
|
* 1. 圆弧板垂直切普通板
|
|
|
|
@ -118,6 +118,8 @@ export class BoardCuttingForSweep
|
|
|
|
|
contour.Join(line1);
|
|
|
|
|
contour.Join(line2);
|
|
|
|
|
contour.Join(localPath2);
|
|
|
|
|
// 修正轮廓
|
|
|
|
|
this.AdjustPolyline(contour);
|
|
|
|
|
contours.push(contour);
|
|
|
|
|
}
|
|
|
|
|
return contours;
|
|
|
|
@ -137,6 +139,8 @@ export class BoardCuttingForSweep
|
|
|
|
|
if (interVolume < meatVolume / 10000)
|
|
|
|
|
continue;
|
|
|
|
|
const contour = this.CSGToPolyline(interCSG);
|
|
|
|
|
// 修正轮廓
|
|
|
|
|
this.AdjustPolyline(contour);
|
|
|
|
|
contours.push(contour);
|
|
|
|
|
}
|
|
|
|
|
return contours;
|
|
|
|
@ -156,6 +160,9 @@ export class BoardCuttingForSweep
|
|
|
|
|
interBox.setFromPoints(pts);
|
|
|
|
|
const interBoxSize = interBox.getSize(new Vector3());
|
|
|
|
|
groove.Thickness = interBoxSize.z;
|
|
|
|
|
// 修正厚度
|
|
|
|
|
if (equaln(groove.Thickness, meat.Thickness, 0.1))
|
|
|
|
|
groove.Thickness = meat.Thickness;
|
|
|
|
|
// 修正位置
|
|
|
|
|
groove.OCS = meat.OCS;
|
|
|
|
|
if (interBox.min.z > 0)
|
|
|
|
@ -231,6 +238,8 @@ export class BoardCuttingForSweep
|
|
|
|
|
contour.LineData.push({ pt: new Vector2(eDist1, box.max.y), bul: 0 });
|
|
|
|
|
contour.LineData.push({ pt: new Vector2(sDist1, box.max.y), bul: 0 });
|
|
|
|
|
contour.LineData.push({ pt: new Vector2(sDist1, box.min.y), bul: 0 });
|
|
|
|
|
// 修正轮廓
|
|
|
|
|
this.AdjustPolyline(contour);
|
|
|
|
|
contours.push(contour);
|
|
|
|
|
}
|
|
|
|
|
return contours;
|
|
|
|
@ -253,8 +262,8 @@ export class BoardCuttingForSweep
|
|
|
|
|
// 对CSG进行逆映射
|
|
|
|
|
this.InverseCSG(interCSG);
|
|
|
|
|
const contour = this.CSGToPolyline(interCSG);
|
|
|
|
|
// 针对放样角度做出修正
|
|
|
|
|
contour.ApplyMatrix(meat.ArcBuild.Rotate2OCSMtx);
|
|
|
|
|
// 修正轮廓
|
|
|
|
|
this.AdjustPolyline(contour);
|
|
|
|
|
contours.push(contour);
|
|
|
|
|
}
|
|
|
|
|
return contours;
|
|
|
|
@ -306,8 +315,8 @@ export class BoardCuttingForSweep
|
|
|
|
|
// 对CSG进行逆映射
|
|
|
|
|
this.InverseCSG(interCSG);
|
|
|
|
|
const contour = this.CSGToPolyline(interCSG);
|
|
|
|
|
// 针对放样角度做出修正
|
|
|
|
|
contour.ApplyMatrix(meat.ArcBuild.Rotate2OCSMtx);
|
|
|
|
|
// 修正轮廓
|
|
|
|
|
this.AdjustPolyline(contour);
|
|
|
|
|
contours.push(contour);
|
|
|
|
|
}
|
|
|
|
|
return contours;
|
|
|
|
@ -446,4 +455,31 @@ export class BoardCuttingForSweep
|
|
|
|
|
const pls2 = pl.GetSplitCurves(paramB);
|
|
|
|
|
return pls2[0];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/** 修正轮廓线(避免造型的布尔运算错误) */
|
|
|
|
|
private AdjustPolyline(pl: Polyline)
|
|
|
|
|
{
|
|
|
|
|
const meat = this.meat;
|
|
|
|
|
// 修正轮廓
|
|
|
|
|
const newData: PolylineProps[] = [];
|
|
|
|
|
for (const LineData of pl.LineData)
|
|
|
|
|
{
|
|
|
|
|
// 针对放样角度做出修正
|
|
|
|
|
const pt = AsVector3(LineData.pt).applyMatrix4(pl.OCS).applyMatrix4(meat.ArcBuild.Rotate2OCSMtx);
|
|
|
|
|
// 针对边缘噪点做出修正
|
|
|
|
|
this.AdjustPtClosePl(pt, meat.ContourCurve as Polyline);
|
|
|
|
|
pt.applyMatrix4(pl.OCSInv);
|
|
|
|
|
newData.push({ pt: AsVector2(pt), bul: LineData.bul });
|
|
|
|
|
}
|
|
|
|
|
pl.LineData = newData;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** 调整点到线的最近点 */
|
|
|
|
|
private AdjustPtClosePl(pt: Vector3, pl: Polyline)
|
|
|
|
|
{
|
|
|
|
|
const closestPt = pl.GetClosestPointTo(pt, false);
|
|
|
|
|
const dist = pt.distanceTo(closestPt);
|
|
|
|
|
if (dist < 1e-1)
|
|
|
|
|
pt.copy(closestPt);
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|