Process Balken für einen FOR NEXT Loop

  • Hallo,

    ich bin erst gestern auf AutoIt gestossen, und habe mich dann gleich in einem kleinen Script probiert.
    Ich habe mit Programmieren zwar nicht viel am Hut, aber nach ca. 10 Stunden Arbeit hab ich die Basics hinbekommen.
    Soweit so gut, die Funktionen laufen, jedoch weiß ich nicht wie ich den Process Balken richtig zum laufen bekomme.

    Spoiler anzeigen


    Code:#include "IE.au3"
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include

    ;while
    ;_FileListToArray($sPath[, $sFilter = "*"[, $iFlag = 0]])
    ;StringRegExpReplace ( "test", "pattern", "replace", [ count ] )

    Opt('MustDeclareVars', 1)

    Global $folderitem, $okbutton, $cancelbutton, $test, $msg
    Global $sFilename = @UserProfileDir
    Global $sCurFilename, $hFile, $folder, $Filelist, $progressbar, $i, $rows

    _Main()

    Func _Main()


    GuiCreate("Shutterstock EXIF Übernahme", 400, 250)
    GUICtrlCreateLabel("Geben Sie anbei den Ordner mit den zu bearbeitenden Shutterstock Bildern an. 'Exiftool.exe' muss dabei direkt im Root Verzeichnis von c: liegen. Ebenso müssen die Shutterstock Bilder einen Filenamen von shutterstock_XXX.jpg aufweisen.", 10, 30, 370, 100) ; Erste Zelle, Breite 80
    $hFile = GUICtrlCreateInput($sFilename, 10, 105, 300, 20, -1, $WS_EX_STATICEDGE)
    GUICtrlSetState(-1, $GUI_DROPACCEPTED)
    GUICtrlSetTip(-1, "Drag and Drop Ordner hierher...")
    $folderitem = GUICtrlCreateButton("Ordner auswählen", 10, 135, 100, 20)
    $okbutton = GUICtrlCreateButton("Batch starten!", 10, 175, 80, 20)
    $cancelbutton = GUICtrlCreateButton("Abbrechen", 100, 175, 70, 20)
    $progressbar = GuiCtrlCreateProgress(10, 210, 380, 20)

    $test = GUICtrlCreateButton("Ausgewählte Bilder anzeigen", 120, 135, 160, 20)

    GUISetState()


    ; Die Schleife wiederholt sich, bis der Benutzer die Beenden-Aktion der GUI auslöst
    While 1
    $msg = GUIGetMsg()
    ; Code below will check if the file is dropped (or selected)
    $sCurFilename = GUICtrlRead($hFile)
    If $sCurFilename <> $sFilename Then
    $sFilename = $sCurFilename
    EndIf

    Select
    Case $msg = $GUI_EVENT_CLOSE Or $msg = $cancelbutton
    Exit

    Case $msg = $folderitem
    $folder = FileSelectFolder("Ordner wählen...", "")
    If @error Then ContinueLoop
    GUICtrlSetData($hFile, $folder); GUI will be updated at next iteration

    Case $msg = $test

    $Filelist = _FileListToArray($sFilename, "shutterstock_*.jpg")
    _ArrayDelete($Filelist, 0)
    _ArrayDisplay($Filelist, 'Bilddaten')

    Case $msg = $okbutton

    Local $file, $oIE, $oLinks, $keywords, $oLinks2, $bildNAME, $oLinks3, $bildID, $batch

    Dim $descript

    $Filelist = _FileListToArray($sFilename, "shutterstock_*.jpg")
    _ArrayDelete($Filelist, 0)
    _ArrayTrim($Filelist, 13, 0)
    _ArrayTrim($Filelist, 4, 1)

    $rows = UBound($Filelist)
    $i = 1
    For $shutter_num In $Filelist
    $i += 1

    $file = "http://www.shutterstock.com/pic-" & $shutter_num & ".html"

    $oIE = _IECreate($file)
    $oLinks = _IETagNameGetCollection ($oIE, "a")
    $keywords = ""
    For $oLink In $oLinks
    If $oLink.className <> "0" Then
    If ($oLink.className = "middlelink") Then
    $keywords = $keywords & ", " & $oLink.getAttribute("x_shutterstock_keyword")
    EndIf
    EndIf
    Next

    $oLinks2 = _IEGetObjById ($oIE, "display-pic-description")
    $bildNAME = _IEPropertyGet($oLinks2, "innertext")

    _IEQuit ($oIE)

    $batch = 'c:exiftool -m -L -keywords="' & $keywords & '" -title="' & $bildNAME & '-' & $shutter_num &'" ' & $sFilename & '\shutterstock_' & $shutter_num & '.jpg'
    Run(@ComSpec & " /c " & $batch & "")
    Sleep(500)

    Next

    MsgBox(64, "Vorgang Beendet", "Die Bilder wurden erfolgreich bearbeitet.")
    EndSelect
    WEnd
    EndFunc

    Code


    Das Script holt sich zu den passenden Shutterstock Bildern die Keywords und Title, und speichert dies dann in den EXIF bzw. Iptc Daten des jeweiligen Bildes.
    Für die Funktion muss jedoch das Exiftool.exe auf dem Ordner C: liegen.

    Ich hatte mir schon gedacht, die Anzahl des Arrays "Ubound(Filelist)" durch 100 zu dividieren, und anschließend durch $i += 1 in der For Regel jeweils die jeweiligen Prozentpunkte an die Process Bar zu schicken.
    Aber wie sieht es aus wenn das Array 19 Bilder beinhalten, und eine periodische Zahl rauskommt.
    Wie kann man dies bewerkstelligen?

  • Hallo maku83,

    herzlich willkommen im Forum und viel Spass mit AutoIt.

    Hier kannst du dir die Hilfe herunterladen.
    Hier gibt es ein AutoIt-Tutorial: http://wiki.autoit.de/wiki/index.php/TutorialSehr hilfreich ist auch das Buch von peethebee

    und jetzt zu:

    Aber wie sieht es aus wenn das Array 19 Bilder beinhalten, und eine periodische Zahl rauskommt.
    Wie kann man dies bewerkstelligen?

    das ist der Progressbar egal. Du kannst aber auch vorsichtshalber mit

    [autoit]

    Int($ErreichteProzent)

    [/autoit]

    einen Integerwert erzeugen,

    PS.: du solltest die autoit-TAGs verwenden, dann kann man das Skript leichter überfliegen,
    mfg autoBert

  • Zitat

    Ich hatte mir schon gedacht, die Anzahl des Arrays "Ubound(Filelist)" durch 100 zu dividieren, und anschließend durch $i += 1 in der For Regel jeweils die jeweiligen Prozentpunkte an die Process Bar zu schicken.
    Aber wie sieht es aus wenn das Array 19 Bilder beinhalten, und eine periodische Zahl rauskommt.
    Wie kann man dies bewerkstelligen?

    Wenn du die Anzahl der Bilder bereits hast kannst du ganz einfach einne Wert for die Bar ermitteln.
    Beispiel $Bilder[0] ist die Anzahl deiner Bilder.

    [autoit]


    $FertigeBilder = 0 ;Siehe unten

    [/autoit][autoit][/autoit][autoit]

    For $i = 1 To $Bilder[0]
    ; Dein Code um die Datein zu taggen. Zum verstehen:
    $Pic[$i] = Titel
    ; & so weiter.

    [/autoit][autoit][/autoit][autoit]

    ;Dann für die Bar:
    $FertigeBilder = $FertigeBilder +1
    GUICtrlSetData($Bar, ($FertigeBilder / $Bilder[0]) * 100)

    [/autoit]

    So zeigt die Bar mit Handle $Bar immer an wie weit du mit deinen Bildern bist.
    Im Forum Editor geschrieben, nicht schlagen ;d
    Hoffe ich hab dich jetzt nicht falsch verstanden xD

    Edit:

    [autoit]

    Round(($FertigeBilder / $Bilder[0]) * 100, 2)

    [/autoit]


    wäre vlt sinnvoller. Muss aber nicht sein :P

  • Also habe mich dann nochmals mit dem Skript beschäftigt, und bin nun eigentlich so gut wie fast fertig.

    Da ich den Code leider nicht schön einbinden kann, (Zeilensprünge, etc...), füge ich ihn als attachment an.

    Das einzigste was jetzt nicht funktioniert ist der Button "Abbrechen" der die For..In...Next Schleife abbrechen sollte.
    Im Forum konnte ich diesbezüglich nur etwas über while schleifen finden.


    Weiters würde mich noch interessieren, da mein Lösungsvorschlag relativ langsam ist, ob man dies nicht evtl. auch mit "InetGet" lösen könnte.
    Aber wie lese ich dann die Tags aus, um deren Inhalt in ein Array bzw. String zu speichern?

    Wer auch immer das Script probieren möchte:
    Vorraussetzung ist das Exiftool von Phil Harvey. Die Windows exe nach exiftool.exe umbenennen,
    und Bilder mit den Dateinamen shutterstock_ID.jpg , wobei ID durch den Bildnamen ersetzt wird.

  • Hallo maku83,

    damit der $cancelbutton funktioniert sollte es reichen wenn du 2 Zeilen einfügst:

    [autoit]

    $stopvar = 0 ;Zeile 120
    For $shutter_num In $Filelist
    $msg = GUIGetMsg() ;<======== einfügen
    If $msg = $cancelbutton Then _Cancel() ;<======== einfügen

    [/autoit]


    mfg autoBert