AddObjectTool.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. /*
  2. * AddObjectTool.js
  3. *
  4. * @author realor
  5. */
  6. import { Tool } from './Tool.js'
  7. import { Cord } from '../core/Cord.js'
  8. import { CordGeometry } from '../core/CordGeometry.js'
  9. import { Profile } from '../core/Profile.js'
  10. import { ProfileGeometry } from '../core/ProfileGeometry.js'
  11. import { Solid } from '../core/Solid.js'
  12. import { SolidGeometry } from '../core/SolidGeometry.js'
  13. import { ObjectBuilder } from '../builders/ObjectBuilder.js'
  14. import { HelicoidBuilder } from '../builders/HelicoidBuilder.js'
  15. import { RectangleBuilder } from '../builders/RectangleBuilder.js'
  16. import { CircleBuilder } from '../builders/CircleBuilder.js'
  17. import { CircularSectorBuilder } from '../builders/CircularSectorBuilder.js'
  18. import { Extruder } from '../builders/Extruder.js'
  19. import { Revolver } from '../builders/Revolver.js'
  20. import { I18N } from '../i18n/I18N.js'
  21. import * as THREE from '../lib/three.module.js'
  22. class AddObjectTool extends Tool {
  23. constructor(application, options) {
  24. super(application)
  25. this.name = 'add_object'
  26. this.label = 'tool.add_object.label'
  27. this.help = 'tool.add_object.help'
  28. this.className = 'add_object'
  29. this.immediate = true
  30. this.objectType = null
  31. this.builderClass = null
  32. this.setOptions(options)
  33. this.counter = 0
  34. }
  35. execute() {
  36. const objectType = this.objectType || 'Group'
  37. let object
  38. switch (objectType) {
  39. case 'Group':
  40. object = new THREE.Group()
  41. break
  42. case 'Box':
  43. object = this.createBox()
  44. break
  45. case 'Cylinder':
  46. object = this.createCylinder()
  47. break
  48. case 'Sphere':
  49. object = this.createSphere()
  50. break
  51. case 'Spring':
  52. object = this.createSpring()
  53. break
  54. case 'Logo':
  55. object = this.createLogo()
  56. break
  57. case 'Profile':
  58. object = this.createProfile(this.builderClass)
  59. break
  60. case 'Cord':
  61. object = this.createCord(this.builderClass)
  62. break
  63. case 'Sprite':
  64. object = this.createSprite()
  65. break
  66. }
  67. if (object) {
  68. this.counter++
  69. object.name = objectType + '_' + this.counter
  70. this.application.addObject(object, null, false, true)
  71. }
  72. }
  73. createBox() {
  74. const solid = new Solid()
  75. const profile = new Profile()
  76. profile.name = 'Rectangle'
  77. profile.builder = new RectangleBuilder(1, 1)
  78. solid.add(profile)
  79. solid.builder = new Extruder(1)
  80. ObjectBuilder.build(solid)
  81. return solid
  82. }
  83. createCylinder() {
  84. const solid = new Solid()
  85. const profile = new Profile()
  86. profile.name = 'Circle'
  87. profile.builder = new CircleBuilder(0.5, 32)
  88. solid.add(profile)
  89. solid.builder = new Extruder(1)
  90. solid.builder.smoothAngle = 20
  91. ObjectBuilder.build(solid)
  92. return solid
  93. }
  94. createSphere() {
  95. const solid = new Solid()
  96. const profile = new Profile()
  97. profile.name = 'CircularSector'
  98. profile.builder = new CircularSectorBuilder(0.5, 180, 32)
  99. solid.add(profile)
  100. solid.builder = new Revolver(360)
  101. solid.builder.axis.x = 1
  102. solid.builder.axis.y = 0
  103. solid.builder.smoothAngle = 20
  104. solid.builder.optimize = false
  105. ObjectBuilder.build(solid)
  106. solid.rotation.y = Math.PI / 2
  107. return solid
  108. }
  109. createSpring() {
  110. const solid = new Solid()
  111. let cord = new Cord()
  112. cord.name = 'Helicoid'
  113. cord.builder = new HelicoidBuilder()
  114. ObjectBuilder.build(cord)
  115. solid.add(cord)
  116. const profile = new Profile()
  117. profile.name = 'Circle'
  118. profile.builder = new CircleBuilder(0.2)
  119. solid.add(profile)
  120. solid.builder = new Extruder()
  121. solid.builder.smoothAngle = 30
  122. ObjectBuilder.build(solid)
  123. return solid
  124. }
  125. createLogo() {
  126. const solid = new Solid()
  127. const shape = new THREE.Shape()
  128. const size = 0.5
  129. shape.moveTo(-size, -size)
  130. shape.lineTo(size, -size)
  131. shape.lineTo(2 * size, 0)
  132. shape.lineTo(size, size)
  133. shape.lineTo(-size, size)
  134. shape.closePath()
  135. const hole = new THREE.Path()
  136. hole.moveTo(-size / 2, -size / 2)
  137. hole.lineTo(size / 2, -size / 2)
  138. hole.lineTo(size / 2, size / 2)
  139. hole.lineTo(-size / 2, size / 2)
  140. hole.closePath()
  141. shape.holes.push(hole)
  142. hole = new THREE.Path()
  143. hole.moveTo(-size / 4 + 0.5, -size / 4)
  144. hole.lineTo(size / 4 + 0.5, -size / 4)
  145. hole.lineTo(size / 4 + 0.5, size / 4)
  146. hole.lineTo(-size / 4 + 0.5, size / 4)
  147. hole.closePath()
  148. shape.holes.push(hole)
  149. const profile = new Profile(new ProfileGeometry(shape))
  150. solid.add(profile)
  151. solid.builder = new Extruder(this.height)
  152. ObjectBuilder.build(solid)
  153. return solid
  154. }
  155. createProfile(profileBuilderClass) {
  156. const builder = new profileBuilderClass()
  157. const profile = new Profile()
  158. profile.builder = builder
  159. ObjectBuilder.build(profile)
  160. return profile
  161. }
  162. createCord(cordBuilderClass) {
  163. const builder = new cordBuilderClass()
  164. const cord = new Cord()
  165. cord.builder = builder
  166. ObjectBuilder.build(cord)
  167. return cord
  168. }
  169. createSprite() {
  170. const manager = this.application.loadingManager
  171. const textureLoader = new THREE.TextureLoader(manager)
  172. const texture = textureLoader.load('textures/sphere.png')
  173. const material = new THREE.SpriteMaterial({
  174. name: 'sphere',
  175. map: texture,
  176. color: 0xffffff,
  177. sizeAttenuation: false
  178. })
  179. const sprite = new THREE.Sprite(material)
  180. sprite.scale.set(0.1, 0.1, 0.1)
  181. return sprite
  182. }
  183. }
  184. export { AddObjectTool }