jsketcher/web/app/cad/craft/booleanOperation.js
2022-08-15 23:47:20 -07:00

44 lines
1.2 KiB
JavaScript

import {intersect, subtract, union} from 'brep/operations/boolean';
import {update as updateStitching} from 'brep/operations/stitching';
import {BREPValidator} from 'brep/brep-validator';
import {Shell} from 'brep/topo/shell';
import {MBrepShell} from '../model/mshell';
const BoolOpMap = {
'subtract': subtract,
'union': union,
'intersect': intersect
};
export function BooleanOperation(face, solid, operand, operationType) {
let result;
if (solid instanceof MBrepShell) {
const op = BoolOpMap[operationType];
result = op(solid.shell, operand);
for (const newFace of result.faces) {
if (newFace.id === face.id) {
newFace.id = undefined;
}
}
} else {
if (operationType !== 'union') throw 'unable to cut plane';
result = operand;
}
updateStitching(result);
const newSolid = new MBrepShell(result);
return {
consumed: [solid],
created: [newSolid]
}
}
export function combineShells(shells) {
if (shells.length === 1) {
return shells[0];
}
const operand = new Shell();
shells.forEach(c => c.faces.forEach(f => operand.faces.push(f)));
// operand.faces.forEach(f => f.shell = operand);
BREPValidator.validateToConsole(operand);
return operand;
}