@things-factory/figure-ui 10.1.147 → 10.1.149

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 (209) hide show
  1. package/client/bootstrap.ts +10 -2
  2. package/client/graphql/index.ts +20 -0
  3. package/client/modeller/canvas.ts +6 -2
  4. package/client/modeller/carrier-declaration.ts +63 -0
  5. package/client/modeller/editor.ts +62 -27
  6. package/client/modeller/figure-carrier.ts +117 -0
  7. package/client/modeller/figure-cavity-drawing.ts +3 -9
  8. package/client/modeller/figure-first-save.ts +4 -7
  9. package/client/modeller/figure-history-panel.ts +2 -3
  10. package/client/modeller/figure-links.ts +46 -60
  11. package/client/modeller/figure-material-panel.ts +4 -14
  12. package/client/modeller/figure-mesh-choice.ts +68 -0
  13. package/client/modeller/figure-parts.ts +23 -1
  14. package/client/modeller/figure-preview.ts +2 -2
  15. package/client/modeller/figure-properties.ts +5 -3
  16. package/client/modeller/figure-section-editor.ts +12 -33
  17. package/client/modeller/figure-section-panel.ts +6 -7
  18. package/client/modeller/figure-slot-layout-panel.ts +208 -0
  19. package/client/modeller/figure-verdict.ts +21 -31
  20. package/client/modeller/first-save.ts +23 -0
  21. package/client/modeller/links.ts +52 -1
  22. package/client/modeller/material-edit.ts +38 -0
  23. package/client/modeller/maturity.ts +28 -0
  24. package/client/modeller/mesh-import.ts +77 -0
  25. package/client/modeller/modeller-route.ts +9 -0
  26. package/client/modeller/mounting-part.ts +15 -0
  27. package/client/modeller/newest-answer.ts +21 -0
  28. package/client/modeller/preview-model.ts +5 -0
  29. package/client/modeller/refusals.ts +168 -82
  30. package/client/modeller/section-controls.ts +25 -1
  31. package/client/modeller/section-drawing.ts +43 -1
  32. package/client/modeller/slot-layout-host.ts +140 -0
  33. package/client/pages/figure-modeller-page.ts +6 -5
  34. package/client/viewparts/detail-route.ts +7 -0
  35. package/client/viewparts/figure-detail-dock.ts +1 -3
  36. package/dist-client/bootstrap.d.ts +1 -1
  37. package/dist-client/bootstrap.js +9 -2
  38. package/dist-client/bootstrap.js.map +1 -1
  39. package/dist-client/graphql/index.d.ts +5 -0
  40. package/dist-client/graphql/index.js +19 -0
  41. package/dist-client/graphql/index.js.map +1 -1
  42. package/dist-client/modeller/canvas.d.ts +2 -0
  43. package/dist-client/modeller/canvas.js +10 -2
  44. package/dist-client/modeller/canvas.js.map +1 -1
  45. package/dist-client/modeller/carrier-declaration.d.ts +31 -0
  46. package/dist-client/modeller/carrier-declaration.js +53 -0
  47. package/dist-client/modeller/carrier-declaration.js.map +1 -0
  48. package/dist-client/modeller/editor.d.ts +13 -0
  49. package/dist-client/modeller/editor.js +62 -27
  50. package/dist-client/modeller/editor.js.map +1 -1
  51. package/dist-client/modeller/figure-carrier.d.ts +26 -0
  52. package/dist-client/modeller/figure-carrier.js +123 -0
  53. package/dist-client/modeller/figure-carrier.js.map +1 -0
  54. package/dist-client/modeller/figure-cavity-drawing.js +3 -11
  55. package/dist-client/modeller/figure-cavity-drawing.js.map +1 -1
  56. package/dist-client/modeller/figure-first-save.d.ts +4 -0
  57. package/dist-client/modeller/figure-first-save.js +5 -8
  58. package/dist-client/modeller/figure-first-save.js.map +1 -1
  59. package/dist-client/modeller/figure-history-panel.js +2 -4
  60. package/dist-client/modeller/figure-history-panel.js.map +1 -1
  61. package/dist-client/modeller/figure-links.d.ts +4 -1
  62. package/dist-client/modeller/figure-links.js +47 -57
  63. package/dist-client/modeller/figure-links.js.map +1 -1
  64. package/dist-client/modeller/figure-material-panel.d.ts +0 -1
  65. package/dist-client/modeller/figure-material-panel.js +4 -14
  66. package/dist-client/modeller/figure-material-panel.js.map +1 -1
  67. package/dist-client/modeller/figure-mesh-choice.d.ts +16 -0
  68. package/dist-client/modeller/figure-mesh-choice.js +75 -0
  69. package/dist-client/modeller/figure-mesh-choice.js.map +1 -0
  70. package/dist-client/modeller/figure-parts.d.ts +1 -1
  71. package/dist-client/modeller/figure-parts.js +22 -0
  72. package/dist-client/modeller/figure-parts.js.map +1 -1
  73. package/dist-client/modeller/figure-preview.js +2 -2
  74. package/dist-client/modeller/figure-preview.js.map +1 -1
  75. package/dist-client/modeller/figure-properties.d.ts +2 -1
  76. package/dist-client/modeller/figure-properties.js +5 -3
  77. package/dist-client/modeller/figure-properties.js.map +1 -1
  78. package/dist-client/modeller/figure-section-editor.d.ts +2 -2
  79. package/dist-client/modeller/figure-section-editor.js +12 -33
  80. package/dist-client/modeller/figure-section-editor.js.map +1 -1
  81. package/dist-client/modeller/figure-section-panel.js +6 -7
  82. package/dist-client/modeller/figure-section-panel.js.map +1 -1
  83. package/dist-client/modeller/figure-slot-layout-panel.d.ts +36 -0
  84. package/dist-client/modeller/figure-slot-layout-panel.js +198 -0
  85. package/dist-client/modeller/figure-slot-layout-panel.js.map +1 -0
  86. package/dist-client/modeller/figure-verdict.d.ts +1 -1
  87. package/dist-client/modeller/figure-verdict.js +19 -37
  88. package/dist-client/modeller/figure-verdict.js.map +1 -1
  89. package/dist-client/modeller/first-save.d.ts +10 -0
  90. package/dist-client/modeller/first-save.js +16 -0
  91. package/dist-client/modeller/first-save.js.map +1 -1
  92. package/dist-client/modeller/links.d.ts +26 -1
  93. package/dist-client/modeller/links.js +43 -0
  94. package/dist-client/modeller/links.js.map +1 -1
  95. package/dist-client/modeller/material-edit.d.ts +11 -0
  96. package/dist-client/modeller/material-edit.js +28 -0
  97. package/dist-client/modeller/material-edit.js.map +1 -0
  98. package/dist-client/modeller/maturity.d.ts +15 -0
  99. package/dist-client/modeller/maturity.js +23 -0
  100. package/dist-client/modeller/maturity.js.map +1 -1
  101. package/dist-client/modeller/mesh-import.d.ts +47 -0
  102. package/dist-client/modeller/mesh-import.js +47 -0
  103. package/dist-client/modeller/mesh-import.js.map +1 -0
  104. package/dist-client/modeller/modeller-route.d.ts +5 -0
  105. package/dist-client/modeller/modeller-route.js +9 -0
  106. package/dist-client/modeller/modeller-route.js.map +1 -1
  107. package/dist-client/modeller/mounting-part.d.ts +14 -0
  108. package/dist-client/modeller/mounting-part.js +10 -0
  109. package/dist-client/modeller/mounting-part.js.map +1 -0
  110. package/dist-client/modeller/newest-answer.d.ts +12 -0
  111. package/dist-client/modeller/newest-answer.js +21 -0
  112. package/dist-client/modeller/newest-answer.js.map +1 -0
  113. package/dist-client/modeller/preview-model.d.ts +2 -0
  114. package/dist-client/modeller/preview-model.js +4 -0
  115. package/dist-client/modeller/preview-model.js.map +1 -1
  116. package/dist-client/modeller/refusals.d.ts +26 -5
  117. package/dist-client/modeller/refusals.js +184 -86
  118. package/dist-client/modeller/refusals.js.map +1 -1
  119. package/dist-client/modeller/section-controls.d.ts +17 -1
  120. package/dist-client/modeller/section-controls.js +18 -0
  121. package/dist-client/modeller/section-controls.js.map +1 -1
  122. package/dist-client/modeller/section-drawing.d.ts +24 -1
  123. package/dist-client/modeller/section-drawing.js +42 -0
  124. package/dist-client/modeller/section-drawing.js.map +1 -1
  125. package/dist-client/modeller/slot-layout-host.d.ts +81 -0
  126. package/dist-client/modeller/slot-layout-host.js +105 -0
  127. package/dist-client/modeller/slot-layout-host.js.map +1 -0
  128. package/dist-client/pages/figure-modeller-page.js +5 -4
  129. package/dist-client/pages/figure-modeller-page.js.map +1 -1
  130. package/dist-client/tsconfig.tsbuildinfo +1 -1
  131. package/dist-client/viewparts/detail-route.d.ts +5 -0
  132. package/dist-client/viewparts/detail-route.js +8 -0
  133. package/dist-client/viewparts/detail-route.js.map +1 -0
  134. package/dist-client/viewparts/figure-detail-dock.d.ts +0 -1
  135. package/dist-client/viewparts/figure-detail-dock.js +1 -3
  136. package/dist-client/viewparts/figure-detail-dock.js.map +1 -1
  137. package/package.json +9 -8
  138. package/test/align.test.ts +0 -9
  139. package/test/browser/assistant-stand-in.js +32 -0
  140. package/test/browser/build.mjs +6 -1
  141. package/test/browser/editing-page.js +224 -0
  142. package/test/browser/editing.check.mjs +550 -0
  143. package/test/browser/links-page.js +113 -0
  144. package/test/browser/links.check.mjs +568 -0
  145. package/test/browser/modeller.check.mjs +21 -0
  146. package/test/browser/parts-page.js +120 -0
  147. package/test/browser/parts.check.mjs +328 -0
  148. package/test/browser/places-mesh-page.js +36 -0
  149. package/test/browser/places-mesh.check.mjs +239 -0
  150. package/test/browser/product-page.check.mjs +682 -0
  151. package/test/browser/product-page.js +276 -0
  152. package/test/browser/screen-page.js +112 -0
  153. package/test/browser/screen-product-page.js +62 -0
  154. package/test/browser/screen.check.mjs +1003 -0
  155. package/test/browser/section-page.js +256 -0
  156. package/test/browser/section.check.mjs +719 -0
  157. package/test/browser/serve.mjs +20 -12
  158. package/test/carrier-declaration.test.ts +69 -0
  159. package/test/cavity-drawing.test.ts +2 -18
  160. package/test/clip-ai-proposal.test.ts +1 -5
  161. package/test/clip-consent.test.ts +0 -5
  162. package/test/clips.test.ts +0 -7
  163. package/test/command-preview.test.ts +0 -68
  164. package/test/controls.test.ts +0 -9
  165. package/test/detail-dock.test.ts +6 -25
  166. package/test/face-mapping.test.ts +1 -20
  167. package/test/fasten-drawing.test.ts +0 -23
  168. package/test/fields.test.ts +6 -33
  169. package/test/figure-assistant-surface.test.ts +32 -38
  170. package/test/first-minute.test.ts +3 -55
  171. package/test/first-save-suggest.test.ts +11 -8
  172. package/test/first-save.test.ts +4 -26
  173. package/test/gizmo.test.ts +0 -25
  174. package/test/joint-fan.test.ts +0 -10
  175. package/test/keys.test.ts +0 -7
  176. package/test/layout.test.ts +4 -73
  177. package/test/links.test.ts +48 -67
  178. package/test/live.test.ts +0 -34
  179. package/test/material.test.ts +17 -26
  180. package/test/maturity.test.ts +13 -16
  181. package/test/mesh-import.test.ts +76 -0
  182. package/test/modeller-route.test.ts +3 -19
  183. package/test/package-download.test.ts +6 -7
  184. package/test/parts-wiring.test.ts +9 -51
  185. package/test/preview.test.ts +5 -46
  186. package/test/properties.test.ts +11 -26
  187. package/test/proposal-record.test.ts +2 -19
  188. package/test/recipes.test.ts +0 -15
  189. package/test/refusals.test.ts +257 -151
  190. package/test/release-entry.test.ts +1 -9
  191. package/test/release-panel.test.ts +1 -22
  192. package/test/resize-with-placement.test.ts +0 -32
  193. package/test/revert-choice.test.ts +1 -22
  194. package/test/revert-keeping.test.ts +1 -12
  195. package/test/save-landed.test.ts +16 -14
  196. package/test/scene-canvas.test.ts +2 -13
  197. package/test/section-editor.test.ts +30 -83
  198. package/test/section-panel.test.ts +22 -17
  199. package/test/slot-layout-host.test.ts +117 -0
  200. package/test/theme.test.ts +5 -9
  201. package/test/verdict.test.ts +44 -41
  202. package/test/view.test.ts +5 -12
  203. package/translations/en.json +61 -1
  204. package/translations/es.json +61 -1
  205. package/translations/ja.json +61 -1
  206. package/translations/ko.json +61 -1
  207. package/translations/ms.json +61 -1
  208. package/translations/zh.json +61 -1
  209. package/test/thumbnail.test.ts +0 -29
@@ -56,6 +56,9 @@
56
56
  "figure.text.repeat-fixed-count": "개수가 고정된 되풀이라 간격은 아직 바꿀 수 없습니다.",
57
57
  "figure.text.repeat-what-pitch-gives": "길이 {length} mm 에서 {count}개 · 최대 길이 {longest} mm 까지 놓입니다 (한 줄 {limit}개).",
58
58
  "figure.text.repeat-pitch-too-small": "pitch 는 {min} mm 이상이어야 합니다. 저작한 길이 {length} mm 에서 {limit}개를 넘기 때문입니다.",
59
+ "figure.text.row-copies-over-limit": "간격이 좁아 줄이 {count}개가 됩니다. 한 줄은 {limit}개까지입니다. 간격을 넓혀 주세요.",
60
+ "figure.text.row-geometry-over-limit": "줄을 펼치면 형상이 {count}개가 됩니다. 도형은 {limit}개까지 그립니다.",
61
+ "figure.text.row-copies-out-of-range": "줄의 개수는 {min}~{max}개입니다. 넣은 값: {count}",
59
62
  "figure.text.gizmo-joint-places": "{part} 부품은 관절에 달려 있어 관절이 자리를 정합니다. 움직임 탭의 조작값으로 움직이세요.",
60
63
  "figure.label.motion-continuous": "끝없이 회전",
61
64
  "figure.text.fasten-before-moving": "먼저 다른 부품이나 바닥에 붙여야 움직임을 줄 수 있습니다.",
@@ -768,6 +771,10 @@
768
771
  "figure.text.removal-mounting-face": "장착면이 풀렸습니다.",
769
772
  "figure.text.edit-refused": "이 편집은 할 수 없습니다. ({code})",
770
773
  "figure.text.edit-refused-node-limit": "도형이 커서 더 넣을 수 없습니다. 노드는 {max} 개까지입니다.",
774
+ "figure.text.document-too-large": "도형이 {at} KiB 로 저장 한도 {max} KiB 를 넘습니다.",
775
+ "figure.text.document-too-large-unmeasured": "도형이 저장 한도 {max} KiB 를 넘습니다.",
776
+ "figure.text.document-nesting-too-deep": "도형 데이터가 {at} 단계로 중첩되어 있습니다. {max} 단계까지 받습니다.",
777
+ "figure.text.part-name-has-nested": "'{nested}' 부품이 이 부품 이름 아래에 있습니다. 그 부품의 이름부터 바꿔 주세요.",
771
778
  "figure.text.recipe-step-refused": "레시피의 {step} 번째 단계에서 막혔습니다. {why} ({code})",
772
779
  "figure.text.removal-space-refitted": "공간을 남은 부품에 다시 맞췄습니다.",
773
780
  "figure.text.placement-intent-floor": "바닥 배치: 아랫면을 바닥(Y=0)에서 지금 간격 그대로 유지하며 크기를 따라갑니다. 바닥 위의 위치(X·Z)는 그대로입니다.",
@@ -987,5 +994,58 @@
987
994
  "figure.text.detail-playing": "재생 중",
988
995
  "figure.label.detail-summary": "선택한 모델의 그리기 비용",
989
996
  "figure.text.detail-paused": "일시정지",
990
- "figure.button.download-package": "꾸러미 내려받기"
997
+ "figure.button.download-package": "꾸러미 내려받기",
998
+ "figure.label.group-carrier": "캐리어",
999
+ "figure.label.carrier-type": "캐리어 유형",
1000
+ "figure.text.carrier-type-placeholder": "CARRIERTYPE",
1001
+ "figure.label.carrier-size": "실물 크기",
1002
+ "figure.label.carrier-width": "폭",
1003
+ "figure.label.carrier-length": "길이",
1004
+ "figure.label.carrier-height": "높이",
1005
+ "figure.button.declare-carrier": "캐리어로 선언",
1006
+ "figure.button.clear-carrier": "선언 해제",
1007
+ "figure.text.carrier-type-required": "캐리어 유형 코드를 넣어 주세요.",
1008
+ "figure.text.carrier-type-too-long": "캐리어 유형 코드는 {max}자까지입니다.",
1009
+ "figure.text.carrier-length-positive": "{axis} 값은 0보다 커야 합니다.",
1010
+ "figure.button.import-mesh": "GLB 가져오기",
1011
+ "figure.text.import-mesh-hint": "GLB 파일을 부품으로 가져옵니다. 파일 전체나 그 안의 한 부분을 고릅니다.",
1012
+ "figure.text.mesh-whole-file": "파일 전체",
1013
+ "figure.text.mesh-triangles": "삼각형 {n}개",
1014
+ "figure.title.choose-mesh-part": "가져올 부분",
1015
+ "figure.label.face": "면",
1016
+ "figure.label.places-one": "자리 하나",
1017
+ "figure.label.places-by-rule": "규칙으로 여럿",
1018
+ "figure.label.slot-layout": "자리 배치",
1019
+ "figure.label.slot-layout-name": "이름",
1020
+ "figure.label.slot-layout-role": "자리 종류",
1021
+ "figure.label.slot-anchors": "기준면",
1022
+ "figure.label.slot-anchor-id": "기준면 이름",
1023
+ "figure.button.remove-slot-anchor": "기준면 빼기",
1024
+ "figure.button.add-slot-anchor-top": "{part} 윗면을 기준면으로",
1025
+ "figure.button.add-slot-anchor-bottom": "{part} 아랫면을 기준면으로",
1026
+ "figure.text.slot-anchor-pick": "화면에서 부품을 고르면 그 부품의 윗면이나 아랫면을 기준면으로 더합니다. 기준면이 움직이는 부품이면 자리도 함께 움직입니다.",
1027
+ "figure.button.apply-slot-anchors": "이름·기준면 적용",
1028
+ "figure.button.remove-slot-layout": "자리 배치 지우기",
1029
+ "figure.text.slot-accepts-required": "자리마다 받는 종류를 하나 이상 적어야 합니다.",
1030
+ "figure.text.slot-layout-label-missing": "자리 배치의 이름을 적어야 합니다.",
1031
+ "figure.text.slot-anchors-missing": "기준면을 하나 이상 더해야 합니다.",
1032
+ "figure.text.slot-anchor-duplicate": "기준면 이름 {anchor} 이 두 번 쓰였습니다.",
1033
+ "figure.text.slot-anchor-not-flat": "기준면 {anchor} 은 {part} 의 윗면이나 아랫면이어야 합니다.",
1034
+ "figure.text.slot-anchor-no-part": "기준면 {anchor} 의 부품 {part} 이 이 도형에 없습니다.",
1035
+ "figure.text.slot-layout-issues": "자리 배치에서 {path} 의 값이 맞지 않습니다.",
1036
+ "figure.text.slot-accepts-empty": "자리 {slot} 이 받는 종류가 없습니다.",
1037
+ "figure.text.slot-id-taken": "{slot} 은 이 도형에서 이미 쓰는 자리 이름입니다.",
1038
+ "figure.label.slot-preset-single": "자리 하나",
1039
+ "figure.label.slot-preset-agvTandem": "AGV 앞뒤 두 자리",
1040
+ "figure.label.slot-preset-agvParallel": "AGV 좌우 두 자리",
1041
+ "figure.label.slot-preset-agv2x2": "AGV 2×2",
1042
+ "figure.label.slot-preset-bufferPort2x2": "버퍼 포트 2×2",
1043
+ "figure.label.slot-preset-multiBufferPort": "멀티 버퍼 포트 (4)",
1044
+ "figure.label.slot-preset-dualTierConveyor": "2단 컨베이어",
1045
+ "figure.label.slot-preset-craneTwinFork": "크레인 트윈 포크",
1046
+ "figure.label.slot-preset-floorBlock": "평치 블록",
1047
+ "figure.label.slot-preset-param-upperElevation": "위층 높이 (mm)",
1048
+ "figure.label.slot-preset-param-rows": "행",
1049
+ "figure.label.slot-preset-param-cols": "열",
1050
+ "figure.label.slot-preset-param-stackLimit": "쌓는 단 수"
991
1051
  }
@@ -56,6 +56,9 @@
56
56
  "figure.text.repeat-fixed-count": "ulangan dengan bilangan tetap; jaraknya belum boleh ditetapkan.",
57
57
  "figure.text.repeat-what-pitch-gives": "{count} pada panjang {length} mm · boleh diletakkan sehingga {longest} mm ({limit} sebaris).",
58
58
  "figure.text.repeat-pitch-too-small": "pitch mesti sekurang-kurangnya {min} mm: pada panjang asal {length} mm ia akan melebihi {limit}.",
59
+ "figure.text.row-copies-over-limit": "Pada jarak ini barisan mempunyai {count} salinan. Satu barisan mengambil sehingga {limit}. Lebarkan jarak.",
60
+ "figure.text.row-geometry-over-limit": "Apabila dibentangkan, barisan akan melukis {count} jasad. Rajah melukis sehingga {limit}.",
61
+ "figure.text.row-copies-out-of-range": "Satu barisan mempunyai {min} hingga {max} salinan. Diberi: {count}",
59
62
  "figure.text.gizmo-joint-places": "sendi menentukan kedudukan {part}. gerakkannya dengan kawalannya di tab gerakan.",
60
63
  "figure.label.motion-continuous": "putaran tanpa henti",
61
64
  "figure.text.fasten-before-moving": "lekatkan pada bahagian lain atau lantai dahulu; kemudian ia boleh bergerak.",
@@ -768,6 +771,10 @@
768
771
  "figure.text.removal-mounting-face": "Muka pemasangan dilepaskan.",
769
772
  "figure.text.edit-refused": "Suntingan ini tidak boleh dibuat. ({code})",
770
773
  "figure.text.edit-refused-node-limit": "Rajah terlalu besar untuk ditambah. Ia memuatkan sehingga {max} nod.",
774
+ "figure.text.document-too-large": "Rajah ini {at} KiB, melebihi had simpanan {max} KiB.",
775
+ "figure.text.document-too-large-unmeasured": "Rajah ini melebihi had simpanan {max} KiB.",
776
+ "figure.text.document-nesting-too-deep": "Data rajah bersarang sedalam {at} aras. Sehingga {max} aras diterima.",
777
+ "figure.text.part-name-has-nested": "Bahagian '{nested}' dinamakan di bawah bahagian ini. Namakan semula bahagian itu dahulu.",
771
778
  "figure.text.recipe-step-refused": "Terhenti pada langkah {step} resipi. {why} ({code})",
772
779
  "figure.text.removal-space-refitted": "Ruang dipadankan semula dengan bahagian yang tinggal.",
773
780
  "figure.text.placement-intent-floor": "Letakan lantai: bahagian bawah mengekalkan jaraknya sekarang dari lantai (Y=0) apabila saiz berubah. Kedudukannya di atas lantai (X, Z) kekal.",
@@ -987,5 +994,58 @@
987
994
  "figure.text.detail-playing": "Sedang dimainkan",
988
995
  "figure.label.detail-summary": "Kos lukisan model yang dipilih",
989
996
  "figure.text.detail-paused": "Dijeda",
990
- "figure.button.download-package": "muat turun pakej"
997
+ "figure.button.download-package": "muat turun pakej",
998
+ "figure.label.group-carrier": "Pembawa",
999
+ "figure.label.carrier-type": "Jenis pembawa",
1000
+ "figure.text.carrier-type-placeholder": "CARRIERTYPE",
1001
+ "figure.label.carrier-size": "Saiz fizikal",
1002
+ "figure.label.carrier-width": "Lebar",
1003
+ "figure.label.carrier-length": "Panjang",
1004
+ "figure.label.carrier-height": "Tinggi",
1005
+ "figure.button.declare-carrier": "Isytihar pembawa",
1006
+ "figure.button.clear-carrier": "Kosongkan",
1007
+ "figure.text.carrier-type-required": "Masukkan kod jenis pembawa.",
1008
+ "figure.text.carrier-type-too-long": "Kod jenis pembawa paling banyak {max} aksara.",
1009
+ "figure.text.carrier-length-positive": "{axis} mesti lebih besar daripada 0.",
1010
+ "figure.button.import-mesh": "import GLB",
1011
+ "figure.text.import-mesh-hint": "membawa masuk fail GLB sebagai bahagian: seluruh fail, atau satu bahagian daripadanya.",
1012
+ "figure.text.mesh-whole-file": "seluruh fail",
1013
+ "figure.text.mesh-triangles": "{n} segi tiga",
1014
+ "figure.title.choose-mesh-part": "bahagian untuk dibawa masuk",
1015
+ "figure.label.face": "muka",
1016
+ "figure.label.places-one": "satu tempat",
1017
+ "figure.label.places-by-rule": "banyak mengikut peraturan",
1018
+ "figure.label.slot-layout": "susun atur slot",
1019
+ "figure.label.slot-layout-name": "nama",
1020
+ "figure.label.slot-layout-role": "jenis tempat",
1021
+ "figure.label.slot-anchors": "muka rujukan",
1022
+ "figure.label.slot-anchor-id": "nama muka rujukan",
1023
+ "figure.button.remove-slot-anchor": "buang muka rujukan",
1024
+ "figure.button.add-slot-anchor-top": "atas {part} sebagai muka rujukan",
1025
+ "figure.button.add-slot-anchor-bottom": "bawah {part} sebagai muka rujukan",
1026
+ "figure.text.slot-anchor-pick": "pilih bahagian pada kanvas untuk menambah bahagian atas atau bawahnya sebagai muka rujukan. slot pada bahagian yang bergerak turut bergerak.",
1027
+ "figure.button.apply-slot-anchors": "guna nama dan muka rujukan",
1028
+ "figure.button.remove-slot-layout": "buang susun atur slot",
1029
+ "figure.text.slot-accepts-required": "setiap slot mesti menamakan sekurang-kurangnya satu jenis yang diterimanya.",
1030
+ "figure.text.slot-layout-label-missing": "susun atur slot memerlukan nama.",
1031
+ "figure.text.slot-anchors-missing": "tambah sekurang-kurangnya satu muka rujukan.",
1032
+ "figure.text.slot-anchor-duplicate": "nama muka rujukan {anchor} digunakan dua kali.",
1033
+ "figure.text.slot-anchor-not-flat": "muka rujukan {anchor} mesti bahagian atas atau bawah {part}.",
1034
+ "figure.text.slot-anchor-no-part": "bahagian {part} bagi muka rujukan {anchor} tiada dalam figura ini.",
1035
+ "figure.text.slot-layout-issues": "nilai di {path} dalam susun atur slot tidak sah.",
1036
+ "figure.text.slot-accepts-empty": "slot {slot} tidak menerima sebarang jenis.",
1037
+ "figure.text.slot-id-taken": "{slot} sudah menjadi nama tempat dalam figura ini.",
1038
+ "figure.label.slot-preset-single": "satu slot",
1039
+ "figure.label.slot-preset-agvTandem": "AGV tandem (depan/belakang)",
1040
+ "figure.label.slot-preset-agvParallel": "AGV selari (kiri/kanan)",
1041
+ "figure.label.slot-preset-agv2x2": "AGV 2×2",
1042
+ "figure.label.slot-preset-bufferPort2x2": "port penimbal 2×2",
1043
+ "figure.label.slot-preset-multiBufferPort": "port berbilang penimbal (4)",
1044
+ "figure.label.slot-preset-dualTierConveyor": "penghantar dua tingkat",
1045
+ "figure.label.slot-preset-craneTwinFork": "garpu berkembar kren",
1046
+ "figure.label.slot-preset-floorBlock": "blok lantai",
1047
+ "figure.label.slot-preset-param-upperElevation": "ketinggian tingkat atas (mm)",
1048
+ "figure.label.slot-preset-param-rows": "baris",
1049
+ "figure.label.slot-preset-param-cols": "lajur",
1050
+ "figure.label.slot-preset-param-stackLimit": "had susunan"
991
1051
  }
@@ -56,6 +56,9 @@
56
56
  "figure.text.repeat-fixed-count": "这是固定数量的重复,暂时无法更改间距。",
57
57
  "figure.text.repeat-what-pitch-gives": "长度 {length} mm 时 {count} 个 · 最长可放到 {longest} mm (一排 {limit} 个)。",
58
58
  "figure.text.repeat-pitch-too-small": "pitch 须不小于 {min} mm:在原始长度 {length} mm 下会超过 {limit} 个。",
59
+ "figure.text.row-copies-over-limit": "此间距下一排有 {count} 个。一排最多 {limit} 个。请加大间距。",
60
+ "figure.text.row-geometry-over-limit": "展开后这一排有 {count} 个形体。图形最多绘制 {limit} 个。",
61
+ "figure.text.row-copies-out-of-range": "一排的数量为 {min}~{max} 个。输入值: {count}",
59
62
  "figure.text.gizmo-joint-places": "{part} 由关节决定位置。请用运动标签中的控制值移动它。",
60
63
  "figure.label.motion-continuous": "无限旋转",
61
64
  "figure.text.fasten-before-moving": "请先将其固定到其他部件或地面上,然后才能添加运动。",
@@ -768,6 +771,10 @@
768
771
  "figure.text.removal-mounting-face": "安装面已解除。",
769
772
  "figure.text.edit-refused": "无法进行此编辑。({code})",
770
773
  "figure.text.edit-refused-node-limit": "图形过大,无法再添加。节点上限为 {max} 个。",
774
+ "figure.text.document-too-large": "图形为 {at} KiB,超过可保存的上限 {max} KiB。",
775
+ "figure.text.document-too-large-unmeasured": "图形超过可保存的上限 {max} KiB。",
776
+ "figure.text.document-nesting-too-deep": "图形数据嵌套了 {at} 层,最多接受 {max} 层。",
777
+ "figure.text.part-name-has-nested": "部件 '{nested}' 的名称位于此部件名称之下。请先重命名该部件。",
771
778
  "figure.text.recipe-step-refused": "配方在第 {step} 步停止。{why} ({code})",
772
779
  "figure.text.removal-space-refitted": "空间已重新贴合剩余部件。",
773
780
  "figure.text.placement-intent-floor": "地面放置:尺寸变化时,底面与地面(Y=0)保持当前间距。在地面上的位置(X、Z)不变。",
@@ -987,5 +994,58 @@
987
994
  "figure.text.detail-playing": "播放中",
988
995
  "figure.label.detail-summary": "所选模型的绘制成本",
989
996
  "figure.text.detail-paused": "已暂停",
990
- "figure.button.download-package": "下载包"
997
+ "figure.button.download-package": "下载包",
998
+ "figure.label.group-carrier": "载具",
999
+ "figure.label.carrier-type": "载具类型",
1000
+ "figure.text.carrier-type-placeholder": "CARRIERTYPE",
1001
+ "figure.label.carrier-size": "实物尺寸",
1002
+ "figure.label.carrier-width": "宽",
1003
+ "figure.label.carrier-length": "长",
1004
+ "figure.label.carrier-height": "高",
1005
+ "figure.button.declare-carrier": "声明为载具",
1006
+ "figure.button.clear-carrier": "取消声明",
1007
+ "figure.text.carrier-type-required": "请输入载具类型代码。",
1008
+ "figure.text.carrier-type-too-long": "载具类型代码最多 {max} 个字符。",
1009
+ "figure.text.carrier-length-positive": "{axis}必须大于 0。",
1010
+ "figure.button.import-mesh": "导入 GLB",
1011
+ "figure.text.import-mesh-hint": "将 GLB 文件导入为部件:整个文件,或其中的一部分。",
1012
+ "figure.text.mesh-whole-file": "整个文件",
1013
+ "figure.text.mesh-triangles": "{n} 个三角形",
1014
+ "figure.title.choose-mesh-part": "要导入的部分",
1015
+ "figure.label.face": "面",
1016
+ "figure.label.places-one": "单个位置",
1017
+ "figure.label.places-by-rule": "按规则多个",
1018
+ "figure.label.slot-layout": "位置布局",
1019
+ "figure.label.slot-layout-name": "名称",
1020
+ "figure.label.slot-layout-role": "位置类型",
1021
+ "figure.label.slot-anchors": "基准面",
1022
+ "figure.label.slot-anchor-id": "基准面名称",
1023
+ "figure.button.remove-slot-anchor": "移除基准面",
1024
+ "figure.button.add-slot-anchor-top": "以 {part} 的顶面为基准面",
1025
+ "figure.button.add-slot-anchor-bottom": "以 {part} 的底面为基准面",
1026
+ "figure.text.slot-anchor-pick": "在画面上选择部件,即可将其顶面或底面加为基准面。基准面在运动部件上时,位置随之移动。",
1027
+ "figure.button.apply-slot-anchors": "应用名称和基准面",
1028
+ "figure.button.remove-slot-layout": "删除位置布局",
1029
+ "figure.text.slot-accepts-required": "每个位置必须至少写明一种可接收的类型。",
1030
+ "figure.text.slot-layout-label-missing": "位置布局需要名称。",
1031
+ "figure.text.slot-anchors-missing": "至少需要添加一个基准面。",
1032
+ "figure.text.slot-anchor-duplicate": "基准面名称 {anchor} 被使用了两次。",
1033
+ "figure.text.slot-anchor-not-flat": "基准面 {anchor} 必须是 {part} 的顶面或底面。",
1034
+ "figure.text.slot-anchor-no-part": "基准面 {anchor} 的部件 {part} 不在此图形中。",
1035
+ "figure.text.slot-layout-issues": "位置布局中 {path} 的值无效。",
1036
+ "figure.text.slot-accepts-empty": "位置 {slot} 没有可接收的类型。",
1037
+ "figure.text.slot-id-taken": "{slot} 已是此图形中某个位置的名称。",
1038
+ "figure.label.slot-preset-single": "单个位置",
1039
+ "figure.label.slot-preset-agvTandem": "AGV 前后两个位置",
1040
+ "figure.label.slot-preset-agvParallel": "AGV 左右两个位置",
1041
+ "figure.label.slot-preset-agv2x2": "AGV 2×2",
1042
+ "figure.label.slot-preset-bufferPort2x2": "缓冲口 2×2",
1043
+ "figure.label.slot-preset-multiBufferPort": "多缓冲口 (4)",
1044
+ "figure.label.slot-preset-dualTierConveyor": "双层输送机",
1045
+ "figure.label.slot-preset-craneTwinFork": "起重机双叉",
1046
+ "figure.label.slot-preset-floorBlock": "平置区块",
1047
+ "figure.label.slot-preset-param-upperElevation": "上层高度 (mm)",
1048
+ "figure.label.slot-preset-param-rows": "行",
1049
+ "figure.label.slot-preset-param-cols": "列",
1050
+ "figure.label.slot-preset-param-stackLimit": "堆叠层数"
991
1051
  }
@@ -1,29 +0,0 @@
1
- /*
2
- * **저장하면 카드 그림이 남는다** (사용자 2026-09-24: 「why you don't save thumbnail when I save the figure?」).
3
- *
4
- * 캔버스가 씬 위로 옮겨 갈 때 찍는 길(`snapshot`)이 빠졌고, 찍는 쪽은 없는 메서드를 `?.()` 로 불러 아무 말 없이
5
- * 그림 없이 저장했다. 브라우저에서만 찍히므로 여기서는 길이 이어져 있는지를 본다: 찍는 쪽이 보기 전용 캔버스를 세워
6
- * `snapshot` 을 부르고, 캔버스는 씬의 3D 그림(`snapshot3d`)을 내며, 보기 전용이면 편집기에 아무것도 알리지 않는다.
7
- */
8
- import { test } from 'node:test'
9
- import assert from 'node:assert/strict'
10
- import { readFileSync } from 'node:fs'
11
- import { fileURLToPath } from 'node:url'
12
-
13
- const read = (path: string) => readFileSync(fileURLToPath(new URL(path, import.meta.url)), 'utf8')
14
-
15
- test('the save takes the card picture from a view-only canvas, through the scene’s 3D snapshot', () => {
16
- const shooter = read('../client/modeller/thumbnail.ts')
17
- assert.ok(shooter.includes('shooter.viewOnly = true'))
18
- assert.ok(shooter.includes('return shooter.snapshot ? await shooter.snapshot(WIDTH, HEIGHT) : undefined'))
19
- assert.ok(!shooter.includes('thumbnail?.()'), 'no call to a method the canvas does not have')
20
-
21
- const canvas = read('../client/modeller/canvas.ts')
22
- assert.ok(canvas.includes('async snapshot(width = 480, height = 360)'))
23
- assert.ok(canvas.includes("await layer.snapshot3d(width, height, 'image/webp', 0.85)"), 'the 3D view, not the 2D sheet')
24
- const watch = canvas.slice(canvas.indexOf(' private watchScene()'), canvas.indexOf(' private showSelected()'))
25
- assert.ok(watch.includes('|| this.viewOnly) return'), 'a view-only canvas tells the editor nothing')
26
-
27
- const editor = read('../client/modeller/editor.ts')
28
- assert.ok(editor.includes('const thumbnail = await captureFigureThumbnail('), 'the save asks for it')
29
- })