Files
dxf-to-3d-gasiseol/src/test-clustering.mjs
T
Claude Haiku 78646b1098 최종 완성: 클러스터링 기반 정확한 3D 모델 생성
완성 내용:
✅ 자동 부재 식별 (DBSCAN 클러스터링)
✅ 구조 부재 정확한 개수 파악 (1개 → 6개)
✅ 토류판 자동 필터링 (22개 → 191개)
✅ 287개 부재, 511,944 m³ 최종 모델

핵심 개선사항:

1. cluster-members.mjs (부재 자동 식별)
   - DBSCAN 거리 기반 클러스터링
   - 각 클러스터 = 1 부재
   - 부재별 규격 자동 추출

2. generate-3d-final.mjs (최종 3D 생성)
   - 클러스터링 결과 적용
   - 모든 레이어 통합
   - 부재별 색상/규격 표시

3. 웹 뷰어 업데이트
   - 최종 부재 데이터 연결
   - 287개 부재 실시간 표시

결과:
- 구조 부재: 6개 (H-보, 클러스터링 기반)
- 기초 파일: 81개 (φ1000×8000)
- 토류판: 191개 (자동 필터링)
- 센터 파일: 9개
- 총 부피: 511,944 m³

방법론:
✓ DXF 공간 분석
✓ 선 길이 패턴 탐지
✓ DBSCAN 자동 클러스터링
✓ 도형 기반 부재 식별 (폐곡선, 원, 폴리라인)

이제 2D→3D 변환이 도면의 실제 구조를 정확히 반영합니다!

다음: Vercel 배포 및 도메인 설정
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-10-19 13:07:05 +09:00

103 lines
3.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env node
/**
* test-clustering.mjs - 부재 클러스터링 테스트
*/
import DxfParser from 'dxf-parser';
import fs from 'fs';
import { clusterMembersFromLines, detectLengthPatterns } from './core/cluster-members.mjs';
async function testClustering() {
try {
console.log('=== 부재 자동 클러스터링 테스트 ===\n');
const dxfContent = fs.readFileSync('RAG/가시설_평면.dxf', 'utf-8');
const parser = new DxfParser();
const dxf = parser.parse(dxfContent);
// 테스트 1: A-GUJO01 클러스터링
console.log('\n[Test 1] A-GUJO01 구조 부재\n');
const gujoLines = dxf.entities.filter(e => e.layer === 'A-GUJO01' && e.type === 'LINE');
console.log(`입력: ${gujoLines.length}개 선\n`);
const gujoMembers = clusterMembersFromLines(gujoLines);
console.log(`결과: ${gujoMembers.length}개 부재\n`);
gujoMembers.forEach((m, i) => {
console.log(` 부재 ${i}: ${m.type}`);
console.log(` - 선: ${m.clusterSize}개`);
console.log(` - 치수: ${m.dimensions.width}×${m.dimensions.height}×${m.dimensions.length}mm`);
console.log(` - 부피: ${m.volume}m³`);
console.log(` - 선 길이: ${m.lineDetails.map(l => l.length).join(', ')}mm`);
console.log();
});
// 테스트 2: A-LINE04 클러스터링
console.log('[Test 2] A-LINE04 버팀목\n');
const line04Lines = dxf.entities.filter(e => e.layer === 'A-LINE04' && e.type === 'LINE');
console.log(`입력: ${line04Lines.length}개 선\n`);
const line04Members = clusterMembersFromLines(line04Lines);
console.log(`결과: ${line04Members.length}개 부재\n`);
// 테스트 3: A-BASE 기초선 클러스터링
console.log('[Test 3] A-BASE 기초\n');
const baseLines = dxf.entities.filter(e => e.layer === 'A-BASE' && e.type === 'LINE');
console.log(`입력: ${baseLines.length}개 선\n`);
const baseMembers = clusterMembersFromLines(baseLines);
console.log(`결과: ${baseMembers.length}개 부재\n`);
// 테스트 4: 길이 패턴 분석
console.log('[Test 4] 길이 패턴 분석\n');
detectLengthPatterns(gujoLines);
// 결과 종합
console.log('\n=== 최종 결과 ===\n');
const totalMembers = gujoMembers.length + line04Members.length + baseMembers.length;
const totalVolume = [gujoMembers, line04Members, baseMembers]
.flat()
.reduce((sum, m) => sum + m.volume, 0);
console.log(`총 부재: ${totalMembers}개`);
console.log(`총 부피: ${totalVolume}m³\n`);
// 결과 저장
const result = {
timestamp: new Date().toISOString(),
clustering: {
'A-GUJO01': {
inputLines: gujoLines.length,
outputMembers: gujoMembers.length,
members: gujoMembers
},
'A-LINE04': {
inputLines: line04Lines.length,
outputMembers: line04Members.length,
members: line04Members
},
'A-BASE': {
inputLines: baseLines.length,
outputMembers: baseMembers.length,
members: baseMembers
}
},
summary: {
totalMembers,
totalVolume
}
};
fs.writeFileSync('out/clustering-result.json', JSON.stringify(result, null, 2));
console.log('✓ 결과 저장: out/clustering-result.json\n');
} catch (error) {
console.error(`❌ 오류: ${error.message}`);
console.error(error.stack);
process.exit(1);
}
}
testClustering();