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?
Répondre
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)
Merci beaucoup! –
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. –
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. –
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
Comment puis-je rechercher des informations à ce sujet? –
@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
Merci les gars, j'ai trouvé le fichier. Ici, je l'ai téléchargé, et inclus un fichier de particules pour vous.
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
Allez, juste marquer quelques réponses acceptées ... – Skilldrick
Désolé, je ne savais pas que je devais. –