howto:3d:freecad:creermacro

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
howto:3d:freecad:creermacro [2025/05/21 12:09] adminhowto:3d:freecad:creermacro [2025/05/21 14:46] (Version actuelle) admin
Ligne 1: Ligne 1:
 ======= Créer un macro dans FreeCAD ======= ======= Créer un macro dans FreeCAD =======
  
-Lorsqu'on applique une recette de fabrication régulièrement on n'a très vite envie d'automatiser le process pour ne plus avoir à répéter les mêmes actions. C'est le but d'une macroune série d'actions automatisées qui nous fera gagner du temps et évitera des erreurs de manipulation+Lorsqu'on applique une recette de fabrication régulièrement on n'a très vite envie d'automatiser le process pour ne plus avoir à répéter les mêmes actions. C'est le but d'une macro une série d'actions automatisées qui nous fera gagner du temps et évitera les erreurs de manipulation.
-C'est donc ce qui est arrivé à un adhérent du Fablab avec qui nous avons mis au point un flux de travail lui permettant de soustraire des volumes d'une surface non plane en utilisant divers ateliers et une succession d'étapes bien définies. Ce flux de travail étant désormais fiable, nous proposons d'écrire une macro afin de l'automatiser.+
  
-Les macros FreeCAD sont en langage Python. Depuis le menu Macro il est possible d'enregistrer une macro à partir des actions faites à la sourisUne autre méthode pour connaître les commandes consiste à ouvrir le panneau de console Python et les récupérer au fur et à mesure pour comprendre le principe.+C'est ce que nous avons proposé à un adhérent du Fablab avec qui nous avons mis au point un flux de travail lui permettant de soustraire des volumes d'une surface non plane en utilisant divers ateliers et une succession d'étapes bien définiesD'ailleurs vous trouverez dans l'article suivant les principes de ce type de modélisation : [[howto:3d:freecad:sketch_on_surface|]]
  
-Cet article vise donc à consigner sous forme de mémo les différents éléments qui nous ont servi à écrire la macro finale.+Son flux de travail étant désormais fiable, nous proposons d'écrire une macro afin de l'automatiser.
  
-===== Sélectionner un élément =====+Les macros FreeCAD sont en langage Python. Depuis le menu Macro il est possible d'enregistrer une macro à partir des actions faites à la souris. Une autre méthode pour connaître les commandes consiste à ouvrir le panneau de console Python et les récupérer au fur et à mesure pour en comprendre le principe. 
 + 
 +Cet article vise à consigner sous forme de mémo quelques éléments qui nous ont demandé un peu de recherche et servi à écrire la macro finale. 
 + 
 +===== Sélectionner/déselectionner un élément =====
  
 La sélection à la souris d'un élément se traduit en python par  La sélection à la souris d'un élément se traduit en python par 
  
-''Gui.Selection.addSelection('Nom du fichier','Nom du corps','Nom de l'objet.élémentT',X,Y,Z)''+  Gui.Selection.addSelection('Nom du fichier','Nom du corps','Nom de l'objet.élémentT',X,Y,Z)''
  
-exemple : Gui.Selection.addSelection('Modele3D','Body','Revolution.Face4',-1.76854,-14.5652,120)+exemple :  
 +  Gui.Selection.addSelection('Modele3D','Body','Revolution.Face4',-1.76854,-14.5652,120)
  
 Pour construire cette commande dans une macro il nous faut donc récupérer des variables à partir des éléments d'un fichier et du modèle : Pour construire cette commande dans une macro il nous faut donc récupérer des variables à partir des éléments d'un fichier et du modèle :
  
-''docname=FreeCAD.ActiveDocument.Name'' -> récupère le nom du fichier dans la variable "docname"+  docname=FreeCAD.ActiveDocument.Name'' -> récupère le nom du fichier dans la variable "docname" 
 +  sel=FreeCADGui.Selection.getSelection'' -> récupère la sélection dans la variable de type liste nommée "sel" 
 +  bodyname = sel[0]._Body.Name'' -> récupère le nom du corps de l'objet sélectionné dans la variable texte nommée "bodyname" 
 +  selObjectName = sel[0].Name'' -> renvoie le nom de du premier objet de la sélection - dans notre exemple : "Revolution" 
 +  SubElement  = FreeCADGui.Selection.getSelectionEx()[0]'' -> renvoie le type d'élément du sous objet (face, vertex,edge...) du premier objet de la sélection dans la variable de type liste "SubElement" 
 +  subElemName = SubElement.SubElementNames[0]''-> renvoie le nom du premier sous objet du premier objet de la sélection dans la variable texte "subElemName" - dans notre exemple : "Face4" 
 +  myelement = selObjectName+'.'+subElemName''-> permet de construire la chaîne de caractère qui sera injectée dans la commande qui nous servira à sélectionner l'objet : 
 + 
 +  Gui.Selection.addSelection(docname,bodyname,myelement) -> notre commande de sélection 
 +   
 +Pour tout désélectionner  
 +  Gui.Selection.clearSelection() 
 + 
 +===== Construire une fenêtre ===== 
 + 
 +Il faut au préalable charger la libraire QtGui
  
-''sel=FreeCADGui.Selection.getSelection'' -> récupère la sélection dans la variable de type liste nommée "sel"+  from PySide import QtGui
  
-''bodyname sel[0]._Body.Name'' -> récupère le nom du corps de l'objet sélectionné dans la variable texte nommée "bodyname"+Et on crée les éléments de la fenêtre : 
 +  msgb QtGui.QMessageBox() #On crée l'objet correspondant à la fenêtre 
 +  msgb.setWindowTitle("Titre de la fenêtre"
 +  msgb.setText("Ceci est le texte affiché dans la fenêtre+"\n"+"Ceci est une seconde ligne de texte"
 +  msgb.setIcon(QtGui.QMessageBox.Warning) #Icône affichée dan la fenêtre (peut être NoIcon, Question, Information, Warning, Critical) 
 +  validbutton = msgb.addButton(Bouton d'action", QtGui.QMessageBox.AcceptRole) #On ajoute un bouton d'action 
 +  cancelbutton = msgb.addButton("Bouton Annuler", QtGui.QMessageBox.RejectRole) #On ajoute un bouton pour annuler 
 +  msgb.exec() #On affiche al fenêtre 
 +  msgbRep = msgb.clickedButton() #On récupère l'action de l'utilisateur 
 +  if msgbRep == validbutton: #Si bouton d'action 
 +     #Action à réaliser 
 +  elif msgbRep == cancelbutton: 
 +     #Action pour annuler
  
-''selObjectName sel[0].Name'' -> renvoie le nom de du premier objet de la sélection - dans notre exemple : "Revolution"+===== Ouvrir un gestionnaire de fichiers ===== 
 +Exemple avec un filtre pour ouvrir un SVG : 
 +  QtGui.QFileDialog.getOpenFileName(QtGui.QApplication.activeWindow(),'Titre de la fenêtre',FreeCAD.ConfigGet('UserHomePath'),"Fichiers SVG (*.svg)"
 +   
 +===== Récupérer la valeur d'une contrainte =====
  
-''SubElement  FreeCADGui.Selection.getSelectionEx()[0]'' -> renvoie le type d'élément du sous objet (face, vertex,edge...) du premier objet de la sélection dans la variable de type liste "SubElement"+  variable App.ActiveDocument.getObject('nom_de_esquisse').getDatum('Nom de la contrainte ou numéro').Value
  
-''subElemName SubElement.SubElementNames[0]''-> renvoie le nom du premier sous objet du premier objet de la sélection dans la variable texte "subElemName" - dans notre exemple : "Face4"+Exemples 
 +  longueur = App.ActiveDocument.getObject('Sketch002').getDatum(9).Value -> récupère la valeur de la contrainte numéro 9 du Sketch001 
 +  largeur App.ActiveDocument.getObject('Sketch002').getDatum('largeur').Value -> récupère la valeur de la contrainte nommée "largeurdu Sketch001 
 +  
  
-''myelement selObjectName+'.'+subElemName''-> permet de construire la chaîne de caractère qui sera injectée dans la commande qui nous servira à sélectionner l'objet :+===== Faire une opération booléenne ===== 
  
-''Gui.Selection.addSelection(docname,bodyname,myelement)''+Il faut au préalable charger la libraire BOPFeatures qui est utilisée pour les opération booléennes de l'atelier Part :
  
 +  from BOPTools import BOPFeatures
  
 +puis :
 +  bp = BOPFeatures.BOPFeatures(App.activeDocument()) #On crée l'objet booléen
 +  bp.make_cut(["Objet1", "Objet2", ]) #On fait une soustraction entre les Objet1 et Objet2 - les opérations possibles sont : make_multi_fuse (Union) / make_multi_common (Intersection) / make_cut (Soustraction)
 +  App.ActiveDocument.recompute() #On calcule l'objet résultant
  • howto/3d/freecad/creermacro.1747822197.txt.gz
  • Dernière modification : 2025/05/21 12:09
  • de admin