@things-factory/figure-ui 10.1.28 → 10.1.31
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.
- package/client/{themes → harness-theme}/brand.css +15 -4
- package/{dist-client/themes → client/harness-theme}/dark.css +4 -4
- package/client/{themes → harness-theme}/light.css +6 -6
- package/client/modeller/angle-dial.ts +70 -0
- package/client/modeller/figure-animations.ts +9 -9
- package/client/modeller/figure-canvas.ts +6 -3
- package/client/modeller/figure-inspector.ts +18 -3
- package/client/modeller/figure-preview.ts +56 -4
- package/client/modeller/figure-report.ts +11 -28
- package/client/modeller/figure-side.ts +1 -0
- package/client/modeller/joint-gizmo.ts +63 -1
- package/client/modeller/part-edits.ts +75 -9
- package/client/pages/figure-modeller-page.ts +20 -2
- package/client/types.ts +2 -0
- package/dist-client/{themes → harness-theme}/brand.css +15 -4
- package/{client/themes → dist-client/harness-theme}/dark.css +4 -4
- package/dist-client/{themes → harness-theme}/light.css +6 -6
- package/dist-client/modeller/angle-dial.d.ts +32 -0
- package/dist-client/modeller/angle-dial.js +41 -0
- package/dist-client/modeller/angle-dial.js.map +1 -0
- package/dist-client/modeller/figure-animations.d.ts +4 -4
- package/dist-client/modeller/figure-animations.js +9 -9
- package/dist-client/modeller/figure-animations.js.map +1 -1
- package/dist-client/modeller/figure-canvas.js +6 -3
- package/dist-client/modeller/figure-canvas.js.map +1 -1
- package/dist-client/modeller/figure-inspector.d.ts +11 -0
- package/dist-client/modeller/figure-inspector.js +20 -3
- package/dist-client/modeller/figure-inspector.js.map +1 -1
- package/dist-client/modeller/figure-preview.d.ts +11 -0
- package/dist-client/modeller/figure-preview.js +53 -3
- package/dist-client/modeller/figure-preview.js.map +1 -1
- package/dist-client/modeller/figure-report.d.ts +8 -4
- package/dist-client/modeller/figure-report.js +11 -31
- package/dist-client/modeller/figure-report.js.map +1 -1
- package/dist-client/modeller/figure-side.js +1 -0
- package/dist-client/modeller/figure-side.js.map +1 -1
- package/dist-client/modeller/joint-gizmo.d.ts +4 -1
- package/dist-client/modeller/joint-gizmo.js +54 -0
- package/dist-client/modeller/joint-gizmo.js.map +1 -1
- package/dist-client/modeller/part-edits.d.ts +29 -4
- package/dist-client/modeller/part-edits.js +61 -9
- package/dist-client/modeller/part-edits.js.map +1 -1
- package/dist-client/pages/figure-modeller-page.d.ts +7 -0
- package/dist-client/pages/figure-modeller-page.js +20 -2
- package/dist-client/pages/figure-modeller-page.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-client/types.d.ts +2 -0
- package/dist-client/types.js.map +1 -1
- package/package.json +5 -5
- package/test/angle-dial.test.ts +78 -0
- package/test/base-box.test.ts +11 -0
- package/test/brand-palette.test.ts +99 -18
- package/test/expect.ts +2 -0
- package/test/i18n-prefix-guard.test.ts +17 -0
- package/test/joint-needle.test.ts +162 -0
- package/test/part-edits.test.ts +100 -0
- package/test/scene-budget.test.ts +29 -0
- package/translations/en.json +3 -7
- package/translations/ja.json +3 -7
- package/translations/ko.json +3 -7
- package/translations/ms.json +3 -7
- package/translations/zh.json +3 -7
package/test/part-edits.test.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import assert from 'node:assert/strict'
|
|
2
2
|
import { describe, it, test } from 'node:test'
|
|
3
|
+
import { readFileSync } from 'node:fs'
|
|
4
|
+
import { fileURLToPath } from 'node:url'
|
|
3
5
|
|
|
4
6
|
import { expect } from './expect.ts'
|
|
5
7
|
|
|
@@ -17,6 +19,7 @@ import {
|
|
|
17
19
|
niceStep,
|
|
18
20
|
partLimit,
|
|
19
21
|
removePart,
|
|
22
|
+
roundPart,
|
|
20
23
|
snapPart,
|
|
21
24
|
updatePart
|
|
22
25
|
} from '../client/modeller/part-edits.ts'
|
|
@@ -55,6 +58,53 @@ const DECK: PartModel = {
|
|
|
55
58
|
token: 'palette.primary'
|
|
56
59
|
}
|
|
57
60
|
|
|
61
|
+
/*
|
|
62
|
+
* 기즈모에서 온 숫자.
|
|
63
|
+
*
|
|
64
|
+
* 화면에서 끌면 씬이 비율을 곱한 값을 돌려준다. 그 값이 그대로 부품에 들어가면 저장 형식에
|
|
65
|
+
* 소수 넷째 자리가 남고, 크기 칸은 잘려서 보인다.
|
|
66
|
+
*/
|
|
67
|
+
describe('씬에서 온 부품을 밀리미터로 맞춘다', () => {
|
|
68
|
+
const part = (over: Partial<PartModel> = {}): PartModel => ({ ...DECK, ...over })
|
|
69
|
+
|
|
70
|
+
it('끈 크기와 자리를 정수로 맞춘다', () => {
|
|
71
|
+
const dragged = part({ left: 384.99999999999994, top: 380, zPos: 930, width: 368.98743869823886, height: 140, depth: 722.4180046035418 })
|
|
72
|
+
const fixed = roundPart(dragged)
|
|
73
|
+
|
|
74
|
+
expect(fixed.left).toBe(385)
|
|
75
|
+
expect(fixed.width).toBe(369)
|
|
76
|
+
expect(fixed.depth).toBe(722)
|
|
77
|
+
expect(fixed.top).toBe(380)
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
it('크기는 1 밑으로 안 내려간다 — 0 이면 부피가 사라지고 배율이 0 으로 나뉜다', () => {
|
|
81
|
+
const tiny = roundPart(part({ width: 0.2, height: 0.4, depth: 0 }))
|
|
82
|
+
expect(tiny.width).toBe(1)
|
|
83
|
+
expect(tiny.height).toBe(1)
|
|
84
|
+
expect(tiny.depth).toBe(1)
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
it('맞춘 값을 다시 맞춰도 같다', () => {
|
|
88
|
+
const once = roundPart(part({ left: 12.5, width: 7.5 }))
|
|
89
|
+
expect(roundPart(once)).toEqual(once)
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
it('캔버스가 씬의 변경을 받을 때 그것을 지난다 — 안 부르면 위 넷이 전부 초록인 채로 소수가 남는다', () => {
|
|
93
|
+
const canvas = readFileSync(fileURLToPath(new URL('../client/modeller/figure-canvas.ts', import.meta.url)), 'utf8')
|
|
94
|
+
|
|
95
|
+
assert.ok(/roundPart/.test(canvas), 'import')
|
|
96
|
+
assert.ok(/this\.tell\('part-changed', \{ name, part: roundPart\(/.test(canvas), '올려 보내기 전에 맞춘다')
|
|
97
|
+
})
|
|
98
|
+
|
|
99
|
+
it('크기·자리 밖의 값은 건드리지 않는다', () => {
|
|
100
|
+
const kept = roundPart(part({ name: 'arm', token: 'palette.dark', segments: 12, zPos: 3.4 }))
|
|
101
|
+
expect(kept.name).toBe('arm')
|
|
102
|
+
expect(kept.token).toBe('palette.dark')
|
|
103
|
+
expect(kept.segments).toBe(12)
|
|
104
|
+
expect(kept.zPos).toBe(3)
|
|
105
|
+
})
|
|
106
|
+
})
|
|
107
|
+
|
|
58
108
|
describe('부품 생성', () => {
|
|
59
109
|
it('기준 상자의 3분의 1 크기로 생성된다 — 추가하자마자 보여야 한다', () => {
|
|
60
110
|
const part = newPart(DRAFT, [], 'cube')
|
|
@@ -98,6 +148,56 @@ describe('부품 생성', () => {
|
|
|
98
148
|
expect(newPart(DRAFT, [], 'polygon').path).toHaveLength(3)
|
|
99
149
|
})
|
|
100
150
|
|
|
151
|
+
/*
|
|
152
|
+
* 둘째 부품이 어디에 서는가.
|
|
153
|
+
*
|
|
154
|
+
* 언제나 바닥 한가운데였을 때, 둘째 부품은 첫 부품 **속에** 들어갔다 — 같은 자리에 같은
|
|
155
|
+
* 크기라 화면에는 덩어리 하나뿐이고 저작자는 무엇이 늘었는지 못 봤다.
|
|
156
|
+
*/
|
|
157
|
+
describe('고른 부품 위에 얹는다', () => {
|
|
158
|
+
/* 갑판을 바닥에 내려 둔다 — 그 위에 3분의 1 짜리가 들어가야 얹는 갈래를 볼 수 있다. */
|
|
159
|
+
const FLOOR_DECK = { ...DECK, zPos: 0 }
|
|
160
|
+
|
|
161
|
+
it('윗면에 서고 발자국이 가운데로 맞는다', () => {
|
|
162
|
+
const part = newPart(DRAFT, [FLOOR_DECK], 'cube', FLOOR_DECK)
|
|
163
|
+
|
|
164
|
+
expect(part.zPos).toBe(FLOOR_DECK.zPos + FLOOR_DECK.depth)
|
|
165
|
+
// 자리도 크기도 정수로 맞추므로 0.5 까지는 어긋난다
|
|
166
|
+
const middle = { x: FLOOR_DECK.left + FLOOR_DECK.width / 2, y: FLOOR_DECK.top + FLOOR_DECK.height / 2 }
|
|
167
|
+
expect(Math.abs(part.left + part.width / 2 - middle.x)).toBeLessThanOrEqual(0.5)
|
|
168
|
+
expect(Math.abs(part.top + part.height / 2 - middle.y)).toBeLessThanOrEqual(0.5)
|
|
169
|
+
})
|
|
170
|
+
|
|
171
|
+
it('얹으면 상자를 넘을 때는 바닥 한가운데로 간다 — 추가가 발행을 막지 않는다', () => {
|
|
172
|
+
/* 갑판이 이미 높다: 500 + 200 위에 267 을 더 쌓으면 상자 높이 800 을 넘는다. */
|
|
173
|
+
const part = newPart(DRAFT, [DECK], 'cube', DECK)
|
|
174
|
+
|
|
175
|
+
expect(part.zPos).toBe(0)
|
|
176
|
+
expect(Math.abs(part.left + part.width / 2 - DRAFT.width / 2)).toBeLessThanOrEqual(0.5)
|
|
177
|
+
})
|
|
178
|
+
|
|
179
|
+
it('가장자리 부품 위에서도 상자 안에 남는다', () => {
|
|
180
|
+
const corner = { ...DECK, left: 0, top: 0, width: 200, height: 200, zPos: 0, depth: 100 }
|
|
181
|
+
const part = newPart(DRAFT, [corner], 'cube', corner)
|
|
182
|
+
|
|
183
|
+
expect(part.left).toBe(0)
|
|
184
|
+
expect(part.top).toBe(0)
|
|
185
|
+
expect(part.left + part.width).toBeLessThanOrEqual(DRAFT.width)
|
|
186
|
+
expect(part.top + part.height).toBeLessThanOrEqual(DRAFT.height)
|
|
187
|
+
})
|
|
188
|
+
|
|
189
|
+
it('고른 것이 없으면 전과 같이 바닥 한가운데다', () => {
|
|
190
|
+
const alone = newPart(DRAFT, [DECK], 'cube')
|
|
191
|
+
expect(alone.zPos).toBe(0)
|
|
192
|
+
expect(Math.abs(alone.left + alone.width / 2 - DRAFT.width / 2)).toBeLessThanOrEqual(0.5)
|
|
193
|
+
})
|
|
194
|
+
|
|
195
|
+
it('쌓은 둘이 서로 겹치지 않는다 — 이 규칙이 지키는 것이 그것이다', () => {
|
|
196
|
+
const [, stacked] = addPart(DRAFT, [FLOOR_DECK], 'cylinder', FLOOR_DECK)
|
|
197
|
+
expect(stacked!.zPos).toBeGreaterThanOrEqual(FLOOR_DECK.zPos + FLOOR_DECK.depth)
|
|
198
|
+
})
|
|
199
|
+
})
|
|
200
|
+
|
|
101
201
|
/*
|
|
102
202
|
화면에서 멀쩡해 보여도 저장이 거부되면 사용자는 이유를 알 수 없다. 새로 만든 부품은
|
|
103
203
|
손대지 않은 상태로도 검증을 통과해야 한다.
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import assert from 'node:assert/strict'
|
|
2
2
|
import { describe, it } from 'node:test'
|
|
3
3
|
|
|
4
|
+
import { readFileSync } from 'node:fs'
|
|
5
|
+
import { join } from 'node:path'
|
|
6
|
+
import { fileURLToPath } from 'node:url'
|
|
7
|
+
|
|
4
8
|
import { capacityFrom, MEASURED, SCENE_BUDGET } from '../client/modeller/scene-budget.ts'
|
|
5
9
|
|
|
6
10
|
/*
|
|
@@ -51,3 +55,28 @@ describe('한 화면이 감당하는 양', () => {
|
|
|
51
55
|
assert.ok(conveyor.instances >= 1600 && conveyor.instances <= 2500)
|
|
52
56
|
})
|
|
53
57
|
})
|
|
58
|
+
|
|
59
|
+
/*
|
|
60
|
+
* 놓는 개수로 값을 말하지 않는다 — ADR-0051 ③.
|
|
61
|
+
*
|
|
62
|
+
* 보고서에 「100개 기준 draw call」 · 「1만개 기준」이 오래 남아 있었다. 놓는 개수는 값을 치르지
|
|
63
|
+
* 않는다(가만히 선 도형은 프레임 비용 0, 카메라 밖은 컬링). 치르는 것은 한 화면에 보이는 개수 ×
|
|
64
|
+
* 그 도형의 묶음 수이고, 그 답은 위의 실측 분모가 한다.
|
|
65
|
+
*/
|
|
66
|
+
describe('놓는 개수 기준 문구가 화면에 없다', () => {
|
|
67
|
+
const HERE = fileURLToPath(new URL('.', import.meta.url))
|
|
68
|
+
|
|
69
|
+
it('보고서가 「N개 기준」 칸을 그리지 않는다', () => {
|
|
70
|
+
const report = readFileSync(join(HERE, '../client/modeller/figure-report.ts'), 'utf8')
|
|
71
|
+
|
|
72
|
+
assert.ok(!/at-100|at-10k/.test(report), '개수 기준 칸')
|
|
73
|
+
assert.ok(!/costOf\(blueprint, \d/.test(report), '개수를 넣어 셈하지 않는다')
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
it('번역에 그 낱말이 남아 있지 않다', () => {
|
|
77
|
+
const ko = JSON.parse(readFileSync(join(HERE, '../translations/ko.json'), 'utf8')) as Record<string, string>
|
|
78
|
+
const left = Object.entries(ko).filter(([key]) => /at-100|at-10k/.test(key))
|
|
79
|
+
|
|
80
|
+
assert.deepEqual(left, [])
|
|
81
|
+
})
|
|
82
|
+
})
|
package/translations/en.json
CHANGED
|
@@ -85,8 +85,8 @@
|
|
|
85
85
|
"figure.label.axis-scale-short": "scale",
|
|
86
86
|
"figure.label.axis-width": "width",
|
|
87
87
|
"figure.label.base-box": "base box (mm)",
|
|
88
|
-
"figure.label.budget-animations": "moving parts",
|
|
89
88
|
"figure.label.budget-groups": "material groups",
|
|
89
|
+
"figure.label.budget-independent": "independently moved parts",
|
|
90
90
|
"figure.label.budget-parts": "part count",
|
|
91
91
|
"figure.label.budget-surface": "surfaces outside the palette",
|
|
92
92
|
"figure.label.budget-transparent": "transparent materials",
|
|
@@ -113,8 +113,6 @@
|
|
|
113
113
|
"figure.label.distinct-materials": "distinct materials",
|
|
114
114
|
"figure.label.distinct-shapes": "distinct shapes",
|
|
115
115
|
"figure.label.draft": "draft",
|
|
116
|
-
"figure.label.draw-calls-at-100": "draw calls for 100",
|
|
117
|
-
"figure.label.draw-calls-at-10k": "draw calls at 10k instances",
|
|
118
116
|
"figure.label.emissive": "emissive",
|
|
119
117
|
"figure.label.emissive-color": "lit color",
|
|
120
118
|
"figure.label.environment": "environment",
|
|
@@ -263,8 +261,6 @@
|
|
|
263
261
|
"figure.label.tools": "align",
|
|
264
262
|
"figure.label.transparent": "transparent",
|
|
265
263
|
"figure.label.triangles": "triangles",
|
|
266
|
-
"figure.label.triangles-at-100": "triangles for 100",
|
|
267
|
-
"figure.label.triangles-at-10k": "triangles at 10k instances",
|
|
268
264
|
"figure.label.unit-none": "no unit",
|
|
269
265
|
"figure.label.unit-type-it": "type it…",
|
|
270
266
|
"figure.label.weight": "drawing cost",
|
|
@@ -276,8 +272,6 @@
|
|
|
276
272
|
"figure.text.already-released-edit-to-release-again": "already released. edit and save to go back to draft, then release again.",
|
|
277
273
|
"figure.text.anchor-explained": "where this part stays as the box grows. two touching parts on different faces drift apart as it grows.",
|
|
278
274
|
"figure.text.anchors-are-not-drawn": "slots and ports are not drawn on a drawing; only the editor shows them.",
|
|
279
|
-
"figure.text.animated-parts-cost": "each moving part adds one draw call.",
|
|
280
|
-
"figure.text.animated-parts-over": "over the limit. many of these on one drawing will slow it down.",
|
|
281
275
|
"figure.text.animation-empty-examples": "a turning roller · a sliding door leaf · a rising lift · a blinking beacon.",
|
|
282
276
|
"figure.text.animation-empty-what-it-is": "no motion yet. add a clip to move parts.",
|
|
283
277
|
"figure.text.animation-needs-a-named-part": "add a part first.",
|
|
@@ -344,6 +338,8 @@
|
|
|
344
338
|
"figure.text.hide-all-parts": "hide all",
|
|
345
339
|
"figure.text.hide-this-part": "hide this part while you work. not saved",
|
|
346
340
|
"figure.text.how-many-fit": "how many can be on screen before it slows down",
|
|
341
|
+
"figure.text.independent-parts-cost": "each part that carries its own transform adds one draw call.",
|
|
342
|
+
"figure.text.independent-parts-over": "over the limit. fewer of these fit on one screen at once.",
|
|
347
343
|
"figure.text.instances-unit": "instances",
|
|
348
344
|
"figure.text.interpolation-explained": "how the gap between keys is filled.",
|
|
349
345
|
"figure.text.joint-channel-value-deg": "key values are joint angles in degrees.",
|
package/translations/ja.json
CHANGED
|
@@ -85,8 +85,8 @@
|
|
|
85
85
|
"figure.label.axis-scale-short": "scale",
|
|
86
86
|
"figure.label.axis-width": "width",
|
|
87
87
|
"figure.label.base-box": "基準ボックス (mm)",
|
|
88
|
-
"figure.label.budget-animations": "animation points",
|
|
89
88
|
"figure.label.budget-groups": "material groups",
|
|
89
|
+
"figure.label.budget-independent": "個別に動く部品",
|
|
90
90
|
"figure.label.budget-parts": "part count",
|
|
91
91
|
"figure.label.budget-surface": "surfaces outside the palette",
|
|
92
92
|
"figure.label.budget-transparent": "transparent materials",
|
|
@@ -113,8 +113,6 @@
|
|
|
113
113
|
"figure.label.distinct-materials": "distinct materials",
|
|
114
114
|
"figure.label.distinct-shapes": "distinct shapes",
|
|
115
115
|
"figure.label.draft": "下書き",
|
|
116
|
-
"figure.label.draw-calls-at-100": "draw calls for 100",
|
|
117
|
-
"figure.label.draw-calls-at-10k": "draw calls at 10k instances",
|
|
118
116
|
"figure.label.emissive": "emissive",
|
|
119
117
|
"figure.label.emissive-color": "lit color",
|
|
120
118
|
"figure.label.environment": "environment",
|
|
@@ -263,8 +261,6 @@
|
|
|
263
261
|
"figure.label.tools": "align",
|
|
264
262
|
"figure.label.transparent": "transparent",
|
|
265
263
|
"figure.label.triangles": "triangles",
|
|
266
|
-
"figure.label.triangles-at-100": "triangles for 100",
|
|
267
|
-
"figure.label.triangles-at-10k": "triangles at 10k instances",
|
|
268
264
|
"figure.label.unit-none": "単位なし",
|
|
269
265
|
"figure.label.unit-type-it": "直接入力…",
|
|
270
266
|
"figure.label.weight": "weight",
|
|
@@ -276,8 +272,6 @@
|
|
|
276
272
|
"figure.text.already-released-edit-to-release-again": "すでに公開済みです。修正して保存すると下書きに戻り、そこで再び公開できます。",
|
|
277
273
|
"figure.text.anchor-explained": "ボックスが伸びるときにこの部品が付いている面です。接する部品と違う面に付くと、伸びたときに間が空きます。",
|
|
278
274
|
"figure.text.anchors-are-not-drawn": "スロットとポートは図面には描かれず、編集画面にだけ表示されます。",
|
|
279
|
-
"figure.text.animated-parts-cost": "動く部品ごとに draw call が 1 増えます。",
|
|
280
|
-
"figure.text.animated-parts-over": "上限を超えました。1 つの図面に多く置くと画面が遅くなります。",
|
|
281
275
|
"figure.text.animation-empty-examples": "回るローラー · スライドする扉 · 上下するリフト · 点滅する表示灯。",
|
|
282
276
|
"figure.text.animation-empty-what-it-is": "まだ動きがありません。clip を追加して部品を動かしてください。",
|
|
283
277
|
"figure.text.animation-needs-a-named-part": "先に部品を追加してください。",
|
|
@@ -344,6 +338,8 @@
|
|
|
344
338
|
"figure.text.hide-all-parts": "hide all",
|
|
345
339
|
"figure.text.hide-this-part": "hide this part while you work. not saved",
|
|
346
340
|
"figure.text.how-many-fit": "画面に出しても遅くならない数",
|
|
341
|
+
"figure.text.independent-parts-cost": "個別に動く部品ごとに draw call が 1 増えます。",
|
|
342
|
+
"figure.text.independent-parts-over": "上限を超えました。1 つの画面に一緒に置ける台数がその分減ります。",
|
|
347
343
|
"figure.text.instances-unit": "instances",
|
|
348
344
|
"figure.text.interpolation-explained": "キーの間をどうつなぐか。",
|
|
349
345
|
"figure.text.joint-channel-value-deg": "キーの値は関節の角度 (度) です。",
|
package/translations/ko.json
CHANGED
|
@@ -85,8 +85,8 @@
|
|
|
85
85
|
"figure.label.axis-scale-short": "규모",
|
|
86
86
|
"figure.label.axis-width": "가로",
|
|
87
87
|
"figure.label.base-box": "기준 상자 (mm)",
|
|
88
|
-
"figure.label.budget-animations": "움직이는 부품",
|
|
89
88
|
"figure.label.budget-groups": "재질 그룹",
|
|
89
|
+
"figure.label.budget-independent": "따로 움직이는 부품",
|
|
90
90
|
"figure.label.budget-parts": "부품 수",
|
|
91
91
|
"figure.label.budget-surface": "팔레트 외 표면",
|
|
92
92
|
"figure.label.budget-transparent": "투명 재질",
|
|
@@ -113,8 +113,6 @@
|
|
|
113
113
|
"figure.label.distinct-materials": "서로 다른 재질",
|
|
114
114
|
"figure.label.distinct-shapes": "서로 다른 형상",
|
|
115
115
|
"figure.label.draft": "초안",
|
|
116
|
-
"figure.label.draw-calls-at-100": "100개 기준 draw call",
|
|
117
|
-
"figure.label.draw-calls-at-10k": "1만개 기준 draw call",
|
|
118
116
|
"figure.label.emissive": "자체발광",
|
|
119
117
|
"figure.label.emissive-color": "켜진 색",
|
|
120
118
|
"figure.label.environment": "환경",
|
|
@@ -263,8 +261,6 @@
|
|
|
263
261
|
"figure.label.tools": "맞추기",
|
|
264
262
|
"figure.label.transparent": "투명",
|
|
265
263
|
"figure.label.triangles": "삼각형",
|
|
266
|
-
"figure.label.triangles-at-100": "100개 기준 삼각형",
|
|
267
|
-
"figure.label.triangles-at-10k": "1만개 기준 삼각형",
|
|
268
264
|
"figure.label.unit-none": "단위 없음",
|
|
269
265
|
"figure.label.unit-type-it": "직접 적기…",
|
|
270
266
|
"figure.label.weight": "그리는 비용",
|
|
@@ -276,8 +272,6 @@
|
|
|
276
272
|
"figure.text.already-released-edit-to-release-again": "이미 발행되어 있습니다. 고쳐서 저장하면 초안으로 돌아가고, 그때 다시 발행할 수 있습니다.",
|
|
277
273
|
"figure.text.anchor-explained": "상자가 커질 때 이 부품이 어디에 붙어 있을지입니다. 맞댄 부품과 다른 면에 붙어 있으면 커질 때 사이가 벌어집니다.",
|
|
278
274
|
"figure.text.anchors-are-not-drawn": "슬롯과 포트는 도면에 그려지지 않고 편집 화면에만 표시됩니다.",
|
|
279
|
-
"figure.text.animated-parts-cost": "움직이는 부품마다 draw call 이 1 늘어납니다.",
|
|
280
|
-
"figure.text.animated-parts-over": "한도를 넘었습니다. 한 도면에 여러 개 놓으면 화면이 느려집니다.",
|
|
281
275
|
"figure.text.animation-empty-examples": "도는 롤러 · 미끄러지는 문짝 · 오르내리는 리프트 · 깜빡이는 표시등.",
|
|
282
276
|
"figure.text.animation-empty-what-it-is": "아직 움직임이 없습니다. clip 을 추가해 부품을 움직이세요.",
|
|
283
277
|
"figure.text.animation-needs-a-named-part": "부품을 먼저 추가하세요.",
|
|
@@ -344,6 +338,8 @@
|
|
|
344
338
|
"figure.text.hide-all-parts": "모두 감추기",
|
|
345
339
|
"figure.text.hide-this-part": "이 부품을 잠깐 가립니다. 저장되지 않습니다",
|
|
346
340
|
"figure.text.how-many-fit": "한 화면에 보여도 느려지지 않는 수",
|
|
341
|
+
"figure.text.independent-parts-cost": "따로 움직이는 부품마다 draw call 이 하나 늘어납니다.",
|
|
342
|
+
"figure.text.independent-parts-over": "한도를 넘었습니다. 한 화면에 함께 세울 수 있는 대수가 그만큼 줍니다.",
|
|
347
343
|
"figure.text.instances-unit": "개",
|
|
348
344
|
"figure.text.interpolation-explained": "키프레임 사이를 어떻게 잇습니까.",
|
|
349
345
|
"figure.text.joint-channel-value-deg": "키 값은 관절 각도(도)입니다.",
|
package/translations/ms.json
CHANGED
|
@@ -85,8 +85,8 @@
|
|
|
85
85
|
"figure.label.axis-scale-short": "scale",
|
|
86
86
|
"figure.label.axis-width": "width",
|
|
87
87
|
"figure.label.base-box": "kotak asas (mm)",
|
|
88
|
-
"figure.label.budget-animations": "animation points",
|
|
89
88
|
"figure.label.budget-groups": "material groups",
|
|
89
|
+
"figure.label.budget-independent": "bahagian yang bergerak sendiri",
|
|
90
90
|
"figure.label.budget-parts": "part count",
|
|
91
91
|
"figure.label.budget-surface": "surfaces outside the palette",
|
|
92
92
|
"figure.label.budget-transparent": "transparent materials",
|
|
@@ -113,8 +113,6 @@
|
|
|
113
113
|
"figure.label.distinct-materials": "distinct materials",
|
|
114
114
|
"figure.label.distinct-shapes": "distinct shapes",
|
|
115
115
|
"figure.label.draft": "draf",
|
|
116
|
-
"figure.label.draw-calls-at-100": "draw calls for 100",
|
|
117
|
-
"figure.label.draw-calls-at-10k": "draw calls at 10k instances",
|
|
118
116
|
"figure.label.emissive": "emissive",
|
|
119
117
|
"figure.label.emissive-color": "lit color",
|
|
120
118
|
"figure.label.environment": "environment",
|
|
@@ -263,8 +261,6 @@
|
|
|
263
261
|
"figure.label.tools": "align",
|
|
264
262
|
"figure.label.transparent": "transparent",
|
|
265
263
|
"figure.label.triangles": "triangles",
|
|
266
|
-
"figure.label.triangles-at-100": "triangles for 100",
|
|
267
|
-
"figure.label.triangles-at-10k": "triangles at 10k instances",
|
|
268
264
|
"figure.label.unit-none": "tiada unit",
|
|
269
265
|
"figure.label.unit-type-it": "taip sendiri…",
|
|
270
266
|
"figure.label.weight": "weight",
|
|
@@ -276,8 +272,6 @@
|
|
|
276
272
|
"figure.text.already-released-edit-to-release-again": "sudah diterbitkan. sunting dan simpan untuk kembali ke draf, kemudian terbitkan semula.",
|
|
277
273
|
"figure.text.anchor-explained": "muka tempat bahagian ini kekal apabila kotak membesar. dua bahagian yang bersentuhan pada muka berbeza akan terpisah apabila membesar.",
|
|
278
274
|
"figure.text.anchors-are-not-drawn": "slot dan port tidak dilukis pada lukisan; hanya editor yang memaparkannya.",
|
|
279
|
-
"figure.text.animated-parts-cost": "setiap bahagian yang bergerak menambah satu draw call.",
|
|
280
|
-
"figure.text.animated-parts-over": "melebihi had. banyak daripada ini pada satu lukisan akan melambatkannya.",
|
|
281
275
|
"figure.text.animation-empty-examples": "penggelek berputar · daun pintu gelongsor · lif naik · lampu isyarat berkelip.",
|
|
282
276
|
"figure.text.animation-empty-what-it-is": "belum ada gerakan. tambah clip untuk menggerakkan bahagian.",
|
|
283
277
|
"figure.text.animation-needs-a-named-part": "tambah bahagian dahulu.",
|
|
@@ -344,6 +338,8 @@
|
|
|
344
338
|
"figure.text.hide-all-parts": "hide all",
|
|
345
339
|
"figure.text.hide-this-part": "hide this part while you work. not saved",
|
|
346
340
|
"figure.text.how-many-fit": "berapa banyak boleh ada di skrin sebelum ia perlahan",
|
|
341
|
+
"figure.text.independent-parts-cost": "setiap bahagian yang bergerak sendiri menambah satu draw call.",
|
|
342
|
+
"figure.text.independent-parts-over": "melebihi had. lebih sedikit daripada ini muat pada satu skrin.",
|
|
347
343
|
"figure.text.instances-unit": "instances",
|
|
348
344
|
"figure.text.interpolation-explained": "cara jurang antara kunci diisi.",
|
|
349
345
|
"figure.text.joint-channel-value-deg": "nilai kunci ialah sudut sendi dalam darjah.",
|
package/translations/zh.json
CHANGED
|
@@ -85,8 +85,8 @@
|
|
|
85
85
|
"figure.label.axis-scale-short": "scale",
|
|
86
86
|
"figure.label.axis-width": "width",
|
|
87
87
|
"figure.label.base-box": "基准盒 (mm)",
|
|
88
|
-
"figure.label.budget-animations": "animation points",
|
|
89
88
|
"figure.label.budget-groups": "material groups",
|
|
89
|
+
"figure.label.budget-independent": "单独运动的部件",
|
|
90
90
|
"figure.label.budget-parts": "part count",
|
|
91
91
|
"figure.label.budget-surface": "surfaces outside the palette",
|
|
92
92
|
"figure.label.budget-transparent": "transparent materials",
|
|
@@ -113,8 +113,6 @@
|
|
|
113
113
|
"figure.label.distinct-materials": "distinct materials",
|
|
114
114
|
"figure.label.distinct-shapes": "distinct shapes",
|
|
115
115
|
"figure.label.draft": "草稿",
|
|
116
|
-
"figure.label.draw-calls-at-100": "draw calls for 100",
|
|
117
|
-
"figure.label.draw-calls-at-10k": "draw calls at 10k instances",
|
|
118
116
|
"figure.label.emissive": "emissive",
|
|
119
117
|
"figure.label.emissive-color": "lit color",
|
|
120
118
|
"figure.label.environment": "environment",
|
|
@@ -263,8 +261,6 @@
|
|
|
263
261
|
"figure.label.tools": "align",
|
|
264
262
|
"figure.label.transparent": "transparent",
|
|
265
263
|
"figure.label.triangles": "triangles",
|
|
266
|
-
"figure.label.triangles-at-100": "triangles for 100",
|
|
267
|
-
"figure.label.triangles-at-10k": "triangles at 10k instances",
|
|
268
264
|
"figure.label.unit-none": "无单位",
|
|
269
265
|
"figure.label.unit-type-it": "直接输入…",
|
|
270
266
|
"figure.label.weight": "weight",
|
|
@@ -276,8 +272,6 @@
|
|
|
276
272
|
"figure.text.already-released-edit-to-release-again": "已经发布。修改并保存会回到草稿,然后可以再次发布。",
|
|
277
273
|
"figure.text.anchor-explained": "包围盒放大时此部件贴住的面。与相邻部件贴在不同的面上时,放大后两者之间会出现间隙。",
|
|
278
274
|
"figure.text.anchors-are-not-drawn": "槽位和端口不会绘制在图面上,只在编辑画面中显示。",
|
|
279
|
-
"figure.text.animated-parts-cost": "每个运动部件增加 1 个 draw call。",
|
|
280
|
-
"figure.text.animated-parts-over": "已超过上限。在一个图面上放置多个会使画面变慢。",
|
|
281
275
|
"figure.text.animation-empty-examples": "转动的滚轮 · 滑动的门扇 · 升降的升降机 · 闪烁的指示灯。",
|
|
282
276
|
"figure.text.animation-empty-what-it-is": "还没有动作。添加 clip 来移动部件。",
|
|
283
277
|
"figure.text.animation-needs-a-named-part": "请先添加部件。",
|
|
@@ -344,6 +338,8 @@
|
|
|
344
338
|
"figure.text.hide-all-parts": "hide all",
|
|
345
339
|
"figure.text.hide-this-part": "hide this part while you work. not saved",
|
|
346
340
|
"figure.text.how-many-fit": "同屏显示而不变慢的数量",
|
|
341
|
+
"figure.text.independent-parts-cost": "每个单独运动的部件增加 1 个 draw call。",
|
|
342
|
+
"figure.text.independent-parts-over": "已超过上限。一个画面上能同时放置的台数会减少。",
|
|
347
343
|
"figure.text.instances-unit": "instances",
|
|
348
344
|
"figure.text.interpolation-explained": "关键帧之间如何衔接。",
|
|
349
345
|
"figure.text.joint-channel-value-deg": "关键帧的值是关节角度(度)。",
|