[PYTHON] Astuces

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

[PYTHON] Astuces

Post by flachyjoe »

Bonjour,
certains d'entre nous apprennent le python grâce à FreeCAD, je propose donc de partager nos astuces ici.

Pour commencer, une histoire d'accents :
J'avais pris l'habitude de ne pas mettre d'accent dans mes scripts car j'obtenais alors une erreur, la solution pour retrouver nos chers glyphes est de mettre cette ligne en entête (1e ou 2d ligne du fichier):

Code: Select all

# -*- coding: utf-8 -*-
Ensuite des raccourcis clavier : à moins d'être adepte du menu contextuel vous n'aurez sans doute pas remarqué que FreeCad propose des raccourcis pour commenter/décommenter du code dans l'éditeur, il s'agit de Alt+C et Alt+U

De quoi se simplifier la vie ;)
Last edited by flachyjoe on Fri Mar 01, 2013 4:16 pm, edited 1 time in total.
- Flachy Joe -
Image
mario52
Veteran
Posts: 4674
Joined: Wed May 16, 2012 2:13 pm

Re: Astuces python

Post by mario52 »

Bonjour
Dans la console Python de FreeCAD, la frappe sur la touche escape permet de commenter la ligne courante.
mario
Last edited by mario52 on Tue Mar 05, 2013 8:06 pm, edited 2 times in total.
Maybe you need a special feature, go into Macros_recipes and Code_snippets, Topological_data_scripting.
My macros on Gist.github here complete macros Wiki and forum.
User avatar
flachyjoe
Veteran
Posts: 1869
Joined: Sat Mar 31, 2012 12:00 pm
Location: Limoges, France

Re: Astuces python

Post by flachyjoe »

Salut,
mario52 wrote:ouvrir un post FR dédié à la programmation FreeCAD et Python qu'en penses tu ?
Je pense que c'est beaucoup plus clair si il y a un post par question, par contre on peut prendre l'habitude de faire précéder le titre de ces posts par [PYTHON] pour les repérer facilement.
Last edited by flachyjoe on Mon Mar 04, 2013 6:31 pm, edited 1 time in total.
- Flachy Joe -
Image
User avatar
flachyjoe
Veteran
Posts: 1869
Joined: Sat Mar 31, 2012 12:00 pm
Location: Limoges, France

Re: [PYTHON] Astuces

Post by flachyjoe »

Astuce pour afficher un message dans la console depuis un script :

Le module Console de FreeCAD permet d'afficher des messages dans la "Vue Rapport", on a 3 procédures à notre disposition :
  • - PrintMessage qui affiche le message en noir
    - PrintWarning qui l'affiche en orange
    - PrintError qui l'affiche en rouge
Ces fonctions possèdent des raccourcis, respectivement Msg(), Wrn() et Err().
Exemple:

Code: Select all

# -*- coding: utf-8 -*-
Msg("Message d'information.")
Err("Erreur !")
Un problème apparaît rapidement : tous les messages sont collés, comment faire un saut de ligne ?
Il faut ajouter les caractères "\r\n" à l'endroit voulu. En règle générale à la fin de tous les messages.

Code: Select all

Msg("Une ligne de texte\r\n")
Msg("Une autre ligne de texte\r\n")
Si on veut afficher un nombre ça fonctionne aussi:

Code: Select all

Msg(len(FreeCADGui.Selection.getSelection())
Mais si on veut afficher un saut de ligne à la suite d'un nombre, il faut convertir le nombre en chaîne de caractère avec la fonction str, pareil pour intégrer une variable numérique dans le texte :

Code: Select all

Msg("Il y a "+str(len(FreeCADGui.Selection.getSelection())) +" objets sélectionnés\r\n")
NB : le dernier message affiché est aussi visible dans la barre d'état.

Amusez vous bien !

Edit : correction de fautes de frape dans les 2 derniers exemples, merci mario.
Edit2 : découverte des raccourcis.
Last edited by flachyjoe on Wed Mar 27, 2013 6:23 pm, edited 1 time in total.
- Flachy Joe -
Image
User avatar
flachyjoe
Veteran
Posts: 1869
Joined: Sat Mar 31, 2012 12:00 pm
Location: Limoges, France

Re: [PYTHON] Astuces

Post by flachyjoe »

Astuce pour forcer le re-chargement d'un module
Le contexte : Lors de la création d'un script importable (cad avec l'extension .py), il faut, pour le tester, créer un autre script qui l'importe. Or les modifications apportées au modules ne sont pas prises en compte tant que le module n'est pas re-chargé (il reste en cache). Ce n'est donc pas pratique du tout pour débugger, puisqu'il faudrait fermer et réouvrir FreeCAD à chaque fois !

L'astuce consiste à dé-importer le module avant de le ré-importer.
Un exemple avec le fichier MyModule.py importé dans test.FCMacro :

Code: Select all

# test.FCMacro
# -*- coding: utf-8 -*-

if sys.modules.__contains__("MyModule"):
	del sys.modules["MyModule"]
import MyModule

# Utilisation du module MyModule
- Flachy Joe -
Image
User avatar
flachyjoe
Veteran
Posts: 1869
Joined: Sat Mar 31, 2012 12:00 pm
Location: Limoges, France

Re: [PYTHON] Astuces

Post by flachyjoe »

Partager des paramètres entre des scripts / variables globales

Voila une manière de conserver des valeurs entre plusieurs exécutions d'un script ou de partager des paramètres entre plusieurs scripts.
Un objet rf existe dans toutes les instances et fourni ces méthodes :

Clear(), IsEmpty() Vider tout, vérifier s'il y a du contenu.
Export(filename), Import(filename), Insert(filename) Pour sauvegarder et charger les paramètres sous forme de fichier xml
SetBool(name, value), SetFloat(name, value), SetInt(name, value), SetString(name, value), SetUnsigned(name, value) Pour affecter une valeur à un nom.
GetBool(name), GetFloat(name), GetInt(name), GetString(name), GetUnsigned(name) Pour obtenir la valeur à partir du nom
RemBool(name), RemFloat(name), RemInt(name), RemString(name), RemUnsigned(name) Pour effacer le nom et la valeur
GetGroup, HasGroup, RemGroup Utilisation inconnue !?
- Flachy Joe -
Image
User avatar
flachyjoe
Veteran
Posts: 1869
Joined: Sat Mar 31, 2012 12:00 pm
Location: Limoges, France

Re: [PYTHON] Astuces

Post by flachyjoe »

Attendre qu'une sélection soit effectuée pour continuer le script

Cette astuce est un exemple d'utilisation d'un "Observateur de sélection" (le paramètre de Gui.Selection.addObserver), avec lequel on peut faire pas mal de chose. Ainsi que de l'utilisation d'un filtre de sélection (SelectionGate).
J'ai farfouillé dans le code en C++ pour trouver comment fonctionne l'observateur et pour rectifier la syntaxe des filtres pour lesquels il faut utiliser SUBELEMENT et non pas SUB comme c'est indiqué dans la doc de Gui.Selection.addSelectionGate.

Un court code vaut mieux qu'un long discours, j'ai commenté en anglais, ça change....

Code: Select all

# -*- coding: utf-8 -*-

from FreeCADGui import Selection
from PyQt4 import QtCore

class SelObserver:
	selected=False

	def addSelection(self, doc, object, sub, point):
		self.selected=True
		self.point=point

#	def removeSelection(self, doc, object, sub):
#		#An object have been unselected
#
#	def setSelection(self, doc):
#		#Selected from tree
#		#SelectionGate is not active for this...
#
#	def clearSelection(self, doc):
#		#Click off any object
#
#	def setPreselection(self, doc, object, sub):
#		#Mouse over object
#
#	def removePreselection(self, doc, object, sub):
#		#Mouse leave object

def QtWait(ms):
	"QtWait(ms) Wait some time, leaving QT do its job."
	timer=QtCore.QTimer()
	timer.setSingleShot(True)
	loop=QtCore.QEventLoop()
	QtCore.QObject.connect(timer,QtCore.SIGNAL("timeout()"),loop,QtCore.SLOT("quit()"))
	timer.start(ms)
	loop.exec_(QtCore.QEventLoop.AllEvents)

def wait4sel(gate):
	"wait4sel('gate') Wait for a selection filtered by the gate and return the clicked point"
	so=SelObserver()
	if (gate !=""):
		Selection.addSelectionGate(gate)
	Selection.addObserver(so)

	while (not so.selected):
		QtWait(100)

	Selection.removeSelectionGate()
	Selection.removeObserver(so)
	return so.point

Msg("Select an Edge\r\n")
pt=wait4sel("SELECT Part::Feature SUBELEMENT Edge")
theObject=Selection.getSelectionEx()[0]
theEdge=theObject.SubObjects[0]
Msg("The edge "+ theObject.SubElementNames[0] + " of " + theObject.ObjectName + " in " + theObject.DocumentName + " is selected from point " + str(pt) +"\r\n")
- Flachy Joe -
Image
Nanayaw
Posts: 90
Joined: Thu Feb 14, 2019 3:04 pm

Re: [PYTHON] Astuces

Post by Nanayaw »

Hello flachyjoe

I liked to try your code but I got the following error occured

<class 'ModuleNotFoundError'>: No module named 'PyQt4'

What could be the reason?

Greetings Nanayaw
openBrain
Veteran
Posts: 9034
Joined: Fri Nov 09, 2018 5:38 pm
Contact:

Re: [PYTHON] Astuces

Post by openBrain »

Nanayaw wrote: Sat Feb 20, 2021 5:02 pm Hello flachyjoe

I liked to try your code but I got the following error occured

<class 'ModuleNotFoundError'>: No module named 'PyQt4'

What could be the reason?

Greetings Nanayaw
That this thread is 8 year old. :lol:
Qt went from 4 to 5, and PyQt has been replaced by PySide. ;)
Post Reply