mirror of https://gitee.com/cf-fz/WebCAD.git
!2678 修复:使用旋转的曲线创建圆弧板时,见光面设置不正确 fix #I9G1JD
parent
c92f902299
commit
0987292ba8
@ -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;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in new issue