DéScripthon
Créer un Dé avec Python pour FreeCad
Contributeur·ice·s
Statut du projet
Fonctionnel
License
CC-by-sa-3.0« CC-by-sa-3.0 » n’est pas dans la liste (Je ne sais pas, Licence à définir par la suite, Creative commons, Creative Commons Attribution CC-by-sa-3.0 France, Creative Commons Attribution CC-by-3.0 France, Creative Commons Attribution CC-by-nd-3.0 France, Creative Commons Attribution CC-by-nc-nd-3.0 France, Creative Commons Attribution CC-by-nc-3.0 France, Creative Commons Attribution CC-by-nc-sa-3.0 France, Licences libres, ...) des valeurs autorisées pour la propriété « License ».
Inspiration
Fichiers source
Machines
Matériaux
Lien
[ ]
Description du projet
Créer un Dé avec Python pour FreeCad
Objectif
- Montrer l'intérêt du scripting dans FreeCad.
- Concevoir un script aisément adaptable.
Utilisation
- Console python :
- Menu "Affichage/Vues/Console python"
- Y coller le script qui suit et c'est tout.
- DÉ supplémentaire :
Pour générer un autre dé il suffit d'appeler à nouveau la fonction :
>>> deGenetation(cubeSize)
Ou bien si on souhaite générer un autre dé d'une autre taille :
>>> deGenetation(30.0)
Le script
-
- de_scripthon.py
-
- for FreeCad
monDoc = FreeCAD.newDocument("deScripthon")
- Dimenssions
cubeSize = 20.0
- Description de la position des trous sur chaque face
aFaces=[
# 1 Z:-2
# 2 X:-2
[[-2,-1,1],[-2,1,-1]],
# 3 Y:-2
[[-1,-2,-1],[0,-2,0],[1,-2,1]],
# 4 Y:+2
[[-1,2,-1],[-1,2,1],[1,2,1],[1,2,-1]],
# 5 X:+2
[[2,-1,-1],[2,-1,1],[2,0,0],[2,1,1],[2,1,-1]],
# 6 Z:+2
[[-1,-1,2],[-1,0,2],[-1,1,2],[1,1,2],[1,0,2],[1,-1,2]]
]
def cutBall(pos, BS):
# Créer et positionner une sphère
name="Ball"
vol = monDoc.addObject("Part::Sphere",name)
vol.Radius=BS*1.33
vol.Placement.Base=App.Vector(pos[0]*BS*3,pos[1]*BS*3,pos[2]*BS*3)
return([vol,name,"C"])
def deGenetation(CS):
# Dimensions calculées
HCS = CS/2
BS = CS/12
# Tableau des volumes à créer
# Chaque élément est composé de 4 champs :
# 0 : un volume (Cube, Cylinder, ...)
# 1 : nom du volume
# 2 : opération booléenne à appliquer avec le prédécesseur
# 3 : volume résultant sur lequel sera appliquée l'opération avec le successeur
aElem=[]
# Cube de base
name="blockD"
vol = monDoc.addObject("Part::Box",name)
vol.Length=CS
vol.Width=CS
vol.Height=CS
vol.Placement.Base=App.Vector(-HCS,-HCS,-HCS)
aElem.append([vol,name,""])
# une sphère par point à marquer sur chaque face
for f in aFaces:
for b in f:
aElem.append(cutBall(b, BS))
# Opérations booléenes
# Parcourir le tableau des volumes créés
aPrev=[]
aElem[0][2]= # the first element can't be Cut or Fuse
for elem in aElem:
vol=elem[0]
name=elem[1]
oper=elem[2]
if oper=="C":
bVol=monDoc.addObject("Part::Cut","Cut"+name)
bVol.Base=aPrev[3] #
bVol.Tool=vol
Gui.activeDocument().hide(aPrev[1])
Gui.activeDocument().hide(name)
elem.append(bVol)
elif oper=="F":
bVol=monDoc.addObject("Part::Fuse","Fuse"+name)
bVol.Base=aPrev[3]
bVol.Tool=vol
Gui.activeDocument().hide(aPrev[1])
Gui.activeDocument().hide(name)
elem.append(bVol)
else:
elem.append(vol)
aPrev=elem
monDoc.recompute()
# Création des congés sur les arrêtes
# Les numéros des "Edges" (-1) sont récupérés manuellement
# en utilisant l'interface graphique (je n'ai pas trouvé mieux)
monDoc.ActiveObject.Shape = monDoc.ActiveObject.Shape.makeFillet(BS,[
monDoc.ActiveObject.Shape.Edges[0],
monDoc.ActiveObject.Shape.Edges[1],
monDoc.ActiveObject.Shape.Edges[2],
monDoc.ActiveObject.Shape.Edges[3],
monDoc.ActiveObject.Shape.Edges[5],
monDoc.ActiveObject.Shape.Edges[6],
monDoc.ActiveObject.Shape.Edges[7],
monDoc.ActiveObject.Shape.Edges[12],
monDoc.ActiveObject.Shape.Edges[13],
monDoc.ActiveObject.Shape.Edges[22],
monDoc.ActiveObject.Shape.Edges[23],
monDoc.ActiveObject.Shape.Edges[30]
])
deGenetation(cubeSize)