Python : récupérer la cellule désignée par l'utilisateur

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
2cv001
Posts: 484
Joined: Wed Jan 01, 2020 9:30 am

Python : récupérer la cellule désignée par l'utilisateur

Post by 2cv001 »

Bonjour,
Pour les experts en python :
Comment, dans une macro lancée lorsque l'on est dans un sketch, ouvrir une boite de dialogue qui demande à l'utilisateur de sélectionner une cellule dans un spreadsheet et ainsi, récupérer par exemple la case sélectionnée ('C4' par exemple ) ?

Michel
Macro Sketch Constraint From Spreadsheet :
https://wiki.freecad.org/Macro_Sketch_C ... adsheet/fr
User avatar
2cv001
Posts: 484
Joined: Wed Jan 01, 2020 9:30 am

Re: Python : récupérer la cellule désignée par l'utilisateur

Post by 2cv001 »

Pour mieux expliquer ce que je recherche :
Si on prend ce code :

Code: Select all

import FreeCAD, FreeCADGui
from PySide import QtGui

# obtenir la feuille de calcul (à améliorer pour si il y en a plusieurs)
mySpreadsheet = App.ActiveDocument.getObject("Spreadsheet")

# afficher une boîte de dialogue pour sélectionner une cellule
# mais je ne voudrais pas que l'utilisateur rentre le nom de la cellule. Je veux
# qu'il sélectionne une cellule dans le tableau
cellSelect, ok = QtGui.QInputDialog.getText(None, "Sélectionnez une cellule", "Entrez la cellule sélectionnée (ex. A1, B2, C3, etc.) :", QtGui.QLineEdit.Normal, "")

# vérifier si l'utilisateur a cliqué sur OK
if ok:
    # afficher la cellule sélectionnée
    FreeCAD.Console.PrintMessage("Cellule sélectionnée: " + cellSelect)
    print( mySpreadsheet.getContents(cellSelect))
il fonctionne, la macro demande à l'utilisateur de saisir le nom de la cellule (par ex 'C3' ). Mais je voudrais quà la place, la macro demande à l'utilisateur de pointer (sélectionner) une cellule.
Si je récupère ainsi mon ('C3'), alors je sais récupérer ce que je veux dans la cellule. De ce coté, pas de problème.
Pour les curieux, pour l'instant j'ai ce code qui doit pouvoir être simplifié, mais c'est une autre histoire..

Code: Select all

def trouveSheet(fenetreActive):
# renvoie le spreadSheet si c'est la fenêtre active
	sheet = App.ActiveDocument.getObjectsByLabel(fenetreActive.windowTitle()) # On essaye de trouver la feuille correspondant à la fenêtre à partir du nom de la fenêtre

	if len(sheet) == 0 and fenetreActive.windowTitle()[-3:] == '[*]': # Si aucune feuille correspondante n'a été trouvée...
		# ... On sait que FreeCAD ajoute au nom de la fenêtre les caractères "[*]" quand la feuille a été modifiée ...
		# ... et seulement dans le cas ou la feuille n'a jamais été renommée (!!!!!) ...
		sheet = App.ActiveDocument.getObjectsByLabel(fenetreActive.windowTitle()[:-3]) # ... Donc on réessaye sans les 3 derniers caractères

	if len(sheet) != 1: # Si aucune feuille n'a été trouvée (ou plusieurs feuilles ont été trouvées)
		App.Console.PrintError("Can't find sheet : {}\n".format(fenetreActive.windowTitle())) # On imprime une erreur dans la rapport
		return ''
	else:
		sheet = sheet[0] # La feuille est la seule qui a été trouvée par la recherche précédente
		return sheet
aw = Gui.getMainWindow().centralWidget().activeSubWindow() # On stocke la fenêtre active
sheet=trouveSheet(aw)	

if (sheet!=''):
	sel_items = aw.widget().findChild(QtGui.QTableView).selectedIndexes() # On récupère la liste complète de toutes les cellules sélectionnées
#on peut par exemple afficher les indices de la première cellule sélectionnée
sel_items [0].row()
sel_items [0].column()
# une fois que l’on a ces indices, pour récupérer le nom de la cas (ex ‘A1’)
#on défini une fonction cellName de type lambda
cellName = lambda r,c:'{}{}{}'.format(chr(c//26 + 64) if c//26 > 0 else '', chr(c%26+65), r+1)
cell = cellName(item.row(),item.column()) # On récupère l'identifiant de la cellule
print (cell)
Macro Sketch Constraint From Spreadsheet :
https://wiki.freecad.org/Macro_Sketch_C ... adsheet/fr
openBrain
Veteran
Posts: 9034
Joined: Fri Nov 09, 2018 5:38 pm
Contact:

Re: Python : récupérer la cellule désignée par l'utilisateur

Post by openBrain »

2cv001 wrote: Sat Feb 04, 2023 5:30 pm Bonjour,
Pour les experts en python :
Comment, dans une macro lancée lorsque l'on est dans un sketch, ouvrir une boite de dialogue qui demande à l'utilisateur de sélectionner une cellule dans un spreadsheet et ainsi, récupérer par exemple la case sélectionnée ('C4' par exemple ) ?

Michel
Hello,

Désolé, j'ai cet onglet ouvert depuis un moment.
En reprenant ton code, tu peux appeler :

Code: Select all

mySpreadsheet.ViewObject.getView().selectedCells()
ou

Code: Select all

mySpreadsheet.ViewObject.getView().selectedRanges()
mario52
Veteran
Posts: 4673
Joined: Wed May 16, 2012 2:13 pm

Re: Python : récupérer la cellule désignée par l'utilisateur

Post by mario52 »

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
2cv001
Posts: 484
Joined: Wed Jan 01, 2020 9:30 am

Re: Python : récupérer la cellule désignée par l'utilisateur

Post by 2cv001 »

Merci pour vos réponse, ça va me permettre d'avancer y compris en simplifiant mon code, et d'apprendre !
Je vais regarder également Mouseevents fo the spreadsheet car ça doit permettre de faire quelque chose :D

En complément, pour récupérer la feuille de calcul et son titre (et son nom) dans laquelle je suis en train de travailler (et donc de cliquer sur une cellule), mais ça doit pouvoir être amélioré avec notamment les évènements de la souris. Cela dit, ce que j'ai fait me parrait vraiment compliqué pour ce que ça fait :D

Code: Select all

subWindow = Gui.getMainWindow().centralWidget().activeSubWindow().widget()
tableView = subWindow.findChild(QtGui.QTableView)
if isinstance(tableView, QtGui.QTableView):
    windowTitle = subWindow.windowTitle()
    if '[' in windowTitle:
        windowTitle = windowTitle.split('[')[0].strip()
    windowTitle = windowTitle.replace('[','')
    print(windowTitle)
    print('ok feuille calcul')
    mySpreadSheetName=windowTitle
    mySpreadSheet = App.ActiveDocument.getObject (mySpreadSheetName)
Macro Sketch Constraint From Spreadsheet :
https://wiki.freecad.org/Macro_Sketch_C ... adsheet/fr
openBrain
Veteran
Posts: 9034
Joined: Fri Nov 09, 2018 5:38 pm
Contact:

Re: Python : récupérer la cellule désignée par l'utilisateur

Post by openBrain »

2cv001 wrote: Thu Feb 09, 2023 10:21 am En complément, pour récupérer la feuille de calcul et son titre (et son nom) dans laquelle je suis en train de travailler (et donc de cliquer sur une cellule), mais ça doit pouvoir être amélioré avec notamment les évènements de la souris. Cela dit, ce que j'ai fait me parrait vraiment compliqué pour ce que ça fait :D
Si tu veux la Spreadsheet actuellement affichée à l'écran :

Code: Select all

Gui.ActiveDocument.ActiveView.getSheet()
User avatar
2cv001
Posts: 484
Joined: Wed Jan 01, 2020 9:30 am

Re: Python : récupérer la cellule désignée par l'utilisateur

Post by 2cv001 »

openBrain wrote: Sat Feb 11, 2023 4:51 pm
Si tu veux la Spreadsheet actuellement affichée à l'écran :

Code: Select all

Gui.ActiveDocument.ActiveView.getSheet()
Et dire que je passe plusieurs heures et même des fois plusieurs ours pour réussir à pondre un truc en 50 lignes que tu réduis en une ligne ! :D

C'est effectivement plus simple !
Merci openbrain !
Macro Sketch Constraint From Spreadsheet :
https://wiki.freecad.org/Macro_Sketch_C ... adsheet/fr
Post Reply