Jean-Marie Favreau — ISIMA 3ème année F1
cette séance de TP fait partie du module géométrie algorithmique
sauf remarque contraire, les images sont issues de http://blender.org
# Fonction factorielle en Python
def factorielle(n):
if n < 2:
return 1
else:
return n * factorielle(n - 1)
Lancer blender depuis une console...
Operator Simple
import bpy
def main(context):
for ob in context.scene.objects:
print(ob)
class SimpleOperator(bpy.types.Operator):
"""Tooltip"""
bl_idname = "object.simple_operator"
bl_label = "Simple Object Operator"
@classmethod
def poll(cls, context):
return context.active_object is not None
def execute(self, context):
main(context)
return {'FINISHED'}
def register():
bpy.utils.register_class(SimpleOperator)
def unregister():
bpy.utils.unregister_class(SimpleOperator)
if __name__ == "__main__":
register()
# test call
bpy.ops.object.simple_operator()
L'exécution de ce script enregistre l'opérateur auprès de blender
BMesh simple Editmode
# This example assumes we have a mesh object in edit-mode
import bpy
import bmesh
# Get the active mesh
obj = bpy.context.edit_object
me = obj.data
# Get a BMesh representation
bm = bmesh.from_edit_mesh(me)
bm.faces.active = None
# Modify the BMesh, can do anything here...
for v in bm.verts:
v.co.x += 1.0
# Show the updates in the viewport
# and recalculate n-gon tessellation.
bmesh.update_edit_mesh(me, True)
Ce script ne fonctionne que lorsqu'un maillage est en edit mode
Remarque : choisir la documentation qui correspond à votre version de blender
import bpy
import bmesh
def main(context):
for ob in context.scene.objects:
print(ob)
class TopologyOperator(bpy.types.Operator):
'''Tooltip'''
bl_idname = "object.topology_operator"
bl_label = "Get topology operator"
@classmethod
def poll(cls, context):
return context.active_object.type == 'MESH'
def surface(self, mesh):
for v in mesh.verts:
if not v.is_manifold:
return False
return True
def computeNbCC(self, mesh):
self.nbCC = 0
# TODO
def displayNbCC(self, menu, context):
menu.layout.label(text="Nombre de composantes connexes: "+str(self.nbCC))
def execute(self, context):
main(context)
mesh = bmesh.new()
mesh.from_mesh(context.active_object.data)
if not self.surface(mesh):
self.report({'ERROR'}, "The selected mesh is not a surface")
return {'CANCELLED'}
self.computeNbCC(mesh)
bpy.context.window_manager.popup_menu(self.displayNbCC, title="Topology", icon='INFO')
return {'FINISHED'}
def register():
bpy.utils.register_class(TopologyOperator)
def unregister():
bpy.utils.unregister_class(TopologyOperator)
if __name__ == "__main__":
register()
# test call
bpy.ops.object.topology_operator()
Compléter l'opérateur pour qu'il...
Question 1 compte le nombre de composantes connexes contenues dans un maillage.
implémentation récursive, ou avec une liste, on utilise la propriété tag des sommets
Question 2 calcule le genre d'un maillage, en supposant que le maillage donné est sans bord, et à une seule composante connexe.
on suppose que l'objet est bien une surface, et on utilise la caractéristique d'Euler
Question 3 calcule le nombre de bords d'un maillage à une seule composante connexe.
on utilise un parcours en largeur, on utilise la propriété is_boundary des arêtes
Question 4 calcule le genre d'un maillage (possiblement à bord) à une seule composante connexe.
on suppose que l'objet est bien une surface, et on utilise la caractéristique d'Euler généralisée
Question 5 calcule le genre de chaque composante connexe d'un maillage (possiblement à bord).