Sophie

Sophie

distrib > Mandriva > current > i586 > by-pkgid > ae0a4f27f26602dc31c3bf35e18b5b19 > files > 769

python-enthought-chaco-3.4.0-2mdv2010.2.i586.rpm




<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    
    <title>Modeling Van der Waal’s Equation With Chaco and Traits &mdash; Chaco v3.4.0 documentation</title>
    <link rel="stylesheet" href="../_static/default.css" type="text/css" />
    <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
    <script type="text/javascript">
      var DOCUMENTATION_OPTIONS = {
        URL_ROOT:    '../',
        VERSION:     '3.4.0',
        COLLAPSE_INDEX: false,
        FILE_SUFFIX: '.html',
        HAS_SOURCE:  true
      };
    </script>
    <script type="text/javascript" src="../_static/jquery.js"></script>
    <script type="text/javascript" src="../_static/underscore.js"></script>
    <script type="text/javascript" src="../_static/doctools.js"></script>
    <link rel="shortcut icon" href="../_static/et.ico"/>
    <link rel="top" title="Chaco v3.4.0 documentation" href="../index.html" />
    <link rel="up" title="Tutorials" href="tutorial.html" />
    <link rel="next" title="Creating an interactive Hyetograph with Chaco and Traits" href="tutorial_hyetograph.html" />
    <link rel="prev" title="Interactive Plotting with Chaco" href="tutorial_1.html" /> 
  </head>
  <body>
    <div class="related">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="tutorial_hyetograph.html" title="Creating an interactive Hyetograph with Chaco and Traits"
             accesskey="N">next</a></li>
        <li class="right" >
          <a href="tutorial_1.html" title="Interactive Plotting with Chaco"
             accesskey="P">previous</a> |</li>
        <li><a href="../index.html">Chaco v3.4.0 documentation</a> &raquo;</li>
          <li><a href="tutorial.html" accesskey="U">Tutorials</a> &raquo;</li>
  
    <li><a href="#">Modeling Van der Waal&#8217;s Equation With Chaco and Traits</a></li>
  

      </ul>
    </div>  

    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body">
            
  <div class="section" id="modeling-van-der-waal-s-equation-with-chaco-and-traits">
<span id="tutorial-2"></span><h1>Modeling Van der Waal&#8217;s Equation With Chaco and Traits<a class="headerlink" href="#modeling-van-der-waal-s-equation-with-chaco-and-traits" title="Permalink to this headline">¶</a></h1>
<div class="section" id="overview">
<h2>Overview<a class="headerlink" href="#overview" title="Permalink to this headline">¶</a></h2>
<p>This tutorial walks through the creation of an example program that plots a
scientific equation.  In particular, we will model <a class="reference external" href="http://en.wikipedia.org/wiki/Van_der_Waals_equation">Van Der Waal&#8217;s Equation</a>, which is a
modification to the ideal gas law that takes into account the nonzero size of
molecules and the attraction to each other that they experience.</p>
</div>
<div class="section" id="development-setup">
<h2>Development Setup<a class="headerlink" href="#development-setup" title="Permalink to this headline">¶</a></h2>
<p>In review, Traits is a manifest typing and reactive programming package for
Python. It also provides UI features that will be used to create a simple GUI.
The Traits and Traits UI user manuals are good resources for learning about the
packages and can be found on the
<a class="reference external" href="https://svn.enthought.com/enthought/wiki/Traits">Traits Wiki</a>. The wiki
includes features, technical notes, cookbooks, FAQ and more.</p>
<p>You must have Chaco and its dependencies installed:</p>
<ul class="simple">
<li>Traits</li>
<li>TraitsGUI</li>
<li>Enable</li>
</ul>
</div>
<div class="section" id="writing-the-program">
<h2>Writing the Program<a class="headerlink" href="#writing-the-program" title="Permalink to this headline">¶</a></h2>
<p>First, define a Traits class and the elements necessary need to model
the task.  The following Traits class is made for the Van Der Waal
equation, whose variables can be viewed on
<a class="reference external" href="http://en.wikipedia.org/wiki/Van_der_Waals_equation">this wiki page</a>.  The
<tt class="xref py py-attr docutils literal"><span class="pre">volume</span></tt> and <tt class="xref py py-attr docutils literal"><span class="pre">pressure</span></tt> attributes hold lists of our X- and
Y-coordinates, respectively, and are defined as arrays. The attributes
<tt class="xref py py-attr docutils literal"><span class="pre">attraction</span></tt> and <tt class="xref py py-attr docutils literal"><span class="pre">totVolume</span></tt> are  input parameters specified by the
user.  The type of the variables dictates their appearance in the GUI.  For
example, <tt class="xref py py-attr docutils literal"><span class="pre">attraction</span></tt> and <tt class="xref py py-attr docutils literal"><span class="pre">totVolume</span></tt> are defined as Ranges, so they
show up as slider bars.  Likewise, <tt class="xref py py-attr docutils literal"><span class="pre">plot_type</span></tt> is shown as a drop-down
list, since it is defined as an Enum.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="c"># We&#39;ll also import a few things to be used later.</span>
<span class="kn">from</span> <span class="nn">enthought.traits.api</span> \
    <span class="kn">import</span> <span class="n">HasTraits</span><span class="p">,</span> <span class="n">Array</span><span class="p">,</span> <span class="n">Range</span><span class="p">,</span> <span class="n">Float</span><span class="p">,</span> <span class="n">Enum</span><span class="p">,</span> <span class="n">on_trait_change</span><span class="p">,</span> <span class="n">Property</span>
<span class="kn">from</span> <span class="nn">enthought.traits.ui.api</span> <span class="kn">import</span> <span class="n">View</span><span class="p">,</span> <span class="n">Item</span>
<span class="kn">from</span> <span class="nn">enthought.chaco.chaco_plot_editor</span> <span class="kn">import</span> <span class="n">ChacoPlotItem</span>
<span class="kn">from</span> <span class="nn">numpy</span> <span class="kn">import</span> <span class="n">arange</span>

<span class="k">class</span> <span class="nc">Data</span><span class="p">(</span><span class="n">HasTraits</span><span class="p">):</span>
    <span class="n">volume</span> <span class="o">=</span> <span class="n">Array</span>
    <span class="n">pressure</span> <span class="o">=</span> <span class="n">Array</span>
    <span class="n">attraction</span> <span class="o">=</span> <span class="n">Range</span><span class="p">(</span><span class="n">low</span><span class="o">=-</span><span class="mf">50.0</span><span class="p">,</span><span class="n">high</span><span class="o">=</span><span class="mf">50.0</span><span class="p">,</span><span class="n">value</span><span class="o">=</span><span class="mf">0.0</span><span class="p">)</span>
    <span class="n">totVolume</span> <span class="o">=</span> <span class="n">Range</span><span class="p">(</span><span class="n">low</span><span class="o">=.</span><span class="mo">01</span><span class="p">,</span><span class="n">high</span><span class="o">=</span><span class="mf">100.0</span><span class="p">,</span><span class="n">value</span><span class="o">=</span><span class="mf">0.01</span><span class="p">)</span>
    <span class="n">temperature</span> <span class="o">=</span> <span class="n">Range</span><span class="p">(</span><span class="n">low</span><span class="o">=-</span><span class="mf">50.0</span><span class="p">,</span><span class="n">high</span><span class="o">=</span><span class="mf">50.0</span><span class="p">,</span><span class="n">value</span><span class="o">=</span><span class="mf">50.0</span><span class="p">)</span>
    <span class="n">r_constant</span><span class="o">=</span> <span class="n">Float</span><span class="p">(</span><span class="mf">8.314472</span><span class="p">)</span>
    <span class="n">plot_type</span> <span class="o">=</span> <span class="n">Enum</span><span class="p">(</span><span class="s">&quot;line&quot;</span><span class="p">,</span> <span class="s">&quot;scatter&quot;</span><span class="p">)</span>

<span class="o">....</span>
</pre></div>
</div>
</div>
<div class="section" id="creating-the-view">
<h2>Creating the View<a class="headerlink" href="#creating-the-view" title="Permalink to this headline">¶</a></h2>
<p>The main GUI window is created by defining a Traits <tt class="xref py py-class docutils literal"><span class="pre">View</span></tt> instance.
This View contains all of the GUI elements, including the plot.  To
link a variable with a widget element on the GUI, we create a Traits
<tt class="xref py py-class docutils literal"><span class="pre">Item</span></tt> instance with the same name as the variable and pass it as an
argument of the Traits View instance declaration.  The
<a class="reference external" href="https://svn.enthought.com/svn/enthought/Traits/tags/enthought.traits_2.0.1b1/docs/Traits%20UI%20User%20Guide.pdf">Traits UI User Guide</a>
discusses the View and Item objects in depth. In order to
embed a Chaco plot into a Traits View, you need to import the
<tt class="xref py py-class docutils literal"><span class="pre">ChacoPlotItem</span></tt> class, which can be passed as a parameter to View just
like the Item objects. The first two arguments to ChacoPlotItem are the
lists of X- and Y-coordinates for the graph.  The attributes <tt class="xref py py-attr docutils literal"><span class="pre">volume</span></tt> and
<tt class="xref py py-attr docutils literal"><span class="pre">pressure</span></tt> hold the lists of X- and Y-coordinates, and therefore are the
first two arguments to Chaco2PlotItem.  Other parameters have been
provided to the plot for additional customization:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">class</span> <span class="nc">Data</span><span class="p">(</span><span class="n">HasTraits</span><span class="p">):</span>
    <span class="o">....</span>

    <span class="n">traits_view</span> <span class="o">=</span> <span class="n">View</span><span class="p">(</span><span class="n">ChacoPlotItem</span><span class="p">(</span><span class="s">&quot;volume&quot;</span><span class="p">,</span> <span class="s">&quot;pressure&quot;</span><span class="p">,</span>
                               <span class="n">type_trait</span><span class="o">=</span><span class="s">&quot;plot_type&quot;</span><span class="p">,</span>
                               <span class="n">resizable</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
                               <span class="n">x_label</span><span class="o">=</span><span class="s">&quot;Volume&quot;</span><span class="p">,</span>
                               <span class="n">y_label</span><span class="o">=</span><span class="s">&quot;Pressure&quot;</span><span class="p">,</span>
                               <span class="n">x_bounds</span><span class="o">=</span><span class="p">(</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="mi">120</span><span class="p">),</span>
                               <span class="n">x_auto</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>
                               <span class="n">y_bounds</span><span class="o">=</span><span class="p">(</span><span class="o">-</span><span class="mi">2000</span><span class="p">,</span><span class="mi">4000</span><span class="p">),</span>
                               <span class="n">y_auto</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>
                               <span class="n">color</span><span class="o">=</span><span class="s">&quot;blue&quot;</span><span class="p">,</span>
                               <span class="n">bgcolor</span><span class="o">=</span><span class="s">&quot;white&quot;</span><span class="p">,</span>
                               <span class="n">border_visible</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
                               <span class="n">border_width</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
                               <span class="n">title</span><span class="o">=</span><span class="s">&#39;Pressure vs. Volume&#39;</span><span class="p">,</span>
                               <span class="n">padding_bg_color</span><span class="o">=</span><span class="s">&quot;lightgray&quot;</span><span class="p">),</span>
                       <span class="n">Item</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&#39;attraction&#39;</span><span class="p">),</span>
                       <span class="n">Item</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&#39;totVolume&#39;</span><span class="p">),</span>
                       <span class="n">Item</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&#39;temperature&#39;</span><span class="p">),</span>
                       <span class="n">Item</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&#39;r_constant&#39;</span><span class="p">,</span> <span class="n">style</span><span class="o">=</span><span class="s">&#39;readonly&#39;</span><span class="p">),</span>
                       <span class="n">Item</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&#39;plot_type&#39;</span><span class="p">),</span>
                       <span class="n">resizable</span> <span class="o">=</span> <span class="bp">True</span><span class="p">,</span>
                       <span class="n">buttons</span> <span class="o">=</span> <span class="p">[</span><span class="s">&quot;OK&quot;</span><span class="p">],</span>
                       <span class="n">title</span><span class="o">=</span><span class="s">&#39;Van der Waal Equation&#39;</span><span class="p">,</span>
                       <span class="n">width</span><span class="o">=</span><span class="mi">900</span><span class="p">,</span> <span class="n">height</span><span class="o">=</span><span class="mi">800</span><span class="p">)</span>
<span class="o">....</span>
</pre></div>
</div>
</div>
<div class="section" id="updating-the-plot">
<h2>Updating the Plot<a class="headerlink" href="#updating-the-plot" title="Permalink to this headline">¶</a></h2>
<p>The power of Traits and Chaco enables the plot to update itself
whenever the X- or Y-arrays are changed.  So, we need a function to
re-calculate the X- and Y-coordinate lists whenever the input
parameters are changed by the user moving the sliders in the GUI.</p>
<p>The <tt class="xref py py-attr docutils literal"><span class="pre">volume</span></tt> attribute is the independent variable and <tt class="xref py py-attr docutils literal"><span class="pre">pressure</span></tt> is
the dependent variable. The relationship between pressure and volume, as derived
from the equation found on the wiki page, is:</p>
<div class="highlight-python"><pre>            r_constant * Temperature       attraction
Pressure =  ------------------------   -   ----------
               Volume - totVolume          Volume**2</pre>
</div>
<p>Next, there are two programing tasks to complete:</p>
<ol class="arabic simple">
<li>Define trait listener methods for your input parameters. These
methods are automatically called whenever the parameters are
changed, since it will be time to recalculate the <tt class="xref py py-attr docutils literal"><span class="pre">pressure</span></tt> array.</li>
<li>Write a calculation method that updates your lists of X- and
Y-coordinates for your plot.</li>
</ol>
<p>The following is the code for these two needs:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="c"># Re-calculate when attraction, totVolume, or temperature are changed.</span>
<span class="nd">@on_trait_change</span><span class="p">(</span><span class="s">&#39;attraction, totVolume, temperature&#39;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">calc</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; Update the data based on the numbers specified by the user. &quot;&quot;&quot;</span>
    <span class="bp">self</span><span class="o">.</span><span class="n">volume</span> <span class="o">=</span> <span class="n">arange</span><span class="p">(</span><span class="o">.</span><span class="mi">1</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
    <span class="bp">self</span><span class="o">.</span><span class="n">pressure</span> <span class="o">=</span> <span class="p">((</span><span class="bp">self</span><span class="o">.</span><span class="n">r_constant</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">temperature</span><span class="p">)</span>
                     <span class="o">/</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">volume</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">totVolume</span><span class="p">)</span>
                    <span class="o">-</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">attraction</span><span class="o">/</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">volume</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">volume</span><span class="p">)))</span>
    <span class="k">return</span>
</pre></div>
</div>
<p>The <tt class="xref py py-func docutils literal"><span class="pre">calc()</span></tt> function computes the <tt class="xref py py-attr docutils literal"><span class="pre">pressure</span></tt> array using the current
values of the independent variables.  Meanwhile, the
<tt class="xref py py-func docutils literal"><span class="pre">&#64;on_trait_change()</span></tt> decorator (provided by Traits) tells Python to call
<tt class="xref py py-func docutils literal"><span class="pre">calc()</span></tt> whenever any of the attributes <tt class="xref py py-attr docutils literal"><span class="pre">attraction</span></tt>,
<tt class="xref py py-attr docutils literal"><span class="pre">totVolume</span></tt>, or <tt class="xref py py-attr docutils literal"><span class="pre">temperature</span></tt> changes.</p>
</div>
<div class="section" id="testing-your-program">
<h2>Testing your Program<a class="headerlink" href="#testing-your-program" title="Permalink to this headline">¶</a></h2>
<p>The application is complete, and can be tested by instantiating a copy
of the class and then creating the view by calling the
<tt class="xref py py-meth docutils literal"><span class="pre">configure_traits()</span></tt> method on the class.  For a simple test, run these
lines from an interpreter or a separate module:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">vanderwaals</span> <span class="kn">import</span> <span class="n">Data</span>
<span class="n">viewer</span> <span class="o">=</span> <span class="n">Data</span><span class="p">()</span>
<span class="n">viewer</span><span class="o">.</span><span class="n">calc</span><span class="p">()</span>            <span class="c"># Must calculate the initial (x,y) lists</span>
<span class="n">viewer</span><span class="o">.</span><span class="n">configure_traits</span><span class="p">()</span>
</pre></div>
</div>
<p>Clicking and dragging on the sliders in the GUI dynamically updates the pressure
data array, and causes the plot to update, showing the new values.</p>
</div>
<div class="section" id="screenshots">
<h2>Screenshots<a class="headerlink" href="#screenshots" title="Permalink to this headline">¶</a></h2>
<p>Here is what the program looks like:</p>
<img alt="../_images/vanderwaals.png" src="../_images/vanderwaals.png" />
</div>
<div class="section" id="but-it-could-be-better">
<h2>But it could be better....<a class="headerlink" href="#but-it-could-be-better" title="Permalink to this headline">¶</a></h2>
<p>It seems inconvenient to have to call a calculation function manually
before we call <tt class="xref py py-meth docutils literal"><span class="pre">configure_traits()</span></tt>.  Also, the pressure equation depends on
the values of other variables. It would be nice to make the
relationship between the dependant and independent variables clearer.
There is another way we could define our variables that is easier for
the user to understand, and provides better source documentation.</p>
<p>Since our X-values remain constant in this example, it is wasteful to
keep recreating the <tt class="xref py py-attr docutils literal"><span class="pre">volume</span></tt> array.  The Y-array, <tt class="xref py py-attr docutils literal"><span class="pre">pressure</span></tt>, is the
single array that needs to be updated when the independent variables
change. So, instead of defining <tt class="xref py py-attr docutils literal"><span class="pre">pressure</span></tt> as an <tt class="xref py py-class docutils literal"><span class="pre">Array</span></tt>, we define
it as a <tt class="xref py py-class docutils literal"><span class="pre">Property</span></tt>. Property is a Traits type that allows you to define
a variable whose value is recalculated whenever it is requested. In
addition, when the <em>depends_on</em> argument of a Property constructor is
set to list of traits in your <tt class="xref py py-class docutils literal"><span class="pre">HasTraits</span></tt> class, the property&#8217;s trait
events fire whenever any of the dependent trait&#8217;s change events
fire. This means that the <tt class="xref py py-attr docutils literal"><span class="pre">pressure</span></tt> attribute fires a trait change
whenever our <em>depends_on</em> traits are changed. Meanwhile, the Chaco plot
is automatically listening to the <tt class="xref py py-attr docutils literal"><span class="pre">pressure</span></tt> attribute, so the plot
display gets the new value of <tt class="xref py py-attr docutils literal"><span class="pre">pressure</span></tt> whenever someone changes
the input parameters!</p>
<p>When the value of a Property trait is requested, the
<tt class="samp docutils literal"><span class="pre">_get_</span><em><span class="pre">trait_name</span></em></tt> method is called to calculate and return its
current value. So we define use the <tt class="xref py py-meth docutils literal"><span class="pre">_get_pressure()</span></tt> method as our new
calculation method.  It is important to note that this implementation
does have a weakness.  Since we are calculating new pressures each
time someone changes the value of the input variables, this could slow
down the program if the calculation is long.  When the user drags a
slider widget, each stopping point along the slider requests a
recompute.</p>
<p>For the new implementation, these are the necessary changes:</p>
<ol class="arabic simple">
<li>Define the Y-coordinate array variable as a Property instead of an
Array.</li>
<li>Perform the calculations in the <tt class="samp docutils literal"><span class="pre">_get_</span><em><span class="pre">trait_name</span></em></tt> method for the
Y-coordinate array variable, which is <tt class="xref py py-meth docutils literal"><span class="pre">_get_pressure()</span></tt> in this
example.</li>
<li>Define the <tt class="samp docutils literal"><span class="pre">_</span><em><span class="pre">trait</span></em><span class="pre">_default</span></tt> method to set the initial value of
the X-coordinate array, so <tt class="xref py py-meth docutils literal"><span class="pre">_get_pressure()</span></tt> does not have to keep
recalculating it.</li>
<li>Remove the previous <tt class="xref py py-func docutils literal"><span class="pre">&#64;on_trait_change()</span></tt> decorator and calculation
method.</li>
</ol>
<p>The new pieces of code to add to the Data class are:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">class</span> <span class="nc">Data</span><span class="p">(</span><span class="n">HasTraits</span><span class="p">):</span>
    <span class="o">...</span>
    <span class="n">pressure</span> <span class="o">=</span> <span class="n">Property</span><span class="p">(</span><span class="n">Array</span><span class="p">,</span> <span class="n">depends_on</span><span class="o">=</span><span class="p">[</span><span class="s">&#39;temperature&#39;</span><span class="p">,</span>
                                           <span class="s">&#39;attraction&#39;</span><span class="p">,</span>
                                           <span class="s">&#39;totVolume&#39;</span><span class="p">])</span>
    <span class="o">...</span>

    <span class="k">def</span> <span class="nf">_volume_default</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
      <span class="k">return</span> <span class="n">arange</span><span class="p">(</span><span class="o">.</span><span class="mi">1</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>

    <span class="c"># Pressure is recalculated whenever one of the elements the property</span>
    <span class="c"># depends on changes.  No need to use @on_trait_change.</span>
    <span class="k">def</span> <span class="nf">_get_pressure</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
      <span class="k">return</span> <span class="p">((</span><span class="bp">self</span><span class="o">.</span><span class="n">r_constant</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">temperature</span><span class="p">)</span>
              <span class="o">/</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">volume</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">totVolume</span><span class="p">)</span>
             <span class="o">-</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">attraction</span><span class="o">/</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">volume</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">volume</span><span class="p">)))</span>
</pre></div>
</div>
<p>You now no longer have to call an inconvenient calculation function
before the first call to <tt class="xref py py-meth docutils literal"><span class="pre">configure_traits()</span></tt>!</p>
</div>
<div class="section" id="source-code">
<h2>Source Code<a class="headerlink" href="#source-code" title="Permalink to this headline">¶</a></h2>
<p>The final version on the program, <cite>vanderwaals.py</cite></p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">enthought.traits.api</span> \
    <span class="kn">import</span> <span class="n">HasTraits</span><span class="p">,</span> <span class="n">Array</span><span class="p">,</span> <span class="n">Range</span><span class="p">,</span> <span class="n">Float</span><span class="p">,</span> <span class="n">Enum</span><span class="p">,</span> <span class="n">on_trait_change</span><span class="p">,</span> <span class="n">Property</span>
<span class="kn">from</span> <span class="nn">enthought.traits.ui.api</span> <span class="kn">import</span> <span class="n">View</span><span class="p">,</span> <span class="n">Item</span>
<span class="kn">from</span> <span class="nn">enthought.chaco.chaco_plot_editor</span> <span class="kn">import</span> <span class="n">ChacoPlotItem</span>
<span class="kn">from</span> <span class="nn">numpy</span> <span class="kn">import</span> <span class="n">arange</span>

<span class="k">class</span> <span class="nc">Data</span><span class="p">(</span><span class="n">HasTraits</span><span class="p">):</span>
    <span class="n">volume</span> <span class="o">=</span> <span class="n">Array</span>
    <span class="n">pressure</span> <span class="o">=</span> <span class="n">Property</span><span class="p">(</span><span class="n">Array</span><span class="p">,</span> <span class="n">depends_on</span><span class="o">=</span><span class="p">[</span><span class="s">&#39;temperature&#39;</span><span class="p">,</span> <span class="s">&#39;attraction&#39;</span><span class="p">,</span>
                                       <span class="s">&#39;totVolume&#39;</span><span class="p">])</span>
    <span class="n">attraction</span> <span class="o">=</span> <span class="n">Range</span><span class="p">(</span><span class="n">low</span><span class="o">=-</span><span class="mf">50.0</span><span class="p">,</span><span class="n">high</span><span class="o">=</span><span class="mf">50.0</span><span class="p">,</span><span class="n">value</span><span class="o">=</span><span class="mf">0.0</span><span class="p">)</span>
    <span class="n">totVolume</span> <span class="o">=</span> <span class="n">Range</span><span class="p">(</span><span class="n">low</span><span class="o">=.</span><span class="mo">01</span><span class="p">,</span><span class="n">high</span><span class="o">=</span><span class="mf">100.0</span><span class="p">,</span><span class="n">value</span><span class="o">=</span><span class="mf">0.01</span><span class="p">)</span>
    <span class="n">temperature</span> <span class="o">=</span> <span class="n">Range</span><span class="p">(</span><span class="n">low</span><span class="o">=-</span><span class="mf">50.0</span><span class="p">,</span><span class="n">high</span><span class="o">=</span><span class="mf">50.0</span><span class="p">,</span><span class="n">value</span><span class="o">=</span><span class="mf">50.0</span><span class="p">)</span>
    <span class="n">r_constant</span><span class="o">=</span> <span class="n">Float</span><span class="p">(</span><span class="mf">8.314472</span><span class="p">)</span>
    <span class="n">plot_type</span> <span class="o">=</span> <span class="n">Enum</span><span class="p">(</span><span class="s">&quot;line&quot;</span><span class="p">,</span> <span class="s">&quot;scatter&quot;</span><span class="p">)</span>

    <span class="n">traits_view</span> <span class="o">=</span> <span class="n">View</span><span class="p">(</span><span class="n">ChacoPlotItem</span><span class="p">(</span><span class="s">&quot;volume&quot;</span><span class="p">,</span> <span class="s">&quot;pressure&quot;</span><span class="p">,</span>
                               <span class="n">type_trait</span><span class="o">=</span><span class="s">&quot;plot_type&quot;</span><span class="p">,</span>
                               <span class="n">resizable</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
                               <span class="n">x_label</span><span class="o">=</span><span class="s">&quot;Volume&quot;</span><span class="p">,</span>
                               <span class="n">y_label</span><span class="o">=</span><span class="s">&quot;Pressure&quot;</span><span class="p">,</span>
                               <span class="n">x_bounds</span><span class="o">=</span><span class="p">(</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="mi">120</span><span class="p">),</span>
                               <span class="n">x_auto</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>
                               <span class="n">y_bounds</span><span class="o">=</span><span class="p">(</span><span class="o">-</span><span class="mi">2000</span><span class="p">,</span><span class="mi">4000</span><span class="p">),</span>
                               <span class="n">y_auto</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>
                               <span class="n">color</span><span class="o">=</span><span class="s">&quot;blue&quot;</span><span class="p">,</span>
                               <span class="n">bgcolor</span><span class="o">=</span><span class="s">&quot;white&quot;</span><span class="p">,</span>
                               <span class="n">border_visible</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
                               <span class="n">border_width</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
                               <span class="n">title</span><span class="o">=</span><span class="s">&#39;Pressure vs. Volume&#39;</span><span class="p">,</span>
                               <span class="n">padding_bg_color</span><span class="o">=</span><span class="s">&quot;lightgray&quot;</span><span class="p">),</span>
                       <span class="n">Item</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&#39;attraction&#39;</span><span class="p">),</span>
                       <span class="n">Item</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&#39;totVolume&#39;</span><span class="p">),</span>
                       <span class="n">Item</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&#39;temperature&#39;</span><span class="p">),</span>
                       <span class="n">Item</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&#39;r_constant&#39;</span><span class="p">,</span> <span class="n">style</span><span class="o">=</span><span class="s">&#39;readonly&#39;</span><span class="p">),</span>
                       <span class="n">Item</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&#39;plot_type&#39;</span><span class="p">),</span>
                       <span class="n">resizable</span> <span class="o">=</span> <span class="bp">True</span><span class="p">,</span>
                       <span class="n">buttons</span> <span class="o">=</span> <span class="p">[</span><span class="s">&quot;OK&quot;</span><span class="p">],</span>
                       <span class="n">title</span><span class="o">=</span><span class="s">&#39;Van der Waal Equation&#39;</span><span class="p">,</span>
                       <span class="n">width</span><span class="o">=</span><span class="mi">900</span><span class="p">,</span> <span class="n">height</span><span class="o">=</span><span class="mi">800</span><span class="p">)</span>


    <span class="k">def</span> <span class="nf">_volume_default</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; Default handler for volume Trait Array. &quot;&quot;&quot;</span>
        <span class="k">return</span> <span class="n">arange</span><span class="p">(</span><span class="o">.</span><span class="mi">1</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">_get_pressure</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot;Recalculate when one a trait the property depends on changes.&quot;&quot;&quot;</span>
        <span class="k">return</span> <span class="p">((</span><span class="bp">self</span><span class="o">.</span><span class="n">r_constant</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">temperature</span><span class="p">)</span>
              <span class="o">/</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">volume</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">totVolume</span><span class="p">)</span>
             <span class="o">-</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">attraction</span><span class="o">/</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">volume</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">volume</span><span class="p">)))</span>

<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span>
    <span class="n">viewer</span> <span class="o">=</span> <span class="n">Data</span><span class="p">()</span>
    <span class="n">viewer</span><span class="o">.</span><span class="n">configure_traits</span><span class="p">()</span>
</pre></div>
</div>
</div>
</div>


          </div>
        </div>
      </div>
      <div class="sphinxsidebar">
        <div class="sphinxsidebarwrapper">
            <p class="logo"><a href="../index.html">
              <img class="logo" src="../_static/e-logo-rev.png" alt="Logo"/>
            </a></p>
<h3>Page Contents</h3>
<ul>
<li><a class="reference internal" href="#">Modeling Van der Waal&#8217;s Equation With Chaco and Traits</a><ul>
<li><a class="reference internal" href="#overview">Overview</a></li>
<li><a class="reference internal" href="#development-setup">Development Setup</a></li>
<li><a class="reference internal" href="#writing-the-program">Writing the Program</a></li>
<li><a class="reference internal" href="#creating-the-view">Creating the View</a></li>
<li><a class="reference internal" href="#updating-the-plot">Updating the Plot</a></li>
<li><a class="reference internal" href="#testing-your-program">Testing your Program</a></li>
<li><a class="reference internal" href="#screenshots">Screenshots</a></li>
<li><a class="reference internal" href="#but-it-could-be-better">But it could be better....</a></li>
<li><a class="reference internal" href="#source-code">Source Code</a></li>
</ul>
</li>
</ul>

  <h3>This Page</h3>
  <ul class="this-page-menu">
    <li><a href="../_sources/user_manual/tutorial_2.txt"
           rel="nofollow">Show Source</a></li>
  </ul>
<div id="searchbox" style="display: none">
  <h3>Quick search</h3>
    <form class="search" action="../search.html" method="get">
      <input type="text" name="q" size="18" />
      <input type="submit" value="Go" />
      <input type="hidden" name="check_keywords" value="yes" />
      <input type="hidden" name="area" value="default" />
    </form>
    <p class="searchtip" style="font-size: 90%">
    Enter search terms or a module, class or function name.
    </p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
        </div>
      </div>
      <div class="clearer"></div>
    </div>
    <div class="related">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="tutorial_hyetograph.html" title="Creating an interactive Hyetograph with Chaco and Traits"
             >next</a></li>
        <li class="right" >
          <a href="tutorial_1.html" title="Interactive Plotting with Chaco"
             >previous</a> |</li>
        <li><a href="../index.html">Chaco v3.4.0 documentation</a> &raquo;</li>
          <li><a href="tutorial.html" >Tutorials</a> &raquo;</li>
  
    <li><a href="#">Modeling Van der Waal&#8217;s Equation With Chaco and Traits</a></li>
  

      </ul>
    </div>
    <div class="footer">
        &copy; Copyright 2008, Enthought, Inc..
      Last updated on Mar 02, 2011.
      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.0.7.
    </div>
  </body>
</html>