[Macro] Une macro pour utiliser plus facilement un spreadsheet pour les contraintes de longueurs dans un sketch

Forum destiné aux questions et discussions en français
Forum rules
Be nice to others! Read the FreeCAD code of conduct!
User avatar
2cv001
Posts: 484
Joined: Wed Jan 01, 2020 9:30 am

Re: [Macro] Une nouvelle macro pour utiliser plus facilement un spreadsheet pour les contraintes de longueurs dans un sk

Post by 2cv001 »

Merci, et n'hésite pas si d'autres choses te viennent à 'esprit :D

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

Re: [Macro] Une nouvelle macro pour utiliser plus facilement un spreadsheet pour les contraintes de longueurs dans un sk

Post by 2cv001 »

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.

sketchConstraintFromSpreadsheet6.gif
sketchConstraintFromSpreadsheet6.gif (604.6 KiB) Viewed 12194 times

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.


sketchConstraintFromSpreadsheet5.gif
sketchConstraintFromSpreadsheet5.gif (615.05 KiB) Viewed 12203 times

On peut aussi imposer le diamètre d'un cercle de cette façon :

sketchConstraintFromSpreadsheet4.gif
sketchConstraintFromSpreadsheet4.gif (378.93 KiB) Viewed 12203 times
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: [Macro] Une nouvelle macro pour utiliser plus facilement un spreadsheet pour les contraintes de longueurs dans un sk

Post by 2cv001 »

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.
sketchConstraintFromSpreadsheet7.gif
sketchConstraintFromSpreadsheet7.gif (403.99 KiB) Viewed 12152 times
Macro Sketch Constraint From Spreadsheet :
https://wiki.freecad.org/Macro_Sketch_C ... adsheet/fr
User avatar
Vincent B
Veteran
Posts: 4713
Joined: Sun Apr 05, 2015 9:02 am
Location: La Rochelle, France

Re: [Macro] Une nouvelle macro pour utiliser plus facilement un spreadsheet pour les contraintes de longueurs dans un sk

Post by Vincent B »

Pas mal du tout! ;)
User avatar
2cv001
Posts: 484
Joined: Wed Jan 01, 2020 9:30 am

Re: [Macro] Une nouvelle macro pour utiliser plus facilement un spreadsheet pour les contraintes de longueurs dans un sk

Post by 2cv001 »

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 :

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
User avatar
-alex-
Veteran
Posts: 1856
Joined: Wed Feb 13, 2019 9:42 pm
Location: France

Re: [Macro] Une nouvelle macro pour utiliser plus facilement un spreadsheet pour les contraintes de longueurs dans un sk

Post by -alex- »

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

Re: [Macro] Une nouvelle macro pour utiliser plus facilement un spreadsheet pour les contraintes de longueurs dans un sk

Post by 2cv001 »

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

Re: [Macro] Une nouvelle macro pour utiliser plus facilement un spreadsheet pour les contraintes de longueurs dans un sk

Post by 2cv001 »

Une nouvelle fonctionnalité pour la macro :
La création des alias.

Tout est expliqué dans ce gif :
sketchConstraintFromSpreadsheet8.gif
sketchConstraintFromSpreadsheet8.gif (885.37 KiB) Viewed 11992 times
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
User avatar
Forthman
Veteran
Posts: 2650
Joined: Fri Apr 27, 2018 11:23 am
Location: Tarn-et-Garonne (82)

Re: [Macro] Une nouvelle macro pour utiliser plus facilement un spreadsheet pour les contraintes de longueurs dans un sk

Post by Forthman »

oui, le gif est parfaitement clair ;)
User avatar
2cv001
Posts: 484
Joined: Wed Jan 01, 2020 9:30 am

Re: [Macro] Une nouvelle macro pour utiliser plus facilement un spreadsheet pour les contraintes de longueurs dans un sk

Post by 2cv001 »

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.
Macro Sketch Constraint From Spreadsheet :
https://wiki.freecad.org/Macro_Sketch_C ... adsheet/fr
Post Reply