j'ai demandé à ChatGPT
Après 12 propositions et autant de retours de ma part (je n'ai fait aucune remarque sur le code python, juste des infos sur la géométrie), voila ce que ça me sortproposer une macro pour freecad créant une pièce de fixation pour un tuyau ayant un filetage extérieur M30 sur un reservoir cylindrique de 500mm de diamètre et 600mm de long. Le reservoir est posé au sol sur une de ses faces plane, le tuyau y est fixé à la moitié de sa hauteur et sort horizontalement. la pièce de fixation comporte 3 trous pour des vis M8 qui se visseront dans le réservoir. Elle est circulaire, son rayon est deux fois celui du tuyau et son épaisseur est de 5mm.
Code: Select all
import FreeCAD as App
import Part
from math import pi, cos, sin, radians
def create_fixation_piece():
# Paramètres du réservoir
reservoir_diametre = 500 # en mm
reservoir_longueur = 600 # en mm
tuyau_rayon = 30 / 2 # rayon du filetage extérieur du tuyau en mm
piece_epaisseur = 5 # épaisseur de la pièce de fixation en mm
vis_diametre = 8 # diamètre des vis M8 en mm
# Créer un nouveau document
doc = App.newDocument()
# Créer le réservoir cylindrique
reservoir = doc.addObject("Part::Cylinder", "Reservoir")
reservoir.Radius = reservoir_diametre / 2
reservoir.Height = reservoir_longueur
# Créer le tuyau
tuyau = doc.addObject("Part::Cylinder", "Tuyau")
tuyau.Radius = tuyau_rayon
tuyau.Height = reservoir_diametre # ajuster la hauteur du tuyau pour qu'il touche la face cylindrique du réservoir
# Calculer le point de contact entre le tuyau et le réservoir
contact_point = App.Vector(reservoir_longueur / 2, 0, reservoir_diametre / 2) # positionner le tuyau à la moitié de la hauteur et du diamètre du réservoir
normal_vector = App.Vector(0, 1, 0) # axe normal à la surface cylindrique du réservoir
tuyau.Placement.Base = contact_point
tuyau.Placement.Rotation = App.Rotation(normal_vector, 0) # aligner l'axe du tuyau avec l'axe normal
# Créer la pièce de fixation
piece = doc.addObject("Part::Cylinder", "PieceFixation")
piece.Radius = tuyau_rayon * 2
piece.Height = piece_epaisseur
piece.Placement.Base = contact_point + tuyau_rayon * normal_vector # positionner la pièce de fixation à l'extrémité du tuyau
# Créer les trous pour les vis
for i in range(3):
angle = i * 2 * pi / 3 # répartir les trous uniformément sur 360 degrés
x = (reservoir_diametre / 2 + vis_diametre) * cos(angle)
z = (reservoir_diametre / 2 + vis_diametre) * sin(angle)
hole = doc.addObject("Part::Cylinder", "Trou{}".format(i+1))
hole.Radius = vis_diametre / 2
hole.Height = piece_epaisseur
hole.Placement.Base = App.Vector(x, 0, z) # positionner les trous sur la surface de la pièce de fixation
piece_cut = doc.addObject("Part::Cut", "PieceFixation_Cut{}".format(i+1))
piece_cut.Base = piece
piece_cut.Tool = hole
# Fusionner la pièce de fixation avec le réservoir et le tuyau
fusion = doc.addObject("Part::MultiFuse", "Fusion")
fusion.Shapes = [reservoir, tuyau, piece] + [hole, piece_cut]
# Afficher le résultat
doc.recompute()
Gui.activeDocument().activeView().viewAxonometric()
Gui.SendMsgToActiveView("ViewFit")
create_fixation_piece()
Quelqu'un a plus de patience que moi pour essayer de lui faire cracher un code correct ?

EDIT : Si c'est utile je peux fournir l'historique complet.