Scripting in C#, Dokumentation

e:cue Forum Foren Deutsche Diskussionsforen SYMPHOLIGHT (D) Scripting in C#, Dokumentation

Schlagwörter: 

Ansicht von 13 Antwort-Themen
  • Autor
    Beiträge
    • #219076
      m.holzhauer
      Teilnehmer

      Hallo,

      im Manual (Sympholight 2.1) finde ich dazu drei Aussagen:
      1) “Use the standard C# and .NET documentation to learn more about C#.”
      2) Press Ctrl + Space to get a list of objects, methods and devices.
      3) “Examples and more details will follow in a later release of this manual.”

      zu 1)
      Ich fände super, wenn die “Standard-Dokumentation” auch im Manual verlinkt würde.
      An die Authoren des Manuals: Meine Ihr diese[/url] hier?
      Oder hat noch jemand einen Tip für eine schlanke Dokumentation?

      zu 2)
      Besser als nichts. Zum Arbeiten durchaus hilfreich, aber sehr unübersichtlich, um einen Einstieg zu finden.
      Aus meiner Sicht ist das kein Ersatz für eine Referenz.

      zu 3)
      Kann dazu jemand einen Zeitraum und den Umfang in Aussicht stellen?

      Beispiele sind ja schön und gut, was mit aber fehlt, ist zumindest eine vollständige Beschreibung aller Objekte, die speziell von Sympholight zur Verfügung stehen, incl. Syntax, Eigenschaften, Methoden und Events. – Gibt es dazu etwas?

      Auch würde mich interessieren, was sich hinter der Library, bzw. dem Namespace “Scripting” verbirgt. – Liegt das irgendwo als Datei vor?

      Habe ich irgendwas übersehen?
      Danke und Grüße
      Martin

    • #228388
      Christoph Paduch
      Moderator

      Hallo Martin,

      zu 1):
      Die Programmiersprache C# ist ein Produkt der Firma Microsoft. Der Vorteil, eine existierende Sprache zu nutzen liegt darin, dass entsprechend viel Dokumentation und Lehrbücher verfügbar sind. Der Verweis auf das C# Programmierhandbuch
      https://docs.microsoft.com/de-de/dotnet/csharp/programming-guide/ ist da sehr hilfreich. Denkbar sind aber auch andere, die einfach durch die Suche mit dem Browser gefunden warden können. Deshalb verlinke ich mal auf ein Forum, wo jemand ein C# Buch sucht…
      https://social.msdn.microsoft.com/Forums/de-DE/ddd40050-4b92-4cdc-8a91-12bd0a20c60b/lehrbuch-fr-c?forum=visualcsharpde
      Mit diesem Link ist die komplette Visual C# Dokumentation erreichbar: https://msdn.microsoft.com/de-de/library/kx37x362.aspx.
      Hier findest Du erste Schritte, das Handbuch, eine Sprachreferenz (Syntax) und Beispiele.
      Dann fehlt da noch das .Net Framework. Dies ist eine riesige Bibliothek, die mir sehr viel Programmierarbeit abnehmen kann: https://docs.microsoft.com/de-de/dotnet/ .Net wird auch in der Scripting Engine unterstützt.
      Scripting in C# mit SYMPHOLIGHT unterliegt einigen Einschränkungen. Diese wiederum haben wir im SYMPHOLIGHT Handbuch erläutert, über den Shortcut erreichbar.

      zu 2 und 3):
      Das Thema Referenz der eigenen Klassen und Objekte (Methoden, Parameter,…) nehme ich mal auf und gebe es im Haus weiter.

      zu 3):
      Bei jedem Release bemühen wir uns, auch die Dokumentation der Software zu verbessern. Diesen Punkt werde ich auch weitergeben.
      Zu Zeitraum und Umfang habe ich derzeit leider auch keine Informationen.

      Der Namespace Scripting enthält die SYMPHOLIGHT Klassen, APIs und Methoden und gibt dem Anwender Zugriff auf diese. Die Datei ContentClasses.xml im Installationsverzeichnis bietet dazu einiges an Information.

      Ich hoffe, das hilft.

      Grüße
      Christoph


      Kind regards / Freundliche Grüße
      Christoph Paduch

    • #228389
      AudioWerft
      Teilnehmer

      Zum Thema C# – letztlich werden ja die Scripte in Blöcken für den Workflow-Designer dargestellt.

      Das im Manual gezeigte UDP-Script ist ja schonmal ein schöner Ausgangspunkt für erste Schritte – wie bringe ich dieses dazu, mehrere Ja/Nein Ausgänge am Block anzuzeigen?

      Anwendung z.B. um den Text den man per UDP empfängt zu analysieren, und dann den Passenden Ausgang zu triggern:
      Inputtext “A” => Output A = true
      Inputtext “B” => Output B = true

      Ich würde mich sehr über ein paar weitere Beispielscripte freuen

    • #228391
      bkruse
      Teilnehmer

      Hallo,

      in der Regel übernimmt das Script direkt ja die zu tätigende Handlung.
      Soll z.B. eine Sequence gestartet werden, könnte dies so aussehen.

      public static void Run(string input)
      {
      Logger.Info(“Input is: ” + input);

      Sequence seq;
      if (input.Equals(“asdf”))
      {
      seq = ContentObjectAccessor.GetObject(“Sequence_1”) as Sequence;
      seq.Start();
      }

      if (input.Equals(“jklö”))
      {
      seq = ContentObjectAccessor.GetObject(“Sequence_2”) as Sequence;
      seq.Start();
      }
      }

      Mehrere “returns” kann ein Script nicht haben, allerdings können natürlich verschiedene Werte zurückgegeben werden. Also wenn das Script als return einen string zurück gibt, kann dieser natürlich die Werte ‘A’ oder ‘B’ oder auch “ich bin ein String” haben.

      hoffe das hilft,
      Björn

    • #228397
      AudioWerft
      Teilnehmer

      Bei dem Scriptbeispiel bekomme ich immer die Fehlermeldung “Exception occured while executing script Tester: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.”
      Der Punkt “Debug 1” wird noch sauber ausgeführt, die Zeile seq = …. offenbar nicht mehr.

      Die Sequenz “gbgevi” existiert exakt in dieser Schreibweise (natürlich ohne Anführungszeichen, zusätzliche Leerzeichen usw).
      Die Software befindet sich im Modus “Full Version” (Sowohl Enterprise-Dongle als auch SYMPL Core S vorhanden).

      using System;
      using Scripting;

      public static class Tester
      {
      public static void Run()
      {
      Sequence seq;
      Logger.Info(“Debug 1”);
      seq = ContentObjectAccessor.GetObject(“gbgevi”) as Sequence;
      Logger.Info(“Debug 2”);
      seq.Start();
      Logger.Info(“Debug 3”);
      }
      }

    • #228398
      bkruse
      Teilnehmer

      Hallo,

      der “Identifier” der Sequence muss dann den Wert “gbgevi” haben.
      Im Fenster (rechts unten üblicher weise) der Sequence Properties gibt es wenige Toolbar Buttons, einer davon schaltet einige der Properties (so auch den “Identifier” erst sichtbar).

      Hilft das?
      Grüße, Björn

    • #228399
      AudioWerft
      Teilnehmer

      Danke, das war der Fehler. Hierzu gleich eine kleinere Bugmeldung:
      Wenn man die Sequenz wechselt, solange der Cursor noch im Feld des soeben geänderten Identifiers steht, wird diese Änderung verworfen. Auch ein einfaches betätigen der Enter-Taste reicht hier nicht aus. Clickt man hingegen vor dem wechsel in ein beliebiges anderes Feld ist die Änderung gespeichert.

      Darüber hinaus würde ich empfehlen, die Voreinstellung des Filterknopfes der Eigenschaftsfelder auf “Alle anzeigen” zu lassen.

    • #228400
      AudioWerft
      Teilnehmer

      Weitere Frage zu Sequenzen:

      Ich vermute Sequence.PlaybackState ist die passende Methode, um herauszufinden, ob eine Sequenz derzeit läuft/passiert usw. – wie kann ich diese korrekt auslesen? Ich habe float, bool, string, long ausprobiert:
      z.B.
      float x;
      x = seq.PlaybackState; oder
      x = seq.PlaybackState();

      Gibt es evtl. irgendeine rudimentäre Dokumentation der Sympholight-eigenen Methoden/Variablen ?
      Die genannte Datei ContentClasses.xml scheint bei mir weder im Installationsverzeichnis noch sonst auf der Platte vorhanden zu sein (System- und versteckte Dateien eingeschlossen)

    • #228401
      bkruse
      Teilnehmer

      Hallo,

      das ist eine enumeration vom typ PlaybackState, die momentan im Scripting leider nicht verfügbar ist.
      Dies habe ich schon in unser bug tracking system eingetragen.

      Der einzige Weg dies momentan ins scripting zu bekommen, ist wohl die einzelnen Ausgänge des Sequence Basic Block (Started, Stopped, Resume, etc.) über einzelne Constant Value Blöcke in ein Script zu leiten.

      Wir arbeiten momentan an der Dokumentation, ich frage mal nach ob ich hier einen aktuellen Zwischenstand benennen kann.

      Grüße, Björn

    • #228402
      Christoph Paduch
      Moderator

      Um darauf zurückzukommen, es kommt darauf an, was in der “Run(..)” Methode definiert wird:

      – Kein Schlüsselwort erzeugt einen Eingang.
      – Das Schlüsselwort out erzeugt einen Ausgang.
      – Das Schlüsselwort ref erzeugt Ein- und Ausgang.


      using System;
      using Scripting;

      public static class Script1
      {
      public static String Run(int x, out int y, bool a, out bool b)
      {
      y=0;
      b=true;
      return “test”;
      }
      }

      Da haben wir dann 3 Ausgänge (return, y und b) siehe Bild.

      Grüße
      Christoph


      Kind regards / Freundliche Grüße
      Christoph Paduch

    • #228403
      AudioWerft
      Teilnehmer

      Wie kann ich im Scripting Trigger-In und Outputs hinzufügen?

    • #228404
      Christoph Paduch
      Moderator

      Hallo,

      ein Trigger In mit Namen “Run Script” ist vorhanden. Mehrere, die das gleiche tun, machen hier idR. keinen Sinn.
      Es müssen halt alle Events darauf geleitet werden.
      Will ich die Trigger als Zustände auswerten, geht das über den Umweg bool.
      Trigger Out gibt es nicht, da dies nicht über eine C# Methode abgebildet werden kann.
      Abhilfe schafft auch hier der Umweg über bool.
      Es müssen dann entsprechend bool Ein- oder Ausgänge in der Parameterliste definiert werden.
      Am bool Eingang des Scripts übernimmt ein Constant Value Block mit “Is event based” gecheckt und dem Wert “true” am Ausgang die Übersetzung von Trigger in bool.
      Am bool Ausgang des Scripts kann z.B. ein Bool Changed Block angehängt warden. Dieser macht aus dem Bool dann wieder Trigger Signale.

      Das Script:

      using System;
      using Scripting;

      public static class Script1
      {
      public static String Run(bool TriggerIn, ref int InOut, out bool Trigger, out bool Trigger2)
      {
      // it is just, that the compiler won’t complain
      Trigger = true;
      Trigger2 = false;
      return “”;
      }
      }

      Hoffe, das hilft.

      Christoph


      Kind regards / Freundliche Grüße
      Christoph Paduch

    • #245654
      Sven Kreienkamp
      Teilnehmer

      Hallo,

      Ich habe eine Frage zum Thema Scripting in Sympholight.
      Leider bin ich absoluter Anfänger was das Thema Scripting angeht.

      Für einen Kunden soll ich eine Show Programmieren, die ca. 20 verschiedene Lichtszenen in zufälliger Reihenfolge abspielt.

      Da ich, wie schon gesagt, totaler Anfänger bin, würde ich mich über Hilfe freuen um das Notwendige Script zu erstellen.

      Danke, Sven

      • #245655
        Sven Kreienkamp
        Teilnehmer

        In der LAS 7.0 hatte ich so etwas bereits ein mal umgesetzt.
        Jedoch funktioniert es in Sympholight so nicht.

        // random Play script comment

        int actual = CuelistMutexGetStatus(1);
        int rnd = actual;

        while (rnd == actual)
        { rnd = random(12)+12;
        }
        StartCuelist(rnd);

    • #245656
      Christoph Paduch
      Moderator

      Hallo Sven,
      für Scripting benötigst Du Erfahrung bzw. zumindest Wissen über die Programmierung in C#.

      Ein großer Fehlerquell ist die Syntax, die unbedingt eingehalten werden muss.
      Ein anderer ist das Wissen, wie ich eine Aufgabe mit einer Programmiersprache löse.
      In diesen Punkten können wir keine Unterstützung leisten.

      Die Skripte startest Du über den Workflow.
      Die Skripte sollst Du so schreiben, dass diese aufgerufen werden, eine nur kurze Laufzeit haben, um nach Beendigung die Kontrolle wieder an den Workflow zu übergeben.

      In Deinem Fall schlage ich vor (Ich habe SYMPHOLIGHT V3.0 Service Release 3 verwendet):

      Vorbereitung:
      Da die Mutex-Group keine Rückmeldung liefert, setze Triggerpunkte an das Ende des Inhaltes jeder Sequenz.
      Die Triggerpunkte triggern dann das Skript im Workflow. Alle Sequenzen sind in der gleichen Mutex-Group.
      Im Workflow Designer erstellst Du einen “Mutex Group” Block, den Du unter “Sequence Controls” findest.

      Skript:
      – Ermitteln einer Zufallszahl
      – übergebe den Wert der vorhandenen Sequenzen in der Mutex-Group.
      – Das Ergebnis gibst Du als int zurück.

      Nachbereitung:
      Den Rückgabewert des Skriptes verbindest Du an den Index-Wert des Mutex-Group Blocks.

      Soll das Ganze von selber starten, fügst du noch einen “Show Initialized” Block hinzu, der auch das Skript startet.

      Beispiele für ein Skript, gibt es z.B. bei stackoverflow.com
      Gerade für Neulinge sehr interessant.

      Hier z.B. aus https://stackoverflow.com/questions/2706500/how-do-i-generate-a-random-int-number-in-c
      und schon leicht modifiziert:

      //Function to get random number
      private static readonly Random getrandom = new Random();
      
      public static int Run(int max)
      {
              return getrandom.Next(0, max);
      }
      

      Ich habe es jetzt nicht ausprobiert.

      Aber das sollte erst einmal weiterhelfen.


      Kind regards / Freundliche Grüße
      Christoph Paduch

Ansicht von 13 Antwort-Themen
  • Du musst angemeldet sein, um auf dieses Thema antworten zu können.