WaBis

walter.bislins.ch

CP-Anwendung: UnitRef, MultRef

Anwendungen : ValueSlider | UnitRef/MultRef | ConnectDom

Im folgenden Beispiel wird für die blau gefärbten Felder die Einheit und der Multiplikator per Referenz UnitsRef und MultRef aus dem Modell gelesen, statt fest dem Feld zugewiesen. Dadurch kann durch Wahl der Einheiten über die Radio-Buttons der Wert in den blauen Feldern in verschiedenen Einheiten dargestellt werden.

Für eine Beschreibung des Beispiels siehe Raketenflug Einstein gegen Newton.

Beispiel

Wähle mit den Radio-Buttons eine Einheit und beachte, wie sich die Werte und Einheiten der blauen Felder entsprechend verändern:

Prinzip

Das Modell rechnet immer in den SI-Einheiten Meter und Sekunden. Im Modell sind Umrechnungsfaktoren und Einheiten-Tabellen gespeichert:

function NewtonEinstein() {
  :

  this.TimeUnits = [
    'Jahre', 'Monate', 'Tage', 'h', 'min', 's' ];

  this.LengthUnits = [
    'Lj', 'Lmon', 'Ltg', 'Lh', 'Lmin', 'Ls', 'AE', 'pc', 'km' ];

  this.TimeMults = [
    31556925.261,    // Jahre -> s (365.24219052083 * 1Tg = Tropisches- bzw. Kalenderjahr)
     2629743.77175,  // Mon -> s (Jahre/12)
       86400,        // Tg -> s (24 * 60 * 60s)
        3600,        // h -> s (60 * 60s)
          60,        // min -> s
           1
  ];

  this.LengthMults = [
    9460730472580800,   // Lj -> m (Definition nach Wikipedia: 365.25 * 1Lt, julianisches Jahr = 365.25 Tg)
     788394206048400,   // Lm -> m (Lj / 12)
      25902068371200,   // Lt -> m (24 * 60 * 60Ls)
       1079252848800,   // Lh -> m (60 * 60Ls)
         17987547480,   // Lmin -> m (60Ls)
           299792458,   // Ls -> m
        149597870700,   // AE -> m (Wikipedia)
   30856775812815000,   // pc -> m (Wikipedia, ca. 3.26Lj)
                1000    // km -> m
  ];

}

Modell-Properties enthalten die jeweils per Radio-Button gewählte aktuelle Unit und den entsprechenden Multiplikator:

  this.TimeUnit = '';    // 1 = 'Y', 2 = 'M', 3 = 'D', 4 = 'h', 5 = 'm', 6 = 's'
  this.LengthUnit = '';  // 1 = 'LY', 2 = 'LM', 'LD', 'Lh', 'Lm', 'Ls', 'AE', 'pc', 9 = 'km'
  this.TimeMult = 1;
  this.LengthMult = 1;

Die Properties UnitsRef und MultRef der Text-Felder verweisen auf diese Modell-Properties:

} ).AddTextField( { 
  Name: 'T', 
  UnitsRef: 'TimeUnit', 
  MultRef: 'TimeMult' 

} ).AddTextField( { 
  Name: 'd', 
  UnitsRef: 'LengthUnit', 
  MultRef: 'LengthMult' 

} )...

Damit werden die Modellwerte vor dem Anzeigen im Textfeld automatisch mit dem gewählten Unit-Faktor umgerechnet.

Wenn eine Einheit per Radio-Button gewählt wird, wird im Modell in den Tabellen der entsprechende Mult-Faktor und die entsprechende Unit gesucht und in den Modell-Properties TimeUnit, TimeMult bzw. LengthUnit und LengthMult gespeichert. Das ist schon alles. Die Werte und Units der betroffenen Felder werden automatisch über die UpdateGui() Funktion nachgeführt.

Code

Siehe auch NewtonEinstein.js

<link rel="stylesheet" type="text/css" href="ControlPanelStyles.css" media="all">
<script src="ControlPanelX.js" type="text/javascript"></script>
<script src="NewtonEinstein.js" type="text/javascript"></script>

<style>
#ControlPanel2 .FieldGrid { width: 100%; }
</style>

<script>

NumFormatter.MaxDigits = 15;

var ne = new NewtonEinstein();

function Compute() {
  ne.Compute();
  ControlPanels.Update();
}

function Reset() {
  ControlPanels.Reset();
  Compute();
}

ControlPanel.NewPanel( { 
  Name: 'ControlPanel1',
  ModelRef: 'ne', 
  NCols: 2, 
  PanelFormat: 'MathLabels InputLongWidth', 
  Format: 'std', 
  Digits: 12, 
  OnModelChange: Compute 

} ).AddHeader( 

).AddHeader( { 
  Text: 'Reisedaten' 

} ).AddHeader( 

).AddHeader( { 
  Text: ControlPanels.ResetButtonR() 

} ).AddTextField( { 
  Name: 'd', 
  UnitsRef: 'LengthUnit', 
  MultRef: 'LengthMult' 

} ).AddTextField( { 
  Name: 'a', 
  Units: 'm/s<sup>2</sup>' 

} ).Render();

ControlPanels.NewPanel( { 
  Name: 'ControlPanel2',
  ModelRef: 'ne', 
  NCols: 2, 
  PanelFormat: 'MathLabels InputLongWidth', 
  ReadOnly: true, 
  Format: 'std', 
  Digits: 12, 
  OnModelChange: Compute 

} ).AddHeader( 

).AddHeader( { 
  Text: 'Einheiten und Konstanten', 
  ColSpan: 3 

} ).AddRadiobuttonField( { 
  Name: 'LengthUnitNum', 
  ValueType: 'int', 
  Label: 'Längen', 
  NCols: 3, 
  Items: [
    { Name: 'Lj', Value: '0' },
    { Name: 'Lmon', Value: '1' },
    { Name: 'Ltg', Value: '2' },
    { Name: 'Lh', Value: '3' },
    { Name: 'Lmin', Value: '4' },
    { Name: 'Ls', Value: '5' },
    { Name: 'AE', Value: '6' },
    { Name: 'pc', Value: '7' },
    { Name: 'km', Value: '8' },
  ]

} ).AddRadiobuttonField( { 
  Name: 'TimeUnitNum', 
  ValueType: 'int', 
  Label: 'Zeiten', 
  NCols: 3, 
  Items: [
    { Name: 'Jahre', Value: '0' },
    { Name: 'Monate', Value: '1' },
    { Name: 'Tage', Value: '2' },
    { Name: 'h', Value: '3' },
    { Name: 'min', Value: '4' },
    { Name: 's', Value: '5' }
  ] 

} ).AddTextField( { 
  Name: 'LengthMult', 
  Label: '-', 
  UnitsRef: 'LengthMeterPerUnit' 

} ).AddTextField( { 
  Name: 'TimeMult', 
  Label: '-', 
  UnitsRef: 'TimeSecPerUnit' 

} ).AddTextField( { 
  Name: 'Lj', 
  Label: '1 Lj =', 
  Mult: 1000, 
  Units: 'km' 

} ).AddTextField( { 
  Name: 'Year', 
  Label: '1 Jahr =', 
  Units: 's' 

} ).AddTextField( { 
  Name: 'c', 
  Label: 'c =', 
  Units: 'm/s' 

} ).Render();

ControlPanels.NewPanel( { 
  Name: 'ControlPanel3',
  ModelRef: 'ne', 
  NCols: 2, 
  ReadOnly: true, 
  Format: 'std', 
  Digits: 12, 
  TableFormat: 'MathLabels InputLongWidth' 

} ).AddHeader( 

).AddHeader( { 
  Text: 'Newton' 

} ).AddHeader( 

).AddHeader( { 
  Text: 'Einstein' 

} ).AddTextField( { 
  Name: 'TN',
  Label: 'T', 
  UnitsRef: 'TimeUnit', 
  MultRef: 'TimeMult' 

} ).AddTextField( { 
  Name: 'TE', 
  Label: 'T', 
  UnitsRef: 'TimeUnit', 
  MultRef: 'TimeMult' 

} ).AddTextField( { 
  Name: 'TauN', 
  Label: '&tau;', 
  UnitsRef: 'TimeUnit', 
  MultRef: 'TimeMult' 

} ).AddTextField( { 
  Name: 'TauE', 
  Label: '&tau;', 
  UnitsRef: 'TimeUnit', 
  MultRef: 'TimeMult' 

} ).AddTextField( { 
  Name: 'DN', 
  Label: 'd', 
  ValueRef: 'd', 
  UnitsRef: 'LengthUnit', 
  MultRef: 'LengthMult' 

} ).AddTextField( { 
  Name: 'DE', 
  Label: 'd', 
  ValueRef: 'd', 
  UnitsRef: 'LengthUnit', 
  MultRef: 'LengthMult' 

} ).AddTextField( { 
  Name: 'SN', 
  Label: 'S', 
  UnitsRef: 'LengthUnit', 
  MultRef: 'LengthMult' 

} ).AddTextField( { 
  Name: 'SE', 
  Label: 'S', 
  UnitsRef: 'LengthUnit', 
  MultRef: 'LengthMult' 

} ).AddTextField( { 
  Name: 'VN', 
  Label: 'V', 
  Units: 'c', 
  Mult: ne.c 

} ).AddTextField( { 
  Name: 'VE', 
  Label: 'V', 
  Units: 'c', 
  Mult: ne.c, 
  Format: 'fix0', 
  Digits: 15 

} ).AddTextField( { 
  Name: 'AN', 
  Label: 'A', 
  Units: 'm/s<sup>2</sup>' 

} ).AddTextField( { 
  Name: 'AE', 
  Label: 'A', 
  Units: 'm/s<sup>2</sup>' 

} ).AddTextField( { 
  Name: 'DTN', 
  Label: '&Delta;&tau;' 

} ).AddTextField( { 
  Name: 'DTE', 
  Label: '&Delta;&tau;' 

} ).AddTextField( { 
  Name: 'DSN', 
  Label: '&Delta;S' 

} ).AddTextField( { 
  Name: 'DSE', 
  Label: '&Delta;S' 

} ).Render();

xOnLoad( Compute );

</script>

Weitere Infos zur Seite
Erzeugt Sonntag, 7. August 2016
von wabis
Zum Seitenanfang
Geändert Freitag, 18. November 2016
von wabis