|
|
@ -1,4 +1,5 @@
|
|
|
|
import { Box3, Matrix4, Vector2, Vector3 } from "three";
|
|
|
|
import { Box3, Matrix4, Vector2, Vector3 } from "three";
|
|
|
|
|
|
|
|
import { SplitPolyline } from "../Add-on/BoardCutting/SplitPolyline";
|
|
|
|
import { FaceDirection } from "../Add-on/DrawDrilling/DrillType";
|
|
|
|
import { FaceDirection } from "../Add-on/DrawDrilling/DrillType";
|
|
|
|
import { SCALAR } from "../Add-on/DrawDrilling/HoleUtils";
|
|
|
|
import { SCALAR } from "../Add-on/DrawDrilling/HoleUtils";
|
|
|
|
import { lookOverBoardInfosTool } from "../Add-on/LookOverBoardInfos/LookOverBoardInfosTool";
|
|
|
|
import { lookOverBoardInfosTool } from "../Add-on/LookOverBoardInfos/LookOverBoardInfosTool";
|
|
|
@ -24,7 +25,7 @@ import { HardwareCompositeEntity } from "../DatabaseServices/Hardware/HardwareCo
|
|
|
|
import { HardwareTopline } from "../DatabaseServices/Hardware/HardwareTopline";
|
|
|
|
import { HardwareTopline } from "../DatabaseServices/Hardware/HardwareTopline";
|
|
|
|
import { Shape } from "../DatabaseServices/Shape";
|
|
|
|
import { Shape } from "../DatabaseServices/Shape";
|
|
|
|
import { CanDrawHoleFuzz } from "../Geometry/DrillParse/CanDrawHoleFuzz";
|
|
|
|
import { CanDrawHoleFuzz } from "../Geometry/DrillParse/CanDrawHoleFuzz";
|
|
|
|
import { IsBetweenA2B, MoveMatrix, XAxis, angle, angleTo, equaln, equalv2, equalv3, isIntersect2, isParallelTo, isPerpendicularityTo } from "../Geometry/GeUtils";
|
|
|
|
import { AsVector2, IsBetweenA2B, MoveMatrix, XAxis, angle, angleTo, equaln, equalv2, equalv3, isIntersect2, isParallelTo, isPerpendicularityTo } from "../Geometry/GeUtils";
|
|
|
|
import { BrSealedData, GetSealedBoardContour } from "../GraphicsSystem/CalcEdgeSealing";
|
|
|
|
import { BrSealedData, GetSealedBoardContour } from "../GraphicsSystem/CalcEdgeSealing";
|
|
|
|
import { FeedingToolPath, GetModelingFromCustomDrill } from "../GraphicsSystem/ToolPath/FeedingToolPath";
|
|
|
|
import { FeedingToolPath, GetModelingFromCustomDrill } from "../GraphicsSystem/ToolPath/FeedingToolPath";
|
|
|
|
import { EMetalsType, IHardwareOption, IToplineOption } from "../UI/Components/RightPanel/RightPanelInterface";
|
|
|
|
import { EMetalsType, IHardwareOption, IToplineOption } from "../UI/Components/RightPanel/RightPanelInterface";
|
|
|
@ -501,15 +502,10 @@ export namespace Production
|
|
|
|
{
|
|
|
|
{
|
|
|
|
const ArcBoardBuild = br.ArcBuild;
|
|
|
|
const ArcBoardBuild = br.ArcBuild;
|
|
|
|
ArcBoardBuild.ParseSweepCurves();
|
|
|
|
ArcBoardBuild.ParseSweepCurves();
|
|
|
|
let cus = br.SweepVisibleFace === FaceDirection.Front ? ArcBoardBuild.SweepCurves2 : ArcBoardBuild.SweepCurves1;
|
|
|
|
let cus = ArcBoardBuild.SweepCurves1;
|
|
|
|
|
|
|
|
|
|
|
|
let brBoxSize = br.Shape.Outline.Curve.Clone().ApplyMatrix(ArcBoardBuild.Rotate2OCSMtx).BoundingBox.getSize(new Vector3);
|
|
|
|
|
|
|
|
if (br.SweepAngle)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
let extrude = Board.CreateBoard(brBoxSize.y, brBoxSize.x, 1);
|
|
|
|
|
|
|
|
sealedContour = extrude.ContourCurve;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let ContourCurve = br.Shape.Outline.Curve.Clone().ApplyMatrix(ArcBoardBuild.OCS2RotateMtx) as Polyline;
|
|
|
|
|
|
|
|
let brBoxSize = ContourCurve.BoundingBox.getSize(new Vector3);
|
|
|
|
let currentLength = 0;
|
|
|
|
let currentLength = 0;
|
|
|
|
for (let cu of cus)
|
|
|
|
for (let cu of cus)
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -532,6 +528,34 @@ export namespace Production
|
|
|
|
|
|
|
|
|
|
|
|
ocs.multiply(m.setPosition(cu.StartPoint.clone().applyMatrix4(new Matrix4().makeRotationX(Math.PI / 2))));
|
|
|
|
ocs.multiply(m.setPosition(cu.StartPoint.clone().applyMatrix4(new Matrix4().makeRotationX(Math.PI / 2))));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//正面时翻转Z向量
|
|
|
|
|
|
|
|
if (br.SweepVisibleFace === FaceDirection.Front)
|
|
|
|
|
|
|
|
ocs.setPosition(new Vector3(0, 0, -br.Thickness).applyMatrix4(ocs));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 测试代码
|
|
|
|
|
|
|
|
// let pt = new Vector3().applyMatrix4(ocs);
|
|
|
|
|
|
|
|
// let l1 = new Line(pt, pt.clone().add(new Vector3().setFromMatrixColumn(ocs, 0).normalize().multiplyScalar(100)));
|
|
|
|
|
|
|
|
// let l2 = new Line(pt, pt.clone().add(new Vector3().setFromMatrixColumn(ocs, 1).normalize().multiplyScalar(100)));
|
|
|
|
|
|
|
|
// let l3 = new Line(pt, pt.clone().add(new Vector3().setFromMatrixColumn(ocs, 2).normalize().multiplyScalar(100)));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// TestDraw(new Point(pt));
|
|
|
|
|
|
|
|
// TestDraw(l1, 1);
|
|
|
|
|
|
|
|
// TestDraw(l2, 3);
|
|
|
|
|
|
|
|
// TestDraw(l3, 5);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//裁剪 计算每个分段轮廓
|
|
|
|
|
|
|
|
let length = currentLength + cu.Length;
|
|
|
|
|
|
|
|
let starKnifePls = new Polyline([{ pt: AsVector2({ x: currentLength, y: -1 }), bul: 0 }, { pt: AsVector2({ x: currentLength, y: 10000 }), bul: 0 }]);
|
|
|
|
|
|
|
|
let endKnifePls = new Polyline([{ pt: AsVector2({ x: length, y: -1 }), bul: 0 }, { pt: AsVector2({ x: length, y: 10000 }), bul: 0 }]);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//裁剪结果
|
|
|
|
|
|
|
|
let faceRegions = SplitPolyline(ContourCurve, [starKnifePls, endKnifePls]);
|
|
|
|
|
|
|
|
faceRegions = faceRegions.filter((faceRegion) =>
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
let x = faceRegion.BoundingBox.getCenter(new Vector3).x;
|
|
|
|
|
|
|
|
return x > currentLength && x < length;
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
for (let [, driss] of br.DrillList)
|
|
|
|
for (let [, driss] of br.DrillList)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
for (let dris of driss)
|
|
|
|
for (let dris of driss)
|
|
|
@ -549,11 +573,12 @@ export namespace Production
|
|
|
|
d["__CacheBrOCS__"] = ocs;
|
|
|
|
d["__CacheBrOCS__"] = ocs;
|
|
|
|
//记录分段路径的起点与原点差值
|
|
|
|
//记录分段路径的起点与原点差值
|
|
|
|
d["__CacheAddPos__"] = new Vector3(currentLength);
|
|
|
|
d["__CacheAddPos__"] = new Vector3(currentLength);
|
|
|
|
|
|
|
|
d["__CacheContour__"] = faceRegions;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
currentLength = currentLength + cu.Length;
|
|
|
|
currentLength = length;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -685,28 +710,37 @@ export namespace Production
|
|
|
|
let brNormal = br.Normal;
|
|
|
|
let brNormal = br.Normal;
|
|
|
|
let outlineWidth = br.Width;
|
|
|
|
let outlineWidth = br.Width;
|
|
|
|
let outlineHeight = br.Height;
|
|
|
|
let outlineHeight = br.Height;
|
|
|
|
|
|
|
|
let faceRegions: Polyline[];
|
|
|
|
|
|
|
|
let faceRegionsBox: Box3;
|
|
|
|
|
|
|
|
|
|
|
|
let addPos: Vector3;
|
|
|
|
let addPos: Vector3;
|
|
|
|
if (br.IsArcBoard)
|
|
|
|
if (br.IsArcBoard)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
addPos = cyHole["__CacheAddPos__"];
|
|
|
|
addPos = cyHole["__CacheAddPos__"];
|
|
|
|
|
|
|
|
faceRegions = cyHole["__CacheContour__"];
|
|
|
|
let ocs = cyHole["__CacheBrOCS__"];
|
|
|
|
let ocs = cyHole["__CacheBrOCS__"];
|
|
|
|
|
|
|
|
|
|
|
|
cyHole["__CacheAddPos__"] = undefined;
|
|
|
|
cyHole["__CacheAddPos__"] = undefined;
|
|
|
|
cyHole["__CacheBrOCS__"] = undefined;
|
|
|
|
cyHole["__CacheBrOCS__"] = undefined;
|
|
|
|
|
|
|
|
cyHole["__CacheContour__"] = undefined;
|
|
|
|
|
|
|
|
|
|
|
|
if (!ocs || !addPos)
|
|
|
|
if (!ocs || !addPos || !faceRegions?.length)
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
else
|
|
|
|
else
|
|
|
|
{
|
|
|
|
{
|
|
|
|
brInv = new Matrix4().getInverse(ocs);
|
|
|
|
brInv = new Matrix4().getInverse(ocs);
|
|
|
|
brNormal = new Vector3().setFromMatrixColumn(ocs, 2);
|
|
|
|
brNormal = new Vector3().setFromMatrixColumn(ocs, 2);
|
|
|
|
if (br.SweepAngle)
|
|
|
|
|
|
|
|
{
|
|
|
|
faceRegionsBox = new Box3();
|
|
|
|
let boxSize = outline.BoundingBox.getSize(new Vector3);
|
|
|
|
for (let pl of faceRegions)
|
|
|
|
outlineWidth = boxSize.x;
|
|
|
|
faceRegionsBox.union(pl.BoundingBox);
|
|
|
|
outlineHeight = boxSize.y;
|
|
|
|
|
|
|
|
}
|
|
|
|
let boxSize = faceRegionsBox.getSize(new Vector3);
|
|
|
|
|
|
|
|
outlineWidth = boxSize.x;
|
|
|
|
|
|
|
|
outlineHeight = boxSize.y;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let extrude = Board.CreateBoard(boxSize.y, boxSize.x, 1);
|
|
|
|
|
|
|
|
outline = extrude.ContourCurve;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -763,12 +797,39 @@ export namespace Production
|
|
|
|
let sp = position.clone().setZ(0); //真实数据
|
|
|
|
let sp = position.clone().setZ(0); //真实数据
|
|
|
|
let ep = position.clone().add(cyHole.Normal.multiplyScalar(cyHole.Height).applyMatrix4(brInvRo)).setZ(0); //真实数据
|
|
|
|
let ep = position.clone().add(cyHole.Normal.multiplyScalar(cyHole.Height).applyMatrix4(brInvRo)).setZ(0); //真实数据
|
|
|
|
let testLine = new Line(sp, ep);
|
|
|
|
let testLine = new Line(sp, ep);
|
|
|
|
let iPt = outline.IntersectWith(testLine, 0, CanDrawHoleFuzz)[0];
|
|
|
|
let iPt: Vector3;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (br.IsArcBoard)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (faceRegions?.length)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
for (let pl of faceRegions)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
pl.UpdateOCSTo(new Matrix4().setPosition(faceRegionsBox.min));
|
|
|
|
|
|
|
|
let newPl = new Polyline(pl.LineData);
|
|
|
|
|
|
|
|
iPt = newPl.IntersectWith(testLine, 0, CanDrawHoleFuzz)[0];
|
|
|
|
|
|
|
|
if (iPt)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
outline = newPl;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
InteractionLog([{ msg: "警告:" }, { msg: `板件${br.Name}`, entity: [br, cyHole] }, { msg: "侧孔与板无交点,无法加工该侧孔!" }], LogType.Warning);
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
iPt = outline.IntersectWith(testLine, 0, CanDrawHoleFuzz)[0];
|
|
|
|
|
|
|
|
|
|
|
|
if (!iPt)
|
|
|
|
if (!iPt)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
InteractionLog([{ msg: "警告:" }, { msg: `板件${br.Name}`, entity: [br, cyHole] }, { msg: "侧孔与板无交点,无法加工该侧孔!" }], LogType.Warning);
|
|
|
|
InteractionLog([{ msg: "警告:" }, { msg: `板件${br.Name}`, entity: [br, cyHole] }, { msg: "侧孔与板无交点,无法加工该侧孔!" }], LogType.Warning);
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
position = iPt.clone().setZ(z);//排钻开始的位置
|
|
|
|
position = iPt.clone().setZ(z);//排钻开始的位置
|
|
|
|
for (let p of [sp, ep])
|
|
|
|
for (let p of [sp, ep])
|
|
|
|
{
|
|
|
|
{
|
|
|
|