Dave Schuyler 21 years ago
parent
commit
b78fb88cf3
1 changed files with 44 additions and 17 deletions
  1. 44 17
      direct/src/showbase/PythonUtil.py

+ 44 - 17
direct/src/showbase/PythonUtil.py

@@ -61,7 +61,7 @@ def writeFsmTree(instance, indent = 0):
         if hasattr(instance.fsm, 'state'):
         if hasattr(instance.fsm, 'state'):
             name = instance.fsm.state.name
             name = instance.fsm.state.name
         print "%s: %s"%(instance.fsm.name, name)
         print "%s: %s"%(instance.fsm.name, name)
-        
+
 
 
 
 
 
 
@@ -73,7 +73,7 @@ if __debug__:
                 that is printed as part of the trace back.
                 that is printed as part of the trace back.
                 This is just to make it easier to tell what the
                 This is just to make it easier to tell what the
                 stack trace is referring to.
                 stack trace is referring to.
-            start is an integer number of stack frames back 
+            start is an integer number of stack frames back
                 from the most recent.  (This is automatically
                 from the most recent.  (This is automatically
                 bumped up by one to skip the __init__ call
                 bumped up by one to skip the __init__ call
                 to the StackTrace).
                 to the StackTrace).
@@ -141,6 +141,33 @@ def printThisCall():
     return 1 # to allow "assert printThisCall()"
     return 1 # to allow "assert printThisCall()"
 
 
 
 
+if __debug__:
+    def lineage(obj, verbose=0, indent=0):
+        """
+        return instance or class name in as a multiline string.
+
+        Usage: print lineage(foo)
+
+        (Based on getClassLineage())
+        """
+        r=""
+        if type(obj) == types.ListType:
+            r+=(" "*indent)+"python list\n"
+        elif type(obj) == types.DictionaryType:
+            r+=(" "*indent)+"python dictionary\n"
+        elif type(obj) == types.ModuleType:
+            r+=(" "*indent)+str(obj)+"\n"
+        elif type(obj) == types.InstanceType:
+            r+=lineage(obj.__class__, verbose, indent)
+        elif type(obj) == types.ClassType:
+            r+=(" "*indent)
+            if verbose:
+                r+=obj.__module__+"."
+            r+=obj.__name__+"\n"
+            for c in obj.__bases__:
+                r+=lineage(c, verbose, indent+2)
+        return r
+
 def tron():
 def tron():
     sys.settrace(trace)
     sys.settrace(trace)
 def trace(frame, event, arg):
 def trace(frame, event, arg):
@@ -399,7 +426,7 @@ class Signature:
 def aproposAll(obj):
 def aproposAll(obj):
     """
     """
     Print out a list of all members and methods (including overloaded methods)
     Print out a list of all members and methods (including overloaded methods)
-    of an instance or class  
+    of an instance or class
     """
     """
     apropos(obj, fOverloaded = 1, fTruncate = 0)
     apropos(obj, fOverloaded = 1, fTruncate = 0)
 
 
@@ -412,14 +439,14 @@ def adjust(command = None, dim = 1, parent = None, **kw):
     """
     """
     adjust(command = None, parent = None, **kw)
     adjust(command = None, parent = None, **kw)
     Popup and entry scale to adjust a parameter
     Popup and entry scale to adjust a parameter
-    
+
     Accepts any Slider keyword argument.  Typical arguments include:
     Accepts any Slider keyword argument.  Typical arguments include:
     command: The one argument command to execute
     command: The one argument command to execute
     min: The min value of the slider
     min: The min value of the slider
     max: The max value of the slider
     max: The max value of the slider
     resolution: The resolution of the slider
     resolution: The resolution of the slider
     text: The label on the slider
     text: The label on the slider
-    
+
     These values can be accessed and/or changed after the fact
     These values can be accessed and/or changed after the fact
     >>> vg = adjust()
     >>> vg = adjust()
     >>> vg['min']
     >>> vg['min']
@@ -565,7 +592,7 @@ def reduceAngle(deg):
     Reduces an angle (in degrees) to a value in [-180..180)
     Reduces an angle (in degrees) to a value in [-180..180)
     """
     """
     return (((deg + 180.) % 360.) - 180.)
     return (((deg + 180.) % 360.) - 180.)
-    
+
 def fitSrcAngle2Dest(src, dest):
 def fitSrcAngle2Dest(src, dest):
     """
     """
     given a src and destination angle, returns an equivalent src angle
     given a src and destination angle, returns an equivalent src angle
@@ -687,7 +714,7 @@ class Functor:
         self._kargs = kargs
         self._kargs = kargs
         self.__name__ = 'Functor: %s' % self._function.__name__
         self.__name__ = 'Functor: %s' % self._function.__name__
         self.__doc__ = self._function.__doc__
         self.__doc__ = self._function.__doc__
-        
+
     def __call__(self, *args, **kargs):
     def __call__(self, *args, **kargs):
         """call function"""
         """call function"""
         _args = list(self._args)
         _args = list(self._args)
@@ -758,7 +785,7 @@ def formatElapsedSeconds(seconds):
     if hours > 36:
     if hours > 36:
         days = math.floor((hours + 12) / 24)
         days = math.floor((hours + 12) / 24)
         return "%s%d days" % (sign, days)
         return "%s%d days" % (sign, days)
-    
+
     seconds -= hours * (60 * 60)
     seconds -= hours * (60 * 60)
     minutes = (int)(seconds / 60)
     minutes = (int)(seconds / 60)
     seconds -= minutes * 60
     seconds -= minutes * 60
@@ -874,7 +901,7 @@ def findPythonModule(module):
         pathname = os.path.join(dir, filename)
         pathname = os.path.join(dir, filename)
         if os.path.exists(pathname):
         if os.path.exists(pathname):
             return pathname
             return pathname
-        
+
     return None
     return None
 
 
 def describeException(backTrace = 4):
 def describeException(backTrace = 4):
@@ -896,7 +923,7 @@ def describeException(backTrace = 4):
             line += lnotab[i+1]
             line += lnotab[i+1]
 
 
         return line
         return line
-    
+
     infoArr = sys.exc_info()
     infoArr = sys.exc_info()
     exception = infoArr[0]
     exception = infoArr[0]
     exceptionName = getattr(exception, '__name__', None)
     exceptionName = getattr(exception, '__name__', None)
@@ -923,7 +950,7 @@ def describeException(backTrace = 4):
     description = ""
     description = ""
     for i in range(len(stack) - 1, max(len(stack) - backTrace, 0) - 1, -1):
     for i in range(len(stack) - 1, max(len(stack) - backTrace, 0) - 1, -1):
         description += stack[i]
         description += stack[i]
-        
+
     description += "%s: %s" % (exceptionName, extraInfo)
     description += "%s: %s" % (exceptionName, extraInfo)
     return description
     return description
 
 
@@ -1000,10 +1027,10 @@ def normalDistrib(a, b, gauss=random.gauss):
     ====================
     ====================
     All normal density curves satisfy the following property which is often
     All normal density curves satisfy the following property which is often
       referred to as the Empirical Rule:
       referred to as the Empirical Rule:
-    68% of the observations fall within 1 standard deviation of the mean. 
+    68% of the observations fall within 1 standard deviation of the mean.
     95% of the observations fall within 2 standard deviations of the mean.
     95% of the observations fall within 2 standard deviations of the mean.
     99.7% of the observations fall within 3 standard deviations of the mean.
     99.7% of the observations fall within 3 standard deviations of the mean.
-    
+
     Thus, for a normal distribution, almost all values lie within 3 standard
     Thus, for a normal distribution, almost all values lie within 3 standard
       deviations of the mean.
       deviations of the mean.
     ------------------------------------------------------------------------
     ------------------------------------------------------------------------
@@ -1063,7 +1090,7 @@ class Enum:
     starting value.
     starting value.
 
 
     Example:
     Example:
-    
+
     >>> colors = Enum('red, green, blue')
     >>> colors = Enum('red, green, blue')
     >>> colors.red
     >>> colors.red
     0
     0
@@ -1134,7 +1161,7 @@ class Enum:
             return 1
             return 1
 
 
 ############################################################
 ############################################################
-# class: Singleton  
+# class: Singleton
 # Purpose: This provides a base metaclass for all classes
 # Purpose: This provides a base metaclass for all classes
 #          that require one and only one instance.
 #          that require one and only one instance.
 #
 #
@@ -1158,7 +1185,7 @@ class Enum:
 #
 #
 #           This causes problems because myNewClassX is a
 #           This causes problems because myNewClassX is a
 #           New-Style class that inherits from only a
 #           New-Style class that inherits from only a
-#           Classic-Style base class. There are two ways 
+#           Classic-Style base class. There are two ways
 #           simple ways to resolve this issue.
 #           simple ways to resolve this issue.
 #
 #
 #           First, if possible, make myClassX a
 #           First, if possible, make myClassX a
@@ -1180,4 +1207,4 @@ class Singleton(type):
 
 
 class SingletonError(ValueError):
 class SingletonError(ValueError):
     """ Used to indicate an inappropriate value for a Singleton."""
     """ Used to indicate an inappropriate value for a Singleton."""
-        
+