[Macro] Une macro pour utiliser plus facilement un spreadsheet pour les contraintes de longueurs dans un sketch
Forum rules
Be nice to others! Read the FreeCAD code of conduct!
Be nice to others! Read the FreeCAD code of conduct!
Re: [Macro] Une nouvelle macro pour utiliser plus facilement un spreadsheet pour les contraintes de longueurs dans un sk
Merci, et n'hésite pas si d'autres choses te viennent à 'esprit
Sinon, je viens de remplacer des images par des gif animés. Ca doit faciliter la compréhension rapide.
Sinon, je viens de remplacer des images par des gif animés. Ca doit faciliter la compréhension rapide.
Macro Sketch Constraint From Spreadsheet :
https://wiki.freecad.org/Macro_Sketch_C ... adsheet/fr
https://wiki.freecad.org/Macro_Sketch_C ... adsheet/fr
Re: [Macro] Une nouvelle macro pour utiliser plus facilement un spreadsheet pour les contraintes de longueurs dans un sk
Bon, j'ai pas mal complété et surtout affiné la macro.
Maintenant, pour une distance, on peut sélectionner un cercle par son centre ou par le cercle lui même.
Comble du raffinement : si par exemple une ligne est plutôt horizontale que verticale, lorsque la boite de dialogue s'ouvrira, le focus sera mis sur le bouton permettant de donner une contrainte horizontale. Si la ligne est plutôt verticale que horizontale, le focus sera mis sur le bouton permettant d'imposer une contrainte verticale.
Dans les deux cas, il suffit d'appuyer sur la touche entré si ce choix nous convient.
On peut aussi imposer le diamètre d'un cercle de cette façon :
Maintenant, pour une distance, on peut sélectionner un cercle par son centre ou par le cercle lui même.
Comble du raffinement : si par exemple une ligne est plutôt horizontale que verticale, lorsque la boite de dialogue s'ouvrira, le focus sera mis sur le bouton permettant de donner une contrainte horizontale. Si la ligne est plutôt verticale que horizontale, le focus sera mis sur le bouton permettant d'imposer une contrainte verticale.
Dans les deux cas, il suffit d'appuyer sur la touche entré si ce choix nous convient.
On peut aussi imposer le diamètre d'un cercle de cette façon :
Macro Sketch Constraint From Spreadsheet :
https://wiki.freecad.org/Macro_Sketch_C ... adsheet/fr
https://wiki.freecad.org/Macro_Sketch_C ... adsheet/fr
Re: [Macro] Une nouvelle macro pour utiliser plus facilement un spreadsheet pour les contraintes de longueurs dans un sk
Dans une nouvelle version que je vais bientôt mettre en ligne.
Si on lance la macro alors que l'on a pas encore créé une spreadsheet, il nous propose d'en créer une et l'ouvre afin que l'on puisse commencer à la remplir.
Si on lance la macro alors que l'on a pas encore créé une spreadsheet, il nous propose d'en créer une et l'ouvre afin que l'on puisse commencer à la remplir.
Macro Sketch Constraint From Spreadsheet :
https://wiki.freecad.org/Macro_Sketch_C ... adsheet/fr
https://wiki.freecad.org/Macro_Sketch_C ... adsheet/fr
Re: [Macro] Une nouvelle macro pour utiliser plus facilement un spreadsheet pour les contraintes de longueurs dans un sk
Merci @Vincent B
Prochaine étape possible : favoriser la génération automatiquement les allias. J'avais fait une macro qui le fait il y a deux ou 3 ans :
viewtopic.php?p=390824 donc je pourrais facilement incorporer son code. Faire un truc du style si on rentre un libellé dans la première colonne, la macro crée automatiquement un alias dans la seconde sans rien de mandé. Pas très souple mais très efficace.
Mais d'un autre coté, il y a déjà une macro répertoriée ici et faite par TheMarkster: https://wiki.freecad.org/Macro_EasyAlias Je peux aussi simplement faire un lien à partir de la boite de dialogue pour informer de son existence. Moins automatique mais plus de liberté sur le rôle de chaque colonne. Pas encore testé cette macro. Il faudrait que je le fasse. Quelqu'un a testé ?
La macro que j'avais faite donne aussi cette liberté, mais l'idée est de supprimer un peu de liberté pour plus d'efficacité.
Pour info, le code de ce que j'avais fait et qui demanderait sans doute une relecture :
Prochaine étape possible : favoriser la génération automatiquement les allias. J'avais fait une macro qui le fait il y a deux ou 3 ans :
viewtopic.php?p=390824 donc je pourrais facilement incorporer son code. Faire un truc du style si on rentre un libellé dans la première colonne, la macro crée automatiquement un alias dans la seconde sans rien de mandé. Pas très souple mais très efficace.
Mais d'un autre coté, il y a déjà une macro répertoriée ici et faite par TheMarkster: https://wiki.freecad.org/Macro_EasyAlias Je peux aussi simplement faire un lien à partir de la boite de dialogue pour informer de son existence. Moins automatique mais plus de liberté sur le rôle de chaque colonne. Pas encore testé cette macro. Il faudrait que je le fasse. Quelqu'un a testé ?
La macro que j'avais faite donne aussi cette liberté, mais l'idée est de supprimer un peu de liberté pour plus d'efficacité.
Pour info, le code de ce que j'avais fait et qui demanderait sans doute une relecture :
Code: Select all
# -*- coding: utf-8 -*-
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 son é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
Macro Sketch Constraint From Spreadsheet :
https://wiki.freecad.org/Macro_Sketch_C ... adsheet/fr
https://wiki.freecad.org/Macro_Sketch_C ... adsheet/fr
Re: [Macro] Une nouvelle macro pour utiliser plus facilement un spreadsheet pour les contraintes de longueurs dans un sk
C'est super ce que tu fais, et tes échanges avec les développeurs du forum sont instructifs pour ceux qui veulent se mettre au code.
Continue!
Continue!
Re: [Macro] Une nouvelle macro pour utiliser plus facilement un spreadsheet pour les contraintes de longueurs dans un sk
C'est sûr que sans les experts du forum, je n'aurais pas pu aboutir.!
Macro Sketch Constraint From Spreadsheet :
https://wiki.freecad.org/Macro_Sketch_C ... adsheet/fr
https://wiki.freecad.org/Macro_Sketch_C ... adsheet/fr
Re: [Macro] Une nouvelle macro pour utiliser plus facilement un spreadsheet pour les contraintes de longueurs dans un sk
Une nouvelle fonctionnalité pour la macro :
La création des alias.
Tout est expliqué dans ce gif : Je test bien puis je mets à disposition.
Le gif est compréhensible par lui même ?
La création des alias.
Tout est expliqué dans ce gif : Je test bien puis je mets à disposition.
Le gif est compréhensible par lui même ?
Macro Sketch Constraint From Spreadsheet :
https://wiki.freecad.org/Macro_Sketch_C ... adsheet/fr
https://wiki.freecad.org/Macro_Sketch_C ... adsheet/fr
Re: [Macro] Une nouvelle macro pour utiliser plus facilement un spreadsheet pour les contraintes de longueurs dans un sk
oui, le gif est parfaitement clair
Re: [Macro] Une nouvelle macro pour utiliser plus facilement un spreadsheet pour les contraintes de longueurs dans un sk
En fait je découvre cette facilité de créer des gifs. Bien pour faire des démos ou tutos !
J'ai recherché en gratuit open source et j'ai trouvé un peu au pif ScreenToGif.
J'ai recherché en gratuit open source et j'ai trouvé un peu au pif ScreenToGif.
Macro Sketch Constraint From Spreadsheet :
https://wiki.freecad.org/Macro_Sketch_C ... adsheet/fr
https://wiki.freecad.org/Macro_Sketch_C ... adsheet/fr