!1946 功能:修复走刀错误

pull/1947/MERGE
ChenX 2 years ago
parent 1298b3ae47
commit fe38734839

@ -1,23 +1,6 @@
import { Board } from "../../src/DatabaseServices/Entity/Board";
import { FeedingToolPath } from "../../src/GraphicsSystem/ToolPath/FeedingToolPath";
import { LoadBoardsFromFileData } from "../Utils/LoadEntity.util";
import "../Utils/jest.util";
function testPathCount(br: Board, count?: number)
{
let cus = feedUtil.TestCalcPath(br);
if (count !== undefined)
expect(cus.length).toBe(count);
else
expect(cus.length).toBeGreaterThan(0);
let pathCount = cus.length;
expect(pathCount < 0 ? 0 : pathCount).toMatchSnapshot("走刀数量");
for (let cu of cus)
{
expect(cu.Length).toMatchNumberSnapshot();
}
}
let feedUtil = FeedingToolPath.GetInstance() as FeedingToolPath;
import { LoadBoardsFromFileData } from "../Utils/LoadEntity.util";
import { testPathCount } from "./testPathCount";
test("通孔造型测试", () =>
{

@ -0,0 +1,139 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`千年舟 绿色健康之家 1`] = `"4025.02530"`;
exports[`千年舟 绿色健康之家 2`] = `"22.43756"`;
exports[`千年舟 绿色健康之家 3`] = `"279.92939"`;
exports[`千年舟 绿色健康之家 4`] = `"21.81857"`;
exports[`千年舟 绿色健康之家 5`] = `"0.89853"`;
exports[`千年舟 绿色健康之家 6`] = `"22.49977"`;
exports[`千年舟 绿色健康之家 7`] = `"40.59687"`;
exports[`千年舟 绿色健康之家 8`] = `"9.14740"`;
exports[`千年舟 绿色健康之家 9`] = `"9.63364"`;
exports[`千年舟 绿色健康之家 10`] = `"39.01048"`;
exports[`千年舟 绿色健康之家 11`] = `"987.37147"`;
exports[`千年舟 绿色健康之家 12`] = `"907.76231"`;
exports[`千年舟 绿色健康之家 13`] = `"245.68711"`;
exports[`千年舟 绿色健康之家 14`] = `"182.27407"`;
exports[`千年舟 绿色健康之家 15`] = `"1415.78974"`;
exports[`千年舟 绿色健康之家 16`] = `"3.99369"`;
exports[`千年舟 绿色健康之家 17`] = `"43.11917"`;
exports[`千年舟 绿色健康之家 18`] = `"67.27362"`;
exports[`千年舟 绿色健康之家 19`] = `"67.27362"`;
exports[`千年舟 绿色健康之家 20`] = `"100.99488"`;
exports[`千年舟 绿色健康之家 21`] = `"100.99488"`;
exports[`千年舟 绿色健康之家 22`] = `"199.67167"`;
exports[`千年舟 绿色健康之家 23`] = `"21.05817"`;
exports[`千年舟 绿色健康之家 24`] = `"37.09227"`;
exports[`千年舟 绿色健康之家 25`] = `"96.66910"`;
exports[`千年舟 绿色健康之家 26`] = `"8.44452"`;
exports[`千年舟 绿色健康之家 27`] = `"226.82698"`;
exports[`千年舟 绿色健康之家 28`] = `"74.67588"`;
exports[`千年舟 绿色健康之家 29`] = `"90.21473"`;
exports[`千年舟 绿色健康之家 30`] = `"323.35879"`;
exports[`千年舟 绿色健康之家 31`] = `"82.71939"`;
exports[`千年舟 绿色健康之家 32`] = `"22.67813"`;
exports[`千年舟 绿色健康之家 33`] = `"34.73428"`;
exports[`千年舟 绿色健康之家 34`] = `"205.46593"`;
exports[`千年舟 绿色健康之家 35`] = `"32.81960"`;
exports[`千年舟 绿色健康之家 36`] = `"41.41507"`;
exports[`千年舟 绿色健康之家 37`] = `"56.57735"`;
exports[`千年舟 绿色健康之家 38`] = `"83.38629"`;
exports[`千年舟 绿色健康之家 39`] = `"17.95711"`;
exports[`千年舟 绿色健康之家 40`] = `"131.88390"`;
exports[`千年舟 绿色健康之家 41`] = `"262.71632"`;
exports[`千年舟 绿色健康之家 42`] = `"98.14739"`;
exports[`千年舟 绿色健康之家 43`] = `"127.53520"`;
exports[`千年舟 绿色健康之家 44`] = `"130.77685"`;
exports[`千年舟 绿色健康之家 45`] = `"112.29087"`;
exports[`千年舟 绿色健康之家 46`] = `"141.29953"`;
exports[`千年舟 绿色健康之家 47`] = `"21.01284"`;
exports[`千年舟 绿色健康之家 48`] = `"112.26503"`;
exports[`千年舟 绿色健康之家 49`] = `"16.97143"`;
exports[`千年舟 绿色健康之家 50`] = `"7.59415"`;
exports[`千年舟 绿色健康之家 51`] = `"15.50670"`;
exports[`千年舟 绿色健康之家 52`] = `"9.07080"`;
exports[`千年舟 绿色健康之家 53`] = `"4.09809"`;
exports[`千年舟 绿色健康之家 54`] = `"8.56839"`;
exports[`千年舟 绿色健康之家 55`] = `"159.22731"`;
exports[`千年舟 绿色健康之家 56`] = `"97.05028"`;
exports[`千年舟 绿色健康之家 57`] = `"205.78393"`;
exports[`千年舟 绿色健康之家 58`] = `"162.97240"`;
exports[`千年舟 绿色健康之家 59`] = `"24.62912"`;
exports[`千年舟 绿色健康之家 60`] = `"21.71980"`;
exports[`千年舟 绿色健康之家 61`] = `"16.46115"`;
exports[`千年舟 绿色健康之家 62`] = `"32.78329"`;
exports[`千年舟 绿色健康之家 63`] = `"89.01490"`;
exports[`千年舟 绿色健康之家 64`] = `"7.49981"`;
exports[`千年舟 绿色健康之家 65`] = `"7.48459"`;
exports[`千年舟 绿色健康之家 66`] = `"98.15574"`;
exports[`千年舟 绿色健康之家 67`] = `"233.54901"`;
exports[`千年舟 绿色健康之家 68`] = `"2.51054"`;
exports[`千年舟 绿色健康之家: 走刀数量 1`] = `68`;

File diff suppressed because one or more lines are too long

@ -0,0 +1,13 @@
import { FeedingToolPath } from "../../src/GraphicsSystem/ToolPath/FeedingToolPath";
import "../Utils/jest.util";
import { LoadBoardsFromFileData } from "../Utils/LoadEntity.util";
import { testPathCount } from "./testPathCount";
export let feedUtil = FeedingToolPath.GetInstance() as FeedingToolPath;
test("千年舟 绿色健康之家", () =>
{
let data = require("./board.json");
let brs = LoadBoardsFromFileData(data);
testPathCount(brs[0]);
});

@ -0,0 +1,18 @@
import { Board } from "../../src/DatabaseServices/Entity/Board";
import { FeedingToolPath } from "../../src/GraphicsSystem/ToolPath/FeedingToolPath";
export let feedUtil = FeedingToolPath.GetInstance() as FeedingToolPath;
export function testPathCount(br: Board, count?: number)
{
let cus = feedUtil.TestCalcPath(br);
if (count !== undefined)
expect(cus.length).toBe(count);
else
expect(cus.length).toBeGreaterThan(0);
let pathCount = cus.length;
expect(pathCount < 0 ? 0 : pathCount).toMatchSnapshot("走刀数量");
for (let cu of cus)
{
expect(cu.Length).toMatchNumberSnapshot();
}
}

@ -36,13 +36,12 @@ export class FeedingToolPath extends Singleton
* @param knifRadius /
* @param [isOut=true] ,,,线
*/
private HandleShape(shape: Shape, knifRadius: number, isOut = true): Curve[]
private HandleShape(shape: Shape, knifRadius: number, isOut: boolean): Curve[]
{
let outline = shape.Outline.Curve;
if (isOut)
outline = outline.Clone();
let dir = GetCurveToInDir(outline);
let offsetCus: Curve[] = [outline];
@ -99,6 +98,7 @@ export class FeedingToolPath extends Singleton
}
if (retCus.length === 0) break;
//是否和孤岛相交
let isInt = false;
for (let c of retCus)
@ -132,8 +132,13 @@ export class FeedingToolPath extends Singleton
break;
}
}
let vailHoles: Contour[] = [];
//内偏(走刀方式)
let outlineOffsetCusOfTool = GetOffsetCurves(outline, dir * knifRadius).filter(c => c.IsClose) as Curve[];
let maxArea = Math.max(...(outlineOffsetCusOfTool.map(c => c.Area)));
for (let i = 0; i < holes.length; i++)
{
let h = holes[i];
@ -144,28 +149,25 @@ export class FeedingToolPath extends Singleton
//若最外轮廓内偏移一个刀半径的曲线 和最内轮廓相交或者被包含,则去掉.且不与洞曲线相等
if (isOut)
{
let outlineOffsetCus = outline.GetOffsetCurves(dir * knifRadius).filter(c => c.IsClose) as Curve[];
let outlineCus = GetOffsetCurves(outline, dir * knifRadius).filter(c => c.IsClose) as Curve[];;
let ho = holeOffsetCus[i];
let maxArea = Math.max(...(outlineOffsetCus.map(c => c.Area)));
for (let j = 0; j < outlineOffsetCus.length; j++)
let holeOffsetCurve = holeOffsetCus[i];//网洞走刀曲线
for (let j = 0; j < outlineOffsetCusOfTool.length; j++)
{
let c = outlineOffsetCus[j];
if (h.Curve.IntersectWith(outlineCus[j], 0).length > 0)
let outlineCurveOffsetInside = outlineOffsetCusOfTool[j];
if (h.Curve.IntersectWith(outlineCurveOffsetInside, 0).length > 0)
{
if (!(equalCurve(ho, c) || isTargetCurInOrOnSourceCur(c as Polyline, h.Curve)))
if (!(equalCurve(holeOffsetCurve, outlineCurveOffsetInside) || isTargetCurInOrOnSourceCur(outlineCurveOffsetInside as Polyline, h.Curve)))
{
isVail = false;
break;
}
else if (isTargetCurInOrOnSourceCur(h.Curve, c as Polyline))
else if (isTargetCurInOrOnSourceCur(h.Curve, outlineCurveOffsetInside as Polyline))
{
offsetCus.push(c);
offsetCus.push(outlineCurveOffsetInside);
isVail = false;
break;
}
}
else if (ho.Area > maxArea)
else if (holeOffsetCurve.Area > maxArea)
{
isVail = false;
break;
@ -179,6 +181,7 @@ export class FeedingToolPath extends Singleton
offsetCus.push(...vailHoles.map(h => h.Curve));
return offsetCus;
}
/**用于测试走刀路径 */
TestCalcPath(br: Board, isCd = false)
{
@ -198,6 +201,7 @@ export class FeedingToolPath extends Singleton
return this.CalcPath(modelings, br);
}
/**
*
*/
@ -210,11 +214,13 @@ export class FeedingToolPath extends Singleton
}
return cus;
}
GetModelFeedPath(br: { Thickness: number, ContourCurve: ExtrudeContourCurve; }, m: IModeling): Curve[]
//获取造型走刀
GetModelFeedPath(br: { Thickness: number, ContourCurve: ExtrudeContourCurve; }, modeling: IModeling): Curve[]
{
const brThickness = br.Thickness;
let cus: Curve[] = [];
let { shape, thickness, knifeRadius, addLen, addWidth, addDepth } = m;
let { shape, thickness, knifeRadius, addLen, addWidth, addDepth } = modeling;
if (!knifeRadius) knifeRadius = 3;
if (addDepth)
thickness += addDepth;
@ -226,7 +232,7 @@ export class FeedingToolPath extends Singleton
//造型半径和刀半径相等,返回重合点的线
let outline = shape.Outline.Curve;
if (outline instanceof Circle && equaln(outline.Radius, m.knifeRadius))
if (outline instanceof Circle && equaln(outline.Radius, modeling.knifeRadius))
return [new Polyline([{ pt: AsVector2(outline.Center), bul: 0 }, { pt: AsVector2(outline.Center), bul: 0 }])];
if (thickness >= brThickness)
@ -251,7 +257,7 @@ export class FeedingToolPath extends Singleton
}
else
{
let offsetCus = this.HandleShape(shape, knifeRadius);
let offsetCus = this.HandleShape(shape, knifeRadius, true);
if (offsetCus.length > 1)
cus.push(...OptimizeToolPath(offsetCus, shape, knifeRadius));
}
@ -283,6 +289,13 @@ export class FeedingToolPath extends Singleton
}
}
}
/**
*
* @param cus
* @param retCus 线
* @returns
*/
private GetContours(cus: (Polyline | Circle)[], retCus: Curve[])
{
let cons: Contour[] = [];
@ -317,11 +330,11 @@ export class FeedingToolPath extends Singleton
retCus.push(c);
}
}
}
}
return cons;
}
CheckModeling(br: Board)
{
let errorIndexs: number[] = [];

@ -18,7 +18,7 @@ import { AsVector2, AsVector3, ComparePointFnGenerate, equaln, equalv3 } from ".
*/
export function OptimizeToolPath(offsetCus: Curve[], originShape: Shape, rad: number): Curve[]
{
// 去掉最外轮廓
//去掉最外轮廓
let outline = offsetCus.shift();
let plList: Polyline[] = [];

Loading…
Cancel
Save