DéScripthon : Différence entre versions
De fablabo
(→Le script) |
|||
Ligne 139 : | Ligne 139 : | ||
</code> | </code> | ||
+ | |||
+ | [[Catégorie:3D]] | ||
+ | [[Catégorie:FreeCAD]] |
Version du 13 février 2015 à 14:42
Créer un Dé avec Python pour FreeCad
Contributeur·ice·s
Statut du projet
Fonctionnel
Statut de la publication
License
CC-by-sa-3.0
Inspiration
Documentation Python de FreeCad
Fichiers source
Machines
Matériaux
Lien
Sommaire
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)