반응형
■ 파이썬 코드로 사각기둥을 만드는 코드입니다.
새로운 다큐멘트를 만들고, Body를 만들고, XY 평면에 100 * 50 사각형 커브를 만들었습니다. AI에게 완벽한 치수를 넣은 도면을 보여 주었으나, 일부 치수를 누락 하였습니다. 또한 구속 (수직, 수평)조건을 넣지 못했습니다. 4개의 "라인"으로 구성 되었고, 스케치 기준 좌표계를 중심으로 인식 하였습니다.

코드 :
import FreeCAD as App
import FreeCADGui as Gui
import Part
import Sketcher
from PySide6 import QtWidgets, QtCore, QtGui # ★ PySide2 → PySide6
# ============================================================
# 1. 문서 생성
# ============================================================
doc_name = "korea"
doc = App.newDocument(doc_name)
Gui.activateWorkbench("PartDesignWorkbench")
# ============================================================
# 2. Body 생성
# ============================================================
body = doc.addObject("PartDesign::Body", "Body")
doc.recompute()
# ============================================================
# 3. Sketch 생성 및 XY-plane 부착
# ============================================================
sketch = body.newObject("Sketcher::SketchObject", "Sketch")
xy_plane = body.Origin.OriginFeatures[3]
sketch.AttachmentSupport = [(xy_plane, '')]
sketch.MapMode = 'FlatFace'
doc.recompute()
# ============================================================
# 4. 100 x 50 사각형 스케치 (원점 중심)
# ============================================================
p1 = App.Vector(-50.0, -25.0, 0.0)
p2 = App.Vector( 50.0, -25.0, 0.0)
p3 = App.Vector( 50.0, 25.0, 0.0)
p4 = App.Vector(-50.0, 25.0, 0.0)
sketch.addGeometry(Part.LineSegment(p1, p2), False) # 0: 하단 가로선
sketch.addGeometry(Part.LineSegment(p2, p3), False) # 1: 우측 세로선
sketch.addGeometry(Part.LineSegment(p3, p4), False) # 2: 상단 가로선
sketch.addGeometry(Part.LineSegment(p4, p1), False) # 3: 좌측 세로선
# 수평(Horizontal) 및 수직(Vertical) 구속조건
sketch.addConstraint(Sketcher.Constraint('Horizontal', 0)) # 0번 하단 선 수평
sketch.addConstraint(Sketcher.Constraint('Horizontal', 2)) # 2번 상단 선 수평
sketch.addConstraint(Sketcher.Constraint('Vertical', 1)) # 1번 우측 선 수직
sketch.addConstraint(Sketcher.Constraint('Vertical', 3)) # 3번 좌측 선 수직
# Constraint: Coincident (꼭짓점 연결)
sketch.addConstraint(Sketcher.Constraint('Coincident', 0, 2, 1, 1))
sketch.addConstraint(Sketcher.Constraint('Coincident', 1, 2, 2, 1))
sketch.addConstraint(Sketcher.Constraint('Coincident', 2, 2, 3, 1))
sketch.addConstraint(Sketcher.Constraint('Coincident', 3, 2, 0, 1))
# Constraint: 세로 높이 50mm
sketch.addConstraint(Sketcher.Constraint('DistanceY', 1, 1, 1, 2, 50.0))
# Constraint: 가로 길이 100mm
sketch.addConstraint(Sketcher.Constraint('DistanceX', 0, 1, 0, 2, 100.0))
# 원점에서 상단선(2번선)까지 세로 거리 25mm (중심 고정)
sketch.addConstraint(Sketcher.Constraint('DistanceY', -1, 1, 2, 1, 25.0))
# 원점에서 우측선(1번선)까지 가로 거리 50mm (중심 고정)
sketch.addConstraint(Sketcher.Constraint('DistanceX', -1, 1, 1, 1, 50.0))
doc.recompute()
# ============================================================
# 5. Pad (높이 30mm)
# ============================================================
pad = body.newObject("PartDesign::Pad", "Pad")
pad.Profile = sketch
pad.Length = 30.0
doc.recompute()
# ============================================================
# [추가] 뷰 제어: ISO 뷰 적용 및 화면 맞춤
# ============================================================
Gui.activeView().viewIsometric() # 화면을 ISO(등각) 뷰로 전환
Gui.SendMsgToActiveView("ViewFit") # 모델이 화면에 꽉 차도록 자동 줌
# ============================================================
# 6. 완료 팝업
# ============================================================
class SuccessDialog(QtWidgets.QDialog):
def __init__(self):
super().__init__(Gui.getMainWindow())
self.setWindowTitle("✅ 생성 완료")
self.setFixedSize(460, 310)
self.setWindowFlags(self.windowFlags() | QtCore.Qt.WindowType.WindowStaysOnTopHint)
self.setStyleSheet("""
QDialog { background-color: #1e1e2e; border-radius: 12px; }
QLabel#title { color: #cdd6f4; font-size: 18px; font-weight: bold; }
QLabel#body { color: #a6e3a1; font-size: 13px; }
QLabel#detail{ color: #89b4fa; font-size: 12px; }
QPushButton {
background-color: #89b4fa; color: #1e1e2e;
border: none; border-radius: 8px;
padding: 8px 32px; font-size: 13px; font-weight: bold;
}
QPushButton:hover { background-color: #b4d0ff; }
""")
layout = QtWidgets.QVBoxLayout()
layout.setContentsMargins(30, 28, 30, 24)
layout.setSpacing(12)
title_row = QtWidgets.QHBoxLayout()
icon_label = QtWidgets.QLabel("🎉")
icon_label.setStyleSheet("font-size: 28px;")
title_label = QtWidgets.QLabel("모델 생성이 완료되었습니다!")
title_label.setObjectName("title")
title_row.addWidget(icon_label)
title_row.addSpacing(8)
title_row.addWidget(title_label)
title_row.addStretch()
layout.addLayout(title_row)
line = QtWidgets.QFrame()
line.setFrameShape(QtWidgets.QFrame.Shape.HLine)
line.setStyleSheet("color: #313244;")
layout.addWidget(line)
body_label = QtWidgets.QLabel(
"✔ 문서명 : korea\n"
"✔ 스케치 : 100 × 50 mm (XY 평면, 원점 중심)\n"
"✔ 구속조건 : 수평/수직 각2 / 일치×4 / 치수×4 (X:50mm, Y:25mm 정렬)\n"
"✔ 패드 높이 : 30 mm\n"
"✔ 화면 뷰 : ISO 뷰 (Isometric) 자동 정렬"
)
body_label.setObjectName("body")
layout.addWidget(body_label)
detail_label = QtWidgets.QLabel("ISO 뷰 적용 및 ViewFit 처리가 완료되었습니다.")
detail_label.setObjectName("detail")
layout.addWidget(detail_label)
layout.addStretch()
btn = QtWidgets.QPushButton("확인")
btn.clicked.connect(self.accept)
btn_row = QtWidgets.QHBoxLayout()
btn_row.addStretch()
btn_row.addWidget(btn)
btn_row.addStretch()
layout.addLayout(btn_row)
self.setLayout(layout)
SuccessDialog().exec_()
# 하단 콘솔 출력 문구 업데이트
App.Console.PrintMessage("\n========================================\n")
App.Console.PrintMessage(" 성공: 'korea' 문서에 100x50 두께 30 패드 생성 완료!\n")
App.Console.PrintMessage(" 구속조건: 중심 고정 치수 포함 완전 구속 완료\n")
App.Console.PrintMessage(" 뷰 제어: ISO 뷰(viewIsometric) 적용 완료\n")
App.Console.PrintMessage("========================================\n")
위 내용 코드를 활용하면 다양한 모양을 만들수 있을것 입니다. 물론 AI로 만들수 있을것 입니다.
AI에게 학습을 시키면 됩니다. 노트북 LM을 활용 하세요. . .
by korealionkk@gmail.com
반응형
'업무 자동화 > FreeCAD' 카테고리의 다른 글
| Python] 정오각형 기둥 만들기 (0) | 2026.05.22 |
|---|---|
| Python] 스케치 모드의 기능 제약 (0) | 2026.05.22 |
| 모델링 연습 (0) | 2026.05.21 |
| Python] 새로운 파일 만들기 (0) | 2026.05.19 |
| 매크로 사용 하기 (0) | 2026.05.18 |