"""

This file defines a simple class that handles a vtk3DSImporter.  The
class handles the deletion of the actors generated by the
vtk3DSImporter.  The vtk3DSImporter class imports a 3D Studio scene
into VTK.

This code is distributed under the conditions of the BSD license.  See
LICENSE.txt for details.

Copyright (c) 2001-2002, Prabhu Ramachandran.
"""

__author__ = "Prabhu Ramachandran <prabhu_r@users.sf.net>"
__version__ = "$Revision: 1.3 $"
__date__ = "$Date: 2005/08/02 18:30:14 $"

import vtk, Common

debug = Common.debug

class mv3DSImporter:
    
    """This is a class that handles a vtk3DSImporter and is similar to
    the VRMLImporter class.  The vtk3DSImporter class imports a 3D
    Studio scene into VTK."""

    def __init__ (self, renwin, file_name):        
        """Initializes the class given a vtkRenderWindow and a
        file_name."""
        debug ("In mv3DSImporter::__init__ ()")
        self.file_name = file_name
        self.renwin = renwin
        orig_actors = self._get_actors (self.renwin)
        
        self.imp = vtk.vtk3DSImporter ()
        self.imp.SetFileName (file_name)
        self.imp.SetRenderWindow (self.renwin)
        try:
            self.imp.ComputeNormalsOn ()
        except AttributeError:
            pass
        self.imp.Read ()
        self.renwin.Render ()
        final_actors = self._get_actors (self.renwin)

        self.actors = []
        for act in final_actors:
            if act not in orig_actors:
                self.actors.append (act)        

    def __del__ (self):
        debug ("In mv3DSImporter::__del__ ()")
        ren = self.imp.GetRenderer ()
        for act in self.actors:
            ren.RemoveActor (act)
        self.renwin.Render ()
        del self.actors
        del self.imp
        del self.renwin
    
    def _get_actors (self, rw):        
        """ Returns a list of available actors in the given
        vtkRenderWindow."""        
        debug ("In mv3DSImporter::_get_actors ()")
        act = []
        renderers = rw.GetRenderers ()
        renderers.InitTraversal ()
        n_ren = renderers.GetNumberOfItems ()
        for i in range (n_ren):
            ren = renderers.GetNextItem ()
            act.extend (self._get_actor_list (ren))

        return act
    
    def _get_actor_list (self, ren):
        """ Returns a list of available actors in the given
        vtkRenderer."""        
        debug ("In mv3DSImporter::_get_actor_list ()")
        act = []
        act_col = ren.GetActors ()
        act_col.InitTraversal ()
        n_act = act_col.GetNumberOfItems ()
        for i in range (n_act):
            act.append (act_col.GetNextItem ())

        return act

    def get_file_name (self):
        """ Returns the 3D Studio file used."""
        debug ("In mv3DSImporter::get_file_name ()")
        return self.file_name


syntax highlighted by Code2HTML, v. 0.9.1