修复:切割失败

pull/1841/head
ChenX 3 years ago
parent 4762bd6d78
commit 1aa5efe63a

@ -174,3 +174,17 @@ test('板件切割因为csg计算错误导致的切割错误', () =>
expect(b.Volume).toMatchNumberSnapshot(); expect(b.Volume).toMatchNumberSnapshot();
} }
}); });
test('因为csg盒子缓存导致切割失败', () =>
{
let d =
{ "file": [3, "Board", 8, 2, 102, false, 1, 3, 0, [1, 0, 0, 0, 0, -7.320510347335801e-8, -0.9999999999999973, 0, 0, 0.9999999999999973, -7.320510347335801e-8, 0, 409.24927297668046, 407.2280547332194, 1479.0000010248652, 1], 0, 0, true, [1, 0, 0, 0, 0, -7.320510347335801e-8, -0.9999999999999973, 0, 0, 0.9999999999999973, -7.320510347335801e-8, 0, 409.24927297668046, 407.2280547332194, 1479.0000010248652, 1], 0, 3, 697, 772, 10, true, "Polyline", 8, 2, 0, false, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 2, 4, [0, 0], 0, [0, 697], 0, [772, 697], 0, [772, 0], 0, true, 0, 3, 1, 1, 1, 0, 0, 10, 2, "9mm背板竖纹", "未命名", "通用-标准柜", "", "紫竹金丝-颗粒", "", 0, 0, "无效配置", 2, 4, 0, 0, 0, 0, "0", "0", "0", "0", "", "", "", 4, null, null, null, null, true, true, 0, 0, 0, 0, 0, 0, 0, 0, true, 0, 0, "Board", 8, 2, 100, false, 1, 11, 0, [-7.320510347335801e-8, -0.9999999999999973, 0, 0, -7.320510347335781e-8, 5.358987174545053e-15, -0.9999999999999973, 0, 0.9999999999999947, -7.320510347335781e-8, -7.320510347335801e-8, 0, 1177.2493689766807, 437.2280244986586, 2200.000001317686, 1], 0, 0, true, [-7.320510347335801e-8, -0.9999999999999973, 0, 0, -7.320510347335781e-8, 5.358987174545053e-15, -0.9999999999999973, 0, 0.9999999999999947, -7.320510347335781e-8, -7.320510347335801e-8, 0, 1177.2493689766807, 437.2280244986586, 2200.000001317686, 1], 0, 3, 2200, 475.70001220703125, 18, true, "Polyline", 8, 2, 0, false, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 2, 4, [0, 0], 0, [0, 2200], 0, [475.70001220703125, 2200], 0, [475.70001220703125, 0], 0, true, 0, 3, 1, 1, 1, 0, 0, 10, 1, "侧板(侧包顶底)", "未命名", "通用-标准柜", "", "紫竹金丝-颗粒", "", 0, 0, "无效配置", 2, 4, 1, 1, 1, 1, "1", "1", "1", "1", "", "", "", 4, "不排", "不排", "不排", "不排", true, true, 0, 0, 0, 0, 0, 0, 0, 0, true, 0, 0, "Board", 8, 2, 101, false, 1, 2, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 413.24927297668046, -36.471975766780574, 768.0000006588398, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 413.24927297668046, -36.471975766780574, 768.0000006588398, 1], 0, 3, 473.70001220703125, 764, 18, true, "Polyline", 8, 2, 0, false, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 2, 4, [0, 0], 0, [0, 473.70001220703125], 0, [764, 473.70001220703125], 0, [764, 0], 0, true, 0, 3, 1, 1, 1, 0, 0, 10, 0, "层板", "未命名", "通用-标准柜", "", "紫竹金丝-颗粒", "", 1, 1, "**多种**", 2, 4, 1, 1, 1, 1, "1", "1", "1", "1", "", "", "", 4, "三合一", "不排", "三合一", "不排", true, true, 0, 0, 0, 0, 0, 0, 0, 0, true, 0, 0], "basePt": { "x": 409.24927297668046, "y": -38.47198902606323, "z": 0 }, "ucs": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1] };
let [br0, br1, br2] = LoadBoardsFromFileData(d) as Board[];
br1.Subtract([br0]);
br2.Subtract([br0]);
expect(br2.Grooves.length).toBe(1);
});

@ -1,3 +1,4 @@
import geom3 from "@jscad/modeling/src/geometries/geom3";
import { Geom3 } from "@jscad/modeling/src/geometries/types"; import { Geom3 } from "@jscad/modeling/src/geometries/types";
import { Mat4 } from "@jscad/modeling/src/maths/mat4"; import { Mat4 } from "@jscad/modeling/src/maths/mat4";
import { Vec3 } from "@jscad/modeling/src/maths/vec3"; import { Vec3 } from "@jscad/modeling/src/maths/vec3";
@ -14,20 +15,9 @@ export interface Geom3Res
export function CSGIntersect(csg1: Geom3, csg2: Geom3, csg2tranfrom: Matrix4): Geom3Res export function CSGIntersect(csg1: Geom3, csg2: Geom3, csg2tranfrom: Matrix4): Geom3Res
{ {
let bak1 = csg1.polygons; //因为内部使用geom3进行box cache 所以我们新建了一个geom3 避免被cache导致错误
let bak2 = csg2.polygons; let csg1Clone = geom3.create(csg1.polygons.concat());
let csg2Clone = geom3.create(csg2.polygons.concat());
let bakMtx = csg2.transforms; csg2Clone.transforms = csg2tranfrom.elements as Mat4;
return intersect(csg1Clone, csg2Clone) as unknown as Geom3Res;
csg2.transforms = csg2tranfrom.elements as Mat4;
csg1.polygons = bak1.concat();
csg2.polygons = bak2.concat();
let res = intersect(csg1, csg2) as unknown as Geom3Res;
csg1.polygons = bak1;
csg2.polygons = bak2;
csg2.transforms = bakMtx;
return res;
} }

Loading…
Cancel
Save