From c2cae6b40ffcfee1210f342338abb5a09f97e904 Mon Sep 17 00:00:00 2001 From: Val Erastov Date: Tue, 26 Dec 2017 22:33:30 -0700 Subject: [PATCH] improve loop invalidation --- web/app/brep/operations/boolean.js | 39 ++++++++++++------------------ 1 file changed, 15 insertions(+), 24 deletions(-) diff --git a/web/app/brep/operations/boolean.js b/web/app/brep/operations/boolean.js index 67354c66..b582a865 100644 --- a/web/app/brep/operations/boolean.js +++ b/web/app/brep/operations/boolean.js @@ -114,24 +114,17 @@ export function BooleanAlgorithm( shellA, shellB, type ) { faceData.detectedLoops = detectLoops(faceData.face.surface, faceData); } - let detectedLoops = new Set(); for (let faceData of facesData) { for (let loop of faceData.detectedLoops) { loop.link(); - detectedLoops.add(loop); } } - let [invalidLoops, invalidEdges] = invalidateLoops(detectedLoops); - - if (invalidEdges.size !== 0) { - throw new CadError('BOOLEAN_INVALID_RESULT', {code: 'MALFORMED_EDGES', payload: Array.from(invalidEdges)}); - } + removeInvalidLoops(facesData); let faces = []; for (let faceData of facesData) { - // faceData.detectedLoops = faceData.detectedLoops.filter(l => !invalidLoops.has(l)); loopsToFaces(faceData.face, faceData.detectedLoops, faces); } @@ -152,6 +145,20 @@ export function BooleanAlgorithm( shellA, shellB, type ) { return result; } +function removeInvalidLoops(facesData) { + let detectedLoopsSet = new Set(); + for (let faceData of facesData) { + for (let loop of faceData.detectedLoops) { + detectedLoopsSet.add(loop); + } + } + + for (let faceData of facesData) { + faceData.detectedLoops = faceData.detectedLoops.filter( + loop => loop.halfEdges.find(e => !detectedLoopsSet.has(e.twin().loop)) === undefined); + } +} + function replaceMergedFaces(facesData, mergedFaces) { filterInPlace(facesData, ({face}) => mergedFaces.find(({originFaces}) => originFaces.indexOf(face) > -1) === undefined @@ -617,22 +624,6 @@ function traverseFaces(face, callback) { } } -function invalidateLoops(resultLoops) { - // __DEBUG__.Clear(); - const invalidLoops = new Set(); - const invalidEdges = new Set(); - for (let loop of resultLoops) { - // __DEBUG__.AddLoop(loop); - for (let e of loop.halfEdges) { - if (!resultLoops.has(e.twin().loop)) { - invalidLoops.add(loop); - invalidEdges.add(e); - } - } - } - return [invalidLoops, invalidEdges]; -} - export function loopsToFaces(originFace, loops, out) { const newFaces = evolveFace(originFace, loops); for (let newFace of newFaces) {