modeling/src/operations/booleans/subtract.js

  1. const flatten = require('../../utils/flatten')
  2. const areAllShapesTheSameType = require('../../utils/areAllShapesTheSameType')
  3. const geom2 = require('../../geometries/geom2')
  4. const geom3 = require('../../geometries/geom3')
  5. const subtractGeom2 = require('./subtractGeom2')
  6. const subtractGeom3 = require('./subtractGeom3')
  7. /**
  8. * Return a new geometry representing space in the first geometry but
  9. * not in all subsequent geometries.
  10. * The given geometries should be of the same type, either geom2 or geom3.
  11. *
  12. * @param {...Object} geometries - list of geometries
  13. * @returns {geom2|geom3} a new geometry
  14. * @alias module:modeling/booleans.subtract
  15. *
  16. * @example
  17. * let myshape = subtract(cuboid({size: 5}), cuboid({size: 5, center: [3,3,3]}))
  18. *
  19. * @example
  20. * +-------+ +-------+
  21. * | | | |
  22. * | A | | |
  23. * | +--+----+ = | +--+
  24. * +----+--+ | +----+
  25. * | B |
  26. * | |
  27. * +-------+
  28. */
  29. const subtract = (...geometries) => {
  30. geometries = flatten(geometries)
  31. if (geometries.length === 0) throw new Error('wrong number of arguments')
  32. if (!areAllShapesTheSameType(geometries)) {
  33. throw new Error('only subtract of the types are supported')
  34. }
  35. const geometry = geometries[0]
  36. // if (path.isA(geometry)) return pathsubtract(matrix, geometries)
  37. if (geom2.isA(geometry)) return subtractGeom2(geometries)
  38. if (geom3.isA(geometry)) return subtractGeom3(geometries)
  39. return geometry
  40. }
  41. module.exports = subtract