mirror of https://gitee.com/cf-fz/WebCAD.git
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();
|
||||
});
|
@ -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];
|
||||
}
|
Loading…
Reference in new issue