Spreadsheet versus Master Sketch

Forum destiné aux questions et discussions en français
Forum rules
Be nice to others! Read the FreeCAD code of conduct!
Post Reply
jmcornil
Posts: 133
Joined: Mon Nov 02, 2020 9:16 am
Location: Versailles (France)
Contact:

Spreadsheet versus Master Sketch

Post by jmcornil »

Bonjour à tous

Pour paramétrer un projet j'ai vu qu'il y a deux possibilités :
  • Utiliser un Spreadsheet
  • Utiliser un master sketch et donner un nom à ses contraites
    pour pouvoir les réutiliser ensuite.
Ma première question est de savoir s'il y a des différences entre ces deux méthodes.

Personnellement, je préfére utiliser un fichier de paramètres car cela permet
la complétion auto des noms d'alias, ce que je n'arrive pas à avoir avec les contraintes d'un sketch initial.

Toutefois, il y a quelque chose qui me gêne avec les fichiers de paramètres :
  • Si j'oublie de créer un fichier de paramètres avant de créer mon premier corps,
    je n'arrive pas ensuite le remettre en tête de mon arborescence.
  • En revanche, et c'est ce qui me perturbe le plus,
    je peux utiliser un alias de ce fichier de paramètres
    dans un corps qui se trouve avant dans l'arborescence.
Merci d'avance
User avatar
jpg87
Posts: 809
Joined: Thu Mar 16, 2017 7:16 am
Location: Limoges - France
Contact:

Re: Spreadsheet versus Master Sketch

Post by jpg87 »

My website : http://help-freecad-jpg87.fr updated 2023/11/06
User avatar
2cv001
Posts: 484
Joined: Wed Jan 01, 2020 9:30 am

Re: Spreadsheet versus Master Sketch

Post by 2cv001 »

Je ne suis pas du tout un pro de FreeCad, mais j'avoue que j'apprécie beaucoup la notion de dessin paramétré.
J'ouvre systématiquement un spreadsheet pour y placer toutes les valeurs qui me permettent de faire du "paramétré".
j'organise ma spreadSheet avec une colonne un texte qui me permet de savoir de quelle valeur je parle, dans la colonne suivante, il y a la valeur. Un alias automatiquement créé à partir de la description me permet de l'utiliser facilement
Je me suis fait une macro pour générer automatiquement les allias dans les cellules immédiatement à droite des cellules sélectionnées.
Attention, cette macro est largement améliorable du point de vue propreté du code. Je progresse grâce au forum et notamment openBain. Il faudra donc que je revienne sur cette macro. Cela dit, je crois qu'il en existe une similaire dans la bibliothèque de macro FreeCad.
Paramètres de mon cube

Longueur cube 1 par exemple va générer un alias 'longueurCube1' sur la cellule immédiatement à sa droite
Il faut sélectionner une ou plusieurs cellules dont on veut extraire les textes pour créer les alias avant de lancer la macro.

Code: Select all

# -*- 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):
# renvoit le spreadSheet si c'est la fenêtre active
	#aw=fenetreActive
	#aw = Gui.getMainWindow().centralWidget().activeSubWindow() # On stocke 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
Last edited by 2cv001 on Tue Nov 17, 2020 5:05 pm, edited 1 time in total.
Macro Sketch Constraint From Spreadsheet :
https://wiki.freecad.org/Macro_Sketch_C ... adsheet/fr
User avatar
-alex-
Veteran
Posts: 1861
Joined: Wed Feb 13, 2019 9:42 pm
Location: France

Re: Spreadsheet versus Master Sketch

Post by -alex- »

jmcornil wrote: Tue Nov 17, 2020 10:17 am Ma première question est de savoir s'il y a des différences entre ces deux méthodes.
De mon point de vue les spreadsheet sont puissantes et ne sont pas affectées par le modèle lui même, d'éventuels problèmes topologique (qui ne manquent pas de se produire dès que les pièces sont un chouia complexes).
Les esquisse maitresses ont pourtant ma préférence, elles sont plus visuelle, graphique, on voit tout de suite de quoi il s'agit. Et non seulement l'on peut y placer des contraintes avec expression, mais en plus leurs éléments géométrique peuvent servir de références pour la construction: donc 2 en 1.
Personnellement, je préfére utiliser un fichier de paramètres car cela permet
la complétion auto des noms d'alias, ce que je n'arrive pas à avoir avec les contraintes d'un sketch initial.
Oui l'auto-completion est buguée depuis un moment si je me rappel bien, mais ce problème sera surement résolu dans quelques temps (ça fonctionne dans la branche Linkstage3 de @realthunder)
User avatar
Forthman
Veteran
Posts: 2668
Joined: Fri Apr 27, 2018 11:23 am
Location: Tarn-et-Garonne (82)

Re: Spreadsheet versus Master Sketch

Post by Forthman »

L'ordre dans l'arbre de construction n'a pas d'importance (sauf dans un Body)
c'est juste affiché dans l'ordre de création.
chaque objet est unique (voir le nom interne qui s'affiche en bas à gauche)
jmcornil
Posts: 133
Joined: Mon Nov 02, 2020 9:16 am
Location: Versailles (France)
Contact:

Re: Spreadsheet versus Master Sketch

Post by jmcornil »

Bonjour

@ jpg87 : Merci, c'est super intéressant. Je vais explorer.

@ Forthman : justement, si l'ordre des différents éléments de premier niveau n'a pas d'importance, je ne comprends pas pourquoi je n'arrive pas à remettre mon fichier de paramètres en premier ; ça me paraît dommage pour la structure du projet.
User avatar
Forthman
Veteran
Posts: 2668
Joined: Fri Apr 27, 2018 11:23 am
Location: Tarn-et-Garonne (82)

Re: Spreadsheet versus Master Sketch

Post by Forthman »

C'est un "problème" connu de longue date dans Freecad, il n'est pas possible de dépacer les objets dans l'arbre, ils apparaissent
dans l'ordre de leur création.
L’utilisation des conteneurs de type "Groupe" peuvent aider à mettre un peu d'ordre, mais il m'arrive encore de créer un nouveau document
à coté et de faire des copier/coller depuis le document d'origine que je souhaite classer :roll:
User avatar
freecadjam
Veteran
Posts: 1994
Joined: Tue Jul 17, 2018 10:47 am
Contact:

Re: Spreadsheet versus Master Sketch

Post by freecadjam »

moi l'ordre ça ne me dérange pas, ça m'amuse, je fais confiance à FreeCAD pour le ménage
il y a pas une macro qui permet d'arranger l'organigramme ?
Post Reply