Macro pour obtenir un stl avec des arrondis parfaits et piloter octoprint

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

Macro pour obtenir un stl avec des arrondis parfaits et piloter octoprint

Post by 2cv001 »

Edit : Pour plus de détail et récupérer la dernière version de la macro, voir le wiki ici : https://wiki.freecadweb.org/Macro_3d_printer_workflow

Lorsque vous lancez un export vers stl dans le but par exemple d'une impression 3D, vous obtenez un stl avec des formes rondes qui ne le sont pas complètement car l'arrondi est fait avec des facettes visibles. Voir la discussion ici : https://forum.freecadweb.org/viewtopic.php?f=12&t=45473
Image
Cela peut être gênant dans le cas d'une impression 3D.
Le problème est que dans FreeCad lui même, pour des raisons de vitesses, il affiche aussi les arrondis avec des facettes dans la vue 3D.

Il y a deux paramêtres des corps qui vous permettent d'ajuster la précision de la vue :
Deviation et Angular deflection.
J'ai essayé de faire varier angular deflection sans succès, mais je réessaierai.
Par contre, en diminuant deviation, on obtient bien une image plus lisse et donc un stl plus lisse. Valeur par défaut 0.5. Si vous mettez par exemple 0.01 c'est très lissé.
Image

L'inconvénient est que du coup, cela ralentie FreeCad. Il faudrait donc à chaque fois que 'on veut exporter modifier les propriétés deviation de tous les corps puis les remettre à leurs valeurs d'origine.
L'aide en ligne de FreeCad en parle et conseille de faire autrement pour exporter les stl, mais d'une manière plus compliquée. Trop compliqué à mon gout.

La macro que je propose fait ce travail : elle vous propose de modifier la valeur de deviation puis remet à la fin celle que vous aviez.
Cerise sur le gâteau, pour ceux qui font de l'impression 3D, elle vous propose de lancer votre fichier stl dans, cura par exemple. Elle vous propose aussi de lancer d'autres commande de votre choix. Chez moi, j'ai "domotisé" l'imprimante, et j'ai un ordre qui allume l'imprimante et la lumière qui est à coté, connecte octoprint à l'imprimante, ouvre l'interface octoprint et lance la chauffe du plateau.

Edit : avec certaines version de freecad (J'ai eu le cas avec une Link Daly) , les limites seront à changer. Ici, par défaut elle sont blocqué en max comme en mini à 0.05. Mieux vaut mettre 0.01La macro ne peut donc rien changer.
Ce qu'il y avait par défaut :
Capture.PNG
Capture.PNG (49.86 KiB) Viewed 1226 times
Perso j'ai mis
Capture1.PNG
Capture1.PNG (50.13 KiB) Viewed 1226 times
N'hésitez pas à "critiquer", pour faire progresser....
La macro :

Edit :
DERNIERE VERSION : Aller ici pour récupérer la macro https://wiki.freecadweb.org/Macro_3d_printer_workflow



ANCIENNE VERSION (ne pas utiliser)

Code: Select all

# macro qui permet de créer un fichier "stl" en modifiant le paramètre "deviation" des body concernés. A la fin, on replace le paramètre déviation d'origine.
# le but de mettre un paramètre déviation plus petit permet d'avoir un stl avec des objets qui possèdent des facettes nettement plus fine et donc des objets (impresions) plus lisses
# à la fin elle propose  de lancer le programme associé à l'extenstion stl. Pas testé si ça marche sous linux. Fonctionne sous windows.
# typiquement, lance le fichier stl généré par exemple sous  cura si l'extension stl a été associé à cura dans votre système d'exploitation


import FreeCAD as App
import os.path
import Mesh
from PySide2 import QtWidgets

# paramètres pouvant être lancés
deviation=0.01 # valeur par défaut qui s'affichera dans la boite de dialogue. 0.5 par défait dans FreeCad, 0.05 permet un lissage plus fort.
doitLancerFichier=True # si False on ne propose pas de lancer le fichier stj
autreCommandeALancer="" #lancera à la fin une commande de votre choix. Typiquement par exemple un programme domotique pour allumer votre imprimante ou/et une lumière. ""= ne lance rien
#autreCommandeALancer="calc.exe" # pour tester sous windows : retirez le # en début de ligne et cela vous proposera de lancera la calculatrice (sous windows)
textAutreCommandeALancer="Lancer la calculatrice ?" # Ce qui s'affichera dans la boite de dialogue vous proposant de lancer votre programme

#===========
#Initialisations
#===========
replyDoitLancerFichier=QtWidgets.QMessageBox.No
__objs__=[]
__deviation__=[]

if App.ActiveDocument is  None: # s'il existe pas un document 
	QtWidgets.QMessageBox.information(None,"Attention","Vous n'avez pas de document") 
else:
	filenamefullPath=App.ActiveDocument.FileName
	if filenamefullPath=="":
		QtWidgets.QMessageBox.information(None,"Attention","Sauvez votre document avant de relancer la commande") 
	
	else: #Récupération du nom du fichier, son chemin etc... On s'e servira pour sauver le stl
		fullPath = os.path.dirname(filenamefullPath)
		filename = os.path.basename(filenamefullPath)
		fileBasename = os.path.splitext(filename)[0]	
		fileStlName= fullPath+ "/"+ fileBasename+ ".stl" # Fichier où sera enregistré le .stl	
		
		reply = QtWidgets.QInputDialog.getDouble(None, "Option de précision","Entrée la déviation souhaitée. "+str(deviation)+" conseillé pour ne pas voir de facettes. ", deviation, 0.00, 1.0, 2) # valeur par défaut, min, max et décimales.
		if reply[1]:	# on a cliqué sur Ok sinon on ne fait rien de plus (Cancel)
			if reply[0]!="":
				deviation=float( reply[0] )
	
	# On mémorise les valeurs de déviation avant de les modifier par la valeur entrée.	
			for objData in Gui.Selection.getSelection():
				if objData.isDerivedFrom("PartDesign::Body"):	
					__objs__.append( objData)
					#__deviation__.append(Gui.ActiveDocument.getObject(objData.Name).Deviation) # On mémorise les valeurs de déviation avant de les modifier par la valeur entrée.
					__deviation__.append(objData.ViewObject.Deviation) # On mémorise les valeurs de déviation avant de les modifier par la valeur entrée.
					objData.ViewObject.Deviation=deviation # et on impose deviation
					objData.touch() # marque l'objet pour le forcer à être pris en compte dans le recompute
					for o in objData.ViewObject.claimChildren():# pour imposer un recompute même si la déviation est plus petite qu'avant
 						o.touch()
			
			if len(__objs__)==0: # si on a trouvé aucun body
				QtWidgets.QMessageBox.information(None,"Attention","Sélectionnez un ou plusieurs body avant de lancer la macro")
			else:
				if doitLancerFichier:
					replyDoitLancerFichier = QtWidgets.QMessageBox.question(None, "", "Lancer le fichier ? (nécéssite l'association de l'extension stl à un programme)", QtWidgets.QMessageBox.Yes |QtWidgets.QMessageBox.No, QtWidgets.QMessageBox.No)
				print("Recompute1")
				App.ActiveDocument.recompute()
				##################################################################################################

				print("Début export")
				Mesh.export(__objs__, fileStlName) 
				print("Fin export")			
				if replyDoitLancerFichier == QtWidgets.QMessageBox.Yes:
					os.startfile(fileStlName) #lance par exemple cura si cura a été associé aux fichiers *.stl
				if autreCommandeALancer != "":
					replyAutreCommandeALancer = QtWidgets.QMessageBox.question(None, "", textAutreCommandeALancer, QtWidgets.QMessageBox.Yes |QtWidgets.QMessageBox.No, QtWidgets.QMessageBox.No)
					if replyAutreCommandeALancer == QtWidgets.QMessageBox.Yes:
						os.startfile(autreCommandeALancer) 					
		
				i=0
				for objData in FreeCADGui.Selection.getSelection():
					if objData.isDerivedFrom("PartDesign::Body"):    
						objData.ViewObject.Deviation= __deviation__[i]    # On remet les valeurs d'origine pour la déviation
						for o in objData.ViewObject.claimChildren():# pour imposer un recompute même si la déviation est plus petite qu'avant
 							o.touch()
						i=i+1
				if i!=0:
					print("Recompute2")
					App.ActiveDocument.recompute()

del __objs__

Attachments
ExportStl.FCMacro
(18.43 KiB) Downloaded 33 times
Last edited by 2cv001 on Sat Jan 28, 2023 12:21 pm, edited 30 times in total.
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 pour obtenir un stl avec des arrondis parfait

Post by Forthman »

Perso j'utilise toujours l'atelier Mesh Design pour exporter des STL
On peut choisir les valeurs de déviation angulaire et de surface
depuis la 0.19 les paramètres sont conservés (ça évite de les retaper à chaque fois)
L'objet STL est créé dans Freecad, ce qui permet de vérifier visuellement s'il y a des erreurs

Je ne dis pas que ta macro ne sert à rien, je pense qu'il est intéressant d'avoir plusieurs
outils pour que chacun puisse travailler comme il le souhaite ;)
User avatar
2cv001
Posts: 484
Joined: Wed Jan 01, 2020 9:30 am

Re: Macro pour obtenir un stl avec des arrondis parfait

Post by 2cv001 »

Si j'ai bien compris, il faut faire un "create mesh from shape", et là, on peut rentrer la valeur de deviation (gardée par défaut) puis lancer l'export puis effacer ce mesh puisque les modifs appliquées au model ne sont pas reportées dans le mesh. Je fais pas mal d'allées retours avec cura, je voulais automatisé.
Cela dit, j'aurais pu faire une macro qui crée le mesh, le sélectionne, lance l'export, efface le mesh puis comme dans la macro lance cura, éventuellement allume l'imprimante et lance l'impression... Tiens, ce serait un bon exercice pour moi.
Macro Sketch Constraint From Spreadsheet :
https://wiki.freecad.org/Macro_Sketch_C ... adsheet/fr
openBrain
Veteran
Posts: 9034
Joined: Fri Nov 09, 2018 5:38 pm
Contact:

Re: Macro pour obtenir un stl avec des arrondis parfait

Post by openBrain »

Pour sûr l'ouverture du STL ne marchera que sous Windows, puisque la commande 'os.startfile' n'existe pas sous les autres systèmes.

Quelques remarques en vrac :
* Evite les lignes trop longues / Pas plus de 80~100 caractères
* Pas la peine d'initialiser les variables qui le seront de toute façon, mais ça peut être utile pour les décrire
* Essaye d'utiliser des fonctions. C'est plus clair et plus pratique (par exemple quand tu es sur un cas d'erreur, tu fais juste 'return' au lieu d'avoir des if/else à l'infini)
* Utilise des tabulations douces de 4 espaces plutôt que des tabulations "dures"
* Les chaines de caractères en Python sont plutôt mise entre guillemets simples
* Pour insérer des variables dans les chaines de caractères (comme 'deviation'), utilise plutôt la fonction 'format' que des "+str(variable)+"
* Ecrire des variables avec des double underscore '__' en préfixe+suffixe a une signification en Python. Tu devrais éviter ça.
* Tes message box devraient avoir la fenêtre principale FreeCAD comme parent au lieu de 'None' (sinon c'est le bazar si on ferme la fenêtre FreeCAD alors que tu as une message box ouverte)
* Sur ton 'getDouble', au lieu de tricoter avec reply[0]/reply[1], il vaut mieux associer directement 2 variables : value, reply = QWidgets.QinputDialog.getDouble(blabla)
* Tes variables 'replyDoitLancerFichier/replyAutreCommandeALancer' ne servent pas à grand chose. Autant faire directement un : if QtWidgets.QMessageBox.question(blabla) == QWidgets.QMessageBox.Yes :
* Vers la fin c'est encore du tricot pour remettre les déviations comme à l'origine. Il y a pas mal de méthodes, de la moins pire à la meilleure :
- Passable : utiliser 'enumerate' pour avoir un compteur sur les itérations (parce le i=0 / i=i+1 c'est vraiment vieux)
- Moyen : utiliser 'zip' pour agglomérer les 2 listes dans un seul itérateur
- Bien : Au moment de stocker les valeurs, on crée soit un dictionnaire (dont les clés sont les objets, et les valeurs les déviations), soit une liste de tuples directement
* Pas la peine de supprimer les valeurs à la fin, le ramasse-miettes passera ;)

Voilà, j'ai fait le tour rapidement. :)
User avatar
jmarie3D
Posts: 310
Joined: Sat May 02, 2020 12:31 pm

Re: Macro pour obtenir un stl avec des arrondis parfait

Post by jmarie3D »

openBrain wrote: Sat Nov 14, 2020 5:33 pm
* Pour insérer des variables dans les chaines de caractères (comme 'deviation'), utilise plutôt la fonction 'format' que des "+str(variable)+"
Depuis les dernières versions de Python, il existe une nouvelle syntaxe que je trouve plus claire que la fonction format:
>>> var = 'petit'
>>> print(f"il etait un {var} navire")
il etait un petit navire
>>>
openBrain
Veteran
Posts: 9034
Joined: Fri Nov 09, 2018 5:38 pm
Contact:

Re: Macro pour obtenir un stl avec des arrondis parfait

Post by openBrain »

jmarie3D wrote: Sat Nov 14, 2020 5:58 pm Depuis les dernières versions de Python, il existe une nouvelle syntaxe que je trouve plus claire que la fonction format:
Oui, les f-strings sont disponibles depuis Python 3.6 en fait.
Pour moi c'est un peu récent pour être utilisé, il y a des versions de FreeCAD qui compilent encore avec des versions inférieures.
Après si tu écris des macros pour toi seulement, c'est effectivement idéal. Par contre si tu veux partager, c'est différent. ;)
User avatar
-alex-
Veteran
Posts: 1856
Joined: Wed Feb 13, 2019 9:42 pm
Location: France

Re: Macro pour obtenir un stl avec des arrondis parfait

Post by -alex- »

2cv001 wrote: Sat Nov 14, 2020 10:49 am Bonjour,
Comme vous avez pu voir dans d'autres messages, je me lance dans les macros
Bonne idée cette macro et merci pour le partage!

Il me semble qu'il y a un petit bug, une valeur de déviation inférieure à 0,05 n'ai pas prise en compte, en observant la propriété "Deviation" du corps sélectionné on peut remarquer qu'elle passe à 0,05 mini avant de révenir à sa valeur d'origine, même si l'on a laissé 0,01 par exemple.

Une remarque personnelle et pas du tout définitive: une valeur de 0,01 par défaut me parait un peu faible et peut produire des fichiers gcode assez volumineux suivant les pièces. Il est facile de le changer dans la macro, mais proposer cette macro avec 0,05 par défaut me parait peut-être plus raisonnable pour le firmware de l'imprimante d'une part ( ralentissement à l'interpolation des très petits segments si vitesse élevée), et aussi pour la planète quelque part. Vos avis sont les bienvenus.

Une option à ajouter peut-être: l'import du stl généré dans FreeCAD, pour un contrôle visuel direct du résultat avant d'ouvrir le stl dans le slicer?
User avatar
2cv001
Posts: 484
Joined: Wed Jan 01, 2020 9:30 am

Re: Macro pour obtenir un stl avec des arrondis parfait

Post by 2cv001 »

-alex- wrote: Sat Nov 14, 2020 7:12 pm

Il me semble qu'il y a un petit bug, une valeur de déviation inférieure à 0,05 n'ai pas prise en compte, en observant la propriété "Deviation" du corps sélectionné on peut remarquer qu'elle passe à 0,05 mini avant de révenir à sa valeur d'origine, même si l'on a laissé 0,01 par exemple.
Bizarre, chez moi (dernière version 0.19) ça passe bien à 0.01 pour revenir après à la déviation d'origine. Sans doute un problème de version différente. Sinon, on voit bien la différence entre 0.01 et 0.05 sous cura. En 0.05 on voit encore un peu les facettes.
Pour répondre à la remarque suivante (taille fichiers stl) : effectivement, jusqu’à présent, mes réalisations FreeCad ne sont pas volumineuses. D'où le fait que je n'ai pas été gêné par un stl volumineux. Essais à faire....
Une remarque personnelle et pas du tout définitive: une valeur de 0,01 par défaut me parait un peu faible et peut produire des fichiers gcode assez volumineux suivant les pièces. Il est facile de le changer dans la macro, mais proposer cette macro avec 0,05 par défaut me parait peut-être plus raisonnable pour le firmware de l'imprimante d'une part ( ralentissement à l'interpolation des très petits segments si vitesse élevée), et aussi pour la planète quelque part. Vos avis sont les bienvenus.

Une option à ajouter peut-être: l'import du stl généré dans FreeCAD, pour un contrôle visuel direct du résultat avant d'ouvrir le stl dans le slicer?
Effectivement, c'est possible. Qui pense que ce serait bien ?
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 pour obtenir un stl avec des arrondis parfait

Post by 2cv001 »

openBrain wrote: Sat Nov 14, 2020 5:33 pm Pour sûr l'ouverture du STL ne marchera que sous Windows, puisque la commande 'os.startfile' n'existe pas sous les autres systèmes.

Quelques remarques en vrac :
* Evite les lignes trop ..............



............... - Bien : Au moment de stocker les valeurs, on crée soit un dictionnaire (dont les clés sont les objets, et les valeurs les déviations), soit une liste de tuples directement
* Pas la peine de supprimer les valeurs à la fin, le ramasse-miettes passera ;)

Voilà, j'ai fait le tour rapidement. :)
Bon ben j'ai du boulot ! Je m'y mets aujourd'hui :D

Au fait pour le remplacement du none, j'ai cherché un peu partout. J'en ai déduit qu'il faut le remplacer par FreeCADGui.getMainWindow()
dans par exemple QtWidgets.QMessageBox.information(FreeCADGui.getMainWindow(),'Attention',"Vous n'avez pas de document")

Merci pour tes remarques ! Ca va me faire progresser !
Macro Sketch Constraint From Spreadsheet :
https://wiki.freecad.org/Macro_Sketch_C ... adsheet/fr
openBrain
Veteran
Posts: 9034
Joined: Fri Nov 09, 2018 5:38 pm
Contact:

Re: Macro pour obtenir un stl avec des arrondis parfait

Post by openBrain »

2cv001 wrote: Sun Nov 15, 2020 6:12 am Au fait pour le remplacement du none, j'ai cherché un peu partout. J'en ai déduit qu'il faut le remplacer par FreeCADGui.getMainWindow()
dans par exemple QtWidgets.QMessageBox.information(FreeCADGui.getMainWindow(),'Attention',"Vous n'avez pas de document")
Oui c'est ça. Tu peux créer une variable globale mw = Gui.getMainWindow() que tu utiliseras à chaque fois qu'il y en a besoin. ;)
Post Reply