TP 2 — Intro. à la programmation géométrique

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

Quelques notions de python

En quelques mots...

  • favorise la programmation impérative structurée, fonctionnelle et orientée objet
  • typage dynamique fort
  • gestion automatique de la mémoire par ramasse-miettes
  • système de gestion d'exceptions
# Fonction factorielle en Python
 def factorielle(n):
   if n < 2:
     return 1
   else:
     return n * factorielle(n - 1)
  • indentation comme syntaxe

En quelques liens...

Python dans blender

Python par l'interface

Lancer blender depuis une console...

Python par l'interface

Python par l'interface

Créer un opérateur

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

Écrire un petit script

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

L'API BMesh

Remarque : choisir la documentation qui correspond à votre version de blender

Exercices

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).