"""

This file defines a simple class that handles a vtkVRMLImporter.
The class handles the deletion of the actors generated by the
vtkVRMLImporter.

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.4 $"
__date__ = "$Date: 2005/08/02 18:30:14 $"

import vtk, Common

debug = Common.debug

class VRMLImporter:
    
    """This is a class that handles a vtkVRMLImporter.  The class
    handles the deletion of the actors generated by the
    vtkVRMLImporter."""

    def __init__ (self, renwin, file_name):        
        """Initializes the class given a vtkRenderWindow and a
        file_name."""
        debug ("In VRMLImporter::__init__ ()")
        self.file_name = file_name
        self.renwin = renwin
        orig_actors = self._get_actors (self.renwin)
        
        self.vrml_imp = vtk.vtkVRMLImporter ()
        self.vrml_imp.SetFileName (file_name)
        self.vrml_imp.SetRenderWindow (self.renwin)
        try:
            self.vrml_imp.ComputeNormalsOn ()
        except AttributeError:
            pass
        self.vrml_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 VRMLImporter::__del__ ()")
        ren = self.vrml_imp.GetRenderer ()
        for act in self.actors:
            ren.RemoveActor (act)
        self.renwin.Render ()
        del self.actors
        del self.vrml_imp
        del self.renwin
    
    def _get_actors (self, rw):        
        """ Returns a list of available actors in the given
        vtkRenderWindow."""        
        debug ("In VRMLImporter::_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 VRMLImporter::_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 VRML file used."""
        debug ("In VRMLImporter::get_file_name ()")
        return self.file_name
