开发:补充测试用例

pull/1461/MERGE
ChenX 4 years ago
parent 8f26970124
commit 4f37d3326c

@ -0,0 +1,63 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`NFP结果错误 1`] = `
Array [
Array [
Object {
"x": -1254001,
"y": 10174000,
},
Object {
"x": -3154000,
"y": 10174000,
},
Object {
"x": -3154000,
"y": -3784000,
},
Object {
"x": 5054000,
"y": -3784000,
},
Object {
"x": 5053999,
"y": 7010000,
},
Object {
"x": 5053999,
"y": 10794000,
},
Object {
"x": 1899999,
"y": 10794000,
},
Object {
"x": -1254001,
"y": 10794000,
},
],
]
`;
exports[`NFP结果错误 2`] = `
Array [
Array [
Object {
"x": 1900000,
"y": 0,
},
Object {
"x": 0,
"y": 0,
},
Object {
"x": 0,
"y": 6390000,
},
Object {
"x": 1899999,
"y": 6390000,
},
],
]
`;

@ -0,0 +1,20 @@
import { Polyline } from "../../src/DatabaseServices/Entity/Polyline";
import { InitClipperCpp } from "../../src/Nest/Common/ClipperCpp";
import { Curves2Points } from "../../src/Nest/Converter/Curves2Points";
import { Path } from "../../src/Nest/Core/Path";
import { LoadEntityFromFileData } from "../Utils/LoadEntity.util";
test('NFP结果错误', async () =>
{
await InitClipperCpp();
let dd = { "file": [2, "Polyline", 8, 2, 120, false, 1, 10, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -1706.0998589562755, -98.9984767277852, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -2396.3998589562757, -476.89847672778524, 0, 1], 0, 2, 4, [0, 0], 0, [315.4, 0], 0, [315.4, 378.4], 0, [0, 378.4], 0, true, "Polyline", 8, 2, 121, false, 1, 5, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -1706.0998589562755, -477.39847672778524, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -2396.3998589562757, -476.89847672778524, 0, 1], 0, 2, 6, [505.3999, 1079.4], 0, [189.9999, 1079.4], 0, [189.9999, 1017.4000000000001], 0, [0, 1017.4000000000001], 0, [0, 0], 0, [505.40000000000003, 0], 0, true], "basePt": { "x": -1706.0998589562755, "y": -477.39847672778524, "z": 0 }, "ucs": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1] };
let d = dd.file;
let [pl1, pl2] = LoadEntityFromFileData(d) as [Polyline, Polyline];
let binPath = new Path(Curves2Points(pl2, false, 0)[1]);
let path = new Path(Curves2Points(pl1, true, 0)[1]);
expect(binPath.GetNFPs(path, true)).toMatchSnapshot();
expect(binPath.GetNFPs(path, false)).toMatchSnapshot();
});

@ -1,88 +1,18 @@
import { EndType, JoinType } from "js-angusj-clipper/web";
import { Matrix4 } from "three"; import { Matrix4 } from "three";
import { TestDraw } from "../../Add-on/test/TestUtil"; import { TestDraw } from "../../Add-on/test/TestUtil";
import { arrayRemoveDuplicateBySort } from "../../Common/ArrayExt"; import { arrayRemoveDuplicateBySort } from "../../Common/ArrayExt";
import { Arc } from "../../DatabaseServices/Entity/Arc";
import { Board } from "../../DatabaseServices/Entity/Board"; import { Board } from "../../DatabaseServices/Entity/Board";
import { Circle } from "../../DatabaseServices/Entity/Circle"; import { Circle } from "../../DatabaseServices/Entity/Circle";
import { Polyline } from "../../DatabaseServices/Entity/Polyline"; import { Polyline } from "../../DatabaseServices/Entity/Polyline";
import { equaln, equalv2, equalv3, polar, ZeroVec } from "../../Geometry/GeUtils"; import { equaln, equalv2, equalv3, ZeroVec } from "../../Geometry/GeUtils";
import { clipperCpp } from "../Common/ClipperCpp";
import { Point } from "../Common/Point";
import { DefaultBin } from "../Core/DefaultBin"; import { DefaultBin } from "../Core/DefaultBin";
import { GNestConfig } from "../Core/GNestConfig"; import { GNestConfig } from "../Core/GNestConfig";
import { NestCache } from "../Core/NestCache"; import { NestCache } from "../Core/NestCache";
import { Part } from "../Core/Part"; import { Part } from "../Core/Part";
import { Path, PathScale } from "../Core/Path"; import { Path } from "../Core/Path";
import { Circle2Points, CurveWrap } from "./Curves2Parts"; import { CurveWrap } from "./Curves2Parts";
import { Rotations, Polylin2Points } from "./Curves2Points";
let Rotations = [
[0, Math.PI],
[Math.PI / 2, Math.PI * 1.5],
[0, Math.PI, Math.PI / 2, Math.PI * 1.5],
];
/**
* 线
*/
export function Curves2Points(cu: Circle | Polyline, outside: boolean, knifRadius: number): [(Circle | Polyline), Point[]]
{
if (cu instanceof Circle)
return [cu.Clone(), Circle2Points(cu, knifRadius, 8, outside)];
else
return Polylin2Points(cu, outside, knifRadius);
}
export function Polylin2Points(pl: Polyline, outside: boolean, knifRadius: number): [Polyline, Point[]]
{
let pts: Point[] = [];
if (!outside) knifRadius = -knifRadius;
if (pl.IsClockWise) pl.Reverse();
for (let i = 0; i < pl.EndParam; i++)
{
pts.push(pl.GetPointAtParam(i));
let bul = pl.GetBuilgeAt(i);
if (bul !== 0)
{
let arc = pl.GetCurveAtIndex(i) as Arc;
let allAngle = arc.AllAngle;
let arcLength = arc.Length;
let minCount = Math.floor(allAngle * 4 / Math.PI);
let splitCount = Math.round(allAngle / 0.4);
if (arcLength < 300)
splitCount = Math.max(2, minCount);
else
splitCount = Math.max(arcLength / 200, splitCount, 2, minCount);
let radius = arc.Radius;
if (outside === bul > 0)
radius = radius / Math.cos(allAngle / (splitCount * 2));
let cp = arc.Center;
for (let j = 0.5; j < splitCount; j++)
{
let a = arc.GetAngleAtParam(j * (1 / splitCount));
let p = polar(cp.clone(), a, radius);
pts.push(p);
}
}
}
if (knifRadius !== 0)
{
pts = clipperCpp.lib.offsetToPaths({
delta: knifRadius * 1e4,
offsetInputs: [{ data: PathScale(pts, 1e4), joinType: JoinType.Miter, endType: EndType.ClosedPolygon }]
})[0];
PathScale(pts, 1e-4);
}
return [pl, pts];
}
export function ConverBoard2Part(board: Board, knifRadius = 3.5): Part export function ConverBoard2Part(board: Board, knifRadius = 3.5): Part
{ {
@ -99,6 +29,7 @@ export function ConverBoard2Part(board: Board, knifRadius = 3.5): Part
path = NestCache.CreatePath(board.Width, board.Height, knifRadius); path = NestCache.CreatePath(board.Width, board.Height, knifRadius);
part.Init2(path, DefaultBin, Rotations[board.BoardProcessOption.lines]); part.Init2(path, DefaultBin, Rotations[board.BoardProcessOption.lines]);
} }
else else
{ {
if (contour instanceof Polyline && GNestConfig.UseOffsetSimplify) if (contour instanceof Polyline && GNestConfig.UseOffsetSimplify)
@ -142,7 +73,6 @@ export function ConverBoard2Part(board: Board, knifRadius = 3.5): Part
} }
//如果要强制设置旋转状态,来测试代码,需要在这里添加代码,从而保证零件的内部网洞也是正确的! //如果要强制设置旋转状态,来测试代码,需要在这里添加代码,从而保证零件的内部网洞也是正确的!
for (let m of board.BoardModeling) for (let m of board.BoardModeling)
{ {
if (equaln(m.thickness, board.Thickness)) if (equaln(m.thickness, board.Thickness))

@ -1,6 +1,6 @@
import { EndType, JoinType } from "js-angusj-clipper/web"; import { EndType, JoinType } from "js-angusj-clipper/web";
import { Box3, Vector3 } from "three"; import { Box3, Vector3 } from "three";
import { app } from "../../ApplicationServices/Application"; import { Log } from "../../Common/Log";
import { Circle } from "../../DatabaseServices/Entity/Circle"; import { Circle } from "../../DatabaseServices/Entity/Circle";
import { Curve } from "../../DatabaseServices/Entity/Curve"; import { Curve } from "../../DatabaseServices/Entity/Curve";
import { Polyline } from "../../DatabaseServices/Entity/Polyline"; import { Polyline } from "../../DatabaseServices/Entity/Polyline";
@ -9,7 +9,7 @@ import { clipperCpp } from "../Common/ClipperCpp";
import { Point } from "../Common/Point"; import { Point } from "../Common/Point";
import { Part } from "../Core/Part"; import { Part } from "../Core/Part";
import { Path, PathScale } from "../Core/Path"; import { Path, PathScale } from "../Core/Path";
import { Polylin2Points } from "./ConverBoard2Part"; import { Polylin2Points } from "./Curves2Points";
import { Path2Polyline } from "./Path2Polyline"; import { Path2Polyline } from "./Path2Polyline";
import { IOffset, SimplifyDouglasPeucker } from "./Simplify2"; import { IOffset, SimplifyDouglasPeucker } from "./Simplify2";
@ -204,7 +204,7 @@ export function Curves2Parts(curves: (Polyline | Circle)[], binPath: Path, KnifR
} }
catch (error) catch (error)
{ {
app.Editor.Prompt("曲线转零件失败!"); Log("曲线转零件失败!");
} }
} }
return parts; return parts;

@ -0,0 +1,77 @@
import { EndType, JoinType } from "js-angusj-clipper/web";
import { Arc } from "../../DatabaseServices/Entity/Arc";
import { Circle } from "../../DatabaseServices/Entity/Circle";
import { Polyline } from "../../DatabaseServices/Entity/Polyline";
import { polar } from "../../Geometry/GeUtils";
import { clipperCpp } from "../Common/ClipperCpp";
import { Point } from "../Common/Point";
import { PathScale } from "../Core/Path";
import { Circle2Points } from "./Curves2Parts";
export let Rotations = [
[0, Math.PI],
[Math.PI / 2, Math.PI * 1.5],
[0, Math.PI, Math.PI / 2, Math.PI * 1.5],
];
/**
* 线
*/
export function Curves2Points(cu: Circle | Polyline, outside: boolean, knifRadius: number): [(Circle | Polyline), Point[]]
{
if (cu instanceof Circle)
return [cu.Clone(), Circle2Points(cu, knifRadius, 8, outside)];
else
return Polylin2Points(cu, outside, knifRadius);
}
export function Polylin2Points(pl: Polyline, outside: boolean, knifRadius: number): [Polyline, Point[]]
{
let pts: Point[] = [];
if (!outside) knifRadius = -knifRadius;
if (pl.IsClockWise) pl.Reverse();
for (let i = 0; i < pl.EndParam; i++)
{
pts.push(pl.GetPointAtParam(i));
let bul = pl.GetBuilgeAt(i);
if (bul !== 0)
{
let arc = pl.GetCurveAtIndex(i) as Arc;
let allAngle = arc.AllAngle;
let arcLength = arc.Length;
let minCount = Math.floor(allAngle * 4 / Math.PI);
let splitCount = Math.round(allAngle / 0.4);
if (arcLength < 300)
splitCount = Math.max(2, minCount);
else
splitCount = Math.max(arcLength / 200, splitCount, 2, minCount);
let radius = arc.Radius;
if (outside === bul > 0)
radius = radius / Math.cos(allAngle / (splitCount * 2));
let cp = arc.Center;
for (let j = 0.5; j < splitCount; j++)
{
let a = arc.GetAngleAtParam(j * (1 / splitCount));
let p = polar(cp.clone(), a, radius);
pts.push(p);
}
}
}
if (knifRadius !== 0)
{
pts = clipperCpp.lib.offsetToPaths({
delta: knifRadius * 1e4,
offsetInputs: [{ data: PathScale(pts, 1e4), joinType: JoinType.Miter, endType: EndType.ClosedPolygon }]
})[0];
PathScale(pts, 1e-4);
}
return [pl, pts];
}

@ -4,7 +4,7 @@ import { Circle } from "../../DatabaseServices/Entity/Circle";
import { Polyline } from "../../DatabaseServices/Entity/Polyline"; import { Polyline } from "../../DatabaseServices/Entity/Polyline";
import { Command } from "../../Editor/CommandMachine"; import { Command } from "../../Editor/CommandMachine";
import { PromptStatus } from "../../Editor/PromptResult"; import { PromptStatus } from "../../Editor/PromptResult";
import { Curves2Points } from "../Converter/ConverBoard2Part"; import { Curves2Points } from "../Converter/Curves2Points";
import { Path2Polyline } from "../Converter/Path2Polyline"; import { Path2Polyline } from "../Converter/Path2Polyline";
import { Path, PathScale } from "../Core/Path"; import { Path, PathScale } from "../Core/Path";
import { InitClipperCpp } from "../Common/ClipperCpp"; import { InitClipperCpp } from "../Common/ClipperCpp";

@ -6,9 +6,8 @@ import { Command } from "../../Editor/CommandMachine";
import { PromptStatus } from "../../Editor/PromptResult"; import { PromptStatus } from "../../Editor/PromptResult";
import { AsVector3 } from "../../Geometry/GeUtils"; import { AsVector3 } from "../../Geometry/GeUtils";
import { clipperCpp, InitClipperCpp } from "../Common/ClipperCpp"; import { clipperCpp, InitClipperCpp } from "../Common/ClipperCpp";
import { Curves2Points } from "../Converter/ConverBoard2Part"; import { Curves2Points } from "../Converter/Curves2Points";
import { Path2Polyline } from "../Converter/Path2Polyline"; import { Path2Polyline } from "../Converter/Path2Polyline";
import { NestCache } from "../Core/NestCache";
import { Path, PathScale } from "../Core/Path"; import { Path, PathScale } from "../Core/Path";
export class Command_TestSum implements Command export class Command_TestSum implements Command

Loading…
Cancel
Save