Page 1 of 3
ChatGPT pour générer une macro
Posted: Thu May 25, 2023 7:30 pm
by flachyjoe
Salut,
j'ai demandé à ChatGPT
proposer 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.
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 sort
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()
- Capture d’écran_2023-05-25_21-26-15.png (46.27 KiB) Viewed 1212 times
Il y a de l'idée mais c'est pas encore ça…
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.
Re: ChatGPT pour générer une macro
Posted: Fri May 26, 2023 9:57 am
by CharlesM
Très intéressant, l'objectif est de lui faire réaliser la pièce dans son intégralité ? (Pour découvrir ce qu'il est possible de faire avec chatGPT)
Ou bien tu souhaites sortir un code pour d'autres besoins ? (Est-il envisageable de partir sur un modèle paramétré ?)
Re: ChatGPT pour générer une macro
Posted: Fri May 26, 2023 10:00 am
by openBrain
Peut être plus efficace en lui parlant en anglais non?
Re: ChatGPT pour générer une macro
Posted: Fri May 26, 2023 10:21 am
by papyblaise
pour avoir un récupérateur d'eau de pluie , c'est peut-être plus rapide d'aller chez BricoMachin , plutôt que de solliciter la terre entière , ça vat décourager les écolos même les plus activistes
Re: ChatGPT pour générer une macro
Posted: Fri May 26, 2023 10:35 am
by flachyjoe
@CharlesM c'est juste un test pour voir si c'est utilisable. C'est déjà paramétrique dans le sens où toutes les valeurs utilisées sont clairement commentées.
@openBrain Je ne crois pas que ça change quoi que ce soit.
J'ai tenté de lui faire utiliser l'atelier PartDesign mais ça veux pas.
J'ai testé aussi pour générer
un patch puredata c'est fonctionnel mais laborieux. Il a fallu que j’explique que certains objets n'avait pas d'entrée et quel était le chemin du signal audio.
Avec un fichier SVG ça marche mieux bien le premier échange soit épique :
User
give me a svg file with a black mountain and little boy smiling
ChatGPT
I'm sorry, but as a text-based AI model, I cannot directly generate or provide SVG files. However, I can describe how you can create an SVG file with a black mountain and a little boy smiling using a text description. You can then use a vector graphics software like Adobe Illustrator or Inkscape to bring your description to life.
Start by creating a new SVG file
[…]
User
svg file is xml so you can generate it
ChatGPT
Certainly! I apologize for the confusion. Here's an example of an SVG code that represents a black mountain and a little boy smiling:
- Capture d’écran_2023-05-26_12-31-09.png (3.38 KiB) Viewed 1066 times
Je lui ai fait rajouter au fur et à mesure plusieurs pics de tailles différentes, un dégradé sur les montagnes, une texture répétitive pour faire de l'herbe, une rivière et changé le petit garçon qui sourit pour un bonhomme en batons.
- Capture d’écran_2023-05-26_12-28-16.png (11.2 KiB) Viewed 1066 times
Re: ChatGPT pour générer une macro
Posted: Fri May 26, 2023 12:30 pm
by Cuq
flachyjoe wrote: ↑Fri May 26, 2023 10:35 am
@openBrain Je ne crois pas que ça change quoi que ce soit.
Si ca peut changer , comme ChatGpt est plus entraîné sur des pages en Anglais qu'en français , théoriquement la réponse pourrait être différente (et elle l'est dans mon cas avec quelques codes en plus en anglais).
J'ai demandé un truc simple :
Code: Select all
Can you write me a macro in python code to generate a star in FreeCad using the PartDesign workshop ?
Après 4 itérations le code :
Code: Select all
import FreeCAD as App
import PartDesign
import Sketcher
import math
def create_star(radius, num_points):
doc = App.newDocument()
# Create a new body
body = doc.addObject('PartDesign::Body', 'Body')
# Create a new sketch in the body
sketch = body.newObject('Sketcher::SketchObject', 'Sketch')
sketch.Support = (body, "Face")
sketch.MapMode = "Deactivated"
# Add segment to form a star
angle = 360 / num_points
for i in range(num_points):
if i % 2 == 0:
x1 = radius * math.cos(math.radians(i * angle))
y1 = radius * math.sin(math.radians(i * angle))
x1b = radius / 2 * math.cos(math.radians((i+1) * angle))
y1b = radius / 2 * math.sin(math.radians((i+1) * angle))
else:
x2 = radius / 2 * math.cos(math.radians(i * angle))
y2 = radius / 2 * math.sin(math.radians(i * angle))
x2b = radius * math.cos(math.radians((i+1) * angle))
y2b = radius * math.sin(math.radians((i+1) * angle))
sketch.addGeometry(Part.LineSegment(App.Vector(x1,y1,0),App.Vector(x2,y2,0)),False)
sketch.addGeometry(Part.LineSegment(App.Vector(x1b,y1b,0),App.Vector(x2b,y2b,0)),False)
# Close the sketch
sketch.solve()
# Create a pad from the sketch
pad = body.newObject('PartDesign::Pad', 'Pad')
pad.Profile = sketch
pad.Length = 1.0 # Adjust the length of the pad as needed
# Update the view
App.ActiveDocument.recompute()
# Example usage
create_star(20, 10)
Le résultat :
- chatGpt.PNG (15.32 KiB) Viewed 1028 times
Ce qui est bizarre c'est que j'ai posé 3 fois la même question (copier coller ) dans 3 sessions différentes . Et j'ai eu 3 Sketchs d'étoile différents.
- Sketch1.PNG (24.42 KiB) Viewed 1028 times
- Sketch2.PNG (17.68 KiB) Viewed 1028 times
- Sketch3.PNG (29.1 KiB) Viewed 1028 times
Re: ChatGPT pour générer une macro
Posted: Fri May 26, 2023 1:14 pm
by papyblaise
y zon rien compris je suis sûr que tu voulais ça
Re: ChatGPT pour générer une macro
Posted: Fri May 26, 2023 3:26 pm
by Cuq
Là par contre ChatGPT a été très bon en 2 fois ( petit correction sur méthode de création des cercles ) :
La demande en Français :
Code: Select all
Peux tu me créer une Macro FreeCad en utilisant l'atelier PartDesign pour créer une bride circulaire de diamètre 120 mm d'épaisseur 20 mm avec un alésage centrale de diamètre 80 mm avec 6 passages de vis M12 uniformément répartis sur un diamètre de 100 mm
Le correctif demandé j'ai juste donné l'erreur affiché dans FreeCad
Code: Select all
cercle_exterieur = sketch_exterieur.addCircle(0, 0, diametre_exterieur / 2.0)
<class 'AttributeError'>: 'Sketcher.SketchObject' object has no attribute 'addCircle'
Le code obtenu :
Code: Select all
import FreeCAD as App
import FreeCADGui as Gui
import PartDesign
import math
def create_circular_flange():
# Paramètres
diametre_exterieur = 120.0
epaisseur = 20.0
diametre_alesage = 80.0
diametre_passages_vis = 12.0
nombre_passages_vis = 6
rayon_cercle_passages_vis = 50.0
# Création d'un nouveau document PartDesign
doc = App.newDocument("BrideCirculaire")
Gui.activeDocument().activeView().viewAxonometric()
# Création du corps principal
corps_principal = doc.addObject('PartDesign::Body', 'CorpsPrincipal')
# Création du plan de base
plan_base = doc.addObject('PartDesign::Plane', 'PlanBase')
plan_base.Length = 1000.0 # Valeur arbitraire pour la taille du plan
doc.recompute()
# Création du sketch du disque extérieur
sketch_exterieur = doc.addObject('Sketcher::SketchObject', 'SketchExterieur')
sketch_exterieur.Support = (plan_base, ['Face'])
doc.recompute()
# Dessin du cercle extérieur
cercle_exterieur = sketch_exterieur.addGeometry(Part.Circle(App.Vector(0, 0, 0), App.Vector(0, 0, 1), diametre_exterieur / 2.0))
doc.recompute()
# Création du pad du disque extérieur
pad_exterieur = doc.addObject('PartDesign::Pad', 'PadExterieur')
pad_exterieur.Profile = sketch_exterieur
pad_exterieur.Length = epaisseur
pad_exterieur.Reversed = 1
doc.recompute()
# Création du sketch de l'alesage central
sketch_alesage = doc.addObject('Sketcher::SketchObject', 'SketchAlesage')
sketch_alesage.Support = (plan_base, ['Face'])
doc.recompute()
# Dessin du cercle de l'alesage central
cercle_alesage = sketch_alesage.addGeometry(Part.Circle(App.Vector(0, 0, 0), App.Vector(0, 0, 1), diametre_alesage / 2.0))
doc.recompute()
# Création du pocket de l'alesage central
pocket_alesage = doc.addObject('PartDesign::Pocket', 'PocketAlesage')
pocket_alesage.Profile = sketch_alesage
pocket_alesage.Length = epaisseur
doc.recompute()
# Création des passages de vis
angle_entre_passages = 360.0 / nombre_passages_vis
for i in range(nombre_passages_vis):
angle = math.radians(i * angle_entre_passages)
x = rayon_cercle_passages_vis * math.cos(angle)
y = rayon_cercle_passages_vis * math.sin(angle)
# Création du sketch du passage de vis
sketch_passage_vis = doc.addObject('Sketcher::SketchObject', 'SketchPassageVis{}'.format(i+1))
sketch_passage_vis.Support = (plan_base, ['Face'])
doc.recompute()
# Dessin du cercle du passage de vis
cercle_passage_vis = sketch_passage_vis.addGeometry(Part.Circle(App.Vector(x, y, 0), App.Vector(0, 0, 1), diametre_passages_vis / 2.0))
doc.recompute()
# Création du pocket du passage de vis
pocket_passage_vis = doc.addObject('PartDesign::Pocket', 'PocketPassageVis{}'.format(i+1))
pocket_passage_vis.Profile = sketch_passage_vis
pocket_passage_vis.Length = epaisseur
doc.recompute()
# Union des différentes parties
doc.recompute()
corps_principal.addObject(pad_exterieur)
corps_principal.addObject(pocket_alesage)
for i in range(nombre_passages_vis):
passage_vis = doc.getObject('PocketPassageVis{}'.format(i+1))
corps_principal.addObject(passage_vis)
doc.recompute()
# Exécution de la macro
create_circular_flange()
- Bride.PNG (44.49 KiB) Viewed 956 times
Alors pour chipoter on va dire que le diamètre des perçages pour le diamètre des perçages pour le passage de vis est à 12 pour 12 ... Donc j'ai posé la question :
- ChatGptRep.png (25.75 KiB) Viewed 956 times
Voilà il vous reste à remplacer 12 par 14,5 ou à lui demander de le faire
Re: ChatGPT pour générer une macro
Posted: Fri May 26, 2023 3:40 pm
by papyblaise
chiper pour chipotage il me faut une ligne avec PartDesign , ou Part et de plus il me semble y avoir un artifac bleu clair sur fond d'écran plus foncé
Re: ChatGPT pour générer une macro
Posted: Fri May 26, 2023 4:04 pm
by Cuq
papyblaise wrote: ↑Fri May 26, 2023 3:40 pm
chiper pour chipotage il me faut une ligne avec PartDesign , ou Part et de plus il me semble y avoir un artifac bleu clair sur fond d'écran plus foncé
Il a l'oeil l'ancien .... Mais pas suffisament pour prendre en défaut une IA .. C'est normal ce que tu vois c'est parce que j'utilise la version Link et j'ai l'option
MakeInternal d'activé par défaut ... Mais sur une version standard ou si l'on active pas l'option c'est bon :
- autu.PNG (17.73 KiB) Viewed 877 times
- ChatGPT_Test2.PNG (54.89 KiB) Viewed 918 times
J'en profite pour compléter .. Je lui ai demandé :
- ChatGPT3.PNG (6.2 KiB) Viewed 918 times
Il a pas compris .. Il a interprété ça comme rajouter 5 mm sur les diamètres créés. Par contre il a fait ca en rajoutant une contrainte de diamètre . Donc finalement après 2 ou 3 ajustements j'ai mon code; sans les chanfreins, mais avec une contrainte de diamètre sur chaque esquisse. Ce qui est plutôt Cool.
Code: Select all
import FreeCAD as App
import FreeCADGui as Gui
import PartDesign
import math
def create_circular_flange():
# Paramètres
diametre_exterieur = 120.0
epaisseur = 20.0
diametre_alesage = 80.0
diametre_passages_vis = 14.5
nombre_passages_vis = 6
rayon_cercle_passages_vis = 50.0
# Création d'un nouveau document PartDesign
doc = App.newDocument("BrideCirculaire")
Gui.activeDocument().activeView().viewAxonometric()
# Création du corps principal
corps_principal = doc.addObject('PartDesign::Body', 'CorpsPrincipal')
# Création du plan de base
plan_base = doc.addObject('PartDesign::Plane', 'PlanBase')
plan_base.Length = 1000.0 # Valeur arbitraire pour la taille du plan
doc.recompute()
# Création du sketch du disque extérieur
sketch_exterieur = doc.addObject('Sketcher::SketchObject', 'SketchExterieur')
sketch_exterieur.Support = (plan_base, ['Face'])
doc.recompute()
# Dessin du cercle extérieur
cercle_exterieur = sketch_exterieur.addGeometry(Part.Circle(App.Vector(0, 0, 0), App.Vector(0, 0, 1), diametre_exterieur / 2.0))
doc.recompute()
# Ajout du chanfrein sur le cercle extérieur
sketch_exterieur.addConstraint(Sketcher.Constraint('Diameter', 0, diametre_exterieur))
doc.recompute()
# Création du pad du disque extérieur
pad_exterieur = doc.addObject('PartDesign::Pad', 'PadExterieur')
pad_exterieur.Profile = sketch_exterieur
pad_exterieur.Length = epaisseur
pad_exterieur.Reversed = 1
doc.recompute()
# Création du sketch de l'alesage central
sketch_alesage = doc.addObject('Sketcher::SketchObject', 'SketchAlesage')
sketch_alesage.Support = (plan_base, ['Face'])
doc.recompute()
# Dessin du cercle de l'alesage central
cercle_alesage = sketch_alesage.addGeometry(Part.Circle(App.Vector(0, 0, 0), App.Vector(0, 0, 1), diametre_alesage / 2.0))
doc.recompute()
# Ajout du chanfrein sur le cercle de l'alesage central
sketch_alesage.addConstraint(Sketcher.Constraint('Diameter', 0, diametre_alesage))
doc.recompute()
# Création du pocket de l'alesage central
pocket_alesage = doc.addObject('PartDesign::Pocket', 'PocketAlesage')
pocket_alesage.Profile = sketch_alesage
pocket_alesage.Length = epaisseur
doc.recompute()
# Création des passages de vis
angle_entre_passages = 360.0 / nombre_passages_vis
for i in range(nombre_passages_vis):
angle = math.radians(i * angle_entre_passages)
x = rayon_cercle_passages_vis * math.cos(angle)
y = rayon_cercle_passages_vis * math.sin(angle)
# Création du sketch du passage de vis
sketch_passage_vis = doc.addObject('Sketcher::SketchObject', 'SketchPassageVis{}'.format(i+1))
sketch_passage_vis.Support = (plan_base, ['Face'])
doc.recompute()
# Dessin du cercle du passage de vis
cercle_passage_vis = sketch_passage_vis.addGeometry(Part.Circle(App.Vector(x, y, 0), App.Vector(0, 0, 1), diametre_passages_vis / 2.0))
doc.recompute()
# Ajout du chanfrein sur le cercle du passage de vis
sketch_passage_vis.addConstraint(Sketcher.Constraint('Diameter', 0, diametre_passages_vis))
doc.recompute()
# Création du pocket du passage de vis
pocket_passage_vis = doc.addObject('PartDesign::Pocket', 'PocketPassageVis{}'.format(i+1))
pocket_passage_vis.Profile = sketch_passage_vis
pocket_passage_vis.Length = epaisseur
doc.recompute()
# Union des différentes parties
doc.recompute()
corps_principal.addObject(pad_exterieur)
corps_principal.addObject(pocket_alesage)
for i in range(nombre_passages_vis):
passage_vis = doc.getObject('PocketPassageVis{}'.format(i+1))
corps_principal.addObject(passage_vis)
doc.recompute()
# Exécution de la macro
create_circular_flange()