build123d_nauka_joints/symulacja.py

50 lines
1.8 KiB
Python

from build123d import *
from ocp_vscode import show
# 1. Importujemy plik STEP
# (Ponieważ nie mam Twojego pliku, symuluję go tutaj jako 'imported_motor')
# imported_motor = import_step("motor_2207.step")
# --- SYMULACJA IMPORTU (Tylko dla przykładu) ---
with BuildPart() as m:
Cylinder(14, 15) # Dzwonek
with Locations((0,0,-2)):
Cylinder(4, 5) # Ośka wystająca w dół (dziwny silnik, ale niech będzie)
# Załóżmy, że ten silnik jest przesunięty w kosmos w pliku STEP:
imported_motor = m.part.moved(Location((100, 200, 50)))
# -----------------------------------------------
# 2. Szukamy miejsca na Jointa (To jest kluczowe przy STEPach!)
# Nie wiemy gdzie on jest (100, 200...), więc szukamy geometrycznie.
# Np. szukamy największej płaskiej ściany na samym spodzie silnika (podstawa)
# Axis.Z ujemne -> szukamy na dole
base_face = imported_motor.faces().sort_by(Axis.Z)[0]
# A może szukamy otworu na śrubę?
# Szukamy krawędzi (edges) będących okręgami, o promieniu 2mm (M4)
# screw_hole = imported_motor.edges().filter_by(GeomType.CIRCLE).filter_by(lambda e: e.radius == 2).first()
# 3. Naklejamy Jointa na znalezioną ścianę
# WAŻNE: Musimy użyć 'to_part', bo modyfikujemy istniejący obiekt, a nie builder.
imported_motor.joints["mount"] = RigidJoint(
label="mount",
to_part=imported_motor,
joint_location=Location(base_face.center()) # Centrum znalezionej ściany
)
# --- TERAZ MOŻEMY GO UŻYĆ ---
# Tworzymy ramię drona
with BuildPart() as arm_builder:
Box(100, 30, 4)
RigidJoint("motor_pad", joint_location=Location((20, 0, 0)))
arm = arm_builder.part
# Łączymy!
# Silnik (który był w kosmosie: 100, 200, 50) przyleci idealnie na ramię.
imported_motor.joints["mount"].connect_to(arm.joints["motor_pad"])
show(arm, imported_motor, render_joints=True)