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
Python : récupérer la cellule désignée par l'utilisateur
Forum rules
Be nice to others! Read the FreeCAD code of conduct!
Be nice to others! Read the FreeCAD code of conduct!
Python : récupérer la cellule désignée par l'utilisateur
Macro Sketch Constraint From Spreadsheet :
https://wiki.freecad.org/Macro_Sketch_C ... adsheet/fr
https://wiki.freecad.org/Macro_Sketch_C ... adsheet/fr
Re: Python : récupérer la cellule désignée par l'utilisateur
Pour mieux expliquer ce que je recherche :
Si on prend ce code :
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..
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))
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
https://wiki.freecad.org/Macro_Sketch_C ... adsheet/fr
Re: Python : récupérer la cellule désignée par l'utilisateur
Hello,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
Désolé, j'ai cet onglet ouvert depuis un moment.
En reprenant ton code, tu peux appeler :
Code: Select all
mySpreadsheet.ViewObject.getView().selectedCells()
Code: Select all
mySpreadsheet.ViewObject.getView().selectedRanges()
Re: Python : récupérer la cellule désignée par l'utilisateur
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.
My macros on Gist.github here complete macros Wiki and forum.
Re: Python : récupérer la cellule désignée par l'utilisateur
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
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
Je vais regarder également Mouseevents fo the spreadsheet car ça doit permettre de faire quelque chose
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
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
https://wiki.freecad.org/Macro_Sketch_C ... adsheet/fr
Re: Python : récupérer la cellule désignée par l'utilisateur
Si tu veux la Spreadsheet actuellement affichée à l'écran :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
Code: Select all
Gui.ActiveDocument.ActiveView.getSheet()
Re: Python : récupérer la cellule désignée par l'utilisateur
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 !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()
C'est effectivement plus simple !
Merci openbrain !
Macro Sketch Constraint From Spreadsheet :
https://wiki.freecad.org/Macro_Sketch_C ... adsheet/fr
https://wiki.freecad.org/Macro_Sketch_C ... adsheet/fr