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

자전거 뼈대 만들기 - 메인 커브 스케치 #2

by ToolBOX01 2026. 5. 25.
반응형

■ 현재 Open된 파일 이름 가져 오기

import FreeCAD as App
from PySide6 import QtWidgets

active_doc = App.activeDocument()

if active_doc is not None:
    doc_name = active_doc.Name
    doc_label = active_doc.Label

    msg = (
        f"문서 ID: {doc_name}\n"
        f"문서 제목 (Label): {doc_label}"
    )

    dialog = QtWidgets.QMessageBox()
    dialog.setWindowTitle("활성화된 문서 정보")
    dialog.setText(msg)
    dialog.setIcon(QtWidgets.QMessageBox.Icon.Information)
    dialog.exec()

else:
    dialog = QtWidgets.QMessageBox()
    dialog.setWindowTitle("문서 없음")
    dialog.setText("현재 열려 있는 문서가 없습니다.")
    dialog.setIcon(QtWidgets.QMessageBox.Icon.Warning)
    dialog.exec()

 

실행화면


■ 현재 Open된 파일의 스케치 이름도 가져오기

import FreeCAD as App
from PySide6 import QtWidgets

active_doc = App.activeDocument()

if active_doc is not None:
    doc_name = active_doc.Name
    doc_label = active_doc.Label

    # 스케치 목록 가져오기
    sketches = [
        obj for obj in active_doc.Objects
        if obj.TypeId == "Sketcher::SketchObject"
    ]

    if sketches:
        sketch_info = "\n".join(
            f"  - [{obj.Name}] {obj.Label}" for obj in sketches
        )
    else:
        sketch_info = "  (스케치 없음)"

    msg = (
        f"문서 ID: {doc_name}\n"
        f"문서 제목 (Label): {doc_label}\n"
        f"\n스케치 목록 ({len(sketches)}개):\n{sketch_info}"
    )

    dialog = QtWidgets.QMessageBox()
    dialog.setWindowTitle("활성화된 문서 정보")
    dialog.setText(msg)
    dialog.setIcon(QtWidgets.QMessageBox.Icon.Information)
    dialog.exec()

else:
    dialog = QtWidgets.QMessageBox()
    dialog.setWindowTitle("문서 없음")
    dialog.setText("현재 열려 있는 문서가 없습니다.")
    dialog.setIcon(QtWidgets.QMessageBox.Icon.Warning)
    dialog.exec()

실행화면


■ 현재 Open된 파일의 스케치 이름, 치수 이름 및 값 가겨오기

import math
import FreeCAD as App
from PySide6 import QtWidgets

active_doc = App.activeDocument()

if active_doc is not None:
    doc_name = active_doc.Name
    doc_label = active_doc.Label

    # 스케치 목록 가져오기
    sketches = [
        obj for obj in active_doc.Objects
        if obj.TypeId == "Sketcher::SketchObject"
    ]

    sketch_lines = []

    for sketch in sketches:
        sketch_lines.append(f"  ▶ [{sketch.Name}] {sketch.Label}")

        # 치수 제약 조건 필터링
        constraints = sketch.Constraints
        dim_constraints = [
            c for c in constraints
            if c.Type in (
                "Distance", "DistanceX", "DistanceY",
                "Radius", "Diameter", "Angle"
            )
        ]

        if dim_constraints:
            for c in dim_constraints:
                # 치수 이름 (사용자가 지정한 이름 없으면 Type으로 표시)
                c_name = c.Name if c.Name else f"({c.Type})"

                # 각도는 도(°) 단위, 나머지는 mm 단위
                if c.Type == "Angle":
                    c_value = f"{math.degrees(c.Value):.4f} °"
                else:
                    c_value = f"{c.Value:.4f} mm"

                sketch_lines.append(f"      - {c_name} : {c_value}  [{c.Type}]")
        else:
            sketch_lines.append("      (치수 제약 없음)")

    if sketch_lines:
        sketch_info = "\n".join(sketch_lines)
        sketch_header = f"스케치 목록 ({len(sketches)}개)"
    else:
        sketch_info = "  (스케치 없음)"
        sketch_header = "스케치 목록 (0개)"

    msg = (
        f"문서 ID: {doc_name}\n"
        f"문서 제목 (Label): {doc_label}\n\n"
        f"{sketch_header}:\n{sketch_info}"
    )

    dialog = QtWidgets.QMessageBox()
    dialog.setWindowTitle("활성화된 문서 정보")
    dialog.setText(msg)
    dialog.setIcon(QtWidgets.QMessageBox.Icon.Information)
    dialog.exec()

else:
    dialog = QtWidgets.QMessageBox()
    dialog.setWindowTitle("문서 없음")
    dialog.setText("현재 열려 있는 문서가 없습니다.")
    dialog.setIcon(QtWidgets.QMessageBox.Icon.Warning)
    dialog.exec()

 

실행화면

 


엑셀 시트 하나로 1,000개의 맞춤형 3D 도면 및 모델을 마우스 클릭 한 번에 완벽하게 찍어내는 '디지털 공장'을 구축하는 것이 가능 합니다.

 

자동화 매크로 방식은 대량의 3D 모델링 데이터를 처리할 때 엄청난 효율성을 제공하는 훌륭한 접근 방식

1. 압도적인 시간 절약 및 생산성 향상 (시간 비용 절감)

  • 수작업 대비 속도 차이: 사람의 손으로 1,000개의 파일을 열고, 치수를 바꾸고, 재계산하고, 다른 이름으로 저장하려면 파일당 최소 1~2분이 소요됩니다. 총 1,500~2,000분이 걸리는 중노동입니다.
  • 매크로 처리 속도: 컴퓨터는 이 작업을 파일당 수초 내에 처리하므로, 1,000개의 파일을 단 몇 분 만에 자동으로 생성합니다. 그동안 작업자는 다른 고부가가치 업무에 집중할 수 있습니다.

2. 휴먼 에러(Human Error) 제로화

  • 사람이 1,000번 반복하다 보면 치수 숫자를 잘못 입력하거나, 파일 이름에 오타를 내거나, 덮어쓰기를 하는 실수가 반드시 발생합니다.
  • 이 코드는 CSV 파일에 적힌 데이터 그대로 컴퓨터가 입력하기 때문에 데이터의 오염이나 오타가 발생할 확률이 0%입니다.

3. 데이터 관리의 중앙화 (엑셀/CSV 연동)

  • FreeCAD 프로그램을 일일이 켜서 모델을 수정할 필요가 없습니다.
  • 엔지니어나 기획자는 익숙한 Excel(또는 CSV) 프로그램에서 표 형태로 치수와 파일명을 한눈에 관리하고, 최종 확인된 시트만 매크로에 넣으면 되므로 데이터 관리가 매우 직관적이고 편리합니다.

4. 유연한 확장성 (변수 개수의 자유로움)

  • 제공해주신 코드는 치수이름1, 치수이름2, 치수이름3... 구조로 설계되어 있습니다.
  • 모델에 따라 제어해야 하는 치수가 2개에서 5개, 10개로 늘어나더라도 코드를 새로 짤 필요 없이 CSV 파일의 열(Column)만 옆으로 늘려주면 똑같이 동작합니다.

5. 원본 파일 보호 및 안정성

  • active_doc.save() 대신 active_doc.saveCopy(save_path)를 사용하고 있습니다.
  • 이는 마스터(템플릿) 모델 파일을 직접 수정하여 망가뜨리는 것이 아니라, 원본은 그대로 둔 채 복사본을 지정된 이름으로 뚝딱 만들어내는 방식이므로 작업 도중 원본이 손상될 위험이 전혀 없습니다.

 

by korealionkk@gmail.com

반응형