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,90 @@
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 { type IDocument, type IView, VisualConfig } from "chili-core";
5
+ import { ViewUtils } from "chili-vis";
6
+ import type { SnapResult } from "..";
7
+ import { Axis } from "./axis";
8
+ import { TrackingBase } from "./trackingBase";
9
+
10
+ export interface ObjectTrackingAxis {
11
+ axes: Axis[];
12
+ objectName: string | undefined;
13
+ }
14
+
15
+ interface SnapeInfo {
16
+ snap: SnapResult;
17
+ shapeId: number;
18
+ }
19
+
20
+ export class ObjectTracking extends TrackingBase {
21
+ private timer?: number;
22
+ private snapping?: SnapResult;
23
+ private readonly trackings: Map<IDocument, SnapeInfo[]> = new Map();
24
+
25
+ constructor(trackingZ: boolean) {
26
+ super(trackingZ);
27
+ }
28
+
29
+ override clear(): void {
30
+ this.clearTimer();
31
+ super.clear();
32
+ this.trackings.clear();
33
+ }
34
+
35
+ getTrackingRays(view: IView) {
36
+ const result: ObjectTrackingAxis[] = [];
37
+ this.trackings.get(view.document)?.map((x) => {
38
+ const plane = ViewUtils.ensurePlane(view, view.workplane);
39
+ const axes = Axis.getAxiesAtPlane(x.snap.point!, plane, this.trackingZ);
40
+ result.push({ axes, objectName: x.snap.info });
41
+ });
42
+ return result;
43
+ }
44
+
45
+ showTrackingAtTimeout(document: IDocument, snap?: SnapResult) {
46
+ if (snap !== undefined && this.snapping === snap) return;
47
+ this.snapping = snap;
48
+ this.clearTimer();
49
+ if (!snap) return;
50
+ this.timer = window.setTimeout(() => this.switchTrackingPoint(document, snap), 600);
51
+ }
52
+
53
+ private clearTimer() {
54
+ if (this.timer !== undefined) {
55
+ clearTimeout(this.timer);
56
+ this.timer = undefined;
57
+ }
58
+ }
59
+
60
+ private switchTrackingPoint(document: IDocument, snap: SnapResult) {
61
+ if (this.isCleared || snap.shapes.length === 0) return;
62
+ if (!this.trackings.has(document)) {
63
+ this.trackings.set(document, []);
64
+ }
65
+ const currentTrackings = this.trackings.get(document)!;
66
+ const existingTracking = currentTrackings.find((x) => x.snap.point!.isEqualTo(snap.point!));
67
+ existingTracking
68
+ ? this.removeTrackingPoint(document, existingTracking, currentTrackings)
69
+ : this.addTrackingPoint(snap, document, currentTrackings);
70
+ document.visual.update();
71
+ }
72
+
73
+ private removeTrackingPoint(document: IDocument, s: SnapeInfo, snaps: SnapeInfo[]) {
74
+ document.visual.context.removeMesh(s.shapeId);
75
+ this.trackings.set(
76
+ document,
77
+ snaps.filter((x) => x !== s),
78
+ );
79
+ }
80
+
81
+ private addTrackingPoint(snap: SnapResult, document: IDocument, snaps: SnapeInfo[]) {
82
+ const pointId = this.displayPoint(
83
+ document,
84
+ snap,
85
+ VisualConfig.trackingVertexSize,
86
+ VisualConfig.trackingVertexColor,
87
+ );
88
+ snaps.push({ shapeId: pointId, snap });
89
+ }
90
+ }
@@ -0,0 +1,40 @@
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 { type IDocument, VertexMeshData } from "chili-core";
5
+ import type { SnapResult } from "..";
6
+
7
+ export abstract class TrackingBase {
8
+ protected readonly tempMeshes: Map<IDocument, number[]> = new Map();
9
+ protected isCleared: boolean = false;
10
+
11
+ constructor(readonly trackingZ: boolean) {}
12
+
13
+ clear(): void {
14
+ this.clearTempMeshes();
15
+ this.isCleared = true;
16
+ }
17
+
18
+ protected clearTempMeshes(): void {
19
+ this.tempMeshes.forEach((ids, document) => {
20
+ ids.forEach((id) => document.visual.context.removeMesh(id));
21
+ });
22
+ this.tempMeshes.clear();
23
+ }
24
+
25
+ protected addTempMesh(document: IDocument, meshId: number): void {
26
+ let ids = this.tempMeshes.get(document);
27
+ if (!ids) {
28
+ ids = [];
29
+ this.tempMeshes.set(document, ids);
30
+ }
31
+ ids.push(meshId);
32
+ }
33
+
34
+ protected displayPoint(document: IDocument, point: SnapResult, size: number, color: number): number {
35
+ const data = VertexMeshData.from(point.point!, size, color);
36
+ const id = document.visual.context.displayMesh([data]);
37
+ this.addTempMesh(document, id);
38
+ return id;
39
+ }
40
+ }
@@ -0,0 +1,201 @@
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
+ Config,
6
+ EdgeMeshData,
7
+ I18n,
8
+ type IDocument,
9
+ type ISubEdgeShape,
10
+ IView,
11
+ type Line,
12
+ LineType,
13
+ Precision,
14
+ ShapeType,
15
+ VisualConfig,
16
+ XY,
17
+ type XYZ,
18
+ } from "chili-core";
19
+ import type { ISnap, MouseAndDetected, SnapResult } from "../";
20
+ import type { Axis } from "./axis";
21
+ import { AxisTracking } from "./axisTracking";
22
+ import { ObjectTracking } from "./objectTracking";
23
+
24
+ export interface TrackingData {
25
+ axis: Axis;
26
+ point: XYZ;
27
+ isObjectTracking: boolean;
28
+ distance: number;
29
+ info: string;
30
+ }
31
+
32
+ export class TrackingSnap implements ISnap {
33
+ private readonly _axisTracking: AxisTracking;
34
+ private readonly _objectTracking: ObjectTracking;
35
+ private readonly _tempLines: Map<IView, number[]> = new Map();
36
+
37
+ constructor(
38
+ readonly referencePoint: (() => XYZ) | undefined,
39
+ trackingAxisZ: boolean,
40
+ ) {
41
+ this._axisTracking = new AxisTracking(trackingAxisZ);
42
+ this._objectTracking = new ObjectTracking(trackingAxisZ);
43
+ Config.instance.onPropertyChanged(this.onSnapTypeChanged);
44
+ }
45
+
46
+ readonly handleSnaped = (document: IDocument, snaped?: SnapResult) => {
47
+ if (Config.instance.enableSnapTracking) {
48
+ this._objectTracking.showTrackingAtTimeout(document, snaped);
49
+ }
50
+ };
51
+
52
+ snap(data: MouseAndDetected): SnapResult | undefined {
53
+ if (!Config.instance.enableSnapTracking) return undefined;
54
+
55
+ const trackingDatas = this.detectTracking(data.view, data.mx, data.my);
56
+ if (trackingDatas.length === 0) return undefined;
57
+ trackingDatas.sort((x) => x.distance);
58
+ const snaped = this.shapeIntersectTracking(data, trackingDatas);
59
+ if (snaped !== undefined) return snaped;
60
+ if (trackingDatas.length === 1) {
61
+ return this.getSnapedAndShowTracking(data.view, trackingDatas[0].point, [trackingDatas[0]]);
62
+ }
63
+ return (
64
+ this.trackingIntersectTracking(data.view, trackingDatas) ??
65
+ this.getSnapedAndShowTracking(data.view, trackingDatas[0].point, [trackingDatas[0]])
66
+ );
67
+ }
68
+
69
+ private trackingIntersectTracking(view: IView, trackingDatas: TrackingData[]) {
70
+ const point = trackingDatas[0].axis.intersect(trackingDatas[1].axis);
71
+ return point
72
+ ? this.getSnapedAndShowTracking(view, point, [trackingDatas[0], trackingDatas[1]])
73
+ : undefined;
74
+ }
75
+
76
+ private getSnapedAndShowTracking(view: IView, point: XYZ, trackingDatas: TrackingData[]): SnapResult {
77
+ const lines: number[] = trackingDatas
78
+ .map((x) => this.showTempLine(view, x.axis.point, point))
79
+ .filter((id) => id !== undefined);
80
+ this._tempLines.set(view, lines);
81
+
82
+ let info: string | undefined;
83
+ let distance: number | undefined;
84
+ if (trackingDatas.length === 1) {
85
+ distance = point.distanceTo(trackingDatas[0].axis.point);
86
+ info = trackingDatas[0].axis.name;
87
+ } else if (trackingDatas.length === 2) {
88
+ info = I18n.translate("snap.intersection");
89
+ }
90
+ const refPoint = trackingDatas[0].axis.point;
91
+ return { view, point, info, shapes: [], refPoint, distance };
92
+ }
93
+
94
+ private showTempLine(view: IView, start: XYZ, end: XYZ): number | undefined {
95
+ const vector = end.sub(start);
96
+ const normal = vector.normalize();
97
+ if (!normal) return undefined;
98
+ const distance = Math.min(vector.length() * 1e10, 1e20);
99
+ const newEnd = start.add(normal.multiply(distance));
100
+ const lineDats = EdgeMeshData.from(start, newEnd, VisualConfig.temporaryEdgeColor, LineType.Dash);
101
+ return view.document.visual.context.displayMesh([lineDats]);
102
+ }
103
+
104
+ private shapeIntersectTracking(
105
+ data: MouseAndDetected,
106
+ trackingDatas: TrackingData[],
107
+ ): SnapResult | undefined {
108
+ if (data.shapes.length === 0 || data.shapes[0].shape.shapeType !== ShapeType.Edge) return undefined;
109
+ const point = this.findIntersection(data, trackingDatas);
110
+ if (!point) return undefined;
111
+ const id = this.showTempLine(data.view, point.location, point.intersect);
112
+ if (id === undefined) return undefined;
113
+ this._tempLines.set(data.view, [id]);
114
+ return {
115
+ view: data.view,
116
+ point: point.intersect,
117
+ info: I18n.translate("snap.intersection"),
118
+ shapes: [data.shapes[0]],
119
+ };
120
+ }
121
+
122
+ private findIntersection(data: MouseAndDetected, trackingDatas: TrackingData[]) {
123
+ const edge = data.shapes[0].shape as ISubEdgeShape;
124
+ const points: { intersect: XYZ; location: XYZ }[] = [];
125
+ trackingDatas.forEach((x) => {
126
+ edge.intersect(x.axis).forEach((p) => {
127
+ points.push({ intersect: p.point, location: x.axis.point });
128
+ });
129
+ });
130
+ points.sort((p) => IView.screenDistance(data.view, data.mx, data.my, p.intersect));
131
+ return points.at(0);
132
+ }
133
+
134
+ private detectTracking(view: IView, x: number, y: number) {
135
+ const data: TrackingData[] = [];
136
+ if (this.referencePoint) {
137
+ const axies = this._axisTracking.getAxes(view, this.referencePoint());
138
+ data.push(...this.getSnapedFromAxes(axies, view, x, y));
139
+ }
140
+ const objectTrackingRays = this._objectTracking.getTrackingRays(view);
141
+ objectTrackingRays.forEach((a) => {
142
+ data.push(...this.getSnapedFromAxes(a.axes, view, x, y, a.objectName));
143
+ });
144
+ return data;
145
+ }
146
+
147
+ private getSnapedFromAxes(axes: Axis[], view: IView, x: number, y: number, snapedName?: string) {
148
+ const result: TrackingData[] = [];
149
+ for (const axis of axes) {
150
+ const distance = this.rayDistanceAtScreen(view, x, y, axis);
151
+ if (distance < Config.instance.SnapDistance) {
152
+ const ray = view.rayAt(x, y);
153
+ const point = axis.nearestTo(ray.toLine());
154
+ if (point.sub(axis.point).dot(axis.direction) < 0) continue;
155
+ result.push({
156
+ axis,
157
+ distance,
158
+ point,
159
+ info: snapedName ?? axis.name,
160
+ isObjectTracking: snapedName !== undefined,
161
+ });
162
+ }
163
+ }
164
+ return result;
165
+ }
166
+
167
+ private rayDistanceAtScreen(view: IView, x: number, y: number, axis: Line): number {
168
+ const start = view.worldToScreen(axis.point);
169
+ const vector = new XY(x - start.x, y - start.y);
170
+ if (vector.isEqualTo(XY.zero)) return 0;
171
+ const end = view.worldToScreen(axis.point.add(axis.direction.multiply(100000)));
172
+ if (start.distanceTo(end) < Precision.Float) return vector.length();
173
+ const dir = end.sub(start).normalize()!;
174
+ const dot = vector.dot(dir);
175
+ return Math.sqrt(vector.lengthSq() - dot * dot);
176
+ }
177
+
178
+ removeDynamicObject(): void {
179
+ this._tempLines.forEach((v, k) => {
180
+ v.forEach((id) => {
181
+ k.document.visual.context.removeMesh(id);
182
+ });
183
+ });
184
+ this._tempLines.clear();
185
+ }
186
+
187
+ private readonly onSnapTypeChanged = (property: keyof Config): void => {
188
+ if (property === "snapType" || property === "enableSnapTracking" || property === "enableSnap") {
189
+ this.removeDynamicObject();
190
+ this._objectTracking.clear();
191
+ this._axisTracking.clear();
192
+ }
193
+ };
194
+
195
+ clear(): void {
196
+ this.removeDynamicObject();
197
+ this._axisTracking.clear();
198
+ this._objectTracking.clear();
199
+ Config.instance.removePropertyChanged(this.onSnapTypeChanged);
200
+ }
201
+ }
@@ -0,0 +1,32 @@
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 { type AsyncController, type I18nKeys, type IDocument, Precision, type XYZ } from "chili-core";
5
+ import { AngleSnapEventHandler, Dimension, type PointSnapData } from "../snap";
6
+ import { SnapStep } from "./step";
7
+
8
+ function defaultSnapedData(): PointSnapData {
9
+ return {
10
+ dimension: Dimension.D1D2D3,
11
+ };
12
+ }
13
+
14
+ export class AngleStep extends SnapStep<PointSnapData> {
15
+ constructor(
16
+ tip: I18nKeys,
17
+ private readonly handleCenter: () => XYZ,
18
+ private readonly handleP1: () => XYZ,
19
+ handleP2Data: () => PointSnapData = defaultSnapedData,
20
+ keepSelected = false,
21
+ ) {
22
+ super(tip, handleP2Data, keepSelected);
23
+ }
24
+
25
+ protected getEventHandler(document: IDocument, controller: AsyncController, data: PointSnapData) {
26
+ return new AngleSnapEventHandler(document, controller, this.handleCenter, this.handleP1(), data);
27
+ }
28
+
29
+ protected validator(data: PointSnapData, point: XYZ): boolean {
30
+ return data.refPoint === undefined || data.refPoint().distanceTo(point) > Precision.Distance;
31
+ }
32
+ }
@@ -0,0 +1,8 @@
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 "./angleStep";
5
+ export * from "./lengthStep";
6
+ export * from "./pointStep";
7
+ export * from "./selectStep";
8
+ export * from "./step";
@@ -0,0 +1,32 @@
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 { type AsyncController, type IDocument, Precision, type XYZ } from "chili-core";
5
+ import {
6
+ type LengthAtAxisSnapData,
7
+ SnapLengthAtAxisHandler,
8
+ type SnapLengthAtPlaneData,
9
+ SnapLengthAtPlaneHandler,
10
+ } from "../snap";
11
+ import { SnapStep } from "./step";
12
+
13
+ export class LengthAtAxisStep extends SnapStep<LengthAtAxisSnapData> {
14
+ protected getEventHandler(document: IDocument, controller: AsyncController, data: LengthAtAxisSnapData) {
15
+ return new SnapLengthAtAxisHandler(document, controller, data);
16
+ }
17
+
18
+ protected validator(data: LengthAtAxisSnapData, point: XYZ): boolean {
19
+ return Math.abs(point.sub(data.point).dot(data.direction)) > Precision.Distance;
20
+ }
21
+ }
22
+
23
+ export class LengthAtPlaneStep extends SnapStep<SnapLengthAtPlaneData> {
24
+ protected getEventHandler(document: IDocument, controller: AsyncController, data: SnapLengthAtPlaneData) {
25
+ return new SnapLengthAtPlaneHandler(document, controller, data);
26
+ }
27
+
28
+ protected validator(data: SnapLengthAtPlaneData, point: XYZ): boolean {
29
+ const pointAtPlane = data.plane(point).project(point);
30
+ return pointAtPlane.distanceTo(data.point()) > Precision.Distance;
31
+ }
32
+ }
@@ -0,0 +1,87 @@
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 { type AsyncController, type I18nKeys, type IDocument, Precision, type XYZ } from "chili-core";
5
+ import {
6
+ Dimension,
7
+ type PointSnapData,
8
+ PointSnapEventHandler,
9
+ type SnapPointOnAxisData,
10
+ SnapPointOnAxisEventHandler,
11
+ type SnapPointOnCurveData,
12
+ SnapPointOnCurveEventHandler,
13
+ SnapPointPlaneEventHandler,
14
+ } from "../snap";
15
+ import { SnapStep } from "./step";
16
+
17
+ function defaultSnapedData(): PointSnapData {
18
+ return { dimension: Dimension.D1 | Dimension.D1D2D3 };
19
+ }
20
+
21
+ export class PointStep extends SnapStep<PointSnapData> {
22
+ constructor(tip: I18nKeys, handleData: () => PointSnapData = defaultSnapedData, keepSelected = false) {
23
+ super(tip, handleData, keepSelected);
24
+ }
25
+
26
+ protected getEventHandler(document: IDocument, controller: AsyncController, data: PointSnapData) {
27
+ return new PointSnapEventHandler(document, controller, data);
28
+ }
29
+
30
+ protected validator(data: PointSnapData, point: XYZ): boolean {
31
+ return data.refPoint === undefined || data.refPoint().distanceTo(point) > Precision.Distance;
32
+ }
33
+ }
34
+
35
+ export class PointOnCurveStep extends SnapStep<SnapPointOnCurveData> {
36
+ constructor(tip: I18nKeys, handleData: () => SnapPointOnCurveData, keepSelected = false) {
37
+ super(tip, handleData, keepSelected);
38
+ }
39
+
40
+ protected override validator(data: SnapPointOnCurveData, point: XYZ): boolean {
41
+ return true;
42
+ }
43
+
44
+ protected override getEventHandler(
45
+ document: IDocument,
46
+ controller: AsyncController,
47
+ data: SnapPointOnCurveData,
48
+ ) {
49
+ return new SnapPointOnCurveEventHandler(document, controller, data);
50
+ }
51
+ }
52
+
53
+ export class PointOnAxisStep extends SnapStep<SnapPointOnAxisData> {
54
+ constructor(tip: I18nKeys, handleData: () => SnapPointOnAxisData, keepSelected = false) {
55
+ super(tip, handleData, keepSelected);
56
+ }
57
+
58
+ protected override validator(data: SnapPointOnAxisData, point: XYZ): boolean {
59
+ return true;
60
+ }
61
+
62
+ protected override getEventHandler(
63
+ document: IDocument,
64
+ controller: AsyncController,
65
+ data: SnapPointOnAxisData,
66
+ ) {
67
+ return new SnapPointOnAxisEventHandler(document, controller, data);
68
+ }
69
+ }
70
+
71
+ export class PointOnPlaneStep extends SnapStep<PointSnapData> {
72
+ constructor(tip: I18nKeys, handleData: () => PointSnapData, keepSelected = false) {
73
+ super(tip, handleData, keepSelected);
74
+ }
75
+
76
+ protected override validator(data: PointSnapData, point: XYZ): boolean {
77
+ return true;
78
+ }
79
+
80
+ protected override getEventHandler(
81
+ document: IDocument,
82
+ controller: AsyncController,
83
+ data: SnapPointOnCurveData,
84
+ ) {
85
+ return new SnapPointPlaneEventHandler(document, controller, data);
86
+ }
87
+ }
@@ -0,0 +1,130 @@
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 type {
5
+ AsyncController,
6
+ I18nKeys,
7
+ IDocument,
8
+ INodeFilter,
9
+ IShapeFilter,
10
+ ShapeNode,
11
+ ShapeType,
12
+ VisualState,
13
+ } from "chili-core";
14
+ import type { SnapResult } from "../snap";
15
+ import type { IStep } from "./step";
16
+
17
+ export interface SelectShapeOptions {
18
+ multiple?: boolean;
19
+ nodeFilter?: INodeFilter;
20
+ shapeFilter?: IShapeFilter;
21
+ selectedState?: VisualState;
22
+ highlightState?: VisualState;
23
+ keepSelection?: boolean;
24
+ }
25
+
26
+ export interface SelectNodeOptions {
27
+ multiple?: boolean;
28
+ filter?: INodeFilter;
29
+ keepSelection?: boolean;
30
+ }
31
+
32
+ export abstract class SelectStep implements IStep {
33
+ constructor(
34
+ readonly snapeType: ShapeType,
35
+ readonly prompt: I18nKeys,
36
+ readonly options?: SelectShapeOptions,
37
+ ) {}
38
+
39
+ async execute(document: IDocument, controller: AsyncController): Promise<SnapResult | undefined> {
40
+ const { shapeType, shapeFilter, nodeFilter } = document.selection;
41
+ document.selection.shapeType = this.snapeType;
42
+ document.selection.shapeFilter = this.options?.shapeFilter;
43
+ document.selection.nodeFilter = this.options?.nodeFilter;
44
+ if (!this.options?.keepSelection) {
45
+ document.selection.clearSelection();
46
+ document.visual.highlighter.clear();
47
+ }
48
+
49
+ return Promise.try(this.select.bind(this), document, controller).finally(() => {
50
+ document.selection.shapeType = shapeType;
51
+ document.selection.shapeFilter = shapeFilter;
52
+ document.selection.nodeFilter = nodeFilter;
53
+ });
54
+ }
55
+
56
+ abstract select(document: IDocument, controller: AsyncController): Promise<SnapResult | undefined>;
57
+ }
58
+
59
+ export class SelectShapeStep extends SelectStep {
60
+ override async select(document: IDocument, controller: AsyncController): Promise<SnapResult | undefined> {
61
+ const shapes = await document.selection.pickShape(
62
+ this.prompt,
63
+ controller,
64
+ this.options?.multiple === true,
65
+ this.options?.selectedState,
66
+ this.options?.highlightState,
67
+ );
68
+ if (shapes.length === 0) return undefined;
69
+ return {
70
+ view: document.application.activeView!,
71
+ shapes,
72
+ nodes: shapes.map((x) => x.owner.node),
73
+ };
74
+ }
75
+ }
76
+
77
+ export class SelectNodeStep implements IStep {
78
+ constructor(
79
+ readonly prompt: I18nKeys,
80
+ readonly options?: SelectNodeOptions,
81
+ ) {}
82
+
83
+ async execute(document: IDocument, controller: AsyncController): Promise<SnapResult | undefined> {
84
+ const { nodeFilter } = document.selection;
85
+ document.selection.nodeFilter = this.options?.filter;
86
+ if (!this.options?.keepSelection) {
87
+ document.selection.clearSelection();
88
+ document.visual.highlighter.clear();
89
+ }
90
+
91
+ return Promise.try(async () => {
92
+ const nodes = await document.selection.pickNode(
93
+ this.prompt,
94
+ controller,
95
+ this.options?.multiple === true,
96
+ );
97
+ if (nodes.length === 0) return undefined;
98
+ return {
99
+ view: document.application.activeView!,
100
+ shapes: [],
101
+ nodes,
102
+ };
103
+ }).finally(() => {
104
+ document.selection.nodeFilter = nodeFilter;
105
+ });
106
+ }
107
+ }
108
+
109
+ export class GetOrSelectNodeStep extends SelectNodeStep {
110
+ override execute(document: IDocument, controller: AsyncController): Promise<SnapResult | undefined> {
111
+ const selected = document.selection.getSelectedNodes().filter((x) => {
112
+ if (this.options?.filter?.allow) {
113
+ return this.options.filter.allow(x);
114
+ }
115
+
116
+ return true;
117
+ });
118
+
119
+ if (selected.length > 0) {
120
+ controller.success();
121
+ return Promise.resolve({
122
+ view: document.application.activeView!,
123
+ shapes: [],
124
+ nodes: selected as ShapeNode[],
125
+ });
126
+ }
127
+
128
+ return super.execute(document, controller);
129
+ }
130
+ }
@@ -0,0 +1,55 @@
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 type { AsyncController, CursorType, I18nKeys, IDocument, XYZ } from "chili-core";
5
+ import type { SnapData, SnapEventHandler, SnapResult } from "../snap";
6
+
7
+ export interface IStep {
8
+ execute(document: IDocument, controller: AsyncController): Promise<SnapResult | undefined>;
9
+ }
10
+
11
+ export abstract class SnapStep<D extends SnapData> implements IStep {
12
+ protected cursor: CursorType = "draw";
13
+
14
+ constructor(
15
+ readonly tip: I18nKeys,
16
+ private readonly handleStepData: () => D,
17
+ private readonly keepSelected: boolean = false,
18
+ ) {}
19
+
20
+ async execute(document: IDocument, controller: AsyncController): Promise<SnapResult | undefined> {
21
+ if (!this.keepSelected) {
22
+ document.selection.clearSelection();
23
+ document.visual.highlighter.clear();
24
+ }
25
+
26
+ const data = this.handleStepData();
27
+ this.setValidator(data);
28
+
29
+ const executorHandler = this.getEventHandler(document, controller, data);
30
+ await document.selection.pickAsync(executorHandler, this.tip, controller, false, this.cursor);
31
+ const snaped = executorHandler.snaped;
32
+
33
+ executorHandler.dispose();
34
+
35
+ return controller.result?.status === "success" ? snaped : undefined;
36
+ }
37
+
38
+ private setValidator(data: D) {
39
+ const oldValidator = data.validator;
40
+ data.validator = (point) => {
41
+ if (oldValidator) {
42
+ return oldValidator(point) && this.validator(data, point);
43
+ }
44
+ return this.validator(data, point);
45
+ };
46
+ }
47
+
48
+ protected abstract getEventHandler(
49
+ document: IDocument,
50
+ controller: AsyncController,
51
+ data: D,
52
+ ): SnapEventHandler;
53
+
54
+ protected abstract validator(data: D, point: XYZ): boolean;
55
+ }