mirror of
https://github.com/xibyte/jsketcher
synced 2025-12-14 20:33:30 +01:00
improve loop invalidation
This commit is contained in:
parent
58c7e73a27
commit
c2cae6b40f
1 changed files with 15 additions and 24 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue