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
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é.
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 : Perso j'ai mis 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__