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 / gnuplotter.py < prev    next >
Encoding:
Python Source  |  2007-01-11  |  4.8 KB  |  156 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: gnuplotter.py,v 1.3 2005/03/31 17:11:56 mbaas Exp $
  36.  
  37. ## \file gnuplotter.py
  38. ## Contains the GnuPlotter class.
  39.  
  40. import sys
  41. import component
  42. import eventmanager, events
  43. from scene import getScene
  44. from slots import *
  45. from cgtypes import *
  46. import _core
  47. try:
  48.     import Gnuplot
  49.     gnuplot_installed = True
  50. except:
  51.     gnuplot_installed = False
  52.  
  53.  
  54. class _PlotDesc:
  55.     def __init__(self, slot, title):
  56.         self.slot = slot
  57.         self.title = title
  58.         self.data = []
  59.  
  60. # GnuPlotter
  61. class GnuPlotter(component.Component):
  62.     """Graph plotter using gnuplot.
  63.     
  64.     """
  65.  
  66.     def __init__(self,
  67.                  name = "GnuPlotter",
  68.                  title = None,
  69.                  xlabel = None,
  70.                  ylabel = None,
  71.                  xrange = None,
  72.                  yrange = None,
  73.                  inputs = 1,
  74.                  plottitles = [],
  75.                  starttime = 0.0,
  76.                  endtime = 99999.0,
  77.                  enabled = True,
  78.                  auto_insert = True):
  79.         """Constructor.
  80.         """
  81.         global gnuplot_installed
  82.         
  83.         component.Component.__init__(self, name, auto_insert)
  84.  
  85.         self.enabled = enabled
  86.         self.inputs = inputs
  87.         self.plot_data = []
  88.         self.starttime = starttime
  89.         self.endtime = endtime
  90.  
  91.         for i in range(inputs):
  92.             s = DoubleSlot()
  93.             exec "self.input%d_slot = s"%(i+1)
  94.             if i<len(plottitles):
  95.                 t = plottitles[i]
  96.             else:
  97.                 t = None
  98.             pd = _PlotDesc(slot=s, title=t)
  99.             self.plot_data.append(pd)
  100.  
  101.         if not enabled:
  102.             return
  103.  
  104.         if not gnuplot_installed:
  105.             print >>sys.stderr, "Warning: PyGnuplot is not installed"
  106.             return
  107.  
  108.         self.gp = Gnuplot.Gnuplot()
  109.         self.gp('set data style lines')
  110.         self.gp("set grid")
  111.         self.gp("set xzeroaxis")
  112.         if title!=None:
  113.             self.gp.title(title)
  114.         if xlabel!=None:
  115.             self.gp.xlabel(xlabel)
  116.         if ylabel!=None:
  117.             self.gp.ylabel(ylabel)
  118.         if yrange!=None:
  119.             self.gp.set_range("yrange",yrange)
  120. #            self.gp("set yrange [%f:%f]"%tuple(yrange))
  121.         if xrange!=None:
  122.             self.gp.set_range("xrange",xrange)
  123.  
  124.         self._delay = 0
  125.  
  126.         eventmanager.eventManager().connect(events.STEP_FRAME, self)
  127.         
  128.     def onStepFrame(self):
  129.         if not self.enabled:
  130.             return
  131.         
  132.         t = getScene().timer().time
  133.         if t<self.starttime or t>self.endtime:
  134.             return
  135.  
  136.         for pd in self.plot_data:
  137.             pd.data.append((t, pd.slot.getValue()))
  138.         
  139.         if self._delay==0:
  140.             a = []
  141.             for pd in self.plot_data:
  142.                 data = pd.data
  143.                 # There seems to be a bug in Gnuplot.py 1.7 that prevents
  144.                 # data arrays with only one item to be displayed. So the
  145.                 # following is a workaround (the point is just duplicated).
  146.                 if len(data)==1:
  147.                     data = 2*data
  148.                 data = Gnuplot.Data(data, title=pd.title)
  149.                 a.append(data)
  150.             self.gp.plot(*a)
  151.             self._delay = 0
  152.         else:
  153.             self._delay -= 1
  154.         
  155.  
  156.