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