Package pyffi :: Package formats :: Package dae
[hide private]
[frames] | no frames]

Source Code for Package pyffi.formats.dae

  1  """ 
  2  :mod:`pyffi.formats.dae` --- COLLADA (.dae) 
  3  =========================================== 
  4   
  5  .. warning:: 
  6      
  7     This module is not yet fully implemented, and is certainly not 
  8     yet useful in its current state. 
  9   
 10  Implementation 
 11  -------------- 
 12   
 13  .. autoclass:: DaeFormat 
 14     :show-inheritance: 
 15     :members: 
 16   
 17  Regression tests 
 18  ---------------- 
 19   
 20  Create a DAE file 
 21  ^^^^^^^^^^^^^^^^^ 
 22   
 23  >>> daedata = DaeFormat.Data() 
 24  >>> print(daedata.collada) # doctest: +ELLIPSIS 
 25  <pyffi.formats.dae.Collada object at ...> 
 26   
 27  Read a DAE file 
 28  ^^^^^^^^^^^^^^^ 
 29   
 30  >>> # check and read dae file 
 31  >>> stream = open('tests/dae/cube.dae', 'rb') 
 32  >>> daedata = DaeFormat.Data() 
 33  >>> daedata.read(stream) # doctest: +ELLIPSIS 
 34  Traceback (most recent call last): 
 35      ... 
 36  NotImplementedError 
 37  >>> # get DAE file root element 
 38  >>> #print(daedata.getRootElement()) 
 39  >>> stream.close() 
 40   
 41  Parse all DAE files in a directory tree 
 42  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
 43   
 44  >>> for stream, data in DaeFormat.walkData('tests/dae'): 
 45  ...     try: 
 46  ...         # the replace call makes the doctest also pass on windows 
 47  ...         print("reading %s" % stream.name.replace("\\\\", "/")) 
 48  ...         data.read(stream) 
 49  ...     except Exception: 
 50  ...         print("Warning: read failed due corrupt file, corrupt format description, or bug.") 
 51  reading tests/dae/cube.dae 
 52  Warning: read failed due corrupt file, corrupt format description, or bug. 
 53   
 54  Create a DAE file from scratch and write to file 
 55  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
 56   
 57  >>> daedata = DaeFormat.Data() 
 58  >>> from tempfile import TemporaryFile 
 59  >>> stream = TemporaryFile() 
 60  >>> daedata.write(stream) # doctest: +ELLIPSIS 
 61  Traceback (most recent call last): 
 62      ... 
 63  NotImplementedError 
 64  """ 
 65   
 66  # ***** BEGIN LICENSE BLOCK ***** 
 67  # 
 68  # Copyright (c) 2007-2011, Python File Format Interface 
 69  # All rights reserved. 
 70  # 
 71  # Redistribution and use in source and binary forms, with or without 
 72  # modification, are permitted provided that the following conditions 
 73  # are met: 
 74  # 
 75  #    * Redistributions of source code must retain the above copyright 
 76  #      notice, this list of conditions and the following disclaimer. 
 77  # 
 78  #    * Redistributions in binary form must reproduce the above 
 79  #      copyright notice, this list of conditions and the following 
 80  #      disclaimer in the documentation and/or other materials provided 
 81  #      with the distribution. 
 82  # 
 83  #    * Neither the name of the Python File Format Interface 
 84  #      project nor the names of its contributors may be used to endorse 
 85  #      or promote products derived from this software without specific 
 86  #      prior written permission. 
 87  # 
 88  # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
 89  # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
 90  # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
 91  # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
 92  # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
 93  # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
 94  # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
 95  # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
 96  # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
 97  # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
 98  # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
 99  # POSSIBILITY OF SUCH DAMAGE. 
100  # 
101  # ***** END LICENSE BLOCK ***** 
102   
103  import struct 
104  import os 
105  import re 
106   
107  import pyffi.object_models.xsd 
108   
109 -class DaeFormat(pyffi.object_models.xsd.FileFormat):
110 """This class implements the DAE format.""" 111 xsdFileName = 'COLLADASchema.xsd' 112 # where to look for the xsd file and in what order: 113 # DAEXSDPATH env var, or XsdFormat module directory 114 xsdFilePath = [os.getenv('DAEXSDPATH'), os.path.dirname(__file__)] 115 # file name regular expression match 116 RE_FILENAME = re.compile(r'^.*\.dae$', re.IGNORECASE) 117 # used for comparing floats 118 _EPSILON = 0.0001 119
120 - class Data(pyffi.object_models.xsd.FileFormat.Data):
121 """A class to contain the actual collada data.""" 122
123 - def __init__(self, version=0x01040100):
124 """Initialize collada data. By default, this creates an 125 empty collada 1.4.1 root element. 126 127 :param version: The collada version (for instance, 0x01040100 for 128 1.4.1). 129 :type version: int 130 """ 131 # TODO integrate the Collada and Data elements 132 self.collada = DaeFormat.Collada()
133
134 - def getVersion(self):
135 """Get the collada version, as integer (for instance, 1.4.1 would be 136 0x01040100). 137 138 :return: The version, as integer. 139 """ 140 return 0x01040100
141 142 # overriding pyffi.object_models.FileFormat.Data methods 143
144 - def inspect(self, stream):
145 """Quickly checks whether the stream appears to contain 146 collada data. Resets stream to original position. If the stream 147 turns out to be collada, L{getVersion} is guaranteed to return 148 the version. 149 150 Call this function if you simply wish to check that a file is 151 a collada file without having to parse it completely. 152 153 :param stream: The file to inspect. 154 :type stream: file 155 :return: ``True`` if stream is collada, ``False`` otherwise. 156 """ 157 raise NotImplementedError
158
159 - def read(self, stream):
160 """Read collada data from stream. 161 162 :param stream: The file to read from. 163 :type stream: file 164 """ 165 raise NotImplementedError
166
167 - def write(self, stream):
168 """Write collada data to stream. 169 170 :param stream: The file to write to. 171 :type stream: file 172 """ 173 raise NotImplementedError
174 175 # basic types 176 # TODO 177 178 # implementation of dae-specific basic types 179 # TODO 180