Changes in / [20:30]


Ignore:
Location:
/trunk
Files:
18 added
37 edited

Legend:

Unmodified
Added
Removed
  • /trunk/examples/app-fermi/fermi

    r20 r30  
    99# ======================================================================
    1010#\
    11 exec tclsh "$0" "*$"
     11exec tclsh "$0" "$*"
    1212# ----------------------------------------------------------------------
    1313# tclsh executes everything from here on...
     
    1616
    1717# open the XML file containing the run parameters
    18 set driver [Rappture::library driver.xml]
     18set driver [Rappture::library [lindex $argv 0]]
    1919
    20 set T 300
    21 set Ef -5.5
     20set T [$driver get input.(temperature).current]
     21set T [Rappture::Units::convert $T -to K -units off]
     22set Ef [$driver get input.(Ef).current]
     23set Ef [Rappture::Units::convert $Ef -to eV -units off]
    2224
    2325set kT [expr {8.61734e-5 * $T}]
     
    3436}
    3537
    36 $driver put output.curve(f12).label "Fermi-Dirac Factor"
     38$driver put output.curve(f12).about.label "Fermi-Dirac Factor"
     39$driver put output.curve(f12).xaxis.label "Energy"
     40$driver put output.curve(f12).xaxis.units "eV"
    3741$driver put output.curve(f12).component.xy $xy
    3842
     
    4145# Be sure to do this back in the original directory
    4246#
    43 set fid [open run.xml w]
     47set rfile "run[clock seconds].xml"
     48set fid [open $rfile w]
    4449puts $fid "<?xml version=\"1.0\"?>"
    4550puts $fid [$driver xml]
    4651close $fid
     52
     53puts "=RAPPTURE-RUN=>$rfile"
  • /trunk/examples/app-fermi/tool.xml

    r20 r30  
    11<?xml version="1.0"?>
    22<run>
    3 <tool>
    4   <about>Press Simulate to view results.
    5   </about>
    6   <command>
    7     /home/mmc/nanohub/app-fermi/fermi
    8   </command>
    9 </tool>
    10 <input>
    11   <group id="ambient">
    12     <number id="temperature">
    13       <label>Ambient temperature</label>
    14       <units>K</units>
    15       <min>120K</min>
    16       <max>500K</max>
    17       <default>300K</default>
    18       <current>300K</current>
    19       <preset>
    20         <value>400K</value>
    21         <label>400K (hot)</label>
    22       </preset>
    23       <preset>
    24         <value>300K</value>
    25         <label>300K (room temperature)</label>
    26       </preset>
    27       <preset>
    28         <value>200K</value>
    29         <label>200K (cold)</label>
    30       </preset>
    31     </number>
    32   </group>
    33   <number id="Ef">
    34     <label>Fermi Level</label>
    35     <units>eV</units>
    36     <min>-10eV</min>
    37     <max>10eV</max>
    38     <default>-5.5eV</default>
    39   </number>
    40 </input>
     3    <tool>
     4        <about>Press Simulate to view results.</about>
     5        <command> put run-command here </command>
     6    </tool>
     7    <input>
     8        <!-- this temp should be moved to a more global scope -->
     9        <group id="ambient">
     10            <number id="temperature">
     11                <about>
     12                    <label>Ambient temperature</label>
     13                </about>
     14                <units>K</units>
     15                <min>120K</min>
     16                <max>500K</max>
     17                <default>300</default>
     18                <current>300</current>
     19                <preset>
     20                    <value>400K</value>
     21                    <label>400K (hot)</label>
     22                </preset>
     23                <preset>
     24                    <value>300K</value>
     25                    <label>300K (room temperature)</label>
     26                </preset>
     27                <preset>
     28                    <value>200K</value>
     29                    <label>200K (cold)</label>
     30                </preset>
     31            </number>
     32        </group>
     33        <group id="simulation_params">
     34            <group id="handle">
     35                <!-- more like yes or no flags -->
     36                <string id="comments">
     37                    <label>comments</label>
     38                    <default>off</default>
     39                    <current>off</current>
     40                </string>
     41                <boolean id="iflag3B">
     42                    <label>iflag3B</label>
     43                    <default>0</default>
     44                    <current>0</current>
     45                </boolean>
     46                <boolean id="iflagPOI">
     47                    <label>iflagPOI</label>
     48                    <default>1</default>
     49                    <current>0</current>
     50                </boolean>
     51                <number id="iterPOImax">
     52                    <label>iterPOImax</label>
     53                    <min>0</min>
     54                    <max>200</max>
     55                    <default>10</default>
     56                    <current>0</current>
     57                </number>
     58                <number id="intiterPOImax">
     59                    <label>intiterPOImax</label>
     60                    <min>0</min>
     61                    <max>200</max>
     62                    <default>5</default>
     63                    <current>5</current>
     64                </number>
     65                <number id="ndampPOI">
     66                    <label>ndampPOI</label>
     67                    <min>0</min>
     68                    <max>1000</max>
     69                    <default>500</default>
     70                    <current>500</current>
     71                </number>
     72                <number id="normPOI">
     73                    <label>normPOI</label>
     74                    <min>0</min>
     75                    <max>1</max>
     76                    <default>1.0e-4</default>
     77                    <current>1.0e-4</current>
     78                </number>
     79                <string id="simtype">
     80                    <label>simtype</label>
     81                    <default>Q</default>
     82                    <current>Q</current>
     83                </string>
     84                <boolean id="iflagGL">
     85                    <label>iflagGL</label>
     86                    <default>1</default>
     87                    <current>1</current>
     88                </boolean>
     89                <boolean id="iflagGG">
     90                    <label>iflagGG</label>
     91                    <default>0</default>
     92                    <current>0</current>
     93                </boolean>
     94                <boolean id="iflagBAC">
     95                    <label>iflagBAC</label>
     96                    <default>1</default>
     97                    <current>1</current>
     98                </boolean>
     99            </group>
     100            <group id="outwrite">
     101                <string id="extension">
     102                    <label>Filename Extension</label>
     103                    <default>_DG.txt</default>
     104                    <current>_DG.txt</current>
     105                </string>
     106                <boolean id="iwritePROF">
     107                    <label>iwritePROF</label>
     108                    <default>1</default>
     109                    <current>1</current>
     110                </boolean>
     111                <boolean id="iwritePROFduringPOI">
     112                    <label>iwritePROFduringPOI</label>
     113                    <default>1</default>
     114                    <current>1</current>
     115                </boolean>
     116                <boolean id="iwriteCURvsE">
     117                    <label>iwriteCURvsE</label>
     118                    <default>1</default>
     119                    <current>1</current>
     120                </boolean>
     121                <boolean id="iwriteDOSvsE">
     122                    <label>iwriteDOSvsE</label>
     123                    <default>1</default>
     124                    <current>1</current>
     125                </boolean>
     126                <boolean id="iwriteSIGcvsE">
     127                    <label>iwriteSIGcvsE</label>
     128                    <default>1</default>
     129                    <current>1</current>
     130                </boolean>
     131                <boolean id="iwriteSIGcvsE1D">
     132                    <label>iwriteSIGcvsE1D</label>
     133                    <default>1</default>
     134                    <current>1</current>
     135                </boolean>
     136                <boolean id="iwriteCURvsY">
     137                    <label>iwriteCURvsY</label>
     138                    <default>1</default>
     139                    <current>1</current>
     140                </boolean>
     141                <boolean id="iwriteEres">
     142                    <label>iwriteEres</label>
     143                    <default>1</default>
     144                    <current>1</current>
     145                </boolean>
     146                <boolean id="iwritePSIsq">
     147                    <label>iwritePSIsq</label>
     148                    <default>1</default>
     149                    <current>1</current>
     150                </boolean>
     151                <boolean id="iwriteTRAN">
     152                    <label>iwriteTRAN</label>
     153                    <default>1</default>
     154                    <current>1</current>
     155                </boolean>
     156                <boolean id="iwriteIV">
     157                    <label>iwriteIV</label>
     158                    <default>1</default>
     159                    <current>1</current>
     160                </boolean>
     161                <boolean id="iwriteINGUESS">
     162                    <label>iwriteINGUESS</label>
     163                    <default>1</default>
     164                    <current>1</current>
     165                </boolean>
     166                <boolean id="iwriteDOPI">
     167                    <label>iwriteDOPI</label>
     168                    <default>1</default>
     169                    <current>1</current>
     170                </boolean>
     171                <boolean id="iwriteGRID">
     172                    <label>iwriteGRID</label>
     173                    <default>1</default>
     174                    <current>1</current>
     175                </boolean>
     176                <boolean id="iwriteEGRID">
     177                    <label>iwriteEGRID</label>
     178                    <default>1</default>
     179                    <current>1</current>
     180                </boolean>
     181                <boolean id="iwriteMATERIAL">
     182                    <label>iwriteMATERIAL</label>
     183                    <default>1</default>
     184                    <current>1</current>
     185                </boolean>
     186            </group>
     187        </group>
     188        <!-- this group should be removed, its structure is properly defined below -->
     189        <group id="2dmosfet">
     190            <number id="Lx">
     191                <label>x simulation width</label>
     192                <units>nm</units>
     193                <min>0nm</min>
     194                <max>1000nm</max>
     195                <default>10</default>
     196                <current>24</current>
     197            </number>
     198            <number id="Ly">
     199                <label>y simulation length</label>
     200                <units>nm</units>
     201                <min>0nm</min>
     202                <max>1000nm</max>
     203                <default>10</default>
     204                <current>40</current>
     205            </number>
     206        </group>
     207        <group id="energy">
     208            <number id="ksize">
     209                <label>total egrid size</label>
     210                <units></units>
     211                <default>512</default>
     212                <current>256</current>
     213            </number>
     214            <number id="ksize_un">
     215                <label>uniform background grid</label>
     216                <units></units>
     217                <default>56</default>
     218                <current>56</current>
     219            </number>
     220            <string id="type">
     221                <label>type of energy grid</label>
     222                <default>nonuniform</default>
     223                <current>nonuniform</current>
     224            </string>
     225            <number id="lower_energy_grid">
     226                <label>lower limit of energy grid</label>
     227                <units></units>
     228                <default>-1000</default>
     229                <current>-1000.0</current>
     230            </number>
     231            <number id="higher_energy_grid">
     232                <label>higher limit of energy grid</label>
     233                <units></units>
     234                <default>1000</default>
     235                <current>1000.0</current>
     236            </number>
     237            <number id="high_energy_tail_cutoff">
     238                <label>high energy tail cutoff</label>
     239                <units></units>
     240                <default>10</default>
     241                <current>10.0</current>
     242            </number>
     243            <number id="lower_energy_tail_cutoff">
     244                <label>lower energy tail cutoff</label>
     245                <units></units>
     246                <default>3</default>
     247                <current>3.0</current>
     248            </number>
     249            <boolean id="iflagRES">
     250                    <label>iflagRES</label>
     251                    <default>1</default>
     252                    <current>1</current>
     253            </boolean>
     254        </group>
     255        <structure id="str">
     256            <current id = "cur">
     257              <!-- numeric parameters to be set by user in gui -->
     258              <!-- variables describing the geometry of boxes-->
     259              <parameters id="param">
     260                <number id="Ly">
     261                  <about>
     262                    <label>Domain Length</label>
     263                  </about>
     264                  <units>nm</units>
     265                  <default>40nm</default>
     266                  <current>40nm</current>
     267                </number>
     268                <number id="Lx">
     269                  <about>
     270                    <label>Domain Width</label>
     271                  </about>
     272                  <units>nm</units>
     273                  <default>24nm</default>
     274                  <current>24nm</current>
     275                </number>
     276                <number id="SDlength">
     277                  <about>
     278                    <label>Source / Drain Width</label>
     279                  </about>
     280                  <units>nm</units>
     281                  <default>14nm</default>
     282                  <current>14nm</current>
     283                </number>
     284                <number id="SDwidth">
     285                  <about>
     286                    <label>Source / Drain Width</label>
     287                  </about>
     288                  <units>nm</units>
     289                  <default>14nm</default>
     290                  <current>14nm</current>
     291                </number>
     292                <number id="ChannelLength">
     293                  <about>
     294                    <label>Channel Length</label>
     295                  </about>
     296                  <units>nm</units>
     297                  <default>12nm</default>
     298                  <current>12nm</current>
     299                </number>
     300                <number id="ChannelWidth">
     301                  <about>
     302                    <label>Channel Width</label>
     303                  </about>
     304                  <units>nm</units>
     305                  <default>2nm</default>
     306                  <current>2nm</current>
     307                </number>
     308                <number id="TopOxideThickness">
     309                  <about>
     310                    <label>Top Oxide Thickness</label>
     311                  </about>
     312                  <units>nm</units>
     313                  <default>1.5nm</default>
     314                  <current>1.5nm</current>
     315                </number>
     316                <number id="BotOxideThickness">
     317                  <about>
     318                    <label>Bottom Oxide Thickness</label>
     319                  </about>
     320                  <units>nm</units>
     321                  <default>1.5nm</default>
     322                  <current>1.5nm</current>
     323                </number>
     324                <number id="GateLength">
     325                  <about>
     326                    <label>Gate Length</label>
     327                  </about>
     328                  <units>nm</units>
     329                  <default>10nm</default>
     330                  <current>10nm</current>
     331                </number>
     332                <number id="NxGridTopOxide">
     333                 <label>No. of grid (nx) in Top Oxide</label>
     334                 <units></units>
     335                 <default>5</default>
     336                 <current>5</current>
     337                </number>
     338                <number id="NxGridChannel">
     339                 <label>No. of grid (nx) in Channel</label>
     340                 <units></units>
     341                 <default>15</default>
     342                 <current>15</current>
     343                </number>
     344                <number id="NxGridBottomOxide">
     345                 <label>No. of grid (nx) in Bottom Oxide </label>
     346                 <units></units>
     347                 <default>5</default>
     348                 <current>5</current>
     349                </number>
     350                <number id="GridSizeY">
     351                 <label>Grid Size (DeltaY)</label>
     352                 <units>nm</units>
     353                 <default>0.25nm</default>
     354                 <current>0.4nm</current>
     355                </number>
     356                <group id="ix_contact">
     357                    <number id="first">
     358                      <default>2</default>
     359                      <current>2</current>
     360                    </number>
     361                    <number id="last">
     362                      <default>8</default>
     363                      <current>8</current>
     364                    </number>
     365                </group>
     366                <group id="iy_contact">
     367                    <number id="first">
     368                      <default>1</default>
     369                      <current>1</current>
     370                    </number>
     371                    <number id="last">
     372                      <default>1</default>
     373                      <current>1</current>
     374                    </number>
     375                </group>
     376                <group id="ix_coupling">
     377                    <number id="first">
     378                      <default>2</default>
     379                      <current>2</current>
     380                    </number>
     381                    <number id="last">
     382                      <default>8</default>
     383                      <current>8</current>
     384                    </number>
     385                </group>
     386                <group id="iy_coupling">
     387                    <number id="first">
     388                      <default>1</default>
     389                      <current>1</current>
     390                    </number>
     391                    <number id="last">
     392                      <default>1</default>
     393                      <current>1</current>
     394                    </number>
     395                </group>
     396                <!-- this is the only user modified value -->
     397                <group id="source">
     398                    <number id="voltage">
     399                      <about>
     400                        <label>Source Voltage</label>
     401                      </about>
     402                      <units>mV</units>
     403                      <min>0mV</min>
     404                      <default>0mV</default>
     405                      <current>0mV</current>
     406                    </number>
     407                </group> <!-- end source -->
     408                <group id="drain">
     409                    <number id="voltage">
     410                      <about>
     411                        <label>Drain Voltage</label>
     412                      </about>
     413                      <units>mV</units>
     414                      <min>0mV</min>
     415                      <default>0mV</default>
     416                      <current>600mV</current>
     417                    </number>
     418                </group>
     419                <group id="gate">
     420                    <number id="voltage">
     421                      <about>
     422                        <label>Gate Voltage</label>
     423                      </about>
     424                      <units>mV</units>
     425                      <min>0mV</min>
     426                      <default>0mV</default>
     427                      <current>0mV</current>
     428                    </number>
     429                </group>
     430                <number id="num_contacts">
     431                  <about>
     432                    <label>number of contacts with varying bias</label>
     433                  </about>
     434                  <units></units>
     435                  <default>1</default>
     436                  <current>2</current>
     437                </number>
     438                <!-- it would be better if we could get the
     439                     next 4 variables into 1 var -->
     440                <number id="varying_contact1">
     441                  <about>
     442                    <label>contact with varying bias</label>
     443                    <!--
     444                        1 - source
     445                        2 - drain
     446                        3 - bottom gate
     447                        4 - top gate
     448                    -->
     449                  </about>
     450                  <units></units>
     451                  <default>0</default>
     452                  <current>3</current>
     453                </number>
     454                <number id="varying_contact2">
     455                  <about>
     456                    <label>contact with varying bias</label>
     457                    <!--
     458                        1 - source
     459                        2 - drain
     460                        3 - bottom gate
     461                        4 - top gate
     462                    -->
     463                  </about>
     464                  <units></units>
     465                  <default>0</default>
     466                  <current>4</current>
     467                </number>
     468                <number id="varying_contact3">
     469                  <about>
     470                    <label>contact with varying bias</label>
     471                    <!--
     472                        1 - source
     473                        2 - drain
     474                        3 - bottom gate
     475                        4 - top gate
     476                    -->
     477                  </about>
     478                  <units></units>
     479                  <default>0</default>
     480                  <current>0</current>
     481                </number>
     482                <number id="varying_contact4">
     483                  <about>
     484                    <label>contact with varying bias</label>
     485                    <!--
     486                        1 - source
     487                        2 - drain
     488                        3 - bottom gate
     489                        4 - top gate
     490                    -->
     491                  </about>
     492                  <units></units>
     493                  <default>0</default>
     494                  <current>0</current>
     495                </number>
     496                <number id="bias_min">
     497                  <about>
     498                    <label>Min Applied Voltage</label>
     499                  </about>
     500                  <units>mV</units>
     501                  <min>0mV</min>
     502                  <default>0mV</default>
     503                  <current>0mV</current>
     504                </number>
     505                <number id="bias_max">
     506                  <about>
     507                    <label>Max Applied Voltage</label>
     508                  </about>
     509                  <units>mV</units>
     510                  <min>0mV</min>
     511                  <default>0mV</default>
     512                  <current>0mV</current>
     513                </number>
     514                <number id="bias_step">
     515                  <about>
     516                    <label>Applied Voltage Step</label>
     517                  </about>
     518                  <units>mV</units>
     519                  <min>0mV</min>
     520                  <default>100mV</default>
     521                  <current>100mV</current>
     522                </number>
     523              </parameters>
     524              <!-- the following describes the box dimensions -->
     525              <components>
     526                <box>
     527                  <about>
     528                    <label>Source</label>
     529                    <color>yellow</color>
     530                  </about>
     531                  <corner>-20,-7</corner>
     532                  <corner>-6,7</corner>
     533                  <material>Si</material>
     534                </box>
     535                <box>
     536                  <about>
     537                    <label>Drain</label>
     538                    <color>yellow</color>
     539                  </about>
     540                  <corner>20,-7</corner>
     541                  <corner>6,7</corner>
     542                  <material>Si</material>
     543                </box>
     544                <box>
     545                  <about>
     546                    <label>Channel</label>
     547                    <color>yellow</color>
     548                  </about>
     549                  <corner>-6,-1</corner>
     550                  <corner>6,1</corner>
     551                  <material>Si</material>
     552                </box>
     553                <box>
     554                  <about>
     555                    <label>Top Oxide</label>
     556                    <color>yellow</color>
     557                  </about>
     558                  <corner>,-5,-2.5</corner>
     559                  <corner>5,-1</corner>
     560                  <material>Oxide1</material>
     561                </box>
     562                <box>
     563                  <about>
     564                    <label>Bottom Oxide</label>
     565                    <color>yellow</color>
     566                  </about>
     567                  <corner>-5,1</corner>
     568                  <corner>5,2.5</corner>
     569                  <material>Oxide</material>
     570                </box>
     571              </components>
     572              <!-- the following describes the user defined material specs  -->
     573              <domain_materials>
     574                <material name="Si">
     575                    <properties id="transport">
     576                        <emiso>0.328</emiso>
     577                        <emx>0.98</emx>
     578                        <emy>0.98</emy>
     579                        <emz>0.98</emz>
     580                        <hmiso>0.49</hmiso>
     581                        <eps>11.9</eps>
     582                        <Egap>1.12D03</Egap>
     583                        <affinity>4.05D03</affinity>
     584                    </properties>
     585                </material>
     586                <material name="SiO2">
     587                    <properties id="transport">
     588                        <emiso>0.5</emiso>
     589                        <emx>0.5</emx>
     590                        <emy>0.5</emy>
     591                        <emz>0.5</emz>
     592                        <hmiso>0.5</hmiso>
     593                        <eps>3.9</eps>
     594                        <Egap>8.8D03</Egap>
     595                        <affinity>0.95D03</affinity>
     596                    </properties>
     597                </material>
     598                <material name="Metal">
     599                    <properties id="transport">
     600                        <emiso>0.328</emiso>
     601                        <emx>0.98</emx>
     602                        <emy>0.19</emy>
     603                        <emz>0.19</emz>
     604                        <hmiso>0.49</hmiso>
     605                        <eps>11.9</eps>
     606                        <Egap>1.12D03</Egap>
     607                        <affinity>4.42270D03</affinity>
     608                    </properties>
     609                </material>
     610                <material name="Metal1">
     611                    <properties id="transport">
     612                        <emiso>0.328</emiso>
     613                        <emx>0.98</emx>
     614                        <emy>0.19</emy>
     615                        <emz>0.19</emz>
     616                        <hmiso>0.49</hmiso>
     617                        <eps>11.9</eps>
     618                        <Egap>1.12D03</Egap>
     619                        <affinity>4.42270D03</affinity>
     620                    </properties>
     621                </material>
     622                <material name="Oxide">
     623                    <properties id="transport">
     624                        <emiso>0.5</emiso>
     625                        <emx>0.5</emx>
     626                        <emy>0.5</emy>
     627                        <emz>0.5</emz>
     628                        <hmiso>0.5</hmiso>
     629                        <eps>3.9</eps>
     630                        <Egap>8.8D03</Egap>
     631                        <affinity>0.95D03</affinity>
     632                    </properties>
     633                </material>
     634                <material name="Oxide1">
     635                    <properties id="transport">
     636                        <emiso>0.5</emiso>
     637                        <emx>0.5</emx>
     638                        <emy>0.5</emy>
     639                        <emz>0.5</emz>
     640                        <hmiso>0.5</hmiso>
     641                        <eps>3.9</eps>
     642                        <Egap>8.8D03</Egap>
     643                        <affinity>0.95D03</affinity>
     644                    </properties>
     645                </material>
     646              </domain_materials>
     647            </current>
     648        </structure>
     649    </input>
    41650</run>
  • /trunk/gui/apps/driver

    r20 r30  
    2525package require Rappture
    2626
    27 option add *MainWin.mode web startupFile
     27option add *MainWin.mode desktop startupFile
    2828option add *MainWin.borderWidth 0 startupFile
    29 option add *MainWin.anchor nw startupFile
     29option add *MainWin.anchor center startupFile
    3030
    3131# "web site" look
     
    4444option add *TemperatureGauge.textBackground white
    4545option add *Switch.textBackground white
     46option add *Progress.barColor #ffffcc
    4647
    4748switch $tcl_platform(platform) {
     
    129130pack $f.analyze -expand yes -fill both
    130131
    131 $tool configure -analyzer $f.analyze
     132$tool notify add analyzer * [list $f.analyze reset]
    132133
    133134# ----------------------------------------------------------------------
     
    147148        $f.analyze configure -holdwindow [$win.pager page @0]
    148149
    149         if {[$tool xml get tool.control] == "auto"} {
     150        set type [$tool xml get tool.control]
     151        if {$type == ""} {
     152            set type [$tool xml get tool.control.type]
     153        }
     154
     155        if {$type == "auto"} {
    150156            # in "auto" mode, we don't need a simulate button
    151157            $f.analyze configure -simcontrol off
  • /trunk/gui/scripts/analyzer.tcl

    r20 r30  
    5757    protected method _fixSimControl {}
    5858    protected method _simState {state args}
     59    protected method _simOutput {message}
    5960
    6061    private variable _tool ""          ;# belongs to this tool
     
    165166    $w.info contents $w.info.text
    166167
     168    $itk_component(runinfo) tag configure ERROR -foreground red
     169
     170    itk_component add progress {
     171        Rappture::Progress $w.progress
     172    }
     173
    167174    # ------------------------------------------------------------------
    168175    # ANALYZE PAGE
     
    228235    # tool can run on "manual" (default) or "auto"
    229236    set cntl [$tool xml get tool.control]
     237    if {"" == $cntl} {
     238        set cntl [$tool xml get tool.control.type]
     239    }
    230240    if {"" != $cntl} {
    231241        set _control $cntl
     
    271281    $itk_component(notebook) current simulate
    272282
     283    # no progress messages yet
     284    pack forget $itk_component(progress)
     285    lappend args -output [itcl::code $this _simOutput]
     286
    273287    _simState off
    274288    $itk_component(runinfo) configure -state normal
    275289    $itk_component(runinfo) delete 1.0 end
    276     $itk_component(runinfo) insert end "Running simulation..."
     290    $itk_component(runinfo) insert end "Running simulation...\n\n"
    277291    $itk_component(runinfo) configure -state disabled
    278292
     
    369383            curve* - field* {
    370384                _autoLabel $xmlobj output.$item "Plot" counters
     385            }
     386            structure* {
     387                _autoLabel $xmlobj output.$item "Structure" counters
    371388            }
    372389            table* {
     
    678695
    679696# ----------------------------------------------------------------------
     697# USAGE: _simOutput <message>
     698#
     699# Invoked automatically whenever output comes in while running the
     700# tool.  Extracts any =RAPPTURE-???=> messages from the output and
     701# sends the output to the display.  For example, any
     702# =RAPPTURE-PROGRESS=> message pops up the progress meter and updates
     703# it to show the latest progress message.  This is useful for
     704# long-running tools, to let the user know how much longer the
     705# simulation will take.
     706# ----------------------------------------------------------------------
     707itcl::body Rappture::Analyzer::_simOutput {message} {
     708    #
     709    # Scan through and pick out any =RAPPTURE-PROGRESS=> messages first.
     710    #
     711    while {[regexp -indices \
     712               {=RAPPTURE-PROGRESS=>([0-9]+) +([^\n]*)(\n|$)} $message \
     713                match percent mesg]} {
     714
     715        foreach {i0 i1} $percent break
     716        set percent [string range $message $i0 $i1]
     717
     718        foreach {i0 i1} $mesg break
     719        set mesg [string range $message $i0 $i1]
     720
     721        pack $itk_component(progress) -fill x -padx 10 -pady 10
     722        $itk_component(progress) settings -percent $percent -message $mesg
     723
     724        foreach {i0 i1} $match break
     725        set message [string replace $message $i0 $i1]
     726    }
     727
     728    #
     729    # Break up the remaining lines according to =RAPPTURE-ERROR=> messages.
     730    # Show errors in a special color.
     731    #
     732    $itk_component(runinfo) configure -state normal
     733
     734    while {[regexp -indices \
     735               {=RAPPTURE-([a-zA-Z]+)=>([^\n]*)(\n|$)} $message \
     736                match type mesg]} {
     737
     738        foreach {i0 i1} $match break
     739        set first [string range $message 0 [expr {$i0-1}]]
     740        if {[string length $first] > 0} {
     741            $itk_component(runinfo) insert end $first
     742            $itk_component(runinfo) insert end \n
     743        }
     744
     745        foreach {t0 t1} $type break
     746        set type [string range $message $t0 $t1]
     747        foreach {m0 m1} $mesg break
     748        set mesg [string range $message $m0 $m1]
     749        if {[string length $mesg] > 0 && $type != "RUN"} {
     750            $itk_component(runinfo) insert end $mesg $type
     751            $itk_component(runinfo) insert end \n $type
     752        }
     753
     754        set message [string range $message [expr {$i1+1}] end]
     755    }
     756
     757    if {[string length $message] > 0} {
     758        $itk_component(runinfo) insert end $message
     759        if {[$itk_component(runinfo) get end-2char] != "\n"} {
     760            $itk_component(runinfo) insert end "\n"
     761        }
     762        $itk_component(runinfo) see end
     763    }
     764    $itk_component(runinfo) configure -state disabled
     765}
     766
     767# ----------------------------------------------------------------------
    680768# USAGE: _fixSimControl
    681769#
  • /trunk/gui/scripts/booleanentry.tcl

    r20 r30  
    1414    inherit itk::Widget
    1515
    16     constructor {xmlobj path args} { # defined below }
     16    constructor {owner path args} { # defined below }
    1717
    1818    public method value {args}
     
    2323    protected method _newValue {}
    2424
    25     private variable _xmlobj ""   ;# XML containing description
     25    private variable _owner ""    ;# thing managing this control
    2626    private variable _path ""     ;# path in XML to this number
    2727}
     
    3737# CONSTRUCTOR
    3838# ----------------------------------------------------------------------
    39 itcl::body Rappture::BooleanEntry::constructor {xmlobj path args} {
    40     if {![Rappture::library isvalid $xmlobj]} {
    41         error "bad value \"$xmlobj\": should be Rappture::library"
     39itcl::body Rappture::BooleanEntry::constructor {owner path args} {
     40    if {[catch {$owner isa Rappture::ControlOwner} valid] != 0 || !$valid} {
     41        error "bad object \"$owner\": should be Rappture::ControlOwner"
    4242    }
    43     set _xmlobj $xmlobj
     43    set _owner $owner
    4444    set _path $path
    4545
     
    5454    bind $itk_component(switch) <<Value>> [itcl::code $this _newValue]
    5555
    56     set color [$xmlobj get $path.about.color]
     56    set color [$_owner xml get $path.about.color]
    5757    if {$color != ""} {
    5858        $itk_component(switch) configure -oncolor $color
     
    6060
    6161    # if the control has an icon, plug it in
    62     set str [$xmlobj get $path.about.icon]
     62    set str [$_owner xml get $path.about.icon]
    6363    if {$str != ""} {
    6464        $itk_component(switch) configure -onimage \
     
    7171    # Assign the default value to this widget, if there is one.
    7272    #
    73     set str [$xmlobj get $path.default]
     73    set str [$_owner xml get $path.default]
    7474    if {"" != $str != ""} { $itk_component(switch) value $str }
    7575}
     
    118118# ----------------------------------------------------------------------
    119119itcl::body Rappture::BooleanEntry::label {} {
    120     set label [$_xmlobj get $_path.about.label]
     120    set label [$_owner xml get $_path.about.label]
    121121    if {"" == $label} {
    122122        set label "Boolean"
     
    134134# ----------------------------------------------------------------------
    135135itcl::body Rappture::BooleanEntry::tooltip {} {
    136     set str [$_xmlobj get $_path.about.description]
     136    set str [$_owner xml get $_path.about.description]
    137137
    138     set units [$_xmlobj get $_path.units]
    139     set min [$_xmlobj get $_path.min]
    140     set max [$_xmlobj get $_path.max]
     138    set units [$_owner xml get $_path.units]
     139    set min [$_owner xml get $_path.min]
     140    set max [$_owner xml get $_path.max]
    141141
    142142    if {$units != "" || $min != "" || $max != ""} {
  • /trunk/gui/scripts/choiceentry.tcl

    r20 r30  
    1414    inherit itk::Widget
    1515
    16     constructor {xmlobj path args} { # defined below }
     16    constructor {owner path args} { # defined below }
     17    destructor { # defined below }
    1718
    1819    public method value {args}
     
    2122    public method tooltip {}
    2223
     24    protected method _rebuild {}
    2325    protected method _newValue {}
    2426    protected method _tooltip {}
    2527
    26     private variable _xmlobj ""   ;# XML containing description
     28    private variable _owner ""    ;# thing managing this control
    2729    private variable _path ""     ;# path in XML to this number
    2830}
     
    3840# CONSTRUCTOR
    3941# ----------------------------------------------------------------------
    40 itcl::body Rappture::ChoiceEntry::constructor {xmlobj path args} {
    41     if {![Rappture::library isvalid $xmlobj]} {
    42         error "bad value \"$xmlobj\": should be Rappture::library"
    43     }
    44     set _xmlobj $xmlobj
     42itcl::body Rappture::ChoiceEntry::constructor {owner path args} {
     43    if {[catch {$owner isa Rappture::ControlOwner} valid] != 0 || !$valid} {
     44        error "bad object \"$owner\": should be Rappture::ControlOwner"
     45    }
     46    set _owner $owner
    4547    set _path $path
    4648
     
    5759    eval itk_initialize $args
    5860
    59     #
    60     # Plug in the various choices for this widget.
    61     #
    62     # plug in the various options for the choice
    63     set max 10
    64     foreach cname [$xmlobj children -type option $path] {
    65         set str [string trim [$xmlobj get $path.$cname.label]]
    66         if {"" != $str} {
    67             $itk_component(choice) choices insert end $path.$cname $str
    68             set len [string length $str]
    69             if {$len > $max} { set max $len }
    70         }
    71     }
    72     $itk_component(choice) configure -width $max
    73 
    74     #
    75     # Assign the default value to this widget, if there is one.
    76     #
    77     set str [$xmlobj get $path.default]
    78     if {"" != $str != ""} { $itk_component(choice) value $str }
     61    _rebuild
     62}
     63
     64# ----------------------------------------------------------------------
     65# DESTRUCTOR
     66# ----------------------------------------------------------------------
     67itcl::body Rappture::ChoiceEntry::destructor {} {
     68    $_owner notify remove $this
    7969}
    8070
     
    122112# ----------------------------------------------------------------------
    123113itcl::body Rappture::ChoiceEntry::label {} {
    124     set label [$_xmlobj get $_path.about.label]
     114    set label [$_owner xml get $_path.about.label]
    125115    if {"" == $label} {
    126116        set label "Number"
     
    143133
    144134# ----------------------------------------------------------------------
     135# USAGE: _rebuild
     136#
     137# Used internally to rebuild the contents of this choice widget
     138# whenever something that it depends on changes.  Scans through the
     139# information in the XML spec and builds a list of choices for the
     140# widget.
     141# ----------------------------------------------------------------------
     142itcl::body Rappture::ChoiceEntry::_rebuild {} {
     143    # get rid of any existing choices
     144    $itk_component(choice) choices delete 0 end
     145
     146    #
     147    # Plug in the various options for the choice.
     148    #
     149    set max 10
     150    foreach cname [$_owner xml children -type option $_path] {
     151        set path [string trim [$_owner xml get $_path.$cname.path]]
     152        if {"" != $path} {
     153            # look for the input element controlling this path
     154            set found 0
     155            foreach cntl [Rappture::entities [$_owner xml object] "input"] {
     156                set len [string length $cntl]
     157                if {[string equal -length $len $cntl $path]} {
     158                    set found 1
     159                    break
     160                }
     161            }
     162            if {$found} {
     163                #
     164                # Choice comes from a list of matching entities at
     165                # a particular XML path.  Use the <label> as a template
     166                # for each item on the path.
     167                #
     168                $_owner notify add $this $cntl [itcl::code $this _rebuild]
     169
     170                set label [string trim [$_owner xml get $_path.$cname.about.label]]
     171                if {"" == $label} {
     172                    set label "%type #%n"
     173                }
     174
     175                set ppath [Rappture::LibraryObj::path2list $path]
     176                set leading [join [lrange $ppath 0 end-1] .]
     177                set tail [lindex $ppath end]
     178                set n 1
     179                foreach ccname [$_owner xml children $leading] {
     180                    if {[string match $tail $ccname]} {
     181                        set subst(%n) $n
     182                        set subst(%type) [$_owner xml element -as type $leading.$ccname]
     183                        set subst(%id) [$_owner xml element -as id $leading.$ccname]
     184                        foreach detail [$_owner xml children $leading.$ccname] {
     185                            set subst(%$detail) [$_owner xml get $leading.$ccname.$detail]
     186                        }
     187                        set str [string map [array get subst] $label]
     188                        $itk_component(choice) choices insert end \
     189                            $leading.$ccname $str
     190                        incr n
     191                    }
     192                }
     193                $itk_component(choice) value ""
     194            } else {
     195                puts "can't find controlling entity for path \"$path\""
     196            }
     197        } else {
     198            #
     199            # Choice is an ordinary LABEL.
     200            # Add the label as-is into the list of choices.
     201            #
     202            set str [string trim [$_owner xml get $_path.$cname.about.label]]
     203            if {"" != $str} {
     204                $itk_component(choice) choices insert end $_path.$cname $str
     205                set len [string length $str]
     206                if {$len > $max} { set max $len }
     207            }
     208        }
     209    }
     210    $itk_component(choice) configure -width $max
     211
     212    #
     213    # Assign the default value to this widget, if there is one.
     214    #
     215    set str [$_owner xml get $_path.default]
     216    if {"" != $str} { $itk_component(choice) value $str }
     217}
     218
     219# ----------------------------------------------------------------------
    145220# USAGE: _newValue
    146221#
     
    160235# ----------------------------------------------------------------------
    161236itcl::body Rappture::ChoiceEntry::_tooltip {} {
    162     set tip [string trim [$_xmlobj get $_path.about.description]]
     237    set tip [string trim [$_owner xml get $_path.about.description]]
    163238
    164239    # get the description for the current choice, if there is one
     
    170245
    171246        if {$path != ""} {
    172             set desc [$_xmlobj get $path.description]
     247            set desc [$_owner xml get $path.description]
    173248            if {[string length $desc] > 0} {
    174249                append tip "\n$desc"
  • /trunk/gui/scripts/controls.tcl

    r20 r30  
    1111# ======================================================================
    1212package require Itk
     13package require BLT
    1314
    1415option add *Controls.padding 4 widgetDefault
     
    2324    constructor {owner args} { # defined below }
    2425
    25     public method insert {pos xmlobj path}
     26    public method insert {pos path}
    2627    public method delete {first {last ""}}
    2728    public method index {name}
     
    3132    protected method _controlChanged {path}
    3233    protected method _formatLabel {str}
     34    protected method _changeTabs {}
    3335
    3436    private variable _owner ""       ;# controls belong to this owner
     37    private variable _tabs ""        ;# optional tabset for groups
     38    private variable _frame ""       ;# pack controls into this frame
    3539    private variable _counter 0      ;# counter for control names
    3640    private variable _dispatcher ""  ;# dispatcher for !events
     
    5256    set _owner $owner
    5357
     58    Rappture::Scroller $itk_interior.sc -xscrollmode none -yscrollmode auto
     59    pack $itk_interior.sc -expand yes -fill both
     60    set f [$itk_interior.sc contents frame]
     61
     62    set _tabs [blt::tabset $f.tabs -borderwidth 0 -relief flat \
     63        -side top -tearoff 0 -highlightthickness 0 \
     64        -selectbackground $itk_option(-background) \
     65        -selectcommand [itcl::code $this _changeTabs]]
     66
     67    set _frame [frame $f.inner]
     68    pack $_frame -expand yes -fill both
     69
    5470    eval itk_initialize $args
    5571}
    5672
    5773# ----------------------------------------------------------------------
    58 # USAGE: insert <pos> <xmlobj> <path>
     74# USAGE: insert <pos> <path>
    5975#
    6076# Clients use this to insert a control into this panel.  The control
    6177# is inserted into the list at position <pos>, which can be an integer
    6278# starting from 0 or the keyword "end".  Information about the control
    63 # is taken from the <xmlobj> object at the specified <path>.
     79# is taken from the specified <path>.
    6480#
    6581# Returns a name that can be used to identify the control in other
    6682# methods.
    6783# ----------------------------------------------------------------------
    68 itcl::body Rappture::Controls::insert {pos xmlobj path} {
     84itcl::body Rappture::Controls::insert {pos path} {
    6985    if {"end" == $pos} {
    7086        set pos [llength $_controls]
     
    7692    set name "control$_counter"
    7793
    78     set _name2info($name-xmlobj) $xmlobj
    7994    set _name2info($name-path) $path
    8095    set _name2info($name-label) ""
    81     set _name2info($name-value) [set w $itk_interior.v$name]
    82 
    83     set type [$xmlobj element -as type $path]
     96    set _name2info($name-value) [set w $_frame.v$name]
     97
     98    set type [$_owner xml element -as type $path]
    8499    switch -- $type {
    85100        choice {
    86             Rappture::ChoiceEntry $w $xmlobj $path
     101            Rappture::ChoiceEntry $w $_owner $path
    87102            bind $w <<Value>> [itcl::code $this _controlChanged $path]
    88103        }
    89104        group {
    90             Rappture::GroupEntry $w $xmlobj $path
     105            Rappture::GroupEntry $w $_owner $path
    91106        }
    92107        loader {
    93             Rappture::Loader $w $xmlobj $path -tool [$_owner tool]
     108            Rappture::Loader $w $_owner $path -tool [$_owner tool]
    94109            bind $w <<Value>> [itcl::code $this _controlChanged $path]
    95110        }
    96111        number {
    97             Rappture::NumberEntry $w $xmlobj $path
     112            Rappture::NumberEntry $w $_owner $path
     113            bind $w <<Value>> [itcl::code $this _controlChanged $path]
     114        }
     115        integer {
     116            Rappture::IntegerEntry $w $_owner $path
    98117            bind $w <<Value>> [itcl::code $this _controlChanged $path]
    99118        }
    100119        boolean {
    101             Rappture::BooleanEntry $w $xmlobj $path
     120            Rappture::BooleanEntry $w $_owner $path
    102121            bind $w <<Value>> [itcl::code $this _controlChanged $path]
    103122        }
    104123        string {
    105             Rappture::TextEntry $w $xmlobj $path
    106             bind $w <<Value>> [itcl::code $this _controlChanged $path]
     124            Rappture::TextEntry $w $_owner $path
     125            bind $w <<Value>> [itcl::code $this _controlChanged $path]
     126        }
     127        control {
     128            set label [$_owner xml get $path.label]
     129            if {"" == $label} { set label "Simulate" }
     130            set service [$_owner xml get $path.service]
     131            button $w -text $label -command [list $service run]
    107132        }
    108133        default {
     
    110135        }
    111136    }
    112     $_owner widgetfor $path $w
    113 
    114     # make a label for this control
    115     set label [$w label]
    116     if {"" != $label} {
    117         set _name2info($name-label) $itk_interior.l$name
    118         set font [option get $itk_component(hull) labelFont Font]
    119         label $_name2info($name-label) -text [_formatLabel $label] \
    120             -font $font
    121     }
    122 
    123     # register the tooltip for this control
    124     set tip [$w tooltip]
    125     if {"" != $tip} {
    126         Rappture::Tooltip::for $w $tip
    127 
    128         # add the tooltip to the label too, if there is one
    129         if {$_name2info($name-label) != ""} {
    130             Rappture::Tooltip::for $_name2info($name-label) $tip
     137
     138    if {$type != "control"} {
     139        $_owner widgetfor $path $w
     140
     141        # make a label for this control
     142        set label [$w label]
     143        if {"" != $label} {
     144            set _name2info($name-label) $_frame.l$name
     145            set font [option get $itk_component(hull) labelFont Font]
     146            label $_name2info($name-label) -text [_formatLabel $label] \
     147                -font $font
     148        }
     149
     150        # register the tooltip for this control
     151        set tip [$w tooltip]
     152        if {"" != $tip} {
     153            Rappture::Tooltip::for $w $tip
     154
     155            # add the tooltip to the label too, if there is one
     156            if {$_name2info($name-label) != ""} {
     157                Rappture::Tooltip::for $_name2info($name-label) $tip
     158            }
    131159        }
    132160    }
     
    169197            destroy $_name2info($name-value)
    170198        }
    171         unset _name2info($name-xmlobj)
     199        $_owner widgetfor $_name2info($name-path) ""
     200
    172201        unset _name2info($name-path)
    173202        unset _name2info($name-label)
     
    197226
    198227# ----------------------------------------------------------------------
    199 # USAGE: control ?-label|-value|-xmlobj|-path? ?<name>|@n?
     228# USAGE: control ?-label|-value|-path? ?<name>|@n?
    200229#
    201230# Clients use this to get information about controls.  With no args, it
    202231# returns a list of all control names.  Otherwise, it returns the frame
    203232# associated with a control name.  The -label option requests the label
    204 # widget instead of the value widget.  The -xmlobj option requests the
    205 # XML object associated with the control, and the -path option requests
    206 # the path within the XML that the control affects.
     233# widget instead of the value widget.  The -path option requests the
     234# path within the XML that the control affects.
    207235# ----------------------------------------------------------------------
    208236itcl::body Rappture::Controls::control {args} {
     
    213241        flag switch -value default
    214242        flag switch -label
    215         flag switch -xmlobj
    216243        flag switch -path
    217244    }
     
    246273        }
    247274    }
     275    if {[$_tabs size] > 0} {
     276        $_tabs delete 0 end
     277    }
    248278
    249279    #
    250     # Lay out the widgets in a simple "Label: Value" scheme...
     280    # Decide on a layout scheme:
     281    #   tabs ...... best if all elements within are groups
     282    #   hlabels ... horizontal labels (label: value)
    251283    #
    252     set row 0
    253     foreach name $_controls {
    254         set wl $_name2info($name-label)
    255         if {$wl != "" && [winfo exists $wl]} {
    256             grid $wl -row $row -column 0 -sticky e
    257         }
    258 
    259         set wv $_name2info($name-value)
    260         if {$wv != "" && [winfo exists $wv]} {
    261             grid $wv -row $row -column 1 -sticky ew
    262 
    263             set frame [winfo parent $wv]
    264             grid rowconfigure $frame $row -weight 0
    265             grid rowconfigure $frame $row -weight 0
    266 
    267             switch -- [winfo class $wv] {
    268                 TextEntry {
    269                     if {[regexp {[0-9]+x[0-9]+} [$wv size]]} {
    270                         grid $wl -sticky n -pady 4
    271                         grid $wv -sticky nsew
    272                         grid rowconfigure $frame $row -weight 1
    273                         grid columnconfigure $frame 1 -weight 1
     284    if {[llength $_controls] >= 2} {
     285        # assume tabs for multiple groups
     286        set scheme tabs
     287        foreach name $_controls {
     288            set w $_name2info($name-value)
     289
     290            if {[winfo class $w] != "GroupEntry"} {
     291                # something other than a group? then fall back on hlabels
     292                set scheme hlabels
     293                break
     294            }
     295        }
     296    } else {
     297        set scheme hlabels
     298    }
     299
     300    switch -- $scheme {
     301      tabs {
     302        #
     303        # SCHEME: tabs
     304        # put a series of groups into a tabbed notebook
     305        #
     306
     307        # use inner frame within tabs to show current group
     308        pack $_tabs -before $_frame -fill x
     309
     310        set gn 1
     311        foreach name $_controls {
     312            set wv $_name2info($name-value)
     313            $wv configure -heading no
     314
     315            set label [$wv component heading cget -text]
     316            if {"" == $label} {
     317                set label "Group #$gn"
     318            }
     319            set _name2info($name-label) $label
     320
     321            $_tabs insert end $label \
     322                -activebackground $itk_option(-background)
     323
     324            incr gn
     325        }
     326
     327        # compute the overall size
     328        # BE CAREFUL: do this after setting "-heading no" above
     329        set maxw 0
     330        set maxh 0
     331        update idletasks
     332        foreach name $_controls {
     333            set w [winfo reqwidth $wv]
     334            if {$w > $maxw} { set maxw $w }
     335            set h [winfo reqheight $wv]
     336            if {$h > $maxh} { set maxh $h }
     337        }
     338        $_frame configure -width $maxw -height $maxh
     339
     340        grid propagate $_frame off
     341        grid columnconfigure $_frame 0 -weight 1
     342        grid rowconfigure $_frame 0 -weight 1
     343
     344        $_tabs select 0; _changeTabs
     345      }
     346
     347      hlabels {
     348        #
     349        # SCHEME: hlabels
     350        # simple "Label: Value" layout
     351        #
     352        pack forget $_tabs
     353        grid propagate $_frame on
     354        grid columnconfigure $_frame 0 -weight 0
     355        grid rowconfigure $_frame 0 -weight 0
     356
     357        set row 0
     358        foreach name $_controls {
     359            set wl $_name2info($name-label)
     360            if {$wl != "" && [winfo exists $wl]} {
     361                grid $wl -row $row -column 0 -sticky e
     362            }
     363
     364            set wv $_name2info($name-value)
     365            if {$wv != "" && [winfo exists $wv]} {
     366                if {$wl != ""} {
     367                    grid $wv -row $row -column 1 -sticky ew
     368                } else {
     369                    grid $wv -row $row -column 0 -columnspan 2 -sticky ew
     370                }
     371
     372                set frame [winfo parent $wv]
     373                grid rowconfigure $frame $row -weight 0
     374                grid rowconfigure $frame $row -weight 0
     375
     376                switch -- [winfo class $wv] {
     377                    TextEntry {
     378                        if {[regexp {[0-9]+x[0-9]+} [$wv size]]} {
     379                            grid $wl -sticky n -pady 4
     380                            grid $wv -sticky nsew
     381                            grid rowconfigure $frame $row -weight 1
     382                            grid columnconfigure $frame 1 -weight 1
     383                        }
     384                    }
     385                    GroupEntry {
     386                        $wv configure -heading yes
    274387                    }
    275388                }
    276             }
    277             grid columnconfigure $frame 1 -weight 1
    278         }
    279 
    280 
    281         incr row
    282         grid rowconfigure [winfo parent $w] $row -minsize $itk_option(-padding)
    283         incr row
     389                grid columnconfigure $frame 1 -weight 1
     390            }
     391
     392
     393            incr row
     394            grid rowconfigure [winfo parent $w] $row \
     395                -minsize $itk_option(-padding)
     396            incr row
     397        }
     398      }
    284399    }
    285400}
     
    314429
    315430# ----------------------------------------------------------------------
     431# USAGE: _changeTabs
     432#
     433# Used internally to change tabs when the user clicks on a tab
     434# in the "tabs" layout mode.  This mode is used when the widget
     435# contains nothing but groups, as a compact way of representing
     436# the groups.
     437# ----------------------------------------------------------------------
     438itcl::body Rappture::Controls::_changeTabs {} {
     439    set i [$_tabs index select]
     440    set name [lindex $_controls $i]
     441    if {"" != $name} {
     442        foreach w [grid slaves $_frame] {
     443            grid forget $w
     444        }
     445
     446        set wv $_name2info($name-value)
     447        grid $wv -row 0 -column 0 -sticky new
     448    }
     449}
     450
     451# ----------------------------------------------------------------------
    316452# OPTION: -padding
    317453# ----------------------------------------------------------------------
  • /trunk/gui/scripts/curve.tcl

    r20 r30  
    155155        xunits  xaxis.units
    156156        xscale  xaxis.scale
     157        xmin    xaxis.min
     158        xmax    xaxis.max
    157159        ylabel  yaxis.label
    158160        yunits  yaxis.units
    159161        yscale  yaxis.scale
     162        ymin    yaxis.min
     163        ymax    yaxis.max
    160164    } {
    161165        set str [$_curve get $path]
  • /trunk/gui/scripts/deviceEditor.tcl

    r20 r30  
    1313package require Itk
    1414
    15 option add *DeviceEditor.width 5i widgetDefault
    16 option add *DeviceEditor.height 5i widgetDefault
     15option add *DeviceEditor.autoCleanUp yes widgetDefault
    1716
    1817itcl::class Rappture::DeviceEditor {
    19     inherit itk::Widget
     18    inherit itk::Widget Rappture::ControlOwner
    2019
    21     constructor {owner args} { # defined below }
     20    itk_option define -autocleanup autoCleanUp AutoCleanUp 1
     21
     22    constructor {owner args} {
     23        Rappture::ControlOwner::constructor $owner
     24    } { # defined below }
    2225
    2326    public method value {args}
    24 
    25     # used for syncing embedded widgets
    26     public method widgetfor {path {widget ""}}
    27     public method changed {path}
    28     public method sync {}
    29     public method tool {}
    3027
    3128    protected method _redraw {}
    3229    protected method _type {xmlobj}
    3330
    34     private variable _owner ""       ;# owner containing this editor
    35     private variable _xmlobj ""      ;# XML <structure> object
    36     private variable _path2widget    ;# maps path => widget in this editor
     31    private variable _current ""  ;# active device editor
    3732}
    3833                                                                               
     
    4439# ----------------------------------------------------------------------
    4540itcl::body Rappture::DeviceEditor::constructor {owner args} {
    46     set _owner $owner
    47 
    48     itk_option add hull.width hull.height
    49     pack propagate $itk_component(hull) no
    50 
    5141    itk_component add top {
    5242        frame $itk_interior.top
     
    8171
    8272    if {[llength $args] == 1} {
    83         # delete any existing object
    8473        if {$_xmlobj != ""} {
    85             itcl::delete object $_xmlobj
     74            if {$itk_option(-autocleanup)} {
     75                # delete any existing object
     76                itcl::delete object $_xmlobj
     77            }
    8678            set _xmlobj ""
    8779        }
     80
    8881        set newval [lindex $args 0]
    8982        if {$newval != ""} {
     
    108101
    109102# ----------------------------------------------------------------------
    110 # USAGE: widgetfor <path> ?<widget>?
    111 #
    112 # Used by embedded widgets such as a Controls panel to register the
    113 # various controls associated with this page.  That way, this editor
    114 # knows what widgets to look at when syncing itself to the underlying
    115 # XML data.
    116 # ----------------------------------------------------------------------
    117 itcl::body Rappture::DeviceEditor::widgetfor {path {widget ""}} {
    118     # if this is a query operation, then look for the path
    119     if {"" == $widget} {
    120         if {[info exists _path2widget($path)]} {
    121             return $_path2widget($path)
    122         }
    123         return ""
    124     }
    125 
    126     # otherwise, associate the path with the given widget
    127     if {[info exists _path2widget($path)]} {
    128         error "$path already associated with widget $_path2widget($path)"
    129     }
    130     set _path2widget($path) $widget
    131 }
    132 
    133 # ----------------------------------------------------------------------
    134 # USAGE: changed <path>
    135 #
    136 # Invoked automatically by the various widgets associated with this
    137 # editor whenever their value changes.  If this tool has a -analyzer,
    138 # then it is notified that input has changed, so it can reset itself
    139 # for a new analysis.
    140 # ----------------------------------------------------------------------
    141 itcl::body Rappture::DeviceEditor::changed {path} {
    142     if {"" != $_owner} {
    143         $_owner changed $path
    144     }
    145 }
    146 
    147 # ----------------------------------------------------------------------
    148 # USAGE: sync
    149 #
    150 # Used by descendents such as a Controls panel to register the
    151 # various controls associated with this page.  That way, this Tool
    152 # knows what widgets to look at when syncing itself to the underlying
    153 # XML data.
    154 # ----------------------------------------------------------------------
    155 itcl::body Rappture::DeviceEditor::sync {} {
    156     foreach path [array names _path2widget] {
    157         $_xmlobj put $path.current [$_path2widget($path) value]
    158     }
    159 }
    160 
    161 # ----------------------------------------------------------------------
    162 # USAGE: tool
    163 #
    164 # Clients use this to figure out which tool is associated with
    165 # this object.  Returns the tool containing this editor.
    166 # ----------------------------------------------------------------------
    167 itcl::body Rappture::Tool::tool {} {
    168     return [$_owner tool]
    169 }
    170 
    171 # ----------------------------------------------------------------------
    172103# USAGE: _redraw
    173104#
     
    178109# ----------------------------------------------------------------------
    179110itcl::body Rappture::DeviceEditor::_redraw {} {
     111    if {$_current != ""} {
     112        $_current configure -device ""
     113        set _current ""
     114    }
    180115    switch -- [_type $_xmlobj] {
    181116        molecule {
     
    187122            $p.mol configure -device $_xmlobj
    188123            $itk_component(editors) current molecule
     124
     125            set _current $p.mol
    189126        }
    190127        device1D {
     
    196133            $p.dev configure -device $_xmlobj
    197134            $itk_component(editors) current device1D
     135
     136            set _current $p.dev
    198137        }
    199138    }
  • /trunk/gui/scripts/deviceLayout1D.tcl

    r20 r30  
    9090        ignore -highlightthickness -highlightbackground -highlightcolor
    9191    }
    92     pack $itk_component(area) -fill both
     92    pack $itk_component(area) -expand yes -fill both
    9393    bind $itk_component(area) <Configure> \
    9494        [list $_dispatcher event -idle !redraw]
    9595
    9696    eval itk_initialize $args
     97
     98    set _sizes(header) 1
     99    set _sizes(bararea) 1
    97100}
    98101
     
    163166# ----------------------------------------------------------------------
    164167itcl::body Rappture::DeviceLayout1D::_layout {} {
    165     # first, recompute the overall height of this widget
    166     set h [expr {$_sizes(bar)+$_sizes(bar45)+2}]
     168    #
     169    # First, recompute the overall height of this widget...
     170    #
     171    # size of an ordinary material bar:
     172    set hmax [expr {$_sizes(bar)+$_sizes(bar45)+2}]
     173
     174    # add the maximum size of any embedded icons:
     175    if {$_device != ""} {
     176        foreach nn [$_device children components] {
     177            set icon [$_device get components.$nn.about.icon]
     178            if {"" != $icon} {
     179                if {[info exists _icons($icon)]} {
     180                    set imh $_icons($icon)
     181                } else {
     182                    set imh [image create photo -data $icon]
     183                    set _icons($icon) $imh
     184                }
     185
     186                set h [image height $_icons($icon)]
     187                if {$h > $hmax} {
     188                    set hmax $h
     189                }
     190            }
     191        }
     192    }
     193    set _sizes(bararea) $hmax
    167194
    168195    set fnt $itk_option(-font)
     
    171198        if {"" != $m} {
    172199            set extra [expr {1.5*[font metrics $fnt -linespace]}]
    173             set h [expr {$h+$extra}]
     200            set hmax [expr {$hmax+$extra}]
    174201            break
    175202        }
     
    181208            if {"" != [$_device get components.$nn.about.label]} {
    182209                set extra [expr {1.2*[font metrics $fnt -linespace]}]
    183                 set h [expr {$h+$extra}]
     210                set hmax [expr {$hmax+$extra}]
    184211                break
    185212            }
     
    188215
    189216    set oldh [component hull cget -height]
    190     if {$h != $oldh} {
    191         component hull configure -height $h
     217    if {$hmax != $oldh} {
     218        component hull configure -height $hmax
    192219        $_dispatcher event -idle !redraw
    193220    }
     221    set _sizes(header) [expr {$hmax - $_sizes(bararea)}]
    194222
    195223    # next, scan through the device and compute layer positions
     
    203231        # get the default system of units
    204232        set units [set defunits [$_device get units]]
    205         if {$units == "arbitrary"} {
     233        if {$units == "arbitrary" || $units == ""} {
    206234            set defunits "m"
    207235            set units "um"
     
    212240                box* {
    213241                    # get x-coord for each corner
    214                     set c0 [lindex [$_device get components.$nn.corner0] 0]
     242                    set c0 [$_device get components.$nn.corner0]
     243                    regsub -all , $c0 { } c0
     244                    set c0 [lindex $c0 0]
    215245                    set c0 [Rappture::Units::convert $c0 \
    216246                        -context $defunits -to $units -units off]
    217247
    218                     set c1 [lindex [$_device get components.$nn.corner1] 0]
     248                    set c1 [$_device get components.$nn.corner1]
     249                    regsub -all , $c1 { } c1
     250                    set c1 [lindex $c1 0]
    219251                    set c1 [Rappture::Units::convert $c1 \
    220252                        -context $defunits -to $units -units off]
     
    310342itcl::body Rappture::DeviceLayout1D::_drawLayer {index x0 x1} {
    311343    set c $itk_component(area)
    312     set h [expr {[winfo height $c]-1}]
    313 
    314     set y0 $h
     344    set h [expr {$_sizes(header) + $_sizes(bararea) - 1}]
     345
     346    set bsize [expr {$_sizes(bar)+$_sizes(bar45)+2}]
     347    set y0 [expr {$h - 0.5*$_sizes(bararea) + 0.5*$bsize}]
    315348    set y0p [expr {$y0-$_sizes(bar45)}]
    316349    set y1p [expr {$y0-$_sizes(bar)}]
     
    357390itcl::body Rappture::DeviceLayout1D::_drawIcon {index x0 x1 imh} {
    358391    set c $itk_component(area)
    359     set h [expr {[winfo height $c]-1}]
    360 
    361     set y0 $h
     392    set h [expr {$_sizes(header) + $_sizes(bararea) - 1}]
     393
     394    set bsize [expr {$_sizes(bar)+$_sizes(bar45)+2}]
     395    set y0 [expr {$h - 0.5*$_sizes(bararea) + 0.5*$bsize}]
    362396    set y0p [expr {$y0-$_sizes(bar45)}]
    363397    set y1p [expr {$y0-$_sizes(bar)}]
     
    370404    set y [expr {0.5*($y0+$y0p) + 0.5*($y1-$y0p)}]
    371405
    372     ##set lcolor $itk_option(-deviceoutline)
    373     ##$c create line $xx0 $y $xx1 $y -width 3
    374 
    375406    $c create image [expr {0.5*($xx0+$xx1)}] $y -anchor c -image $imh
    376407}
     
    385416itcl::body Rappture::DeviceLayout1D::_drawAnnotation {index x0 x1} {
    386417    set c $itk_component(area)
    387     set h [expr {[winfo height $c]-1}]
    388 
    389     set y0 $h
    390     set y1 [expr {$y0-$_sizes(bar)-$_sizes(bar45)}]
    391 
     418
     419    set ytop [expr {$_sizes(header)+1}]
    392420    set x0p [expr {$x0+$_sizes(bar45)}]
    393421    set x1p [expr {$x1+$_sizes(bar45)}]
     
    396424    set fnt $itk_option(-font)
    397425    set lh [font metrics $fnt -linespace]
    398     set ymid [expr {$y1-2-0.5*$lh}]
    399     set y [expr {$y1-4}]
     426    set ymid [expr {$ytop-2-0.5*$lh}]
     427    set y [expr {$ytop-4}]
    400428
    401429    #
  • /trunk/gui/scripts/deviceViewer1D.tcl

    r20 r30  
    1616package require BLT
    1717
    18 option add *DeviceViewer1D.width 4i widgetDefault
    19 option add *DeviceViewer1D.height 4i widgetDefault
    2018option add *DeviceViewer1D.padding 4 widgetDefault
    2119option add *DeviceViewer1D.deviceSize 0.25i widgetDefault
     
    2725    itk_option define -device device Device ""
    2826
    29     constructor {tool args} { # defined below }
     27    constructor {owner args} { # defined below }
    3028    destructor { # defined below }
    3129
     
    3432    protected method _loadDevice {}
    3533    protected method _changeTabs {}
     34    protected method _fixSize {}
    3635    protected method _fixAxes {}
    3736    protected method _align {}
     
    4241    protected method _controlSet {widget libObj path}
    4342
    44     private variable _tool ""       ;# tool controlling this viewer
     43    private variable _owner ""      ;# thing managing this control
    4544    private variable _device ""     ;# XML library with <structure>
    4645    private variable _tab2fields    ;# maps tab name => list of fields
     
    5756# CONSTRUCTOR
    5857# ----------------------------------------------------------------------
    59 itcl::body Rappture::DeviceViewer1D::constructor {tool args} {
    60     set _tool $tool
    61 
    62     itk_option add hull.width hull.height
     58itcl::body Rappture::DeviceViewer1D::constructor {owner args} {
     59    set _owner $owner
     60
    6361    pack propagate $itk_component(hull) no
    6462
     
    9593        blt::graph $itk_component(inner).graph \
    9694            -highlightthickness 0 -plotpadx 0 -plotpady 0 \
    97             -width 3i -height 3i
     95            -width 4i -height 2i
    9896    } {
    9997        keep -background -foreground -cursor -font
     
    120118
    121119    eval itk_initialize $args
     120
     121    _fixSize
    122122}
    123123
     
    178178    catch {unset _field2parm}
    179179
     180    if {[winfo exists $itk_component(top).cntls]} {
     181        $itk_component(top).cntls delete 0 end
     182    }
     183
    180184    #
    181185    # Scan through the current device and extract the list of
     
    201205    if {[llength $tabs] <= 0} {
    202206        #
    203         # == DEPRECATED FUNCTIONALITY ==
    204         # (I like the look of the tab, even if there's only one)
    205         #
    206         # No fields or one field?  Then we don't need to bother
    207         # with tabs.  Just pack the inner frame directly.  If
    208         # there are no fields, get rid of the graph.
     207        # No fields?  Then we don't need to bother with tabs.
     208        # Just pack the inner frame directly.  If there are no
     209        # fields, get rid of the graph.
    209210        #
    210211        pack $itk_component(inner) -expand yes -fill both
     
    271272                set t $itk_component(top)
    272273                if {![winfo exists $t.cntls]} {
    273                     Rappture::Controls $t.cntls $_tool
     274                    Rappture::Controls $t.cntls $_owner
    274275                    pack $t.cntls -expand yes -fill both
    275276                }
    276                 $t.cntls insert end $_device parameters.$cname
     277                $t.cntls insert end parameters.$cname
    277278            }
    278279        }
     
    290291    $itk_component(graph) configure \
    291292        -rightmargin [$itk_component(layout) extents bar3D]
     293
     294    _fixSize
    292295}
    293296
     
    404407    after cancel [itcl::code $this _fixAxes]
    405408    after 100 [itcl::code $this _fixAxes]
     409}
     410
     411# ----------------------------------------------------------------------
     412# USAGE: _fixSize
     413#
     414# Used internally to fix the overall size of this widget based on
     415# the various parts inside.  Sets the requested width/height of the
     416# widget so that it is big enough to display the device and its
     417# fields.
     418# ----------------------------------------------------------------------
     419itcl::body Rappture::DeviceViewer1D::_fixSize {} {
     420    update idletasks
     421    set w [winfo reqwidth $itk_component(tabs)]
     422    set h [winfo reqheight $itk_component(tabs)]
     423    component hull configure -width $w -height $h
    406424}
    407425
     
    591609
    592610            $_marker(fobj) controls put $_marker(path) $value
    593             $_tool changed $_marker(path)
     611            $_owner changed $_marker(path)
    594612            event generate $itk_component(hull) <<Edit>>
    595613
  • /trunk/gui/scripts/gauge.tcl

    r20 r30  
    1515package require BLT
    1616
    17 option add *Gauge.width 30 widgetDefault
    18 option add *Gauge.height 20 widgetDefault
     17option add *Gauge.sampleWidth 30 widgetDefault
     18option add *Gauge.sampleHeight 20 widgetDefault
    1919option add *Gauge.valuePosition "right" widgetDefault
    2020option add *Gauge.textBackground #cccccc widgetDefault
     
    2626    itk_option define -editable editable Editable ""
    2727    itk_option define -spectrum spectrum Spectrum ""
     28    itk_option define -type type Type "real"
    2829    itk_option define -units units Units ""
    2930    itk_option define -minvalue minValue MinValue ""
     
    3233    itk_option define -valueposition valuePosition ValuePosition ""
    3334    itk_option define -image image Image ""
    34     itk_option define -width width Width 0
    35     itk_option define -height height Height 0
     35    itk_option define -samplewidth sampleWidth SampleWidth 0
     36    itk_option define -sampleheight sampleHeight SampleHeight 0
    3637
    3738    constructor {args} { # defined below }
     
    3940    public method value {args}
    4041    public method edit {option}
     42    public method bump {delta}
    4143
    4244    protected method _redraw {}
     
    4547    protected method _editor {option args}
    4648    protected method _presets {option}
     49    protected method _layout {}
    4750
    4851    private variable _value 0  ;# value for this widget
     52
     53    blt::bitmap define GaugeArrow-up {
     54        #define up_width 8
     55        #define up_height 4
     56        static unsigned char up_bits[] = {
     57           0x10, 0x38, 0x7c, 0xfe};
     58    }
     59    blt::bitmap define GaugeArrow-down {
     60        #define arrow_width 8
     61        #define arrow_height 4
     62        static unsigned char arrow_bits[] = {
     63           0xfe, 0x7c, 0x38, 0x10};
     64    }
    4965
    5066    blt::bitmap define GaugeArrow {
     
    6682itcl::body Rappture::Gauge::constructor {args} {
    6783    itk_component add icon {
    68         canvas $itk_interior.icon -borderwidth 0 -highlightthickness 0
     84        canvas $itk_interior.icon -width 1 -height 1 \
     85            -borderwidth 0 -highlightthickness 0
    6986    } {
    7087        usual
     
    117134    bind $itk_component(value) <ButtonPress> \
    118135        [itcl::code $this _editor popup]
     136
     137
     138    itk_component add spinner {
     139        frame $itk_component(vframe).spinner
     140    }
     141
     142    itk_component add spinup {
     143        button $itk_component(spinner).up -bitmap GaugeArrow-up \
     144            -borderwidth 1 -relief raised -highlightthickness 0 \
     145            -command [itcl::code $this bump 1]
     146    } {
     147        usual
     148        ignore -borderwidth -highlightthickness
     149    }
     150    pack $itk_component(spinup) -side top -expand yes -fill both
     151
     152    itk_component add spindn {
     153        button $itk_component(spinner).down -bitmap GaugeArrow-down \
     154            -borderwidth 1 -relief raised -highlightthickness 0 \
     155            -command [itcl::code $this bump -1]
     156    } {
     157        usual
     158        ignore -borderwidth -highlightthickness
     159    }
     160    pack $itk_component(spindn) -side bottom -expand yes -fill both
     161
    119162
    120163    itk_component add presets {
     
    199242        }
    200243
    201         if {![string is double -strict $nv]} {
    202             error "Should be a real number"
     244        switch -- $itk_option(-type) {
     245            integer {
     246                if {![string is integer -strict $nv]} {
     247                    error "Should be an integer value"
     248                }
     249            }
     250            real {
     251                if {![string is double -strict $nv]} {
     252                    error "Should be a real number"
     253                }
     254            }
    203255        }
    204256
     
    249301
    250302# ----------------------------------------------------------------------
     303# USAGE: bump <delta>
     304#
     305# Changes the current value up/down by the <delta> value.  Used
     306# internally by the up/down spinner buttons when the value is
     307# -type integer.
     308# ----------------------------------------------------------------------
     309itcl::body Rappture::Gauge::bump {delta} {
     310    set val $_value
     311    if {$val == ""} {
     312        set val 0
     313    }
     314    value [expr {$val+$delta}]
     315}
     316
     317# ----------------------------------------------------------------------
    251318# USAGE: _redraw
    252319#
     
    287354# ----------------------------------------------------------------------
    288355itcl::body Rappture::Gauge::_resize {} {
    289     if {$itk_option(-width) > 0} {
    290         set w $itk_option(-width)
    291     } else {
    292         if {$itk_option(-image) != ""} {
    293             set w [expr {[image width $itk_option(-image)]+4}]
     356    set w 0
     357    set h 0
     358
     359    if {"" != $itk_option(-image) || "" != $itk_option(-spectrum)} {
     360        if {$itk_option(-samplewidth) > 0} {
     361            set w $itk_option(-samplewidth)
    294362        } else {
    295             set w [winfo reqheight $itk_component(value)]
    296         }
    297     }
    298 
    299     if {$itk_option(-height) > 0} {
    300         set h $itk_option(-height)
    301     } else {
    302         if {$itk_option(-image) != ""} {
    303             set h [expr {[image height $itk_option(-image)]+4}]
     363            if {$itk_option(-image) != ""} {
     364                set w [expr {[image width $itk_option(-image)]+4}]
     365            } else {
     366                set w [winfo reqheight $itk_component(value)]
     367            }
     368        }
     369
     370        if {$itk_option(-sampleheight) > 0} {
     371            set h $itk_option(-sampleheight)
    304372        } else {
    305             set h [winfo reqheight $itk_component(value)]
    306         }
    307     }
    308 
    309     $itk_component(icon) configure -width $w -height $h
     373            if {$itk_option(-image) != ""} {
     374                set h [expr {[image height $itk_option(-image)]+4}]
     375            } else {
     376                set h [winfo reqheight $itk_component(value)]
     377            }
     378        }
     379    }
     380
     381    if {$w > 0 && $h > 0} {
     382        $itk_component(icon) configure -width $w -height $h
     383    }
    310384}
    311385
     
    420494
    421495# ----------------------------------------------------------------------
     496# USAGE: _layout
     497#
     498# Used internally to fix the layout of widgets whenever there is a
     499# change in the options that affect layout.  Puts the value in the
     500# proper position according to the -valueposition option.  Also,
     501# adds or removes the icon if it needs to be shown.
     502# ----------------------------------------------------------------------
     503itcl::body Rappture::Gauge::_layout {} {
     504    foreach w [pack slaves $itk_component(hull)] {
     505        pack forget $w
     506    }
     507
     508    array set side2anchor {
     509        left   e
     510        right  w
     511        top    s
     512        bottom n
     513    }
     514    set pos $itk_option(-valueposition)
     515    pack $itk_component(vframe) -side $pos \
     516        -expand yes -fill both -ipadx 2
     517    $itk_component(value) configure -anchor $side2anchor($pos)
     518
     519    if {"" != $itk_option(-image) || "" != $itk_option(-spectrum)} {
     520        pack $itk_component(icon) -side $pos
     521    }
     522}
     523
     524# ----------------------------------------------------------------------
    422525# CONFIGURATION OPTION: -editable
    423526# ----------------------------------------------------------------------
     
    440543        error "bad option \"$itk_option(-spectrum)\": should be Rappture::Spectrum object"
    441544    }
     545    _resize
     546    _layout
    442547    _redraw
    443548}
     
    452557    }
    453558    _resize
     559    _layout
    454560    $itk_component(icon) itemconfigure bimage -image $itk_option(-image)
    455561}
     
    469575# ----------------------------------------------------------------------
    470576itcl::configbody Rappture::Gauge::valueposition {
    471     array set side2anchor {
    472         left   e
    473         right  w
    474         top    s
    475         bottom n
    476     }
    477577    set pos $itk_option(-valueposition)
    478     if {![info exists side2anchor($pos)]} {
    479         error "bad value \"$pos\": should be [join [lsort [array names side2anchor]] {, }]"
    480     }
    481     pack $itk_component(vframe) -before $itk_component(icon) \
    482         -side $pos -expand yes -fill both -ipadx 2
    483     $itk_component(value) configure -anchor $side2anchor($pos)
     578    set opts {left right top bottom}
     579    if {[lsearch -exact $opts $pos] < 0} {
     580        error "bad value \"$pos\": should be [join $opts {, }]"
     581    }
     582    _layout
    484583}
    485584
     
    496595            set s "right"
    497596        }
    498         pack $itk_component(presets) -before $itk_component(value) \
    499             -side $s -fill y
     597        set first [lindex [pack slaves $itk_component(vframe)] 0]
     598        pack $itk_component(presets) -before $first -side $s -fill y
    500599
    501600        $itk_component(presetlist) delete 0 end
     
    503602    }
    504603}
     604
     605# ----------------------------------------------------------------------
     606# CONFIGURATION OPTION: -type
     607# ----------------------------------------------------------------------
     608itcl::configbody Rappture::Gauge::type {
     609    switch -- $itk_option(-type) {
     610        integer {
     611            set first [lindex [pack slaves $itk_component(vframe)] 0]
     612            if {$first == $itk_component(presets)} {
     613                pack $itk_component(spinner) -after $first -side left -fill y
     614            } else {
     615                pack $itk_component(spinner) -before $first -side right -fill y
     616            }
     617        }
     618        real {
     619            pack forget $itk_component(spinner)
     620        }
     621        default {
     622            error "bad number type \"$itk_option(-type)\": should be integer or real"
     623        }
     624    }
     625}
  • /trunk/gui/scripts/groupentry.tcl

    r20 r30  
    1212package require Itk
    1313
     14option add *GroupEntry.headingBackground #cccccc widgetDefault
     15option add *GroupEntry.headingForeground white widgetDefault
     16option add *GroupEntry.font -*-helvetica-medium-r-normal-*-*-120-* widgetDefault
     17
    1418itcl::class Rappture::GroupEntry {
    1519    inherit itk::Widget
    1620
    17     constructor {xmlobj path args} { # defined below }
     21    itk_option define -heading heading Heading 1
     22
     23    constructor {owner path args} { # defined below }
    1824
    1925    public method value {args}
     
    2228    public method tooltip {}
    2329
    24     private variable _xmlobj ""   ;# XML containing description
     30    protected method _fixheading {}
     31
     32    private variable _owner ""    ;# thing managing this control
    2533    private variable _path ""     ;# path in XML to this number
    2634}
     
    3644# CONSTRUCTOR
    3745# ----------------------------------------------------------------------
    38 itcl::body Rappture::GroupEntry::constructor {xmlobj path args} {
    39     if {![Rappture::library isvalid $xmlobj]} {
    40         error "bad value \"$xmlobj\": should be Rappture::library"
     46itcl::body Rappture::GroupEntry::constructor {owner path args} {
     47    if {[catch {$owner isa Rappture::ControlOwner} valid] != 0 || !$valid} {
     48        error "bad object \"$owner\": should be Rappture::ControlOwner"
    4149    }
    42     set _xmlobj $xmlobj
     50    set _owner $owner
    4351    set _path $path
     52
     53    itk_component add heading {
     54        ::label $itk_interior.heading -anchor w
     55    } {
     56        usual
     57        rename -background -headingbackground headingBackground Background
     58        rename -foreground -headingforeground headingForeground Foreground
     59    }
     60
     61    $itk_component(heading) configure \
     62        -text [$_owner xml get $_path.about.label]
     63    Rappture::Tooltip::for $itk_component(heading) \
     64        [$_owner xml get $_path.about.description]
     65
     66    itk_component add outline {
     67        frame $itk_interior.outline -borderwidth 1
     68    } {
     69        usual
     70        ignore -borderwidth
     71        rename -background -headingbackground headingBackground Background
     72    }
     73    pack $itk_component(outline) -expand yes -fill both
     74
     75    itk_component add inner {
     76        frame $itk_component(outline).inner -borderwidth 3
     77    } {
     78        usual
     79        ignore -borderwidth
     80    }
     81    pack $itk_component(inner) -expand yes -fill both
    4482
    4583    eval itk_initialize $args
     
    67105# ----------------------------------------------------------------------
    68106itcl::body Rappture::GroupEntry::label {} {
    69     return [$_xmlobj get $_path.about.label]
     107    return ""  ;# manage the label inside this group
    70108}
    71109
     
    79117# ----------------------------------------------------------------------
    80118itcl::body Rappture::GroupEntry::tooltip {} {
    81     return [$_xmlobj get $_path.about.description]
     119    return [$_owner xml get $_path.about.description]
    82120}
     121
     122# ----------------------------------------------------------------------
     123# CONFIGURATION OPTION: -heading
     124# Turns the heading bar at the top of this group on/off.
     125# ----------------------------------------------------------------------
     126itcl::configbody Rappture::GroupEntry::heading {
     127    if {![string is boolean -strict $itk_option(-heading)]} {
     128        error "bad value \"$itk_option(-heading)\": should be boolean"
     129    }
     130
     131    set str [$itk_component(heading) cget -text]
     132    if {$itk_option(-heading) && "" != $str} {
     133        eval pack forget [pack slaves $itk_component(hull)]
     134        pack $itk_component(heading) -side top -fill x
     135        pack $itk_component(outline) -expand yes -fill both
     136        $itk_component(outline) configure -borderwidth 1
     137        $itk_component(inner) configure -borderwidth 3
     138    } else {
     139        pack forget $itk_component(heading)
     140        $itk_component(outline) configure -borderwidth 0
     141        $itk_component(inner) configure -borderwidth 0
     142    }
     143}
  • /trunk/gui/scripts/loader.tcl

    r20 r30  
    1919    itk_option define -tool tool Tool ""
    2020
    21     constructor {xmlobj path args} { # defined below }
     21    constructor {owner path args} { # defined below }
    2222
    2323    public method value {args}
     
    2929    protected method _tooltip {}
    3030
    31     private variable _xmlobj ""   ;# XML containing description
     31    private variable _owner ""    ;# thing managing this control
    3232    private variable _path ""     ;# path in XML to this loader
    3333}
     
    4343# CONSTRUCTOR
    4444# ----------------------------------------------------------------------
    45 itcl::body Rappture::Loader::constructor {xmlobj path args} {
    46     if {![Rappture::library isvalid $xmlobj]} {
    47         error "bad value \"$xmlobj\": should be Rappture::library"
    48     }
    49     set _xmlobj $xmlobj
     45itcl::body Rappture::Loader::constructor {owner path args} {
     46    if {[catch {$owner isa Rappture::ControlOwner} valid] != 0 || !$valid} {
     47        error "bad object \"$owner\": should be Rappture::ControlOwner"
     48    }
     49    set _owner $owner
    5050    set _path $path
    5151
     
    6565    # the combobox.
    6666    #
    67     set defval [$xmlobj get $path.default]
     67    set defval [$_owner xml get $path.default]
    6868
    6969    set flist ""
    70     foreach comp [$xmlobj children -type example $path] {
    71         lappend flist [$xmlobj get $path.$comp]
     70    foreach comp [$_owner xml children -type example $path] {
     71        lappend flist [$_owner xml get $path.$comp]
    7272    }
    7373
     
    103103
    104104                        if {[string equal $defval [file tail $fname]]} {
    105                             $xmlobj put $path.default $label
     105                            $_owner xml put $path.default $label
    106106                        }
    107107                    }
     
    116116    # Assign the default value to this widget, if there is one.
    117117    #
    118     set str [$xmlobj get $path.default]
    119     if {$str != ""} { after 500 [itcl::code $this value $str] }
     118    set str [$_owner xml get $path.default]
     119    if {$str != ""} { after 1000 [itcl::code $this value $str] }
    120120}
    121121
     
    163163# ----------------------------------------------------------------------
    164164itcl::body Rappture::Loader::label {} {
    165     set label [$_xmlobj get $_path.about.label]
     165    set label [$_owner xml get $_path.about.label]
    166166    if {"" == $label} {
    167167        set label "Example"
     
    208208# ----------------------------------------------------------------------
    209209itcl::body Rappture::Loader::_tooltip {} {
    210     set str [string trim [$_xmlobj get $_path.about.description]]
     210    set str [string trim [$_owner xml get $_path.about.description]]
    211211
    212212    # get the description for the current choice, if there is one
  • /trunk/gui/scripts/moleculeViewer.tcl

    r20 r30  
    1313package require vtk
    1414package require vtkinteraction
    15 
    16 option add *MoleculeViewer.width 4i widgetDefault
    17 option add *MoleculeViewer.height 4i widgetDefault
     15package require BLT
     16
     17option add *MoleculeViewer.width 5i widgetDefault
     18option add *MoleculeViewer.height 5i widgetDefault
    1819option add *MoleculeViewer.backdrop black widgetDefault
     20
     21blt::bitmap define MoleculeViewer-reset {
     22#define reset_width 12
     23#define reset_height 12
     24static unsigned char reset_bits[] = {
     25   0x00, 0x00, 0x00, 0x00, 0xfc, 0x03, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02,
     26   0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0xfc, 0x03, 0x00, 0x00, 0x00, 0x00};
     27}
     28
     29blt::bitmap define MoleculeViewer-zoomin {
     30#define zoomin_width 12
     31#define zoomin_height 12
     32static unsigned char zoomin_bits[] = {
     33   0x7c, 0x00, 0x82, 0x00, 0x11, 0x01, 0x11, 0x01, 0x7d, 0x01, 0x11, 0x01,
     34   0x11, 0x01, 0x82, 0x03, 0xfc, 0x07, 0x80, 0x0f, 0x00, 0x0f, 0x00, 0x06};
     35}
     36
     37blt::bitmap define MoleculeViewer-zoomout {
     38#define zoomout_width 12
     39#define zoomout_height 12
     40static unsigned char zoomout_bits[] = {
     41   0x7c, 0x00, 0x82, 0x00, 0x01, 0x01, 0x01, 0x01, 0x7d, 0x01, 0x01, 0x01,
     42   0x01, 0x01, 0x82, 0x03, 0xfc, 0x07, 0x80, 0x0f, 0x00, 0x0f, 0x00, 0x06};
     43}
     44
     45blt::bitmap define MoleculeViewer-atoms {
     46#define atoms_width 12
     47#define atoms_height 12
     48static unsigned char atoms_bits[] = {
     49   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x02, 0x4c, 0x02, 0xc8, 0x03,
     50   0x48, 0x02, 0x48, 0x02, 0x5c, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
     51}
    1952
    2053itcl::class Rappture::MoleculeViewer {
     
    2861
    2962    protected method _render {}
     63    protected method _zoom {option}
     64    protected method _move {option x y}
     65    protected method _3dView {theta phi}
     66    protected method _fixLabels {{option position}}
    3067    protected method _color2rgb {color}
    3168
    3269    private variable _tool ""    ;# tool containing this viewer
    3370    private variable _actors ""  ;# list of actors in renderer
     71    private variable _label2atom ;# maps 2D text actor => underlying atom
     72    private variable _view       ;# view params for 3D view
     73    private variable _limits     ;# limits of x/y/z axes
     74    private variable _click      ;# info used for _move operations
    3475}
    3576                                                                               
     
    61102    $this-map SetInput [$this-sphere GetOutput]
    62103
     104    vtkCoordinate $this-xyzconv
     105    $this-xyzconv SetCoordinateSystemToWorld
     106
     107    set _view(theta) 0
     108    set _view(phi) 0
     109
     110    itk_component add controls {
     111        frame $itk_interior.cntls
     112    } {
     113        usual
     114        rename -background -controlbackground controlBackground Background
     115    }
     116    pack $itk_component(controls) -side right -fill y
     117
     118    itk_component add reset {
     119        button $itk_component(controls).reset \
     120            -borderwidth 1 -padx 1 -pady 1 \
     121            -bitmap MoleculeViewer-reset \
     122            -command [itcl::code $this _zoom reset]
     123    } {
     124        usual
     125        ignore -borderwidth
     126        rename -highlightbackground -controlbackground controlBackground Background
     127    }
     128    pack $itk_component(reset) -padx 4 -pady 4
     129    Rappture::Tooltip::for $itk_component(reset) "Reset the view to the default zoom level"
     130
     131    itk_component add zoomin {
     132        button $itk_component(controls).zin \
     133            -borderwidth 1 -padx 1 -pady 1 \
     134            -bitmap MoleculeViewer-zoomin \
     135            -command [itcl::code $this _zoom in]
     136    } {
     137        usual
     138        ignore -borderwidth
     139        rename -highlightbackground -controlbackground controlBackground Background
     140    }
     141    pack $itk_component(zoomin) -padx 4 -pady 4
     142    Rappture::Tooltip::for $itk_component(zoomin) "Zoom in"
     143
     144    itk_component add zoomout {
     145        button $itk_component(controls).zout \
     146            -borderwidth 1 -padx 1 -pady 1 \
     147            -bitmap MoleculeViewer-zoomout \
     148            -command [itcl::code $this _zoom out]
     149    } {
     150        usual
     151        ignore -borderwidth
     152        rename -highlightbackground -controlbackground controlBackground Background
     153    }
     154    pack $itk_component(zoomout) -padx 4 -pady 4
     155    Rappture::Tooltip::for $itk_component(zoomout) "Zoom out"
     156
     157    itk_component add labels {
     158        label $itk_component(controls).labels \
     159            -borderwidth 1 -padx 1 -pady 1 \
     160            -bitmap MoleculeViewer-atoms
     161    } {
     162        usual
     163        ignore -borderwidth
     164        rename -highlightbackground -controlbackground controlBackground Background
     165    }
     166    pack $itk_component(labels) -padx 4 -pady 8 -ipadx 1 -ipady 1
     167    Rappture::Tooltip::for $itk_component(labels) "Show/hide the labels on atoms"
     168    bind $itk_component(labels) <ButtonPress> \
     169        [itcl::code $this _fixLabels toggle]
     170
     171    #
     172    # RENDERING AREA
     173    #
     174    itk_component add area {
     175        frame $itk_interior.area
     176    }
     177    pack $itk_component(area) -expand yes -fill both
     178    bind $itk_component(area) <Configure> \
     179        [itcl::code $this _fixLabels]
     180
    63181    itk_component add renderer {
    64         vtkTkRenderWidget $itk_interior.ren -rw $this-renWin
     182        vtkTkRenderWidget $itk_component(area).ren -rw $this-renWin
    65183    } {
    66184    }
     
    68186
    69187    eval itk_initialize $args
     188
     189    # prevent interactions -- use our own
     190    blt::busy hold $itk_component(area) -cursor left_ptr
     191    bind $itk_component(area)_Busy <ButtonPress> \
     192        [itcl::code $this _move click %x %y]
     193    bind $itk_component(area)_Busy <B1-Motion> \
     194        [itcl::code $this _move drag %x %y]
     195    bind $itk_component(area)_Busy <ButtonRelease> \
     196        [itcl::code $this _move release %x %y]
     197
     198    _fixLabels on
    70199}
    71200
     
    79208    rename $this-sphere ""
    80209    rename $this-map ""
     210    rename $this-xyzconv ""
    81211}
    82212
     
    93223    }
    94224    set _actors ""
     225    catch {unset _label2atom}
     226
     227    foreach lim {xmin xmax ymin ymax zmin zmax} {
     228        set _limits($lim) ""
     229    }
    95230
    96231    if {$itk_option(-device) != ""} {
     
    104239            regsub {,} $xyz {} xyz
    105240
    106             set aname "::actor[incr counter]"
     241            # update overall limits for molecules along all axes
     242            foreach axis {x y z} val $xyz {
     243                if {"" == $_limits(${axis}min)} {
     244                    set _limits(${axis}min) $val
     245                    set _limits(${axis}max) $val
     246                } else {
     247                    if {$val < $_limits(${axis}min)} {
     248                        set _limits(${axis}min) $val
     249                    }
     250                    if {$val > $_limits(${axis}max)} {
     251                        set _limits(${axis}max) $val
     252                    }
     253                }
     254            }
     255
     256            # create an actor for each atom
     257            set aname $this-actor[incr counter]
    107258            vtkActor $aname
    108259            $aname SetMapper $this-map
     
    121272
    122273            lappend _actors $aname
    123         }
     274
     275            # create a label for each atom
     276            set lname $this-label$counter
     277            vtkTextActor $lname
     278            $lname SetInput "$counter $symbol"
     279            $lname ScaledTextOff
     280
     281            set tprop [$lname GetTextProperty]
     282            $tprop SetJustificationToCentered
     283            $tprop SetVerticalJustificationToCentered
     284            $tprop ShadowOn
     285            $tprop SetColor 1 1 1
     286
     287            set _label2atom($lname) $aname
     288            lappend _actors $lname
     289        }
     290        if {[$itk_component(labels) cget -relief] == "sunken"} {
     291            _fixLabels on
     292        }
     293        after cancel [list catch [itcl::code $this _zoom reset]]
     294        after 200 [list catch [itcl::code $this _zoom reset]]
    124295    }
    125296    $this-ren ResetCamera
     297    $this-renWin Render
     298}
     299
     300# ----------------------------------------------------------------------
     301# USAGE: _zoom in
     302# USAGE: _zoom out
     303# USAGE: _zoom reset
     304#
     305# Called automatically when the user clicks on one of the zoom
     306# controls for this widget.  Changes the zoom for the current view.
     307# ----------------------------------------------------------------------
     308itcl::body Rappture::MoleculeViewer::_zoom {option} {
     309    switch -- $option {
     310        in {
     311            [$this-ren GetActiveCamera] Zoom 1.25
     312            _fixLabels
     313            $this-renWin Render
     314        }
     315        out {
     316            [$this-ren GetActiveCamera] Zoom 0.8
     317            _fixLabels
     318            $this-renWin Render
     319        }
     320        reset {
     321            [$this-ren GetActiveCamera] SetViewAngle 30
     322            $this-ren ResetCamera
     323            [$this-ren GetActiveCamera] Zoom 1.25
     324            _3dView 45 45
     325            $this-renWin Render
     326
     327            after cancel [list catch [itcl::code $this _fixLabels]]
     328            after 2000 [list catch [itcl::code $this _fixLabels]]
     329        }
     330    }
     331}
     332
     333# ----------------------------------------------------------------------
     334# USAGE: _move click <x> <y>
     335# USAGE: _move drag <x> <y>
     336# USAGE: _move release <x> <y>
     337#
     338# Called automatically when the user clicks/drags/releases in the
     339# plot area.  Moves the plot according to the user's actions.
     340# ----------------------------------------------------------------------
     341itcl::body Rappture::MoleculeViewer::_move {option x y} {
     342    switch -- $option {
     343        click {
     344            blt::busy configure $itk_component(area) -cursor fleur
     345            set _click(x) $x
     346            set _click(y) $y
     347            set _click(theta) $_view(theta)
     348            set _click(phi) $_view(phi)
     349        }
     350        drag {
     351            if {[array size _click] == 0} {
     352                _move click $x $y
     353            } else {
     354                set w [winfo width $itk_component(renderer)]
     355                set h [winfo height $itk_component(renderer)]
     356                set dx [expr {double($x-$_click(x))/$w}]
     357                set dy [expr {double($y-$_click(y))/$h}]
     358
     359                #
     360                # Rotate the camera in 3D
     361                #
     362                set theta [expr {$_view(theta) - $dy*180}]
     363                if {$theta < 2} { set theta 2 }
     364                if {$theta > 178} { set theta 178 }
     365                set phi [expr {$_view(phi) - $dx*360}]
     366
     367                _3dView $theta $phi
     368                _fixLabels
     369                $this-renWin Render
     370
     371                set _click(x) $x
     372                set _click(y) $y
     373            }
     374        }
     375        release {
     376            _move drag $x $y
     377            blt::busy configure $itk_component(area) -cursor left_ptr
     378            catch {unset _click}
     379        }
     380        default {
     381            error "bad option \"$option\": should be click, drag, release"
     382        }
     383    }
     384}
     385
     386# ----------------------------------------------------------------------
     387# USAGE: _3dView <theta> <phi>
     388#
     389# Used internally to change the position of the camera for 3D data
     390# sets.  Sets the camera according to the angles <theta> (angle from
     391# the z-axis) and <phi> (angle from the x-axis in the x-y plane).
     392# Both angles are in degrees.
     393# ----------------------------------------------------------------------
     394itcl::body Rappture::MoleculeViewer::_3dView {theta phi} {
     395    set deg2rad 0.0174532927778
     396    set xn [expr {sin($theta*$deg2rad)*cos($phi*$deg2rad)}]
     397    set yn [expr {sin($theta*$deg2rad)*sin($phi*$deg2rad)}]
     398    set zn [expr {cos($theta*$deg2rad)}]
     399
     400    set xm [expr {0.5*($_limits(xmax)+$_limits(xmin))}]
     401    set ym [expr {0.5*($_limits(ymax)+$_limits(ymin))}]
     402    set zm [expr {0.5*($_limits(zmax)+$_limits(zmin))}]
     403
     404    set cam [$this-ren GetActiveCamera]
     405    set zoom [$cam GetViewAngle]
     406    $cam SetViewAngle 30
     407
     408    $cam SetFocalPoint $xm $ym $zm
     409    $cam SetPosition [expr {$xm-$xn}] [expr {$ym-$yn}] [expr {$zm+$zn}]
     410    $cam ComputeViewPlaneNormal
     411    $cam SetViewUp 0 0 1  ;# z-dir is up
     412    $cam OrthogonalizeViewUp
     413    $this-ren ResetCamera
     414    $cam SetViewAngle $zoom
     415
     416    # fix up the labels so they sit over the new atom positions
     417    _fixLabels
     418
     419    set _view(theta) $theta
     420    set _view(phi) $phi
     421}
     422
     423# ----------------------------------------------------------------------
     424# USAGE: _fixLabels on
     425# USAGE: _fixLabels off
     426# USAGE: _fixLabels toggle
     427# USAGE: _fixLabels position
     428#
     429# Used internally to turn labels associated with atoms on/off, and to
     430# update the positions of the labels so they sit on top of each atom.
     431# ----------------------------------------------------------------------
     432itcl::body Rappture::MoleculeViewer::_fixLabels {{option position}} {
     433    switch -- $option {
     434        on {
     435            set state 1
     436        }
     437        off {
     438            set state 0
     439        }
     440        toggle {
     441            if {[$itk_component(labels) cget -relief] == "sunken"} {
     442                set state 0
     443            } else {
     444                set state 1
     445            }
     446        }
     447        position {
     448            foreach lname [array names _label2atom] {
     449                set aname $_label2atom($lname)
     450                set xyz [$aname GetPosition]
     451                eval $this-xyzconv SetValue $xyz
     452                set xy [$this-xyzconv GetComputedViewportValue $this-ren]
     453                eval $lname SetDisplayPosition $xy
     454            }
     455            return
     456        }
     457        default {
     458            error "bad option \"$option\": should be on, off, toggle, position"
     459        }
     460    }
     461
     462    if {$state} {
     463        $itk_component(labels) configure -relief sunken
     464        foreach lname [array names _label2atom] {
     465            catch {$this-ren AddActor2D $lname}
     466        }
     467        _fixLabels position
     468    } else {
     469        $itk_component(labels) configure -relief raised
     470        foreach lname [array names _label2atom] {
     471            catch {$this-ren RemoveActor $lname}
     472        }
     473    }
    126474    $this-renWin Render
    127475}
     
    159507    after idle [itcl::code $this _render]
    160508}
    161 
    162 #package require Rappture
    163 #Rappture::MoleculeViewer .e
    164 #pack .e -expand yes -fill both
    165 #
    166 #set dev [Rappture::library {<?xml version="1.0"?>
    167 #<structure>
    168 #<components>
    169 #<molecule id="Aspirin">
    170 #  <formula>???</formula>
    171 #  <info>Aspirin molecule</info>
    172 #  <atom id="1">
    173 #    <symbol>C</symbol>
    174 #    <xyz>-1.892  -0.992  -1.578</xyz>
    175 #  </atom>
    176 #  <atom id="2">
    177 #    <symbol>C</symbol>
    178 #    <xyz>-1.370  -2.149  -0.990</xyz>
    179 #  </atom>
    180 #  <atom id="3">
    181 #    <symbol>C</symbol>
    182 #    <xyz>-0.079  -2.146  -0.464</xyz>
    183 #  </atom>
    184 #  <atom id="4">
    185 #    <symbol>C</symbol>
    186 #    <xyz>0.708  -0.986  -0.521</xyz>
    187 #  </atom>
    188 #  <atom id="5">
    189 #    <symbol>C</symbol>
    190 #    <xyz>0.203   0.156  -1.196</xyz>
    191 #  </atom>
    192 #  <atom id="6">
    193 #    <symbol>C</symbol>
    194 #    <xyz>-1.108   0.161  -1.654</xyz>
    195 #  </atom>
    196 #  <atom id="7">
    197 #    <symbol>C</symbol>
    198 #    <xyz>2.085  -1.030   0.104</xyz>
    199 #  </atom>
    200 #  <atom id="8">
    201 #    <symbol>O</symbol>
    202 #    <xyz>2.533  -2.034   0.636</xyz>
    203 #  </atom>
    204 #  <atom id="9">
    205 #    <symbol>O</symbol>
    206 #    <xyz>2.879   0.025   0.112</xyz>
    207 #  </atom>
    208 #  <atom id="10">
    209 #    <symbol>O</symbol>
    210 #    <xyz>0.753   1.334  -1.084</xyz>
    211 #  </atom>
    212 #  <atom id="11">
    213 #    <symbol>C</symbol>
    214 #    <xyz>0.668   2.025   0.034</xyz>
    215 #  </atom>
    216 #  <atom id="12">
    217 #    <symbol>O</symbol>
    218 #    <xyz>1.300   3.063   0.152</xyz>
    219 #  </atom>
    220 #  <atom id="13">
    221 #    <symbol>C</symbol>
    222 #    <xyz>-0.243   1.577   1.144</xyz>
    223 #  </atom>
    224 #  <atom id="14">
    225 #    <symbol>H</symbol>
    226 #    <xyz>-2.879  -0.962  -1.985</xyz>
    227 #  </atom>
    228 #  <atom id="15">
    229 #    <symbol>H</symbol>
    230 #    <xyz>-1.988  -3.037  -0.955</xyz>
    231 #  </atom>
    232 #  <atom id="16">
    233 #    <symbol>H</symbol>
    234 #    <xyz>0.300  -3.063  -0.005</xyz>
    235 #  </atom>
    236 #  <atom id="17">
    237 #    <symbol>H</symbol>
    238 #    <xyz>-1.489   1.084  -2.059</xyz>
    239 #  </atom>
    240 #  <atom id="18">
    241 #    <symbol>H</symbol>
    242 #    <xyz>2.566   0.782  -0.326</xyz>
    243 #  </atom>
    244 #  <atom id="19">
    245 #    <symbol>H</symbol>
    246 #    <xyz>-0.761   0.636   0.933</xyz>
    247 #  </atom>
    248 #  <atom id="20">
    249 #    <symbol>H</symbol>
    250 #    <xyz>-1.009   2.349   1.290</xyz>
    251 #  </atom>
    252 #  <atom id="21">
    253 #    <symbol>H</symbol>
    254 #    <xyz>0.346   1.435   2.059</xyz>
    255 #  </atom>
    256 #</molecule>
    257 #</components>
    258 #</structure>}]
    259 # add connectivity at some point...
    260 #CONECT    1    2    6   14                   
    261 #CONECT    2    1    3   15                   
    262 #CONECT    3    2    4   16                   
    263 #CONECT    4    3    5    7                   
    264 #CONECT    5    4    6   10                   
    265 #CONECT    6    1    5   17                   
    266 #CONECT    7    4    8    9                   
    267 #CONECT    8    7                             
    268 #CONECT    9    7   18                       
    269 #CONECT   10    5   11                       
    270 #CONECT   11   10   12   13                   
    271 #CONECT   12   11                             
    272 #CONECT   13   11   19   20   21             
    273 #CONECT   14    1                             
    274 #CONECT   15    2                             
    275 #CONECT   16    3                             
    276 #CONECT   17    6                             
    277 #CONECT   18    9                             
    278 #CONECT   19   13                             
    279 #CONECT   20   13                             
    280 #CONECT   21   13               
    281 
    282 #.e configure -device $dev
  • /trunk/gui/scripts/numberentry.tcl

    r20 r30  
    1414    inherit itk::Widget
    1515
    16     constructor {xmlobj path args} { # defined below }
     16    constructor {owner path args} { # defined below }
    1717
    1818    public method value {args}
     
    2323    protected method _newValue {}
    2424
    25     private variable _xmlobj ""   ;# XML containing description
     25    private variable _owner ""    ;# thing managing this control
    2626    private variable _path ""     ;# path in XML to this number
    2727}
     
    3737# CONSTRUCTOR
    3838# ----------------------------------------------------------------------
    39 itcl::body Rappture::NumberEntry::constructor {xmlobj path args} {
    40     if {![Rappture::library isvalid $xmlobj]} {
    41         error "bad value \"$xmlobj\": should be Rappture::library"
    42     }
    43     set _xmlobj $xmlobj
     39itcl::body Rappture::NumberEntry::constructor {owner path args} {
     40    if {[catch {$owner isa Rappture::ControlOwner} valid] != 0 || !$valid} {
     41        error "bad object \"$owner\": should be Rappture::ControlOwner"
     42    }
     43    set _owner $owner
    4444    set _path $path
    4545
     
    4848    #
    4949    set presets ""
    50     foreach pre [$xmlobj children -type preset $path] {
     50    foreach pre [$_owner xml children -type preset $path] {
    5151        lappend presets \
    52             [$xmlobj get $path.$pre.value] \
    53             [$xmlobj get $path.$pre.label]
     52            [$_owner xml get $path.$pre.value] \
     53            [$_owner xml get $path.$pre.label]
    5454    }
    5555
    5656    set class Rappture::Gauge
    57     set units [$xmlobj get $path.units]
     57    set units [$_owner xml get $path.units]
    5858    if {$units != ""} {
    5959        set desc [Rappture::Units::description $units]
     
    7373    bind $itk_component(gauge) <<Value>> [itcl::code $this _newValue]
    7474
    75     set min [$xmlobj get $path.min]
     75    set min [$_owner xml get $path.min]
    7676    if {"" != $min} { $itk_component(gauge) configure -minvalue $min }
    7777
    78     set max [$xmlobj get $path.max]
     78    set max [$_owner xml get $path.max]
    7979    if {"" != $max} { $itk_component(gauge) configure -maxvalue $max }
    8080
    8181    if {$class == "Rappture::Gauge" && "" != $min && "" != $max} {
    82         set color [$xmlobj get $path.color]
     82        set color [$_owner xml get $path.color]
    8383        if {$color == ""} {
    8484            set color blue
     
    9494
    9595    # if the control has an icon, plug it in
    96     set str [$xmlobj get $path.about.icon]
     96    set str [$_owner xml get $path.about.icon]
    9797    if {$str != ""} {
    9898        $itk_component(gauge) configure -image [image create photo -data $str]
     
    104104    # Assign the default value to this widget, if there is one.
    105105    #
    106     set str [$xmlobj get $path.default]
     106    set str [$_owner xml get $path.default]
    107107    if {"" != $str != ""} { $itk_component(gauge) value $str }
    108108}
     
    151151# ----------------------------------------------------------------------
    152152itcl::body Rappture::NumberEntry::label {} {
    153     set label [$_xmlobj get $_path.about.label]
     153    set label [$_owner xml get $_path.about.label]
    154154    if {"" == $label} {
    155155        set label "Number"
     
    167167# ----------------------------------------------------------------------
    168168itcl::body Rappture::NumberEntry::tooltip {} {
    169     set str [$_xmlobj get $_path.about.description]
    170 
    171     set units [$_xmlobj get $_path.units]
    172     set min [$_xmlobj get $_path.min]
    173     set max [$_xmlobj get $_path.max]
     169    set str [$_owner xml get $_path.about.description]
     170
     171    set units [$_owner xml get $_path.units]
     172    set min [$_owner xml get $_path.min]
     173    set max [$_owner xml get $_path.max]
    174174
    175175    if {$units != "" || $min != "" || $max != ""} {
  • /trunk/gui/scripts/page.tcl

    r20 r30  
    1717    inherit itk::Widget
    1818
    19     constructor {tool path args} { # defined below }
     19    constructor {owner path args} { # defined below }
    2020
    2121    protected method _buildGroup {frame xmlobj path}
    22 
    23     private variable _tool ""        ;# tool controlling this page
     22    protected method _link {xmlobj path widget path2}
     23
     24    private variable _owner ""       ;# thing managing this page
    2425}
    2526                                                                               
     
    3031# CONSTRUCTOR
    3132# ----------------------------------------------------------------------
    32 itcl::body Rappture::Page::constructor {tool path args} {
    33     if {[catch {$tool isa Rappture::Tool} valid] || !$valid} {
    34         error "object \"$tool\" is not a Rappture Tool"
    35     }
    36     set _tool $tool
    37     set xmlobj [$tool xml object]
     33itcl::body Rappture::Page::constructor {owner path args} {
     34    if {[catch {$owner isa Rappture::ControlOwner} valid] || !$valid} {
     35        error "object \"$owner\" is not a Rappture::ControlOwner"
     36    }
     37    set _owner $owner
     38    set xmlobj [$owner xml object]
    3839
    3940    set type [$xmlobj element -as type $path]
     
    5657# ----------------------------------------------------------------------
    5758itcl::body Rappture::Page::_buildGroup {frame xmlobj path} {
     59    frame $frame.results
     60    pack $frame.results -side right -fill y
     61
    5862    set deveditor ""
    59 
    60     #
    61     # Scan through all input elements in this group and look
    62     # for a <loader>.  Add those first, at the top of the group.
    63     #
    64     set num 0
    65     foreach cname [$xmlobj children $path] {
    66         if {[$xmlobj element -as type $path.$cname] == "loader"} {
    67             if {![winfo exists $frame.loaders]} {
    68                 frame $frame.loaders
    69                 pack $frame.loaders -side top -fill x
    70 
    71                 frame $frame.loaders.sep -height 2 \
    72                     -borderwidth 1 -relief sunken
    73                 pack $frame.loaders.sep -side bottom -fill x -pady 4
    74             }
    75             set w "$frame.loaders.l[incr num]"
    76             Rappture::Controls $w $_tool
    77             pack $w -fill x
    78             $w insert end $xmlobj $path.$cname
    79         }
    80     }
    81 
    82     #
    83     # Scan through all input elements and look for any top-level
    84     # <structure> elements.  Create these next.
    85     #
    86     set num 0
    87     foreach cname [$xmlobj children $path] {
    88         if {[$xmlobj element -as type $path.$cname] == "structure"} {
    89             set w "$frame.device[incr num]"
    90             Rappture::DeviceEditor $w $_tool
    91             pack $w -expand yes -fill both
    92             $_tool widgetfor $path.$cname $w
    93 
    94             if {"" == $deveditor} {
    95                 set deveditor $w
    96             }
    97 
    98             # if there's a default value, load it now
    99             if {"" != [$xmlobj element -as type $path.$cname.default]} {
    100                 set val [$xmlobj get $path.$cname.default]
    101                 if {[string length $val] > 0} {
    102                     $w value $val
    103                 } else {
    104                     set obj [$xmlobj element -as object $path.$cname.default]
    105                     $w value $obj
    106                 }
    107             }
    108         }
    109     }
    11063
    11164    #
     
    11467    # if there is one.
    11568    #
    116     foreach cname [$xmlobj children $path] {
    117         if {[string match "about*" $cname]} {
     69    set num 0
     70    set clist [$xmlobj children $path]
     71    while {[llength $clist] > 0} {
     72        set cname [lindex $clist 0]
     73        set clist [lrange $clist 1 end]
     74
     75        set type [$xmlobj element -as type $path.$cname]
     76        if {$type == "about"} {
    11877            continue
    11978        }
    12079
    121         if {[$_tool widgetfor $path.$cname] == ""} {
     80        if {$type == "loader"} {
     81            #
     82            # Add <loader>'s at the top of the page.
     83            #
     84            if {![winfo exists $frame.loaders]} {
     85                frame $frame.loaders
     86                pack $frame.loaders -side top -fill x
     87
     88                frame $frame.loaders.sep -height 2 \
     89                    -borderwidth 1 -relief sunken
     90                pack $frame.loaders.sep -side bottom -fill x -pady 4
     91            }
     92            set w "$frame.loaders.l[incr num]"
     93            Rappture::Controls $w $_owner
     94            pack $w -fill x
     95            $w insert end $path.$cname
     96        } elseif {$type == "structure"} {
     97            #
     98            # Add <structure>'s as the central element of the page.
     99            #
     100            set w "$frame.device[incr num]"
     101            Rappture::DeviceEditor $w $_owner
     102            pack $w -expand yes -fill both
     103            $_owner widgetfor $path.$cname $w
     104            bind $w <<Value>> [list $_owner changed $path.$cname]
     105
     106            if {"" == $deveditor} {
     107                set deveditor $w
     108            }
     109
     110            # if there's a default value, load it now
     111            if {"" != [$xmlobj element -as type $path.$cname.current]} {
     112                set elem $path.$cname.current
     113            } else {
     114                set elem $path.$cname.default
     115            }
     116            if {"" != [$xmlobj element -as type $elem]} {
     117                set val [$xmlobj get $elem]
     118                if {[string length $val] > 0} {
     119                    $w value $val
     120                    $xmlobj put $path.$cname.current $val
     121                } else {
     122                    set obj [$xmlobj element -as object $elem]
     123                    $w value $obj
     124                    $xmlobj put $path.$cname.current $obj
     125                }
     126            }
     127
     128            # if there's a link, then set up a callback to load from it
     129            set link [$xmlobj get $path.$cname.link]
     130            if {"" != $link} {
     131                $_owner notify add $this $link \
     132                    [itcl::code $this _link $xmlobj $link $w $path.$cname]
     133            }
     134        } elseif {$type == "tool"} {
     135            set service [Rappture::Service ::#auto $_owner $path.$cname]
     136            #
     137            # Scan through all extra inputs associated with this subtool
     138            # and create corresponding inputs in the top-level tool.
     139            # Then, add the input names to the list being processed here,
     140            # so that we'll create the controls during subsequent passes
     141            # through the loop.
     142            #
     143            set extra ""
     144            foreach obj [$service input] {
     145                set cname [$obj element]
     146                $xmlobj copy $path.$cname from $obj ""
     147                lappend extra $cname
     148            }
     149
     150            #
     151            # If there's a control for this service, then add it
     152            # to the end of the extra controls added above.
     153            #
     154            foreach obj [$service control] {
     155                set cname [$obj element]
     156                $xmlobj copy $path.$cname from $obj ""
     157                $xmlobj put $path.$cname.service $service
     158                lappend extra $cname
     159            }
     160            if {[llength $extra] > 0} {
     161                set clist [eval linsert [list $clist] 0 $extra]
     162            }
     163
     164            #
     165            # Scan through all outputs associated with this subtool
     166            # and create any corresponding feedback widgets.
     167            #
     168            foreach obj [$service output] {
     169                set cname [$obj element]
     170                $xmlobj copy $cname from $obj ""
     171
     172                # pick a good size based on output type
     173                set w $frame.results.result[incr num]
     174                set type [$obj element -as type]
     175                switch -- $type {
     176                    number - integer - boolean - choice {
     177                        Rappture::ResultViewer $w -width 0 -height 0
     178                        pack $w -fill x -padx 4 -pady 4
     179                    }
     180                    default {
     181                        Rappture::ResultViewer $w -width 4i -height 4i
     182                        pack $w -expand yes -fill both -padx 4 -pady 4
     183                    }
     184                }
     185                $service output for $obj $w
     186            }
     187        } else {
    122188            # create a control panel, if necessary
    123189            if {![winfo exists $frame.cntls]} {
    124                 Rappture::Controls $frame.cntls $_tool
    125                 pack $frame.cntls -fill x
     190                Rappture::Controls $frame.cntls $_owner
     191                pack $frame.cntls -fill x -pady 4
    126192            }
    127193
     
    132198                    set w [$deveditor component top]
    133199                } else {
    134                     set c [$frame.cntls insert end $xmlobj $path.$cname]
    135                     set w [$frame.cntls control $c]
     200                    if {[catch {$frame.cntls insert end $path.$cname} c]} {
     201                        error $c "$c\n    (while building control for $path.$cname)"
     202                    } else {
     203                        set gentry [$frame.cntls control $c]
     204                        set w [$gentry component inner]
     205                    }
    136206                }
    137207                _buildGroup $w $xmlobj $path.$cname
    138208            } else {
    139                 $frame.cntls insert end $xmlobj $path.$cname
     209                if {[catch {$frame.cntls insert end $path.$cname} c]} {
     210                    error $c "$c\n    (while building control for $path.$cname)"
     211                }
    140212            }
    141213        }
    142214    }
    143215}
     216
     217itcl::body Rappture::Page::_link {xmlobj path w path2} {
     218    if {"" != [$xmlobj element -as type $path.current]} {
     219        set val [$xmlobj get $path.current]
     220        if {[string length $val] > 0} {
     221            $w value $val
     222            $xmlobj put $path.current $val
     223        } else {
     224            set obj [$xmlobj element -as object $path.current]
     225            $w value $obj
     226            $xmlobj put $path.current $obj
     227        }
     228    }
     229    $_owner changed $path2
     230}
  • /trunk/gui/scripts/pager.tcl

    r20 r30  
    8282
    8383    itk_component add next {
    84         button $itk_component(controls).next -width 6 -text "Next >" \
     84        button $itk_component(controls).next -text "Next >" \
    8585            -command [itcl::code $this current next>]
    8686    }
     
    8888
    8989    itk_component add back {
    90         button $itk_component(controls).back -width 6 -text "< Back" \
     90        button $itk_component(controls).back -text "< Back" \
    9191            -command [itcl::code $this current <back]
    9292    }
     
    166166    set _pages [linsert $_pages $pos $params(-name)]
    167167
    168     #bind $win <Configure> \
    169     #    [itcl::code $_dispatcher event -idle !fixsize]
     168    bind $win <Configure> \
     169        [itcl::code $_dispatcher event -idle !fixsize]
     170
     171    # the number of pages affects the arrangment -- force an update
     172    configure -arrangement $itk_option(-arrangement)
    170173
    171174    $_dispatcher event -idle !layout
     
    204207    }
    205208    set _pages [lreplace $_pages $first $last]
     209
     210    # the number of pages affects the arrangment -- force an update
     211    configure -arrangement $itk_option(-arrangement)
    206212
    207213    $_dispatcher event -idle !layout
     
    395401# ----------------------------------------------------------------------
    396402itcl::body Rappture::Pager::_fixSize {} {
     403    set sw [expr {[winfo screenwidth $itk_component(hull)]-200}]
     404    set sh [expr {[winfo screenheight $itk_component(hull)]-200}]
     405
    397406    switch -- $itk_option(-arrangement) {
    398407        pages {
    399408            if {$itk_option(-width) <= 0} {
    400                 update idletasks
    401409                set maxw [expr {
    402410                    [winfo reqwidth $itk_component(next)]
     
    409417                }
    410418                set maxw [expr {$maxw + 2*$itk_option(-padding)}]
     419                if {$maxw > $sw} { set maxw $sw }
    411420                $itk_component(inside) configure -width $maxw
    412421            } else {
     
    415424
    416425            if {$itk_option(-height) <= 0} {
    417                 update idletasks
    418426                set maxh 0
    419427                foreach name $_pages {
     
    422430                }
    423431                set maxh [expr {$maxh + 2*$itk_option(-padding)}]
     432                if {$maxh > $sh} { set maxh $sh }
    424433                $itk_component(inside) configure -height $maxh
    425434            } else {
     
    429438        side-by-side {
    430439            if {$itk_option(-width) <= 0} {
    431                 update idletasks
    432440                set maxw [expr {
    433441                    [winfo reqwidth $itk_component(next)]
     
    441449                }
    442450                if {$wtotal > $maxw} { set maxw $wtotal }
     451                if {$maxw > $sw} { set maxw $sw }
    443452                $itk_component(inside) configure -width $maxw
    444453            } else {
     
    447456
    448457            if {$itk_option(-height) <= 0} {
    449                 update idletasks
    450458                set maxh 0
    451459                foreach name $_pages {
     
    454462                }
    455463                set maxh [expr {$maxh + 2*$itk_option(-padding)}]
     464                if {$maxh > $sh} { set maxh $sh }
    456465                $itk_component(inside) configure -height $maxh
    457466            } else {
  • /trunk/gui/scripts/resultviewer.tcl

    r20 r30  
    1313package require Itk
    1414
    15 option add *ResultViewer.width 4i widgetDefault
    16 option add *ResultViewer.height 4i widgetDefault
    17 
    1815itcl::class Rappture::ResultViewer {
    1916    inherit itk::Widget
    2017
     18    itk_option define -width width Width 4i
     19    itk_option define -height height Height 4i
    2120    itk_option define -colors colors Colors ""
    2221    itk_option define -clearcommand clearCommand ClearCommand ""
     
    2827    public method add {index xmlobj path}
    2928    public method clear {{index ""}}
     29    public method value {xmlobj}
    3030
    3131    public method plot {option args}
     
    5050# ----------------------------------------------------------------------
    5151itcl::body Rappture::ResultViewer::constructor {args} {
    52     option add hull.width hull.height
    53     pack propagate $itk_component(hull) no
    54 
    5552    # create a dispatcher for events
    5653    Rappture::dispatcher _dispatcher
     
    8077# ----------------------------------------------------------------------
    8178itcl::body Rappture::ResultViewer::add {index xmlobj path} {
    82     if {$path != ""} {
    83         set dobj [_xml2data $xmlobj $path]
    84     } else {
    85         set dobj ""
    86     }
     79    set dobj [_xml2data $xmlobj $path]
    8780
    8881    #
     
    124117        }
    125118        set _dataslots ""
     119    }
     120}
     121
     122# ----------------------------------------------------------------------
     123# USAGE: value <xmlobj>
     124#
     125# Convenience method for showing a single value.  Loads the value
     126# into the widget via add/clear, then immediately plots the value.
     127# This makes the widget consistent with other widgets, such as
     128# the DeviceEditor, etc.
     129# ----------------------------------------------------------------------
     130itcl::body Rappture::ResultViewer::value {xmlobj} {
     131    clear
     132    if {"" != $xmlobj} {
     133        add 0 $xmlobj ""
     134        plot add 0 ""
    126135    }
    127136}
     
    245254                    }
    246255                }
     256                structure {
     257                    set mode "structure"
     258                    if {![info exists _mode2widget($mode)]} {
     259                        set w $itk_interior.struct
     260                        Rappture::DeviceResult $w
     261                        set _mode2widget($mode) $w
     262                    }
     263                }
     264                number - integer - boolean - choice {
     265                    set mode "value"
     266                    if {![info exists _mode2widget($mode)]} {
     267                        set w $itk_interior.value
     268                        Rappture::ValueResult $w
     269                        set _mode2widget($mode) $w
     270                    }
     271                }
    247272            }
    248273        }
     
    317342            return [$xmlobj element -as object $path]
    318343        }
     344        structure {
     345            return [$xmlobj element -as object $path]
     346        }
     347        number - integer - boolean - choice {
     348            return [$xmlobj element -as object $path]
     349        }
    319350        time - status {
    320351            return ""
     
    323354    error "don't know how to plot <$type> data"
    324355}
     356
     357# ----------------------------------------------------------------------
     358# CONFIGURATION OPTION: -width
     359# ----------------------------------------------------------------------
     360itcl::configbody Rappture::ResultViewer::width {
     361    set w [winfo pixels $itk_component(hull) $itk_option(-width)]
     362    set h [winfo pixels $itk_component(hull) $itk_option(-height)]
     363    if {$w == 0 || $h == 0} {
     364        pack propagate $itk_component(hull) yes
     365    } else {
     366        component hull configure -width $w -height $h
     367        pack propagate $itk_component(hull) no
     368    }
     369}
     370
     371# ----------------------------------------------------------------------
     372# CONFIGURATION OPTION: -height
     373# ----------------------------------------------------------------------
     374itcl::configbody Rappture::ResultViewer::height {
     375    set h [winfo pixels $itk_component(hull) $itk_option(-height)]
     376    set w [winfo pixels $itk_component(hull) $itk_option(-width)]
     377    if {$w == 0 || $h == 0} {
     378        pack propagate $itk_component(hull) yes
     379    } else {
     380        component hull configure -width $w -height $h
     381        pack propagate $itk_component(hull) no
     382    }
     383}
  • /trunk/gui/scripts/scroller.tcl

    r20 r30  
    3434    protected method _fixsbar {which {state ""}}
    3535    protected method _fixframe {which}
     36    protected method _fixsize {}
    3637    protected method _lock {option}
    3738
     39    private variable _dispatcher "" ;# dispatcher for !events
    3840    private variable _contents ""   ;# widget being controlled
    3941    private variable _frame ""      ;# for "contents frame" calls
     
    5254# ----------------------------------------------------------------------
    5355itcl::body Rappture::Scroller::constructor {args} {
     56    Rappture::dispatcher _dispatcher
     57
     58    $_dispatcher register !fixframe-inner
     59    $_dispatcher dispatch $this !fixframe-inner \
     60        "[itcl::code $this _fixframe inner]; list"
     61
     62    $_dispatcher register !fixframe-outer
     63    $_dispatcher dispatch $this !fixframe-outer \
     64        "[itcl::code $this _fixframe outer]; list"
     65
     66    $_dispatcher register !fixsize
     67    $_dispatcher dispatch $this !fixsize \
     68        "[itcl::code $this _fixsize]; list"
     69
    5470    itk_component add xsbar {
    5571        scrollbar $itk_interior.xsbar -orient horizontal
     
    104120            frame $_frame.f
    105121            $_frame create window 0 0 -anchor nw -window $_frame.f -tags frame
    106             bind $_frame.f <Configure> [itcl::code $this _fixframe inner]
    107             bind $_frame <Configure> [itcl::code $this _fixframe outer]
     122            bind $_frame.f <Configure> \
     123                [itcl::code $_dispatcher event -idle !fixframe-inner]
     124            bind $_frame <Configure> \
     125                [itcl::code $_dispatcher event -idle !fixframe-outer]
    108126        }
    109127        set widget $_frame
     
    207225        inner {
    208226            $_frame configure -scrollregion [$_frame bbox all]
     227            $_dispatcher event -idle !fixsize
    209228        }
    210229        outer {
    211230            $_frame itemconfigure frame -width [winfo width $_frame]
    212231        }
     232    }
     233}
     234
     235# ----------------------------------------------------------------------
     236# USAGE: _fixsize
     237#
     238# Used internally to update the size options for the widget
     239# whenever the -width/-height options change.
     240# ----------------------------------------------------------------------
     241itcl::body Rappture::Scroller::_fixsize {} {
     242    if {$itk_option(-width) == "0" && $itk_option(-height) == "0"} {
     243        # for default size, let the frame being controlled set the size
     244        grid propagate $itk_component(hull) yes
     245        if {$_frame == "$itk_component(hull).ifr"} {
     246            set w [winfo reqwidth $_frame.f]
     247            set h [winfo reqheight $_frame.f]
     248            $_frame configure -width $w -height $h
     249        }
     250    } else {
     251        # for specific size, set the overall size of the widget
     252        grid propagate $itk_component(hull) no
     253        set w $itk_option(-width); if {$w == "0"} { set w 1i }
     254        set h $itk_option(-height); if {$h == "0"} { set h 1i }
     255        component hull configure -width $w -height $h
    213256    }
    214257}
     
    264307# ----------------------------------------------------------------------
    265308itcl::configbody Rappture::Scroller::width {
    266     if {$itk_option(-width) == "0"} {
    267         if {$itk_option(-height) == "0"} {
    268             grid propagate $itk_component(hull) yes
    269         } else {
    270             component hull configure -width 1i
    271         }
    272     } else {
    273         grid propagate $itk_component(hull) no
    274         component hull configure -width $itk_option(-width)
    275     }
     309    # check for proper value
     310    winfo pixels $itk_component(hull) $itk_option(-width)
     311
     312    $_dispatcher event -idle !fixsize
    276313}
    277314
     
    280317# ----------------------------------------------------------------------
    281318itcl::configbody Rappture::Scroller::height {
    282     if {$itk_option(-height) == "0"} {
    283         if {$itk_option(-width) == "0"} {
    284             grid propagate $itk_component(hull) yes
    285         } else {
    286             component hull configure -height 1i
    287         }
    288     } else {
    289         grid propagate $itk_component(hull) no
    290         component hull configure -height $itk_option(-height)
    291     }
    292 }
     319    # check for proper value
     320    winfo pixels $itk_component(hull) $itk_option(-height)
     321
     322    $_dispatcher event -idle !fixsize
     323}
  • /trunk/gui/scripts/tempgauge.tcl

    r20 r30  
    1111package require Itk
    1212
    13 option add *TemperatureGauge.width 30 widgetDefault
    14 option add *TemperatureGauge.height 0 widgetDefault
     13option add *TemperatureGauge.sampleWidth 30 widgetDefault
     14option add *TemperatureGauge.sampleHeight 20 widgetDefault
    1515option add *TemperatureGauge.textBackground #cccccc widgetDefault
    1616option add *TemperatureGauge.valuePosition "right" widgetDefault
     
    115115# ----------------------------------------------------------------------
    116116itcl::body Rappture::TemperatureGauge::_resize {} {
    117     if {$itk_option(-width) > 0} {
    118         set w $itk_option(-width)
     117    if {$itk_option(-samplewidth) > 0} {
     118        set w $itk_option(-samplewidth)
    119119    } else {
    120120        set w [winfo reqheight $itk_component(value)]
     
    124124    }
    125125
    126     if {$itk_option(-height) > 0} {
    127         set h $itk_option(-height)
     126    if {$itk_option(-sampleheight) > 0} {
     127        set h $itk_option(-sampleheight)
    128128    } else {
    129129        if {$itk_option(-image) != ""} {
  • /trunk/gui/scripts/textentry.tcl

    r20 r30  
    2222    -*-helvetica-medium-r-normal-*-*-100-* widgetDefault
    2323
     24#
     25# Tk text widget doesn't honor Ctrl-V by default.  Get rid
     26# of the default binding so that Ctrl-V works for <<Paste>>
     27# as expected.
     28#
     29bind Text <Control-KeyPress-v> {}
     30
    2431itcl::class Rappture::TextEntry {
    2532    inherit itk::Widget
     
    2936    itk_option define -height height Height 0
    3037
    31     constructor {xmlobj path args} { # defined below }
     38    constructor {owner path args} { # defined below }
    3239
    3340    public method value {args}
     
    4047
    4148    private variable _dispatcher "" ;# dispatcher for !events
    42     private variable _xmlobj ""   ;# XML containing description
     49    private variable _owner ""    ;# thing managing this control
    4350    private variable _path ""     ;# path in XML to this number
    4451
     
    5360# CONSTRUCTOR
    5461# ----------------------------------------------------------------------
    55 itcl::body Rappture::TextEntry::constructor {xmlobj path args} {
    56     if {![Rappture::library isvalid $xmlobj]} {
    57         error "bad value \"$xmlobj\": should be Rappture::library"
    58     }
    59     set _xmlobj $xmlobj
     62itcl::body Rappture::TextEntry::constructor {owner path args} {
     63    if {[catch {$owner isa Rappture::ControlOwner} valid] != 0 || !$valid} {
     64        error "bad object \"$owner\": should be Rappture::ControlOwner"
     65    }
     66    set _owner $owner
    6067    set _path $path
    6168
     
    6471    $_dispatcher dispatch $this !layout "[itcl::code $this _layout]; list"
    6572
    66     set _size [$xmlobj get $path.size]
    67 
    68     set hints [$xmlobj get $path.about.hints]
     73    set _size [$_owner xml get $path.size]
     74
     75    set hints [$_owner xml get $path.about.hints]
    6976    if {[string length $hints] > 0} {
    7077        itk_component add hints {
     
    8087    eval itk_initialize $args
    8188
    82     set str [$xmlobj get $path.default]
     89    set str [$_owner xml get $path.default]
    8390    if {"" != $str} { value $str }
    8491}
     
    160167# ----------------------------------------------------------------------
    161168itcl::body Rappture::TextEntry::label {} {
    162     set label [$_xmlobj get $_path.about.label]
     169    set label [$_owner xml get $_path.about.label]
    163170    if {"" == $label} {
    164171        set label "String"
     
    176183# ----------------------------------------------------------------------
    177184itcl::body Rappture::TextEntry::tooltip {} {
    178     set str [$_xmlobj get $_path.about.description]
     185    set str [$_owner xml get $_path.about.description]
    179186    return [string trim $str]
    180187}
  • /trunk/gui/scripts/textresult.tcl

    r20 r30  
    5353    $itk_component(text) configure -state disabled
    5454
     55    $itk_component(text) tag configure ERROR -foreground red
     56
    5557    eval itk_initialize $args
    5658}
     
    8385
    8486    if {"" != $dataobj} {
    85         set txt [$dataobj get]
    86         if {"" != $params(-color)} {
    87 #
    88 # ignore color for now -- may use it some day
    89 #
    90 #            $itk_component(text) insert end $txt special
    91 #            $itk_component(text) tag configure special \
    92 #                -foreground $params(-color)
    93             $itk_component(text) insert end $txt
     87        if {[$dataobj element -as type] == "log"} {
     88            # log output -- remove special =RAPPTURE-???=> messages
     89            set message [$dataobj get]
     90            while {[regexp -indices \
     91                       {=RAPPTURE-([a-zA-Z]+)=>([^\n]*)(\n|$)} $message \
     92                        match type mesg]} {
     93
     94                foreach {i0 i1} $match break
     95                set first [string range $message 0 [expr {$i0-1}]]
     96                if {[string length $first] > 0} {
     97                    $itk_component(text) insert end $first
     98                }
     99
     100                foreach {t0 t1} $type break
     101                set type [string range $message $t0 $t1]
     102                foreach {m0 m1} $mesg break
     103                set mesg [string range $message $m0 $m1]
     104                if {[string length $mesg] > 0
     105                       && $type != "RUN" && $type != "PROGRESS"} {
     106                    $itk_component(text) insert end $mesg $type
     107                    $itk_component(text) insert end \n $type
     108                }
     109                set message [string range $message [expr {$i1+1}] end]
     110            }
     111
     112            if {[string length $message] > 0} {
     113                $itk_component(text) insert end $message
     114                if {[$itk_component(text) get end-2char] != "\n"} {
     115                    $itk_component(text) insert end "\n"
     116                }
     117            }
    94118        } else {
    95             $itk_component(text) insert end $txt
     119            # any other string output -- add it directly
     120            $itk_component(text) insert end [$dataobj get]
    96121        }
    97122    }
  • /trunk/gui/scripts/tool.tcl

    r20 r30  
    1616
    1717itcl::class Rappture::Tool {
    18     public variable analyzer ""
     18    inherit Rappture::ControlOwner
    1919
    20     constructor {xmlobj installdir args} { # defined below }
     20    constructor {xmlobj installdir args} {
     21        Rappture::ControlOwner::constructor ""
     22    } { # defined below }
    2123
    2224    public method installdir {} { return $_installdir }
    23     public method xml {args}
    2425
    25     public method load {xmlobj}
    2626    public method run {args}
    2727    public method abort {}
    2828
    29     public method widgetfor {path {widget ""}}
    30     public method changed {path}
    31     public method sync {}
    32     public method tool {}
     29    protected method _output {data}
    3330
    34     private variable _xmlobj ""      ;# XML overall <run> object
    3531    private variable _installdir ""  ;# installation directory for this tool
    36     private variable _path2widget    ;# maps path => widget on this page
    37 
     32    private variable _outputcb ""    ;# callback for tool output
    3833    private common job               ;# array var used for blt::bgexec jobs
    3934}
     
    5752
    5853# ----------------------------------------------------------------------
    59 # USAGE: xml <subcommand> ?<arg> <arg> ...?
    60 # USAGE: xml object
    61 #
    62 # Used by clients to manipulate the underlying XML data for this
    63 # tool.  The <subcommand> can be any operation supported by a
    64 # Rappture::library object.  Clients can also request the XML object
    65 # directly by using the "object" subcommand.
    66 # ----------------------------------------------------------------------
    67 itcl::body Rappture::Tool::xml {args} {
    68     if {"object" == $args} {
    69         return $_xmlobj
    70     }
    71     return [eval $_xmlobj $args]
    72 }
    73 
    74 # ----------------------------------------------------------------------
    75 # USAGE: run ?<path1> <value1> <path2> <value2> ...?
     54# USAGE: run ?<path1> <value1> <path2> <value2> ...? ?-output <callbk>?
    7655#
    7756# This method causes the tool to run.  All widgets are synchronized
     
    7958# created as the input for the run.  That file is fed to the tool
    8059# according to the <tool><command> string, and the job is executed.
     60#
     61# Any "<path> <value>" arguments are used to override the current
     62# settings from the GUI.  This is useful, for example, when filling
     63# in missing simulation results from the analyzer.
     64#
     65# If the -output argument is included, then the next arg is a
     66# callback command for output messages.  Any output that comes in
     67# while the tool is running is sent back to the caller, so the user
     68# can see progress running the tool.
    8169#
    8270# Returns a list of the form {status result}, where status is an
     
    9381
    9482    # if there are any args, use them to override parameters
     83    set _outputcb ""
    9584    foreach {path val} $args {
    96         $_xmlobj put $path.current $val
     85        if {$path == "-output"} {
     86            set _outputcb $val
     87        } else {
     88            $_xmlobj put $path.current $val
     89        }
    9790    }
    9891
     
    116109        set status [catch {eval blt::bgexec \
    117110            ::Rappture::Tool::job(control) \
     111            -onoutput [list [itcl::code $this _output]] \
    118112            -output ::Rappture::Tool::job(output) \
    119113            -error ::Rappture::Tool::job(error) $cmd} result]
     
    154148
    155149# ----------------------------------------------------------------------
    156 # USAGE: widgetfor <path> ?<widget>?
     150# USAGE: _output <data>
    157151#
    158 # Used by embedded widgets such as a Controls panel to register the
    159 # various controls associated with this page.  That way, this Tool
    160 # knows what widgets to look at when syncing itself to the underlying
    161 # XML data.
     152# Used internally to send each bit of output <data> coming from the
     153# tool onto the caller, so the user can see progress.
    162154# ----------------------------------------------------------------------
    163 itcl::body Rappture::Tool::widgetfor {path {widget ""}} {
    164     # if this is a query operation, then look for the path
    165     if {"" == $widget} {
    166         if {[info exists _path2widget($path)]} {
    167             return $_path2widget($path)
    168         }
    169         return ""
    170     }
    171 
    172     # otherwise, associate the path with the given widget
    173     if {[info exists _path2widget($path)]} {
    174         error "$path already associated with widget $_path2widget($path)"
    175     }
    176     set _path2widget($path) $widget
    177 }
    178 
    179 # ----------------------------------------------------------------------
    180 # USAGE: load <xmlobj>
    181 #
    182 # Loads the contents of a Rappture <xmlobj> into the controls
    183 # associated with this tool.
    184 # ----------------------------------------------------------------------
    185 itcl::body Rappture::Tool::load {newobj} {
    186     if {![Rappture::library isvalid $newobj]} {
    187         error "\"$newobj\" is not a Rappture::library"
    188     }
    189 
    190     foreach path [array names _path2widget] {
    191         if {"" != [$newobj element -as type $path.current]} {
    192             set val [$newobj get $path.current]
    193             if {[string length $val] > 0
    194                   || [llength [$newobj children $path.current]] == 0} {
    195                 $_path2widget($path) value $val
    196             } else {
    197                 set obj [$newobj element -as object $path.current]
    198                 $_path2widget($path) value $obj
    199             }
    200         }
     155itcl::body Rappture::Tool::_output {data} {
     156    if {[string length $_outputcb] > 0} {
     157        uplevel #0 [list $_outputcb $data]
    201158    }
    202159}
    203 
    204 # ----------------------------------------------------------------------
    205 # USAGE: changed <path>
    206 #
    207 # Invoked automatically by the various widgets associated with this
    208 # tool whenever their value changes.  If this tool has a -analyzer,
    209 # then it is notified that input has changed, so it can reset itself
    210 # for a new analysis.
    211 # ----------------------------------------------------------------------
    212 itcl::body Rappture::Tool::changed {path} {
    213     if {"" != $analyzer} {
    214         $analyzer reset
    215     }
    216 }
    217 
    218 # ----------------------------------------------------------------------
    219 # USAGE: sync
    220 #
    221 # Used by descendents such as a Controls panel to register the
    222 # various controls associated with this page.  That way, this Tool
    223 # knows what widgets to look at when syncing itself to the underlying
    224 # XML data.
    225 # ----------------------------------------------------------------------
    226 itcl::body Rappture::Tool::sync {} {
    227     foreach path [array names _path2widget] {
    228         $_xmlobj put $path.current [$_path2widget($path) value]
    229     }
    230 }
    231 
    232 # ----------------------------------------------------------------------
    233 # USAGE: tool
    234 #
    235 # Clients use this to figure out which tool is associated with
    236 # this object.  Since this is a tool, it returns itself.
    237 # ----------------------------------------------------------------------
    238 itcl::body Rappture::Tool::tool {} {
    239     return $this
    240 }
  • /trunk/gui/scripts/tooltip.tcl

    r20 r30  
    130130    }
    131131
     132    # if there's no message to show, forget it
     133    if {[string length $mesg] == 0} {
     134        return
     135    }
     136
    132137    # strings can't be too big, or they'll go off screen!
    133138    if {[string length $mesg] > 1000} {
  • /trunk/gui/scripts/xyresult.tcl

    r20 r30  
    277277    # first clear out the widget
    278278    eval $g element delete [$g element names]
    279     $g axis configure y -min "" -max ""
     279    $g axis configure x -min "" -max "" -logscale 0
     280    $g axis configure y -min "" -max "" -logscale 0
    280281
    281282    # extract axis information from the first curve
     
    304305    }
    305306
     307    foreach lim {xmin xmax ymin ymax} {
     308        set limits($lim) ""
     309    }
     310
    306311    # plot all of the curves
    307312    set count 0
    308313    foreach xydata $clist {
    309314        foreach comp [$xydata components] {
     315            catch {unset hints}
     316            array set hints [$xydata hints]
     317
    310318            set xv [$xydata mesh $comp]
    311319            set yv [$xydata values $comp]
     
    314322                set color $_curve2color($xydata)
    315323            } else {
    316                 set color [$xydata hints color]
    317                 if {"" == $color} {
     324                if {[info exists hints(color)]} {
     325                    set color $hints(color)
     326                } else {
    318327                    set color black
    319328                }
     
    341350            set _elem2curve($elem) $xydata
    342351
    343             set label [$xydata hints label]
     352            if {[info exists hints(label)]} {
     353                set label $hints(label)
     354            } else {
     355                set label ""
     356            }
    344357            $g element create $elem -x $xv -y $yv \
    345358                -symbol $sym -pixels 6 -linewidth $lwidth -label $label \
    346359                -color $color -dashes $dashes
    347         }
    348     }
    349 
     360
     361            if {[info exists hints(xscale)] && $hints(xscale) == "log"} {
     362                $g xaxis configure -logscale 1
     363            }
     364            if {[info exists hints(yscale)] && $hints(yscale) == "log"} {
     365                $g yaxis configure -logscale 1
     366            }
     367
     368            # see if there are any hints on limit
     369            foreach lim {xmin xmax ymin ymax} {
     370                if {[info exists hints($lim)] && "" != $hints($lim)} {
     371                    set limits($lim) $hints($lim)
     372                }
     373            }
     374        }
     375    }
     376
     377    # add any limit directives from the curve objects
     378    foreach lim {xmin xmax ymin ymax} var {_xmin _xmax _vmin _vmax} {
     379        if {"" != $limits($lim)} {
     380            set $var $limits($lim)
     381        }
     382    }
    350383    _fixLimits
    351384}
  • /trunk/include/cee/rappture_interface.h

    r20 r30  
    1 // #include <stdio.h>
    2 // #include <assert.h>
    3 // #include <python2.3/Python.h> // "/usr/include/python2.3/Python.h" // 
    4 #include "python2.4/Python.h" // "/usr/include/python2.3/Python.h" // 
     1#include "python2.4/Python.h"
    52
    63/*
  • /trunk/include/core/RpDict.h

    r20 r30  
    312312/*--------------------------------------------------------------------------*/
    313313
    314 #include "../src/RpDict.cc"
     314#include "../../src/core/RpDict.cc"
    315315
    316316#endif
  • /trunk/include/core/RpUnits.h

    r20 r30  
    55#include <errno.h>
    66
    7 // #include "../include/RpDebug.h"
    8 #include "../include/RpDict.h"
    9 #include "../include/RpUnitsStd.h"
    10 // #include "../include/expr_eval_simple.h"
     7#include "RpDict.h"
     8#include "RpUnitsStd.h"
    119
    1210#ifndef _RpUNITS_H
  • /trunk/lib/library.xml

    r20 r30  
    4949    <scale>1.0</scale>
    5050  </atom>
     51  <atom id="Au">
     52    <color>#cccc00</color>
     53    <scale>1.5</scale>
     54  </atom>
     55  <atom id="AU">
     56    <color>#cccc00</color>
     57    <scale>1.5</scale>
     58  </atom>
    5159</elements>
    5260<materials>
  • /trunk/python/Rappture/library.py

    r20 r30  
    165165            # if there's a value, then add it to the node
    166166            if isinstance(value, library):
    167                 node.appendChild(value.node)
     167                node.appendChild(value.node.cloneNode(1))
    168168            elif isinstance(value, minidom.Node):
    169169                node.appendChild(value)
  • /trunk/src/cee/RpUnitsCInterface.cc

    r20 r30  
    1 #include "../include/RpUnits.h"
    2 #include "../include/RpUnitsCInterface.h"
     1#include "RpUnits.h"
     2#include "RpUnitsCInterface.h"
    33
    44#ifdef __cplusplus
  • /trunk/src/cee/rappture_interface.c

    r20 r30  
    1 #include "../include/rappture_interface.h"
     1#include "rappture_interface.h"
    22
    33/**********************************************************************/
     
    102102    PyObject* retVal    = NULL;      /* fxn return value */
    103103
     104    long int fileLength = 0;
     105    char* fileContents = NULL;
     106    FILE* fp = NULL;
     107
    104108
    105109    if (rpObj) {
    106110        if (path) {
    107             // setup our arguments in a Python tuple
    108             args = PyTuple_New(1);
    109             stringarg = PyString_FromString(path);
    110             PyTuple_SetItem(args, 0, stringarg);
    111                    
    112             // call the class ... lib = Rappture.library("...")
    113             lib = PyObject_CallObject(rpObj, args);
    114            
    115             // following line could cause a segfault if used in place of above
    116             // maybe path could == NULL or bad memory
    117             // lib = PyObject_CallFunction(rpObj,"(s)", path);
    118 
    119             if (lib) {
    120                 // return the Rappture instantiation.
    121                 retVal = lib;
     111
     112            fp = fopen(path,"rb");
     113            if (fp) {
     114                fseek(fp, 0, SEEK_END);
     115                fileLength = ftell(fp);
     116                rewind(fp);
     117            }
     118            fileContents = (char*) calloc(fileLength,sizeof(char));
     119
     120            if (fp && fileContents) {
     121                fread((void*)fileContents,sizeof(char),fileLength,fp);
     122                fclose(fp);
     123                fp = NULL;
     124
     125                // setup our arguments in a Python tuple
     126                args = PyTuple_New(1);
     127                stringarg = PyString_FromString(fileContents);
     128               
     129                // clean up used memory
     130                free (fileContents);
     131                fileContents = NULL;
     132               
     133                PyTuple_SetItem(args, 0, stringarg);
     134                       
     135                // call the class ... lib = Rappture.library("...")
     136                lib = PyObject_CallObject(rpObj, args);
     137               
     138                // following line could cause a segfault if used in place of above
     139                // maybe path could == NULL or bad memory
     140                // lib = PyObject_CallFunction(rpObj,"(s)", path);
     141
     142                if (lib) {
     143                    // return the Rappture instantiation.
     144                    retVal = lib;
     145                }
     146                else {
     147                    // lib was not successfully created
     148                }
     149
     150                Py_DECREF(stringarg);
     151                Py_DECREF(args);
    122152            }
    123153            else {
    124                 // lib was not successfully created
    125             }
    126 
    127             Py_DECREF(stringarg);
    128             Py_DECREF(args);
     154                // fp or fileContents were NULL;
     155            }
    129156        }
    130157        else {
  • /trunk/src/core/RpUnits.cc

    r20 r30  
    11 #ifndef _RpUNITS_H
    2      #include "../include/RpUnits.h"
     2     #include "RpUnits.h"
    33 #endif
    44
  • /trunk/src/fortran/RpUnits_fortran.c

    r20 r30  
    33// #include <stdio.h>
    44
    5 #include "../include/RpUnits.h"
    6 #include "../include/RpDict.h"
     5#include "RpUnits.h"
     6#include "RpDict.h"
    77#include "string.h"
    88
  • /trunk/src/fortran/rappture_fortran.c

    r20 r30  
    1 #include "../include/rappture_interface.h"
    2 #include "../include/RpDict.h"
     1#include "rappture_interface.h"
     2#include "RpDict.h"
    33#include <string.h>
    44
     
    324324    }
    325325
    326 
    327326    inFilePath = null_terminate((char*)filePath, filePath_len);
    328327   
     
    333332
    334333    if (rpClass) {
     334
     335
    335336        // create a RapptureIO object and store in dictionary
    336337        lib = createRapptureObj(rpClass, inFilePath);
  • /trunk/tcl/scripts/library.tcl

    r20 r30  
    127127                }
    128128                structure {
     129                    # add this to the return list with the right flavor
     130                    if {$params(-as) == "component"} {
     131                        lappend rlist $cpath
     132                    } else {
     133                        lappend rlist [$xmlobj element -as $params(-as) $cpath]
     134                    }
     135
    129136                    if {[$xmlobj element $cpath.current.parameters] != ""} {
    130137                        lappend queue $cpath.current.parameters
     
    163170    public method get {{path ""}}
    164171    public method put {args}
     172    public method copy {path from args}
    165173    public method remove {{path ""}}
    166174    public method xml {}
     
    169177    public proc value {libobj path}
    170178
     179    public proc path2list {path}
    171180    protected method find {path}
    172     protected method path2list {path}
    173181    protected method node2name {node}
    174182    protected method node2comp {node}
     
    515523    }
    516524    return ""
     525}
     526
     527# ----------------------------------------------------------------------
     528# USAGE: copy <path> from ?<xmlobj>? <path>
     529#
     530# Clients use this to copy the value from one xmlobj/path to another.
     531# If the <xmlobj> is not specified, it is assumed to be the same as
     532# the current object.
     533# ----------------------------------------------------------------------
     534itcl::body Rappture::LibraryObj::copy {path from args} {
     535    if {[llength $args] == 1} {
     536        set xmlobj $this
     537        set fpath [lindex $args 0]
     538    } elseif {[llength $args] == 2} {
     539        set xmlobj [lindex $args 0]
     540        set fpath [lindex $args 1]
     541    } else {
     542        error "wrong # args: should be \"copy path from ?xmlobj? path\""
     543    }
     544    if {$from != "from"} {
     545        error "bad syntax: should be \"copy path from ?xmlobj? path\""
     546    }
     547
     548    if {[llength [$xmlobj children $fpath]] == 0} {
     549        set val [$xmlobj get $fpath]
     550        put $path $val
     551    } else {
     552        set obj [$xmlobj element -as object $fpath]
     553        put $path $obj
     554        itcl::delete object $obj
     555    }
    517556}
    518557
Note: See TracChangeset for help on using the changeset viewer.