ClipTool.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. /*
  2. * ClipTool.js
  3. *
  4. * @author realor
  5. */
  6. import * as THREE from '../lib/three.module.js'
  7. import { Tool } from './Tool.js'
  8. import { Solid } from '../core/Solid.js'
  9. import { BSP } from '../core/BSP.js'
  10. class ClipTool extends Tool {
  11. constructor(application, options) {
  12. super(application)
  13. this.name = 'clip'
  14. this.label = 'tool.clip.label'
  15. this.help = 'tool.clip.help'
  16. this.className = 'clip'
  17. this.setOptions(options)
  18. this.immediate = true
  19. this.material = new THREE.MeshPhongMaterial({ color: 0x4040ff, side: THREE.DoubleSide })
  20. }
  21. execute() {
  22. const application = this.application
  23. var objects = application.selection.roots
  24. var operands = []
  25. for (var i = 0; i < objects.length && operands.length < 2; i++) {
  26. var object = objects[i]
  27. if (object instanceof Solid) {
  28. operands.push(object)
  29. }
  30. }
  31. if (operands.length >= 2) {
  32. let bsp1 = new BSP()
  33. let object1 = operands[0]
  34. let geometry1 = object1.geometry
  35. let matrix1 = object1.matrixWorld
  36. bsp1.fromSolidGeometry(geometry1, matrix1)
  37. let bsp2 = new BSP()
  38. let object2 = operands[1]
  39. let geometry2 = object2.geometry
  40. let matrix2 = object2.matrixWorld
  41. bsp2.fromSolidGeometry(geometry2, matrix2)
  42. let bspResult = bsp1.clip(bsp2)
  43. let solid = new Solid()
  44. solid.updateGeometry(bspResult.toSolidGeometry(), true)
  45. application.addObject(solid, null, false, true)
  46. }
  47. }
  48. }
  49. export { ClipTool }