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.