diff options
Diffstat (limited to 'doc')
-rwxr-xr-x | doc/blender_file_format/BlendFileDnaExporter_25.py | 168 | ||||
-rw-r--r-- | doc/blender_file_format/BlendFileReader.py | 126 | ||||
-rwxr-xr-x | doc/manpage/blender.1.py | 1 | ||||
-rw-r--r-- | doc/python_api/sphinx_doc_gen.py | 7 |
4 files changed, 154 insertions, 148 deletions
diff --git a/doc/blender_file_format/BlendFileDnaExporter_25.py b/doc/blender_file_format/BlendFileDnaExporter_25.py index 64c92c7cf80..a9da79f04d8 100755 --- a/doc/blender_file_format/BlendFileDnaExporter_25.py +++ b/doc/blender_file_format/BlendFileDnaExporter_25.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. @@ -22,21 +22,21 @@ # # Name: # dna.py -# +# # Description: # Creates a browsable DNA output to HTML. -# +# # Author: # Jeroen Bakker -# +# # Version: # v0.1 (12-05-2009) - migration of original source code to python. # Added code to support blender 2.5 branch # v0.2 (25-05-2009) - integrated with BlendFileReader.py -# +# # Input: # blender build executable -# +# # Output: # dna.html # dna.css (will only be created when not existing) @@ -76,12 +76,12 @@ class DNACatalogHTML: DNACatalog is a catalog of all information in the DNA1 file-block ''' - def __init__(self, catalog, bpy_module = None): + def __init__(self, catalog, bpy_module=None): self.Catalog = catalog self.bpy = bpy_module - + def WriteToHTML(self, handle): - + dna_html_template = """ <!DOCTYPE html PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN http://www.w3.org/TR/html4/loose.dtd> <html> @@ -105,10 +105,10 @@ class DNACatalogHTML: ${structs_content} </body> </html>""" - + header = self.Catalog.Header bpy = self.bpy - + # ${version} and ${revision} if bpy: version = '.'.join(map(str, bpy.app.version)) @@ -116,7 +116,7 @@ class DNACatalogHTML: else: version = str(header.Version) revision = 'Unknown' - + # ${bitness} if header.PointerSize == 8: bitness = '64 bit' @@ -125,10 +125,10 @@ class DNACatalogHTML: # ${endianness} if header.LittleEndianness: - endianess= 'Little endianness' + endianess = 'Little endianness' else: - endianess= 'Big endianness' - + endianess = 'Big endianness' + # ${structs_list} log.debug("Creating structs index") structs_list = '' @@ -136,7 +136,7 @@ class DNACatalogHTML: structureIndex = 0 for structure in self.Catalog.Structs: structs_list += list_item.format(structureIndex, structure.Type.Name) - structureIndex+=1 + structureIndex += 1 # ${structs_content} log.debug("Creating structs content") @@ -144,20 +144,20 @@ class DNACatalogHTML: for structure in self.Catalog.Structs: log.debug(structure.Type.Name) structs_content += self.Structure(structure) - + d = dict( - version = version, - revision = revision, - bitness = bitness, - endianness = endianess, - structs_list = structs_list, - structs_content = structs_content + version=version, + revision=revision, + bitness=bitness, + endianness=endianess, + structs_list=structs_list, + structs_content=structs_content ) dna_html = Template(dna_html_template).substitute(d) dna_html = self.format(dna_html) handle.write(dna_html) - + def Structure(self, structure): struct_table_template = """ <table><a name="${struct_name}"></a> @@ -178,23 +178,23 @@ class DNACatalogHTML: </table> <label>Total size: ${size} bytes</label><br/> <label>(<a href="#top">top</a>)</label><br/>""" - + d = dict( - struct_name = structure.Type.Name, - fields = self.StructureFields(structure, None, 0), - size = str(structure.Type.Size) + struct_name=structure.Type.Name, + fields=self.StructureFields(structure, None, 0), + size=str(structure.Type.Size) ) - + struct_table = Template(struct_table_template).substitute(d) return struct_table - + def StructureFields(self, structure, parentReference, offset): fields = '' for field in structure.Fields: fields += self.StructureField(field, structure, parentReference, offset) offset += field.Size(self.Catalog.Header) return fields - + def StructureField(self, field, structure, parentReference, offset): structure_field_template = """ <tr> @@ -205,7 +205,7 @@ class DNACatalogHTML: <td>${offset}</td> <td>${size}</td> </tr>""" - + if field.Type.Structure is None or field.Name.IsPointer(): # ${reference} @@ -216,37 +216,37 @@ class DNACatalogHTML: struct = '<a href="#{0}">{0}</a>'.format(structure.Type.Name) else: struct = structure.Type.Name - + # ${type} type = field.Type.Name - + # ${name} name = field.Name.Name - + # ${offset} # offset already set - + # ${size} size = field.Size(self.Catalog.Header) - + d = dict( - reference = reference, - struct = struct, - type = type, - name = name, - offset = offset, - size = size + reference=reference, + struct=struct, + type=type, + name=name, + offset=offset, + size=size ) - + structure_field = Template(structure_field_template).substitute(d) - + elif field.Type.Structure is not None: reference = field.Name.AsReference(parentReference) - structure_field = self.StructureFields(field.Type.Structure, reference, offset) + structure_field = self.StructureFields(field.Type.Structure, reference, offset) return structure_field - def indent(self, input, dent, startswith = ''): + def indent(self, input, dent, startswith=''): output = '' if dent < 0: for line in input.split('\n'): @@ -257,19 +257,19 @@ class DNACatalogHTML: output += line.lstrip() + '\n' # remove indentation completely elif dent > 0: for line in input.split('\n'): - output += ' '* dent + line + '\n' + output += ' ' * dent + line + '\n' return output - + def format(self, input): diff = { - '\n<!DOCTYPE':'<!DOCTYPE', - '\n</ul>' :'</ul>', - '<a name' :'\n<a name', - '<tr>\n' :'<tr>', - '<tr>' :' <tr>', - '</th>\n' :'</th>', - '</td>\n' :'</td>', - '<tbody>\n' :'<tbody>' + '\n<!DOCTYPE': '<!DOCTYPE', + '\n</ul>': '</ul>', + '<a name': '\n<a name', + '<tr>\n': '<tr>', + '<tr>': ' <tr>', + '</th>\n': '</th>', + '</td>\n': '</td>', + '<tbody>\n': '<tbody>' } output = self.indent(input, 0) for key, value in diff.items(): @@ -283,17 +283,17 @@ class DNACatalogHTML: ''' css = """ @CHARSET "ISO-8859-1"; - + body { font-family: verdana; font-size: small; } - + div.title { font-size: large; text-align: center; } - + h1 { page-break-before: always; } @@ -304,7 +304,7 @@ class DNACatalogHTML: margin-right: 3%; padding-left: 40px; } - + h1:hover{ background-color: #EBEBEB; } @@ -312,7 +312,7 @@ class DNACatalogHTML: h3 { padding-left: 40px; } - + table { border-width: 1px; border-style: solid; @@ -321,21 +321,21 @@ class DNACatalogHTML: width: 94%; margin: 20px 3% 10px; } - + caption { margin-bottom: 5px; } - + th { background-color: #000000; color:#ffffff; padding-left:5px; padding-right:5px; } - + tr { } - + td { border-width: 1px; border-style: solid; @@ -343,12 +343,12 @@ class DNACatalogHTML: padding-left:5px; padding-right:5px; } - + label { float:right; margin-right: 3%; } - + ul.multicolumn { list-style:none; float:left; @@ -361,18 +361,18 @@ class DNACatalogHTML: width:200px; margin-right:0px; } - + a { color:#a000a0; text-decoration:none; } - + a:hover { color:#a000a0; text-decoration:underline; } """ - + css = self.indent(css, 0) handle.write(css) @@ -389,13 +389,13 @@ def usage(): print("\tdefault: % blender2.5 --background -noaudio --python BlendFileDnaExporter_25.py") print("\twith options: % blender2.5 --background -noaudio --python BlendFileDnaExporter_25.py -- --dna-keep-blend --dna-debug\n") - + ###################################################### # Main ###################################################### def main(): - + import os, os.path try: @@ -408,37 +408,37 @@ def main(): else: filename = 'dna' dir = os.path.dirname(__file__) - Path_Blend = os.path.join(dir, filename + '.blend') # temporary blend file - Path_HTML = os.path.join(dir, filename + '.html') # output html file - Path_CSS = os.path.join(dir, 'dna.css') # output css file + Path_Blend = os.path.join(dir, filename + '.blend') # temporary blend file + Path_HTML = os.path.join(dir, filename + '.html') # output html file + Path_CSS = os.path.join(dir, 'dna.css') # output css file # create a blend file for dna parsing if not os.path.exists(Path_Blend): log.info("1: write temp blend file with SDNA info") log.info(" saving to: " + Path_Blend) try: - bpy.ops.wm.save_as_mainfile(filepath = Path_Blend, copy = True, compress = False) + bpy.ops.wm.save_as_mainfile(filepath=Path_Blend, copy=True, compress=False) except: log.error("Filename {0} does not exist and can't be created... quitting".format(Path_Blend)) return else: log.info("1: found blend file with SDNA info") log.info(" " + Path_Blend) - + # read blend header from blend file log.info("2: read file:") - + if not dir in sys.path: sys.path.append(dir) import BlendFileReader - + handle = BlendFileReader.openBlendFile(Path_Blend) blendfile = BlendFileReader.BlendFile(handle) catalog = DNACatalogHTML(blendfile.Catalog, bpy) # close temp file handle.close() - + # deleting or not? if '--dna-keep-blend' in sys.argv: # keep the blend, useful for studying hexdumps @@ -449,7 +449,7 @@ def main(): log.info("5: close and delete temp blend:") log.info(" {0}".format(Path_Blend)) os.remove(Path_Blend) - + # export dna to xhtml log.info("6: export sdna to xhtml file: %r" % Path_HTML) handleHTML = open(Path_HTML, "w") @@ -466,12 +466,12 @@ def main(): if not bpy.app.background: log.info("7: quit blender") bpy.ops.wm.exit_blender() - + except ImportError: log.warning(" skipping, not running in Blender") usage() sys.exit(2) - + if __name__ == '__main__': main() 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) - diff --git a/doc/manpage/blender.1.py b/doc/manpage/blender.1.py index 52856717b4a..0890547906a 100755 --- a/doc/manpage/blender.1.py +++ b/doc/manpage/blender.1.py @@ -42,6 +42,7 @@ def man_format(data): data = data.replace("\t", " ") return data + if len(sys.argv) != 3: import getopt raise getopt.GetoptError("Usage: %s <path-to-blender> <output-filename>" % sys.argv[0]) diff --git a/doc/python_api/sphinx_doc_gen.py b/doc/python_api/sphinx_doc_gen.py index b0200c0f7d8..bfa8a295f5b 100644 --- a/doc/python_api/sphinx_doc_gen.py +++ b/doc/python_api/sphinx_doc_gen.py @@ -73,6 +73,8 @@ def rna_info_BuildRNAInfo_cache(): if rna_info_BuildRNAInfo_cache.ret is None: rna_info_BuildRNAInfo_cache.ret = rna_info.BuildRNAInfo() return rna_info_BuildRNAInfo_cache.ret + + rna_info_BuildRNAInfo_cache.ret = None # --- end rna_info cache @@ -434,7 +436,7 @@ else: BLENDER_VERSION_DOTS = ".".join(blender_version_strings) if BLENDER_REVISION != "Unknown": # '2.62a SHA1' (release) or '2.62.1 SHA1' (non-release) - BLENDER_VERSION_DOTS += " " + BLENDER_REVISION + BLENDER_VERSION_DOTS += " " + BLENDER_REVISION if is_release: # '2_62a_release' @@ -516,6 +518,8 @@ def escape_rst(text): """ Escape plain text which may contain characters used by RST. """ return text.translate(escape_rst.trans) + + escape_rst.trans = str.maketrans({ "`": "\\`", "|": "\\|", @@ -1018,6 +1022,7 @@ def pymodule2sphinx(basepath, module_name, module, title): file.close() + # Changes in Blender will force errors here context_type_map = { "active_base": ("ObjectBase", False), |