DéScripthon

De fablabo
Aller à : navigation, rechercher


Créer un Dé avec Python pour FreeCad

DéScripthon.png

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




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

  1. de_scripthon.py
  2. for FreeCad

monDoc = FreeCAD.newDocument("deScripthon")

  1. Dimenssions

cubeSize = 20.0

  1. 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 :
   #   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)