!2934 优化: 修正圆弧板相切时凹槽的厚度

pull/2956/MERGE
张子涵 2 months ago committed by ChenX
parent f12b5b5f21
commit 6b04df35bb

@ -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);
};
}

@ -1,6 +1,7 @@
import { Vector3 } from "three";
import { arrayPushArray } from "../Common/ArrayExt";
import { Contour } from "../DatabaseServices/Contour";
import { Arc } from "../DatabaseServices/Entity/Arc";
import { Circle } from "../DatabaseServices/Entity/Circle";
import { Curve } from "../DatabaseServices/Entity/Curve";
import { Ellipse } from "../DatabaseServices/Entity/Ellipse";
@ -8,6 +9,7 @@ import { Polyline } from "../DatabaseServices/Entity/Polyline";
import { Spline } from "../DatabaseServices/Spline";
import { IntersectOption } from "../GraphicsSystem/IntersectWith";
import { CurveIntersection2 } from "./CurveIntersection";
import { AsVector2, ZAxisN, equaln, equalv3 } from "./GeUtils";
import { RegionParse } from "./RegionParse";
/**
@ -119,8 +121,26 @@ export function CreateContours(curves: Curve[], fuzz = 1e-4): Contour[]
for (let rs of parse.RegionsOutline)
{
let curves = rs.map(r => r.curve);
let polyline = Polyline.Combine(curves, 1e-3);
const polyline = new Polyline;
polyline.CloseMark = true;
for (let r of rs)
{
let bul = 0;
if (r.curve instanceof Arc)
{
bul = r.curve.Bul;
if (equalv3(r.curve.Normal, ZAxisN, 1e-3))
bul *= -1;
if (r.isReverse)
bul *= -1;
}
polyline.LineData.push({
pt: AsVector2(r.s),
bul
});
}
if (!equaln(rs[0].s.z, 0, 1e-2))
polyline.Move({ x: 0, y: 0, z: rs[0].s.z });
let contour = Contour.CreateContour(polyline, false);
if (contour)
contours.push(contour);

Loading…
Cancel
Save