Modifications

DéScripthon

3 954 octets ajoutés, 1 décembre 2014 à 21:55
Page créée avec « {{Projet |status=Fonctionnel |image=DéScripthon.png |description=Créer un Dé avec Python pour FreeCad |license=CC-by-sa-3.0 |contributeurs=Philippe Bonnet, |inspirati... »
{{Projet
|status=Fonctionnel
|image=DéScripthon.png
|description=Créer un Dé avec Python pour FreeCad
|license=CC-by-sa-3.0
|contributeurs=Philippe Bonnet,
|inspiration=Documentation Python de 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 :
<code> >>> deGenetation(cubeSize) </code>
Ou bien si on souhaite générer un autre dé d'une autre taille :
<code> >>> deGenetation(30.0) </code>


== Le script ==

<code>
#
# 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
[[0,0,-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 :
# 1 : un volume (Cube, Cylinder, ...)
# 2 : nom du volume
# 3 : opération booléenne à appliquer avec le prédécesseur
# 4 : 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)
#vol.Shape = vol.Shape.makeFillet(2,vol.Shape.Edges)
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)

</code>
745
modifications