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'):
             name = instance.fsm.state.name
         print "%s: %s"%(instance.fsm.name, name)
-        
+
 
 
 
@@ -73,7 +73,7 @@ if __debug__:
                 that is printed as part of the trace back.
                 This is just to make it easier to tell what the
                 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
                 bumped up by one to skip the __init__ call
                 to the StackTrace).
@@ -141,6 +141,33 @@ def 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():
     sys.settrace(trace)
 def trace(frame, event, arg):
@@ -399,7 +426,7 @@ class Signature:
 def aproposAll(obj):
     """
     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)
 
@@ -412,14 +439,14 @@ def adjust(command = None, dim = 1, parent = None, **kw):
     """
     adjust(command = None, parent = None, **kw)
     Popup and entry scale to adjust a parameter
-    
+
     Accepts any Slider keyword argument.  Typical arguments include:
     command: The one argument command to execute
     min: The min value of the slider
     max: The max value of the slider
     resolution: The resolution of the slider
     text: The label on the slider
-    
+
     These values can be accessed and/or changed after the fact
     >>> vg = adjust()
     >>> vg['min']
@@ -565,7 +592,7 @@ def reduceAngle(deg):
     Reduces an angle (in degrees) to a value in [-180..180)
     """
     return (((deg + 180.) % 360.) - 180.)
-    
+
 def fitSrcAngle2Dest(src, dest):
     """
     given a src and destination angle, returns an equivalent src angle
@@ -687,7 +714,7 @@ class Functor:
         self._kargs = kargs
         self.__name__ = 'Functor: %s' % self._function.__name__
         self.__doc__ = self._function.__doc__
-        
+
     def __call__(self, *args, **kargs):
         """call function"""
         _args = list(self._args)
@@ -758,7 +785,7 @@ def formatElapsedSeconds(seconds):
     if hours > 36:
         days = math.floor((hours + 12) / 24)
         return "%s%d days" % (sign, days)
-    
+
     seconds -= hours * (60 * 60)
     minutes = (int)(seconds / 60)
     seconds -= minutes * 60
@@ -874,7 +901,7 @@ def findPythonModule(module):
         pathname = os.path.join(dir, filename)
         if os.path.exists(pathname):
             return pathname
-        
+
     return None
 
 def describeException(backTrace = 4):
@@ -896,7 +923,7 @@ def describeException(backTrace = 4):
             line += lnotab[i+1]
 
         return line
-    
+
     infoArr = sys.exc_info()
     exception = infoArr[0]
     exceptionName = getattr(exception, '__name__', None)
@@ -923,7 +950,7 @@ def describeException(backTrace = 4):
     description = ""
     for i in range(len(stack) - 1, max(len(stack) - backTrace, 0) - 1, -1):
         description += stack[i]
-        
+
     description += "%s: %s" % (exceptionName, extraInfo)
     return description
 
@@ -1000,10 +1027,10 @@ def normalDistrib(a, b, gauss=random.gauss):
     ====================
     All normal density curves satisfy the following property which is often
       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.
     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
       deviations of the mean.
     ------------------------------------------------------------------------
@@ -1063,7 +1090,7 @@ class Enum:
     starting value.
 
     Example:
-    
+
     >>> colors = Enum('red, green, blue')
     >>> colors.red
     0
@@ -1134,7 +1161,7 @@ class Enum:
             return 1
 
 ############################################################
-# class: Singleton  
+# class: Singleton
 # Purpose: This provides a base metaclass for all classes
 #          that require one and only one instance.
 #
@@ -1158,7 +1185,7 @@ class Enum:
 #
 #           This causes problems because myNewClassX is 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.
 #
 #           First, if possible, make myClassX a
@@ -1180,4 +1207,4 @@ class Singleton(type):
 
 class SingletonError(ValueError):
     """ Used to indicate an inappropriate value for a Singleton."""
-        
+