Blender (jusqu'à 2.49)
Python:
sauvegarder et relire 
des données brutes au format texte
    Début   Index
précédentScript : créer un clone
Script:dédoubler un mesh Suivant

Sauver une liste de points
Exemple de fichier texte
Lire une liste de points à partir d'un fichier texte
Considérations sur l'ordre des sommets
-
Sauver une liste de points
#-------------------------- 
# mesh2raw  jmsoler 2002
#--------------------------
import Blender
from Blender import NMesh

# nom du mesh, simple variable texte
objmesh='Plane.001'; 

# ouverture du fichier,  en mode ecriture : 'w'
rawfile=open("file.raw","w")

# On fait une copie en memoire de l'objet 
# mesh qui porte le nom 'Plane.001'
mesh=NMesh.GetRaw(objmesh)

# On prend successivement tous les
# sommets qui se trouvent dans la liste
# verts e l'objet mesh
for v in mesh.verts:
   # on  ecrit leur valeur sous la formed'une ligne de texte
   #donc une suite de caractères lisibles termines
   # par un caractere de saut de ligne (eventuellement
   # sous windows s'un retour chariot
   rawfile.write('%s %s %s\n' % (v.co[0],v.co[1],v.co[2]))

# fermeture du fichier
rawfile.close()

Exemple de fichier texte
 

2.41701245308 0.686016559601 -0.533006191254
2.23270797729 -0.926284015179 -0.586989879608
-4.11576223373 -1.94166660309 -0.182408288121
-4.92814302444 2.0141017437 -1.70354485512
1.78813849061e-007 1.00000011921 -6.34678602534e-014
-1.06358683109 -0.0192174054682 -0.00372261507437
-5.96046447754e-008 -0.999999880791 0.0
1.0 -2.98023223877e-008 1.00102404528e-014
0.593296229839 -0.0427923537791 2.81763219833
-1.77752256393 0.67636269331 -0.435929477215
-0.351675838232 -0.0106979254633 0.704408109188
0.148324161768 0.489302009344 0.704408049583
-1.27752304077 1.17636275291 -0.435929715633
-1.455732584 -1.28884780407 -0.0559521280229
0.148324042559 -0.510698020458 0.704408049583
-2.58967471123 -0.980442047119 -0.0930654630065
1.21126782894 -0.490718454123 -0.099409610033
0.648324072361 -0.0106980763376 0.704408228397
0.641455352306 -0.997308075428 -0.0653078630567
...

Lire une liste de points à partir d'un fichier texte

#-------------------------- 
# raw2mesh  jmsoler 2002
#--------------------------
import Blender
from Blender import NMesh

# nom du mesh, simple variable texte
objmesh='Plane.002'

# ouverture du fichier en mode lecture
rawfile=open("d:\\tmp\\file.raw","r")

# lecture en 1 seul bloc de toutes les lignes
tabraw=rawfile.readlines()

# fermeture du fichier
rawfile.close()

# On cree un pointeur en mémoire pour
# stocker l'objet mesh
mesh=NMesh.GetRaw()

# Pour l'instant, ce n'est qu'un espace
# provisoire qui n'est pas reconnu par
# blender. On pourrait parler de tampon
# memoire

# on prend successivement chaque ligne de texte enregistrée
# dans la variable tabraw
for ligne in tabraw:

    # Cette ligne est nettoyee du petit problèmes
    # que forme le caractère de saut de ligne \n
    ligne=ligne.replace('\n','')

    # On transforme la ligne en un tableau de 3
    # entrees, une pour chaque valeur x,y et z
    # en coupant sur caractère espace vide
    l=ligne.split(' ')

    # On transforme chaque élément en nombre à virgule
    # flottante
    x=float(l[0])
    y=float(l[1])
    z=float(l[2])

    # On cree un pointeur sur une variable poru y ranger 
    # ces coordonnees
    v=NMesh.Vert(x,y,z)

    # On pourrait aussi ecrire :
    # v=NMesh.Vert() 
    # v.append(x)
    # v.append(y)
    # v.append(z)

    # On ajoute cette variable à la liste de sommet du
    # mesh  que l'on est en train de creer
    mesh.verts.append(v)

# On place une copie du contenu de l'objet mesh dans l'espace 
# des données de blender
NMesh.PutRaw(mesh,objmesh)

# a ce moment-la, chaque sommet  contient les coordonnées
# dans l'ordre ou' elles ont ete lues
#
# note : tester la valeur limite sur 65000 avait du sens  en 2002
# mais aujourd'hui c'est inutile puisque  les meshes peuvent
# contenir jusqu'a' 2 milliards de sommets 

NMesh.PutRaw(mesh,objmesh) 

Considérations sur l'ordre des sommets

L'ordre dans lequel les sommets sont enregistrés est d'une importance capitale car c'est la seule information sur laquelle on peut s'appuer pour reconstituer des faces . Dans Le cas proposé dans le cadre suivant,  on suppose  au moins deux choses :les faces sont quadriangulaires et lles sommets sont correctement rangés en un tableau de nx colonnes sur ny lignes
Si ce n'est pas le cas,  par exemple parce qu'on a obtenu les sommets exportés en faisant une subdivision du mesh, le résultat sera totalement désordonné . Pour illlustrer cet situation, utilisons le script suivant qui fabrique un mesh correctement structuré 

import Blender 
from Blender import NMesh 
objmesh='Plane'

nx=30 # colonnes
ny=33 # lignes

ME=NMesh.GetRaw()
for x in range(nx):
   for y in range(ny):
      v=NMesh.Vert(float(x),float(y),0.0)
      ME.verts.append(v)

for x in range(nx-1):
    for y in range(ny-1):
        f=NMesh.Face()
        f.v.append(ME.verts[x*ny+y])
        f.v.append(ME.verts[x*ny+y+1])
        f.v.append(ME.verts[y+(x+1)*ny +1])
        f.v.append(ME.verts[y+(x+1)*(ny)])
        ME.faces.append(f)

NMesh.PutRaw(ME, objmesh)

Ce script produit une liste de sommet parfaitement ordonnés . La sauvegarde de la liste de points tel qu'on l'a vu un peu plus haut et la ré-importation avec cet autre script :
import Blender 
from Blender import NMesh 
#import math 
#from math import * 
objmesh='Plane'

rawfile=open("f:/tmp/file.raw","r") 
tabraw=rawfile.readlines(); 
rawfile.close()
mesh=NMesh.GetRaw() 
maxverts=20000000
nvert=0

for ligne in tabraw: 
 if nvert<=maxverts: 
   ligne=ligne.replace('\n','') 
   l=ligne.split(' ') 
   mesh.verts.append(NMesh.Vert(float(l[0]),float(l[1]),float(l[2]))) 
NMesh.PutRaw(mesh,objmesh)

nx=int(30)# nombre de x dans mon fichier
ny=int(33)# nombre de y dans mon fichier
 

for x in range(nx-1):
    for y in range(ny-1):
        f=NMesh.Face()
        f.v.append(mesh.verts[x*ny+y])
        f.v.append(mesh.verts[x*ny+y+1])
        f.v.append(mesh.verts[y+(x+1)*ny +1])
        f.v.append(mesh.verts[y+(x+1)*(ny)])
        mesh.faces.append(f)

NMesh.PutRaw(mesh,'Plane') 

ne poseront pas de  problème majeur . La seule difficulté réside dans l'impossibilité de savoir combien de colonnes et combien de lignes ont été enregistrées s'il y a une différence entre les deux. Cette information doit être documentée par l'utilisateur, dans un fichier séparé ou éventuellement au début du fichier . Une solution simple consiste à indiquer ces informations sur la premiere ligne .

Exemple de fichier texte (2)

990 30 33 
2.41701245308 0.686016559601 -0.533006191254
2.23270797729 -0.926284015179 -0.586989879608
-4.11576223373 -1.94166660309 -0.182408288121
-4.92814302444 2.0141017437 -1.70354485512
...

Méthode alternative
Si on n'est pas sûr de l'ordre de ses sommets  avant exportation, il faut utiliser une autre méhode de sauvegarde...
 
précédentScript : créer un clone
 Script:dédoubler un mesh Suivant
Vers le  Haut de page

Les questions concernant cette page  peuvent être posées sur  :
 news://news.zoo-logique.org/3D.Blender

Livre en français
Blender : apprenez, pratiquez, Créez, livre, Ed. Campus Press, coll. Starter Kit
Blender Starter Kit

Forum
FAQ
Lexique
Didacticiels
Compilations
Blender2KT
Débuter
Modelage
Blender python
Materiaux
Lumière
Animation
API python (eng)
Archives nzn
Statistiques
Doc flash Sculptris
Galerie Sculptris

mon site de démos sur youtube