본문 바로가기
  • You find inspiration to create your own path !
업무 자동화/FreeCAD

2D(PDF) 파일 → 3D로 변환

by ToolBOX01 2026. 6. 27.
반응형

■ 디지털 자산 가치 극대화

보유한 수천 장의 2D 도면을 3D 모델로 전환하는 것은 단순히 '그림을 입체로 바꾸는 것' 이상의 디지털 자산 가치 극대화를 의미합니다. 특히 제조 및 엔지니어링 환경에서 기대할 수 있는 핵심 이점은 다음과 같습니다.

1. 설계 및 검증 단계의 시간 단축

  • 간섭 체크 및 시뮬레이션: 2D 도면만으로는 육안으로 확인하기 어려운 부품 간의 간섭(Interference)을 3D 공간에서 즉시 시뮬레이션할 수 있습니다. 이는 실제 시제품 제작(Proto) 횟수를 획기적으로 줄여줍니다.
  • 조립성 검토: 부품 간의 맞물림이나 조립 순서를 가상 환경에서 미리 검증하여 생산 현장에서의 시행착오를 방지합니다.

2. 설계 자산의 재활용성(Reuse) 및 표준화

  • 파라메트릭 설계로의 전환: 3D 모델로 관리하면 치수만 바꾸어 새로운 부품을 빠르게 파생시킬 수 있습니다. 수천 장의 2D 도면을 관리할 때 겪는 "이전 모델의 어느 치수를 참고했지?"라는 고민을 해결합니다.
  • 부품 표준화: 유사한 형상의 부품을 자동으로 분류하여 중복 설계를 방지하고, 회사가 보유한 설계 노하우(IP)를 데이터베이스화하여 관리할 수 있습니다.

 

3. 생산 및 품질 관리 효율화

  • 자동 CAM/CAE 연동: 3D 모델은 가공 기계(CNC)나 사출 금형 설계를 위한 CAM 데이터로 직접 변환이 가능합니다. 수동으로 도면을 해석해 수치를 입력할 필요가 없어 휴먼 에러가 사라집니다.
  • 직관적인 의사소통: 2D 도면은 숙련된 엔지니어만 해석 가능하지만, 3D 모델은 영업, 구매, 현장 작업자 등 누구나 형상을 즉각적으로 이해할 수 있어 부서 간 의사소통 비용이 획기적으로 낮아집니다.

 

4. 도면의 디지털 트랜스포메이션(DX)

  • 레거시 데이터의 자산화: 수천 장의 종이/PDF 도면은 단순한 기록물에 불과하지만, 3D 모델로 변환되는 순간 AI가 학습 가능한 '데이터'가 됩니다.
  • 유지보수 및 사후 관리: 제품 납품 후 유지보수 상황 발생 시, 3D 모델을 통해 즉시 필요한 부품 형상을 찾아내고 수리 과정을 가이드할 수 있어 고객 만족도가 높아집니다.

 

■ 2D에서 3D로 전환 시 고려해야 할 단계

단순히 모델을 만드는 것을 넘어, 이 전환 과정을 전략적인 시스템으로 구축해야 합니다.

  • 데이터 클렌징: 수천 장의 도면 중 자주 사용되는 핵심 부품(Top-runner)을 우선순위로 선정하여 작업을 시작합니다.
  • CSG 기반 모델링 표준화: 말씀하신 CSG 방식을 채택하면, 향후 설계자가 변경될 때도 복잡한 스케치 구속 조건에 얽매이지 않고 안정적인 모델 관리가 가능합니다.
  • 검증 로직 구축: 3D로 변환된 모델이 원본 2D 도면의 치수와 일치하는지 자동으로 비교하는 검증 프로세스를 병행해야 합니다.
2D 도면의 3D화는 단순한 변환 작업이 아니라 '설계 부서의 업무 방식을 데이터 중심(Data-driven)으로 바꾸는 강력한 체질 개선 작업'입니다.

이러한 전환 작업을 시작할 때, 가장 먼저 시급하게 3D화해야 할 '핵심 부품군'이 명확히 정해져 있으신가요? 그 우선순위에 따라 구현 난이도가 달라질 수 있습니다.

■ 시스템 구현

 

1. 도면 이미지 → 데이터 구조화 단계 (AI 사용)

  • 이것은 단순 이미지 처리(OpenCV 등)로 해결 불가능합니다.
  • 규칙 기반 파싱으로는 현실의 다양한 도면 스타일을 감당할 수 없습니다.
도면 이미지에서 읽어야 할 것들: AI 포함 구조 (실용적)
치수선 ──────→ "Ø25 ±0.02" 어디에 적용되는 치수인가?

형상선 ──────→ 이 선이 구멍인가, 돌출인가, 모따기인가?

기호  ──────→ ⊥, //, △ 등 GD&T 기호 해석

투영법 ──────→ 1각법/3각법 판단

숨은선 ──────→ 점선이 의미하는 내부 형상

단면도 ──────→ A-A 단면이 어떤 부위를 자른 것인가?
도면 이미지
    │
    ▼
Claude Vision API (1회 호출)
    │  → 형상 파악, 치수 추출, 관계 해석
    ▼
JSON 데이터 구조
{
  "features": [
    {"type": "box", "w": 100, "h": 50, "d": 30},
    {"type": "cylinder", "r": 10, "h": 50,
     "position": [25, 25, 0], "op": "cut"}
  ]
}
    │
    ▼
CSG 모델링 코드
(AI 없이 자동 실행, JSON → CSG 모델링 엔진)
    │
    ▼
.FCStd / .STEP 파일

가장 효율적인 구조는: AI를 "도면 해석기"로만 사용하고, 모델링 엔진은 완전히 코드로 구현하는 것입니다.

2. AI를 사용하여 데이터 구조화

프롬프트에 "규칙"을 명시 해야 합니다. ✅ AI에게 별도의 학습 과정 없이 바로 사용 가능 합니다. 프롬프트 자체가 "지시서" 역할을 합니다.

prompt = """
이 도면 이미지를 분석하여 아래 JSON 형식으로 출력하세요.

규칙:
- 치수선의 숫자를 정확히 읽을 것
- 투영법(1각/3각)을 판단할 것
- 구멍은 "cut" 타입으로 표현할 것
- 단위는 mm로 통일할 것

출력 형식:
{
  "projection": "third_angle",
  "features": [...]
}
"""

 

3.검증 방법

STEP 1: 자동 구조 검증 (즉시)
               - JSON 스키마 유효성 체크
               - 필수 필드 존재 여부
               - 치수값 범위 이상 감지

 

STEP 1: 자동 구조 검증 코드

import json
from jsonschema import validate

# JSON 스키마 정의
DRAWING_SCHEMA = {
    "type": "object",
    "required": ["projection", "unit", "features"],
    "properties": {
        "projection": {"enum": ["first_angle", "third_angle"]},
        "unit": {"enum": ["mm", "inch"]},
        "features": {
            "type": "array",
            "minItems": 1,
            "items": {
                "required": ["type", "operation"],
                "properties": {
                    "type": {"enum": ["box", "cylinder", "chamfer", "fillet"]},
                    "operation": {"enum": ["add", "cut"]},
                    "dimensions": {"type": "object"}
                }
            }
        }
    }
}

def validate_json(json_data):
    try:
        validate(instance=json_data, schema=DRAWING_SCHEMA)

        # 치수 이상값 체크
        for f in json_data["features"]:
            dims = f.get("dimensions", {})
            for key, val in dims.items():
                if val <= 0:
                    raise ValueError(f"치수 오류: {key} = {val}")
                if val > 10000:
                    raise ValueError(f"비정상 치수: {key} = {val}mm")

        print("✅ JSON 구조 검증 통과")
        return True

    except Exception as e:
        print(f"❌ 검증 실패: {e}")
        return False

 

STEP 2: 역검증 (AI 재활용)
              - JSON → 렌더링 이미지 생성
              - 원본 도면 이미지와 AI가 비교
              - 차이점 리포트 출력

 

STEP 2: AI 역검증 (핵심)

def reverse_verify(original_image_path, json_data):
    """
    원본 도면 + 생성된 JSON을 AI에게 동시에 제공
    → AI가 불일치 항목을 스스로 찾아냄
    """

    with open(original_image_path, "rb") as f:
        image_data = base64.b64encode(f.read()).decode()

    verify_prompt = f"""
    [원본 도면 이미지]와 [생성된 JSON]을 비교하세요.

    생성된 JSON:
    {json.dumps(json_data, ensure_ascii=False, indent=2)}

    검증 항목:
    1. 모든 치수가 도면과 일치하는가?
    2. 누락된 형상이 있는가?
    3. 구멍/돌출 방향이 맞는가?
    4. 전체적인 형상이 도면과 일치하는가?

    결과를 아래 형식으로만 출력:
    {{
        "match": true/false,
        "confidence": 0~100,
        "errors": ["오류1", "오류2", ...],
        "warnings": ["주의1", ...]
    }}
    """

    # Claude API 호출 (이미지 + JSON 동시 전송)
    response = call_claude_api(image_data, verify_prompt)
    return response

 

STEP 3: FreeCAD 치수 역추출 검증

def verify_with_freecad(json_data, fcstd_path):
    """
    FreeCAD 모델에서 실제 치수를 측정하여
    JSON 값과 자동 비교
    """
    script = f"""
import FreeCAD
import Part

doc = FreeCAD.openDocument("{fcstd_path}")
obj = doc.Objects[0]
bb = obj.Shape.BoundBox

result = {{
    "actual_x": bb.XLength,
    "actual_y": bb.YLength,
    "actual_z": bb.ZLength,
    "volume": obj.Shape.Volume
}}

import json
print(json.dumps(result))
"""
    # FreeCADCmd로 실행 후 결과 파싱
    output = run_freecadcmd(script)
    actual = json.loads(output)

    # JSON 기대값과 비교
    expected = json_data["features"][0]["dimensions"]
    errors = []

    tolerance = 0.01  # 허용 오차 0.01mm

    if abs(actual["actual_x"] - expected["width"]) > tolerance:
        errors.append(f"X 불일치: 기대 {expected['width']} / 실제 {actual['actual_x']}")

    return errors

전체 파이프라인 요약

도면 이미지
    │
    ▼
Claude Vision → JSON 생성
    │
    ├── STEP 1: 스키마 자동 검증 (0.1초)
    │           ↓ 실패시 → AI 재생성 요청
    │
    ├── STEP 2: AI 역검증 (2~3초, 소액 비용)
    │           ↓ 신뢰도 < 90% → 사람 검토 요청
    │
    ├── STEP 3: FreeCAD 치수 검증 (자동)
    │           ↓ 오차 > 0.01mm → 오류 리포트
    │
    └── ✅ 검증 완료 → JSON 확정 저장

 

아키텍처 다이어그램

반응형