@things-factory/figure-ui 10.1.45 → 10.1.47

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 (138) hide show
  1. package/client/modeller/angle-dial.ts +70 -0
  2. package/client/modeller/figure-settings.ts +328 -0
  3. package/client/modeller/figure-v3-capability.ts +137 -0
  4. package/client/modeller/figure-v3-clips.ts +253 -0
  5. package/client/modeller/figure-v3-controls.ts +212 -0
  6. package/client/modeller/figure-v3-links.ts +150 -79
  7. package/client/modeller/figure-v3-material.ts +108 -35
  8. package/client/modeller/figure-v3-parts.ts +96 -3
  9. package/client/modeller/figure-v3-preview.ts +326 -0
  10. package/client/modeller/figure-v3-properties.ts +29 -57
  11. package/client/modeller/figure-v3-verdict.ts +598 -60
  12. package/client/modeller/figure-view.ts +152 -0
  13. package/client/modeller/side-panel-styles.ts +326 -0
  14. package/client/modeller/v3-canvas.ts +221 -263
  15. package/client/modeller/v3-clips.ts +89 -0
  16. package/client/modeller/v3-controls.ts +54 -0
  17. package/client/modeller/v3-editor.ts +532 -223
  18. package/client/modeller/v3-fields.ts +62 -0
  19. package/client/modeller/v3-help.ts +41 -0
  20. package/client/modeller/v3-keys.ts +34 -0
  21. package/client/modeller/v3-links.ts +126 -10
  22. package/client/modeller/v3-live.ts +79 -0
  23. package/client/modeller/v3-maturity.ts +415 -0
  24. package/client/modeller/v3-palette.ts +45 -0
  25. package/client/modeller/v3-preview-model.ts +54 -0
  26. package/client/modeller/v3-stage-model.ts +159 -0
  27. package/client/pages/figure-list-page.ts +4 -4
  28. package/client/pages/figure-v3-modeller-page.ts +66 -134
  29. package/dist-client/modeller/angle-dial.d.ts +32 -0
  30. package/dist-client/modeller/angle-dial.js +41 -0
  31. package/dist-client/modeller/angle-dial.js.map +1 -0
  32. package/dist-client/modeller/figure-settings.d.ts +39 -0
  33. package/dist-client/modeller/figure-settings.js +317 -0
  34. package/dist-client/modeller/figure-settings.js.map +1 -0
  35. package/dist-client/modeller/figure-v3-capability.d.ts +22 -0
  36. package/dist-client/modeller/figure-v3-capability.js +141 -0
  37. package/dist-client/modeller/figure-v3-capability.js.map +1 -0
  38. package/dist-client/modeller/figure-v3-clips.d.ts +31 -0
  39. package/dist-client/modeller/figure-v3-clips.js +268 -0
  40. package/dist-client/modeller/figure-v3-clips.js.map +1 -0
  41. package/dist-client/modeller/figure-v3-controls.d.ts +36 -0
  42. package/dist-client/modeller/figure-v3-controls.js +226 -0
  43. package/dist-client/modeller/figure-v3-controls.js.map +1 -0
  44. package/dist-client/modeller/figure-v3-links.d.ts +10 -2
  45. package/dist-client/modeller/figure-v3-links.js +134 -79
  46. package/dist-client/modeller/figure-v3-links.js.map +1 -1
  47. package/dist-client/modeller/figure-v3-material.d.ts +5 -2
  48. package/dist-client/modeller/figure-v3-material.js +109 -35
  49. package/dist-client/modeller/figure-v3-material.js.map +1 -1
  50. package/dist-client/modeller/figure-v3-parts.d.ts +10 -0
  51. package/dist-client/modeller/figure-v3-parts.js +88 -3
  52. package/dist-client/modeller/figure-v3-parts.js.map +1 -1
  53. package/dist-client/modeller/figure-v3-preview.d.ts +34 -0
  54. package/dist-client/modeller/figure-v3-preview.js +322 -0
  55. package/dist-client/modeller/figure-v3-preview.js.map +1 -0
  56. package/dist-client/modeller/figure-v3-properties.d.ts +2 -2
  57. package/dist-client/modeller/figure-v3-properties.js +29 -57
  58. package/dist-client/modeller/figure-v3-properties.js.map +1 -1
  59. package/dist-client/modeller/figure-v3-verdict.d.ts +31 -17
  60. package/dist-client/modeller/figure-v3-verdict.js +579 -59
  61. package/dist-client/modeller/figure-v3-verdict.js.map +1 -1
  62. package/dist-client/modeller/figure-view.d.ts +118 -0
  63. package/dist-client/modeller/figure-view.js +78 -0
  64. package/dist-client/modeller/figure-view.js.map +1 -0
  65. package/dist-client/modeller/side-panel-styles.d.ts +23 -0
  66. package/dist-client/modeller/side-panel-styles.js +326 -0
  67. package/dist-client/modeller/side-panel-styles.js.map +1 -0
  68. package/dist-client/modeller/v3-canvas.d.ts +29 -37
  69. package/dist-client/modeller/v3-canvas.js +188 -260
  70. package/dist-client/modeller/v3-canvas.js.map +1 -1
  71. package/dist-client/modeller/v3-clips.d.ts +39 -0
  72. package/dist-client/modeller/v3-clips.js +58 -0
  73. package/dist-client/modeller/v3-clips.js.map +1 -0
  74. package/dist-client/modeller/v3-controls.d.ts +28 -0
  75. package/dist-client/modeller/v3-controls.js +28 -0
  76. package/dist-client/modeller/v3-controls.js.map +1 -0
  77. package/dist-client/modeller/v3-editor.d.ts +58 -1
  78. package/dist-client/modeller/v3-editor.js +556 -218
  79. package/dist-client/modeller/v3-editor.js.map +1 -1
  80. package/dist-client/modeller/v3-fields.d.ts +30 -0
  81. package/dist-client/modeller/v3-fields.js +46 -0
  82. package/dist-client/modeller/v3-fields.js.map +1 -0
  83. package/dist-client/modeller/v3-help.d.ts +18 -0
  84. package/dist-client/modeller/v3-help.js +37 -0
  85. package/dist-client/modeller/v3-help.js.map +1 -0
  86. package/dist-client/modeller/v3-keys.d.ts +14 -0
  87. package/dist-client/modeller/v3-keys.js +23 -0
  88. package/dist-client/modeller/v3-keys.js.map +1 -0
  89. package/dist-client/modeller/v3-links.d.ts +44 -2
  90. package/dist-client/modeller/v3-links.js +125 -8
  91. package/dist-client/modeller/v3-links.js.map +1 -1
  92. package/dist-client/modeller/v3-live.d.ts +31 -0
  93. package/dist-client/modeller/v3-live.js +58 -0
  94. package/dist-client/modeller/v3-live.js.map +1 -0
  95. package/dist-client/modeller/v3-maturity.d.ts +120 -0
  96. package/dist-client/modeller/v3-maturity.js +317 -0
  97. package/dist-client/modeller/v3-maturity.js.map +1 -0
  98. package/dist-client/modeller/v3-palette.d.ts +7 -0
  99. package/dist-client/modeller/v3-palette.js +42 -0
  100. package/dist-client/modeller/v3-palette.js.map +1 -0
  101. package/dist-client/modeller/v3-preview-model.d.ts +32 -0
  102. package/dist-client/modeller/v3-preview-model.js +48 -0
  103. package/dist-client/modeller/v3-preview-model.js.map +1 -0
  104. package/dist-client/modeller/v3-stage-model.d.ts +31 -0
  105. package/dist-client/modeller/v3-stage-model.js +121 -0
  106. package/dist-client/modeller/v3-stage-model.js.map +1 -0
  107. package/dist-client/pages/figure-list-page.js +4 -4
  108. package/dist-client/pages/figure-list-page.js.map +1 -1
  109. package/dist-client/pages/figure-v3-modeller-page.d.ts +2 -6
  110. package/dist-client/pages/figure-v3-modeller-page.js +64 -136
  111. package/dist-client/pages/figure-v3-modeller-page.js.map +1 -1
  112. package/dist-client/tsconfig.chk.tsbuildinfo +1 -0
  113. package/dist-client/tsconfig.scratch-fm.tsbuildinfo +1 -0
  114. package/dist-client/tsconfig.tsbuildinfo +1 -1
  115. package/package.json +6 -6
  116. package/test/v3-clips.test.ts +70 -0
  117. package/test/v3-controls.test.ts +68 -0
  118. package/test/v3-fields.test.ts +62 -0
  119. package/test/v3-gizmo.test.ts +3 -5
  120. package/test/v3-keys.test.ts +37 -0
  121. package/test/v3-layout.test.ts +78 -0
  122. package/test/v3-links.test.ts +118 -7
  123. package/test/v3-live.test.ts +99 -0
  124. package/test/v3-material.test.ts +6 -0
  125. package/test/v3-maturity.test.ts +268 -0
  126. package/test/v3-parts-wiring.test.ts +3 -1
  127. package/test/v3-preview.test.ts +42 -0
  128. package/test/v3-properties.test.ts +4 -2
  129. package/test/v3-scene-canvas.test.ts +85 -0
  130. package/test/v3-stage-model.test.ts +25 -0
  131. package/test/v3-theme.test.ts +16 -25
  132. package/test/v3-verdict.test.ts +12 -6
  133. package/test/v3-view.test.ts +20 -0
  134. package/translations/en.json +98 -5
  135. package/translations/ja.json +100 -7
  136. package/translations/ko.json +98 -5
  137. package/translations/ms.json +100 -7
  138. package/translations/zh.json +100 -7
@@ -29,8 +29,10 @@ test('개수는 목록 카드와 같은 셈이다 — V3 원가를 같은 capaci
29
29
 
30
30
  assert.equal(cost.groups, 2, '전제: 그려지는 부품 둘이 묶음 둘')
31
31
  assert.equal(capacityFrom(cost.groups, cost.triangles)?.instances, Math.floor(SCENE_BUDGET.groupsOnScreen / 2))
32
- assert.ok(/capacityFrom\(cost\.groups, cost\.triangles\)/.test(verdict), '판정 탭이 카드와 같은 함수로 센다')
33
- assert.ok(!/grade/.test(verdict.replace(/\/\*[\s\S]*?\*\//g, '')), 'V3 에는 잰 것이 없는 등급을 그리지 않는다')
32
+ const maturity = read('../client/modeller/v3-maturity.ts')
33
+ assert.ok(/capacityFrom\(cost\.groups, cost\.triangles\)/.test(maturity), '판정 탭이 카드와 같은 함수로 센다')
34
+ assert.ok(/report = asset \? v3ReportOf\(asset\) : undefined/.test(verdict), '탭은 그 셈을 부르고 보여 줄 뿐이다')
35
+ assert.ok(/instances: report\?\.capacity\.instances/.test(verdict), '탭 이름표의 개수도 같은 셈에서 온다')
34
36
  })
35
37
 
36
38
  test('판정은 발행 패널과 같은 서버 문에서 온다 — 화면이 따로 판정하지 않는다', () => {
@@ -56,15 +58,19 @@ test('판정 탭은 발행 패널과 같은 두 판정에 「부품에 맞추기
56
58
  assert.ok(/<figure-v3-verdict[\s\S]*?@fit-base-to-parts=\$\{this\.fitToParts\}/.test(page), '누르면 공간 선언으로 이어진다')
57
59
  })
58
60
 
59
- test('화면이 탭 둘을 걸고, 감추되 떼지 않는다', () => {
61
+ test('판정과 이력은 편집기의 탭에 서고, 감추되 떼지 않는다', () => {
62
+ const editor = read('../client/modeller/v3-editor.ts')
60
63
  assert.ok(/<figure-v3-verdict[\s\S]*?\.source=\$\{this\.draftSource\(\)\}/.test(page), '편집 중인 원본을 넘긴다')
61
64
  assert.ok(/<figure-v3-verdict[\s\S]*?\.figureType=/.test(page), '타입을 바꾸면 다시 판정한다')
62
- assert.ok(/<figure-v3-verdict\s+\?off=/.test(page) && /<figure-history-panel\s+\?off=/.test(page), '고르지 않은 탭은 감춘다')
63
- assert.ok(/@capacity-changed=/.test(page) && /this\.instances\)/.test(page), '개수가 탭 이름표에 남는다')
65
+ assert.ok(/<figure-v3-verdict\s+slot="verdict"/.test(page) && /<figure-history-panel\s+slot="history"/.test(page))
66
+ assert.ok(editor.includes(`<div panel flush ?off=\${tab !== 'verdict'}><slot name="verdict"></slot></div>`), '고르지 않은 탭은 감춘다 — 판정은 마지막 답을 지킨다')
67
+ assert.ok(/@capacity-changed=/.test(page) && page.includes('.instances=${this.instances}'), '개수를 편집기에 넘긴다')
68
+ assert.ok(editor.includes("this.renderTab('verdict', 'insights', i18next.t('figure.label.maturity'), this.instances)"), '개수가 탭 이름표에 남는다')
64
69
  })
65
70
 
66
71
  test('판정 탭의 말은 다섯 말 모두에 있다 — 없으면 키가 그대로 찍힌다', () => {
67
- const keys = [...verdict.matchAll(/'(figure\.[a-z.-]*[a-z])'/g)].map(m => m[1])
72
+ const maturity = read('../client/modeller/v3-maturity.ts')
73
+ const keys = [...(verdict + maturity).matchAll(/'(figure\.[a-z.-]*[a-z])'/g)].map(m => m[1])
68
74
  assert.ok(keys.includes('figure.text.verdict-asking'), '전제: 삼항 안의 키도 센다')
69
75
  for (const lang of ['ko', 'en', 'ja', 'zh', 'ms']) {
70
76
  const table = JSON.parse(read(`../translations/${lang}.json`))
@@ -0,0 +1,20 @@
1
+ /*
2
+ * **보기 — 작업대의 설정** (V3 동등표 ⑦, V2 의 「환경」 탭). 도형에 저장되지 않고, 보는 사람의 브라우저에 남는다.
3
+ */
4
+ import { test } from 'node:test'
5
+ import assert from 'node:assert/strict'
6
+ import { readFileSync } from 'node:fs'
7
+ import { fileURLToPath } from 'node:url'
8
+
9
+
10
+ const read = (path: string) => readFileSync(fileURLToPath(new URL(path, import.meta.url)), 'utf8')
11
+
12
+ test('환경 탭은 V2 의 보기 패널 그대로 — 설정은 판의 상태 이름이고, 도형이 아니라 브라우저에 둔다', () => {
13
+ const editor = read('../client/modeller/v3-editor.ts')
14
+ assert.ok(editor.includes('<figure-settings .view=${this.view} @update-view=${(e: CustomEvent) => this.setView(e.detail.view)}></figure-settings>'))
15
+ assert.ok(editor.includes("localStorage.setItem('figure-v3-view'"))
16
+ assert.doesNotMatch(editor.slice(editor.indexOf('private setView'), editor.indexOf('private setView') + 400), /session/, '설정은 세션(도형)에 닿지 않는다')
17
+ const view = read('../client/modeller/figure-view.ts')
18
+ assert.ok(view.includes("'studio',") && view.includes("'rainy'"), '환경 여덟')
19
+ assert.ok(read('../client/modeller/figure-settings.ts').includes("i18next.t('figure.text.view-settings-are-not-saved')"))
20
+ })
@@ -15,6 +15,8 @@
15
15
  "figure.button.duplicate-part": "duplicate",
16
16
  "figure.button.fit-base-to-parts": "fit to parts",
17
17
  "figure.button.fix-position": "fix here",
18
+ "figure.button.scale-position": "in proportion",
19
+ "figure.button.remeasure-range": "measure again",
18
20
  "figure.button.mirror-x": "mirror X",
19
21
  "figure.button.mirror-z": "mirror Z",
20
22
  "figure.button.move-part-down": "move down",
@@ -24,7 +26,6 @@
24
26
  "figure.button.pivot-set": "set",
25
27
  "figure.button.pose-as-default": "make this the default pose",
26
28
  "figure.button.preview-fix": "preview fix · {part} {axis} face: {from} → {to}",
27
- "figure.button.redo": "redo",
28
29
  "figure.button.release-figure": "release",
29
30
  "figure.button.restore-released-base": "restore the previous model width",
30
31
  "figure.button.keep-changed-appearance": "publish with the adjusted width",
@@ -43,6 +44,7 @@
43
44
  "figure.label.gizmo-scale": "size",
44
45
  "figure.label.gizmo-translate": "move",
45
46
  "figure.label.position-worked-out": "moves with the figure size",
47
+ "figure.label.position-in-proportion": "in proportion to the figure size",
46
48
  "figure.label.primitive-rounded-box": "rounded box",
47
49
  "figure.text.catalog-needs-a-save": "can be set once the figure is saved.",
48
50
  "figure.text.declared-space-declared": "declared from the parts.",
@@ -50,6 +52,8 @@
50
52
  "figure.text.fasten-would-loop": "that part is already fastened to this one, so it cannot be fastened the other way.",
51
53
  "figure.text.follow-would-loop": "that dimension already follows this part, so the two cannot follow each other.",
52
54
  "figure.text.links-need-a-box": "size following works on box-shaped parts, fastening on boxes and cylinders.",
55
+ "figure.text.scale-position-explained": "keeps this place as a share of the figure size — at twice the size it is twice as far.",
56
+ "figure.text.instance-range-can-widen": "measured again after the parts changed: {ranges} mm.",
53
57
  "figure.text.mounting-face-needs-space": "declare the space first to choose one.",
54
58
  "figure.text.part-is-referenced": "'{part}' cannot be deleted: another part is fastened to it or follows its size. Undo that link first.",
55
59
  "figure.text.part-name-invalid": "'{name}' cannot be a part name. Start with a letter and use letters, digits, - and _.",
@@ -58,7 +62,6 @@
58
62
  "figure.text.recommended-fix-explained": "{n} changes rechecked against every resize case. They apply to this draft only; review and save when ready.",
59
63
  "figure.text.show-affected-parts": "show affected parts",
60
64
  "figure.button.to-floor": "to floor",
61
- "figure.button.undo": "undo",
62
65
  "figure.label.accepts": "accepts",
63
66
  "figure.label.anchor": "anchored face",
64
67
  "figure.label.anchor-advanced": "advanced proportional sizing",
@@ -110,11 +113,12 @@
110
113
  "figure.label.axis-scale-short": "scale",
111
114
  "figure.label.axis-width": "width",
112
115
  "figure.label.base-box": "base box (mm)",
113
- "figure.label.budget-groups": "material groups",
116
+ "figure.label.budget-groups": "groups (draw calls)",
114
117
  "figure.label.budget-independent": "independently moved parts",
115
118
  "figure.label.budget-parts": "part count",
116
119
  "figure.label.budget-surface": "surfaces outside the palette",
117
120
  "figure.label.budget-transparent": "transparent materials",
121
+ "figure.label.budget-triangles": "triangles",
118
122
  "figure.label.budgets": "budgets",
119
123
  "figure.label.by-axis": "maturity by item",
120
124
  "figure.label.candidate-review": "candidate review",
@@ -137,6 +141,8 @@
137
141
  "figure.label.detail-level": "detail level",
138
142
  "figure.label.distinct-materials": "distinct materials",
139
143
  "figure.label.distinct-shapes": "distinct shapes",
144
+ "figure.label.draw-calls": "draw calls",
145
+ "figure.label.vertex-buffers": "vertex buffers",
140
146
  "figure.label.draft": "draft",
141
147
  "figure.label.emissive": "emissive",
142
148
  "figure.label.emissive-color": "lit color",
@@ -253,6 +259,7 @@
253
259
  "figure.label.repeat-count": "count",
254
260
  "figure.label.repeat-pitch": "pitch",
255
261
  "figure.label.reuse-trend": "reuse trend",
262
+ "figure.label.instance-count": "instance count",
256
263
  "figure.label.role-in-capability": "role in the capability",
257
264
  "figure.label.role-port-in": "inbound port",
258
265
  "figure.label.role-port-out": "outbound port",
@@ -308,6 +315,12 @@
308
315
  "figure.text.bound-by-triangles": "triangles reach the limit first ({per} per instance, {budget} per drawing).",
309
316
  "figure.text.budget-measured-on": "Measured on {gpu}, {on}. A figure standing still costs nothing — only what is on screen and redrawn counts.",
310
317
  "figure.text.budget-not-measured-yet": "this target has not been measured yet.",
318
+ "figure.text.budgets-not-in-v3": "off-palette surfaces and the part-count limit are not in the V3 format, so they are not shown.",
319
+ "figure.text.trend-chart-title": "drawing cost by instance count",
320
+ "figure.text.trend-chart-lead": "flat lines stay the same as instances grow. instances of the same size share them.",
321
+ "figure.text.trend-at-count": "at {n}",
322
+ "figure.text.trend-stays": "unchanged",
323
+ "figure.text.trend-flat-lines-overlap": "the flat lines overlap at {value}.",
311
324
  "figure.text.cannot-release-now": "cannot be released yet",
312
325
  "figure.text.fit-needs-parts": "there are no parts to fit to — add a shape first.",
313
326
  "figure.text.nothing-blocks-release": "nothing in the figure as it stands blocks releasing it.",
@@ -362,8 +375,12 @@
362
375
  "figure.text.floor-explained": "overlaps the coordinate ground, so it is usually off",
363
376
  "figure.text.follow-camera-explained": "turn off to fix the shadow direction",
364
377
  "figure.text.grade-decided-by": "what decided the grade",
365
- "figure.text.grade-explained": "the grade is set by the usage of the item closest to its limit.",
378
+ "figure.text.grade-explained": "the grade is the headroom against placing {target} of this figure on one screen. the item closest to its limit decides it.",
366
379
  "figure.text.grade-scale-lead": "grade scale (limit used)",
380
+ "figure.text.grade-target": "target: {target} on one screen — up to {groups} groups · {triangles} triangles each",
381
+ "figure.text.parts-budget": "{triangles} triangles · {groups} groups · {instances} on one screen",
382
+ "figure.text.parts-budget-over": "over the {budget} limit — {used} / {limit}",
383
+ "figure.text.parts-budget-open": "open maturity",
367
384
  "figure.text.headroom-percent": "{percent}% headroom",
368
385
  "figure.text.hemisphere-light-explained": "even light from sky and ground. it brightens shaded faces.",
369
386
  "figure.text.hide-all-parts": "hide all",
@@ -387,6 +404,7 @@
387
404
  "figure.text.keys-must-rise": "each key must come after the one before it.",
388
405
  "figure.text.limit-comes-from-level": "the detail level sets this limit.",
389
406
  "figure.text.maturity-blocked-no-binding": "state display is not measured yet.",
407
+ "figure.text.maturity-blocked-no-detail-level": "the V3 format has no detail level. the budgets and placement scale above take its place.",
390
408
  "figure.text.maturity-blocked-no-parts": "nothing to measure — there are no parts.",
391
409
  "figure.text.maturity-consistency-because": "checks texture use, recommended segment counts and the number of materials.",
392
410
  "figure.text.maturity-consistency-clean": "no issues",
@@ -501,6 +519,8 @@
501
519
  "figure.text.follows-explained": "What this side grows with. Stretch the figure on a board and this follows.",
502
520
  "figure.label.follows-nothing": "fixed",
503
521
  "figure.label.follows-instance": "instance size",
522
+ "figure.label.follows-instance-share": "in proportion to size",
523
+ "figure.label.instance-range": "sizes it can be placed at",
504
524
  "figure.label.follows-part": "another part",
505
525
  "figure.label.times": "times",
506
526
  "figure.label.plus": "plus (mm)",
@@ -565,5 +585,78 @@
565
585
  "figure.label.state-inputs": "state inputs",
566
586
  "figure.label.design-inputs": "design inputs",
567
587
  "figure.text.release-blocked": "Release is blocked — {count}",
568
- "figure.text.release-ready": "Ready to release"
588
+ "figure.text.release-ready": "Ready to release",
589
+ "figure.label.places": "Places",
590
+ "figure.text.places-need-a-box": "A place sits on a face of a box-shaped part.",
591
+ "figure.label.place-grip": "Grip",
592
+ "figure.label.place-seat": "Seat",
593
+ "figure.label.place-holds": "up to {count}",
594
+ "figure.button.remove-place": "Remove place",
595
+ "figure.text.place-explained": "Where a board sets or holds things on this part. When the part moves, what it holds moves with it.",
596
+ "figure.text.place-needs-holding": "This figure does not declare that it holds things, so a board hands nothing to its places.",
597
+ "figure.button.declare-holding": "Make it hold things",
598
+ "figure.label.place-name": "Name",
599
+ "figure.label.place-accepts": "Takes",
600
+ "figure.label.place-capacity": "How many",
601
+ "figure.text.place-accepts-needed": "Name at least one type it takes, separated by commas.",
602
+ "figure.button.add-place": "Add place",
603
+ "figure.label.controls": "Controls",
604
+ "figure.text.controls-explained": "A board or a connection sets these values to pose the figure. Move a slider to try one.",
605
+ "figure.text.no-controls": "No controls yet. Adding a motion to a part makes one.",
606
+ "figure.button.keep-pose": "Keep this pose as the default",
607
+ "figure.label.control-name": "Name",
608
+ "figure.text.control-starts-at": "Starts at {value} {unit} when placed on a board.",
609
+ "figure.label.control-sweep": "Full travel time (s)",
610
+ "figure.button.whole-figure": "Whole figure",
611
+ "figure.label.places-on-part": "Places on {part}",
612
+ "figure.text.choose-a-part-to-move": "Choose a part to set how it moves.",
613
+ "figure.text.loading-figure": "Loading",
614
+ "figure.text.no-places": "No places yet. Choose a part and add one here.",
615
+ "figure.text.opening-model": "Opening the model.",
616
+ "figure.text.saved": "Saved",
617
+ "figure.text.clips-explained": "Plays controls over time. Move the bar to see the pose at a moment; make a pose with the control sliders, then add a key at that moment.",
618
+ "figure.label.clip-duration": "Length (s)",
619
+ "figure.label.clip-time": "Clip time",
620
+ "figure.label.clip-loop": "After the end",
621
+ "figure.label.clip-loop-wrap": "Repeat",
622
+ "figure.label.clip-loop-hold": "Hold the last value",
623
+ "figure.button.remove-track": "Stop playing this control",
624
+ "figure.button.remove-key": "Remove key",
625
+ "figure.button.add-key-here": "Add a key at {seconds} s ({value})",
626
+ "figure.label.add-track": "Play a control",
627
+ "figure.label.clip": "Clip",
628
+ "figure.label.new-clip": "New clip",
629
+ "figure.button.add-track": "Add",
630
+ "figure.text.add-a-shape-to-start": "Add a shape to start modelling.",
631
+ "figure.label.primitive-frustum": "Cone",
632
+ "figure.label.primitive-plate": "Plate",
633
+ "figure.label.field-width": "Width",
634
+ "figure.label.field-height": "Height",
635
+ "figure.label.field-depth": "Depth",
636
+ "figure.label.field-radius": "Radius",
637
+ "figure.label.field-length": "Length",
638
+ "figure.label.field-round": "Corner radius",
639
+ "figure.label.field-left": "Left",
640
+ "figure.label.field-right": "Right",
641
+ "figure.label.field-bottom": "Bottom",
642
+ "figure.label.field-top": "Top",
643
+ "figure.label.field-openingLeft": "Opening left",
644
+ "figure.label.field-openingRight": "Opening right",
645
+ "figure.label.field-openingTop": "Opening top",
646
+ "figure.label.field-radiusX": "Radius X",
647
+ "figure.label.field-radiusY": "Radius Y",
648
+ "figure.label.field-radiusZ": "Radius Z",
649
+ "figure.label.field-radiusTop": "Top radius",
650
+ "figure.label.field-radiusBottom": "Bottom radius",
651
+ "figure.label.group-position": "Position",
652
+ "figure.label.group-rotation": "Rotation (°)",
653
+ "figure.label.group-size": "Size",
654
+ "figure.label.group-placement-size": "Position and size",
655
+ "figure.label.group-shape": "Shape",
656
+ "figure.label.group-figure-size": "Figure size",
657
+ "figure.label.group-part": "Part",
658
+ "figure.label.group-figure": "Figure",
659
+ "figure.label.group-standing": "Where it stands",
660
+ "figure.label.group-catalog": "Catalogue",
661
+ "figure.button.control-settings": "Name, range and time"
569
662
  }
@@ -15,6 +15,8 @@
15
15
  "figure.button.duplicate-part": "duplicate",
16
16
  "figure.button.fit-base-to-parts": "部品に合わせる",
17
17
  "figure.button.fix-position": "ここに固定",
18
+ "figure.button.scale-position": "サイズに比例",
19
+ "figure.button.remeasure-range": "測り直す",
18
20
  "figure.button.mirror-x": "mirror X",
19
21
  "figure.button.mirror-z": "mirror Z",
20
22
  "figure.button.move-part-down": "move down",
@@ -24,7 +26,6 @@
24
26
  "figure.button.pivot-set": "設定",
25
27
  "figure.button.pose-as-default": "この姿勢を既定に",
26
28
  "figure.button.preview-fix": "修正案をプレビュー · {part} {axis} 固定面: {from} → {to}",
27
- "figure.button.redo": "やり直す",
28
29
  "figure.button.release-figure": "公開する",
29
30
  "figure.button.remove": "削除",
30
31
  "figure.button.remove-part": "delete",
@@ -41,6 +42,7 @@
41
42
  "figure.label.gizmo-scale": "サイズ",
42
43
  "figure.label.gizmo-translate": "移動",
43
44
  "figure.label.position-worked-out": "図形のサイズに合わせて動く",
45
+ "figure.label.position-in-proportion": "図形サイズに比例",
44
46
  "figure.label.primitive-rounded-box": "角丸ボックス",
45
47
  "figure.text.catalog-needs-a-save": "保存した後に設定できます。",
46
48
  "figure.text.declared-space-declared": "部品から宣言しました。",
@@ -48,6 +50,8 @@
48
50
  "figure.text.fasten-would-loop": "その部品はすでにこの部品に取り付けられているため、逆向きに取り付けられません。",
49
51
  "figure.text.follow-would-loop": "その寸法はすでにこの部品に追従しているため、互いに追従させられません。",
50
52
  "figure.text.links-need-a-box": "サイズ追従は箱形、取り付けは箱形と円柱の部品で使えます。",
53
+ "figure.text.scale-position-explained": "今の位置を図形サイズの割合として保ちます。2 倍のサイズなら 2 倍の距離に置かれます。",
54
+ "figure.text.instance-range-can-widen": "部品が変わったので測り直すと {ranges} mm です。",
51
55
  "figure.text.mounting-face-needs-space": "先に空間を宣言すると選べます。",
52
56
  "figure.text.part-is-referenced": "'{part}' には他の部品が取り付けられているか、そのサイズに従っているため削除できません。先にその連結を外してください。",
53
57
  "figure.text.part-name-invalid": "'{name}' は部品名に使えません。英字で始め、英字・数字・-・_ のみ使えます。",
@@ -56,7 +60,6 @@
56
60
  "figure.text.recommended-fix-explained": "すべてのサイズ変更ケースを再検査した {n} 件の修正です。下書きだけに適用され、保存前に確認できます。",
57
61
  "figure.text.show-affected-parts": "影響する部品を見る",
58
62
  "figure.button.to-floor": "to floor",
59
- "figure.button.undo": "元に戻す",
60
63
  "figure.label.accepts": "受け入れるもの",
61
64
  "figure.label.anchor": "固定する面",
62
65
  "figure.label.anchor-advanced": "advanced proportional sizing",
@@ -108,11 +111,12 @@
108
111
  "figure.label.axis-scale-short": "scale",
109
112
  "figure.label.axis-width": "width",
110
113
  "figure.label.base-box": "基準ボックス (mm)",
111
- "figure.label.budget-groups": "material groups",
114
+ "figure.label.budget-groups": "グループ(draw call)",
112
115
  "figure.label.budget-independent": "個別に動く部品",
113
116
  "figure.label.budget-parts": "part count",
114
117
  "figure.label.budget-surface": "surfaces outside the palette",
115
118
  "figure.label.budget-transparent": "transparent materials",
119
+ "figure.label.budget-triangles": "三角形",
116
120
  "figure.label.budgets": "budgets",
117
121
  "figure.label.by-axis": "項目別の成熟度",
118
122
  "figure.label.candidate-review": "candidate review",
@@ -135,6 +139,8 @@
135
139
  "figure.label.detail-level": "detail level",
136
140
  "figure.label.distinct-materials": "distinct materials",
137
141
  "figure.label.distinct-shapes": "distinct shapes",
142
+ "figure.label.draw-calls": "draw call",
143
+ "figure.label.vertex-buffers": "頂点バッファ",
138
144
  "figure.label.draft": "下書き",
139
145
  "figure.label.emissive": "emissive",
140
146
  "figure.label.emissive-color": "lit color",
@@ -251,6 +257,7 @@
251
257
  "figure.label.repeat-count": "個数",
252
258
  "figure.label.repeat-pitch": "pitch",
253
259
  "figure.label.reuse-trend": "reuse trend",
260
+ "figure.label.instance-count": "インスタンス数",
254
261
  "figure.label.role-in-capability": "能力での役割",
255
262
  "figure.label.role-port-in": "入力ポート",
256
263
  "figure.label.role-port-out": "出力ポート",
@@ -287,7 +294,7 @@
287
294
  "figure.label.triangles": "triangles",
288
295
  "figure.label.unit-none": "単位なし",
289
296
  "figure.label.unit-type-it": "直接入力…",
290
- "figure.label.weight": "weight",
297
+ "figure.label.weight": "描画コスト",
291
298
  "figure.label.what-this-does": "この Figure の役割",
292
299
  "figure.text.accepts-anything": "空欄なら何でも可",
293
300
  "figure.text.accepts-explained": "このスロットに置けるタイプです。カンマで区切り、空欄なら制限はありません。",
@@ -306,6 +313,12 @@
306
313
  "figure.text.bound-by-triangles": "三角形が先に上限に達します (1 個あたり {per}、図面あたり {budget})。",
307
314
  "figure.text.budget-measured-on": "{gpu} で {on} に測定した値です。静止している図形は負荷になりません — 画面に見えて再描画されるものだけを数えます。",
308
315
  "figure.text.budget-not-measured-yet": "this target has not been measured yet.",
316
+ "figure.text.budgets-not-in-v3": "パレット外の表面と部品数の上限は V3 形式にない項目のため表示しません。",
317
+ "figure.text.trend-chart-title": "インスタンス数による描画コスト",
318
+ "figure.text.trend-chart-lead": "平らな線はインスタンスが増えても変わらない値です。同じサイズのインスタンスが共有します。",
319
+ "figure.text.trend-at-count": "{n}個のとき",
320
+ "figure.text.trend-stays": "変化なし",
321
+ "figure.text.trend-flat-lines-overlap": "平らな線が {value} で重なっています。",
309
322
  "figure.text.cannot-release-now": "今は公開できません",
310
323
  "figure.text.fit-needs-parts": "合わせる部品がありません。先に形状を追加してください。",
311
324
  "figure.text.nothing-blocks-release": "今の形のままなら公開を妨げるものはありません。",
@@ -360,8 +373,12 @@
360
373
  "figure.text.floor-explained": "座標の下地と重なるため、通常はオフにします",
361
374
  "figure.text.follow-camera-explained": "オフにすると影の向きが固定されます",
362
375
  "figure.text.grade-decided-by": "what decided the grade",
363
- "figure.text.grade-explained": "等級は、上限に最も近い 1 項目の使用率で決まります。",
376
+ "figure.text.grade-explained": "等級は、1 画面にこの図形を {target} 台置く目標に対する余裕です。上限に最も近い 1 項目で決まります。",
364
377
  "figure.text.grade-scale-lead": "grade scale (limit used)",
378
+ "figure.text.grade-target": "1 画面 {target} 台が目標 — 1 台あたりグループ {groups} · 三角形 {triangles} まで",
379
+ "figure.text.parts-budget": "三角形 {triangles} · グループ {groups} · 1 画面 {instances} 台",
380
+ "figure.text.parts-budget-over": "{budget}の上限を超えています — {used} / {limit}",
381
+ "figure.text.parts-budget-open": "成熟度を見る",
365
382
  "figure.text.headroom-percent": "{percent}% headroom",
366
383
  "figure.text.hemisphere-light-explained": "空と床から均一に照らす光です。陰になった面を明るくします。",
367
384
  "figure.text.hide-all-parts": "hide all",
@@ -385,6 +402,7 @@
385
402
  "figure.text.keys-must-rise": "時刻は前のキーより大きくする必要があります。",
386
403
  "figure.text.limit-comes-from-level": "the detail level sets this limit.",
387
404
  "figure.text.maturity-blocked-no-binding": "状態表現はまだ測定していません。",
405
+ "figure.text.maturity-blocked-no-detail-level": "V3 形式には詳細等級がありません。上の上限と配置規模で判断します。",
388
406
  "figure.text.maturity-blocked-no-parts": "nothing to measure — there are no parts.",
389
407
  "figure.text.maturity-consistency-because": "テクスチャの使用、推奨分割数の遵守、材質の種類数を確認します。",
390
408
  "figure.text.maturity-consistency-clean": "no issues",
@@ -448,7 +466,7 @@
448
466
  "figure.text.repeat-grows-with-instance": "インスタンスがこの軸に伸びると個数が増えます。間隔はそのままです。",
449
467
  "figure.text.repeat-keeps-count": "インスタンスが伸びても個数はそのままで、コピーが大きくなります。",
450
468
  "figure.text.repeat-pitch-explained": "中心から次の中心までの距離です。部品のサイズを変えても保たれます。",
451
- "figure.text.report-appears-when-you-add-a-part": "weight and score appear once the figure has a part.",
469
+ "figure.text.report-appears-when-you-add-a-part": "三角形数、draw call、1つの図面に置ける数を表示します。部品を作ると測定します。",
452
470
  "figure.text.reuse-score-explained": "how much headroom is left in the declared limits. the one closest to its cap sets the score.",
453
471
  "figure.text.revert-to-version-confirm": "バージョン {version} に戻します。編集中の内容がそのバージョンに置き換わります。続けますか?",
454
472
  "figure.text.role-none-means-drawn": "何も選ばなければ描くだけの部品です",
@@ -497,6 +515,8 @@
497
515
  "figure.text.follows-explained": "What this side grows with. Stretch the figure on a board and this follows.",
498
516
  "figure.label.follows-nothing": "fixed",
499
517
  "figure.label.follows-instance": "instance size",
518
+ "figure.label.follows-instance-share": "サイズに比例",
519
+ "figure.label.instance-range": "置けるサイズ",
500
520
  "figure.label.follows-part": "another part",
501
521
  "figure.label.times": "times",
502
522
  "figure.label.plus": "plus (mm)",
@@ -565,5 +585,78 @@
565
585
  "figure.button.keep-changed-appearance": "調整したモデル幅で公開",
566
586
  "figure.button.restore-released-base": "以前のモデル幅に戻す",
567
587
  "figure.text.appearance-choice-explained": "戻すと X と Z を直前の公開値に戻し、Y とほかの編集はそのまま残します。調整した幅で公開すると、今のモデルの外形を残します。",
568
- "figure.text.choose-appearance-change": "調整したモデル幅の扱いを選んでください"
588
+ "figure.text.choose-appearance-change": "調整したモデル幅の扱いを選んでください",
589
+ "figure.label.places": "置き場所",
590
+ "figure.text.places-need-a-box": "置き場所は箱形の部品の面に置きます。",
591
+ "figure.label.place-grip": "つかむ場所",
592
+ "figure.label.place-seat": "載せる場所",
593
+ "figure.label.place-holds": "{count}個まで",
594
+ "figure.button.remove-place": "置き場所を削除",
595
+ "figure.text.place-explained": "ボード上で物をこの部品のどの面に載せるか、つかむかを決めます。部品が動くと物も一緒に動きます。",
596
+ "figure.text.place-needs-holding": "この図形は物を保持すると宣言していないため、置き場所を作ってもボードは物を渡しません。",
597
+ "figure.button.declare-holding": "物を保持する図形にする",
598
+ "figure.label.place-name": "名前",
599
+ "figure.label.place-accepts": "受け取る種類",
600
+ "figure.label.place-capacity": "最大個数",
601
+ "figure.text.place-accepts-needed": "受け取る種類を一つ以上、カンマ区切りで入力してください。",
602
+ "figure.button.add-place": "置き場所を追加",
603
+ "figure.label.controls": "操作値",
604
+ "figure.text.controls-explained": "ボードや連携がこの値を変えて図形の姿勢を動かします。スライダーで試せます。",
605
+ "figure.text.no-controls": "操作値はまだありません。部品の「動き」で動きを追加すると作られます。",
606
+ "figure.button.keep-pose": "今の姿勢を既定にする",
607
+ "figure.label.control-name": "名前",
608
+ "figure.text.control-starts-at": "ボードに置くと {value} {unit} から始まります。",
609
+ "figure.label.control-sweep": "端から端までの時間 (秒)",
610
+ "figure.button.whole-figure": "図形全体",
611
+ "figure.label.places-on-part": "{part} の置き場所",
612
+ "figure.text.choose-a-part-to-move": "部品を選ぶと、その動きを設定できます。",
613
+ "figure.text.loading-figure": "読み込み中",
614
+ "figure.text.no-places": "置き場所はまだありません。部品を選んでここで追加します。",
615
+ "figure.text.opening-model": "モデルを開いています。",
616
+ "figure.text.saved": "保存済み",
617
+ "figure.text.clips-explained": "操作値を時間に沿って動かします。バーを動かすとその瞬間の姿勢を表示し、操作値スライダーで姿勢を作ってからその瞬間にキーを追加します。",
618
+ "figure.label.clip-duration": "長さ (秒)",
619
+ "figure.label.clip-time": "クリップの時刻",
620
+ "figure.label.clip-loop": "終了後",
621
+ "figure.label.clip-loop-wrap": "最初から繰り返す",
622
+ "figure.label.clip-loop-hold": "最後の値を保つ",
623
+ "figure.button.remove-track": "この操作値の再生を削除",
624
+ "figure.button.remove-key": "キーを削除",
625
+ "figure.button.add-key-here": "{seconds} 秒にキーを追加 ({value})",
626
+ "figure.label.add-track": "操作値の再生を追加",
627
+ "figure.label.clip": "クリップ",
628
+ "figure.label.new-clip": "新しいクリップ",
629
+ "figure.button.add-track": "追加",
630
+ "figure.text.add-a-shape-to-start": "図形を追加してモデリングを始めましょう。",
631
+ "figure.label.primitive-frustum": "円錐",
632
+ "figure.label.primitive-plate": "板",
633
+ "figure.label.field-width": "幅",
634
+ "figure.label.field-height": "高さ",
635
+ "figure.label.field-depth": "奥行き",
636
+ "figure.label.field-radius": "半径",
637
+ "figure.label.field-length": "長さ",
638
+ "figure.label.field-round": "角の半径",
639
+ "figure.label.field-left": "左",
640
+ "figure.label.field-right": "右",
641
+ "figure.label.field-bottom": "下面",
642
+ "figure.label.field-top": "上面",
643
+ "figure.label.field-openingLeft": "開口部 左",
644
+ "figure.label.field-openingRight": "開口部 右",
645
+ "figure.label.field-openingTop": "開口部 上",
646
+ "figure.label.field-radiusX": "半径 X",
647
+ "figure.label.field-radiusY": "半径 Y",
648
+ "figure.label.field-radiusZ": "半径 Z",
649
+ "figure.label.field-radiusTop": "上面の半径",
650
+ "figure.label.field-radiusBottom": "下面の半径",
651
+ "figure.label.group-position": "位置",
652
+ "figure.label.group-rotation": "回転 (°)",
653
+ "figure.label.group-size": "サイズ",
654
+ "figure.label.group-placement-size": "位置とサイズ",
655
+ "figure.label.group-shape": "形状の寸法",
656
+ "figure.label.group-figure-size": "図形のサイズ",
657
+ "figure.label.group-part": "部品",
658
+ "figure.label.group-figure": "図形",
659
+ "figure.label.group-standing": "置き方",
660
+ "figure.label.group-catalog": "一覧情報",
661
+ "figure.button.control-settings": "名前・範囲・時間"
569
662
  }