home *** CD-ROM | disk | FTP | other *** search
/ Hackers Magazine 57 / CdHackersMagazineNr57.iso / Software / Multimedia / k3d-setup-0.7.11.0.exe / lib / site-packages / cgkit / ifsimport.py < prev    next >
Encoding:
Python Source  |  2007-01-11  |  4.3 KB  |  137 lines

  1. # ***** BEGIN LICENSE BLOCK *****
  2. # Version: MPL 1.1/GPL 2.0/LGPL 2.1
  3. #
  4. # The contents of this file are subject to the Mozilla Public License Version
  5. # 1.1 (the "License"); you may not use this file except in compliance with
  6. # the License. You may obtain a copy of the License at
  7. # http://www.mozilla.org/MPL/
  8. #
  9. # Software distributed under the License is distributed on an "AS IS" basis,
  10. # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  11. # for the specific language governing rights and limitations under the
  12. # License.
  13. #
  14. # The Original Code is the Python Computer Graphics Kit.
  15. #
  16. # The Initial Developer of the Original Code is Matthias Baas.
  17. # Portions created by the Initial Developer are Copyright (C) 2004
  18. # the Initial Developer. All Rights Reserved.
  19. #
  20. # Contributor(s):
  21. #
  22. # Alternatively, the contents of this file may be used under the terms of
  23. # either the GNU General Public License Version 2 or later (the "GPL"), or
  24. # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  25. # in which case the provisions of the GPL or the LGPL are applicable instead
  26. # of those above. If you wish to allow use of your version of this file only
  27. # under the terms of either the GPL or the LGPL, and not to allow others to
  28. # use your version of this file under the terms of the MPL, indicate your
  29. # decision by deleting the provisions above and replace them with the notice
  30. # and other provisions required by the GPL or the LGPL. If you do not delete
  31. # the provisions above, a recipient may use your version of this file under
  32. # the terms of any one of the MPL, the GPL or the LGPL.
  33. #
  34. # ***** END LICENSE BLOCK *****
  35. # $Id: ifsimport.py,v 1.1.1.1 2004/12/12 14:31:04 mbaas Exp $
  36.  
  37. import os.path, struct
  38. from cgtypes import *
  39. from worldobject import WorldObject
  40. from trimesh import TriMesh
  41. from trimeshgeom import TriMeshGeom
  42. import pluginmanager
  43.  
  44. # IfsImporter
  45. class IfsImporter:
  46.     """IFS importer.
  47.  
  48.     This class imports models from the Brown Mesh Set library which are
  49.     stored in the Indexed Face Set (IFS) format.
  50.     """
  51.  
  52.     _protocols = ["Import"]
  53.  
  54.     # extension
  55.     def extension():
  56.         """Return the file extensions for this format."""
  57.         return ["ifs"]
  58.     extension = staticmethod(extension)
  59.  
  60.     # description
  61.     def description(self):
  62.         """Return a short description for the file dialog."""
  63.         return "Indexed face set"
  64.     description = staticmethod(description)
  65.  
  66.     # importFile
  67.     def importFile(self, filename):
  68.         """Import an IFS file."""
  69.  
  70.         f = file(filename, "rb")
  71.  
  72.         # Check the header...
  73.         s = self.readString(f)
  74.         if s!="IFS":
  75.             raise ValueError, 'The file "%s" is is not a IFS file.'%filename
  76.  
  77.         # Read (and ignore) the version number
  78.         s = f.read(4)
  79.         ver = struct.unpack("<f", s)[0]
  80.  
  81.         # Read the model name
  82.         modelname = self.readString(f)
  83.  
  84.         # Create the mesh geom
  85.         tm = TriMeshGeom()
  86.  
  87.         # Read vertices...
  88.         s = self.readString(f)
  89.         if s!="VERTICES":
  90.             raise ValueError, "Vertices chunk expected, got '%s' instead."%s
  91.  
  92.         s = f.read(4)
  93.         numverts = int(struct.unpack("<I", s)[0])
  94.         tm.verts.resize(numverts)
  95.  
  96.         for i in range(numverts):
  97.             s = f.read(12)
  98.             x,y,z = struct.unpack("<fff", s)
  99.             tm.verts[i] = vec3(x,y,z)
  100.  
  101.         # Read faces...
  102.         s = self.readString(f)
  103.         if s!="TRIANGLES":
  104.             raise ValueError, "Triangle chunk expected, got '%s' instead."%s
  105.             
  106.         s = f.read(4)
  107.         numfaces = int(struct.unpack("<I", s)[0])
  108.         tm.faces.resize(numfaces)
  109.  
  110.         for i in range(numfaces):
  111.             s = f.read(12)
  112.             a,b,c = struct.unpack("<III", s)
  113.             tm.faces[i] = (int(a), int(b), int(c))
  114.  
  115.         # Create a world object
  116.         obj = TriMesh(name=modelname)
  117.         obj.geom = tm
  118.  
  119.  
  120.     def readString(self, fhandle):
  121.         """Read a string.
  122.  
  123.         \param fhandle Open file handle
  124.         \return String
  125.         """
  126.         s = fhandle.read(4)
  127.         w = int(struct.unpack("<I", s)[0])
  128.         s = fhandle.read(w)
  129.         # Return the string without the trailing \000
  130.         return s[:-1]
  131.  
  132.  
  133. ######################################################################
  134.  
  135. # Register the IfsImporter class as a plugin class
  136. pluginmanager.register(IfsImporter)
  137.