Interactive Simulation

Interactive Simulation ist ein Sonderfall in einer RealTime Simulation. Interactive Simu
ist nichts anderes als die Änderbarkeit von Bauelemente-Parametern während einer
Simu-Session mittels Mouse-Aktionen. Die Simulation reagiert dann natürlich sofort
auf solche Aktionen.

Interactive Simulation mit Interaktiven Elementen

Interactive Elements sind externe Elemente, denen die Ausführbarkeit von Mouse-Aktionen
schon eingebaut ist (spezieller Script-Block).

Schauen wir uns die Schaltung DocSamples\Real Time Circuits\Test_Poti.circ an:

SW1 kann durch einen linken Mouse-Klick auf die obere bzw. untere Hälfte des Bitmaps umgeschaltet
werden. Der Schleifer des Potis R1 kann mittels linken Mouse-Klick oder durch Ziehen mit der
linken Mouse-Taste bewegt werden. Der Parameter Div wird daraufhin entsprechend geändert.
Interaktive Elemente sind in der Regel auch optische Elemente (um die Reaktion sichtbar zu machen).
Es funktioniert aber auch mit normalen Elementen.

Wir schauen uns die wesentlichen Teile des Poti-Scripts (Poti.selfdef) an:

#MBitmap = Poti_Simple.aombmp
#AutoComment = <R>Ohm\n<Div>
#Token = R

#Parameter
Div = Poti Div (0...1), 0.5
R = Resist (Ohm), 10k
#End

#VarsAndConstants
R1 = Div*R
R2 = R - R1
G1 = 1/(R1+0.0001)
G2 = 1/(R2+0.0001)
#End

#Volts
uR1 = u1 - u3
uR2 = u2 - u3
#End

#LaplaceCurrents
i1 = G1*uR1
i2 = G2*uR2
<i3 = -(i1+i2)>
#End

#DefineOpticalBehavior
OMBitmap.Div = Div
#End

#DefineInteractiveActions
act1 = MOUSE_LEFT, RECT(0,0, OMBitmap.Width, OMBitmap.Height), Div = fmax(fmin((mouse.y - 13)/38, 1), 0) 
#End

Wie man sieht, handelt es sich hier auch um ein optisches Element. Die Input-Variable Div (0...1) fürs AOMBitmap
wird zugewiesen.
Um das Element Interactive zu machen, ist einfach der Block #DefineInteractiveActions in den Script einzufügen.
Auf der linken Seite steht das Symbol für die Aktion, auf der rechten Seite müssen sich folgende Eintragungen
(mit Komma getrennt) befinden:

<Action-Type>, <Action-Rectangle>, <ParamVar> = <Function(mouse.x, mouse.y)>

Action-Type
Zur Zeit möglich: MOUSE_LEFT für linke Mouse-Taste, MOUSE_RIGHT für rechte Mouse-Taste.

Action-Rectangle
Ist der rechteckige Bereich des Bitmaps, wo das Element für diese Aktion empfänglich sein soll. Hier kann man
die vordefinierten Konstanten OMBitmap.Width für die Breite und OMBitmap.Height für die Höhe des Bitmaps
verwenden.

ParamVar = Function(mouse.y, mouse.y)
Auf der linken Seite steht das Symbol des Parameters der durch diese Aktion geändert werden soll.
Auf der rechten Seite steht im Allgemeinen eine Formel, welche die Variable mouse.x sowie mouse.y enthalten
kann. Diese Variable geben die Mouse-Position in Bezug zur linken oberen Ecke des Bitmaps während der
aktuellen Aktion an.
In diesem Beispiel wird dem Parameter Div ein Wert zwischen 0 und 1, abhängig von der Y-Position des Mouse-
Zeigers zugewiesen. Dabei ist 13 die Y-Position des Widerstands-Rechtecks und 38 die Länge dieses Rechtecks.
Die fmin und fmax-Funktion führen eine Begrenzung auf 0 bzw. 1 durch.

Es können auch zwei und mehr Aktionen definiert werden. Ein weiteres Beispiel für ein Interactive Element ist
der Umschalter (siehe: ToggleSwitch.selfdef).

Interactive Simulation mit Interaktiven Variablen

Eine weitere Möglichkeit für Interactive Simulation sind sogenannte Interactive Vars. Diese funktionieren
praktisch genauso wie Circuit Vars, nur das CircuitVars eine Zeitfunktion zugewiesen wird, während Interactive
Vars
per Tastatur/Mouse-Aktionen gesteuert werden. Analog geschieht Dies durch Festlegung eines
TokenRefParameters für jede Variable.

Schauen wir uns die Schaltung DocSamples\Real Time Circuits\LCSerial_with_InteractiveVars.circ an:

Nach Ausführen von Start Dyna wird für jede aktuell festgelegte und aktivierte InteractiveVar ein Dialog geöffnet, der
es erlaubt den entsprechenden TokenRefParameter während der Simu-Session interaktiv zu ändern. Das geschieht indem
man einen diskreten Wert mittels Mouse-Klick  (obere Hälfte) oder mit der Move-Bar (untere Hälfte) einen fließenden Wert
auswählt. Ich glaube das ist selbsterklärend. Hier wurden die TokenRefParameter Sig1.freq, C1.C und L1.L als Interaktive
Variable festgelegt.
Das gelbe Feld ist ein rechnender Comment, der immer die aktuelle Resonanzfrequenz anzeigt.

Eine InteractiveVar wird praktisch gebauso festgelegt wie eine CircuitVar. Man ruft über Menue:Settings / Edit InteractiveVars
den InteractiveVars-Dialog auf:

Mit dem Add-Button erzeugt man eine neue Variable (Zeile) und gibt nun händisch das Symbol (TokenRefParameter-Symbol),
die Einheit sowie eine Beschreibung an. Schon vorhandene Variable können natürlich editiert werden. Im Feld Active kann
außerdem eine Variable mal schnell aktiviert/deaktiviert werden.
Klickt man mit der rechten Maus-Taste auf die gewünschte Zeile (Variable) öffnet der SetInteractiveVar-Dialog. Das ist
der selbe Dialog, der auch nach dem Start der Dyna (wie oben zu sehen) für jede Variable geöffnet wird. Hier kann man
Voreinstellungen vornehmen, muß man aber nicht, da man auch während der Simu-Session (wie oben schon erläutert)
Einstellungen ändern kann. Deaktivierte Variable werden natürlich nicht bei einer Simu-Session geöffnet.

Analog zu den Circuit-Variablen gibt es noch eine elegantere Verfahrenweise eine InteractiveVar anzulegen:
Man ruft den Parameter-Dialog des gewünschten Elements auf (rechter Maus-Klick auf das Element). Dann öffnet man
mittels rechten Maus-Klick auf den gewünschten Parameter ein Kontext-Menue. Dort wählt man nun die Funktion 
Add Edit (to) InteractiveVars aus, und der oben beschriebene InteractiveVars-Dialog wird geöffnet. Das Anlegen (wenn noch
nicht vorhanden) und die notwendigen Eintragungen werden dann automatisch von ToneCirc vorgenommen.

Parameter-Dialog mit Kontext-Menue:

Selbstverständlich werden alle Einstellungen und Dialog-Fenster-Positionen beim Speichern des Dokuments festgehalten.

Zurück zur Hauptseite