Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'doc/blender_file_format/BlendFileReader.py')
-rw-r--r--doc/blender_file_format/BlendFileReader.py126
1 files changed, 63 insertions, 63 deletions
diff --git a/doc/blender_file_format/BlendFileReader.py b/doc/blender_file_format/BlendFileReader.py
index a4d2f494c5b..d4aed722578 100644
--- a/doc/blender_file_format/BlendFileReader.py
+++ b/doc/blender_file_format/BlendFileReader.py
@@ -7,7 +7,7 @@
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
-# This program is distributed in the hope that it will be useful,
+# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
@@ -34,6 +34,7 @@ log = logging.getLogger("BlendFileReader")
# module global routines
######################################################
+
def ReadString(handle, length):
'''
ReadString reads a String of given length or a zero terminating String
@@ -45,7 +46,7 @@ def ReadString(handle, length):
# length == 0 means we want a zero terminating string
result = ""
s = ReadString(handle, 1)
- while s!="\0":
+ while s != "\0":
result += s
s = ReadString(handle, 1)
return result
@@ -57,7 +58,7 @@ def Read(type, handle, fileheader):
'''
def unpacked_bytes(type_char, size):
return struct.unpack(fileheader.StructPre + type_char, handle.read(size))[0]
-
+
if type == 'ushort':
return unpacked_bytes("H", 2) # unsigned short
elif type == 'short':
@@ -94,10 +95,10 @@ def openBlendFile(filename):
log.debug("decompressing started")
fs = gzip.open(filename, "rb")
handle = tempfile.TemporaryFile()
- data = fs.read(1024*1024)
- while data:
- handle.write(data)
- data = fs.read(1024*1024)
+ data = fs.read(1024 * 1024)
+ while data:
+ handle.write(data)
+ data = fs.read(1024 * 1024)
log.debug("decompressing finished")
fs.close()
log.debug("resetting decompressed file")
@@ -112,7 +113,7 @@ def Align(handle):
offset = handle.tell()
trim = offset % 4
if trim != 0:
- handle.seek(4-trim, os.SEEK_CUR)
+ handle.seek(4 - trim, os.SEEK_CUR)
######################################################
@@ -121,14 +122,14 @@ def Align(handle):
class BlendFile:
'''
- Reads a blendfile and store the header, all the fileblocks, and catalogue
+ Reads a blendfile and store the header, all the fileblocks, and catalogue
structs foound in the DNA fileblock
-
+
- BlendFile.Header (BlendFileHeader instance)
- BlendFile.Blocks (list of BlendFileBlock instances)
- BlendFile.Catalog (DNACatalog instance)
'''
-
+
def __init__(self, handle):
log.debug("initializing reading blend-file")
self.Header = BlendFileHeader(handle)
@@ -141,13 +142,13 @@ class BlendFile:
found_dna_block = True
else:
fileblock.Header.skip(handle)
-
+
self.Blocks.append(fileblock)
fileblock = BlendFileBlock(handle, self)
-
+
# appending last fileblock, "ENDB"
self.Blocks.append(fileblock)
-
+
# seems unused?
"""
def FindBlendFileBlocksWithCode(self, code):
@@ -164,27 +165,27 @@ class BlendFileHeader:
BlendFileHeader allocates the first 12 bytes of a blend file.
It contains information about the hardware architecture.
Header example: BLENDER_v254
-
+
BlendFileHeader.Magic (str)
BlendFileHeader.PointerSize (int)
BlendFileHeader.LittleEndianness (bool)
BlendFileHeader.StructPre (str) see http://docs.python.org/py3k/library/struct.html#byte-order-size-and-alignment
BlendFileHeader.Version (int)
'''
-
+
def __init__(self, handle):
log.debug("reading blend-file-header")
-
+
self.Magic = ReadString(handle, 7)
log.debug(self.Magic)
-
+
pointersize = ReadString(handle, 1)
log.debug(pointersize)
if pointersize == "-":
self.PointerSize = 8
if pointersize == "_":
self.PointerSize = 4
-
+
endianness = ReadString(handle, 1)
log.debug(endianness)
if endianness == "v":
@@ -193,11 +194,11 @@ class BlendFileHeader:
if endianness == "V":
self.LittleEndianness = False
self.StructPre = ">"
-
+
version = ReadString(handle, 3)
log.debug(version)
self.Version = int(version)
-
+
log.debug("{0} {1} {2} {3}".format(self.Magic, self.PointerSize, self.LittleEndianness, version))
@@ -206,11 +207,11 @@ class BlendFileBlock:
BlendFileBlock.File (BlendFile)
BlendFileBlock.Header (FileBlockHeader)
'''
-
+
def __init__(self, handle, blendfile):
self.File = blendfile
self.Header = FileBlockHeader(handle, blendfile.Header)
-
+
def Get(self, handle, path):
log.debug("find dna structure")
dnaIndex = self.Header.SDNAIndex
@@ -232,7 +233,7 @@ class FileBlockHeader:
Count (int)
FileOffset (= file pointer of datablock)
'''
-
+
def __init__(self, handle, fileheader):
self.Code = ReadString(handle, 4).strip()
if self.Code != "ENDB":
@@ -257,28 +258,28 @@ class FileBlockHeader:
class DNACatalog:
'''
DNACatalog is a catalog of all information in the DNA1 file-block
-
+
Header = None
Names = None
Types = None
Structs = None
'''
-
+
def __init__(self, fileheader, handle):
log.debug("building DNA catalog")
- self.Names=[]
- self.Types=[]
- self.Structs=[]
+ self.Names = []
+ self.Types = []
+ self.Structs = []
self.Header = fileheader
-
+
SDNA = ReadString(handle, 4)
-
+
# names
NAME = ReadString(handle, 4)
numberOfNames = Read('uint', handle, fileheader)
log.debug("building #{0} names".format(numberOfNames))
for i in range(numberOfNames):
- name = ReadString(handle,0)
+ name = ReadString(handle, 0)
self.Names.append(DNAName(name))
Align(handle)
@@ -287,7 +288,7 @@ class DNACatalog:
numberOfTypes = Read('uint', handle, fileheader)
log.debug("building #{0} types".format(numberOfTypes))
for i in range(numberOfTypes):
- type = ReadString(handle,0)
+ type = ReadString(handle, 0)
self.Types.append(DNAType(type))
Align(handle)
@@ -321,24 +322,24 @@ class DNACatalog:
class DNAName:
'''
DNAName is a C-type name stored in the DNA.
-
+
Name = str
'''
-
+
def __init__(self, name):
self.Name = name
-
+
def AsReference(self, parent):
if parent is None:
result = ""
else:
- result = parent+"."
-
+ result = parent + "."
+
result = result + self.ShortName()
return result
def ShortName(self):
- result = self.Name;
+ result = self.Name
result = result.replace("*", "")
result = result.replace("(", "")
result = result.replace(")", "")
@@ -346,12 +347,12 @@ class DNAName:
if Index != -1:
result = result[0:Index]
return result
-
+
def IsPointer(self):
- return self.Name.find("*")>-1
+ return self.Name.find("*") > -1
def IsMethodPointer(self):
- return self.Name.find("(*")>-1
+ return self.Name.find("(*") > -1
def ArraySize(self):
result = 1
@@ -360,10 +361,10 @@ class DNAName:
while Index != -1:
Index2 = Temp.find("]")
- result*=int(Temp[Index+1:Index2])
- Temp = Temp[Index2+1:]
+ result *= int(Temp[Index + 1:Index2])
+ Temp = Temp[Index2 + 1:]
Index = Temp.find("[")
-
+
return result
@@ -375,46 +376,46 @@ class DNAType:
Size = int
Structure = DNAStructure
'''
-
+
def __init__(self, aName):
self.Name = aName
- self.Structure=None
+ self.Structure = None
class DNAStructure:
'''
DNAType is a C-type structure stored in the DNA
-
+
Type = DNAType
Fields = [DNAField]
'''
-
+
def __init__(self, aType):
self.Type = aType
self.Type.Structure = self
- self.Fields=[]
-
+ self.Fields = []
+
def GetField(self, header, handle, path):
splitted = path.partition(".")
name = splitted[0]
rest = splitted[2]
- offset = 0;
+ offset = 0
for field in self.Fields:
if field.Name.ShortName() == name:
- log.debug("found "+name+"@"+str(offset))
+ log.debug("found " + name + "@" + str(offset))
handle.seek(offset, os.SEEK_CUR)
return field.DecodeField(header, handle, rest)
else:
offset += field.Size(header)
- log.debug("error did not find "+path)
+ log.debug("error did not find " + path)
return None
class DNAField:
'''
DNAField is a coupled DNAType and DNAName.
-
+
Type = DNAType
Name = DNAName
'''
@@ -422,25 +423,24 @@ class DNAField:
def __init__(self, aType, aName):
self.Type = aType
self.Name = aName
-
+
def Size(self, header):
if self.Name.IsPointer() or self.Name.IsMethodPointer():
- return header.PointerSize*self.Name.ArraySize()
+ return header.PointerSize * self.Name.ArraySize()
else:
- return self.Type.Size*self.Name.ArraySize()
+ return self.Type.Size * self.Name.ArraySize()
def DecodeField(self, header, handle, path):
if path == "":
if self.Name.IsPointer():
return Read('pointer', handle, header)
- if self.Type.Name=="int":
+ if self.Type.Name == "int":
return Read('int', handle, header)
- if self.Type.Name=="short":
+ if self.Type.Name == "short":
return Read('short', handle, header)
- if self.Type.Name=="float":
+ if self.Type.Name == "float":
return Read('float', handle, header)
- if self.Type.Name=="char":
+ if self.Type.Name == "char":
return ReadString(handle, self.Name.ArraySize())
else:
return self.Type.Structure.GetField(header, handle, path)
-