@things-factory/figure-ui 10.1.206 → 10.1.207

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 (68) hide show
  1. package/client/modeller/editor.ts +11 -97
  2. package/client/modeller/figure-facts.ts +1 -1
  3. package/client/modeller/figure-history-panel.ts +1 -29
  4. package/client/modeller/figure-preview.ts +5 -7
  5. package/client/modeller/figure-verdict.ts +2 -17
  6. package/client/modeller/maturity.ts +11 -27
  7. package/client/modeller/refusals.ts +1 -7
  8. package/client/pages/figure-modeller-page.ts +7 -22
  9. package/dist-client/modeller/editor.d.ts +1 -8
  10. package/dist-client/modeller/editor.js +12 -98
  11. package/dist-client/modeller/editor.js.map +1 -1
  12. package/dist-client/modeller/figure-facts.js +1 -1
  13. package/dist-client/modeller/figure-facts.js.map +1 -1
  14. package/dist-client/modeller/figure-fasten-dialog.d.ts +1 -1
  15. package/dist-client/modeller/figure-history-panel.d.ts +0 -16
  16. package/dist-client/modeller/figure-history-panel.js +1 -27
  17. package/dist-client/modeller/figure-history-panel.js.map +1 -1
  18. package/dist-client/modeller/figure-links.d.ts +1 -1
  19. package/dist-client/modeller/figure-preview.js +5 -8
  20. package/dist-client/modeller/figure-preview.js.map +1 -1
  21. package/dist-client/modeller/figure-verdict.d.ts +0 -5
  22. package/dist-client/modeller/figure-verdict.js +2 -21
  23. package/dist-client/modeller/figure-verdict.js.map +1 -1
  24. package/dist-client/modeller/maturity.d.ts +2 -4
  25. package/dist-client/modeller/maturity.js +12 -26
  26. package/dist-client/modeller/maturity.js.map +1 -1
  27. package/dist-client/modeller/refusals.d.ts +1 -3
  28. package/dist-client/modeller/refusals.js +1 -7
  29. package/dist-client/modeller/refusals.js.map +1 -1
  30. package/dist-client/pages/figure-modeller-page.d.ts +1 -3
  31. package/dist-client/pages/figure-modeller-page.js +7 -23
  32. package/dist-client/pages/figure-modeller-page.js.map +1 -1
  33. package/dist-client/route.d.ts +1 -1
  34. package/dist-client/tsconfig.tsbuildinfo +1 -1
  35. package/package.json +6 -6
  36. package/test/browser/acceptance-page.js +3 -3
  37. package/test/browser/detail-page.js +1 -3
  38. package/test/browser/detail-tabs-page.js +1 -2
  39. package/test/browser/links.check.mjs +2 -37
  40. package/test/browser/modeller.check.mjs +1 -3
  41. package/test/browser/parts-page.js +2 -2
  42. package/test/browser/parts.check.mjs +2 -12
  43. package/test/browser/product-page.check.mjs +6 -9
  44. package/test/browser/product-page.js +1 -2
  45. package/test/browser/screen-page.js +2 -6
  46. package/test/browser/screen.check.mjs +8 -65
  47. package/test/first-minute.test.ts +2 -3
  48. package/test/fixtures/joint-column.json +1 -66
  49. package/test/fixtures/joint-roller.json +1 -66
  50. package/test/fixtures/robot-arm-6dof.json +2 -67
  51. package/test/links.test.ts +1 -1
  52. package/test/parts-wiring.test.ts +1 -1
  53. package/test/properties.test.ts +9 -12
  54. package/test/refusals.test.ts +3 -21
  55. package/test/resize-with-placement.test.ts +13 -15
  56. package/test/revision.test.ts +1 -2
  57. package/test/verdict.test.ts +1 -15
  58. package/translations/en.json +0 -19
  59. package/translations/es.json +0 -19
  60. package/translations/ja.json +0 -19
  61. package/translations/ko.json +0 -19
  62. package/translations/ms.json +0 -19
  63. package/translations/zh.json +0 -19
  64. package/client/modeller/occupancy.ts +0 -51
  65. package/dist-client/modeller/occupancy.d.ts +0 -31
  66. package/dist-client/modeller/occupancy.js +0 -36
  67. package/dist-client/modeller/occupancy.js.map +0 -1
  68. package/test/release-panel.test.ts +0 -53
@@ -12,7 +12,6 @@
12
12
  "figure.button.delete-figure": "삭제",
13
13
  "figure.button.discard": "취소",
14
14
  "figure.button.duplicate-part": "복제",
15
- "figure.button.fit-base-to-parts": "부품에 맞추기",
16
15
  "figure.button.fix-position": "여기에 고정",
17
16
  "figure.button.scale-position": "크기에 비례",
18
17
  "figure.button.scale-uniformly": "한 비율로 키우기",
@@ -377,7 +376,6 @@
377
376
  "figure.text.trend-stays": "그대로",
378
377
  "figure.text.trend-flat-lines-overlap": "평평한 선이 {value} 에서 겹칩니다.",
379
378
  "figure.text.cannot-release-now": "지금은 발행할 수 없습니다",
380
- "figure.text.fit-needs-parts": "맞출 부품이 없습니다. 먼저 도형을 추가하세요.",
381
379
  "figure.text.nothing-blocks-release": "지금 모양 그대로면 발행을 막는 것이 없습니다.",
382
380
  "figure.text.verdict-asking": "판정을 받는 중입니다…",
383
381
  "figure.text.verdict-not-received": "판정을 받지 못했습니다 — {reason}",
@@ -603,7 +601,6 @@
603
601
  "figure.button.propose-room": "경계 계산",
604
602
  "figure.button.confirm-room": "이 경계로 선언",
605
603
  "figure.label.room-undeclared": "정하지 않음",
606
- "figure.label.room-declared": "지금 선언",
607
604
  "figure.label.mounting-face": "장착면",
608
605
  "figure.button.clear-mounting-face": "지정 해제",
609
606
  "figure.text.mounting-face-unchecked-at-center": "중심 배치라 검사하지 않음",
@@ -736,7 +733,6 @@
736
733
  "figure.label.motion-travel-mm": "제 범위 (mm)",
737
734
  "figure.label.motion-travel-is": "이동 거리: {part} · {axis} + {plus} mm",
738
735
  "figure.label.align-share": "가운데서 거리 — 도형 크기 비율로",
739
- "figure.text.part-in-declared-space": "'{part}' 는 선언된 공간에 들어 있어 그냥 삭제할 수 없습니다. 지우면서 공간을 남은 부품에 다시 맞출 수 있습니다.",
740
736
  "figure.button.change-motion": "움직임 수정",
741
737
  "figure.button.apply-motion-change": "움직임 바꾸기",
742
738
  "figure.button.cancel-motion-change": "변경 취소",
@@ -775,7 +771,6 @@
775
771
  "figure.text.document-nesting-too-deep": "도형 데이터가 {at} 단계로 중첩되어 있습니다. {max} 단계까지 받습니다.",
776
772
  "figure.text.part-name-has-nested": "'{nested}' 부품이 이 부품 이름 아래에 있습니다. 그 부품의 이름부터 바꿔 주세요.",
777
773
  "figure.text.recipe-step-refused": "레시피의 {step} 번째 단계에서 막혔습니다. {why} ({code})",
778
- "figure.text.removal-space-refitted": "공간을 남은 부품에 다시 맞췄습니다.",
779
774
  "figure.text.placement-intent-floor": "바닥 배치: 아랫면을 바닥(Y=0)에서 지금 간격 그대로 유지하며 크기를 따라갑니다. 바닥 위의 위치(X·Z)는 그대로입니다.",
780
775
  "figure.text.placement-intent-ceiling": "천장 배치: 윗면을 천장(Y=0)에서 지금 간격 그대로 유지하며 크기를 따라갑니다. 천장 아래의 위치(X·Z)는 그대로입니다.",
781
776
  "figure.text.placement-intent-wall": "벽 배치: 뒷면을 벽(Z=0)에서 지금 간격 그대로 유지하며 크기를 따라갑니다. 벽 위의 위치(X·Y)는 그대로입니다.",
@@ -807,17 +802,6 @@
807
802
  "figure.text.resize-refused-position-rule": "{part} 부품의 {axis} 위치는 입력값이나 식으로 정해져 있습니다. 적용하면 그 규칙 대신 {place} 관계가 위치를 정합니다.",
808
803
  "figure.text.resize-refused-no-face": "{part} 부품에는 {place}에 붙일 평평한 면이 없습니다.",
809
804
  "figure.text.axis-held-by-rule": "여기서 수정할 수 없는 값입니다",
810
- "figure.label.room-only-inputs": "배치 공간 계산에만 사용됨",
811
- "figure.text.room-only-inputs": "이 값은 부품을 움직이지 않습니다. 선언한 공간이 이 값으로 계산되어 있습니다.",
812
- "figure.button.room-refit": "공간 다시 계산…",
813
- "figure.label.room-refit": "공간 다시 계산",
814
- "figure.label.room-proposed": "다시 계산하면",
815
- "figure.label.room-at-authored": "그린 크기",
816
- "figure.label.room-at-largest": "가장 큰 크기",
817
- "figure.text.room-same": "같음",
818
- "figure.text.room-part-outside": "{part}: {axis} 방향 {mm} mm 밖",
819
- "figure.text.room-nothing-outside": "잰 크기에서 밖으로 나간 부품 없음",
820
- "figure.button.room-refit-confirm": "이대로 다시 계산",
821
805
  "figure.text.resize-gap-off": "이 부품의 면이 {place} 기준면에서 {mm} mm 떨어져 있습니다.",
822
806
  "figure.text.resize-gap-through": "이 부품이 {place} 기준면을 {mm} mm 넘어 들어가 있습니다.",
823
807
  "figure.button.resize-keep-gap": "{scope}, {mm} mm 간격을 유지하며 따라가기",
@@ -827,7 +811,6 @@
827
811
  "figure.button.resize-onto-plane-wall": "{scope} 벽에 맞춰 붙이고 따라가기",
828
812
  "figure.text.resize-refused-gap-choice": "{part} 부품의 면이 {place} 기준면에 닿아 있지 않습니다. 간격을 유지할지 기준면에 맞출지 선택해 주세요.",
829
813
  "figure.text.resize-replaces": "적용하면 {fields} 입력값 대신 {place} 부착 관계에 따라 배치됩니다. 현재 모습은 유지됩니다.",
830
- "figure.text.room-drops": "확정하면 더 이상 쓰이지 않는 입력이 사라집니다: {fields}",
831
814
  "figure.button.resize-unfollow": "고정으로 되돌리기",
832
815
  "figure.label.resize-pending": "적용할 크기 반응",
833
816
  "figure.text.resize-already-following": "(이미 따라감)",
@@ -1175,11 +1158,9 @@
1175
1158
  "figure.title.namespace-setting": "Figure 이름공간",
1176
1159
  "figure.label.namespace": "이름공간",
1177
1160
  "figure.label.follows-part-axis": "{part}의 {axis}",
1178
- "figure.text.size-and-space-declared-to-follow": "도형 크기를 부품에 맞춰 {x} × {y} × {z} mm 로 정하고, 차지하는 공간도 부품에 맞췄습니다.",
1179
1161
  "figure.button.release-blocked": "발행 막힘 {count}",
1180
1162
  "figure.label.preview-way-one": "한 대",
1181
1163
  "figure.label.preview-way-eight": "다양한 크기",
1182
- "figure.text.preview-needs-space": "차지하는 공간을 정하면 크기를 바꿔 볼 수 있습니다.",
1183
1164
  "figure.text.released-figure-not-deletable": "{name} 은 발행한 Figure 라 지울 수 없습니다. 상세에서 퇴역으로 표시하세요.",
1184
1165
  "figure.label.retired": "퇴역",
1185
1166
  "figure.button.retire": "퇴역",
@@ -12,7 +12,6 @@
12
12
  "figure.button.delete-figure": "delete",
13
13
  "figure.button.discard": "discard",
14
14
  "figure.button.duplicate-part": "duplicate",
15
- "figure.button.fit-base-to-parts": "muatkan pada bahagian",
16
15
  "figure.button.fix-position": "tetapkan di sini",
17
16
  "figure.button.scale-position": "berkadar",
18
17
  "figure.button.scale-uniformly": "besarkan dengan satu nisbah",
@@ -377,7 +376,6 @@
377
376
  "figure.text.trend-stays": "tidak berubah",
378
377
  "figure.text.trend-flat-lines-overlap": "garis mendatar bertindih pada {value}.",
379
378
  "figure.text.cannot-release-now": "belum boleh diterbitkan",
380
- "figure.text.fit-needs-parts": "tiada bahagian untuk dipadankan — tambah bentuk dahulu.",
381
379
  "figure.text.nothing-blocks-release": "tiada apa pada bentuk semasa yang menghalang penerbitan.",
382
380
  "figure.text.verdict-asking": "sedang menyemak…",
383
381
  "figure.text.verdict-not-received": "semakan tidak diterima — {reason}",
@@ -603,7 +601,6 @@
603
601
  "figure.button.propose-room": "Compute bounds",
604
602
  "figure.button.confirm-room": "Declare these bounds",
605
603
  "figure.label.room-undeclared": "not declared yet",
606
- "figure.label.room-declared": "Diisytiharkan sekarang",
607
604
  "figure.label.mounting-face": "Mounting face",
608
605
  "figure.button.clear-mounting-face": "Clear",
609
606
  "figure.text.mounting-face-unchecked-at-center": "tidak disemak untuk figure di tengah",
@@ -736,7 +733,6 @@
736
733
  "figure.label.motion-travel-mm": "julat sendiri (mm)",
737
734
  "figure.label.motion-travel-is": "jarak gerak: {part} · {axis} + {plus} mm",
738
735
  "figure.label.align-share": "jarak dari tengah — nisbah saiz rajah",
739
- "figure.text.part-in-declared-space": "'{part}' berada dalam ruang yang diisytihar, jadi ia tidak boleh dipadam begitu sahaja. ia boleh dipadam dengan ruang dimuatkan semula pada bahagian yang tinggal.",
740
736
  "figure.button.change-motion": "ubah gerakan",
741
737
  "figure.button.apply-motion-change": "guna perubahan",
742
738
  "figure.button.cancel-motion-change": "biarkan",
@@ -775,7 +771,6 @@
775
771
  "figure.text.document-nesting-too-deep": "Data rajah bersarang sedalam {at} aras. Sehingga {max} aras diterima.",
776
772
  "figure.text.part-name-has-nested": "Bahagian '{nested}' dinamakan di bawah bahagian ini. Namakan semula bahagian itu dahulu.",
777
773
  "figure.text.recipe-step-refused": "Terhenti pada langkah {step} resipi. {why} ({code})",
778
- "figure.text.removal-space-refitted": "Ruang dipadankan semula dengan bahagian yang tinggal.",
779
774
  "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.",
780
775
  "figure.text.placement-intent-ceiling": "Letakan siling: bahagian atas mengekalkan jaraknya sekarang dari siling (Y=0) apabila saiz berubah. Kedudukannya di bawah siling (X, Z) kekal.",
781
776
  "figure.text.placement-intent-wall": "Letakan dinding: bahagian belakang mengekalkan jaraknya sekarang dari dinding (Z=0) apabila saiz berubah. Kedudukannya pada dinding (X, Y) kekal.",
@@ -807,17 +802,6 @@
807
802
  "figure.text.resize-refused-position-rule": "Kedudukan {axis} bagi {part} ditetapkan oleh input atau ungkapan. Jika digunakan, ia diganti dengan hubungan {place}.",
808
803
  "figure.text.resize-refused-no-face": "{part} tiada muka rata untuk dilekatkan pada {place}.",
809
804
  "figure.text.axis-held-by-rule": "tidak boleh diubah di sini",
810
- "figure.label.room-only-inputs": "Digunakan hanya untuk mengira ruang letakan",
811
- "figure.text.room-only-inputs": "Nilai ini tidak mengalihkan bahagian. Ruang yang diisytiharkan dikira daripadanya.",
812
- "figure.button.room-refit": "Kira semula ruang…",
813
- "figure.label.room-refit": "Kira semula ruang",
814
- "figure.label.room-proposed": "Selepas dikira semula",
815
- "figure.label.room-at-authored": "Saiz dilukis",
816
- "figure.label.room-at-largest": "Saiz terbesar",
817
- "figure.text.room-same": "sama",
818
- "figure.text.room-part-outside": "{part}: {mm} mm di luar pada {axis}",
819
- "figure.text.room-nothing-outside": "tiada bahagian di luar pada saiz yang diukur",
820
- "figure.button.room-refit-confirm": "Kira semula begini",
821
805
  "figure.text.resize-gap-off": "Muka bahagian ini {mm} mm dari satah {place}.",
822
806
  "figure.text.resize-gap-through": "Bahagian ini menembusi satah {place} sejauh {mm} mm.",
823
807
  "figure.button.resize-keep-gap": "{scope}: ikut saiz, kekalkan jarak {mm} mm",
@@ -827,7 +811,6 @@
827
811
  "figure.button.resize-onto-plane-wall": "{scope}: ikut saiz, dibawa ke dinding",
828
812
  "figure.text.resize-refused-gap-choice": "Muka {part} tidak menyentuh satah {place}. Pilih sama ada kekalkan jarak atau bawa ke satah.",
829
813
  "figure.text.resize-replaces": "Jika digunakan, medan {fields} diganti dengan lekatan {place}. Tiada apa-apa bergerak sekarang.",
830
- "figure.text.room-drops": "Mengesahkan membuang medan yang tidak lagi digunakan: {fields}",
831
814
  "figure.button.resize-unfollow": "Kembalikan kepada tetap",
832
815
  "figure.label.resize-pending": "Tindak balas saiz untuk digunakan",
833
816
  "figure.text.resize-already-following": "(sudah mengikut)",
@@ -1175,11 +1158,9 @@
1175
1158
  "figure.title.namespace-setting": "Namespace Figure",
1176
1159
  "figure.label.namespace": "Namespace",
1177
1160
  "figure.label.follows-part-axis": "{axis} {part}",
1178
- "figure.text.size-and-space-declared-to-follow": "saiz rajah ditetapkan daripada bahagiannya, {x} × {y} × {z} mm, dan ruang yang diambil dipadankan dengannya.",
1179
1161
  "figure.button.release-blocked": "{count} menghalang terbitan",
1180
1162
  "figure.label.preview-way-one": "satu",
1181
1163
  "figure.label.preview-way-eight": "pelbagai saiz",
1182
- "figure.text.preview-needs-space": "tetapkan ruang yang diambil untuk mencuba saiz lain.",
1183
1164
  "figure.text.released-figure-not-deletable": "{name} telah diterbitkan dan tidak boleh dipadam. bersarakan dalam butirannya.",
1184
1165
  "figure.label.retired": "bersara",
1185
1166
  "figure.button.retire": "bersarakan",
@@ -12,7 +12,6 @@
12
12
  "figure.button.delete-figure": "delete",
13
13
  "figure.button.discard": "discard",
14
14
  "figure.button.duplicate-part": "duplicate",
15
- "figure.button.fit-base-to-parts": "适配部件",
16
15
  "figure.button.fix-position": "固定在此",
17
16
  "figure.button.scale-position": "按比例",
18
17
  "figure.button.scale-uniformly": "按单一比例放大",
@@ -377,7 +376,6 @@
377
376
  "figure.text.trend-stays": "不变",
378
377
  "figure.text.trend-flat-lines-overlap": "平线在 {value} 处重叠。",
379
378
  "figure.text.cannot-release-now": "现在无法发布",
380
- "figure.text.fit-needs-parts": "没有可适配的部件,请先添加形状。",
381
379
  "figure.text.nothing-blocks-release": "按当前形状,没有阻止发布的问题。",
382
380
  "figure.text.verdict-asking": "正在检查…",
383
381
  "figure.text.verdict-not-received": "未能获得检查结果 — {reason}",
@@ -603,7 +601,6 @@
603
601
  "figure.button.propose-room": "Compute bounds",
604
602
  "figure.button.confirm-room": "Declare these bounds",
605
603
  "figure.label.room-undeclared": "not declared yet",
606
- "figure.label.room-declared": "当前声明",
607
604
  "figure.label.mounting-face": "Mounting face",
608
605
  "figure.button.clear-mounting-face": "Clear",
609
606
  "figure.text.mounting-face-unchecked-at-center": "中心放置,不检查",
@@ -736,7 +733,6 @@
736
733
  "figure.label.motion-travel-mm": "自身范围 (mm)",
737
734
  "figure.label.motion-travel-is": "行程: {part} · {axis} + {plus} mm",
738
735
  "figure.label.align-share": "距中心 — 按图形尺寸比例",
739
- "figure.text.part-in-declared-space": "'{part}' 在已声明的空间内,不能直接删除。可以在删除的同时让空间重新适配剩余部件。",
740
736
  "figure.button.change-motion": "修改运动",
741
737
  "figure.button.apply-motion-change": "应用修改",
742
738
  "figure.button.cancel-motion-change": "不修改",
@@ -775,7 +771,6 @@
775
771
  "figure.text.document-nesting-too-deep": "图形数据嵌套了 {at} 层,最多接受 {max} 层。",
776
772
  "figure.text.part-name-has-nested": "部件 '{nested}' 的名称位于此部件名称之下。请先重命名该部件。",
777
773
  "figure.text.recipe-step-refused": "配方在第 {step} 步停止。{why} ({code})",
778
- "figure.text.removal-space-refitted": "空间已重新贴合剩余部件。",
779
774
  "figure.text.placement-intent-floor": "地面放置:尺寸变化时,底面与地面(Y=0)保持当前间距。在地面上的位置(X、Z)不变。",
780
775
  "figure.text.placement-intent-ceiling": "天花板放置:尺寸变化时,顶面与天花板(Y=0)保持当前间距。在天花板下的位置(X、Z)不变。",
781
776
  "figure.text.placement-intent-wall": "墙面放置:尺寸变化时,背面与墙(Z=0)保持当前间距。在墙上的位置(X、Y)不变。",
@@ -807,17 +802,6 @@
807
802
  "figure.text.resize-refused-position-rule": "{part} 的 {axis} 位置由输入值或表达式决定。应用后将改由与{place}的关系决定位置。",
808
803
  "figure.text.resize-refused-no-face": "{part} 没有可附着到{place}的平面。",
809
804
  "figure.text.axis-held-by-rule": "此处不能修改的值",
810
- "figure.label.room-only-inputs": "仅用于计算放置空间",
811
- "figure.text.room-only-inputs": "这些值不会移动部件。声明的空间由这些值计算得出。",
812
- "figure.button.room-refit": "重新计算空间…",
813
- "figure.label.room-refit": "重新计算空间",
814
- "figure.label.room-proposed": "重新计算后",
815
- "figure.label.room-at-authored": "绘制尺寸",
816
- "figure.label.room-at-largest": "最大尺寸",
817
- "figure.text.room-same": "相同",
818
- "figure.text.room-part-outside": "{part}:沿 {axis} 方向超出 {mm} mm",
819
- "figure.text.room-nothing-outside": "在测量的尺寸下没有部件超出",
820
- "figure.button.room-refit-confirm": "按此重新计算",
821
805
  "figure.text.resize-gap-off": "此部件的面距{place}基准面 {mm} mm。",
822
806
  "figure.text.resize-gap-through": "此部件穿过{place}基准面 {mm} mm。",
823
807
  "figure.button.resize-keep-gap": "{scope}:保持 {mm} mm 间距并跟随",
@@ -827,7 +811,6 @@
827
811
  "figure.button.resize-onto-plane-wall": "{scope}:对齐墙面附着并跟随",
828
812
  "figure.text.resize-refused-gap-choice": "{part} 的面未接触{place}基准面。请选择保持间距或对齐基准面。",
829
813
  "figure.text.resize-replaces": "应用后,{fields} 输入将改由{place}附着决定。当前外观不变。",
830
- "figure.text.room-drops": "确认后将删除不再使用的输入:{fields}",
831
814
  "figure.button.resize-unfollow": "改回固定",
832
815
  "figure.label.resize-pending": "要应用的尺寸跟随",
833
816
  "figure.text.resize-already-following": "(已跟随)",
@@ -1175,11 +1158,9 @@
1175
1158
  "figure.title.namespace-setting": "Figure 命名空间",
1176
1159
  "figure.label.namespace": "命名空间",
1177
1160
  "figure.label.follows-part-axis": "{part} 的 {axis}",
1178
- "figure.text.size-and-space-declared-to-follow": "已按部件将图形尺寸设为 {x} × {y} × {z} mm,并按部件确定了占用空间。",
1179
1161
  "figure.button.release-blocked": "无法发布 {count}",
1180
1162
  "figure.label.preview-way-one": "单台",
1181
1163
  "figure.label.preview-way-eight": "多种尺寸",
1182
- "figure.text.preview-needs-space": "确定占用空间后即可尝试其他尺寸。",
1183
1164
  "figure.text.released-figure-not-deletable": "{name} 已发布,无法删除。请在详情中将其退役。",
1184
1165
  "figure.label.retired": "已退役",
1185
1166
  "figure.button.retire": "退役",
@@ -1,51 +0,0 @@
1
- import { proposeFigureOccupancy, type FigureAsset, type FigureAuthoringAction, type FigureRoomRefit } from '@hatiolab/figure-model'
2
-
3
- /**
4
- * 「부품에 맞추기」의 짝 — 공간을 지금 부품에서 다시 선언하는 한 걸음.
5
- *
6
- * figure-model 은 이것을 둘로 나눠 두었다: 제안(`proposeFigureOccupancy`)은 무엇이 선언될지를 보여 주고, 확인
7
- * (`declare-occupancy`)은 그 제안이 읽은 모양 그대로일 때만 받는다. 저작자가 누른 단추가 그 확인이다. 제안과 확인
8
- * 사이에 모델이 바뀌면 figure-model 이 `OCCUPANCY_STALE` 로 거절하므로, 여기서는 누른 순간의 원본으로 둘을 한
9
- * 번에 만든다.
10
- *
11
- * 범위는 움직임 전체다(`over: 'range'`). 쉬는 자세만 담으면 움직이는 부품이 선언한 공간을 넘어 발행 판정이 다시
12
- * 막는다. 배치 기준은 이미 선언된 것을 지키고, 처음 선언하는 도형은 바닥에 선다고 둔다 — 새로 만든 도형의
13
- * 모델러 기본이 바닥이다.
14
- */
15
- export function occupancyFromParts(
16
- asset: FigureAsset,
17
- /** A different face to place it by — the properties tab's choice. Absent keeps the declared one. */
18
- placement?: 'floor' | 'ceiling' | 'center' | 'wall'
19
- ): Extract<FigureAuthoringAction, { kind: 'declare-occupancy' }> {
20
- return {
21
- kind: 'declare-occupancy',
22
- proposal: proposeFigureOccupancy(asset, { over: 'range' }),
23
- /* The placement is the figure's own now (ADR-0097): named only when a different one is asked for. */
24
- ...(placement && placement !== (asset.placement ?? 'floor') ? { placement } : {})
25
- }
26
- }
27
-
28
- /**
29
- * 공간 다시 계산의 확인 표 — 선언된 공간과 제안된 공간을 그린 크기와 가장 큰 크기에서, 축마다 한 줄로. 같은 줄은
30
- * 같다고 적는다. 밖으로 나간 부품은 figure-model 이 잰 것만 적는다 — 재지 않은 것을 「넘친다」고 단정하지 않는다
31
- * (설계자 2026-09-27).
32
- */
33
- export interface RoomRefitRow {
34
- at: 'authored' | 'largest'
35
- axis: 'x' | 'y' | 'z'
36
- declared: string
37
- proposed: string
38
- same: boolean
39
- }
40
- export function roomRefitRowsOf(refit: FigureRoomRefit): RoomRefitRow[] {
41
- const span = (b: { min: number; max: number }) => `${Math.round(b.min)} ~ ${Math.round(b.max)}`
42
- const rows: RoomRefitRow[] = []
43
- for (const at of ['authored', 'largest'] as const) {
44
- const declared = refit.declared[at],
45
- proposed = refit.proposed[at]
46
- if (!declared || !proposed) continue
47
- for (const axis of ['x', 'y', 'z'] as const)
48
- rows.push({ at, axis, declared: span(declared[axis]), proposed: span(proposed[axis]), same: span(declared[axis]) === span(proposed[axis]) })
49
- }
50
- return rows
51
- }
@@ -1,31 +0,0 @@
1
- import { type FigureAsset, type FigureAuthoringAction, type FigureRoomRefit } from '@hatiolab/figure-model';
2
- /**
3
- * 「부품에 맞추기」의 짝 — 공간을 지금 부품에서 다시 선언하는 한 걸음.
4
- *
5
- * figure-model 은 이것을 둘로 나눠 두었다: 제안(`proposeFigureOccupancy`)은 무엇이 선언될지를 보여 주고, 확인
6
- * (`declare-occupancy`)은 그 제안이 읽은 모양 그대로일 때만 받는다. 저작자가 누른 단추가 그 확인이다. 제안과 확인
7
- * 사이에 모델이 바뀌면 figure-model 이 `OCCUPANCY_STALE` 로 거절하므로, 여기서는 누른 순간의 원본으로 둘을 한
8
- * 번에 만든다.
9
- *
10
- * 범위는 움직임 전체다(`over: 'range'`). 쉬는 자세만 담으면 움직이는 부품이 선언한 공간을 넘어 발행 판정이 다시
11
- * 막는다. 배치 기준은 이미 선언된 것을 지키고, 처음 선언하는 도형은 바닥에 선다고 둔다 — 새로 만든 도형의
12
- * 모델러 기본이 바닥이다.
13
- */
14
- export declare function occupancyFromParts(asset: FigureAsset,
15
- /** A different face to place it by — the properties tab's choice. Absent keeps the declared one. */
16
- placement?: 'floor' | 'ceiling' | 'center' | 'wall'): Extract<FigureAuthoringAction, {
17
- kind: 'declare-occupancy';
18
- }>;
19
- /**
20
- * 공간 다시 계산의 확인 표 — 선언된 공간과 제안된 공간을 그린 크기와 가장 큰 크기에서, 축마다 한 줄로. 같은 줄은
21
- * 같다고 적는다. 밖으로 나간 부품은 figure-model 이 잰 것만 적는다 — 재지 않은 것을 「넘친다」고 단정하지 않는다
22
- * (설계자 2026-09-27).
23
- */
24
- export interface RoomRefitRow {
25
- at: 'authored' | 'largest';
26
- axis: 'x' | 'y' | 'z';
27
- declared: string;
28
- proposed: string;
29
- same: boolean;
30
- }
31
- export declare function roomRefitRowsOf(refit: FigureRoomRefit): RoomRefitRow[];
@@ -1,36 +0,0 @@
1
- import { proposeFigureOccupancy } from '@hatiolab/figure-model';
2
- /**
3
- * 「부품에 맞추기」의 짝 — 공간을 지금 부품에서 다시 선언하는 한 걸음.
4
- *
5
- * figure-model 은 이것을 둘로 나눠 두었다: 제안(`proposeFigureOccupancy`)은 무엇이 선언될지를 보여 주고, 확인
6
- * (`declare-occupancy`)은 그 제안이 읽은 모양 그대로일 때만 받는다. 저작자가 누른 단추가 그 확인이다. 제안과 확인
7
- * 사이에 모델이 바뀌면 figure-model 이 `OCCUPANCY_STALE` 로 거절하므로, 여기서는 누른 순간의 원본으로 둘을 한
8
- * 번에 만든다.
9
- *
10
- * 범위는 움직임 전체다(`over: 'range'`). 쉬는 자세만 담으면 움직이는 부품이 선언한 공간을 넘어 발행 판정이 다시
11
- * 막는다. 배치 기준은 이미 선언된 것을 지키고, 처음 선언하는 도형은 바닥에 선다고 둔다 — 새로 만든 도형의
12
- * 모델러 기본이 바닥이다.
13
- */
14
- export function occupancyFromParts(asset,
15
- /** A different face to place it by — the properties tab's choice. Absent keeps the declared one. */
16
- placement) {
17
- return {
18
- kind: 'declare-occupancy',
19
- proposal: proposeFigureOccupancy(asset, { over: 'range' }),
20
- /* The placement is the figure's own now (ADR-0097): named only when a different one is asked for. */
21
- ...(placement && placement !== (asset.placement ?? 'floor') ? { placement } : {})
22
- };
23
- }
24
- export function roomRefitRowsOf(refit) {
25
- const span = (b) => `${Math.round(b.min)} ~ ${Math.round(b.max)}`;
26
- const rows = [];
27
- for (const at of ['authored', 'largest']) {
28
- const declared = refit.declared[at], proposed = refit.proposed[at];
29
- if (!declared || !proposed)
30
- continue;
31
- for (const axis of ['x', 'y', 'z'])
32
- rows.push({ at, axis, declared: span(declared[axis]), proposed: span(proposed[axis]), same: span(declared[axis]) === span(proposed[axis]) });
33
- }
34
- return rows;
35
- }
36
- //# sourceMappingURL=occupancy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"occupancy.js","sourceRoot":"","sources":["../../client/modeller/occupancy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAsE,MAAM,wBAAwB,CAAA;AAEnI;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAkB;AAClB,oGAAoG;AACpG,SAAmD;IAEnD,OAAO;QACL,IAAI,EAAE,mBAAmB;QACzB,QAAQ,EAAE,sBAAsB,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC1D,qGAAqG;QACrG,GAAG,CAAC,SAAS,IAAI,SAAS,KAAK,CAAC,KAAK,CAAC,SAAS,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClF,CAAA;AACH,CAAC;AAcD,MAAM,UAAU,eAAe,CAAC,KAAsB;IACpD,MAAM,IAAI,GAAG,CAAC,CAA+B,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAA;IAC/F,MAAM,IAAI,GAAmB,EAAE,CAAA;IAC/B,KAAK,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,CAAU,EAAE,CAAC;QAClD,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,EACjC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;QAC/B,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ;YAAE,SAAQ;QACpC,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAU;YACzC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAA;IAChJ,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC","sourcesContent":["import { proposeFigureOccupancy, type FigureAsset, type FigureAuthoringAction, type FigureRoomRefit } from '@hatiolab/figure-model'\n\n/**\n * 「부품에 맞추기」의 짝 — 공간을 지금 부품에서 다시 선언하는 한 걸음.\n *\n * figure-model 은 이것을 둘로 나눠 두었다: 제안(`proposeFigureOccupancy`)은 무엇이 선언될지를 보여 주고, 확인\n * (`declare-occupancy`)은 그 제안이 읽은 모양 그대로일 때만 받는다. 저작자가 누른 단추가 그 확인이다. 제안과 확인\n * 사이에 모델이 바뀌면 figure-model 이 `OCCUPANCY_STALE` 로 거절하므로, 여기서는 누른 순간의 원본으로 둘을 한\n * 번에 만든다.\n *\n * 범위는 움직임 전체다(`over: 'range'`). 쉬는 자세만 담으면 움직이는 부품이 선언한 공간을 넘어 발행 판정이 다시\n * 막는다. 배치 기준은 이미 선언된 것을 지키고, 처음 선언하는 도형은 바닥에 선다고 둔다 — 새로 만든 도형의\n * 모델러 기본이 바닥이다.\n */\nexport function occupancyFromParts(\n asset: FigureAsset,\n /** A different face to place it by — the properties tab's choice. Absent keeps the declared one. */\n placement?: 'floor' | 'ceiling' | 'center' | 'wall'\n): Extract<FigureAuthoringAction, { kind: 'declare-occupancy' }> {\n return {\n kind: 'declare-occupancy',\n proposal: proposeFigureOccupancy(asset, { over: 'range' }),\n /* The placement is the figure's own now (ADR-0097): named only when a different one is asked for. */\n ...(placement && placement !== (asset.placement ?? 'floor') ? { placement } : {})\n }\n}\n\n/**\n * 공간 다시 계산의 확인 표 — 선언된 공간과 제안된 공간을 그린 크기와 가장 큰 크기에서, 축마다 한 줄로. 같은 줄은\n * 같다고 적는다. 밖으로 나간 부품은 figure-model 이 잰 것만 적는다 — 재지 않은 것을 「넘친다」고 단정하지 않는다\n * (설계자 2026-09-27).\n */\nexport interface RoomRefitRow {\n at: 'authored' | 'largest'\n axis: 'x' | 'y' | 'z'\n declared: string\n proposed: string\n same: boolean\n}\nexport function roomRefitRowsOf(refit: FigureRoomRefit): RoomRefitRow[] {\n const span = (b: { min: number; max: number }) => `${Math.round(b.min)} ~ ${Math.round(b.max)}`\n const rows: RoomRefitRow[] = []\n for (const at of ['authored', 'largest'] as const) {\n const declared = refit.declared[at],\n proposed = refit.proposed[at]\n if (!declared || !proposed) continue\n for (const axis of ['x', 'y', 'z'] as const)\n rows.push({ at, axis, declared: span(declared[axis]), proposed: span(proposed[axis]), same: span(declared[axis]) === span(proposed[axis]) })\n }\n return rows\n}\n"]}
@@ -1,53 +0,0 @@
1
- /*
2
- * **화면에서 발행할 수 있다** (ADR-0087 5단계의 선행 조건, 2026-09-24).
3
- *
4
- * 모델러에는 발행 패널이 없었다 — 저장은 되고 발행 · 판본 · 복원 · 판정을 볼 자리가 없었다. 복사본 검증의
5
- * 「32 개 발행 통과」는 스크립트가 서버의 문을 직접 부른 것이지 화면이 아니었다. 그리고 새로 만든 도형은 전부
6
- * 「공간 선언 없음」으로 발행이 막히는데, 그 선언을 할 단추가 화면 어디에도 없었다. 5단계에서 `figure-modeller`
7
- * 가 이 화면으로 바뀌면 새 도형은 영영 발행할 수 없었다.
8
- *
9
- * 두 축을 본다: 조치가 **정말로** 판정을 푸는가(figure-model 의 게이트로 잰다), 그리고 화면이 그 조치와 패널을
10
- * 실제로 잇는가.
11
- */
12
- import { test } from 'node:test'
13
- import assert from 'node:assert/strict'
14
-
15
- import {
16
- addFigureBox,
17
- applyFigureAuthoring,
18
- createFigureAsset,
19
- inspectFigureAsset,
20
- proposeFigureOccupancy,
21
- serializeFigureAsset
22
- } from '@hatiolab/figure-model'
23
-
24
- import { occupancyFromParts } from '../client/modeller/occupancy.ts'
25
-
26
- const codes = (asset: Parameters<typeof inspectFigureAsset>[0]) => inspectFigureAsset(asset).violations.map(v => v.code)
27
-
28
- test('새로 만든 도형의 「공간 선언 없음」을 「부품에 맞추기」 한 번이 푼다', () => {
29
- let asset = createFigureAsset('Probe')
30
- asset = addFigureBox(asset, { id: 'body', size: { x: 100, y: 100, z: 100 }, position: { x: 0, y: 50, z: 0 } })
31
- assert.deepEqual(codes(asset), ['OCCUPANCY_UNDECLARED'], '전제: 선언 없는 도형은 막힌다')
32
-
33
- const fitted = applyFigureAuthoring(asset, occupancyFromParts(asset))
34
-
35
- assert.deepEqual(codes(fitted), [])
36
- assert.equal(fitted.placement ?? 'floor', 'floor', '처음 선언하는 도형은 바닥에 선다')
37
- assert.equal('placement' in (fitted.occupancy ?? {}), false, '배치는 공간이 아니라 도형 자신의 설정 (ADR-0097)')
38
- })
39
-
40
- test('선언한 공간을 넘은 부품도 같은 한 번으로 풀리고, 배치 기준은 지킨다', () => {
41
- let asset = createFigureAsset('Probe')
42
- asset = addFigureBox(asset, { id: 'body', size: { x: 100, y: 100, z: 100 }, position: { x: 0, y: 50, z: 0 } })
43
- asset = applyFigureAuthoring(asset, { kind: 'declare-occupancy', proposal: proposeFigureOccupancy(asset, { over: 'range' }), placement: 'center' })
44
- asset = addFigureBox(asset, { id: 'arm', size: { x: 100, y: 100, z: 100 }, position: { x: 900, y: 50, z: 0 } })
45
- assert.ok(codes(asset).includes('PART_OUTSIDE_OCCUPANCY'), '전제: 넘은 부품은 막힌다')
46
-
47
- const fitted = applyFigureAuthoring(asset, occupancyFromParts(asset))
48
-
49
- assert.deepEqual(codes(fitted), [])
50
- assert.equal(fitted.placement, 'center', '이미 선언된 배치 기준을 바꾸지 않는다')
51
- })
52
-
53
- /* The page hangs the panel and takes what it sends -- fit, released, reverted -- checked in test/browser/product-page.check.mjs. */