@things-factory/figure-ui 10.1.183 → 10.1.185
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/figure-facts.ts +4 -35
- package/client/modeller/figure-fasten-dialog.ts +16 -1
- package/client/modeller/figure-properties.ts +23 -70
- package/dist-client/modeller/clips.d.ts +2 -2
- package/dist-client/modeller/figure-facts.d.ts +2 -13
- package/dist-client/modeller/figure-facts.js +2 -29
- package/dist-client/modeller/figure-facts.js.map +1 -1
- package/dist-client/modeller/figure-fasten-dialog.d.ts +6 -1
- package/dist-client/modeller/figure-fasten-dialog.js +16 -1
- package/dist-client/modeller/figure-fasten-dialog.js.map +1 -1
- package/dist-client/modeller/figure-fasten-drawing.d.ts +1 -1
- package/dist-client/modeller/figure-links.d.ts +1 -1
- package/dist-client/modeller/figure-properties.d.ts +12 -12
- package/dist-client/modeller/figure-properties.js +23 -72
- package/dist-client/modeller/figure-properties.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -5
- package/test/browser/links.check.mjs +12 -0
- package/test/browser/modeller-page.js +1 -1
- package/test/browser/product-page.check.mjs +56 -6
- package/test/browser/product-page.js +11 -1
- package/test/browser/property-section.check.mjs +3 -3
- package/test/browser/screen-page.js +7 -2
- package/test/properties.test.ts +11 -19
- package/translations/en.json +1 -9
- package/translations/es.json +1 -9
- package/translations/ja.json +1 -9
- package/translations/ko.json +1 -9
- package/translations/ms.json +1 -9
- package/translations/zh.json +1 -9
- package/client/modeller/mounting-part.ts +0 -15
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.185",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public",
|
|
6
6
|
"@things-factory:registry": "https://registry.npmjs.org"
|
|
@@ -28,12 +28,12 @@
|
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"@hatiolab/figure-model": "^0.7.2",
|
|
31
|
-
"@hatiolab/things-scene": "^10.1.
|
|
31
|
+
"@hatiolab/things-scene": "^10.1.92",
|
|
32
32
|
"@material/web": "^2.0.0",
|
|
33
33
|
"@operato/data-grist": "^10.29.39",
|
|
34
34
|
"@operato/graphql": "^10.29.39",
|
|
35
35
|
"@operato/i18n": "^10.0.0",
|
|
36
|
-
"@operato/input": "^10.29.
|
|
36
|
+
"@operato/input": "^10.29.41",
|
|
37
37
|
"@operato/layout": "^10.29.39",
|
|
38
38
|
"@operato/markdown": "^10.23.0",
|
|
39
39
|
"@operato/p13n": "^10.29.39",
|
|
@@ -44,9 +44,9 @@
|
|
|
44
44
|
"@operato/utils": "^10.29.39",
|
|
45
45
|
"@things-factory/ai-assistant": "^10.1.183",
|
|
46
46
|
"@things-factory/figure-service": "^10.1.183",
|
|
47
|
-
"@things-factory/figure-viewer": "^10.1.
|
|
47
|
+
"@things-factory/figure-viewer": "^10.1.185",
|
|
48
48
|
"@things-factory/setting-base": "^10.1.183",
|
|
49
49
|
"three": "^0.185.1"
|
|
50
50
|
},
|
|
51
|
-
"gitHead": "
|
|
51
|
+
"gitHead": "3cfe5c959e7e82d772f46fd280037900fa89fcaa"
|
|
52
52
|
}
|
|
@@ -367,6 +367,18 @@ describe('the fastening window on the robot arm', () => {
|
|
|
367
367
|
const forearm = list.find(t => t.target === 'forearm')
|
|
368
368
|
assert.deepEqual(forearm, { target: 'forearm', text: 'figure.text.target-would-loop', selected: false, disabled: true })
|
|
369
369
|
})
|
|
370
|
+
|
|
371
|
+
test('the parts hanging from it are said in one line, and the chips show the part names as they are written', async () => {
|
|
372
|
+
const said = await read(() => {
|
|
373
|
+
const root = document.querySelector('figure-fasten-dialog').shadowRoot
|
|
374
|
+
const chip = root.querySelector('ox-input-select-buttons').shadowRoot.querySelector('md-filter-chip')
|
|
375
|
+
const label = chip.shadowRoot.querySelector('.label-text') ?? chip.shadowRoot.querySelector('.label')
|
|
376
|
+
return { lines: root.querySelectorAll('p[loops]').length, transform: getComputedStyle(label).textTransform }
|
|
377
|
+
})
|
|
378
|
+
const hanging = (await targets()).filter(t => t.disabled).map(t => t.target)
|
|
379
|
+
assert.ok(hanging.length > 1, `several parts hang from the upper arm: ${hanging}`)
|
|
380
|
+
assert.deepEqual(said, { lines: 1, transform: 'none' })
|
|
381
|
+
})
|
|
370
382
|
})
|
|
371
383
|
|
|
372
384
|
describe('a new fastening for a door leaf: chosen in the window, seen before it is done', () => {
|
|
@@ -210,7 +210,7 @@ window.probe = {
|
|
|
210
210
|
return [
|
|
211
211
|
...chips.map(c => ({ target: c.getAttribute('data-value'), text: c.getAttribute('label') ?? '', selected: !!c.selected, disabled: false })),
|
|
212
212
|
/* A part hanging from this one: not a chip, said why under them. */
|
|
213
|
-
...[...root.querySelectorAll('p[loops]')].
|
|
213
|
+
...[...root.querySelectorAll('p[loops]')].flatMap(p => p.getAttribute('targets').split(',').map(target => ({ target, text: p.textContent.replace(/\s+/g, ' ').trim(), selected: false, disabled: true })))
|
|
214
214
|
]
|
|
215
215
|
},
|
|
216
216
|
/** The page point of a chip of the fastening window's list. */
|
|
@@ -311,8 +311,7 @@ describe('the history panel on the page', () => {
|
|
|
311
311
|
const before = await read(() => product.view())
|
|
312
312
|
await press(`${PANEL} >>> button[fit-base]`, 'fit')
|
|
313
313
|
await until(r => product.view().revision === r + 1, 'one step', before.revision)
|
|
314
|
-
await
|
|
315
|
-
await until(() => product.deep('figure-properties >>> div[row] > span')[0]?.textContent === 'figure.text.declared-space-declared', 'the room declared')
|
|
314
|
+
await until(() => !!JSON.parse(product.view().source).occupancy, 'the room declared')
|
|
316
315
|
await openHistory()
|
|
317
316
|
})
|
|
318
317
|
|
|
@@ -535,11 +534,30 @@ describe('the page around the figure: the shell, the dock, the properties', () =
|
|
|
535
534
|
await until(() => product.view().name === 'Door', 'undone')
|
|
536
535
|
})
|
|
537
536
|
|
|
538
|
-
|
|
537
|
+
/*
|
|
538
|
+
Nothing to set up before work goes on (user 2026-10-18, after a walk without it): the tab names the figure and
|
|
539
|
+
where it stands. The room is declared where release asks for it; no face is chosen here.
|
|
540
|
+
*/
|
|
541
|
+
test('the properties tab neither declares the room nor picks a face; where it stands is one step', async () => {
|
|
542
|
+
const shown = await read(() => {
|
|
543
|
+
const root = product.deep('figure-modeller-page >>> figure-properties')[0].shadowRoot
|
|
544
|
+
return {
|
|
545
|
+
headings: [...root.querySelectorAll('section > h3')].map(h => h.textContent.trim()),
|
|
546
|
+
actions: root.querySelectorAll('button[act]').length,
|
|
547
|
+
mounting: !!root.querySelector('div[mounting-face]'),
|
|
548
|
+
selects: [...root.querySelectorAll('select')].map(s => s.previousElementSibling?.textContent.trim())
|
|
549
|
+
}
|
|
550
|
+
})
|
|
551
|
+
assert.deepEqual(shown, { headings: ['figure.label.group-figure', 'figure.label.group-catalog'], actions: 0, mounting: false, selects: ['figure.label.figure-placement'] })
|
|
539
552
|
const before = await read(() => product.view())
|
|
540
|
-
await
|
|
541
|
-
|
|
542
|
-
|
|
553
|
+
await read(() => {
|
|
554
|
+
const select = product.deep('figure-modeller-page >>> figure-properties')[0].shadowRoot.querySelector('select')
|
|
555
|
+
select.value = 'ceiling'
|
|
556
|
+
select.dispatchEvent(new Event('change', { bubbles: true }))
|
|
557
|
+
})
|
|
558
|
+
await until(r => product.view().revision === r + 1, 'one step', before.revision)
|
|
559
|
+
assert.equal(JSON.parse((await read(() => product.view())).source).placement, 'ceiling')
|
|
560
|
+
assert.equal(JSON.parse((await read(() => product.view())).source).occupancy, undefined, 'no room declared on the way')
|
|
543
561
|
})
|
|
544
562
|
|
|
545
563
|
test('unsaved: closing or reloading the tab is asked about', async () => {
|
|
@@ -770,6 +788,38 @@ describe('the catalogue preview', () => {
|
|
|
770
788
|
})
|
|
771
789
|
})
|
|
772
790
|
|
|
791
|
+
/* A mounting face named already -- by the assistant, or before 2026-10-18 -- is said, and can be taken off; nothing more. */
|
|
792
|
+
describe('a mounting face named already', () => {
|
|
793
|
+
const line = () =>
|
|
794
|
+
read(() => {
|
|
795
|
+
const root = product.deep('figure-modeller-page >>> figure-properties')[0]?.shadowRoot
|
|
796
|
+
const field = root?.querySelector('div[mounting-face]')
|
|
797
|
+
return field ? { label: field.querySelector('label').textContent.trim(), said: field.querySelector('div[row] > span').textContent.trim(), clear: !!field.querySelector('button[quiet][clear-mounting-face]') } : null
|
|
798
|
+
})
|
|
799
|
+
|
|
800
|
+
test('it is one line with the way to take it off, which is one step', async () => {
|
|
801
|
+
await fresh()
|
|
802
|
+
await read(() => product.seed({ id: 'm', type: 'mounted', source: product.mountedSource('floor') }))
|
|
803
|
+
await open('m')
|
|
804
|
+
await until(() => !!product.deep('figure-modeller-page >>> figure-properties')[0]?.shadowRoot?.querySelector('div[mounting-face]'), 'the mounting face said')
|
|
805
|
+
assert.deepEqual(await line(), { label: 'figure.label.mounting-face', said: 'box · figure.label.face-bottom', clear: true })
|
|
806
|
+
const before = await read(() => product.view())
|
|
807
|
+
await press('figure-properties >>> button[clear-mounting-face]', 'take the mounting face off')
|
|
808
|
+
await until(r => product.view().revision === r + 1, 'one step', before.revision)
|
|
809
|
+
assert.equal(JSON.parse((await read(() => product.view())).source).occupancy.contact, undefined, 'taken off')
|
|
810
|
+
assert.ok(JSON.parse((await read(() => product.view())).source).occupancy.bounds, 'the room stays')
|
|
811
|
+
await until(() => !product.deep('figure-modeller-page >>> figure-properties')[0].shadowRoot.querySelector('div[mounting-face]'), 'the line gone')
|
|
812
|
+
})
|
|
813
|
+
|
|
814
|
+
test('on a centred figure it says the face is not checked there', async () => {
|
|
815
|
+
await fresh()
|
|
816
|
+
await read(() => product.seed({ id: 'mc', type: 'mounted', source: product.mountedSource('center') }))
|
|
817
|
+
await open('mc')
|
|
818
|
+
await until(() => !!product.deep('figure-modeller-page >>> figure-properties')[0]?.shadowRoot?.querySelector('div[mounting-face]'), 'the mounting face said')
|
|
819
|
+
assert.equal((await line()).said, 'box · figure.label.face-bottom · figure.text.mounting-face-unchecked-at-center')
|
|
820
|
+
})
|
|
821
|
+
})
|
|
822
|
+
|
|
773
823
|
describe('the page at a narrow width', () => {
|
|
774
824
|
before(async () => {
|
|
775
825
|
await fresh()
|
|
@@ -20,7 +20,7 @@ import { store } from '@operato/shell'
|
|
|
20
20
|
import { addressController } from '@operato/utils/address.js'
|
|
21
21
|
import './popup-stand-in.js'
|
|
22
22
|
import { html, render } from 'lit'
|
|
23
|
-
import { addFigureBox, applyFigureAuthoring, createFigureAsset, editFigurePart, serializeFigureAsset } from '@hatiolab/figure-model'
|
|
23
|
+
import { addFigureBox, applyFigureAuthoring, createFigureAsset, editFigurePart, proposeFigureOccupancy, serializeFigureAsset } from '@hatiolab/figure-model'
|
|
24
24
|
|
|
25
25
|
const PALETTE = { 'palette.dark': '#2b2b2b', 'palette.neutral': '#9a9a9a', 'palette.primary': '#477b9e', 'palette.accent': '#f79c40', 'palette.light': '#dddddd' }
|
|
26
26
|
|
|
@@ -30,6 +30,15 @@ export function boxSource(name = 'Probe') {
|
|
|
30
30
|
return serializeFigureAsset(addFigureBox(asset, { id: 'box', size: { x: 400, y: 400, z: 400 }, position: { x: 0, y: 200, z: 0 } }))
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
+
/* A box whose bottom is named as its mounting face -- the assistant can name one; the properties tab only takes it off. */
|
|
34
|
+
export function mountedSource(placement = 'floor') {
|
|
35
|
+
let a = applyFigureAuthoring(createFigureAsset('Mounted'), { kind: 'set-placement', placement })
|
|
36
|
+
a.palette = { ...a.palette, ...PALETTE }
|
|
37
|
+
a = addFigureBox(a, { id: 'box', size: { x: 400, y: 400, z: 400 }, position: { x: 0, y: 200, z: 0 } })
|
|
38
|
+
a = applyFigureAuthoring(a, { kind: 'declare-occupancy', proposal: proposeFigureOccupancy(a) })
|
|
39
|
+
return serializeFigureAsset(applyFigureAuthoring(a, { kind: 'set-mounting-face', part: 'box', face: 'bottom' }))
|
|
40
|
+
}
|
|
41
|
+
|
|
33
42
|
/* A door whose leaf swings on a clip: a proposal that takes the leaf away would stop the clip. */
|
|
34
43
|
export function doorSource() {
|
|
35
44
|
let a = createFigureAsset('Door')
|
|
@@ -189,6 +198,7 @@ document.head.appendChild(fill)
|
|
|
189
198
|
window.product = {
|
|
190
199
|
boxSource,
|
|
191
200
|
doorSource,
|
|
201
|
+
mountedSource,
|
|
192
202
|
page,
|
|
193
203
|
deep,
|
|
194
204
|
calls: () => calls.map(c => ({ ...c })),
|
|
@@ -26,9 +26,9 @@ const sections = () =>
|
|
|
26
26
|
describe('sections an app adds', () => {
|
|
27
27
|
test('only for the figures they are for, after the panel\'s own', async () => {
|
|
28
28
|
await page().evaluate(() => harness.show('EQUIPMENT'))
|
|
29
|
-
assert.deepEqual(await sections(), ['own', 'own'
|
|
29
|
+
assert.deepEqual(await sections(), ['own', 'own'])
|
|
30
30
|
await page().evaluate(() => harness.show('CARRIER'))
|
|
31
|
-
assert.deepEqual(await sections(), ['own', 'own', '
|
|
31
|
+
assert.deepEqual(await sections(), ['own', 'own', 'carrier'])
|
|
32
32
|
})
|
|
33
33
|
|
|
34
34
|
test('a section changes the figure by the modeller\'s command', async () => {
|
|
@@ -41,7 +41,7 @@ describe('sections an app adds', () => {
|
|
|
41
41
|
test('a section that fails says so in its place; the others stand', async () => {
|
|
42
42
|
await page().evaluate(() => harness.failOn())
|
|
43
43
|
await page().evaluate(() => harness.show('CARRIER'))
|
|
44
|
-
assert.deepEqual(await sections(), ['own', 'own', '
|
|
44
|
+
assert.deepEqual(await sections(), ['own', 'own', 'carrier', 'broken'])
|
|
45
45
|
assert.match(await page().evaluate(() => document.querySelector('figure-properties').shadowRoot.querySelector('section[data-section="broken"] [role="alert"]').textContent), /figure\.text\.property-section-failed|no table/)
|
|
46
46
|
await page().evaluate(() => harness.failOff())
|
|
47
47
|
})
|
|
@@ -60,11 +60,16 @@ const FIGURES = {
|
|
|
60
60
|
a = applyFigureAuthoring(a, { kind: 'attach', part: 'mast', face: 'bottom', to: { plane: 'mounting-plane' } })
|
|
61
61
|
return applyFigureAuthoring(a, { kind: 'declare-instance-size', range: { x: { min: 200, max: 200 }, y: { min: 1000, max: 3000 }, z: { min: 300, max: 300 } } })
|
|
62
62
|
},
|
|
63
|
-
/*
|
|
63
|
+
/*
|
|
64
|
+
A block fastened on a base: a part with a fastening to take back, under a figure with no size of its own yet; its
|
|
65
|
+
base's bottom named as the mounting face, which the figure panel offers to take off.
|
|
66
|
+
*/
|
|
64
67
|
stack: () => {
|
|
65
68
|
let a = addFigureBox(named('Stack'), { id: 'base', size: { x: 1000, y: 200, z: 600 }, position: { x: 0, y: 100, z: 0 } })
|
|
66
69
|
a = addFigureBox(a, { id: 'top', size: { x: 200, y: 200, z: 200 }, position: { x: 0, y: 300, z: 0 } })
|
|
67
|
-
|
|
70
|
+
a = applyFigureAuthoring(a, { kind: 'attach', part: 'top', face: 'bottom', to: { part: 'base', face: 'top' } })
|
|
71
|
+
a = applyFigureAuthoring(a, { kind: 'declare-occupancy', proposal: proposeFigureOccupancy(a) })
|
|
72
|
+
return applyFigureAuthoring(a, { kind: 'set-mounting-face', part: 'base', face: 'bottom' })
|
|
68
73
|
},
|
|
69
74
|
/* A conveyor that follows its width, a roller every 200 mm, and the space it takes declared: the one figure stretched. */
|
|
70
75
|
stretch: () => {
|
package/test/properties.test.ts
CHANGED
|
@@ -13,7 +13,6 @@ import { addFigureBox, applyFigureAuthoring, createFigureAsset, inspectFigureAss
|
|
|
13
13
|
|
|
14
14
|
import { tagsOf, figureFigureFacts } from '../client/modeller/figure-facts.ts'
|
|
15
15
|
import { occupancyFromParts } from '../client/modeller/occupancy.ts'
|
|
16
|
-
import { offeredMountingOf } from '../client/modeller/mounting-part.ts'
|
|
17
16
|
import { revisionOf } from './revision-of.ts'
|
|
18
17
|
import { wordsOf } from './words.ts'
|
|
19
18
|
|
|
@@ -25,11 +24,10 @@ const probe = () => {
|
|
|
25
24
|
}
|
|
26
25
|
const facts = (asset: ReturnType<typeof probe>) => figureFigureFacts(revisionOf(asset))
|
|
27
26
|
|
|
28
|
-
test('탭이 읽는 사실 —
|
|
27
|
+
test('탭이 읽는 사실 — 이름, 놓이는 곳, 이름 붙은 장착면뿐이다', () => {
|
|
29
28
|
const read = facts(probe())
|
|
29
|
+
assert.deepEqual(Object.keys(read).sort(), ['mounting', 'name', 'placement'])
|
|
30
30
|
assert.equal(read.name, 'Probe')
|
|
31
|
-
assert.deepEqual(read.parts, ['body'])
|
|
32
|
-
assert.equal(read.declared, false)
|
|
33
31
|
assert.equal(read.placement, undefined, '없는 것을 바닥으로 읽지 않는다')
|
|
34
32
|
assert.equal(read.mounting, undefined)
|
|
35
33
|
})
|
|
@@ -39,7 +37,6 @@ test('배치 기준을 고르면 그 기준으로 공간을 선언한다 — 판
|
|
|
39
37
|
const declared = applyFigureAuthoring(parseFigureAsset(source), occupancyFromParts(parseFigureAsset(source), 'ceiling'))
|
|
40
38
|
|
|
41
39
|
assert.equal(facts(declared).placement, 'ceiling')
|
|
42
|
-
assert.equal(facts(declared).declared, true)
|
|
43
40
|
assert.ok(!inspectFigureAsset(declared).violations.some(v => v.code === 'OCCUPANCY_UNDECLARED'))
|
|
44
41
|
})
|
|
45
42
|
|
|
@@ -78,18 +75,13 @@ test('속성 탭의 말은 다섯 말 모두에 있다', () => {
|
|
|
78
75
|
}
|
|
79
76
|
})
|
|
80
77
|
|
|
81
|
-
/*
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
const
|
|
88
|
-
assert.deepEqual(
|
|
89
|
-
assert.
|
|
90
|
-
assert.deepEqual(offeredMountingOf(facts), { part: 'leg', face: 'bottom' }, 'where it meets its plane')
|
|
91
|
-
assert.deepEqual(offeredMountingOf(facts, { part: 'bed', face: 'top' }), { part: 'bed', face: 'top' }, 'a part picked comes first')
|
|
92
|
-
assert.deepEqual(offeredMountingOf({ ...facts, mounting: { part: 'bed', face: 'bottom' } }), { part: 'bed', face: 'bottom' }, 'then the one set, before the suggestion')
|
|
93
|
-
assert.deepEqual(offeredMountingOf(facts, { part: 'gone' }), { part: 'leg', face: 'bottom' }, 'a part no longer there is passed over')
|
|
94
|
-
assert.deepEqual(offeredMountingOf({ parts: ['bed'] }), { part: 'bed', face: 'bottom' }, 'nothing to suggest: the first part')
|
|
78
|
+
/*
|
|
79
|
+
* The walk without the standing group (user 2026-10-18): nothing on the tab declares the room or names a face. The
|
|
80
|
+
* room is declared where release asks for it; whether the figure meets its plane the release check says from the parts.
|
|
81
|
+
*/
|
|
82
|
+
test('속성 탭에는 공간을 정하거나 장착면을 고르는 명령이 없다 — 이름 붙은 장착면을 떼는 것만 있다', () => {
|
|
83
|
+
const tab = read('../client/modeller/figure-properties.ts')
|
|
84
|
+
const kinds = [...tab.matchAll(/kind: '([a-z-]+)'/g)].map(m => m[1]).sort()
|
|
85
|
+
assert.deepEqual(kinds, ['clear-mounting-face', 'rename', 'set-placement'])
|
|
86
|
+
assert.doesNotMatch(tab, /occupancyFromParts|declare-occupancy|set-mounting-face/)
|
|
95
87
|
})
|
package/translations/en.json
CHANGED
|
@@ -39,7 +39,6 @@
|
|
|
39
39
|
"figure.button.save": "save",
|
|
40
40
|
"figure.button.see-the-trend-chart": "see the trend chart",
|
|
41
41
|
"figure.button.snap": "align to grid",
|
|
42
|
-
"figure.label.declared-space": "space it takes",
|
|
43
42
|
"figure.label.follows-expression": "set by an expression",
|
|
44
43
|
"figure.label.gizmo-rotate": "turn",
|
|
45
44
|
"figure.label.gizmo-scale": "size",
|
|
@@ -48,8 +47,6 @@
|
|
|
48
47
|
"figure.label.position-in-proportion": "in proportion to the figure size",
|
|
49
48
|
"figure.label.primitive-rounded-box": "rounded box",
|
|
50
49
|
"figure.text.catalog-needs-a-save": "can be set once the figure is saved.",
|
|
51
|
-
"figure.text.declared-space-declared": "fitted to the parts",
|
|
52
|
-
"figure.text.declared-space-none": "not set",
|
|
53
50
|
"figure.text.fasten-would-loop": "that part is already fastened to this one, so it cannot be fastened the other way.",
|
|
54
51
|
"figure.text.follow-would-loop": "that dimension already follows this part, so the two cannot follow each other.",
|
|
55
52
|
"figure.text.links-need-a-box": "size following works on box-shaped parts, fastening on boxes and cylinders.",
|
|
@@ -90,11 +87,9 @@
|
|
|
90
87
|
"figure.text.size-range-part-gone": "at its size now, {at} mm on {axis}, a part already has no length. change the link or the size.",
|
|
91
88
|
"figure.text.input-range-size": "figure size {axis} can only be set between {min} and {max} mm. value given: {value} mm",
|
|
92
89
|
"figure.text.input-range": "this value can only be set between {min} and {max}. value given: {value}",
|
|
93
|
-
"figure.text.mounting-face-needs-space": "declare the space first to choose one.",
|
|
94
90
|
"figure.text.part-is-referenced": "'{part}' cannot be deleted: another part uses its values as they are.",
|
|
95
91
|
"figure.text.part-name-invalid": "'{name}' cannot be a part name. Start with a letter and use letters, digits, - and _.",
|
|
96
92
|
"figure.text.part-name-taken": "'{name}' is already used in this figure.",
|
|
97
|
-
"figure.text.placement-redeclares": "changing it declares the space again from the parts as they are now.",
|
|
98
93
|
"figure.text.show-affected-parts": "show affected parts",
|
|
99
94
|
"figure.button.to-floor": "to floor",
|
|
100
95
|
"figure.label.accepts": "accepts",
|
|
@@ -601,10 +596,8 @@
|
|
|
601
596
|
"figure.label.room-undeclared": "not set",
|
|
602
597
|
"figure.label.room-declared": "Declared now",
|
|
603
598
|
"figure.label.mounting-face": "Mounting face",
|
|
604
|
-
"figure.text.mounting-face-explained": "The face the figure is mounted on. A separate choice from the room it takes up.",
|
|
605
|
-
"figure.button.set-mounting-face": "This face",
|
|
606
599
|
"figure.button.clear-mounting-face": "Clear",
|
|
607
|
-
"figure.
|
|
600
|
+
"figure.text.mounting-face-unchecked-at-center": "not checked for a centred figure",
|
|
608
601
|
"figure.label.dimensions": "Dimensions",
|
|
609
602
|
"figure.label.part-id": "part id",
|
|
610
603
|
"figure.text.part-id-is-stable": "The part id is what fastenings, motions and connections point at, so it does not change.",
|
|
@@ -678,7 +671,6 @@
|
|
|
678
671
|
"figure.label.group-figure-size": "Size",
|
|
679
672
|
"figure.label.group-part": "Part",
|
|
680
673
|
"figure.label.group-figure": "Figure",
|
|
681
|
-
"figure.label.group-standing": "Where it stands",
|
|
682
674
|
"figure.label.group-catalog": "Catalogue",
|
|
683
675
|
"figure.button.control-settings": "Name, range and time",
|
|
684
676
|
"figure.label.align-x": "left-right",
|
package/translations/es.json
CHANGED
|
@@ -39,7 +39,6 @@
|
|
|
39
39
|
"figure.button.save": "guardar",
|
|
40
40
|
"figure.button.see-the-trend-chart": "ver el gráfico de tendencia",
|
|
41
41
|
"figure.button.snap": "ajustar a la cuadrícula",
|
|
42
|
-
"figure.label.declared-space": "espacio declarado",
|
|
43
42
|
"figure.label.follows-expression": "definido por una expresión",
|
|
44
43
|
"figure.label.gizmo-rotate": "girar",
|
|
45
44
|
"figure.label.gizmo-scale": "tamaño",
|
|
@@ -48,8 +47,6 @@
|
|
|
48
47
|
"figure.label.position-in-proportion": "en proporción al tamaño de la figura",
|
|
49
48
|
"figure.label.primitive-rounded-box": "caja redondeada",
|
|
50
49
|
"figure.text.catalog-needs-a-save": "se puede definir una vez guardada la figura.",
|
|
51
|
-
"figure.text.declared-space-declared": "declarado a partir de las piezas.",
|
|
52
|
-
"figure.text.declared-space-none": "aún no declarado.",
|
|
53
50
|
"figure.text.fasten-would-loop": "esa pieza ya está sujeta a esta, por lo que no se puede sujetar en sentido inverso.",
|
|
54
51
|
"figure.text.follow-would-loop": "esa dimensión ya sigue a esta pieza, por lo que no pueden seguirse mutuamente.",
|
|
55
52
|
"figure.text.links-need-a-box": "el seguimiento de tamaño funciona en piezas con forma de caja; la sujeción, en cajas y cilindros.",
|
|
@@ -90,11 +87,9 @@
|
|
|
90
87
|
"figure.text.size-range-part-gone": "con su tamaño actual, {at} mm en {axis}, una pieza ya no tiene longitud. cambie el vínculo o el tamaño.",
|
|
91
88
|
"figure.text.input-range-size": "el tamaño de la figura en {axis} solo se puede definir entre {min} y {max} mm. valor introducido: {value} mm",
|
|
92
89
|
"figure.text.input-range": "este valor solo se puede definir entre {min} y {max}. valor introducido: {value}",
|
|
93
|
-
"figure.text.mounting-face-needs-space": "declare primero el espacio para poder elegir una.",
|
|
94
90
|
"figure.text.part-is-referenced": "'{part}' no se puede eliminar: otra pieza usa sus valores tal cual.",
|
|
95
91
|
"figure.text.part-name-invalid": "'{name}' no puede ser un nombre de pieza. Empiece por una letra y use letras, dígitos, - y _.",
|
|
96
92
|
"figure.text.part-name-taken": "'{name}' ya se usa en esta figura.",
|
|
97
|
-
"figure.text.placement-redeclares": "al cambiarlo se vuelve a declarar el espacio a partir de las piezas tal como están ahora.",
|
|
98
93
|
"figure.text.show-affected-parts": "mostrar piezas afectadas",
|
|
99
94
|
"figure.button.to-floor": "al suelo",
|
|
100
95
|
"figure.label.accepts": "acepta",
|
|
@@ -601,10 +596,8 @@
|
|
|
601
596
|
"figure.label.room-undeclared": "aún no declarado",
|
|
602
597
|
"figure.label.room-declared": "Declarado ahora",
|
|
603
598
|
"figure.label.mounting-face": "Cara de montaje",
|
|
604
|
-
"figure.text.mounting-face-explained": "La cara sobre la que se monta la figura. Es una elección independiente del espacio que ocupa.",
|
|
605
|
-
"figure.button.set-mounting-face": "Esta cara",
|
|
606
599
|
"figure.button.clear-mounting-face": "Borrar",
|
|
607
|
-
"figure.
|
|
600
|
+
"figure.text.mounting-face-unchecked-at-center": "no se comprueba en una figura centrada",
|
|
608
601
|
"figure.label.dimensions": "Dimensiones",
|
|
609
602
|
"figure.label.part-id": "id de pieza",
|
|
610
603
|
"figure.text.part-id-is-stable": "El id de pieza es al que apuntan las sujeciones, los movimientos y las conexiones, por lo que no cambia.",
|
|
@@ -678,7 +671,6 @@
|
|
|
678
671
|
"figure.label.group-figure-size": "Tamaño de la figura",
|
|
679
672
|
"figure.label.group-part": "Pieza",
|
|
680
673
|
"figure.label.group-figure": "Figura",
|
|
681
|
-
"figure.label.group-standing": "Dónde se apoya",
|
|
682
674
|
"figure.label.group-catalog": "Catálogo",
|
|
683
675
|
"figure.button.control-settings": "Nombre, rango y tiempo",
|
|
684
676
|
"figure.label.align-x": "izquierda-derecha",
|
package/translations/ja.json
CHANGED
|
@@ -39,7 +39,6 @@
|
|
|
39
39
|
"figure.button.save": "save",
|
|
40
40
|
"figure.button.see-the-trend-chart": "see the trend chart",
|
|
41
41
|
"figure.button.snap": "グリッドに合わせる",
|
|
42
|
-
"figure.label.declared-space": "空間宣言",
|
|
43
42
|
"figure.label.follows-expression": "式で決まる",
|
|
44
43
|
"figure.label.gizmo-rotate": "回転",
|
|
45
44
|
"figure.label.gizmo-scale": "サイズ",
|
|
@@ -48,8 +47,6 @@
|
|
|
48
47
|
"figure.label.position-in-proportion": "図形サイズに比例",
|
|
49
48
|
"figure.label.primitive-rounded-box": "角丸ボックス",
|
|
50
49
|
"figure.text.catalog-needs-a-save": "保存した後に設定できます。",
|
|
51
|
-
"figure.text.declared-space-declared": "部品から宣言しました。",
|
|
52
|
-
"figure.text.declared-space-none": "まだ宣言していません。",
|
|
53
50
|
"figure.text.fasten-would-loop": "その部品はすでにこの部品に取り付けられているため、逆向きに取り付けられません。",
|
|
54
51
|
"figure.text.follow-would-loop": "その寸法はすでにこの部品に追従しているため、互いに追従させられません。",
|
|
55
52
|
"figure.text.links-need-a-box": "サイズ追従は箱形、取り付けは箱形と円柱の部品で使えます。",
|
|
@@ -90,11 +87,9 @@
|
|
|
90
87
|
"figure.text.size-range-part-gone": "現在のサイズ {at} mm では {axis} 軸の部品の長さがすでに 0 です。リンクかサイズを変えてください。",
|
|
91
88
|
"figure.text.input-range-size": "図形サイズ {axis} は {min} ~ {max} mm の間でのみ設定できます。入力値: {value} mm",
|
|
92
89
|
"figure.text.input-range": "この値は {min} ~ {max} の間でのみ設定できます。入力値: {value}",
|
|
93
|
-
"figure.text.mounting-face-needs-space": "先に空間を宣言すると選べます。",
|
|
94
90
|
"figure.text.part-is-referenced": "他の部品が '{part}' の値をそのまま使っているため削除できません。",
|
|
95
91
|
"figure.text.part-name-invalid": "'{name}' は部品名に使えません。英字で始め、英字・数字・-・_ のみ使えます。",
|
|
96
92
|
"figure.text.part-name-taken": "'{name}' はこの図形ですでに使われている名前です。",
|
|
97
|
-
"figure.text.placement-redeclares": "変更すると、今の部品で空間を宣言し直します。",
|
|
98
93
|
"figure.text.show-affected-parts": "影響する部品を見る",
|
|
99
94
|
"figure.button.to-floor": "to floor",
|
|
100
95
|
"figure.label.accepts": "受け入れるもの",
|
|
@@ -601,10 +596,8 @@
|
|
|
601
596
|
"figure.label.room-undeclared": "not declared yet",
|
|
602
597
|
"figure.label.room-declared": "現在の宣言",
|
|
603
598
|
"figure.label.mounting-face": "Mounting face",
|
|
604
|
-
"figure.text.mounting-face-explained": "The face the figure is mounted on. A separate choice from the room it takes up.",
|
|
605
|
-
"figure.button.set-mounting-face": "This face",
|
|
606
599
|
"figure.button.clear-mounting-face": "Clear",
|
|
607
|
-
"figure.
|
|
600
|
+
"figure.text.mounting-face-unchecked-at-center": "中心配置のため検査しません",
|
|
608
601
|
"figure.label.dimensions": "Dimensions",
|
|
609
602
|
"figure.label.part-id": "part id",
|
|
610
603
|
"figure.text.part-id-is-stable": "The part id is what fastenings, motions and connections point at, so it does not change.",
|
|
@@ -678,7 +671,6 @@
|
|
|
678
671
|
"figure.label.group-figure-size": "図形のサイズ",
|
|
679
672
|
"figure.label.group-part": "部品",
|
|
680
673
|
"figure.label.group-figure": "図形",
|
|
681
|
-
"figure.label.group-standing": "置き方",
|
|
682
674
|
"figure.label.group-catalog": "一覧情報",
|
|
683
675
|
"figure.button.control-settings": "名前・範囲・時間",
|
|
684
676
|
"figure.label.align-x": "左右の位置",
|
package/translations/ko.json
CHANGED
|
@@ -39,7 +39,6 @@
|
|
|
39
39
|
"figure.button.save": "저장",
|
|
40
40
|
"figure.button.see-the-trend-chart": "추이 그래프 보기",
|
|
41
41
|
"figure.button.snap": "눈금에 정렬",
|
|
42
|
-
"figure.label.declared-space": "차지하는 공간",
|
|
43
42
|
"figure.label.follows-expression": "식으로 정해짐",
|
|
44
43
|
"figure.label.gizmo-rotate": "돌리기",
|
|
45
44
|
"figure.label.gizmo-scale": "크기",
|
|
@@ -48,8 +47,6 @@
|
|
|
48
47
|
"figure.label.position-in-proportion": "도형 크기에 비례",
|
|
49
48
|
"figure.label.primitive-rounded-box": "둥근 상자",
|
|
50
49
|
"figure.text.catalog-needs-a-save": "저장한 뒤에 정할 수 있습니다.",
|
|
51
|
-
"figure.text.declared-space-declared": "부품에 맞춤",
|
|
52
|
-
"figure.text.declared-space-none": "정하지 않음",
|
|
53
50
|
"figure.text.fasten-would-loop": "그 부품은 이미 이 부품에 붙어 있어서 거꾸로 붙일 수 없습니다.",
|
|
54
51
|
"figure.text.follow-would-loop": "그 치수는 이미 이 부품을 따르고 있어서 서로 따르게 할 수 없습니다.",
|
|
55
52
|
"figure.text.links-need-a-box": "「크기 따르기」는 상자 모양 부품에서, 「붙이기」는 상자·원기둥 부품에서 사용할 수 있습니다.",
|
|
@@ -90,11 +87,9 @@
|
|
|
90
87
|
"figure.text.size-range-part-gone": "지금 크기 {at} mm 에서 {axis} 축의 부품 길이가 이미 0 입니다. 연결이나 크기를 바꿔 주세요.",
|
|
91
88
|
"figure.text.input-range-size": "도형 크기 {axis} 는 {min} ~ {max} mm 사이에서만 정할 수 있습니다. 넣은 값: {value} mm",
|
|
92
89
|
"figure.text.input-range": "이 값은 {min} ~ {max} 사이에서만 정할 수 있습니다. 넣은 값: {value}",
|
|
93
|
-
"figure.text.mounting-face-needs-space": "공간을 먼저 선언해야 고를 수 있습니다.",
|
|
94
90
|
"figure.text.part-is-referenced": "다른 부품이 '{part}' 의 값을 그대로 쓰고 있어 삭제할 수 없습니다.",
|
|
95
91
|
"figure.text.part-name-invalid": "'{name}'은(는) 부품 이름으로 사용할 수 없습니다. 영문자로 시작하고 영문자·숫자·-·_만 포함해야 합니다.",
|
|
96
92
|
"figure.text.part-name-taken": "'{name}' 은 이 도형에서 이미 쓰는 이름입니다.",
|
|
97
|
-
"figure.text.placement-redeclares": "바꾸면 지금 부품으로 공간을 다시 선언합니다.",
|
|
98
93
|
"figure.text.show-affected-parts": "영향 받는 부품 보기",
|
|
99
94
|
"figure.button.to-floor": "바닥에",
|
|
100
95
|
"figure.label.accepts": "받는 것",
|
|
@@ -601,10 +596,8 @@
|
|
|
601
596
|
"figure.label.room-undeclared": "정하지 않음",
|
|
602
597
|
"figure.label.room-declared": "지금 선언",
|
|
603
598
|
"figure.label.mounting-face": "장착면",
|
|
604
|
-
"figure.text.mounting-face-explained": "도형을 배치할 때 기준이 되는 장착면을 지정합니다. 점유 공간 설정과는 별개입니다.",
|
|
605
|
-
"figure.button.set-mounting-face": "이 면으로",
|
|
606
599
|
"figure.button.clear-mounting-face": "지정 해제",
|
|
607
|
-
"figure.
|
|
600
|
+
"figure.text.mounting-face-unchecked-at-center": "중심 배치라 검사하지 않음",
|
|
608
601
|
"figure.label.dimensions": "치수",
|
|
609
602
|
"figure.label.part-id": "부품 id",
|
|
610
603
|
"figure.text.part-id-is-stable": "부품 id 는 붙이기·움직임·연결이 가리키는 이름이라 바꾸지 않습니다.",
|
|
@@ -678,7 +671,6 @@
|
|
|
678
671
|
"figure.label.group-figure-size": "크기",
|
|
679
672
|
"figure.label.group-part": "부품",
|
|
680
673
|
"figure.label.group-figure": "도형",
|
|
681
|
-
"figure.label.group-standing": "놓이는 자리",
|
|
682
674
|
"figure.label.group-catalog": "목록 정보",
|
|
683
675
|
"figure.button.control-settings": "이름 · 범위 · 시간",
|
|
684
676
|
"figure.label.align-x": "좌우 자리",
|
package/translations/ms.json
CHANGED
|
@@ -39,7 +39,6 @@
|
|
|
39
39
|
"figure.button.save": "save",
|
|
40
40
|
"figure.button.see-the-trend-chart": "see the trend chart",
|
|
41
41
|
"figure.button.snap": "jajar ke grid",
|
|
42
|
-
"figure.label.declared-space": "ruang yang diisytiharkan",
|
|
43
42
|
"figure.label.follows-expression": "ditetapkan oleh ungkapan",
|
|
44
43
|
"figure.label.gizmo-rotate": "putar",
|
|
45
44
|
"figure.label.gizmo-scale": "saiz",
|
|
@@ -48,8 +47,6 @@
|
|
|
48
47
|
"figure.label.position-in-proportion": "berkadar dengan saiz figura",
|
|
49
48
|
"figure.label.primitive-rounded-box": "kotak bucu bulat",
|
|
50
49
|
"figure.text.catalog-needs-a-save": "boleh ditetapkan selepas disimpan.",
|
|
51
|
-
"figure.text.declared-space-declared": "diisytiharkan daripada bahagian.",
|
|
52
|
-
"figure.text.declared-space-none": "belum diisytiharkan.",
|
|
53
50
|
"figure.text.fasten-would-loop": "bahagian itu sudah dipasang pada bahagian ini, jadi ia tidak boleh dipasang sebaliknya.",
|
|
54
51
|
"figure.text.follow-would-loop": "dimensi itu sudah mengikut bahagian ini, jadi kedua-duanya tidak boleh saling mengikut.",
|
|
55
52
|
"figure.text.links-need-a-box": "ikut saiz untuk bahagian berbentuk kotak, pasangan untuk kotak dan silinder.",
|
|
@@ -90,11 +87,9 @@
|
|
|
90
87
|
"figure.text.size-range-part-gone": "pada saiznya sekarang, {at} mm pada {axis}, satu bahagian sudah tiada panjang. ubah pautan atau saiz.",
|
|
91
88
|
"figure.text.input-range-size": "saiz rajah {axis} hanya boleh ditetapkan antara {min} dan {max} mm. nilai diberi: {value} mm",
|
|
92
89
|
"figure.text.input-range": "nilai ini hanya boleh ditetapkan antara {min} dan {max}. nilai diberi: {value}",
|
|
93
|
-
"figure.text.mounting-face-needs-space": "isytiharkan ruang dahulu untuk memilih.",
|
|
94
90
|
"figure.text.part-is-referenced": "'{part}' tidak boleh dipadam: bahagian lain menggunakan nilainya seperti sedia ada.",
|
|
95
91
|
"figure.text.part-name-invalid": "'{name}' tidak boleh menjadi nama bahagian. Mulakan dengan huruf dan gunakan huruf, digit, - dan _.",
|
|
96
92
|
"figure.text.part-name-taken": "'{name}' sudah digunakan dalam bentuk ini.",
|
|
97
|
-
"figure.text.placement-redeclares": "menukarnya mengisytiharkan semula ruang daripada bahagian semasa.",
|
|
98
93
|
"figure.text.show-affected-parts": "tunjukkan bahagian terjejas",
|
|
99
94
|
"figure.button.to-floor": "to floor",
|
|
100
95
|
"figure.label.accepts": "diterima",
|
|
@@ -601,10 +596,8 @@
|
|
|
601
596
|
"figure.label.room-undeclared": "not declared yet",
|
|
602
597
|
"figure.label.room-declared": "Diisytiharkan sekarang",
|
|
603
598
|
"figure.label.mounting-face": "Mounting face",
|
|
604
|
-
"figure.text.mounting-face-explained": "The face the figure is mounted on. A separate choice from the room it takes up.",
|
|
605
|
-
"figure.button.set-mounting-face": "This face",
|
|
606
599
|
"figure.button.clear-mounting-face": "Clear",
|
|
607
|
-
"figure.
|
|
600
|
+
"figure.text.mounting-face-unchecked-at-center": "tidak disemak untuk figure di tengah",
|
|
608
601
|
"figure.label.dimensions": "Dimensions",
|
|
609
602
|
"figure.label.part-id": "part id",
|
|
610
603
|
"figure.text.part-id-is-stable": "The part id is what fastenings, motions and connections point at, so it does not change.",
|
|
@@ -678,7 +671,6 @@
|
|
|
678
671
|
"figure.label.group-figure-size": "Saiz rajah",
|
|
679
672
|
"figure.label.group-part": "Bahagian",
|
|
680
673
|
"figure.label.group-figure": "Rajah",
|
|
681
|
-
"figure.label.group-standing": "Kedudukan letak",
|
|
682
674
|
"figure.label.group-catalog": "Maklumat katalog",
|
|
683
675
|
"figure.button.control-settings": "Nama, julat dan masa",
|
|
684
676
|
"figure.label.align-x": "kiri-kanan",
|
package/translations/zh.json
CHANGED
|
@@ -39,7 +39,6 @@
|
|
|
39
39
|
"figure.button.save": "save",
|
|
40
40
|
"figure.button.see-the-trend-chart": "see the trend chart",
|
|
41
41
|
"figure.button.snap": "对齐网格",
|
|
42
|
-
"figure.label.declared-space": "空间声明",
|
|
43
42
|
"figure.label.follows-expression": "由表达式决定",
|
|
44
43
|
"figure.label.gizmo-rotate": "旋转",
|
|
45
44
|
"figure.label.gizmo-scale": "尺寸",
|
|
@@ -48,8 +47,6 @@
|
|
|
48
47
|
"figure.label.position-in-proportion": "按图形尺寸比例",
|
|
49
48
|
"figure.label.primitive-rounded-box": "圆角盒",
|
|
50
49
|
"figure.text.catalog-needs-a-save": "保存后即可设置。",
|
|
51
|
-
"figure.text.declared-space-declared": "已根据部件声明。",
|
|
52
|
-
"figure.text.declared-space-none": "尚未声明。",
|
|
53
50
|
"figure.text.fasten-would-loop": "该部件已固定在此部件上,不能反向固定。",
|
|
54
51
|
"figure.text.follow-would-loop": "该尺寸已跟随此部件,二者不能互相跟随。",
|
|
55
52
|
"figure.text.links-need-a-box": "尺寸跟随适用于盒形部件,固定适用于盒形和圆柱部件。",
|
|
@@ -90,11 +87,9 @@
|
|
|
90
87
|
"figure.text.size-range-part-gone": "在当前尺寸 {at} mm({axis} 轴)下,已有部件长度为 0。请修改链接或尺寸。",
|
|
91
88
|
"figure.text.input-range-size": "图形尺寸 {axis} 只能设置在 {min} 到 {max} mm 之间。输入值:{value} mm",
|
|
92
89
|
"figure.text.input-range": "此值只能设置在 {min} 到 {max} 之间。输入值:{value}",
|
|
93
|
-
"figure.text.mounting-face-needs-space": "请先声明空间,然后才能选择。",
|
|
94
90
|
"figure.text.part-is-referenced": "其他部件直接使用 '{part}' 的值,无法删除。",
|
|
95
91
|
"figure.text.part-name-invalid": "'{name}' 不能作为部件名称。请以字母开头,只使用字母、数字、- 和 _。",
|
|
96
92
|
"figure.text.part-name-taken": "'{name}' 在此图形中已被使用。",
|
|
97
|
-
"figure.text.placement-redeclares": "更改后将按当前部件重新声明空间。",
|
|
98
93
|
"figure.text.show-affected-parts": "查看受影响部件",
|
|
99
94
|
"figure.button.to-floor": "to floor",
|
|
100
95
|
"figure.label.accepts": "接受的类型",
|
|
@@ -601,10 +596,8 @@
|
|
|
601
596
|
"figure.label.room-undeclared": "not declared yet",
|
|
602
597
|
"figure.label.room-declared": "当前声明",
|
|
603
598
|
"figure.label.mounting-face": "Mounting face",
|
|
604
|
-
"figure.text.mounting-face-explained": "The face the figure is mounted on. A separate choice from the room it takes up.",
|
|
605
|
-
"figure.button.set-mounting-face": "This face",
|
|
606
599
|
"figure.button.clear-mounting-face": "Clear",
|
|
607
|
-
"figure.
|
|
600
|
+
"figure.text.mounting-face-unchecked-at-center": "中心放置,不检查",
|
|
608
601
|
"figure.label.dimensions": "Dimensions",
|
|
609
602
|
"figure.label.part-id": "part id",
|
|
610
603
|
"figure.text.part-id-is-stable": "The part id is what fastenings, motions and connections point at, so it does not change.",
|
|
@@ -678,7 +671,6 @@
|
|
|
678
671
|
"figure.label.group-figure-size": "图形尺寸",
|
|
679
672
|
"figure.label.group-part": "部件",
|
|
680
673
|
"figure.label.group-figure": "图形",
|
|
681
|
-
"figure.label.group-standing": "放置方式",
|
|
682
674
|
"figure.label.group-catalog": "目录信息",
|
|
683
675
|
"figure.button.control-settings": "名称 · 范围 · 时间",
|
|
684
676
|
"figure.label.align-x": "左右位置",
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { FigureFace } from '@hatiolab/figure-model'
|
|
2
|
-
import type { FigureFigureFacts } from './figure-facts.js'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* The mounting face the properties tab offers: the part and face picked in its lists, else the one set, else where the
|
|
6
|
-
* figure meets its plane (`suggested`) -- a conveyor's legs, not its bed (walk 1, 2026-09-26) -- else the first part.
|
|
7
|
-
* A part no longer in the figure is passed over.
|
|
8
|
-
*/
|
|
9
|
-
export function offeredMountingOf(
|
|
10
|
-
facts: Pick<FigureFigureFacts, 'parts' | 'mounting' | 'suggested'>,
|
|
11
|
-
picked: { part?: string; face?: FigureFace } = {}
|
|
12
|
-
): { part?: string; face: FigureFace } {
|
|
13
|
-
const part = [picked.part, facts.mounting?.part, facts.suggested?.part, facts.parts[0]].find(one => one && facts.parts.includes(one))
|
|
14
|
-
return { part, face: picked.face ?? facts.mounting?.face ?? facts.suggested?.face ?? 'bottom' }
|
|
15
|
-
}
|