@things-factory/figure-ui 10.1.31 → 10.1.32

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/figure-ui",
3
- "version": "10.1.31",
3
+ "version": "10.1.32",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "@things-factory:registry": "https://registry.npmjs.org"
@@ -37,8 +37,8 @@
37
37
  "@operato/shell": "^10.0.0",
38
38
  "@operato/styles": "^10.0.0",
39
39
  "@operato/utils": "^10.0.0",
40
- "@things-factory/figure-service": "^10.1.31",
40
+ "@things-factory/figure-service": "^10.1.32",
41
41
  "three": "^0.185.1"
42
42
  },
43
- "gitHead": "5213e6f9913b40ea2618a2111d9884b792dbaa01"
43
+ "gitHead": "67b211e001da3a923e562cb048e4691bd961315c"
44
44
  }
@@ -4,7 +4,7 @@ import { describe, it } from 'node:test'
4
4
  import { readFileSync } from 'node:fs'
5
5
  import { fileURLToPath } from 'node:url'
6
6
 
7
- import { baseFittingParts, baseOf, resizeBase } from '../client/modeller/base-box.ts'
7
+ import { baseFittingParts, baseOf, partsSettledOnFloor, resizeBase } from '../client/modeller/base-box.ts'
8
8
  import { toFigureSource } from '../client/modeller/figure-source.ts'
9
9
  import type { FigureDraft, PartModel } from '../client/modeller/figure-source.ts'
10
10
 
@@ -94,9 +94,66 @@ describe('기준 상자', () => {
94
94
  assert.deepEqual(placed(next.draft, next.parts), placed(DRAFT, [off]))
95
95
  })
96
96
 
97
+ /*
98
+ 45 도 돌린 판은 제 `size` 보다 넓게 자리를 차지한다. 발행 관문은 `rotatedExtentOf` 로 그것을
99
+ 재는데 이 함수는 `width`·`height` 를 그대로 쓰고 있었다. 그래서 회전한 부품이 있는 도형은
100
+ 「부품에 맞추기」를 눌러도 발행이 막힌 채로 남았다 — 표본의 CONVEYOR(부품 17 중 4 가 회전)와
101
+ ROLL_CRADLE(20 중 13)이 그랬다.
102
+
103
+ 기대값을 산술로 베껴 적지 않는다 — 돌린 축이 어느 두 변을 섞는지를 여기 옮겨 적으면 픽스처가
104
+ 바뀔 때 조용히 틀린 것을 잰다. 보는 것은 **돌린 것이 안 돌린 것보다 넓게 담기는가** 하나다.
105
+ */
106
+ it('돌아간 부품은 돌아간 부피로 담는다 — 관문과 같은 함수로 잰다', () => {
107
+ const flat = part({ left: 400, top: 400, width: 200, height: 200 })
108
+ const turned = part({ left: 400, top: 400, width: 200, height: 200, rotationY: Math.PI / 4 })
109
+
110
+ const straight = baseFittingParts(DRAFT, [flat])!
111
+ const rotated = baseFittingParts(DRAFT, [turned])!
112
+
113
+ assert.ok(
114
+ rotated.width > straight.width,
115
+ `돌리면 더 넓게 담아야 한다 — 안 돌린 것 ${straight.width} · 돌린 것 ${rotated.width}`
116
+ )
117
+ })
118
+
97
119
  it('부품이 없으면 잴 것이 없다', () => {
98
120
  assert.equal(baseFittingParts(DRAFT, []), undefined)
99
121
  })
122
+ })
123
+
124
+ describe('바닥에 앉히기', () => {
125
+ /*
126
+ 관문이 막는 것은 「가장 낮은 부품이 밑면에 안 닿는다」다. 그 부품 하나만 내리는 길은 전부터
127
+ 있었으나(고르고 「바닥에」), 그러면 프레임에 붙어 있던 발이 떨어진다 — 부품 사이의 자리는
128
+ 저작자가 정한 것이다. 그래서 전부를 같은 값만큼 옮긴다.
129
+ */
130
+ it('가장 낮은 것이 바닥에 닿도록 전부를 같은 값만큼 내린다', () => {
131
+ const low = part({ zPos: 40, depth: 100 })
132
+ const high = part({ zPos: 300, depth: 100 })
133
+ const settled = partsSettledOnFloor([low, high])
134
+
135
+ assert.equal(settled[0]!.zPos, 0, '가장 낮은 것이 바닥에 닿는다')
136
+ assert.equal(settled[1]!.zPos, 260, '사이 거리가 그대로다 — 300 − 40')
137
+ })
138
+
139
+ it('바닥 아래로 내려간 것은 올린다', () => {
140
+ const dipped = part({ zPos: -10, depth: 100 })
141
+ const settled = partsSettledOnFloor([dipped])
142
+
143
+ assert.equal(settled[0]!.zPos, 0)
144
+ })
145
+
146
+ it('이미 닿아 있으면 받은 것을 그대로 돌려준다 — 「저장 안 됨」이 붙지 않게', () => {
147
+ const parts = [part({ zPos: 0, depth: 100 })]
148
+
149
+ assert.equal(partsSettledOnFloor(parts), parts)
150
+ })
151
+
152
+ it('부품이 없으면 옮길 것이 없다', () => {
153
+ const none: never[] = []
154
+
155
+ assert.equal(partsSettledOnFloor(none), none)
156
+ })
100
157
 
101
158
  it('맞춘 상자 안에서는 부품이 상자를 넘지 않는다', () => {
102
159
  const parts = [part(), part({ name: 'arm', left: 300, top: 250, width: 120, height: 500, zPos: 200, depth: 420 })]
@@ -30,6 +30,7 @@
30
30
  "figure.button.revert": "revert",
31
31
  "figure.button.save": "save",
32
32
  "figure.button.see-the-trend-chart": "see the trend chart",
33
+ "figure.button.settle-on-floor": "settle on the floor",
33
34
  "figure.button.snap": "snap",
34
35
  "figure.button.take-n-changes": "apply {n}",
35
36
  "figure.button.to-floor": "to floor",
@@ -30,6 +30,7 @@
30
30
  "figure.button.revert": "戻す",
31
31
  "figure.button.save": "save",
32
32
  "figure.button.see-the-trend-chart": "see the trend chart",
33
+ "figure.button.settle-on-floor": "床に置く",
33
34
  "figure.button.snap": "snap",
34
35
  "figure.button.take-n-changes": "apply {n}",
35
36
  "figure.button.to-floor": "to floor",
@@ -30,6 +30,7 @@
30
30
  "figure.button.revert": "되돌리기",
31
31
  "figure.button.save": "저장",
32
32
  "figure.button.see-the-trend-chart": "추이 그래프 보기",
33
+ "figure.button.settle-on-floor": "바닥에 앉히기",
33
34
  "figure.button.snap": "눈금에",
34
35
  "figure.button.take-n-changes": "{n}개 적용",
35
36
  "figure.button.to-floor": "바닥에",
@@ -30,6 +30,7 @@
30
30
  "figure.button.revert": "kembalikan",
31
31
  "figure.button.save": "save",
32
32
  "figure.button.see-the-trend-chart": "see the trend chart",
33
+ "figure.button.settle-on-floor": "letak di lantai",
33
34
  "figure.button.snap": "snap",
34
35
  "figure.button.take-n-changes": "apply {n}",
35
36
  "figure.button.to-floor": "to floor",
@@ -30,6 +30,7 @@
30
30
  "figure.button.revert": "回退",
31
31
  "figure.button.save": "save",
32
32
  "figure.button.see-the-trend-chart": "see the trend chart",
33
+ "figure.button.settle-on-floor": "落到地面",
33
34
  "figure.button.snap": "snap",
34
35
  "figure.button.take-n-changes": "apply {n}",
35
36
  "figure.button.to-floor": "to floor",