@things-factory/figure-ui 10.1.105 → 10.1.107
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/modeller/canvas.ts +6 -13
- package/client/modeller/editor.ts +13 -2
- package/client/modeller/figure-cavity-drawing.ts +16 -10
- package/client/modeller/figure-links.ts +49 -35
- package/client/modeller/figure-parts.ts +3 -3
- package/client/modeller/figure-section-editor.ts +106 -11
- package/client/modeller/section-drawing.ts +27 -4
- package/dist-client/modeller/canvas.d.ts +0 -2
- package/dist-client/modeller/canvas.js +6 -17
- package/dist-client/modeller/canvas.js.map +1 -1
- package/dist-client/modeller/clips.d.ts +1 -1
- package/dist-client/modeller/editor.js +15 -2
- package/dist-client/modeller/editor.js.map +1 -1
- package/dist-client/modeller/figure-cavity-drawing.js +14 -8
- package/dist-client/modeller/figure-cavity-drawing.js.map +1 -1
- package/dist-client/modeller/figure-links.d.ts +2 -2
- package/dist-client/modeller/figure-links.js +49 -34
- package/dist-client/modeller/figure-links.js.map +1 -1
- package/dist-client/modeller/figure-parts.d.ts +2 -1
- package/dist-client/modeller/figure-parts.js +2 -2
- package/dist-client/modeller/figure-parts.js.map +1 -1
- package/dist-client/modeller/figure-section-editor.d.ts +14 -1
- package/dist-client/modeller/figure-section-editor.js +109 -9
- package/dist-client/modeller/figure-section-editor.js.map +1 -1
- package/dist-client/modeller/section-drawing.d.ts +12 -1
- package/dist-client/modeller/section-drawing.js +23 -3
- package/dist-client/modeller/section-drawing.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
- package/test/cavity-drawing.test.ts +5 -0
- package/test/command-preview.test.ts +11 -4
- package/test/first-minute.test.ts +6 -2
- package/test/layout.test.ts +11 -0
- package/test/section-editor.test.ts +29 -2
- package/translations/en.json +2 -9
- package/translations/ja.json +2 -9
- package/translations/ko.json +2 -9
- package/translations/ms.json +2 -9
- package/translations/zh.json +2 -9
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@things-factory/figure-ui",
|
|
3
|
-
"version": "10.1.
|
|
3
|
+
"version": "10.1.107",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public",
|
|
6
6
|
"@things-factory:registry": "https://registry.npmjs.org"
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
"clean": "npm run clean:server && npm run clean:client"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@hatiolab/figure-model": "^0.2.
|
|
31
|
-
"@hatiolab/things-scene": "^10.1.
|
|
30
|
+
"@hatiolab/figure-model": "^0.2.7",
|
|
31
|
+
"@hatiolab/things-scene": "^10.1.65",
|
|
32
32
|
"@material/web": "^2.0.0",
|
|
33
33
|
"@operato/data-grist": "^10.0.0",
|
|
34
34
|
"@operato/graphql": "^10.0.0",
|
|
@@ -40,9 +40,9 @@
|
|
|
40
40
|
"@operato/shell": "^10.0.0",
|
|
41
41
|
"@operato/styles": "^10.0.0",
|
|
42
42
|
"@operato/utils": "^10.0.0",
|
|
43
|
-
"@things-factory/ai-assistant": "^10.1.
|
|
44
|
-
"@things-factory/figure-service": "^10.1.
|
|
43
|
+
"@things-factory/ai-assistant": "^10.1.107",
|
|
44
|
+
"@things-factory/figure-service": "^10.1.107",
|
|
45
45
|
"three": "^0.185.1"
|
|
46
46
|
},
|
|
47
|
-
"gitHead": "
|
|
47
|
+
"gitHead": "65a3d5889e687d8122a65f029b926b1a4769d1c0"
|
|
48
48
|
}
|
|
@@ -71,3 +71,8 @@ test('단면 칸에 그림이 들어간다: 속 공간이 있을 때, 면마다
|
|
|
71
71
|
for (const key of ['figure.label.section-cavity-top', 'figure.label.section-cavity-side']) assert.ok(t[key], `${lang} ${key}`)
|
|
72
72
|
}
|
|
73
73
|
})
|
|
74
|
+
|
|
75
|
+
test('맞은편 벽의 숫자와 손잡이가 겹치지 않는다: 숫자는 단면 바깥, 좁은 속에서는 손잡이가 비킨다', () => {
|
|
76
|
+
has(drawing, /const tx = a === h \? ox \+ sign \* \(half\[a\] \+ 5\) : ox,\s*ty = a === v \? oy \+ sign \* \(half\[a\] \+ \(low \? 5 : 13\)\) : oy \+ 4/, 'past the outer edge on its own side')
|
|
77
|
+
has(drawing, /const aside = room < 16 \? sign \* 9 : 0/, 'two handles close together step apart')
|
|
78
|
+
})
|
|
@@ -86,13 +86,16 @@ test('the editor shows it only for the figure, version and part it was worked ou
|
|
|
86
86
|
assert.ok(links.includes('<button act ?disabled=${this.locked || !action} @click=${() => action && this.command(action)}>'), 'the button applies the command the preview showed')
|
|
87
87
|
})
|
|
88
88
|
|
|
89
|
-
test('the details fold, and what they hold that is not the default stays said', () => {
|
|
89
|
+
test('the details fold, and what they hold that is not the default stays said -- nothing for the default', () => {
|
|
90
90
|
const links = read('../client/modeller/figure-links.ts')
|
|
91
91
|
assert.ok(links.includes('<details fasten-detail>'))
|
|
92
|
-
assert.ok(links.includes("detail.length ? detail.join(' · ') :
|
|
92
|
+
assert.ok(links.includes("${detail.length ? html` · <span fasten-summary>${detail.join(' · ')}</span>` : nothing}"))
|
|
93
|
+
/* The way and the place on the face are the drawing's: not said again in the summary, nor chosen again in the details. */
|
|
94
|
+
assert.ok(!links.includes('fasten-summary-edge') && !links.includes('fasten-summary-off-centre') && !links.includes("'figure.label.facing-flush'"))
|
|
95
|
+
assert.ok(links.includes('({ axis }) => !view || !view.axes.includes(axis) || !!f.alignInput?.[axis] || hasInstanceSize(asset, axis)'), 'a row only where the drawing cannot set it')
|
|
93
96
|
for (const lang of ['en', 'ja', 'ko', 'ms', 'zh']) {
|
|
94
97
|
const t = JSON.parse(read(`../translations/${lang}.json`))
|
|
95
|
-
for (const key of ['preview-refused', 'preview-stays', 'preview-moves', 'preview-turns-named', 'preview-turns-slanted', 'preview-carries', 'preview-copies', 'preview-clips', 'preview-face-unknown', 'target-would-loop', 'fasten-summary-
|
|
98
|
+
for (const key of ['preview-refused', 'preview-stays', 'preview-moves', 'preview-turns-named', 'preview-turns-slanted', 'preview-carries', 'preview-copies', 'preview-clips', 'preview-face-unknown', 'target-would-loop', 'fasten-summary-gap', 'fasten-summary-twist'])
|
|
96
99
|
assert.ok(t[`figure.text.${key}`], `${lang} ${key}`)
|
|
97
100
|
assert.ok(t['figure.label.fasten-detail'] && t['figure.label.facing'], lang)
|
|
98
101
|
}
|
|
@@ -153,6 +156,9 @@ test('a row is seen before it is made, read as figure-model draws it -- and said
|
|
|
153
156
|
assert.deepEqual(rowWordsOf(three, say), ['roller 3개 · X 방향 · pitch 970 mm (중심 간격)', '가운데 정렬 · 양 끝에 0 mm씩 남음'])
|
|
154
157
|
const links = read('../client/modeller/figure-links.ts')
|
|
155
158
|
assert.ok(links.includes("<p hint row-blocked>${i18next.t(`figure.text.row-blocked-${blocked ?? 'unfastened'}`, { part: this.partId })}</p>"), 'not hidden: why')
|
|
159
|
+
/* Folded, its head the section's: opened, it says why; open by itself only while it is worked. */
|
|
160
|
+
assert.ok(links.includes("const head = html`<summary><h3>${i18next.t('figure.label.repeat')}</h3></summary>`"))
|
|
161
|
+
assert.ok(links.includes("<section row><details row-fold>") && links.includes("<details row-fold ?open=${this.working === 'row'}>"))
|
|
156
162
|
assert.ok(links.includes("this.candidate = this.working === 'row' && this.rowCandidate ? { action: this.rowCandidate } : this.fastenCandidate"), 'the form being worked on is the one seen')
|
|
157
163
|
const editor = read('../client/modeller/editor.ts')
|
|
158
164
|
assert.ok(editor.includes("const row = candidate.action.kind === 'make-repeat' ? figureRowOf(seen.asset, this.selected, this.currentInputs()) : undefined"))
|
|
@@ -231,7 +237,8 @@ test('past the edge of its face is said beside the fastening, with the way to ch
|
|
|
231
237
|
assert.ok(editor.includes("else if (own?.state === 'possible') words.push(say('figure.text.overhang-possible', where(own)))"))
|
|
232
238
|
assert.ok(editor.includes("else if (own?.state === 'unknown') words.push(say('figure.text.overhang-unknown', where(own)))"))
|
|
233
239
|
const links = read('../client/modeller/figure-links.ts')
|
|
234
|
-
assert.ok(links.includes("<button act @click=${() => this.
|
|
240
|
+
assert.ok(links.includes("<button act @click=${() => this.showWhere()}><md-icon>tune</md-icon>${i18next.t('figure.button.fix-alignment')}</button>"))
|
|
241
|
+
assert.ok(links.includes("shadowRoot?.querySelector<HTMLElement>('div[where]')"), 'to the face in the drawing, where the place is dragged or keyed')
|
|
235
242
|
assert.equal(say('figure.text.overhang-out', { on: 'top', face: '윗면', sides: say('figure.text.overhang-side-high', { axis: 'X', mm: '100' }) }), 'top의 윗면 가장자리 밖으로 나와 있습니다: X 높은 쪽 100 mm. 모델의 점유 공간과는 따로 봅니다.')
|
|
236
243
|
for (const lang of ['en', 'ja', 'ko', 'ms', 'zh']) {
|
|
237
244
|
const t = JSON.parse(read(`../translations/${lang}.json`))
|
|
@@ -98,8 +98,12 @@ test('the fastening form says whether it edits the current relation or fastens a
|
|
|
98
98
|
/* Anew is said; the one it has is said once, by the sentence over the drawing (user 2026-10-01: no third line). */
|
|
99
99
|
assert.ok(links.includes("${current ? nothing : html`<p fasten-mode>${editing}</p>`}"))
|
|
100
100
|
assert.ok(links.includes('<p fasten-sentence>'))
|
|
101
|
-
|
|
101
|
+
/* A fastening the part has is changed as soon as something is chosen (2026-10-02): 붙이기 only for a new one. */
|
|
102
|
+
assert.ok(links.includes("${held\n ? nothing\n : html`<button act ?disabled=${this.locked || !action} @click=${() => action && this.command(action)}>"))
|
|
103
|
+
assert.ok(links.includes('if (value) settle()'), 'another target taken at once')
|
|
104
|
+
assert.ok(links.includes("action && !held && this.working === 'fasten' ? this.renderPreviewWords() : nothing"), 'no words for a command no button sends')
|
|
105
|
+
assert.ok(links.includes('const settle = () => this.onFastenRelease(!!held)'))
|
|
102
106
|
const ko = JSON.parse(read('../translations/ko.json'))
|
|
103
107
|
assert.equal(ko['figure.text.fasten-new'], '새로 붙이기')
|
|
104
|
-
assert.equal(ko['figure.button.fasten-update'],
|
|
108
|
+
assert.equal(ko['figure.button.fasten-update'], undefined)
|
|
105
109
|
})
|
package/test/layout.test.ts
CHANGED
|
@@ -97,3 +97,14 @@ test('맞추기는 글자 단추로 — 옮기는 넷(가운데 X·Z, 면에 대
|
|
|
97
97
|
)
|
|
98
98
|
assert.ok(!ko['figure.text.center-on-x']!.includes('기준 상자'), 'says what the centre is')
|
|
99
99
|
})
|
|
100
|
+
|
|
101
|
+
test('불러오는 동안 빈 무대에 「도형을 추가해…」가 깜빡이지 않고, 좁은 화면 알림은 이 브라우저에서 한 번', () => {
|
|
102
|
+
const canvas = read('../client/modeller/canvas.ts')
|
|
103
|
+
/* A new figure's start card says how to begin; an empty stage otherwise is one loading, or with every part hidden. */
|
|
104
|
+
assert.ok(canvas.includes('return html`<div stage></div>`'))
|
|
105
|
+
assert.ok(!canvas.includes('add-a-shape-to-start') && !editor.includes('startShown'))
|
|
106
|
+
for (const lang of ['ko', 'en', 'ja', 'zh', 'ms'])
|
|
107
|
+
assert.equal((JSON.parse(read(`../translations/${lang}.json`)) as Record<string, string>)['figure.text.add-a-shape-to-start'], undefined, lang)
|
|
108
|
+
assert.ok(editor.includes("if (!foldSaid()) notify({ level: 'info', message: i18next.t('figure.text.parts-panel-folded-narrow') })"))
|
|
109
|
+
assert.ok(/function foldSaid\(\): boolean \{\s*try \{\s*if \(localStorage\.getItem\('figure-fold-said'\)\) return true\s*localStorage\.setItem\('figure-fold-said', '1'\)\s*\} catch/.test(editor), 'storage refused: said, as before')
|
|
110
|
+
})
|
|
@@ -111,7 +111,8 @@ test('치는 동안 입체는 그 점으로 그려지고, 잘못된 동안은
|
|
|
111
111
|
const body = drawn.find(p => p.id === 'wedge') as unknown as { shape: FigureEvaluatedShape }
|
|
112
112
|
assert.equal((body.shape.extrusion!.section as { points: unknown[] }).points.length, 4)
|
|
113
113
|
assert.equal(pointsOf(t).length, 3, 'the figure itself is not changed')
|
|
114
|
-
has(editorPanel, /detail: \{ action: this\.action\(
|
|
114
|
+
has(editorPanel, /private preview\(w = this\.lastValid\) \{\s*this\.dispatchEvent\(new CustomEvent\('command-live', \{ detail: \{ action: this\.action\(w\) \}/, 'the preview is always of a valid shape')
|
|
115
|
+
has(editorPanel, /this\.preview\(c && this\.valid\(\{ \.\.\.this\.working, cavity: c \}\) \? \{ \.\.\.this\.working, cavity: c \} : this\.lastValid\)/, 'the one other: the inside being dragged, when valid')
|
|
115
116
|
has(editorPanel, /figure\.text\.section-editor-last-valid/)
|
|
116
117
|
})
|
|
117
118
|
|
|
@@ -204,7 +205,7 @@ test('사각형·원도 같은 창에서 — 폭·지름·길이를 한 명령
|
|
|
204
205
|
const box = applyFigureAuthoring(addFigureBox(createFigureAsset('B'), { id: 'b', size: { x: 400, y: 200, z: 300 }, position: { x: 0, y: 100, z: 0 } }), { kind: 'set-placement', placement: 'floor' })
|
|
205
206
|
const shape = (compileFigureAsset(box).evaluate().geometry.find(g => (g as { id: string }).id === 'b') as unknown as { shape: FigureEvaluatedShape }).shape
|
|
206
207
|
const w = workingOf(shape)
|
|
207
|
-
assert.deepEqual(w, { points: [], across: { x: 400, z: 300 }, length: 200, apex: null })
|
|
208
|
+
assert.deepEqual(w, { points: [], across: { x: 400, z: 300 }, length: 200, apex: null, cavity: null })
|
|
208
209
|
assert.deepEqual(sectionOf(shape, { ...w, across: { x: 500, z: 300 } }), { kind: 'rectangle', size: { x: 500, z: 300 } })
|
|
209
210
|
assert.deepEqual(figureSectionMeasuresOf(box, 'b')!.measures, { y: 'editable', x: 'editable', z: 'editable' })
|
|
210
211
|
/* The editor sends only what changed: a measure left alone may follow another value and must not be written. */
|
|
@@ -231,6 +232,32 @@ test('속 공간이 있으면 폭·길이가 그 벽과 막힌 끝을 남기는
|
|
|
231
232
|
assert.deepEqual(workingIssuesOf(shape, { ...workingOf(shape), across: { x: 90, z: 300 } }).words, [])
|
|
232
233
|
})
|
|
233
234
|
|
|
235
|
+
test('창 안에서 폭과 속 공간을 함께 — 넓힌 폭에서만 들어가는 벽이 한 명령으로 들어가고, 그림은 고치는 중인 폭으로 판정한다', async () => {
|
|
236
|
+
const { addFigureBox } = await import('@hatiolab/figure-model')
|
|
237
|
+
const { workingOf, workingIssuesOf, workingShapeOf } = await import('../client/modeller/section-drawing.ts')
|
|
238
|
+
const { cavityRefusalOf } = await import('../client/modeller/section-controls.ts')
|
|
239
|
+
const tray = applyFigureAuthoring(addFigureBox(createFigureAsset('T'), { id: 't', size: { x: 400, y: 200, z: 300 }, position: { x: 0, y: 100, z: 0 } }), { kind: 'set-cavity', part: 't', cavity: { wall: 40, start: { closed: 30 }, end: 'open' } })
|
|
240
|
+
const shape = (compileFigureAsset(tray).evaluate().geometry.find(g => (g as { id: string }).id === 't') as unknown as { shape: FigureEvaluatedShape }).shape
|
|
241
|
+
const w = workingOf(shape)
|
|
242
|
+
assert.deepEqual(w.cavity, { wall: { 'x-': 40, 'x+': 40, 'z-': 40, 'z+': 40 }, start: { closed: 30 }, end: 'open' })
|
|
243
|
+
/* 160 mm walls leave no room in 300 deep; widened to 600 × 400 they do. */
|
|
244
|
+
const thick = { ...w.cavity!, wall: { 'x-': 160, 'x+': 160, 'z-': 160, 'z+': 160 } }
|
|
245
|
+
assert.equal(cavityRefusalOf(shape, thick)?.code, 'wall-too-thick', 'judged on the opened widths: refused')
|
|
246
|
+
const wide = { ...w, across: { x: 600, z: 400 }, cavity: thick }
|
|
247
|
+
assert.equal(cavityRefusalOf(workingShapeOf(shape, wide), thick), null, 'judged on the widths being typed: taken')
|
|
248
|
+
assert.deepEqual(workingIssuesOf(shape, wide).words, [])
|
|
249
|
+
assert.equal(workingIssuesOf(shape, { ...wide, across: { x: 400, z: 300 } }).words[0]!.key, 'figure.text.section-issue-cavity-walls')
|
|
250
|
+
assert.deepEqual(workingIssuesOf(shape, { ...w, across: { x: 70, z: 300 }, cavity: null }).words, [], 'no inside, no walls to fit')
|
|
251
|
+
const next = applyFigureAuthoring(tray, { kind: 'set-section', part: 't', across: { x: 600, z: 400 }, cavity: thick })
|
|
252
|
+
const t = (compileFigureAsset(next).evaluate().geometry.find(g => (g as { id: string }).id === 't') as unknown as { shape: FigureEvaluatedShape }).shape
|
|
253
|
+
assert.deepEqual(t.cavity!.wall, thick.wall)
|
|
254
|
+
/* The drawing in the editor is the panel's, its commands kept in the editor as working state, sent with the widths. */
|
|
255
|
+
has(editorPanel, /<figure-cavity-drawing\s+\.body=\$\{\{ id: this\.body!\.id, shape \}\}/)
|
|
256
|
+
has(editorPanel, /@command=\$\{\(ev: CustomEvent\) => \{\s*ev\.stopPropagation\(\)\s*const c = this\.cavityOf\(ev\.detail\.action\)\s*if \(c\) this\.change\(\{ \.\.\.this\.working, cavity: c \}\)/)
|
|
257
|
+
has(editorPanel, /\.\.\.\(cavityMoved \? \{ cavity: w\.cavity \? \{ wall: \{ \.\.\.w\.cavity\.wall \}, start: w\.cavity\.start, end: w\.cavity\.end \} : null \} : \{\}\)/, 'only when changed')
|
|
258
|
+
has(editorPanel, /private get hollowable\(\) \{\s*return !!this\.body\?\.shape\.extrusion && \(this\.kind === 'rectangle' \|\| this\.kind === 'ellipse'\)/, 'no inside for a drawn section')
|
|
259
|
+
})
|
|
260
|
+
|
|
234
261
|
test('길이를 바꿀 때 남는 면은 부품의 관계가 정한 것을 읽어 보여 준다 (§4.1) — 다른 값을 따르는 치수는 칸을 막는다', () => {
|
|
235
262
|
has(editor, /const kept = figureScaleAnchorOf\(asset, this\.selected\)\?\.\[drawn\.axis\]/)
|
|
236
263
|
has(editorPanel, /m\?\.\[this\.axis\] === 'linked' \? linked : this\.keptWords\(\)/)
|
package/translations/en.json
CHANGED
|
@@ -116,6 +116,7 @@
|
|
|
116
116
|
"figure.label.clips": "animation (plays over time)",
|
|
117
117
|
"figure.label.coordinate-ground": "coordinate ground",
|
|
118
118
|
"figure.label.detail-L": "detailed",
|
|
119
|
+
"figure.label.detail-XL": "fine",
|
|
119
120
|
"figure.label.detail-M": "normal",
|
|
120
121
|
"figure.label.detail-S": "simple",
|
|
121
122
|
"figure.label.detail-level": "detail level",
|
|
@@ -398,7 +399,7 @@
|
|
|
398
399
|
"figure.text.coordinate-ground-explained": "draws the origin and a grid on the floor",
|
|
399
400
|
"figure.text.delete-figure-confirm": "delete {name}? drawings already using this type will no longer find it.",
|
|
400
401
|
"figure.text.designate-in-properties": "nothing designated yet. select a part and set its role in the properties tab.",
|
|
401
|
-
"figure.text.detail-level-explained": "S for signs and posts, M for most equipment, L for the large equipment a view centres on. the level sets the part limit.",
|
|
402
|
+
"figure.text.detail-level-explained": "S for signs and posts, M for most equipment, L for the large equipment a view centres on, XL for a mechanism of many joints such as a legged robot. the level sets the part limit.",
|
|
402
403
|
"figure.text.discard-changes-and-start-new": "there are unsaved changes. discard them and start a new figure?",
|
|
403
404
|
"figure.text.leave-without-saving": "there are unsaved changes. discard them and leave?",
|
|
404
405
|
"figure.button.leave-without-saving": "discard and leave",
|
|
@@ -534,7 +535,6 @@
|
|
|
534
535
|
"figure.label.target-face": "target face",
|
|
535
536
|
"figure.label.stands-on-plane": "stand on the mounting plane",
|
|
536
537
|
"figure.label.facing-meet": "faces meet",
|
|
537
|
-
"figure.label.facing-flush": "same plane",
|
|
538
538
|
"figure.text.overhang-out": "It comes past the edge of {on}'s {face}: {sides}. This is apart from the figure's room.",
|
|
539
539
|
"figure.text.overhang-larger": "Wider than {on}'s {face}, it comes past its edges: {sides}.",
|
|
540
540
|
"figure.text.overhang-lopsided": "It sits off to one side along {axes}.",
|
|
@@ -560,11 +560,6 @@
|
|
|
560
560
|
"figure.text.target-would-loop": "{part} — attached to {mine}, cannot be chosen",
|
|
561
561
|
"figure.label.fasten-detail": "Details",
|
|
562
562
|
"figure.label.facing": "How faces meet",
|
|
563
|
-
"figure.text.fasten-summary-default": "Defaults (meeting · centred · gap 0 · twist 0)",
|
|
564
|
-
"figure.text.fasten-summary-edge-min": "{axis} lower edge",
|
|
565
|
-
"figure.text.fasten-summary-edge-max": "{axis} upper edge",
|
|
566
|
-
"figure.text.fasten-summary-off-centre": "{axis} {mm} mm off centre",
|
|
567
|
-
"figure.text.fasten-summary-follows": "{axis} follows a value",
|
|
568
563
|
"figure.text.fasten-summary-gap": "gap {mm} mm",
|
|
569
564
|
"figure.text.fasten-summary-twist": "twist {degrees}°",
|
|
570
565
|
"figure.label.gap": "gap (mm)",
|
|
@@ -660,7 +655,6 @@
|
|
|
660
655
|
"figure.label.clip": "Clip",
|
|
661
656
|
"figure.label.new-clip": "New clip",
|
|
662
657
|
"figure.button.add-track": "Add",
|
|
663
|
-
"figure.text.add-a-shape-to-start": "Add a shape to start modelling.",
|
|
664
658
|
"figure.label.primitive-frustum": "Cone",
|
|
665
659
|
"figure.label.primitive-plate": "Plate",
|
|
666
660
|
"figure.label.field-width": "Width",
|
|
@@ -881,7 +875,6 @@
|
|
|
881
875
|
"figure.label.target-part-placeholder": "Choose a part",
|
|
882
876
|
"figure.text.fasten-target-first": "Choose the part to attach to first.",
|
|
883
877
|
"figure.text.fasten-edit-on-plane": "This part is connected to the model's placement reference. Detach it before attaching it to another part.",
|
|
884
|
-
"figure.button.fasten-update": "Update this attachment",
|
|
885
878
|
"figure.button.align-to-floor": "set on the floor",
|
|
886
879
|
"figure.button.align-to-ceiling": "up to the ceiling",
|
|
887
880
|
"figure.button.align-to-wall": "back to the wall",
|
package/translations/ja.json
CHANGED
|
@@ -116,6 +116,7 @@
|
|
|
116
116
|
"figure.label.clips": "アニメーション (時間に沿って再生)",
|
|
117
117
|
"figure.label.coordinate-ground": "coordinate ground",
|
|
118
118
|
"figure.label.detail-L": "detailed",
|
|
119
|
+
"figure.label.detail-XL": "fine",
|
|
119
120
|
"figure.label.detail-M": "normal",
|
|
120
121
|
"figure.label.detail-S": "simple",
|
|
121
122
|
"figure.label.detail-level": "detail level",
|
|
@@ -398,7 +399,7 @@
|
|
|
398
399
|
"figure.text.coordinate-ground-explained": "原点と目盛りを床に表示します",
|
|
399
400
|
"figure.text.delete-figure-confirm": "delete {name}? drawings already using this type will no longer find it.",
|
|
400
401
|
"figure.text.designate-in-properties": "まだ指定された部品がありません。部品を選び、プロパティタブで「能力での役割」を指定してください。",
|
|
401
|
-
"figure.text.detail-level-explained": "S は標識・柱、M はほとんどの設備、L
|
|
402
|
+
"figure.text.detail-level-explained": "S は標識・柱、M はほとんどの設備、L は画面の中心となる大きな設備、XL は脚のあるロボットのように関節の多い装置に使います。等級で部品数の上限が決まります。",
|
|
402
403
|
"figure.text.discard-changes-and-start-new": "保存していない変更があります。破棄して新しく始めますか?",
|
|
403
404
|
"figure.text.leave-without-saving": "保存していない変更があります。破棄して移動しますか?",
|
|
404
405
|
"figure.button.leave-without-saving": "破棄して移動",
|
|
@@ -534,7 +535,6 @@
|
|
|
534
535
|
"figure.label.target-face": "target face",
|
|
535
536
|
"figure.label.stands-on-plane": "stand on the mounting plane",
|
|
536
537
|
"figure.label.facing-meet": "faces meet",
|
|
537
|
-
"figure.label.facing-flush": "same plane",
|
|
538
538
|
"figure.text.overhang-out": "{on} の {face} の縁から出ています: {sides}。モデルの占有空間とは別に扱います。",
|
|
539
539
|
"figure.text.overhang-larger": "{on} の {face} より広いため縁から出ています: {sides}。",
|
|
540
540
|
"figure.text.overhang-lopsided": "{axes} 方向で片側に寄っています。",
|
|
@@ -560,11 +560,6 @@
|
|
|
560
560
|
"figure.text.target-would-loop": "{part} — {mine} に取り付いているため選べません",
|
|
561
561
|
"figure.label.fasten-detail": "詳細",
|
|
562
562
|
"figure.label.facing": "接し方",
|
|
563
|
-
"figure.text.fasten-summary-default": "既定値(接する · 中央 · 間隔 0 · ひねり 0)",
|
|
564
|
-
"figure.text.fasten-summary-edge-min": "{axis} 低い側の縁",
|
|
565
|
-
"figure.text.fasten-summary-edge-max": "{axis} 高い側の縁",
|
|
566
|
-
"figure.text.fasten-summary-off-centre": "{axis} 中央から {mm} mm",
|
|
567
|
-
"figure.text.fasten-summary-follows": "{axis} 値に従う",
|
|
568
563
|
"figure.text.fasten-summary-gap": "間隔 {mm} mm",
|
|
569
564
|
"figure.text.fasten-summary-twist": "ひねり {degrees}°",
|
|
570
565
|
"figure.label.gap": "gap (mm)",
|
|
@@ -660,7 +655,6 @@
|
|
|
660
655
|
"figure.label.clip": "クリップ",
|
|
661
656
|
"figure.label.new-clip": "新しいクリップ",
|
|
662
657
|
"figure.button.add-track": "追加",
|
|
663
|
-
"figure.text.add-a-shape-to-start": "図形を追加してモデリングを始めましょう。",
|
|
664
658
|
"figure.label.primitive-frustum": "円錐",
|
|
665
659
|
"figure.label.primitive-plate": "板",
|
|
666
660
|
"figure.label.field-width": "幅",
|
|
@@ -881,7 +875,6 @@
|
|
|
881
875
|
"figure.label.target-part-placeholder": "取り付ける部品を選択",
|
|
882
876
|
"figure.text.fasten-target-first": "先に取り付ける部品を選んでください。",
|
|
883
877
|
"figure.text.fasten-edit-on-plane": "この部品はモデルの設置基準に接続されています。別の部品に取り付ける前に外してください。",
|
|
884
|
-
"figure.button.fasten-update": "この取り付けを更新",
|
|
885
878
|
"figure.button.align-to-floor": "床に合わせる",
|
|
886
879
|
"figure.button.align-to-ceiling": "天井に合わせる",
|
|
887
880
|
"figure.button.align-to-wall": "壁に合わせる",
|
package/translations/ko.json
CHANGED
|
@@ -116,6 +116,7 @@
|
|
|
116
116
|
"figure.label.clips": "애니메이션 (시간에 따라 재생)",
|
|
117
117
|
"figure.label.coordinate-ground": "좌표 바탕",
|
|
118
118
|
"figure.label.detail-L": "상세",
|
|
119
|
+
"figure.label.detail-XL": "정밀",
|
|
119
120
|
"figure.label.detail-M": "보통",
|
|
120
121
|
"figure.label.detail-S": "단순",
|
|
121
122
|
"figure.label.detail-level": "디테일 등급",
|
|
@@ -398,7 +399,7 @@
|
|
|
398
399
|
"figure.text.coordinate-ground-explained": "원점과 눈금을 바닥에 표시합니다",
|
|
399
400
|
"figure.text.delete-figure-confirm": "{name} 을 삭제하시겠습니까? 이 타입을 쓰고 있는 도면은 더 이상 찾지 못합니다.",
|
|
400
401
|
"figure.text.designate-in-properties": "아직 지정된 부품이 없습니다. 부품을 선택하고 속성 탭에서 「능력에서의 역할」을 지정하세요.",
|
|
401
|
-
"figure.text.detail-level-explained": "S 는 표지·기둥, M 은 대부분의 설비, L 은 화면의 중심이 되는 큰
|
|
402
|
+
"figure.text.detail-level-explained": "S 는 표지·기둥, M 은 대부분의 설비, L 은 화면의 중심이 되는 큰 설비, XL 은 다리 달린 로봇처럼 관절이 많은 장치에 씁니다. 등급에 따라 부품 수 한도가 정해집니다.",
|
|
402
403
|
"figure.text.discard-changes-and-start-new": "저장하지 않은 변경이 있습니다. 버리고 새로 시작할까요?",
|
|
403
404
|
"figure.text.leave-without-saving": "저장하지 않은 변경이 있습니다. 버리고 나갈까요?",
|
|
404
405
|
"figure.button.leave-without-saving": "버리고 나가기",
|
|
@@ -534,7 +535,6 @@
|
|
|
534
535
|
"figure.label.target-face": "상대 면",
|
|
535
536
|
"figure.label.stands-on-plane": "장착 평면에 세우기",
|
|
536
537
|
"figure.label.facing-meet": "맞닿게",
|
|
537
|
-
"figure.label.facing-flush": "같은 평면에",
|
|
538
538
|
"figure.text.overhang-out": "{on}의 {face} 가장자리 밖으로 나와 있습니다: {sides}. 모델의 점유 공간과는 따로 봅니다.",
|
|
539
539
|
"figure.text.overhang-larger": "{on}의 {face}보다 넓어 가장자리 밖으로 나와 있습니다: {sides}.",
|
|
540
540
|
"figure.text.overhang-lopsided": "{axes} 방향으로 한쪽에 치우쳐 있습니다.",
|
|
@@ -560,11 +560,6 @@
|
|
|
560
560
|
"figure.text.target-would-loop": "{part} — {mine}에 붙어 있어 고를 수 없음",
|
|
561
561
|
"figure.label.fasten-detail": "세부",
|
|
562
562
|
"figure.label.facing": "닿는 방식",
|
|
563
|
-
"figure.text.fasten-summary-default": "기본값 (맞닿게 · 가운데 · 간격 0 · 비틀기 0)",
|
|
564
|
-
"figure.text.fasten-summary-edge-min": "{axis} 낮은 쪽 모서리",
|
|
565
|
-
"figure.text.fasten-summary-edge-max": "{axis} 높은 쪽 모서리",
|
|
566
|
-
"figure.text.fasten-summary-off-centre": "{axis} 가운데서 {mm} mm",
|
|
567
|
-
"figure.text.fasten-summary-follows": "{axis} 값을 따름",
|
|
568
563
|
"figure.text.fasten-summary-gap": "간격 {mm} mm",
|
|
569
564
|
"figure.text.fasten-summary-twist": "비틀기 {degrees}°",
|
|
570
565
|
"figure.label.gap": "간격 (mm)",
|
|
@@ -660,7 +655,6 @@
|
|
|
660
655
|
"figure.label.clip": "클립",
|
|
661
656
|
"figure.label.new-clip": "새 클립",
|
|
662
657
|
"figure.button.add-track": "재생 추가",
|
|
663
|
-
"figure.text.add-a-shape-to-start": "도형을 추가해 모델링을 시작하세요.",
|
|
664
658
|
"figure.label.primitive-frustum": "원뿔",
|
|
665
659
|
"figure.label.primitive-plate": "판",
|
|
666
660
|
"figure.label.field-width": "너비",
|
|
@@ -881,7 +875,6 @@
|
|
|
881
875
|
"figure.label.target-part-placeholder": "붙일 부품 선택",
|
|
882
876
|
"figure.text.fasten-target-first": "먼저 붙일 부품을 고르세요.",
|
|
883
877
|
"figure.text.fasten-edit-on-plane": "이 부품은 현재 모델의 설치 기준면에 연결되어 있습니다. 다른 부품에 붙이려면 먼저 붙임을 푸세요.",
|
|
884
|
-
"figure.button.fasten-update": "이 붙임 수정",
|
|
885
878
|
"figure.button.align-to-floor": "바닥에 내려놓기",
|
|
886
879
|
"figure.button.align-to-ceiling": "천장에 대기",
|
|
887
880
|
"figure.button.align-to-wall": "벽에 대기",
|
package/translations/ms.json
CHANGED
|
@@ -116,6 +116,7 @@
|
|
|
116
116
|
"figure.label.clips": "animasi (dimainkan mengikut masa)",
|
|
117
117
|
"figure.label.coordinate-ground": "coordinate ground",
|
|
118
118
|
"figure.label.detail-L": "detailed",
|
|
119
|
+
"figure.label.detail-XL": "fine",
|
|
119
120
|
"figure.label.detail-M": "normal",
|
|
120
121
|
"figure.label.detail-S": "simple",
|
|
121
122
|
"figure.label.detail-level": "detail level",
|
|
@@ -398,7 +399,7 @@
|
|
|
398
399
|
"figure.text.coordinate-ground-explained": "melukis asalan dan grid pada lantai",
|
|
399
400
|
"figure.text.delete-figure-confirm": "delete {name}? drawings already using this type will no longer find it.",
|
|
400
401
|
"figure.text.designate-in-properties": "belum ada yang ditetapkan. pilih bahagian dan tetapkan peranannya dalam tab sifat.",
|
|
401
|
-
"figure.text.detail-level-explained": "S untuk papan tanda dan tiang, M untuk kebanyakan peralatan, L untuk peralatan besar yang menjadi tumpuan. tahap menentukan had bahagian.",
|
|
402
|
+
"figure.text.detail-level-explained": "S untuk papan tanda dan tiang, M untuk kebanyakan peralatan, L untuk peralatan besar yang menjadi tumpuan, XL untuk mekanisme banyak sendi seperti robot berkaki. tahap menentukan had bahagian.",
|
|
402
403
|
"figure.text.discard-changes-and-start-new": "ada perubahan belum disimpan. buang dan mulakan yang baharu?",
|
|
403
404
|
"figure.text.leave-without-saving": "ada perubahan yang belum disimpan. buang dan keluar?",
|
|
404
405
|
"figure.button.leave-without-saving": "buang dan keluar",
|
|
@@ -534,7 +535,6 @@
|
|
|
534
535
|
"figure.label.target-face": "target face",
|
|
535
536
|
"figure.label.stands-on-plane": "stand on the mounting plane",
|
|
536
537
|
"figure.label.facing-meet": "faces meet",
|
|
537
|
-
"figure.label.facing-flush": "same plane",
|
|
538
538
|
"figure.text.overhang-out": "Ia terkeluar melepasi tepi {face} {on}: {sides}. Ini berasingan daripada ruang rajah.",
|
|
539
539
|
"figure.text.overhang-larger": "Lebih lebar daripada {face} {on}, ia melepasi tepinya: {sides}.",
|
|
540
540
|
"figure.text.overhang-lopsided": "Ia terletak ke satu sisi sepanjang {axes}.",
|
|
@@ -560,11 +560,6 @@
|
|
|
560
560
|
"figure.text.target-would-loop": "{part} — dilekatkan pada {mine}, tidak boleh dipilih",
|
|
561
561
|
"figure.label.fasten-detail": "Butiran",
|
|
562
562
|
"figure.label.facing": "Cara muka bertemu",
|
|
563
|
-
"figure.text.fasten-summary-default": "Lalai (bertemu · tengah · jarak 0 · pulasan 0)",
|
|
564
|
-
"figure.text.fasten-summary-edge-min": "{axis} tepi bawah",
|
|
565
|
-
"figure.text.fasten-summary-edge-max": "{axis} tepi atas",
|
|
566
|
-
"figure.text.fasten-summary-off-centre": "{axis} {mm} mm dari tengah",
|
|
567
|
-
"figure.text.fasten-summary-follows": "{axis} mengikut nilai",
|
|
568
563
|
"figure.text.fasten-summary-gap": "jarak {mm} mm",
|
|
569
564
|
"figure.text.fasten-summary-twist": "pulasan {degrees}°",
|
|
570
565
|
"figure.label.gap": "gap (mm)",
|
|
@@ -660,7 +655,6 @@
|
|
|
660
655
|
"figure.label.clip": "Klip",
|
|
661
656
|
"figure.label.new-clip": "Klip baharu",
|
|
662
657
|
"figure.button.add-track": "Tambah",
|
|
663
|
-
"figure.text.add-a-shape-to-start": "Tambah bentuk untuk mula memodel.",
|
|
664
658
|
"figure.label.primitive-frustum": "Kon",
|
|
665
659
|
"figure.label.primitive-plate": "Plat",
|
|
666
660
|
"figure.label.field-width": "Lebar",
|
|
@@ -881,7 +875,6 @@
|
|
|
881
875
|
"figure.label.target-part-placeholder": "Pilih bahagian",
|
|
882
876
|
"figure.text.fasten-target-first": "Pilih bahagian yang hendak dilekatkan dahulu.",
|
|
883
877
|
"figure.text.fasten-edit-on-plane": "Bahagian ini disambungkan kepada rujukan peletakan model. Tanggalkan dahulu sebelum melekatkannya pada bahagian lain.",
|
|
884
|
-
"figure.button.fasten-update": "Kemas kini lekatan ini",
|
|
885
878
|
"figure.button.align-to-floor": "Jajarkan ke lantai",
|
|
886
879
|
"figure.button.align-to-ceiling": "Jajarkan ke siling",
|
|
887
880
|
"figure.button.align-to-wall": "Jajarkan ke dinding",
|
package/translations/zh.json
CHANGED
|
@@ -116,6 +116,7 @@
|
|
|
116
116
|
"figure.label.clips": "动画 (随时间播放)",
|
|
117
117
|
"figure.label.coordinate-ground": "coordinate ground",
|
|
118
118
|
"figure.label.detail-L": "detailed",
|
|
119
|
+
"figure.label.detail-XL": "fine",
|
|
119
120
|
"figure.label.detail-M": "normal",
|
|
120
121
|
"figure.label.detail-S": "simple",
|
|
121
122
|
"figure.label.detail-level": "detail level",
|
|
@@ -398,7 +399,7 @@
|
|
|
398
399
|
"figure.text.coordinate-ground-explained": "在地面显示原点和网格",
|
|
399
400
|
"figure.text.delete-figure-confirm": "delete {name}? drawings already using this type will no longer find it.",
|
|
400
401
|
"figure.text.designate-in-properties": "还没有指定部件。请选择部件,在属性标签页中设置「在能力中的角色」。",
|
|
401
|
-
"figure.text.detail-level-explained": "S 用于标志和立柱,M 用于大多数设备,L
|
|
402
|
+
"figure.text.detail-level-explained": "S 用于标志和立柱,M 用于大多数设备,L 用于作为画面中心的大型设备,XL 用于腿式机器人等关节众多的装置。等级决定部件数量上限。",
|
|
402
403
|
"figure.text.discard-changes-and-start-new": "有未保存的更改。放弃并新建吗?",
|
|
403
404
|
"figure.text.leave-without-saving": "有未保存的更改。放弃并离开吗?",
|
|
404
405
|
"figure.button.leave-without-saving": "放弃并离开",
|
|
@@ -534,7 +535,6 @@
|
|
|
534
535
|
"figure.label.target-face": "target face",
|
|
535
536
|
"figure.label.stands-on-plane": "stand on the mounting plane",
|
|
536
537
|
"figure.label.facing-meet": "faces meet",
|
|
537
|
-
"figure.label.facing-flush": "same plane",
|
|
538
538
|
"figure.text.overhang-out": "超出了 {on} 的 {face} 边缘:{sides}。这与模型的占用空间分开看待。",
|
|
539
539
|
"figure.text.overhang-larger": "比 {on} 的 {face} 宽,超出边缘:{sides}。",
|
|
540
540
|
"figure.text.overhang-lopsided": "沿 {axes} 偏向一侧。",
|
|
@@ -560,11 +560,6 @@
|
|
|
560
560
|
"figure.text.target-would-loop": "{part} — 已附着于 {mine},无法选择",
|
|
561
561
|
"figure.label.fasten-detail": "详细",
|
|
562
562
|
"figure.label.facing": "接触方式",
|
|
563
|
-
"figure.text.fasten-summary-default": "默认值(贴合 · 居中 · 间距 0 · 扭转 0)",
|
|
564
|
-
"figure.text.fasten-summary-edge-min": "{axis} 低侧边缘",
|
|
565
|
-
"figure.text.fasten-summary-edge-max": "{axis} 高侧边缘",
|
|
566
|
-
"figure.text.fasten-summary-off-centre": "{axis} 距中心 {mm} mm",
|
|
567
|
-
"figure.text.fasten-summary-follows": "{axis} 跟随数值",
|
|
568
563
|
"figure.text.fasten-summary-gap": "间距 {mm} mm",
|
|
569
564
|
"figure.text.fasten-summary-twist": "扭转 {degrees}°",
|
|
570
565
|
"figure.label.gap": "gap (mm)",
|
|
@@ -660,7 +655,6 @@
|
|
|
660
655
|
"figure.label.clip": "片段",
|
|
661
656
|
"figure.label.new-clip": "新片段",
|
|
662
657
|
"figure.button.add-track": "添加",
|
|
663
|
-
"figure.text.add-a-shape-to-start": "添加一个形状开始建模。",
|
|
664
658
|
"figure.label.primitive-frustum": "圆锥",
|
|
665
659
|
"figure.label.primitive-plate": "板",
|
|
666
660
|
"figure.label.field-width": "宽度",
|
|
@@ -881,7 +875,6 @@
|
|
|
881
875
|
"figure.label.target-part-placeholder": "选择部件",
|
|
882
876
|
"figure.text.fasten-target-first": "请先选择要附着的部件。",
|
|
883
877
|
"figure.text.fasten-edit-on-plane": "此部件当前连接到模型的安装基准。附着到另一部件前请先解除连接。",
|
|
884
|
-
"figure.button.fasten-update": "更新此附着",
|
|
885
878
|
"figure.button.align-to-floor": "对齐地面",
|
|
886
879
|
"figure.button.align-to-ceiling": "对齐天花板",
|
|
887
880
|
"figure.button.align-to-wall": "对齐墙面",
|