ChatGPT pour générer une macro

Forum destiné aux questions et discussions en français
Forum rules
Be nice to others! Read the FreeCAD code of conduct!
User avatar
flachyjoe
Veteran
Posts: 1869
Joined: Sat Mar 31, 2012 12:00 pm
Location: Limoges, France

ChatGPT pour générer une macro

Post 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
Capture d’écran_2023-05-25_21-26-15.png (46.27 KiB) Viewed 1214 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.
- Flachy Joe -
Image
CharlesM
Posts: 15
Joined: Thu Feb 02, 2023 4:14 pm

Re: ChatGPT pour générer une macro

Post 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é ?)
openBrain
Veteran
Posts: 9034
Joined: Fri Nov 09, 2018 5:38 pm
Contact:

Re: ChatGPT pour générer une macro

Post by openBrain »

Peut être plus efficace en lui parlant en anglais non?
User avatar
papyblaise
Veteran
Posts: 7872
Joined: Thu Jun 13, 2019 4:28 pm
Location: France

Re: ChatGPT pour générer une macro

Post 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
User avatar
flachyjoe
Veteran
Posts: 1869
Joined: Sat Mar 31, 2012 12:00 pm
Location: Limoges, France

Re: ChatGPT pour générer une macro

Post 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
Capture d’écran_2023-05-26_12-31-09.png (3.38 KiB) Viewed 1068 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
Capture d’écran_2023-05-26_12-28-16.png (11.2 KiB) Viewed 1068 times
- Flachy Joe -
Image
User avatar
Cuq
Posts: 145
Joined: Tue Jul 06, 2021 10:07 am

Re: ChatGPT pour générer une macro

Post 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
chatGpt.PNG (15.32 KiB) Viewed 1030 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
Sketch1.PNG (24.42 KiB) Viewed 1030 times
Sketch2.PNG
Sketch2.PNG (17.68 KiB) Viewed 1030 times
Sketch3.PNG
Sketch3.PNG (29.1 KiB) Viewed 1030 times
Last edited by Cuq on Fri May 26, 2023 4:47 pm, edited 1 time in total.
User avatar
papyblaise
Veteran
Posts: 7872
Joined: Thu Jun 13, 2019 4:28 pm
Location: France

Re: ChatGPT pour générer une macro

Post by papyblaise »

y zon rien compris je suis sûr que tu voulais ça
Attachments
super star.JPG
super star.JPG (30.29 KiB) Viewed 1004 times
super star.FCStd
(39.87 KiB) Downloaded 19 times
User avatar
Cuq
Posts: 145
Joined: Tue Jul 06, 2021 10:07 am

Re: ChatGPT pour générer une macro

Post 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
Bride.PNG (44.49 KiB) Viewed 958 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
ChatGptRep.png (25.75 KiB) Viewed 958 times

Voilà il vous reste à remplacer 12 par 14,5 ou à lui demander de le faire :)
User avatar
papyblaise
Veteran
Posts: 7872
Joined: Thu Jun 13, 2019 4:28 pm
Location: France

Re: ChatGPT pour générer une macro

Post 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é
User avatar
Cuq
Posts: 145
Joined: Tue Jul 06, 2021 10:07 am

Re: ChatGPT pour générer une macro

Post 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
autu.PNG (17.73 KiB) Viewed 879 times
ChatGPT_Test2.PNG
ChatGPT_Test2.PNG (54.89 KiB) Viewed 920 times
J'en profite pour compléter .. Je lui ai demandé :
ChatGPT3.PNG
ChatGPT3.PNG (6.2 KiB) Viewed 920 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()

Last edited by Cuq on Fri May 26, 2023 5:16 pm, edited 1 time in total.
Post Reply