50 lines
1.8 KiB
Python
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)
|