- 지형 격자가 없으면 교각 지반고 위치에 얇은 선(코핑 길이 + 여유 2 m)만 그림 - 전체 보기에서도 지형이 없으면 교각별 지반고 선을 표시, 지형이 있으면 공유 격자만 표시 - 부재 표시 '지반' 체크박스는 두 경우 모두 동작 - 테스트: 얇은 선 위치와 길이, 지형 있을 때 선 미표시 Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
46 lines
2.1 KiB
TypeScript
46 lines
2.1 KiB
TypeScript
import * as THREE from 'three';
|
||
import { describe, expect, it } from 'vitest';
|
||
import { buildPier, type PierModel } from '../src/core/geometry';
|
||
import { buildAllPiers, pierOffset } from '../src/view/all-piers';
|
||
import { loadP1 } from './helpers';
|
||
|
||
const model = buildPier(loadP1());
|
||
|
||
describe('pierOffset', () => {
|
||
it('is zero for the reference pier', () => {
|
||
expect(pierOffset(model.pivot, model.pivot)).toEqual({ x: 0, z: 0 });
|
||
});
|
||
|
||
it('moves east by the E difference and north by the N difference (z = −N)', () => {
|
||
const ref = { e: 259865, n: 179138 };
|
||
const other = { e: 260117, n: 179177 };
|
||
expect(pierOffset(other, ref)).toEqual({ x: 252, z: -39 });
|
||
});
|
||
});
|
||
|
||
describe('buildAllPiers', () => {
|
||
it('places a pier at the same world box whatever pivot it is built around', () => {
|
||
// The same pier with its pivot shifted: the geometry shifts by the opposite amount, so the world box must not change.
|
||
const shifted: PierModel = { ...model, pivot: { e: model.pivot.e + 50, n: model.pivot.n - 20 } };
|
||
const all = buildAllPiers([{ name: 'P1', model }, { name: 'P2', model: shifted }]);
|
||
all.piers.updateMatrixWorld(true);
|
||
const a = new THREE.Box3().setFromObject(all.scenes.get('P1')!.root);
|
||
const b = new THREE.Box3().setFromObject(all.scenes.get('P2')!.root);
|
||
// Float32 geometry: allow 0.1 mm.
|
||
expect(b.min.distanceTo(a.min)).toBeLessThan(1e-4);
|
||
expect(b.max.distanceTo(a.max)).toBeLessThan(1e-4);
|
||
});
|
||
|
||
it('keeps each pier 지반고 line without terrain, and hides it when the shared terrain is drawn', () => {
|
||
const without = buildAllPiers([{ name: 'P1', model }]);
|
||
expect([...without.scenes.keys()]).toEqual(['P1']);
|
||
expect(without.scenes.get('P1')!.parts.ground.visible).toBe(true);
|
||
expect(without.terrain).toBeNull();
|
||
expect(without.view.size).toBeGreaterThan(0);
|
||
|
||
const withTerrain = buildAllPiers([{ name: 'P1', model }], { origin: [259815.676, 179088.094], step: 5, nx: 2, ny: 2, z: [30, 31, 32, 33] });
|
||
expect(withTerrain.scenes.get('P1')!.parts.ground.visible).toBe(false);
|
||
expect(withTerrain.terrain).not.toBeNull();
|
||
});
|
||
});
|