2009-11-08 6 views
1

J'ai exporté un fichier .bin à partir de RealFlow 4 et je dois maintenant pouvoir le lire en Python, pour en faire un importateur. Comment fonctionnent ces fichiers?Comment lire les fichiers .bin?

+2

Je suis d'accord avec jldupont sur celui-là. En outre, il ressemble à un doublon (je suppose que vous ne voulez pas écrire tout l'analyseur?): Http://stackoverflow.com/questions/1035340/reading-binary-file-in-python – RedGlyph

+0

Allez, juste marquer quelques réponses acceptées ... – Skilldrick

+0

Désolé, je ne savais pas que je devais. –

Répondre

4

Ici, vous allez:

import struct 

class Particle: 
    """A single particle. Attributes added in BinFile.""" 
    pass 

class BinFile: 
    """Parse and store the contents of a RealFlow .bin file.""" 
    def __init__(self, fname): 
     self.bindata = open(fname, "rb").read() 
     self.off = 0 

     self.verify = self.peel("=i")[0] 
     assert self.verify == 0xfabada 
     self.name = self.string(250) 

     (self.version, self.scale, self.fluid_type, self.simtime, self.frame_number, 
     self.fps, self.num_particles, self.radius) = self.peel("=hfifiiif") 
     self.pressure = self.peel("=fff") 
     self.speed = self.peel("=fff") 
     self.temperature = self.peel("=fff") 
     if self.version >= 7: 
      self.emitter_position = self.peel("=fff") 
      self.emitter_rotation = self.peel("=fff") 
      self.emitter_scale = self.peel("=fff") 

     self.particles = [self.peel_particle() for i in range(self.num_particles)] 

    def peel_particle(self): 
     """Read one particle from the file.""" 
     p = Particle() 
     p.position = self.peel("=fff") 
     p.velocity = self.peel("=fff") 
     p.force = self.peel("=fff") 
     if self.version >= 9: 
      p.vorticity = self.peel("=fff") 
     if self.version >= 3: 
      p.normal = self.peel("=fff") 
     if self.version >= 4: 
      p.neighbors = self.peel("=i")[0] 
     if self.version >= 5: 
      p.texture = self.peel("=fff") 
      p.infobits = self.peel("=h")[0] 
     (p.age, p.isolation_time, p.viscosity, p.density, p.pressure, p.mass, 
     p.temperature, p.id) = self.peel("=fffffffi") 
     print p.id, p.neighbors, p.position 
     return p 

    def peel(self, fmt): 
     """Read some struct data from `self.bindata`.""" 
     data = struct.unpack_from(fmt, self.bindata, self.off) 
     self.off += struct.calcsize(fmt) 
     return data 

    def string(self, length): 
     s = self.bindata[self.off:self.off+length].split("\0")[0] 
     self.off += length 
     return s 

b = BinFile("Circle0100001.bin") 
print "Name:", b.name 
print "Particles:", b.num_particles 
print "Position of first particle", b.particles[0].position 

Effectué sur vos données d'échantillon, il imprime:

Name: Circle01 
Particles: 1066 
Position of first particle (-1.7062506675720215, 4.9283280372619629, -6.4365010261535645) 
+0

Merci beaucoup! –

+0

Il y a toujours un problème avec ça. Lorsque j'ajoute les particules dans Blender comme des vertex, le plus loin dans la liste les positions les plus étranges qu'elles prennent. A la fin de la liste I obtenu avec des particules de positions (0,00084405858069658279, 7.0503529635574521e-41, 2,277950783606 4226e-41) ou (201863462912,0, -9.4222019546613521e-38, 2.0722401690435395e-4 1) et ça donne un mauvais résultat. J'ai besoin de savoir si le problème est avec le script que vous avez écrit ou dans le fichier bin lui-même, et s'il y a une solution de quelque sorte. –

+0

Ajoutez des instructions d'impression de débogage à ce script pour voir si les positions deviennent étranges vers la fin de la liste. Si ce n'est pas le cas, le problème se trouve dans votre script Blender. –

1

Vous devez savoir comment les données sont codées dans le fichier. Si vous avez cette information, vous pouvez utiliser le struct package pour convertir les données binaires en quelque chose qui peut être utilisé en python.

J'espère que cela aide

+0

Comment puis-je rechercher des informations à ce sujet? –

+1

@terabytest: Vérifiez le commentaire de Ned pour voir comment les obtenir (vous devrez peut-être déplier les commentaires avec le 'ajouter/show .. more comments'). – RedGlyph