# hello word ## sous-titre ### sous-sous-titre ``` ceci est du code ; if Romain is a geek then xvxv fin if ``` Python : ```python= # -*- coding: utf-8 -*- ### On fait les imports qui vont bien import FreeCAD as App import FreeCADGui as Gui from PySide import QtGui separateur=" " # classiquement mettre " " ainsi les blancs seront remplacés par nouveauCaract nouveauCaract='' #Mettre par exemple "_" pour que les séparateurs soit remplacés par "_". Mettre "" pour ne pas avoir de séparateur majuscule=True #mettre à True si on veut que "Diametre du cercle" devienne "DiametreDuCercle" changeTexteCellule=False # le texte ne sera changé que si changeTexteCellule est à True. Cela ne change rien pour l'allias lui-même premierCaractereEnMinuscule=True #Force le premier caractère à être en minuscule # liste des caractères devant être remplacés par un équivalent. par exemple 'é' sera remplacé par 'e' caracEquivalents =[ ['é','e'],['è','e'],['à','a'],['@','a'],['&','e'],['ç','c'],['²','2'],["'",''] ] def remplaceCartatParEquivalent(caractere): # remplace un caractère par sn équivalent sil existe caracResult=caractere for couple in caracEquivalents: if (couple[0]==caractere): caracResult=couple[1] break return caracResult def remplaceCararcDansMot(mot): #remplace tous les caractères du mot par son équivalent s'il existe motResult=mot for caract in mot: a=remplaceCartatParEquivalent(caract) motResult=motResult.replace(caract,a) return motResult def traitementChaineSource(chaineSource,separateur,nouveauCaract,majuscule): # Si séparateur vaut ' ' et nouveauCaract vaut '_', et majuscule vaut True # transforme "Diametre du cylindre" en "Diametre_Du_Cylindre" chaineResult='' first=True carctDeSeparation='' for mots in chaineSource.split(separateur): mots=remplaceCararcDansMot(mots) if (not (first)): carctDeSeparation=nouveauCaract if (majuscule): chaineResult=chaineResult+nouveauCaract+mots[:1].upper()+mots[1:] # On utilise "[:1]" au lieu de "[0]", car ce dernier plante en cas de chaine vide (ce qui arrive si la cellule est vide) else: chaineResult=chaineResult+nouveauCaract+mots if premierCaractereEnMinuscule : chaineResult=chaineResult[:1].lower()+chaineResult[1:] return chaineResult 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 proceed = True # Un petit drapeau qui indiquera si on doit vraiment procéder for item in sel_items: # On parcourt les cellules sélectionnées if item.column() != sel_items[0].column(): # Si une des cellules n'est pas dans la même colonne que la première ### On affiche un dialogue demandant à l'utilisateur s'il est sûr de son coup if QtGui.QMessageBox.warning(Gui.getMainWindow(), "Warning","""Selected cells aren't all in the same column. Proceed anyway ?""", QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel) == QtGui.QMessageBox.Cancel: # Si l'utilisateur annule proceed = False # On ne procèdera pas aux changements break # Pas la peine de continuer à analyser les colonnes à partir du moment ou au moins 2 ne sont pas sur la même colonne if proceed: # Si on doit continuer à procéder ### On définit une fonction qui renverra l'identifiant de la cellule à partir de ses numéros de ligne (r) et colonne (c) ### Les numéros commencent à 0 pour la première ligne/colonne ### On gère correctement les colonnes avec un identifiant à 2 lettres cellName = lambda r,c:'{}{}{}'.format(chr(c//26 + 64) if c//26 > 0 else '', chr(c%26+65), r+1) for item in sel_items: # On parcourt les cellules sélectionnées cell = cellName(item.row(),item.column()) # On récupère l'identifiant de la cellule next_cell = cellName(item.row(), item.column()+1) # On récupère l'identifiant de la cellule voisine à droite activeCellContenu=sheet.getContents(cell) # traitement de la chaine de caractère contenue dans la cellule activeCellContenu=traitementChaineSource(activeCellContenu,separateur,nouveauCaract,majuscule) if changeTexteCellule:# si le paramètre changeTexteCellule est à True alors on remplace le texte de la cellule sheet.set(cell, activeCellContenu) alias=activeCellContenu try: # Bloc try pour récupérer les erreurs sheet.setAlias(next_cell, alias) # On attribue l'alias à la cellule voisine de droite except ValueError: # Si une erreur "ValueError" est déclenchée (ce qui arrive quand l'alias n'est pas valide) App.Console.PrintWarning("Can't set alias for cell {} : {} isn't valid\n".format(next_cell, alias)) # On prévient l'utilisateur dans le rapport ``` Si tu veux tu peux mettre en **gras** ou en *italique* ou ~~strike~~ Quand je prends mes notes : - je fais des items et d’autres items > [] - et des sous-items - etc. - et encore d’autres 1. ou les numéroter 2. lol 3. plouf - [x] truc à cocher - [ ] truc aussi à cocher | Column 1 | Column 2 | Column 3 | | -------- | -------- | --------:| | Text | Text | Text | ligne horizontale --- maths : $x+1 = e^3$ ![alt](https://i.imgur.com/3GwVQPr.png)