!2678 修复:使用旋转的曲线创建圆弧板时,见光面设置不正确 fix #I9G1JD

pull/2673/MERGE
ChenX 6 months ago
parent c92f902299
commit 0987292ba8

@ -10,7 +10,7 @@ import { Command } from "../../Editor/CommandMachine";
import { JigUtils } from "../../Editor/JigUtils";
import { PromptStatus } from "../../Editor/PromptResult";
import { UCSUtils } from "../../Editor/UCSRAII";
import { ZeroVec, equaln, equalv3, isPerpendicularityTo } from "../../Geometry/GeUtils";
import { ZAxis, ZeroVec, equaln, equalv3, isPerpendicularityTo } from "../../Geometry/GeUtils";
import { HotCMD } from "../../Hot/HotCommand";
import { BoardModal } from "../../UI/Components/Board/BoardModal";
import { BoardModalType } from "../../UI/Components/Board/BoardModalType";
@ -123,7 +123,7 @@ export async function DrawArcBoard(path1: Polyline)
//见光面方向
let fdir = GetPointAtCurveDir(path1, faceRes.Point);
let backPath: Polyline;
let backPath: Polyline;//背面路径
let brWidth: number;
//如果见光面方向等于偏移方向 则使用path1 作为背面路径
@ -218,7 +218,7 @@ export async function DrawArcBoard(path1: Polyline)
if (isRev)
{
let dir = FaceDirection.Front;
if (backPath === path1)
if (backPath === path1)//如果选择的曲线是背面路径的话
{
path = path2.Clone();
@ -271,6 +271,7 @@ export function Path2BoardPath(br: Board, path: Polyline): [number, boolean]
let bry = new Vector3().setFromMatrixColumn(br.OCSNoClone, 1);
let brZ = new Vector3().setFromMatrixColumn(br.OCSNoClone, 2);
//垂直向量
if (isPerpendicularityTo(brNormal, pathNormal))
{
//构建矩阵(默认良好的情况下的变换矩阵)
@ -307,8 +308,6 @@ export function Path2BoardPath(br: Board, path: Polyline): [number, boolean]
let mtxInv = new Matrix4().getInverse(mtx);
path.ApplyMatrix(mtxInv);
// path.Move(path.BoundingBox.min.negate());
let isReverse = false;
if (path.StartPoint.x > path.EndPoint.x)
// if (path.GetFirstDeriv(0).x < 0)
@ -317,6 +316,10 @@ export function Path2BoardPath(br: Board, path: Polyline): [number, boolean]
isReverse = true;
}
//TODO:可能还需要考虑镜像
if (equalv3(path.Normal, ZAxis, 1e-3))//#I9G1JD
isReverse = !isReverse;
path.Move(path.StartPoint.negate());
let { pts, buls } = path.MatrixAlignTo2(new Matrix4);
@ -349,6 +352,9 @@ export function Path2BoardPath(br: Board, path: Polyline): [number, boolean]
}
else
path.Move(sp.negate());
isReverse = !isReverse;
let { pts, buls } = path.MatrixAlignTo2(new Matrix4);
path.OCSNoClone.identity();
for (let i = 0; i < path.LineData.length; i++)

@ -1,104 +1,10 @@
import { Matrix4, Vector3 } from "three";
import { app } from "../../ApplicationServices/Application";
import { Board } from "../../DatabaseServices/Entity/Board";
import { Point } from "../../DatabaseServices/Entity/Point";
import { Polyline } from "../../DatabaseServices/Entity/Polyline";
import { Command } from "../../Editor/CommandMachine";
import { PromptStatus } from "../../Editor/PromptResult";
import { equaln, isPerpendicularityTo } from "../../Geometry/GeUtils";
import { HotCMD } from "../../Hot/HotCommand";
import { TestDraw } from "../test/TestUtil";
@HotCMD
export class Test implements Command
{
async exec()
{
let enRes = await app.Editor.GetEntity({ Filter: { filterTypes: [Board] } });
if (enRes.Status !== PromptStatus.OK) return;
let pl = enRes.Entity as Board;
let pts = pl.GetStretchPoints();
for (let p of pts)
TestDraw(new Point(p));
TestDraw(pl.GetSweepPathInWCS());
}
}
//like ExtrudeApplyContour
export function Path2BoardPath(br: Board, path: Polyline): number
{
let brNormal = br.Normal;
let pathNormal = path.Normal;
let bry = new Vector3().setFromMatrixColumn(br.OCSNoClone, 1);
let brZ = new Vector3().setFromMatrixColumn(br.OCSNoClone, 2);
if (isPerpendicularityTo(brNormal, pathNormal))
{
//构建矩阵(默认良好的情况下的变换矩阵)
let y = brZ;//非常确认(1)
let z = pathNormal;
let x = new Vector3().crossVectors(y, z);
//有利于方向正确性
let tempX = x.clone().transformDirection(br.OCSInv);
let angle = 0;
if (equaln(tempX.x, 0))
{
if (tempX.y < 0) x.negate();
angle = Math.PI / 2;
}
else
{
if (tempX.x < 0)
{
x.negate();
tempX.negate();
}
angle = Math.atan2(tempX.y, tempX.x);
}
z.crossVectors(x, y);
let mtx = new Matrix4().makeBasis(x, y, z);
// TestDraw(new Line(new Vector3, new Vector3(100)).ApplyMatrix(mtx.clone().setPosition(path.StartPoint)), 1);
// TestDraw(new Line(new Vector3, new Vector3(0, 100)).ApplyMatrix(mtx.clone().setPosition(path.StartPoint)), 2);
// TestDraw(new Line(new Vector3, new Vector3(0, 0, 100)).ApplyMatrix(mtx.clone().setPosition(path.StartPoint)), 3);
let mtxInv = new Matrix4().getInverse(mtx);
path.ApplyMatrix(mtxInv);
// path.Move(path.BoundingBox.min.negate());
if (path.StartPoint.x > path.EndPoint.x)
path.Reverse();
path.Move(path.StartPoint.negate());
let { pts, buls } = path.MatrixAlignTo2(new Matrix4);
path.OCSNoClone.identity();
for (let i = 0; i < path.LineData.length; i++)
{
path.LineData[i].pt.copy(pts[i]);
path.LineData[i].bul = buls[i];
}
// let brX = new Vector3().setFromMatrixColumn(br.OCSNoClone, 0);
// let mtx1 = new Matrix4().makeBasis(brX, brZ, bry.negate()).setPosition(br.Position);
// TestDraw(path.Clone().ApplyMatrix(mtx1));
// let mtx1 = new Matrix4().makeBasis(XAxis, ZAxis, YAxisN);
// TestDraw(path.Clone().ApplyMatrix(mtx1));
return angle;
}
else
{
path.ApplyMatrix(path.OCSInv);
path.Move(path.StartPoint.negate());
return 0;
}
}

@ -780,6 +780,8 @@ export class BoardConfigModal extends React.Component<BoardConfigProps, {}>
app.Viewer.ZoomAll();
}, "提取三维刀路");
};
//提取圆弧板曲线
PickUpCurveOutline = async () =>
{
await app.Editor.ModalManage.EndExecingCmd();

Loading…
Cancel
Save