next up previous contents
Nächste Seite: Darstellung einer Bindung Aufwärts: Visualisierung Vorherige Seite: Visualisierung   Inhalt


Darstellung eines Atoms

Eine chemische Struktur besteht in der Regel aus Hunderten von Atomen. Jedes Atom wird in einer 3D-Szene durch eine Kugel beschrieben, die sich abhängig vom Elementtyp in Größe und Farbe unterscheidet. Die Darstellung der einzelnen Atome ändert sich jedoch nur geringfügig. Da zudem für jedes Atom spezifische Daten in einem Fenster angezeigt werden sollen, müssen die Daten dem ensprechendem Atom zugeordnet werden. Dies läßt sich mit dem Konzept des Prototypen realisieren, das ideal geeignet ist, um die Atome der einzelnen chemischen Elemente zu beschreiben.

Interface des Atom-Prototypen
<ProtoInterface>
   <field accessType="inputOutput" name="translation"
       type="SFVec3f"/>
   <field accessType="initializeOnly" name="radius"
       type="SFFloat"/>
   <field accessType="inputOutput" name="color"
       type="SFColor"/>
   <field accessType="initializeOnly" name="data"
       type="MFString"/>
   <field accessType="initializeOnly" name="position_field"
       type="SFInt32"/>
   <field accessType="outputOnly" name="data_out"
       type="MFString"/>
   <field accessType="outputOnly" name="name_out"
       type="MFString"/>
   <field accessType="outputOnly" name="position"
       type="SFInt32"/>
   <field accessType="outputOnly" name="button_on"
       type="SFBool"/>
   <field accessType="outputOnly" name="touch_out"
       type="SFBool"/>
</ProtoInterface>

Im Quellcode 7.1 ist das Interface zum Atom-Prototypen zu sehen. Die ersten drei Datenfelder translation, color und radius sind für die eigentliche Darstellung des Atoms verantwortlich. In dem Feld translation wird die genaue Position der Kugel angegeben, die sich aus den Koordinaten des Atoms aus der CML-Datei zusammensetzt. Die Felder color und radius enthalten den Farbwert und den Radius der Kugel. Die restlichen Datenfelder sind für die Kommunikation unter den 3D-Objekten zuständig, wobei nur die Felder data und position_field bei der Instanziierung initialisiert werden. Das Feld data enthält alle näheren Informationen aus der PDB-Datei, wie z.B. AtomId, KettenId oder die einzelnen Koordinatenangaben. Durch das Feld position_field können die allgemeinen Informationen des Elements, wie z.B. der kovalenter Radius, der EN-Wert oder die Ordnungszahl, bestimmt werden. Den restlichen Feldern werden erst beim Klicken auf das Atom durch ein Script, das im Prototypen definiert ist, Werte zugewiesen. Dies wird am Ende dieses Abschnittes näher betrachtet.

Body des Atom-Prototypen
<ProtoBody>
   <Transform>
      <IS>
         <connect nodeField="translation"
             protoField="translation"/>
      </IS>
      <Shape>
         <Sphere>
            <IS>
               <connect nodeField="radius" 
                   protoField="radius"/>
            </IS>
         </Sphere>
         <Appearance>
            <Material>
               <IS>
                  <connect nodeField="diffuseColor"
                      protoField="color"/>
               </IS>
            </Material>
         </Appearance>
      </Shape>
      <TouchSensor DEF="s_touch">
         <IS>
            <connect nodeField="isActive"
                protoField="touch_out"/>
         </IS>
      </TouchSensor>
   </Transform>
   <Script DEF="atom_script">
        :
        :
   </Script>
   <ROUTE fromField="isActive" fromNode="s_touch" 
      toField="input" toNode="atom_script"/>
</ProtoBody>

Im Quellcode 7.2 ist der ProtoBody des Atom-Prototypen zusehen. Eingebettet im Transform-Knoten ist die eigentliche Darstellung eines Atoms. Durch die jeweiligen connect-Knoten werden die Datenfelder der Protoinstanz mit den Datenfeldern der entsprechenden Knoten verbunden. Dadurch werden die Werte, die bei der Instanziierung angegebenen wurden, den entsprechenden Knotenfeldern übergeben. Nur beim TouchSensor verläuft der Datenfluß genau andersherum. Hier initialisiert das ausgehende Ereignis des Knotenfeldes isActive das Prototypenfeld touch_out und erzeugt somit ebenfalls ein ausgehendes Ereignis. Zusätzlich wird durch das Klicken auf das Atom ein Ereignis ausgelöst, das an den Script-Knoten gesendet wird. Dadurch werden dann den Datenfeldern, die für die Kommunikation mit den anderen Objekten der 3D-Szene verantwortlich sind, neue Werte zugewiesen. Durch die Wertzuweisung werden automatisch Ereignisse erzeugt, die von den anderen Objekten der Szene aufgenommen und verarbeitet werden. Die komplette Kommunikation zwischen den Objekten wird im Abschnitt 7.1.4 genauer beschrieben. Folgende Aktionen werden durch den Script-Knoten, der im Quellcode 7.3 abgebildet ist, ausgelöst.

1.
Das Feld data_out wird mit den Daten, die im Feld data angegeben wurden, gefüllt.
2.
Dem Feld name_out wird der Name des Atoms zugewiesen.
3.
Der Inhalt des Feldes position wird mit den Daten des Feldes position_field gefüllt.
4.
Das Feld button_on erhält den Wert true.

Script des Atom-Prototypen
<Script DEF="atom_script">
   <field accessType="inputOnly" name="input"
      type="SFBool"/>
   <field accessType="initializeOnly" name="data"
      type="MFString"/>
   <field accessType="initializeOnly" name="position_field"
      type="SFInt32"/>
   <field accessType="outputOnly" name="name_out"
      type="MFString"/>
   <field accessType="outputOnly" name="data_out"
      type="MFString"/>
   <field accessType="outputOnly" name="position"
      type="SFInt32"/>
   <field accessType="outputOnly" name="button_on"
      type="SFBool"/>
   <IS>
      <connect nodeField="data" protoField="data"/>
      <connect nodeField="data_out" protoField="data_out"/>
      <connect nodeField="name_out" protoField="name_out"/>
      <connect nodeField="position" protoField="position"/>
      <connect nodeField="button_on" protoField="button_on"/>
      <connect nodeField="position_field" 
         protoField="position_field"/>
   </IS>
   <![CDATA[javascript:
      function input(value) { if(value){
      position = position_field; button_on = true;
      name_out[0] = data[9]; data_out[0] = data[0];
      data_out[1] = data[1]; data_out[2] = data[2];
      data_out[3] = data[3]; data_out[4] = data[4];
      data_out[5] = data[5]; data_out[6] = data[6];
      data_out[7] = data[7]; data_out[8] = data[8];}}
   ]]>
</Script>


next up previous contents
Nächste Seite: Darstellung einer Bindung Aufwärts: Visualisierung Vorherige Seite: Visualisierung   Inhalt
Oliver Krone 2003-04-28