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,254 @@
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
+ AsyncController,
6
+ BoundingBox,
7
+ CancelableCommand,
8
+ command,
9
+ EditableShapeNode,
10
+ type GeometryNode,
11
+ I18n,
12
+ type ICurve,
13
+ type IDisposable,
14
+ type IDocument,
15
+ type IEdge,
16
+ type IShape,
17
+ type IShapeFilter,
18
+ type ITrimmedCurve,
19
+ type IView,
20
+ type IVisualGeometry,
21
+ type ShapeNode,
22
+ ShapeType,
23
+ Transaction,
24
+ VisualConfig,
25
+ type VisualShapeData,
26
+ } from "chili-core";
27
+ import { GeoUtils } from "chili-geo";
28
+ import { ShapeSelectionHandler } from "chili-vis";
29
+
30
+ @command({
31
+ key: "modify.trim",
32
+ icon: "icon-trim",
33
+ })
34
+ export class Trim extends CancelableCommand {
35
+ protected override async executeAsync() {
36
+ const transaction = new Transaction(this.document, I18n.translate("command.modify.trim"));
37
+ transaction.start();
38
+ try {
39
+ await this.trimAsync();
40
+ } catch (e) {
41
+ transaction.rollback();
42
+ throw e;
43
+ }
44
+ transaction.commit();
45
+ }
46
+
47
+ private async trimAsync() {
48
+ this.document.visual.highlighter.clear();
49
+ this.document.selection.clearSelection();
50
+
51
+ while (!this.isCompleted) {
52
+ this.controller = new AsyncController();
53
+ const handler = new PickTrimEdgeEventHandler(this.document, this.controller);
54
+ await this.document.selection.pickAsync(
55
+ handler,
56
+ "prompt.select.edges",
57
+ this.controller,
58
+ false,
59
+ "select.default",
60
+ );
61
+ if (this.controller.result?.status !== "success" || !handler.selected) {
62
+ break;
63
+ }
64
+ this.trimEdge(handler.selected);
65
+ handler.dispose();
66
+ }
67
+ }
68
+
69
+ private trimEdge(selected: TrimEdge) {
70
+ const model = this.document.visual.context.getNode(selected.edge.owner);
71
+ const materialId = (model as GeometryNode)?.materialId;
72
+ selected.segments.retainSegments.forEach((segment) => {
73
+ const newEdge = selected.curve.trim(segment.start, segment.end).makeEdge();
74
+ model?.parent?.add(new EditableShapeNode(this.document, model.name, newEdge, materialId));
75
+ });
76
+ model?.parent?.remove(model);
77
+ }
78
+ }
79
+
80
+ export class EdgeFilter implements IShapeFilter {
81
+ allow(shape: IShape): boolean {
82
+ return shape.shapeType === ShapeType.Edge;
83
+ }
84
+ }
85
+
86
+ interface TrimEdge {
87
+ edge: VisualShapeData;
88
+ curve: ICurve;
89
+ segments: {
90
+ deleteSegment: {
91
+ start: number;
92
+ end: number;
93
+ };
94
+ retainSegments: {
95
+ start: number;
96
+ end: number;
97
+ }[];
98
+ };
99
+ }
100
+
101
+ export class PickTrimEdgeEventHandler extends ShapeSelectionHandler {
102
+ #selected: TrimEdge | undefined;
103
+ private highlightedEdge: number | undefined;
104
+ private highlight: undefined | TrimEdge;
105
+ private readonly releaseStack = new Set<IDisposable>();
106
+
107
+ get selected() {
108
+ return this.#selected;
109
+ }
110
+
111
+ constructor(document: IDocument, controller: AsyncController) {
112
+ super(document, ShapeType.Shape, false, controller, new EdgeFilter());
113
+ }
114
+
115
+ protected override highlightDetecteds(view: IView, detecteds: VisualShapeData[]): void {
116
+ this.cleanHighlights();
117
+ if (detecteds.length !== 1 || detecteds[0].shape.shapeType !== ShapeType.Edge) return;
118
+
119
+ const box = BoundingBox.transformed(detecteds[0].owner.boundingBox()!, detecteds[0].transform);
120
+ const edges = this.filterByBoundingBox(box, view, detecteds[0].shape);
121
+ const edge = detecteds[0].shape.transformedMul(detecteds[0].transform) as IEdge;
122
+ this.releaseStack.add(edge);
123
+
124
+ const segments = findSegments(edge.curve, edge, edges, detecteds);
125
+ const mesh = edge.trim(segments.deleteSegment.start, segments.deleteSegment.end).mesh.edges!;
126
+ mesh.color = VisualConfig.highlightEdgeColor;
127
+ mesh.lineWidth = 3;
128
+ this.highlightedEdge = view.document.visual.highlighter.highlightMesh(mesh);
129
+ this.highlight = { edge: detecteds[0], segments, curve: edge.curve };
130
+ view.update();
131
+ }
132
+
133
+ protected override cleanHighlights(): void {
134
+ if (this.highlightedEdge !== undefined) {
135
+ this.document.visual.highlighter.removeHighlightMesh(this.highlightedEdge);
136
+ this.highlightedEdge = undefined;
137
+ this.highlight = undefined;
138
+ this.document.application.activeView?.update();
139
+ }
140
+ }
141
+
142
+ protected override clearSelected(document: IDocument): void {
143
+ this.#selected = undefined;
144
+ }
145
+
146
+ protected override select(view: IView, event: PointerEvent): number {
147
+ this.#selected = this.highlight;
148
+ return this.#selected ? 1 : 0;
149
+ }
150
+
151
+ private filterByBoundingBox(box: BoundingBox, view: IView, currentShape: IShape) {
152
+ const boundingBox = BoundingBox.expand(box, 1e-3);
153
+ return view.document.visual.context
154
+ .boundingBoxIntersectFilter(boundingBox, new EdgeFilter())
155
+ .map((x) => {
156
+ const node = (x as IVisualGeometry)?.geometryNode;
157
+ const shape = (node as ShapeNode)?.shape?.value;
158
+ if (!shape || shape === currentShape) return undefined;
159
+ const edge = shape.transformedMul(node.worldTransform()) as IEdge;
160
+ this.releaseStack.add(edge);
161
+ return edge;
162
+ })
163
+ .filter((x) => x !== undefined);
164
+ }
165
+
166
+ override disposeInternal(): void {
167
+ super.disposeInternal();
168
+
169
+ this.releaseStack.forEach((x) => x.dispose());
170
+ this.releaseStack.clear();
171
+ }
172
+ }
173
+
174
+ function findSegments(curve: ITrimmedCurve, edge: IEdge, otherEdges: IEdge[], detecteds: VisualShapeData[]) {
175
+ let intersections = GeoUtils.intersects(edge, otherEdges).map((x) => x.parameter);
176
+ intersections.push(curve.firstParameter(), curve.lastParameter());
177
+ intersections = Array.from(new Set(intersections)).sort((a, b) => a - b);
178
+
179
+ if (intersections.length === 2) return allSegment(intersections);
180
+
181
+ const parameter = curve.parameter(detecteds[0].point!, 5)!;
182
+ for (let i = 1; i < intersections.length; i++) {
183
+ if (parameter < intersections[i]) {
184
+ if (i === 1) {
185
+ return startSegment(intersections);
186
+ } else if (i === intersections.length - 1) {
187
+ return lastSegment(intersections);
188
+ } else {
189
+ return centerSegment(intersections, i);
190
+ }
191
+ }
192
+ }
193
+
194
+ return allSegment(intersections);
195
+ }
196
+
197
+ function allSegment(intersections: number[]) {
198
+ return {
199
+ deleteSegment: {
200
+ start: intersections[0],
201
+ end: intersections.at(-1)!,
202
+ },
203
+ retainSegments: [],
204
+ };
205
+ }
206
+
207
+ function centerSegment(intersections: number[], i: number) {
208
+ return {
209
+ deleteSegment: {
210
+ start: intersections.at(i - 1)!,
211
+ end: intersections.at(i)!,
212
+ },
213
+ retainSegments: [
214
+ {
215
+ start: intersections[0],
216
+ end: intersections[i - 1],
217
+ },
218
+ {
219
+ start: intersections[i],
220
+ end: intersections.at(-1)!,
221
+ },
222
+ ],
223
+ };
224
+ }
225
+
226
+ function lastSegment(intersections: number[]) {
227
+ return {
228
+ deleteSegment: {
229
+ start: intersections.at(-2)!,
230
+ end: intersections.at(-1)!,
231
+ },
232
+ retainSegments: [
233
+ {
234
+ start: intersections[0],
235
+ end: intersections.at(-2)!,
236
+ },
237
+ ],
238
+ };
239
+ }
240
+
241
+ function startSegment(intersections: number[]) {
242
+ return {
243
+ deleteSegment: {
244
+ start: intersections[0],
245
+ end: intersections[1],
246
+ },
247
+ retainSegments: [
248
+ {
249
+ start: intersections[1],
250
+ end: intersections.at(-1)!,
251
+ },
252
+ ],
253
+ };
254
+ }
@@ -0,0 +1,125 @@
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
+ AsyncController,
6
+ CancelableCommand,
7
+ Config,
8
+ EdgeMeshData,
9
+ type IShape,
10
+ type IShapeFactory,
11
+ type IView,
12
+ LineType,
13
+ Result,
14
+ VertexMeshData,
15
+ VisualConfig,
16
+ type XYZ,
17
+ } from "chili-core";
18
+ import { ViewUtils } from "chili-vis";
19
+ import type { SnapResult } from "../snap";
20
+ import type { IStep } from "../step";
21
+
22
+ export abstract class MultistepCommand extends CancelableCommand {
23
+ protected stepDatas: SnapResult[] = [];
24
+
25
+ protected canExcute(): Promise<boolean> {
26
+ return Promise.resolve(true);
27
+ }
28
+
29
+ protected override onRestarting(): void {
30
+ this.resetStepDatas();
31
+ }
32
+
33
+ protected async executeAsync(): Promise<void> {
34
+ if (!(await this.canExcute()) || !(await this.executeSteps())) {
35
+ return;
36
+ }
37
+
38
+ this.executeMainTask();
39
+ }
40
+
41
+ protected async executeSteps(): Promise<boolean> {
42
+ const steps = this.getSteps();
43
+
44
+ return Promise.try(async () => {
45
+ while (this.stepDatas.length < steps.length) {
46
+ this.controller = new AsyncController();
47
+ const data = await steps[this.stepDatas.length].execute(this.document, this.controller);
48
+ if (data === undefined || this.controller.result?.status !== "success") {
49
+ return false;
50
+ }
51
+ this.stepDatas.push(data);
52
+ }
53
+ return true;
54
+ }).finally(() => {
55
+ if (!this._isRestarting) {
56
+ this.document.selection.clearSelection();
57
+ this.document.visual.highlighter.clear();
58
+ }
59
+ });
60
+ }
61
+
62
+ protected resetStepDatas() {
63
+ this.stepDatas.length = 0;
64
+ }
65
+
66
+ protected meshPoint(point: XYZ) {
67
+ return VertexMeshData.from(point, VisualConfig.editVertexSize, VisualConfig.editVertexColor);
68
+ }
69
+
70
+ protected meshLine(start: XYZ, end: XYZ, color = VisualConfig.defaultEdgeColor, lineWith?: number) {
71
+ const data = EdgeMeshData.from(start, end, color, LineType.Solid);
72
+ if (lineWith !== undefined) {
73
+ data.lineWidth = lineWith;
74
+ }
75
+ return data;
76
+ }
77
+
78
+ protected meshCreatedShape<K extends keyof IShapeFactory>(
79
+ method: K,
80
+ ...args: Parameters<IShapeFactory[K] extends (...args: any) => any ? IShapeFactory[K] : never>
81
+ ) {
82
+ const shape = (this.application.shapeFactory as any)[method](...args);
83
+ return this.meshShape(shape);
84
+ }
85
+
86
+ protected meshShape(shape: IShape | Result<IShape>, disposeShape = true) {
87
+ if (shape instanceof Result && !shape.isOk) {
88
+ throw shape.error;
89
+ }
90
+
91
+ const s = shape instanceof Result ? shape.value : shape;
92
+ const edgeMesh = s.edgesMeshPosition();
93
+ if (disposeShape) {
94
+ s.dispose();
95
+ }
96
+
97
+ return edgeMesh;
98
+ }
99
+
100
+ protected readonly findPlane = (view: IView, origin: XYZ, point: XYZ | undefined) => {
101
+ if (point === undefined || !Config.instance.dynamicWorkplane) {
102
+ return view.workplane.translateTo(origin);
103
+ }
104
+
105
+ return ViewUtils.raycastClosestPlane(view, origin, point);
106
+ };
107
+
108
+ protected transformdFirstShape(step: SnapResult, shouldDispose = true) {
109
+ const shape = step.shapes[0].shape.transformedMul(step.shapes[0].transform);
110
+ if (shouldDispose) this.disposeStack.add(shape);
111
+ return shape;
112
+ }
113
+
114
+ protected transformdShapes(step: SnapResult, shouldDispose = true) {
115
+ return step.shapes.map((s) => {
116
+ const shape = s.shape.transformedMul(s.transform);
117
+ if (shouldDispose) this.disposeStack.add(shape);
118
+ return shape;
119
+ });
120
+ }
121
+
122
+ protected abstract getSteps(): IStep[];
123
+
124
+ protected abstract executeMainTask(): void;
125
+ }
@@ -0,0 +1,16 @@
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 { command, type IApplication, type ICommand } from "chili-core";
5
+
6
+ @command({
7
+ key: "edit.redo",
8
+ icon: "icon-redo",
9
+ })
10
+ export class Redo implements ICommand {
11
+ async execute(app: IApplication): Promise<void> {
12
+ const document = app.activeView?.document;
13
+ document?.history.redo();
14
+ document?.visual.update();
15
+ }
16
+ }
@@ -0,0 +1,16 @@
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 { command, type IApplication, type ICommand } from "chili-core";
5
+
6
+ @command({
7
+ key: "edit.undo",
8
+ icon: "icon-undo",
9
+ })
10
+ export class Undo implements ICommand {
11
+ async execute(application: IApplication): Promise<void> {
12
+ const document = application.activeView?.document;
13
+ document?.history.undo();
14
+ document?.visual.update();
15
+ }
16
+ }
@@ -0,0 +1,150 @@
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 { div, RadioGroup } from "chili-controls";
5
+ import {
6
+ AsyncController,
7
+ command,
8
+ DialogResult,
9
+ I18n,
10
+ type IApplication,
11
+ type ICommand,
12
+ type ICurve,
13
+ type IEdge,
14
+ type IFace,
15
+ Observable,
16
+ Plane,
17
+ Property,
18
+ PubSub,
19
+ SelectableItems,
20
+ SelectMode,
21
+ ShapeType,
22
+ XYZ,
23
+ } from "chili-core";
24
+ import { Dimension } from "../snap";
25
+ import { type IStep, PointOnCurveStep, SelectShapeStep } from "../step";
26
+ import { MultistepCommand } from "./multistepCommand";
27
+
28
+ export class WorkingPlaneViewModel extends Observable {
29
+ @Property.define("dialog.title.selectWorkingPlane")
30
+ planes: SelectableItems<string> = new SelectableItems(["XOY", "YOZ", "ZOX"], SelectMode.radio, ["XOY"]);
31
+ }
32
+
33
+ @command({
34
+ key: "workingPlane.set",
35
+ icon: "icon-setWorkingPlane",
36
+ })
37
+ export class SetWorkplane implements ICommand {
38
+ async execute(application: IApplication): Promise<void> {
39
+ const view = application.activeView;
40
+ if (!view) return;
41
+
42
+ const vm = new WorkingPlaneViewModel();
43
+ PubSub.default.pub("showDialog", "dialog.title.selectWorkingPlane", this.ui(vm), (result) => {
44
+ if (result === DialogResult.ok) {
45
+ const planes = [Plane.XY, Plane.YZ, Plane.ZX];
46
+ view.workplane = planes[vm.planes.selectedIndexes[0]];
47
+ }
48
+ });
49
+ }
50
+
51
+ private ui(vm: WorkingPlaneViewModel) {
52
+ return div(
53
+ ...Property.getProperties(vm).map((x) => {
54
+ const value = (vm as any)[x.name];
55
+ if (value instanceof SelectableItems) {
56
+ return new RadioGroup(I18n.translate(x.display), value);
57
+ }
58
+ return "";
59
+ }),
60
+ );
61
+ }
62
+ }
63
+
64
+ @command({
65
+ key: "workingPlane.alignToPlane",
66
+ icon: "icon-alignWorkingPlane",
67
+ })
68
+ export class AlignToPlane implements ICommand {
69
+ async execute(application: IApplication): Promise<void> {
70
+ const view = application.activeView;
71
+ if (!view) return;
72
+ view.document.selection.clearSelection();
73
+ const controller = new AsyncController();
74
+ const data = await new SelectShapeStep(ShapeType.Face, "prompt.select.faces").execute(
75
+ view.document,
76
+ controller,
77
+ );
78
+ controller.dispose();
79
+ if (!data || data.shapes.length === 0) return;
80
+ view.document.visual.highlighter.clear();
81
+ const face = data.shapes[0].shape.transformedMul(data.shapes[0].transform) as IFace;
82
+ const [point, normal] = face.normal(0, 0);
83
+ face.dispose();
84
+ let xvec = XYZ.unitX;
85
+ if (!normal.isParallelTo(XYZ.unitZ)) {
86
+ xvec = XYZ.unitZ.cross(normal).normalize()!;
87
+ }
88
+ view.workplane = new Plane(point, normal, xvec);
89
+ }
90
+ }
91
+
92
+ @command({
93
+ key: "workingPlane.fromSection",
94
+ icon: "icon-fromSection",
95
+ })
96
+ export class FromSection extends MultistepCommand {
97
+ protected override executeMainTask() {
98
+ const curve = this.transformedCurve();
99
+ const point = this.stepDatas[1].point!;
100
+
101
+ const parameter = curve.parameter(point, 1e-3);
102
+ if (parameter === undefined) return;
103
+ const direction = curve.d1(parameter).vec.normalize()!;
104
+ const xvec: XYZ = this.findXVec(direction);
105
+ const plane = new Plane(point, direction, xvec);
106
+ const view = this.application.activeView;
107
+ if (!view) return;
108
+ view.workplane = plane;
109
+ }
110
+
111
+ private findXVec(direction: XYZ) {
112
+ let xvec: XYZ;
113
+ if (direction.isEqualTo(XYZ.unitZ)) {
114
+ xvec = XYZ.unitX;
115
+ } else if (direction.isEqualTo(new XYZ(0, 0, -1))) {
116
+ xvec = XYZ.unitY;
117
+ } else {
118
+ xvec = direction.cross(XYZ.unitZ).normalize()!;
119
+ }
120
+ return xvec;
121
+ }
122
+
123
+ protected override getSteps(): IStep[] {
124
+ return [
125
+ new SelectShapeStep(ShapeType.Edge, "prompt.select.edges"),
126
+ new PointOnCurveStep("prompt.pickFistPoint", this.handlePointData, true),
127
+ ];
128
+ }
129
+
130
+ private transformedCurve() {
131
+ const shape = this.stepDatas[0].shapes[0].shape as IEdge;
132
+ const matrix = shape.matrix.multiply(this.stepDatas[0].shapes[0].transform);
133
+ const curve = shape.curve.transformed(matrix) as ICurve;
134
+ this.disposeStack.add(curve);
135
+ return curve;
136
+ }
137
+
138
+ private readonly handlePointData = () => {
139
+ const curve = this.transformedCurve();
140
+ return {
141
+ curve,
142
+ dimension: Dimension.D1,
143
+ preview: (point: XYZ | undefined) => {
144
+ if (!point) return [];
145
+ const project = curve.project(point).at(0);
146
+ return [this.meshPoint(project ?? point)];
147
+ },
148
+ };
149
+ };
150
+ }
@@ -0,0 +1,12 @@
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 IEqualityComparer, Precision } from "chili-core";
5
+
6
+ export class NumberEqualityComparer implements IEqualityComparer<number> {
7
+ constructor(readonly tolerance: number = Precision.Distance) {}
8
+
9
+ equals(left: number, right: number): boolean {
10
+ return Math.abs(left - right) < this.tolerance;
11
+ }
12
+ }
@@ -0,0 +1,12 @@
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 IEqualityComparer, Precision, type XYZ } from "chili-core";
5
+
6
+ export class XYZEqualityComparer implements IEqualityComparer<XYZ> {
7
+ constructor(readonly tolerance: number = Precision.Distance) {}
8
+
9
+ equals(left: XYZ, right: XYZ): boolean {
10
+ return left.isEqualTo(right, this.tolerance);
11
+ }
12
+ }
@@ -0,0 +1,5 @@
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 "./NumberEqualityComparer";
5
+ export * from "./XYZEqualityComparer";