GDI DrawLine auf PDF

  • Hallo

    Mein Name ist Cawa, ich beschäftige mich jetzt schon seit paar Jahren mit AutoIt, habe aber nie große Programme geschrieben. Die meisten waren Kleinstprogramme, die mit Google, deutschen u. englischen Forum „durchgemogelt“ wurden… Haben aber (irgendwann) funtioniert…!


    Mein erster Post an euch ist mein erster großer Stolperstein…


    Ich bin gerade dabei eine Diagrammauswertung zumachen.

    Einige dieser Diagramme sind Temperatur/Zeit-Kurvendiagramme die in PDF gespeichert vor mir liegen. Um diese Kurven auszulesen dachte ich mir: ich setze die PDF als Hintergrund einer GUI, einen Slider unter diese PDF, richte ihn an Kurvenanfang u –ende aus und den Sliderwert nutz ich zur Verhältnisgleichung um die Uhrzeit zu berechnen und in Excel zu speichern… Programm funktioniert bis dahin (kleine Bauphasen sind noch).


    Aber um den Slider besser ablesen zu können will ich jetzt eine senkrechte, mit den Slider bewegliche Linie auf diese PDF malen und somit mein erstes GDI-Projekt starten…

    Linie malen funktioniert, malt aber einen ScannerCode auf die PDF…

    Ich hab „versucht“ ein handle von der GUI, von der File, vom Obj und von Active_X zu bekommen, kein Erfolg…

    Hab es mit _GDIPlus_Bitmap, Image und Graphic versucht, entweder lösch ich die komplette GUI und seh nur schwarzes Flackern oder die Linie ist nicht zu sehen.


    Meine Denkweise wie ich GDI bis jetzt verstanden habe ist:

    - Man nehme ein Bild ($GUI) und mache eine Kopie ($HGraphic)

    - Diese Kopie kopieren wir als Sicherheitskopie in $Buffer

    do

    Malen $Buffer auf die GUI und malen den Strich auf Position

    Until…


    Ich brächte an der Stelle mal bitte einen kleinen Denkanstoß für einen GDI (und auch Object) Neuling… Wo liegt hier mein Denkfehler


  • Einige dieser Diagramme sind Temperatur/Zeit-Kurvendiagramme die in PDF gespeichert vor mir liegen. Um diese Kurven auszulesen dachte ich mir: ich setze die PDF als Hintergrund einer GUI, einen Slider unter diese PDF, richte ihn an Kurvenanfang u –ende aus und den Sliderwert nutz ich zur Verhältnisgleichung um die Uhrzeit zu berechnen und in Excel zu speichern

    Da verstehe ich nur Bahnhof. Das funktioniert doch nur bei einer linearen Funktion, niemals bei einer Kurve. Und wie "richtest du aus"? Slider per Maus ziehen und dann Position Speichern?


    Du solltest ein Skript bereit stellen, das auf das reine Problem reduziert und lauffähig ist. Da du hier spezifische Dateien verwendest kann das Skript von uns so nicht getestet werden.

  • So habe ich GDI mit Backbuffer in einer separaten GdiDraw() Funktion genutzt.

    Die Funktion kann man entweder in der Main Methode aufrufen (high cpu) oder über einen Trigger.



    Hier die GdiDraw() Methode:



    Ein paar Tipps von mir (persönliche Erfahrung):

    Ich würde AutoitOnExitRegister() nutzen, um GDI Objekte aus dem Speicher zu werfen. Dann kann man, um das Programm zu beenden, einfach Exit nutzen.

    Außerdem nutzt du außerhalb von Methoden lokale Variablen. Das macht keinen Sinn,

    da die Variablen außerhalb von Methoden immer Global sind. Und man sollte jede Variable

    entsprechend deklarieren, um Fehler vorzubeugen.

    Du nutzt in der Hauptschleife Sleep(10). Sofern GUIGetMsg() genutzt wird, ist Sleep() unnötig, da das ganze hier automatisch gedrosselt wird. Es ist eher kontraproduktiv, weil sich der Handler nach einem Event um 10ms verzögert.


    Aber nimm das ganze bitte nicht zu ernst, will dir damit nur etwas helfen. :P

  • Hallo Sunlight

    …und ob och deine Kritik ernst nehme… Ich bin sogar froh darüber… :saint:

    Habe mir vor ca 10 Jahren AutoIt selbst beigebracht und damit paar Bots und kleine Programme geschrieben… Bei GDI hab ich immer aufgehört… Bis heute bin ich absoluter Anfänger.

    Die letzten 5 Jahre habe ich mit AutoIt kaum Kontakt gehabt und jetzt brauch ich für die Arbeit mal ein „größeres“ Programm. AutoIt hat sich die letzten Jahre aber sehr verändert. Damals hatte ich für Bots ganze Exceltabellen verwaltet… heut bekomm ich kein Wert mehr ausgelesen. Meine alten Skripte bringen nix mehr… ;(



    Aber jetzt zu dein Skript 2 Fragen:

    $gdiBrushBg - (linie 20) - ?BrushBackGround? -> Was ist das?

    Habe _GDIPlus_GraphicsFillRect($buffer, 0, 0, $Gdi_x2, $Gdi_y2, $Bitmap ) versucht, wird aber alles schwarz.


    GdiDrawGrid() und GdiDrawMapObjects() hab ich nirgendwo gefunden. Wo find ich diese Befehle?

    Aktuell sieht es so aus bei mir:


    BugFix: Ich nehme alle Schuld auf mich: Wenn man schon einen Screenshot macht und ihn bearbeitet, sollte man ihn nicht vergessen mit hochzuladen…

    Dies sind die „Kurven“ von den ich gesprochen hatte. Die dicken Balken oben, unten und links sind von mir geschwärz worden.

  • Klingt sehr interessant. Ich habe damals auch mit Bots angefangen.

    Damals habe ich mich auch schwer mit GDI+ getan, aber im Prinzip ist der Aufbau recht einfach.


    Sorry, dass mein Beispiel von oben so nicht vollständig war. Ich habe ein anderes Beispiel im Anhang hochgeladen. :)


    Falls du Fragen hast, kann ich dir selbstverständlich weiterhelfen. ;)