[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Zufallszahszahl, von/bis

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Print/Bildbearbeitung - Photos, Layout, Design
Themen
Beiträge
Moderatoren
Letzter Beitrag

Zufallszahszahl, von/bis

klasinger
Beiträge gesamt: 1671

1. Apr 2011, 12:49
Beitrag # 1 von 15
Bewertung:
(11803 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo lieber Scripter,

ein kleines Script-Anliegen liegt mir am Herzen, welches ich mal in diese Runde tragen möchte.

Kleine Themeneinführung:
Die InDesign User Group Berlin verlost bei jeder Veranstaltung ein paar Preise, wofür wir uns einen doppleten Satz Lose erstellt haben (eine Satz zum rausgeben und einen für die Lostrommel). Diese müssen nun jedes mal sortiert werden und sind schon so abgegriffen, dass wir neue produzieren müssten – für Beides mangelt es an Lust, insbesondere fürs Erste.

Da wir ja eine InDesign User Group sind kam mir die Idee die Auslosung anstatt mit der Lostrommel mit InDesign zu realisieren.
Mein nächster Gedanke: da bei unsem Meeting im Mai das Thema Scripting auf der Agenda steht, könnte man das ja ggf. per Script realisieren, nur sind da meine Fähigkeiten beschränkt...

Hat also ggf. jemand Lust ein Script hierfür zu verfassen, gerne verweisen wir auch vor versammelter Mannschaft und auf unserer Webseite auf den Autor und seine Präsenz im Web.

Anfordeungsprofil des Scriptes:
  • lauffähig unter ID CS5 (Mac oder Win)

  • generiert Zufallszahlen in einem vorgegeben Bereich (wenn 100 Lose verteilt werden also 1-100; diese Einstellung muss nicht zwingened mit einer ID-Oberfläche versehen sein, dass könnte ich auch noch im Code ändern)

  • es sollen mehrere Zahlen generiert werden (je noch Anzahl unserer Präsente), aber immer nur eine nach der anderen (dann kann sich jeder Gewinner separat freuen)

  • entweder stellt man die Anzahl der gewünschten Zufallszahlen vorab ein oder jedes Ausführen des Scriptes oder eine GUI Element bringt eine neue

  • die Zufallszahlen werden in einer Textbox platziert (ob nun jede in einer eigenen oder alle hintereinander, da sind wir wahlfrei)

  • optimaler Weise werden bereits generierte Zahlen nicht erneut generiert (vermute aber es ist nicht so trivial, daher sehe ich es als Sahnehäubchen an, im Zweifelsfall generieren wir eine neue Zahl)


  • Alternative Vorgehensweisen/Vorschläge zur Umsetzung sind geren willkommen!

    Sehr vielen Dank vorab, die InDesign User Group Berlin.
    X

    Zufallszahszahl, von/bis

    Marco Morgenthaler
    Beiträge gesamt: 2474

    1. Apr 2011, 13:06
    Beitrag # 2 von 15
    Beitrag ID: #468183
    Bewertung:
    (11789 mal gelesen)
    URL zum Beitrag
    Beitrag als Lesezeichen
    Hallo Klaas

    Alternativen: Excel oder http://www.random.org/

    Gruss, Marco


    als Antwort auf: [#468181]

    Zufallszahszahl, von/bis

    WernerPerplies
    Beiträge gesamt: 2762

    1. Apr 2011, 13:19
    Beitrag # 3 von 15
    Beitrag ID: #468184
    Bewertung:
    (11783 mal gelesen)
    URL zum Beitrag
    Beitrag als Lesezeichen
    Schau Dir mal diese Seite an:
    http://www.rolandgeyer.at/...n/javasrc/js014.html

    Daraus folgt wohl für Deine Aufgabe:

    Code
    a = 1 + 100*(Math.random()); 
    a = Math.round(a);
    alert(a);



    als Antwort auf: [#468181]

    Zufallszahszahl, von/bis

    klasinger
    Beiträge gesamt: 1671

    1. Apr 2011, 13:20
    Beitrag # 4 von 15
    Beitrag ID: #468185
    Bewertung:
    (11783 mal gelesen)
    URL zum Beitrag
    Beitrag als Lesezeichen
    Hallo Marco,

    danke für die Tipps.
    Excel kommt als Ersatz in Betracht (wird aber von vielen Menschen, wie auch vielen unsere Besucher ein wenig gehasst...).
    Die Website hatte ich auch schon gefunden, wir hatte aber leider häufiger kein Internet und wir wollen dann nicht ohne Lostrommel dahstehen.

    Eine sehr gut passende Anwendung hatte ich noch hier gefunden: http://southbaynet.org/LuckyLight.html (benötigt Silverlight, ist leider auch webbasiert und recht langsam).


    als Antwort auf: [#468183]

    Zufallszahszahl, von/bis

    Martin Fischer
      
    Beiträge gesamt: 12783

    1. Apr 2011, 13:50
    Beitrag # 5 von 15
    Beitrag ID: #468190
    Bewertung:
    (11760 mal gelesen)
    URL zum Beitrag
    Beitrag als Lesezeichen
    Hallo Klaas,

    auf die Schnelle hier ein Beispiel für eine Lotterie.

    Code
    //IDUG_Lotterie.jsx 

    var numbers = new Array;
    var result = new Array;

    var range = prompt('von - bis', '1-10');
    var count = prompt('Anzahl:', 6);
    var start = Number(range.split('-')[0]);
    var end = Number(range.split('-')[1]);

    for (var i = start; i <= end; i++)
    numbers.push(i);

    for (var i = 0; i < Number(count); i++)
    {
    var pos = Math.random()*numbers.length;
    result.push(numbers.splice(pos,1));
    }

    result.sort(numsort);

    alert('Ergebnis\r' + result.join('\r'));
    alert('Rest\r' + numbers.join('\r'));



    function numsort (a, b) {
    return a - b;
    }



    Das Skript ermittelt zunächst einen Bereich für die Zahlen, aus denen eine bestimmte Menge gezogen werden soll.
    Danach wird die zu ziehende Menge angegeben.

    Am Ende werden die gezogenen Zahlen (sortiert) ausgegeben.
    Und danach – zur Kontrolle – die Zahlen, die nicht gezogen worden sind.

    Was fehlt:
    1. ein schönerer Dialog, in dem die Parameter auf einmal erfasst werden.
    2. Prüfung, ob die Eingabewerte Zahlen sind und was zu tun ist, wenn die Werte nicht dem erwarteten Typ entsprechen..
    3. Straffung des Codes.
    4. InDesign ins Spiel bringen.

    Eine Alternative – ohne InDesign: JavaScript Lotto


    als Antwort auf: [#468185]
    (Dieser Beitrag wurde von Martin Fischer am 1. Apr 2011, 13:57 geändert)

    Zufallszahszahl, von/bis

    klasinger
    Beiträge gesamt: 1671

    1. Apr 2011, 14:02
    Beitrag # 6 von 15
    Beitrag ID: #468193
    Bewertung:
    (11743 mal gelesen)
    URL zum Beitrag
    Beitrag als Lesezeichen
    Hallo Werner & Martin,

    danke für euren Input. Ich werde mal Versuchen das ein wenig auszubauen und die Zahlen dann Step by Step im Dokument zu setzen.
    Wenn ich was Vorzeigbare habe, werde ich es posten.

    Weitere Anregungen sind totzdem sehr gerne willkommen.


    als Antwort auf: [#468190]

    Zufallszahszahl, von/bis

    klasinger
    Beiträge gesamt: 1671

    26. Apr 2011, 16:31
    Beitrag # 7 von 15
    Beitrag ID: #469883
    Bewertung:
    (11542 mal gelesen)
    URL zum Beitrag
    Beitrag als Lesezeichen
    Hallo,

    nun hatte ich ein wenig Scriptingtime und habe eure Vorlagen genommen und das Script auf Textausgabe auf ID-Seiten getrimmt - zur letzten Verlosung habe ich mit alert die Zahlen ausgegeben.

    Code
    //Variablen setzen 
    var myDoc = app.documents.add();
    var end = prompt('Wie viele Lose wurden ausgegeben?', 120);
    var count = prompt('Anzahl:', 10);

    //Farbe anlegen
    var myColor = myDoc.colors.add({model:ColorModel.process, colorValue:[25, 90, 20, 0], name:"IDUG-Rot"});
    //Absatzformat anlegen
    var myAbsatzformat = myDoc.paragraphStyles.add({name:"IDUGlosnummern", appliedFont:"Myriad Pro", fontStyle:"Bold", pointSize:200, fillColor:"IDUG-Rot", justification:1667591796});

    for (var i = 0; i < count; ) {
    //Zufallszahl berechnen
    a = 1 + end*(Math.random());
    a = Math.round(a);
    var myPage;
    var myFrame = myDoc.pages[i].textFrames.add();
    myFrame.geometricBounds = [80, 20, 180, 190];
    // Zufallszahl in in den Textrahmen schreiben
    myFrame.contents += a.toString();
    myFrame.paragraphs[0].appliedParagraphStyle = myAbsatzformat;
    $.sleep(3000);
    alert("Herzlichen Glückwunsch");
    i++;
    var myPage = myDoc.pages.add();
    }


    Ein Problem habe ich jetzt noch, welches ich bis dato nicht lösne konnte:
    In der Schleife gebe ich die Gewinnzahlen mit passenen Absatzformat aus:
    Code
    myFrame.contents += a.toString(); 
    myFrame.paragraphs[0].appliedParagraphStyle = myAbsatzformat;

    Damit alle die Zahl sehen können gibts danach eine Pause
    Code
    $.sleep(3000); 

    und damit das Script nicht weiterläuft ein Alert mit Glückwunsch:
    Code
    alert("Herzlichen Glückwunsch"); 

    Dummerweise sehe ich die Gewinnzahlen erst im Textrahmen, nachdem das Script vollständig durchgelaufen ist, nicht wie von mir gewünscht vor dem $.sleep.
    Sieht einer meinen Fehler?

    Vielen Dank vorab!


    als Antwort auf: [#468193]

    Zufallszahszahl, von/bis

    Hans Haesler
      
    Beiträge gesamt: 5826

    26. Apr 2011, 22:42
    Beitrag # 8 von 15
    Beitrag ID: #469910
    Bewertung:
    (11516 mal gelesen)
    URL zum Beitrag
    Beitrag als Lesezeichen
    Hallo Klaas,

    nach dem Zuweisen des Absatzformates habe ich einen Dummy-Befehl eingefügt. Der bewirkt, dass die aktuelle Zahl sichtbar wird. Hier funktioniert es (mit CS5).

    Code
    //Variablen setzen 
    var myDoc = app.documents.add();
    var end = prompt('Wie viele Lose wurden ausgegeben?', 120);
    var count = prompt('Anzahl:', 10);

    //Farbe anlegen
    var myColor = myDoc.colors.add({model:ColorModel.process, colorValue:[25, 90, 20, 0], name:"IDUG-Rot"});
    //Absatzformat anlegen
    var myAbsatzformat = myDoc.paragraphStyles.add({name:"IDUGlosnummern", appliedFont:"Myriad Pro", fontStyle:"Bold", pointSize:200, fillColor:"IDUG-Rot", justification:1667591796});

    for (var i = 0; i < count; i++) {
    //Zufallszahl berechnen
    a = 1 + end*(Math.random());
    a = Math.round(a);
    var myFrame = myDoc.pages[i].textFrames.add();
    myFrame.geometricBounds = [80, 20, 180, 190];
    // Zufallszahl in in den Textrahmen schreiben
    myFrame.contents = a.toString();
    myFrame.paragraphs[0].appliedParagraphStyle = myAbsatzformat;
    var dummy = myFrame.contents;
    $.sleep(3000);
    alert("Herzlichen Glückwunsch");
    if (i < count-1) {
    var myPage = myDoc.pages.add();
    }
    }

    Das Hochzählen von "i" habe ich nach oben verschoben. Die Zeile "var myPage" ist nicht notwendig. Ein Test sorgt dafür, dass nicht am Ende eine leere Seite eingefügt wird.

    Gruss, Hans


    als Antwort auf: [#469883]

    Zufallszahszahl, von/bis

    klasinger
    Beiträge gesamt: 1671

    27. Apr 2011, 00:02
    Beitrag # 9 von 15
    Beitrag ID: #469913
    Bewertung:
    (11495 mal gelesen)
    URL zum Beitrag
    Beitrag als Lesezeichen
    Hallo Hans,

    super - jetzt funktioniert es genau so, wie es soll (CS5 Mac).
    Das var myPage war wohl auch noch von diversen Tests übrig, beim Durchsehen hab ich dessen Sinnlosigkeit jetzt auch erkannt.
    Der Dummy funktioniert so auch, obwohl es natürlich ein "Krücke" ist, die aber eben Ihren Zweck erfüllt - auf solche Ideen muss man erst einmal kommen.

    Da beim nächsten mal Scripting auf der InDesign User Group Agenda steht, wollte ich auch auf deine Seite fachhefte.ch verweisen, wenn es dir nicht unangenehm ist...

    Danke nochmals an alle, wenn Ihr mal zu einem Meeting in Berlin seid, kommt gerne vorbei.


    als Antwort auf: [#469910]

    Zufallszahszahl, von/bis

    Stibi
    Beiträge gesamt: 832

    27. Apr 2011, 01:29
    Beitrag # 10 von 15
    Beitrag ID: #469915
    Bewertung:
    (11487 mal gelesen)
    URL zum Beitrag
    Beitrag als Lesezeichen
    Ich hab mal ein Progrämmelchen geschrieben.
    das Programm
    die passende ID Datei < Diese kann man nach Bedarf umgestalten, allerdings haben die beiden Textrahmen ein Label, diese also bitte nicht löschen. Die Schriftart, Größe usw. kann aber beliebig sein. In den Rahmen unten links trägt man die höchste vergebene Losnummer ein.
    Am besten das ID Dokument im Präsentationsmodus starten, dann kann man das "Los" Programm davor laufen lassen.

    Doppelte Losnummern werden (noch) nicht abgefangen, jedes Klicken auf den LOS Knopf erzeugt eine neue Nummer.

    Ich hoffe, damit könnt Ihr prima Verlosungen machen.


    Gruß Stibi


    als Antwort auf: [#468181]

    Zufallszahszahl, von/bis

    WernerPerplies
    Beiträge gesamt: 2762

    27. Apr 2011, 08:10
    Beitrag # 11 von 15
    Beitrag ID: #469919
    Bewertung:
    (11459 mal gelesen)
    URL zum Beitrag
    Beitrag als Lesezeichen
    Hallo Klaas,

    Der Dummy funktioniert so auch, obwohl es natürlich ein "Krücke" ist, die aber eben Ihren Zweck erfüllt - auf solche Ideen muss man erst einmal kommen.

    Diese Krücke macht durchaus Sinn. Ohne die genauen Abläufe im Unix-/Mac-Betriebssystem zu kennen:

    Bildschirm-Aktialisierungen werden in Regel über Events ausgeführt. Manche Programmschleifen unterdrücken jegliche Eventausführung und deshalb gibt es in den verschiedenen Programmiersprachen bestimmte Methoden, die die Ausführung von Events explizit erlauben. Darüber hinaus gibt es Methoden, die diese speziellen Methoden verwenden und deshalb die Eventausführung implizit erlauben.

    Bei C# (Net-Framework) unter Windows wäre es zum Beispiel die Methode application.DoEvents(), die einfach einmal in der Schleife aufgerufen werden muss.


    als Antwort auf: [#469913]

    Zufallszahl, von/bis

    Martin Fischer
      
    Beiträge gesamt: 12783

    27. Apr 2011, 08:46
    Beitrag # 12 von 15
    Beitrag ID: #469924
    Bewertung:
    (11426 mal gelesen)
    URL zum Beitrag
    Beitrag als Lesezeichen
    Hallo Klaas,

    bei Deiner Lotterie ist es möglich, dass dasselbe Los (dieselbe Zahl) mehrfach gezogen wird.

    Ist das zulässig und steckt da eine Absicht dahinter?

    Oben hatte ich versucht, einen Weg aufzuzeigen, wie man eine Lotterie mit eindeutigen Zahlen (jede Zahl kann/darf nur einmal vorkommen) aufbauen könnte. Der Fokus lag dabei auf der Erzeugung, nicht auf der Darstellung der Zufallszahlen.


    als Antwort auf: [#469883]

    Zufallszahl, von/bis

    Hans Haesler
      
    Beiträge gesamt: 5826

    27. Apr 2011, 09:23
    Beitrag # 13 von 15
    Beitrag ID: #469928
    Bewertung:
    (11411 mal gelesen)
    URL zum Beitrag
    Beitrag als Lesezeichen
    Hallo Klaas,

    nur zu mit dem Verweisen auf http://www.fachhefte.ch!
    (Nebst dem Herunterladen von Scripten kann man auch ein Abo bestellen; wir liefern auch nach Deutschland ;-). Besten Dank im voraus.

    Beim Ausführen des Scripts kamen im gleichen Dokument zwei Mal die 11 und zwei Mal die 18. Deshalb habe ich untenstehend eine Prüfung eingebaut, welche bei einer schon gezogenen Nummer nochmals eine neue holt.
    [Edit]: Martin ist mir mit seinem Hinweis zuvorgekommen.

    Zu Beginn wird auch sichergestellt, dass die Masseinheiten stimmen und dass Einzelseiten erzeugt werden.

    Code
    //Variablen setzen 
    var myDoc = app.documents.add();
    var end = prompt('Wie viele Lose wurden ausgegeben?', 120);
    var count = prompt('Anzahl:', 10);

    // Millimetereinheiten, Breite und Höhe, Einzelseiten
    myDoc.viewPreferences.horizontalMeasurementUnits = MeasurementUnits.millimeters;
    myDoc.viewPreferences.verticalMeasurementUnits = MeasurementUnits.millimeters;
    myDoc.documentPreferences.properties = {pageWidth:210, pageHeight:297, facingPages:false};

    //Farbe anlegen
    var myColor = myDoc.colors.add({model:ColorModel.process, colorValue:[25, 90, 20, 0], name:"IDUG-Rot"});
    //Absatzformat anlegen
    var myAbsatzformat = myDoc.paragraphStyles.add({name:"IDUGlosnummern", appliedFont:"Myriad Pro", fontStyle:"Bold", pointSize:200, fillColor:"IDUG-Rot", justification:1667591796});

    var myArray = new Array ();
    for (var i = 0; i < count; i++) {
    var myFrame = myDoc.pages[i].textFrames.add();
    myFrame.geometricBounds = [80, 20, 180, 190];
    var okay = true;
    while (okay == true) {
    okay = false;
    // Zufallszahl holen
    a = getNumber(end);
    // prüfen, ob Zahl schon vorhanden
    for (var k=0; k<myArray.length; k++) {
    if (a == myArray[k]) {
    okay = true;
    break;
    }
    }
    }
    // die aktuelle Zahl an die Liste anfügen
    myArray.push(a);
    // Zufallszahl in in den Textrahmen schreiben
    myFrame.contents = a.toString();
    myFrame.paragraphs[0].appliedParagraphStyle = myAbsatzformat;
    var dummy = myFrame.contents;
    $.sleep(3000);
    alert ("Herzlichen Glückwunsch", " ");
    if (i < count-1) {
    myDoc.pages.add();
    }
    }

    // das Ende der Aktion verkünden
    alert ("Alle Nummern sind gezogen.", " ");

    // Zufallszahl berechnen
    function getNumber(end) {
    a = 1 + end*(Math.random());
    a = Math.round(a);
    return a;
    }

    Gutes Gelingen!

    Gruss, Hans


    als Antwort auf: [#469924]

    Zufallszahl, von/bis

    klasinger
    Beiträge gesamt: 1671

    27. Apr 2011, 11:41
    Beitrag # 14 von 15
    Beitrag ID: #469951
    Bewertung:
    (11376 mal gelesen)
    URL zum Beitrag
    Beitrag als Lesezeichen
    Hallo an Alle,

    da habt Ihr mit ja schon wieder ordentlich Input gegeben.
    Ich werde das mal sichten und in meinem Kopf sortieren.
    Meine Mitveranstalter hatten nun auch schon diverse Ideen, was mach damit noch so alles anstellen kann, Ihr kennt derartiges sicherlich auch.
    Den Ausschluss von doppelten Zahlen werde ich sicherlich noch integrieren, das macht ja auch Sinn.
    Mal sehen, was ich noch daran schrauben darf/muss, dann werde ich es hier wieder posten.

    Danke nochmals an alle und eine gute Restwoche.


    als Antwort auf: [#469928]

    Zufallszahl, von/bis

    Stibi
    Beiträge gesamt: 832

    6. Mai 2011, 16:24
    Beitrag # 15 von 15
    Beitrag ID: #470846
    Bewertung:
    (11187 mal gelesen)
    URL zum Beitrag
    Beitrag als Lesezeichen
    Gestern haben wir bei INDUG Treffen in Köln mein Los-Programm erfolgreich genutzt - und da es auch weiterhin so laufen soll, habe ich denn noch eine Routine eingebaut, die doppelte Losnummern abfängt.
    Das neue Programm und die passenden ID Datei gibts jetzt hier.

    Der andere Link oben in diesem Thread ist nicht mehr gültig.

    Gruß Stibi


    als Antwort auf: [#469951]
    X