chili3d 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (472) hide show
  1. package/.github/workflows/main.yml +26 -0
  2. package/.vscode/c_cpp_properties.json +30 -0
  3. package/.vscode/launch.json +21 -0
  4. package/.vscode/settings.json +8 -0
  5. package/Dockerfile +7 -0
  6. package/LICENSE +661 -0
  7. package/README.md +184 -0
  8. package/biome.json +67 -0
  9. package/compose.yml +7 -0
  10. package/cpp/CMakeLists.txt +96 -0
  11. package/cpp/CMakePresets.json +43 -0
  12. package/cpp/README.md +21 -0
  13. package/cpp/src/converter.cpp +413 -0
  14. package/cpp/src/factory.cpp +612 -0
  15. package/cpp/src/geometry.cpp +204 -0
  16. package/cpp/src/mesher.cpp +330 -0
  17. package/cpp/src/opencascade.cpp +414 -0
  18. package/cpp/src/shape.cpp +447 -0
  19. package/cpp/src/shared.cpp +83 -0
  20. package/cpp/src/shared.hpp +211 -0
  21. package/cpp/src/transient.cpp +29 -0
  22. package/cpp/src/utils.cpp +114 -0
  23. package/cpp/src/utils.hpp +25 -0
  24. package/cpp/test/index.html +146 -0
  25. package/package.json +49 -0
  26. package/packages/chili/package.json +11 -0
  27. package/packages/chili/src/application.ts +200 -0
  28. package/packages/chili/src/bodys/arc.ts +61 -0
  29. package/packages/chili/src/bodys/boolean.ts +32 -0
  30. package/packages/chili/src/bodys/box.ts +73 -0
  31. package/packages/chili/src/bodys/circle.ts +57 -0
  32. package/packages/chili/src/bodys/cone.ts +64 -0
  33. package/packages/chili/src/bodys/cylinder.ts +69 -0
  34. package/packages/chili/src/bodys/ellipse.ts +85 -0
  35. package/packages/chili/src/bodys/face.ts +72 -0
  36. package/packages/chili/src/bodys/fuse.ts +44 -0
  37. package/packages/chili/src/bodys/index.ts +16 -0
  38. package/packages/chili/src/bodys/line.ts +48 -0
  39. package/packages/chili/src/bodys/polygon.ts +40 -0
  40. package/packages/chili/src/bodys/prism.ts +49 -0
  41. package/packages/chili/src/bodys/pyramid.ts +64 -0
  42. package/packages/chili/src/bodys/rect.ts +69 -0
  43. package/packages/chili/src/bodys/revolve.ts +54 -0
  44. package/packages/chili/src/bodys/sphere.ts +48 -0
  45. package/packages/chili/src/bodys/sweep.ts +67 -0
  46. package/packages/chili/src/bodys/wire.ts +36 -0
  47. package/packages/chili/src/commands/application/index.ts +10 -0
  48. package/packages/chili/src/commands/application/newDocument.ts +17 -0
  49. package/packages/chili/src/commands/application/openDocument.ts +35 -0
  50. package/packages/chili/src/commands/application/performanceTest.ts +64 -0
  51. package/packages/chili/src/commands/application/saveDocument.ts +24 -0
  52. package/packages/chili/src/commands/application/toFile.ts +35 -0
  53. package/packages/chili/src/commands/application/toggleDynamicWorkplane.ts +15 -0
  54. package/packages/chili/src/commands/application/wechatGroup.ts +42 -0
  55. package/packages/chili/src/commands/boolean.ts +109 -0
  56. package/packages/chili/src/commands/create/arc.ts +110 -0
  57. package/packages/chili/src/commands/create/bezier.ts +116 -0
  58. package/packages/chili/src/commands/create/box.ts +59 -0
  59. package/packages/chili/src/commands/create/circle.ts +54 -0
  60. package/packages/chili/src/commands/create/cone.ts +104 -0
  61. package/packages/chili/src/commands/create/converter.ts +159 -0
  62. package/packages/chili/src/commands/create/copySubShape.ts +37 -0
  63. package/packages/chili/src/commands/create/curveProjection.ts +61 -0
  64. package/packages/chili/src/commands/create/cylinder.ts +96 -0
  65. package/packages/chili/src/commands/create/ellipse.ts +95 -0
  66. package/packages/chili/src/commands/create/group.ts +205 -0
  67. package/packages/chili/src/commands/create/index.ts +26 -0
  68. package/packages/chili/src/commands/create/line.ts +61 -0
  69. package/packages/chili/src/commands/create/loft.ts +149 -0
  70. package/packages/chili/src/commands/create/offset.ts +131 -0
  71. package/packages/chili/src/commands/create/polygon.ts +104 -0
  72. package/packages/chili/src/commands/create/prism.ts +52 -0
  73. package/packages/chili/src/commands/create/pyramid.ts +56 -0
  74. package/packages/chili/src/commands/create/rect.ts +105 -0
  75. package/packages/chili/src/commands/create/revolve.ts +62 -0
  76. package/packages/chili/src/commands/create/section.ts +31 -0
  77. package/packages/chili/src/commands/create/sphere.ts +48 -0
  78. package/packages/chili/src/commands/create/sweep.ts +39 -0
  79. package/packages/chili/src/commands/create/thickSolid.ts +50 -0
  80. package/packages/chili/src/commands/createActCommand.ts +26 -0
  81. package/packages/chili/src/commands/createCommand.ts +41 -0
  82. package/packages/chili/src/commands/delete.ts +38 -0
  83. package/packages/chili/src/commands/folder.ts +18 -0
  84. package/packages/chili/src/commands/importExport.ts +97 -0
  85. package/packages/chili/src/commands/index.ts +17 -0
  86. package/packages/chili/src/commands/measure/angle.ts +130 -0
  87. package/packages/chili/src/commands/measure/index.ts +6 -0
  88. package/packages/chili/src/commands/measure/length.ts +57 -0
  89. package/packages/chili/src/commands/measure/select.module.css +68 -0
  90. package/packages/chili/src/commands/measure/select.ts +228 -0
  91. package/packages/chili/src/commands/modify/array.ts +447 -0
  92. package/packages/chili/src/commands/modify/break.ts +78 -0
  93. package/packages/chili/src/commands/modify/brush.ts +100 -0
  94. package/packages/chili/src/commands/modify/chamfer.ts +70 -0
  95. package/packages/chili/src/commands/modify/explode.ts +91 -0
  96. package/packages/chili/src/commands/modify/fillet.ts +69 -0
  97. package/packages/chili/src/commands/modify/index.ts +16 -0
  98. package/packages/chili/src/commands/modify/mirror.ts +49 -0
  99. package/packages/chili/src/commands/modify/move.ts +39 -0
  100. package/packages/chili/src/commands/modify/removeFeature.ts +56 -0
  101. package/packages/chili/src/commands/modify/removeSubShapes.ts +44 -0
  102. package/packages/chili/src/commands/modify/rotate.ts +112 -0
  103. package/packages/chili/src/commands/modify/split.ts +81 -0
  104. package/packages/chili/src/commands/modify/transformedCommand.ts +100 -0
  105. package/packages/chili/src/commands/modify/trim.ts +254 -0
  106. package/packages/chili/src/commands/multistepCommand.ts +125 -0
  107. package/packages/chili/src/commands/redo.ts +16 -0
  108. package/packages/chili/src/commands/undo.ts +16 -0
  109. package/packages/chili/src/commands/workingPlane.ts +150 -0
  110. package/packages/chili/src/comparers/NumberEqualityComparer.ts +12 -0
  111. package/packages/chili/src/comparers/XYZEqualityComparer.ts +12 -0
  112. package/packages/chili/src/comparers/index.ts +5 -0
  113. package/packages/chili/src/document.ts +145 -0
  114. package/packages/chili/src/editEventHandler.ts +20 -0
  115. package/packages/chili/src/index.ts +12 -0
  116. package/packages/chili/src/selection.ts +178 -0
  117. package/packages/chili/src/services/commandService.ts +105 -0
  118. package/packages/chili/src/services/editorService.ts +46 -0
  119. package/packages/chili/src/services/hotkeyService.ts +102 -0
  120. package/packages/chili/src/services/index.ts +6 -0
  121. package/packages/chili/src/snap/dimension.ts +33 -0
  122. package/packages/chili/src/snap/handlers/angleSnapEventHandler.ts +60 -0
  123. package/packages/chili/src/snap/handlers/index.ts +7 -0
  124. package/packages/chili/src/snap/handlers/lengthSnapEventHandler.ts +117 -0
  125. package/packages/chili/src/snap/handlers/pointSnapEventHandler.ts +176 -0
  126. package/packages/chili/src/snap/handlers/snapEventHandler.ts +288 -0
  127. package/packages/chili/src/snap/index.ts +6 -0
  128. package/packages/chili/src/snap/snap.ts +50 -0
  129. package/packages/chili/src/snap/snaps/axisSnap.ts +57 -0
  130. package/packages/chili/src/snap/snaps/baseSnap.ts +69 -0
  131. package/packages/chili/src/snap/snaps/featurePointStrategy.ts +64 -0
  132. package/packages/chili/src/snap/snaps/index.ts +7 -0
  133. package/packages/chili/src/snap/snaps/objectSnap.ts +264 -0
  134. package/packages/chili/src/snap/snaps/planeSnap.ts +55 -0
  135. package/packages/chili/src/snap/snaps/pointOnCurveSnap.ts +24 -0
  136. package/packages/chili/src/snap/tracking/axis.ts +32 -0
  137. package/packages/chili/src/snap/tracking/axisTracking.ts +46 -0
  138. package/packages/chili/src/snap/tracking/index.ts +6 -0
  139. package/packages/chili/src/snap/tracking/objectTracking.ts +90 -0
  140. package/packages/chili/src/snap/tracking/trackingBase.ts +40 -0
  141. package/packages/chili/src/snap/tracking/trackingSnap.ts +201 -0
  142. package/packages/chili/src/step/angleStep.ts +32 -0
  143. package/packages/chili/src/step/index.ts +8 -0
  144. package/packages/chili/src/step/lengthStep.ts +32 -0
  145. package/packages/chili/src/step/pointStep.ts +87 -0
  146. package/packages/chili/src/step/selectStep.ts +130 -0
  147. package/packages/chili/src/step/step.ts +55 -0
  148. package/packages/chili/src/utils.ts +19 -0
  149. package/packages/chili/test/command.test.ts +4 -0
  150. package/packages/chili-builder/package.json +13 -0
  151. package/packages/chili-builder/src/additionalModule.ts +15 -0
  152. package/packages/chili-builder/src/appBuilder.ts +176 -0
  153. package/packages/chili-builder/src/defaultDataExchange.ts +152 -0
  154. package/packages/chili-builder/src/index.ts +5 -0
  155. package/packages/chili-builder/src/ribbon.ts +129 -0
  156. package/packages/chili-controls/package.json +9 -0
  157. package/packages/chili-controls/src/collection.ts +96 -0
  158. package/packages/chili-controls/src/controls.ts +83 -0
  159. package/packages/chili-controls/src/converters/colorConverter.ts +39 -0
  160. package/packages/chili-controls/src/converters/index.ts +8 -0
  161. package/packages/chili-controls/src/converters/numberConverter.ts +15 -0
  162. package/packages/chili-controls/src/converters/stringConverter.ts +13 -0
  163. package/packages/chili-controls/src/converters/urlConverter.ts +10 -0
  164. package/packages/chili-controls/src/converters/xyzConverter.ts +28 -0
  165. package/packages/chili-controls/src/expander/expander.module.css +38 -0
  166. package/packages/chili-controls/src/expander/expander.ts +59 -0
  167. package/packages/chili-controls/src/expander/index.ts +4 -0
  168. package/packages/chili-controls/src/htmlProps.ts +10 -0
  169. package/packages/chili-controls/src/index.ts +10 -0
  170. package/packages/chili-controls/src/radioGroup.module.css +20 -0
  171. package/packages/chili-controls/src/radioGroup.ts +54 -0
  172. package/packages/chili-controls/src/utils.ts +20 -0
  173. package/packages/chili-controls/test/converter.test.ts +70 -0
  174. package/packages/chili-controls/test/styleMock.js +4 -0
  175. package/packages/chili-core/package.json +7 -0
  176. package/packages/chili-core/src/application.ts +38 -0
  177. package/packages/chili-core/src/command/command.ts +154 -0
  178. package/packages/chili-core/src/command/commandKeys.ts +8 -0
  179. package/packages/chili-core/src/command/decarator.ts +43 -0
  180. package/packages/chili-core/src/command/index.ts +6 -0
  181. package/packages/chili-core/src/config.ts +145 -0
  182. package/packages/chili-core/src/constants.ts +8 -0
  183. package/packages/chili-core/src/dataExchange.ts +12 -0
  184. package/packages/chili-core/src/document.ts +25 -0
  185. package/packages/chili-core/src/editor.ts +12 -0
  186. package/packages/chili-core/src/foundation/asyncController.ts +55 -0
  187. package/packages/chili-core/src/foundation/binding.ts +132 -0
  188. package/packages/chili-core/src/foundation/collection.ts +208 -0
  189. package/packages/chili-core/src/foundation/converter.ts +9 -0
  190. package/packages/chili-core/src/foundation/deepObserver.ts +154 -0
  191. package/packages/chili-core/src/foundation/disposable.ts +18 -0
  192. package/packages/chili-core/src/foundation/dto/index.ts +9 -0
  193. package/packages/chili-core/src/foundation/equalityComparer.ts +6 -0
  194. package/packages/chili-core/src/foundation/gc.ts +36 -0
  195. package/packages/chili-core/src/foundation/history.ts +237 -0
  196. package/packages/chili-core/src/foundation/id.ts +25 -0
  197. package/packages/chili-core/src/foundation/index.ts +26 -0
  198. package/packages/chili-core/src/foundation/lazy.ts +18 -0
  199. package/packages/chili-core/src/foundation/linkedList.ts +141 -0
  200. package/packages/chili-core/src/foundation/logger.ts +45 -0
  201. package/packages/chili-core/src/foundation/messageType.ts +8 -0
  202. package/packages/chili-core/src/foundation/objectStorage.ts +50 -0
  203. package/packages/chili-core/src/foundation/observer.ts +147 -0
  204. package/packages/chili-core/src/foundation/precision.ts +8 -0
  205. package/packages/chili-core/src/foundation/pubsub.ts +74 -0
  206. package/packages/chili-core/src/foundation/result.ts +69 -0
  207. package/packages/chili-core/src/foundation/storage.ts +10 -0
  208. package/packages/chili-core/src/foundation/transaction.ts +77 -0
  209. package/packages/chili-core/src/foundation/utils/debounce.ts +15 -0
  210. package/packages/chili-core/src/foundation/utils/download.ts +16 -0
  211. package/packages/chili-core/src/foundation/utils/index.ts +6 -0
  212. package/packages/chili-core/src/foundation/utils/readFileAsync.ts +84 -0
  213. package/packages/chili-core/src/i18n/i18n.ts +107 -0
  214. package/packages/chili-core/src/i18n/index.ts +5 -0
  215. package/packages/chili-core/src/i18n/keys.ts +265 -0
  216. package/packages/chili-core/src/index.ts +26 -0
  217. package/packages/chili-core/src/material.ts +269 -0
  218. package/packages/chili-core/src/math/boundingBox.ts +226 -0
  219. package/packages/chili-core/src/math/index.ts +14 -0
  220. package/packages/chili-core/src/math/line.ts +55 -0
  221. package/packages/chili-core/src/math/lineSegment.ts +166 -0
  222. package/packages/chili-core/src/math/mathUtils.ts +45 -0
  223. package/packages/chili-core/src/math/matrix4.ts +414 -0
  224. package/packages/chili-core/src/math/plane.ts +96 -0
  225. package/packages/chili-core/src/math/planeAngle.ts +53 -0
  226. package/packages/chili-core/src/math/quaternion.ts +131 -0
  227. package/packages/chili-core/src/math/ray.ts +30 -0
  228. package/packages/chili-core/src/math/xy.ts +104 -0
  229. package/packages/chili-core/src/math/xyz.ts +181 -0
  230. package/packages/chili-core/src/model/component.ts +305 -0
  231. package/packages/chili-core/src/model/facebaseNode.ts +17 -0
  232. package/packages/chili-core/src/model/folderNode.ts +289 -0
  233. package/packages/chili-core/src/model/geometryNode.ts +185 -0
  234. package/packages/chili-core/src/model/groupNode.ts +19 -0
  235. package/packages/chili-core/src/model/index.ts +12 -0
  236. package/packages/chili-core/src/model/meshNode.ts +53 -0
  237. package/packages/chili-core/src/model/node.ts +315 -0
  238. package/packages/chili-core/src/model/shapeNode.ts +195 -0
  239. package/packages/chili-core/src/model/visualNode.ts +39 -0
  240. package/packages/chili-core/src/modelManager.ts +147 -0
  241. package/packages/chili-core/src/navigation.ts +58 -0
  242. package/packages/chili-core/src/property.ts +60 -0
  243. package/packages/chili-core/src/selection.ts +33 -0
  244. package/packages/chili-core/src/selectionFilter.ts +28 -0
  245. package/packages/chili-core/src/serialize/index.ts +4 -0
  246. package/packages/chili-core/src/serialize/serializer.ts +231 -0
  247. package/packages/chili-core/src/service.ts +10 -0
  248. package/packages/chili-core/src/shape/curve.ts +174 -0
  249. package/packages/chili-core/src/shape/geometry.ts +17 -0
  250. package/packages/chili-core/src/shape/index.ts +12 -0
  251. package/packages/chili-core/src/shape/lineType.ts +7 -0
  252. package/packages/chili-core/src/shape/meshData.ts +347 -0
  253. package/packages/chili-core/src/shape/shape.ts +104 -0
  254. package/packages/chili-core/src/shape/shapeConverter.ts +17 -0
  255. package/packages/chili-core/src/shape/shapeFactory.ts +58 -0
  256. package/packages/chili-core/src/shape/shapeType.ts +75 -0
  257. package/packages/chili-core/src/shape/surface.ts +154 -0
  258. package/packages/chili-core/src/snapType.ts +32 -0
  259. package/packages/chili-core/src/ui/button.ts +16 -0
  260. package/packages/chili-core/src/ui/combobox.ts +27 -0
  261. package/packages/chili-core/src/ui/dialog.ts +7 -0
  262. package/packages/chili-core/src/ui/index.ts +8 -0
  263. package/packages/chili-core/src/ui/ribbon.ts +15 -0
  264. package/packages/chili-core/src/ui/window.ts +13 -0
  265. package/packages/chili-core/src/visual/act.ts +59 -0
  266. package/packages/chili-core/src/visual/cameraController.ts +22 -0
  267. package/packages/chili-core/src/visual/cursorType.ts +4 -0
  268. package/packages/chili-core/src/visual/detectedData.ts +14 -0
  269. package/packages/chili-core/src/visual/eventHandler.ts +15 -0
  270. package/packages/chili-core/src/visual/highlighter.ts +16 -0
  271. package/packages/chili-core/src/visual/index.ts +20 -0
  272. package/packages/chili-core/src/visual/meshExporter.ts +11 -0
  273. package/packages/chili-core/src/visual/meshUtils.ts +276 -0
  274. package/packages/chili-core/src/visual/textGenerator.ts +8 -0
  275. package/packages/chili-core/src/visual/view.ts +80 -0
  276. package/packages/chili-core/src/visual/viewGizmo.ts +8 -0
  277. package/packages/chili-core/src/visual/viewport.ts +10 -0
  278. package/packages/chili-core/src/visual/visual.ts +24 -0
  279. package/packages/chili-core/src/visual/visualContext.ts +29 -0
  280. package/packages/chili-core/src/visual/visualFactory.ts +10 -0
  281. package/packages/chili-core/src/visual/visualObject.ts +25 -0
  282. package/packages/chili-core/src/visual/visualShape.ts +30 -0
  283. package/packages/chili-core/test/binding.test.ts +95 -0
  284. package/packages/chili-core/test/boundingBox.test.ts +60 -0
  285. package/packages/chili-core/test/collection.test.ts +53 -0
  286. package/packages/chili-core/test/history.test.ts +42 -0
  287. package/packages/chili-core/test/line.test.ts +75 -0
  288. package/packages/chili-core/test/linesegment.test.ts +98 -0
  289. package/packages/chili-core/test/linkedList.test.ts +82 -0
  290. package/packages/chili-core/test/math.test.ts +34 -0
  291. package/packages/chili-core/test/matrix.test.ts +129 -0
  292. package/packages/chili-core/test/node.test.ts +122 -0
  293. package/packages/chili-core/test/nodeList.test.ts +247 -0
  294. package/packages/chili-core/test/observer.test.ts +91 -0
  295. package/packages/chili-core/test/plane.test.ts +31 -0
  296. package/packages/chili-core/test/quaternion.test.ts +14 -0
  297. package/packages/chili-core/test/result.test.ts +24 -0
  298. package/packages/chili-core/test/serializer.test.ts +58 -0
  299. package/packages/chili-core/test/snapType.test.ts +10 -0
  300. package/packages/chili-core/test/task.test.ts +41 -0
  301. package/packages/chili-core/test/testDocument.ts +70 -0
  302. package/packages/chili-core/test/transaction.test.ts +42 -0
  303. package/packages/chili-core/test/visual.test.ts +42 -0
  304. package/packages/chili-core/test/xyz.test.ts +260 -0
  305. package/packages/chili-geo/package.json +9 -0
  306. package/packages/chili-geo/src/index.ts +4 -0
  307. package/packages/chili-geo/src/utils.ts +113 -0
  308. package/packages/chili-i18n/package.json +9 -0
  309. package/packages/chili-i18n/src/en.ts +270 -0
  310. package/packages/chili-i18n/src/index.ts +8 -0
  311. package/packages/chili-i18n/src/pt-br.ts +67 -0
  312. package/packages/chili-i18n/src/zh-cn.ts +269 -0
  313. package/packages/chili-storage/package.json +9 -0
  314. package/packages/chili-storage/src/index.ts +4 -0
  315. package/packages/chili-storage/src/indexedDBStorage.ts +150 -0
  316. package/packages/chili-three/package.json +13 -0
  317. package/packages/chili-three/src/cameraController.ts +335 -0
  318. package/packages/chili-three/src/common.ts +65 -0
  319. package/packages/chili-three/src/constants.ts +12 -0
  320. package/packages/chili-three/src/highlightable.ts +13 -0
  321. package/packages/chili-three/src/index.ts +4 -0
  322. package/packages/chili-three/src/meshExporter.ts +69 -0
  323. package/packages/chili-three/src/outlinePass.js +340 -0
  324. package/packages/chili-three/src/texture_points.jpg +0 -0
  325. package/packages/chili-three/src/threeGeometry.ts +207 -0
  326. package/packages/chili-three/src/threeGeometryFactory.ts +120 -0
  327. package/packages/chili-three/src/threeHelper.ts +174 -0
  328. package/packages/chili-three/src/threeHighlighter.ts +257 -0
  329. package/packages/chili-three/src/threeView.module.css +39 -0
  330. package/packages/chili-three/src/threeView.ts +669 -0
  331. package/packages/chili-three/src/threeViewEventHandler.ts +193 -0
  332. package/packages/chili-three/src/threeVisual.ts +92 -0
  333. package/packages/chili-three/src/threeVisualContext.ts +435 -0
  334. package/packages/chili-three/src/threeVisualFactory.ts +12 -0
  335. package/packages/chili-three/src/threeVisualObject.ts +442 -0
  336. package/packages/chili-three/src/viewGizmo.ts +305 -0
  337. package/packages/chili-three/test/cameraControls.ts +10 -0
  338. package/packages/chili-three/test/testDocument.ts +68 -0
  339. package/packages/chili-three/test/testEdge.ts +171 -0
  340. package/packages/chili-three/test/testView.ts +78 -0
  341. package/packages/chili-three/test/three.test.ts +44 -0
  342. package/packages/chili-three/test/viewGizmo.ts +12 -0
  343. package/packages/chili-ui/package.json +12 -0
  344. package/packages/chili-ui/src/cursor/draw.cur +0 -0
  345. package/packages/chili-ui/src/cursor/index.ts +17 -0
  346. package/packages/chili-ui/src/dialog.module.css +63 -0
  347. package/packages/chili-ui/src/dialog.ts +42 -0
  348. package/packages/chili-ui/src/editor.module.css +83 -0
  349. package/packages/chili-ui/src/editor.ts +142 -0
  350. package/packages/chili-ui/src/home/home.module.css +301 -0
  351. package/packages/chili-ui/src/home/home.ts +243 -0
  352. package/packages/chili-ui/src/home/index.ts +4 -0
  353. package/packages/chili-ui/src/home/languageSelector.ts +27 -0
  354. package/packages/chili-ui/src/home/navigation3DSelector.ts +27 -0
  355. package/packages/chili-ui/src/home/themeSelector.ts +34 -0
  356. package/packages/chili-ui/src/index.ts +5 -0
  357. package/packages/chili-ui/src/mainWindow.module.css +144 -0
  358. package/packages/chili-ui/src/mainWindow.ts +154 -0
  359. package/packages/chili-ui/src/okCancel.module.css +54 -0
  360. package/packages/chili-ui/src/okCancel.ts +58 -0
  361. package/packages/chili-ui/src/permanent.module.css +44 -0
  362. package/packages/chili-ui/src/permanent.ts +31 -0
  363. package/packages/chili-ui/src/project/index.ts +4 -0
  364. package/packages/chili-ui/src/project/projectView.module.css +37 -0
  365. package/packages/chili-ui/src/project/projectView.ts +77 -0
  366. package/packages/chili-ui/src/project/toolBar.module.css +16 -0
  367. package/packages/chili-ui/src/project/toolBar.ts +73 -0
  368. package/packages/chili-ui/src/project/tree/index.ts +5 -0
  369. package/packages/chili-ui/src/project/tree/tree.module.css +16 -0
  370. package/packages/chili-ui/src/project/tree/tree.ts +265 -0
  371. package/packages/chili-ui/src/project/tree/treeItem.module.css +21 -0
  372. package/packages/chili-ui/src/project/tree/treeItem.ts +89 -0
  373. package/packages/chili-ui/src/project/tree/treeItemGroup.module.css +33 -0
  374. package/packages/chili-ui/src/project/tree/treeItemGroup.ts +85 -0
  375. package/packages/chili-ui/src/project/tree/treeModel.module.css +11 -0
  376. package/packages/chili-ui/src/project/tree/treeModel.ts +20 -0
  377. package/packages/chili-ui/src/property/check.ts +39 -0
  378. package/packages/chili-ui/src/property/colorPorperty.module.css +6 -0
  379. package/packages/chili-ui/src/property/colorProperty.ts +63 -0
  380. package/packages/chili-ui/src/property/common.module.css +14 -0
  381. package/packages/chili-ui/src/property/index.ts +4 -0
  382. package/packages/chili-ui/src/property/input.module.css +19 -0
  383. package/packages/chili-ui/src/property/input.ts +140 -0
  384. package/packages/chili-ui/src/property/material/index.ts +5 -0
  385. package/packages/chili-ui/src/property/material/materialDataContent.ts +44 -0
  386. package/packages/chili-ui/src/property/material/materialEditor.module.css +98 -0
  387. package/packages/chili-ui/src/property/material/materialEditor.ts +147 -0
  388. package/packages/chili-ui/src/property/material/textureEditor.module.css +46 -0
  389. package/packages/chili-ui/src/property/material/textureEditor.ts +61 -0
  390. package/packages/chili-ui/src/property/materialProperty.module.css +30 -0
  391. package/packages/chili-ui/src/property/materialProperty.ts +86 -0
  392. package/packages/chili-ui/src/property/matrixProperty.ts +147 -0
  393. package/packages/chili-ui/src/property/propertyBase.module.css +3 -0
  394. package/packages/chili-ui/src/property/propertyBase.ts +14 -0
  395. package/packages/chili-ui/src/property/propertyView.module.css +36 -0
  396. package/packages/chili-ui/src/property/propertyView.ts +115 -0
  397. package/packages/chili-ui/src/property/utils.ts +48 -0
  398. package/packages/chili-ui/src/ribbon/commandContext.module.css +73 -0
  399. package/packages/chili-ui/src/ribbon/commandContext.ts +239 -0
  400. package/packages/chili-ui/src/ribbon/index.ts +4 -0
  401. package/packages/chili-ui/src/ribbon/ribbon.module.css +286 -0
  402. package/packages/chili-ui/src/ribbon/ribbon.ts +288 -0
  403. package/packages/chili-ui/src/ribbon/ribbonButton.module.css +75 -0
  404. package/packages/chili-ui/src/ribbon/ribbonButton.ts +88 -0
  405. package/packages/chili-ui/src/ribbon/ribbonData.ts +66 -0
  406. package/packages/chili-ui/src/ribbon/ribbonStack.module.css +6 -0
  407. package/packages/chili-ui/src/ribbon/ribbonStack.ts +13 -0
  408. package/packages/chili-ui/src/ribbon/ribbonToggleButton.module.css +3 -0
  409. package/packages/chili-ui/src/ribbon/ribbonToggleButton.ts +6 -0
  410. package/packages/chili-ui/src/statusbar/index.ts +4 -0
  411. package/packages/chili-ui/src/statusbar/snapConfig.module.css +25 -0
  412. package/packages/chili-ui/src/statusbar/snapConfig.ts +92 -0
  413. package/packages/chili-ui/src/statusbar/statusbar.module.css +28 -0
  414. package/packages/chili-ui/src/statusbar/statusbar.ts +54 -0
  415. package/packages/chili-ui/src/toast/index.ts +4 -0
  416. package/packages/chili-ui/src/toast/toast.module.css +27 -0
  417. package/packages/chili-ui/src/toast/toast.ts +39 -0
  418. package/packages/chili-ui/src/viewport/flyout/flyout.module.css +9 -0
  419. package/packages/chili-ui/src/viewport/flyout/flyout.ts +77 -0
  420. package/packages/chili-ui/src/viewport/flyout/index.ts +6 -0
  421. package/packages/chili-ui/src/viewport/flyout/input.module.css +21 -0
  422. package/packages/chili-ui/src/viewport/flyout/input.ts +89 -0
  423. package/packages/chili-ui/src/viewport/flyout/tip.module.css +21 -0
  424. package/packages/chili-ui/src/viewport/flyout/tip.ts +45 -0
  425. package/packages/chili-ui/src/viewport/index.ts +4 -0
  426. package/packages/chili-ui/src/viewport/layoutViewport.module.css +21 -0
  427. package/packages/chili-ui/src/viewport/layoutViewport.ts +76 -0
  428. package/packages/chili-ui/src/viewport/viewport.module.css +179 -0
  429. package/packages/chili-ui/src/viewport/viewport.ts +296 -0
  430. package/packages/chili-vis/package.json +9 -0
  431. package/packages/chili-vis/src/index.ts +7 -0
  432. package/packages/chili-vis/src/nodeSelectionEventHandler.ts +122 -0
  433. package/packages/chili-vis/src/selectionEventHandler.ts +145 -0
  434. package/packages/chili-vis/src/shapeSelectionEventHandler.ts +176 -0
  435. package/packages/chili-vis/src/viewUtils.ts +64 -0
  436. package/packages/chili-wasm/lib/chili-wasm.d.ts +827 -0
  437. package/packages/chili-wasm/lib/chili-wasm.js +5275 -0
  438. package/packages/chili-wasm/lib/chili-wasm.wasm +0 -0
  439. package/packages/chili-wasm/package.json +10 -0
  440. package/packages/chili-wasm/src/converter.ts +124 -0
  441. package/packages/chili-wasm/src/curve.ts +589 -0
  442. package/packages/chili-wasm/src/factory.ts +331 -0
  443. package/packages/chili-wasm/src/geometry.ts +51 -0
  444. package/packages/chili-wasm/src/helper.ts +435 -0
  445. package/packages/chili-wasm/src/index.ts +5 -0
  446. package/packages/chili-wasm/src/mesher.ts +114 -0
  447. package/packages/chili-wasm/src/shape.ts +481 -0
  448. package/packages/chili-wasm/src/surface.ts +510 -0
  449. package/packages/chili-wasm/src/wasm.ts +13 -0
  450. package/packages/chili-web/package.json +9 -0
  451. package/packages/chili-web/src/index.ts +33 -0
  452. package/packages/chili-web/src/loading.ts +67 -0
  453. package/packages/global.d.ts +31 -0
  454. package/public/favicon.svg +10 -0
  455. package/public/fonts/fzhei.json +46120 -0
  456. package/public/iconfont.js +1 -0
  457. package/public/images/wechat.jpg +0 -0
  458. package/public/index.css +13 -0
  459. package/public/index.html +24 -0
  460. package/rspack.config.ts +93 -0
  461. package/rstest.config.ts +27 -0
  462. package/screenshots/screenshot.png +0 -0
  463. package/scripts/add_copyright.mjs +59 -0
  464. package/scripts/build-npm.mjs +105 -0
  465. package/scripts/common.mjs +24 -0
  466. package/scripts/release.mjs +92 -0
  467. package/scripts/restore-package-json.mjs +27 -0
  468. package/scripts/setup_wasm_deps.mjs +97 -0
  469. package/scripts/update-package-json.mjs +27 -0
  470. package/tsconfig.build.json +14 -0
  471. package/tsconfig.build.tsbuildinfo +1 -0
  472. package/tsconfig.json +19 -0
@@ -0,0 +1,60 @@
1
+ // Part of the Chili3d Project, under the AGPL-3.0 License.
2
+ // See LICENSE file in the project root for full license information.
3
+
4
+ import {
5
+ type AsyncController,
6
+ Config,
7
+ type IDocument,
8
+ type IView,
9
+ Plane,
10
+ PlaneAngle,
11
+ type XYZ,
12
+ } from "chili-core";
13
+ import type { SnapResult } from "../snap";
14
+ import { ObjectSnap, PlaneSnap } from "../snaps";
15
+ import { TrackingSnap } from "../tracking";
16
+ import type { PointSnapData } from "./pointSnapEventHandler";
17
+ import { SnapEventHandler } from "./snapEventHandler";
18
+
19
+ export class AngleSnapEventHandler extends SnapEventHandler<PointSnapData> {
20
+ private readonly planeAngle: PlaneAngle;
21
+ private readonly plane: Plane;
22
+
23
+ constructor(
24
+ document: IDocument,
25
+ controller: AsyncController,
26
+ private readonly center: () => XYZ,
27
+ p1: XYZ,
28
+ snapPointData: PointSnapData,
29
+ ) {
30
+ if (!snapPointData.plane) throw new Error("AngleSnapEventHandler: no plane");
31
+
32
+ const objectSnap = new ObjectSnap(Config.instance.snapType, snapPointData.refPoint);
33
+ const workplaneSnap = new PlaneSnap(snapPointData.plane, center);
34
+ const trackingSnap = new TrackingSnap(center, false);
35
+ super(document, controller, [objectSnap, trackingSnap, workplaneSnap], snapPointData);
36
+
37
+ const xvec = p1.sub(center()).normalize()!;
38
+ this.plane = new Plane(center(), snapPointData.plane().normal, xvec);
39
+ this.planeAngle = new PlaneAngle(this.plane);
40
+ snapPointData.prompt ??= this.formatAnglePrompt;
41
+ }
42
+
43
+ private readonly formatAnglePrompt = (snaped?: SnapResult) => {
44
+ if (!snaped?.point) return "";
45
+ this.planeAngle.movePoint(snaped.point);
46
+ return `${this.planeAngle.angle.toFixed(2)} °`;
47
+ };
48
+
49
+ protected override inputError(text: string) {
50
+ const angle = Number.parseFloat(text);
51
+ return isNaN(angle) ? "error.input.invalidNumber" : undefined;
52
+ }
53
+
54
+ protected override getPointFromInput(view: IView, text: string): SnapResult {
55
+ const angle = (Number.parseFloat(text) * Math.PI) / 180;
56
+ const vec = this.plane.xvec.rotate(this.plane.normal, angle)!;
57
+ const point = this.center().add(vec);
58
+ return { point, view, shapes: [], plane: this.plane };
59
+ }
60
+ }
@@ -0,0 +1,7 @@
1
+ // Part of the Chili3d Project, under the AGPL-3.0 License.
2
+ // See LICENSE file in the project root for full license information.
3
+
4
+ export * from "./angleSnapEventHandler";
5
+ export * from "./lengthSnapEventHandler";
6
+ export * from "./pointSnapEventHandler";
7
+ export * from "./snapEventHandler";
@@ -0,0 +1,117 @@
1
+ // Part of the Chili3d Project, under the AGPL-3.0 License.
2
+ // See LICENSE file in the project root for full license information.
3
+
4
+ import {
5
+ type AsyncController,
6
+ Config,
7
+ type I18nKeys,
8
+ type IDocument,
9
+ type IView,
10
+ type Plane,
11
+ Precision,
12
+ type XYZ,
13
+ } from "chili-core";
14
+ import type { SnapData, SnapResult } from "../snap";
15
+ import { AxisSnap, ObjectSnap, PlaneSnap } from "../snaps";
16
+ import { TrackingSnap } from "../tracking";
17
+ import { SnapEventHandler } from "./snapEventHandler";
18
+
19
+ export interface LengthAtAxisSnapData extends SnapData {
20
+ point: XYZ;
21
+ direction: XYZ;
22
+ }
23
+
24
+ export interface SnapLengthAtPlaneData extends SnapData {
25
+ point: () => XYZ;
26
+ plane: (point: XYZ | undefined) => Plane;
27
+ }
28
+
29
+ export class SnapLengthAtAxisHandler extends SnapEventHandler<LengthAtAxisSnapData> {
30
+ constructor(document: IDocument, controller: AsyncController, lengthData: LengthAtAxisSnapData) {
31
+ const objectSnap = new ObjectSnap(Config.instance.snapType, () => lengthData.point);
32
+ const axisSnap = new AxisSnap(lengthData.point, lengthData.direction);
33
+ super(document, controller, [objectSnap, axisSnap], lengthData);
34
+ }
35
+
36
+ protected getPointFromInput(view: IView, text: string): SnapResult {
37
+ const dist = this.calculateDistance(Number(text));
38
+ const point = this.calculatePoint(dist);
39
+ return { view, point, distance: dist, shapes: [] };
40
+ }
41
+
42
+ private calculateDistance(inputValue: number): number {
43
+ return this.shouldReverse() ? -inputValue : inputValue;
44
+ }
45
+
46
+ private calculatePoint(distance: number): XYZ {
47
+ return this.data.point.add(this.data.direction.multiply(distance));
48
+ }
49
+
50
+ private shouldReverse() {
51
+ return (
52
+ this._snaped?.point &&
53
+ this._snaped.point.sub(this.data.point).dot(this.data.direction) < -Precision.Distance
54
+ );
55
+ }
56
+
57
+ protected inputError(text: string): I18nKeys | undefined {
58
+ return Number.isNaN(Number(text)) ? "error.input.invalidNumber" : undefined;
59
+ }
60
+ }
61
+
62
+ export class SnapLengthAtPlaneHandler extends SnapEventHandler<SnapLengthAtPlaneData> {
63
+ private workplane: Plane | undefined;
64
+
65
+ constructor(
66
+ document: IDocument,
67
+ controller: AsyncController,
68
+ readonly lengthData: SnapLengthAtPlaneData,
69
+ ) {
70
+ const objectSnap = new ObjectSnap(Config.instance.snapType, lengthData.point);
71
+ const trackingSnap = new TrackingSnap(lengthData.point, false);
72
+ const planeSnap = new PlaneSnap(lengthData.plane, lengthData.point);
73
+ super(document, controller, [objectSnap, trackingSnap, planeSnap], lengthData);
74
+ }
75
+
76
+ protected override setSnaped(view: IView, event: PointerEvent): void {
77
+ super.setSnaped(view, event);
78
+ this.updateWorkplane();
79
+ }
80
+
81
+ private updateWorkplane() {
82
+ if (this._snaped) {
83
+ this.workplane = this.lengthData.plane(this._snaped.point);
84
+ this._snaped.plane = this.workplane;
85
+ }
86
+ }
87
+
88
+ protected getPointFromInput(view: IView, text: string): SnapResult {
89
+ const plane = this.workplane ?? view.workplane;
90
+ const point = this.calculatePoint(text, plane);
91
+ return { point, view, shapes: [], plane };
92
+ }
93
+
94
+ private calculatePoint(text: string, plane: Plane): XYZ {
95
+ const numbers = text.split(",").map(Number);
96
+ return numbers.length === 1
97
+ ? this.calculatePointFromDistance(numbers[0])
98
+ : this.calculatePointFromCoordinates(numbers, plane);
99
+ }
100
+
101
+ private calculatePointFromDistance(distance: number): XYZ {
102
+ const vector = this._snaped?.point!.sub(this.data.point()).normalize();
103
+ return this.data.point().add(vector!.multiply(distance));
104
+ }
105
+
106
+ private calculatePointFromCoordinates(coords: number[], plane: Plane): XYZ {
107
+ return this.data.point().add(plane.xvec.multiply(coords[0])).add(plane.yvec.multiply(coords[1]));
108
+ }
109
+
110
+ protected inputError(text: string): I18nKeys | undefined {
111
+ const numbers = text.split(",").map(Number);
112
+ if (numbers.some(Number.isNaN) || (numbers.length !== 1 && numbers.length !== 2)) {
113
+ return "error.input.invalidNumber";
114
+ }
115
+ return undefined;
116
+ }
117
+ }
@@ -0,0 +1,176 @@
1
+ // Part of the Chili3d Project, under the AGPL-3.0 License.
2
+ // See LICENSE file in the project root for full license information.
3
+
4
+ import {
5
+ type AsyncController,
6
+ Config,
7
+ type I18nKeys,
8
+ type ICurve,
9
+ type IDocument,
10
+ type IView,
11
+ type Line,
12
+ type Plane,
13
+ type ShapeType,
14
+ XYZ,
15
+ } from "chili-core";
16
+ import { Dimension } from "../dimension";
17
+ import type { ISnap, SnapData, SnapResult } from "../snap";
18
+ import { AxisSnap, ObjectSnap, PlaneSnap, PointOnCurveSnap, WorkplaneSnap } from "../snaps";
19
+ import { TrackingSnap } from "../tracking";
20
+ import { SnapEventHandler } from "./snapEventHandler";
21
+
22
+ export interface PointSnapData extends SnapData {
23
+ dimension?: Dimension;
24
+ refPoint?: () => XYZ;
25
+ plane?: () => Plane;
26
+ }
27
+
28
+ export interface SnapPointOnCurveData extends PointSnapData {
29
+ curve: ICurve;
30
+ }
31
+
32
+ export interface SnapPointOnAxisData extends PointSnapData {
33
+ ray: Line;
34
+ }
35
+
36
+ export class PointSnapEventHandler extends SnapEventHandler<PointSnapData> {
37
+ constructor(document: IDocument, controller: AsyncController, pointData: PointSnapData) {
38
+ super(document, controller, [], pointData);
39
+ this.snaps.push(...this.getInitSnaps(pointData));
40
+ }
41
+
42
+ protected getInitSnaps(pointData: PointSnapData): ISnap[] {
43
+ const objectSnap = new ObjectSnap(Config.instance.snapType, pointData.refPoint);
44
+ const workplaneSnap = pointData.plane
45
+ ? new PlaneSnap(pointData.plane, pointData.refPoint)
46
+ : new WorkplaneSnap(pointData.refPoint);
47
+ const trackingSnap = new TrackingSnap(pointData.refPoint, true);
48
+ return [objectSnap, trackingSnap, workplaneSnap];
49
+ }
50
+
51
+ protected getPointFromInput(view: IView, text: string): SnapResult {
52
+ const [dims, isAbsolute] = this.parseInputDimensions(text);
53
+ const refPoint = this.getRefPoint() ?? XYZ.zero;
54
+ const result = { point: refPoint, view, shapes: [] };
55
+
56
+ if (isAbsolute) {
57
+ result.point = new XYZ(dims[0], dims[1], dims[2]);
58
+ } else if (dims.length === 1 && this._snaped?.point) {
59
+ result.point = this.calculatePointFromDistance(refPoint, dims[0]);
60
+ } else if (dims.length > 1) {
61
+ result.point = this.calculatePointFromCoordinates(refPoint, dims);
62
+ }
63
+
64
+ return result;
65
+ }
66
+
67
+ private parseInputDimensions(text: string): [number[], boolean] {
68
+ const isAbsolute = text.startsWith("#");
69
+ if (isAbsolute) {
70
+ text = text.slice(1);
71
+ }
72
+ return [text.split(",").map(Number), isAbsolute];
73
+ }
74
+
75
+ private calculatePointFromDistance(refPoint: XYZ, distance: number): XYZ {
76
+ const vector = this._snaped!.point!.sub(refPoint).normalize()!;
77
+ return refPoint.add(vector.multiply(distance));
78
+ }
79
+
80
+ private calculatePointFromCoordinates(refPoint: XYZ, dims: number[]): XYZ {
81
+ const plane = this.data.plane?.() ?? this.snaped!.view.workplane;
82
+ let point = refPoint.add(plane.xvec.multiply(dims[0])).add(plane.yvec.multiply(dims[1]));
83
+ if (dims.length === 3) {
84
+ point = point.add(plane.normal.multiply(dims[2]));
85
+ }
86
+ return point;
87
+ }
88
+
89
+ protected inputError(text: string): I18nKeys | undefined {
90
+ const [dims, isAbsolute] = this.parseInputDimensions(text);
91
+ const dimension = Dimension.from(dims.length);
92
+
93
+ if (isAbsolute && dims.length !== 3) return "error.input.threeNumberCanBeInput";
94
+ if (!this.isValidDimension(dimension)) return "error.input.unsupportedInputs";
95
+ if (this.hasInvalidNumbers(dims)) return "error.input.invalidNumber";
96
+ if (this.requiresThreeNumbers(dims)) return "error.input.threeNumberCanBeInput";
97
+ if (this.isInvalidSingleNumber(dims)) return "error.input.cannotInputANumber";
98
+
99
+ return undefined;
100
+ }
101
+
102
+ private isValidDimension(dimension: Dimension): boolean {
103
+ return Dimension.contains(this.data.dimension!, dimension);
104
+ }
105
+
106
+ private hasInvalidNumbers(dims: number[]): boolean {
107
+ return dims.some(Number.isNaN);
108
+ }
109
+
110
+ private requiresThreeNumbers(dims: number[]): boolean {
111
+ const refPoint = this.getRefPoint();
112
+ return refPoint === undefined && dims.length !== 3;
113
+ }
114
+
115
+ private isInvalidSingleNumber(dims: number[]): boolean {
116
+ const refPoint = this.getRefPoint();
117
+ return dims.length === 1 && refPoint! && (!this._snaped || this._snaped.point!.isEqualTo(refPoint));
118
+ }
119
+
120
+ private getRefPoint(): XYZ | undefined {
121
+ return this.data.refPoint?.() ?? this._snaped?.refPoint;
122
+ }
123
+ }
124
+
125
+ export class SnapPointOnCurveEventHandler extends SnapEventHandler<SnapPointOnCurveData> {
126
+ constructor(document: IDocument, controller: AsyncController, pointData: SnapPointOnCurveData) {
127
+ const objectSnap = new ObjectSnap(Config.instance.snapType);
128
+ const snap = new PointOnCurveSnap(pointData);
129
+ const workplaneSnap = new WorkplaneSnap();
130
+ super(document, controller, [objectSnap, snap, workplaneSnap], pointData);
131
+ }
132
+
133
+ protected override getPointFromInput(view: IView, text: string): SnapResult {
134
+ const length = this.data.curve.length();
135
+ const parameter = Number(text) / length;
136
+ return { point: this.data.curve.value(parameter), view, shapes: [] };
137
+ }
138
+
139
+ protected override inputError(text: string) {
140
+ return Number.isNaN(Number(text)) ? "error.input.invalidNumber" : undefined;
141
+ }
142
+ }
143
+
144
+ export class SnapPointOnAxisEventHandler extends SnapEventHandler<SnapPointOnAxisData> {
145
+ constructor(document: IDocument, controller: AsyncController, pointData: SnapPointOnAxisData) {
146
+ const objectSnap = new ObjectSnap(Config.instance.snapType);
147
+ const snap = new AxisSnap(pointData.ray.point, pointData.ray.direction);
148
+ super(document, controller, [objectSnap, snap], pointData);
149
+ }
150
+
151
+ protected override getPointFromInput(view: IView, text: string): SnapResult {
152
+ const parameter = Number(text);
153
+ const point = this.data.ray.point.add(this.data.ray.direction.multiply(parameter));
154
+ return { point, view, shapes: [] };
155
+ }
156
+
157
+ protected override inputError(text: string) {
158
+ return Number.isNaN(Number(text)) ? "error.input.invalidNumber" : undefined;
159
+ }
160
+ }
161
+
162
+ export class SnapPointPlaneEventHandler extends PointSnapEventHandler {
163
+ protected override getInitSnaps(pointData: PointSnapData): ISnap[] {
164
+ if (!pointData.plane) throw new Error("plane is required");
165
+
166
+ return [new ObjectSnap(Config.instance.snapType), new PlaneSnap(pointData.plane)];
167
+ }
168
+
169
+ protected override findSnapPoint(shapeType: ShapeType, view: IView, event: PointerEvent): void {
170
+ super.findSnapPoint(shapeType, view, event);
171
+
172
+ if (this._snaped?.point) {
173
+ this._snaped.point = this.data.plane!().project(this._snaped.point);
174
+ }
175
+ }
176
+ }
@@ -0,0 +1,288 @@
1
+ // Part of the Chili3d Project, under the AGPL-3.0 License.
2
+ // See LICENSE file in the project root for full license information.
3
+
4
+ import {
5
+ type AsyncController,
6
+ Config,
7
+ type I18nKeys,
8
+ type IDocument,
9
+ type IEventHandler,
10
+ IView,
11
+ MessageType,
12
+ PubSub,
13
+ Result,
14
+ ShapeType,
15
+ VertexMeshData,
16
+ VisualConfig,
17
+ type XYZ,
18
+ } from "chili-core";
19
+ import type { ISnap, MouseAndDetected, SnapData, SnapResult } from "../snap";
20
+
21
+ enum SnapState {
22
+ Idle,
23
+ Snapping,
24
+ Inputing,
25
+ Cancelled,
26
+ Completed,
27
+ }
28
+
29
+ export abstract class SnapEventHandler<D extends SnapData = SnapData> implements IEventHandler {
30
+ private _tempPoint?: number;
31
+ private _tempShapes?: number[];
32
+ protected showTempPoint: boolean = true;
33
+ protected _snaped?: SnapResult;
34
+ private _state: SnapState = SnapState.Idle;
35
+
36
+ facePreviewOpacity: number = 1;
37
+ isEnabled: boolean = true;
38
+
39
+ constructor(
40
+ readonly document: IDocument,
41
+ readonly controller: AsyncController,
42
+ readonly snaps: ISnap[],
43
+ readonly data: D,
44
+ ) {
45
+ this.showTempShape(undefined);
46
+ controller.onCancelled(() => this.handleCancel());
47
+ controller.onCompleted(() => this.handleSuccess());
48
+ }
49
+
50
+ get snaped() {
51
+ return this._snaped;
52
+ }
53
+ get state() {
54
+ return this._state;
55
+ }
56
+
57
+ dispose() {
58
+ this._snaped = undefined;
59
+ this._state = SnapState.Completed;
60
+ }
61
+
62
+ private handleSuccess() {
63
+ if (this._state === SnapState.Completed) return;
64
+
65
+ this._state = SnapState.Completed;
66
+ this.controller.success();
67
+ this.cleanupResources();
68
+ }
69
+
70
+ private handleCancel() {
71
+ if (this._state === SnapState.Cancelled) return;
72
+
73
+ this._state = SnapState.Cancelled;
74
+ this.controller.cancel();
75
+ this.cleanupResources();
76
+ }
77
+
78
+ private cleanupResources() {
79
+ this.clearSnapPrompt();
80
+ this.clearInput();
81
+ this.removeTempVisuals();
82
+ this.snaps.forEach((snap) => snap.clear());
83
+ }
84
+
85
+ private clearInput() {
86
+ PubSub.default.pub("clearInput");
87
+ }
88
+
89
+ pointerMove(view: IView, event: PointerEvent): void {
90
+ this._state = SnapState.Snapping;
91
+ this.removeTempVisuals();
92
+ this.updateSnapPoint(view, event);
93
+ this.updateVisualFeedback(view);
94
+ }
95
+
96
+ private updateSnapPoint(view: IView, event: PointerEvent) {
97
+ this.setSnaped(view, event);
98
+ if (this._snaped) {
99
+ this.showSnapPrompt(this._snaped);
100
+ } else {
101
+ this.clearSnapPrompt();
102
+ }
103
+ }
104
+
105
+ private updateVisualFeedback(view: IView) {
106
+ this.showTempShape(this._snaped?.point);
107
+ view.document.visual.update();
108
+ }
109
+
110
+ protected setSnaped(view: IView, event: PointerEvent) {
111
+ this.findSnapPoint(ShapeType.Edge, view, event);
112
+
113
+ this.snaps.forEach((snap) => snap.handleSnaped?.(view.document.visual.document, this._snaped));
114
+ }
115
+
116
+ private findNearestFeaturePoint(view: IView, event: PointerEvent) {
117
+ let minDist = Number.MAX_VALUE;
118
+ let nearest;
119
+
120
+ for (const point of this.data.featurePoints || []) {
121
+ if (point.when && !point.when()) continue;
122
+
123
+ const dist = IView.screenDistance(view, event.offsetX, event.offsetY, point.point);
124
+ if (dist < minDist) {
125
+ minDist = dist;
126
+ nearest = point;
127
+ }
128
+ }
129
+
130
+ return minDist < Config.instance.SnapDistance ? nearest : undefined;
131
+ }
132
+
133
+ protected findSnapPoint(shapeType: ShapeType, view: IView, event: PointerEvent) {
134
+ const featurePoint = this.findNearestFeaturePoint(view, event);
135
+ if (featurePoint) {
136
+ this._snaped = {
137
+ view,
138
+ point: featurePoint.point,
139
+ info: featurePoint.prompt,
140
+ shapes: [],
141
+ };
142
+ } else {
143
+ const detected = this.detectShapes(shapeType, view, event);
144
+ for (const snap of this.snaps) {
145
+ const snaped = snap.snap(detected);
146
+ if (snaped && this.validateSnapPoint(snaped)) {
147
+ this._snaped = snaped;
148
+ return;
149
+ }
150
+ }
151
+ }
152
+ }
153
+
154
+ private validateSnapPoint(snaped: SnapResult) {
155
+ return !this.data.validator || this.data.validator(snaped.point!);
156
+ }
157
+
158
+ private detectShapes(shapeType: ShapeType, view: IView, event: MouseEvent): MouseAndDetected {
159
+ const shapes = view.detectShapes(shapeType, event.offsetX, event.offsetY, this.data.filter);
160
+ return { shapes, view, mx: event.offsetX, my: event.offsetY };
161
+ }
162
+
163
+ protected clearSnapPrompt() {
164
+ PubSub.default.pub("clearFloatTip");
165
+ }
166
+
167
+ protected showSnapPrompt(snaped: SnapResult) {
168
+ const prompt = this.formatSnapPrompt(snaped);
169
+ if (!prompt) {
170
+ this.clearSnapPrompt();
171
+ return;
172
+ }
173
+ PubSub.default.pub("showFloatTip", prompt);
174
+ }
175
+
176
+ protected formatSnapPrompt(
177
+ snaped: SnapResult,
178
+ ): HTMLElement | { level: MessageType; msg: string } | undefined {
179
+ let prompt = this.data.prompt?.(snaped);
180
+ if (!prompt) {
181
+ const distance = snaped.distance ?? snaped.refPoint?.distanceTo(snaped.point!);
182
+ if (distance) {
183
+ prompt = this.formatSnapDistance(distance);
184
+ }
185
+ }
186
+
187
+ if (!prompt && !snaped.info) {
188
+ return undefined;
189
+ }
190
+
191
+ return {
192
+ level: MessageType.info,
193
+ msg: [snaped.info, prompt].filter((x) => x !== undefined).join(" -> "),
194
+ };
195
+ }
196
+
197
+ protected formatSnapDistance(num: number) {
198
+ return num.toFixed(2);
199
+ }
200
+
201
+ private removeTempVisuals() {
202
+ this.removeTempShapes();
203
+ this.snaps.forEach((snap) => snap.removeDynamicObject());
204
+ }
205
+
206
+ private showTempShape(point: XYZ | undefined) {
207
+ if (point && this.showTempPoint) {
208
+ const data = VertexMeshData.from(
209
+ point,
210
+ VisualConfig.temporaryVertexSize,
211
+ VisualConfig.temporaryVertexColor,
212
+ );
213
+ this._tempPoint = this.document.visual.context.displayMesh([data]);
214
+ }
215
+
216
+ this._tempShapes = this.data
217
+ .preview?.(point)
218
+ ?.map((shape) => this.document.visual.context.displayMesh([shape], this.facePreviewOpacity));
219
+ }
220
+
221
+ private removeTempShapes() {
222
+ if (this._tempPoint) {
223
+ this.document.visual.context.removeMesh(this._tempPoint);
224
+ this._tempPoint = undefined;
225
+ }
226
+ this._tempShapes?.forEach((id) => {
227
+ this.document.visual.context.removeMesh(id);
228
+ });
229
+ this.document.visual.update();
230
+ this._tempShapes = undefined;
231
+ }
232
+
233
+ pointerDown(view: IView, event: PointerEvent): void {
234
+ if (event.pointerType === "mouse" && event.button === 0) {
235
+ if (this._snaped) {
236
+ this.handleSuccess();
237
+ } else {
238
+ PubSub.default.pub("showToast", "toast.snap.notFoundValidPoint");
239
+ }
240
+ }
241
+ }
242
+
243
+ pointerUp(view: IView, event: PointerEvent): void {
244
+ if (event.pointerType !== "mouse" && event.isPrimary && this._snaped) {
245
+ this.handleSuccess();
246
+ }
247
+ }
248
+
249
+ pointerOut(view: IView, event: PointerEvent) {
250
+ this._snaped = undefined;
251
+ }
252
+
253
+ mouseWheel(view: IView, event: WheelEvent): void {
254
+ view.update();
255
+ }
256
+
257
+ keyDown(view: IView, event: KeyboardEvent): void {
258
+ switch (event.key) {
259
+ case "Escape":
260
+ this._snaped = undefined;
261
+ this.handleCancel();
262
+ break;
263
+ case "Enter":
264
+ this._snaped = undefined;
265
+ this.handleSuccess();
266
+ break;
267
+ default:
268
+ this.handleNumericInput(view, event);
269
+ }
270
+ }
271
+
272
+ private handleNumericInput(view: IView, event: KeyboardEvent) {
273
+ if (!["#", "-", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"].includes(event.key)) return;
274
+
275
+ this._state = SnapState.Inputing;
276
+ PubSub.default.pub("showInput", event.key, (text: string) => {
277
+ const error = this.inputError(text);
278
+ if (error) return Result.err(error);
279
+
280
+ this._snaped = this.getPointFromInput(view, text);
281
+ this.handleSuccess();
282
+ return Result.ok(text);
283
+ });
284
+ }
285
+
286
+ protected abstract getPointFromInput(view: IView, text: string): SnapResult;
287
+ protected abstract inputError(text: string): I18nKeys | undefined;
288
+ }
@@ -0,0 +1,6 @@
1
+ // Part of the Chili3d Project, under the AGPL-3.0 License.
2
+ // See LICENSE file in the project root for full license information.
3
+
4
+ export * from "./dimension";
5
+ export * from "./handlers";
6
+ export * from "./snap";