1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. neod

Beiträge von neod

  • Wie die Übersicht im Programmcode behalten

    • neod
    • 27. November 2015 um 12:16

    Hiho,

    erstmal vielen Dank für eure zahlreichen Antworten (& das Verschieben in ein passenderes Unterforum).

    Das Aufteilen des Code in mehrere Dateien hab ich mir auch schon angewöhnt. Anscheinend muss ich einfach noch mehr kommentieren und Funktionen noch weiter "simplifizieren", so dass sie nurnoch ihre Grundfunktion erledigen.

    Einige wirklich gute Anregungen werde ich in den nächsten (und dem aktuellen, daher rührte die Frage) Projekten mal versuchen umzusetzen.

    Aber gerne dürfen noch weitere "Fingerzauberer" uns alle an ihren Vorgehensweisen teilhaben lassen. ;)

    Gruß,
    Neod

  • Wie die Übersicht im Programmcode behalten

    • neod
    • 26. November 2015 um 16:55

    Hallo,

    der Titel deutet die Richtung meiner Frage ja schon an.
    Wie baut ihr ein Programm auf - ohne den Überblick zu verlieren?

    Ich habe das Problem, dass mein Code mit der Zeit, bzw. je mehr Zeilen er umfasst, immer unübersichtlicher wird. (Was der Fehlerfindung nicht grad zuträglich ist)
    Vor allem wenn ein "kleines Skript" wächst und man hier noch ein Input integriert und dort noch 'nen Button, dann geht die vorher angestrebte Struktur (und vor allem Übersichtlichkeit) recht schnell flöten.

    Wie baut ihr eure Programme auf? An welche "eisernen Regeln" haltet ihr euch?
    Schreibt ihr einfach drauf los (ein Genie beherrscht ja bekanntlich das Chaos) oder gibts vorher einen groben Entwurf auf Papier? Oder aber baut ihr ein Grundgerüst, das ihr dann mit "leben" füllt?

    Ich Danke euch schon mal für eure Anregungen,
    Neod

  • Happy Birthday chesstiger (15) und Xenobiologist (33)

    • neod
    • 13. November 2012 um 01:24

    Happy birthday Chessi & Xeno ( ... nachträglich :S )

    Ich hoffe ihr seid noch am Feiern :D

  • Make-Grafik hat Geburtstag!

    • neod
    • 1. November 2012 um 16:52

    Happy Birthday! :party:

  • name22 Wird 18!

    • neod
    • 5. Oktober 2012 um 00:16

    name18 wird 22? ... äh, name22 wird endlich 18?!? ... Dann 'ma herzlichsten Glühstrumpf von mir!

    Happy Birthday name22

    Feier schön und lass es krachen ;)

  • GDI, Kreismittelpunkt & Radius - Frage

    • neod
    • 26. September 2012 um 19:00

    AspirinJunkie: Tausend Dank!
    Ob ich die Lösung nun mathematisch oder geometrisch bestimme ist doch im Grunde egal. (Oder nicht?)
    Und eigentlich ging es mir hauptsächlich um den Mittelpunkt! (Mit dem Mittelpunkt kann ich ein Quadrat um den 'Kreis' zeichnen/ihn um den Mittelpunkt drehen und so die 'abgeschnittene' Seite finden, etc)
    Und ja, ich schrecke sehr wohl davor zurück Gleichungssysteme zu lösen. Da hatte ich schon in der Schulzeit meine Probleme. Für ein Skript wie deine geometrische Lösung hätte ich trotzdem sicher Tage geknobelt ... :S

    ytwinky: In einem Post von 2006 von dir hatte ich etwas über Atan2 (hatte AspirinJunkie geschrieben, dass ich diese Funktion benötige) gefunden. Und nochmals danke für deinen FreeBasic-Code. Ich behalt diese Lösung mal im Hinterkopf, vielleicht versuch ich mich ja doch demnächst an einer Portierung.

    Und für alle anderen: AspirinJunkies Lösung ist eigentlich genau das, was ich gehofft hatte zu finden. Ich setz den Thread mal auf gelöst aber falls jemand Fragen oder Anregungen hat, immer her damit ;)

    Gruß Fred

  • GDI, Kreismittelpunkt & Radius - Frage

    • neod
    • 25. September 2012 um 22:57

    Dank dir ytwinky!

    Ich hab mir zuerst Gedanken über das Gleichungssystem in dem Link von dir gemacht, aber sowas in AutoIt ... uihuihuih
    Den FreeBasic-Code schau ich mir morgen. Danke auch dafür. Über das Portieren ... lassen wir das lieber ;)

    Momentan verfolge ich AspirinJunkies Vorschlag:
    Anscheinend ist es ja garnicht so schwer eine Strecke anhand von 2 gegebenen Punkten auszurechnen. Und 'Atan2" werd ich schon ausgraben ^^

  • GDI, Kreismittelpunkt & Radius - Frage

    • neod
    • 25. September 2012 um 22:01
    Zitat von AspirinJunkie

    Welche ich allerdings nicht erwähnt habe.
    Ich habe dir den Ansatz über den Umkreis eines Dreieckes verlinkt deren Berechnung auch ohne die Lösung eines Gleichungssystems auskommt.

    Stimmt. Aber ich brauch dann doch Seitenlängen und Winkel des Dreiecks. Leichter wirds dadurch aber nicht (finde ich).

  • GDI, Kreismittelpunkt & Radius - Frage

    • neod
    • 25. September 2012 um 21:46

    Den Ansatz über die Kreisgleichung hatte ich ja oben schon erwähnt, aber mein eingerostetes Mathe reicht da wohl nicht aus.

    Aber Hough-Transformation klingt interessant, auch wenns sich in AutoIt vielleicht nicht stemmen lässt.

    Ich komm bei dem Beispiel, an dem ich mich grade versuche: (4-xm)² + (1-ym)²
    nicht auf: 4 +4xm + xm² + 9 - 6ym + ym²
    sondern: 16 - 8xm + xm² + 1 - 2xm + xm²
    ... aber da komm ich schon irgendwann dahinter ^^

  • GDI, Kreismittelpunkt & Radius - Frage

    • neod
    • 25. September 2012 um 21:25

    Jain, ... stell dir vor, der Kreis wäre vollständig. DAVON such ich den Mittelpunkt. Das is ja grad das verzwickte (für mich).

    EDIT: Rischtisch!! ;)

  • GDI, Kreismittelpunkt & Radius - Frage

    • neod
    • 25. September 2012 um 21:14

    Nicht ganz, da der "obere Strich" ja nicht die tatsächliche Kante des Kreises findet und somit es nicht der Mittelpunkt des Kreises ist.
    (Ich bin mir nicht ganz sicher, dass ich verständlich geschrieben hab, was ich meine)

    Falls nicht, frag einfach ;)

  • GDI, Kreismittelpunkt & Radius - Frage

    • neod
    • 25. September 2012 um 20:57

    Es geht um Kreise (Kreise mit ner abgeschnittenen Kante) allgemein. Das Bild is jetzt nur um zum testen. Später ist das eine Aufnahme einer Kamera ...

    Naja, wenns denn jemals mal so weit kommt :rolleyes:

    Im Moment versuch ich mich an der allgemeinen Kreisgleichung:
    (x-xm)² + (y-ym)² = r²

    YAY! :rofl:

  • GDI, Kreismittelpunkt & Radius - Frage

    • neod
    • 25. September 2012 um 18:50

    Hiho!

    Ich hab da mal 'ne kleine Frage. Kurz gesagt, ich suche den Mittelpunkt ein Kreises ... :wacko:

    Situation:
    Ich habe ein Bild (weißer Hintergrund mit schwarzem, gefülltem Kreis (eine Seite ist leider abgeflacht) ).
    Per _GDIPlus_BitmapGetPixel() suche ich von allen 4 Bildseiten nach innen eine Pixeländerung und erhalte als Rückgabe 4 Arrays mit X- & Y-Werten.

    Aufgabenstellung:
    Aus meiner Schulzeit erinner' ich mich noch dunkel (ok und ich hab Onkel google gefragt :rolleyes: ), dass ich den Mittelpunkt des Kreises über 3 Randpunkte des Kreises (ein Dreieck) und dem Schnittpunkt der Mittelsenkrechten des Dreiecks rausfinden kann.

    Frage:

    • Gibt es eine Funktion, die ich mit 3 X|Y - Werten fütter und dem Mittelpunkt erhalte?
    • Oder würdet ihr das eher "per GDI" angehen, indem ihr 3 Randpunkte verbindet, die Geraden halbiert und den Schnittpunkt der Orthogonalen durch den ... Dingens (Mathe war noch nie mein Freund ^^ ) ... na ihr wisst schon ... ermittelt.


      Ich hänge grad irgendwie in der Luft, wie ich diese Fragestellung anzugehen hab. Über ein paar Schubser in die richtige Richtung würde ich mich freuen.

      Gruß Fred

  • SQLite-Frage - Möglichkeit :memory:-DB in Datei zu speichern?

    • neod
    • 16. April 2012 um 22:49

    Ich dank dir schomma' progandy!

    Hätte mich auch gewundert, wenn sowas noch nicht in AutoIt umgesetzt worden wäre :D

    Ich versuch das Ganze mal morgen oder übermorgen im Geschäft, geb dann Bescheid, ob es wirklich was im Bezug auf die Geschwindigkeit gebracht hat und setz' den Thread auf gelöst.

  • SQLite-Frage - Möglichkeit :memory:-DB in Datei zu speichern?

    • neod
    • 16. April 2012 um 21:28

    Hiho ihr alle.

    Hab mal eine kleine SQLite-Frage: Kann man eine im Speicher erstellte DB hinterher in ein file speichern?

    Da ja anscheinen das schreiben in eine SQLite-DB auf der Festplatte eine Art Nadelöhr ist (hab irgendwo gelesen, dass für ein insert 2 Plattenumdrehungen notwenig sind, keine Ahnung obs stimmt), sollte das Erstellen der DB im Memory um einiges schneller sein ...

    Aktuell durchsuche ich ca. 5k Verzeichnisse und trage dann die darin gefundenen Dateien (ca. 20k ) in 2 unterschiedliche Tabellen einer SQLite-DB ein.
    Das mit den Pfaden ist unter 1 min. erledigt, aber die 'Dateien-Tabelle' braucht ca. 45 Minuten. (ok, es ist ein Netzlaufwerk, das durchsucht wird)

    Danke schomma' für euere Hilfe.

    Gruß Freddy

  • Happy Birthday eukalyptus

    • neod
    • 3. März 2012 um 11:24

    Von mir auch noch 'nen 'Herzlichen Glühstrumpf' :party:

  • Herzlichen Glückwunsch Raupi

    • neod
    • 26. November 2011 um 18:15

    Happy Schlüpftag Raupi ;)

  • name22 feiert seinen 17ten

    • neod
    • 5. Oktober 2011 um 19:49

    Auch von mir ein "herzlicher Glückwunsch" zum B-Day ... feier noch schön! :party:

  • Problemchen bei meinem Projekt

    • neod
    • 24. September 2011 um 15:57

    Hallo!

    Zuerst mal eine Entschuldigung für den nicht aussagekräftigen Thread-Namen.
    Warum ich ihn gewählt habe wird hoffentlich beim Lesen meines Posts deutlich.

    Nach längerem experimentieren hab ich mich jetzt doch entschlossen euch um Rat und Hilfe zu bitten.
    Irgendwie versteh ich das Zusammenspiel von Bitmap-Objekt, Grafik-Objekt und Kontext nicht so ganz, was bei meinem aktuellen Projekt ein ganz schöner Stolperstein ist.

    Aktuell besteht kein Problem.
    (Wer sich nicht den ganzen Text antun möchte kann auch gleich bei: Zu meinem eigentlichen Problem runterscrollen)

    kurze Vorgeschichte:

    Spoiler anzeigen


    Ich arbeite in einer Wafer-Fab, zugegeben, nur als "Montagehelfer". Jetzt hat die Nachbarabteilung einen Gut-Chip-Zähler bekommen, der die "guten" Chips auf einem Wafer (Siliziumscheibe mit Chips, siehe: http://upload.wikimedia.org/wikipedia/comm…_bis_8_Zoll.jpg ) zählt.
    Das ganze ist, einfach ausgedrückt, nichts weiter als eine Kamera, die den Wafer abfotografiert und ein PC mit einer Software, die an vorher definierten Stellen nach einer Farbänderung sucht.
    Als ich die Software gesehen habe dachte ich mir, "Mensch, sowas kannst du doch mit AutoIt auch umsetzen". Denkste, ... aber es ist sicher möglich, wenn auch nicht ganz sinnvoll. Jedoch ganz gut geeignet um sich endlich mal mit GDI+ zu beschäftigen und was neues zu lernen.


    Was ich in meinem kleinen, großen Projekt denn überhaupt erreichen möchte und was ich bisher umgesetzt habe.

    Was ich im dem Projekt überhaupt machen möchte:

    Spoiler anzeigen


    [ ] - Eine GUI mit "Wizard-Funktion" zum anlegen neuer Gutchip-Erkennungs-Rezepte
    Hier will ich Dinge wie die Anzahl der zu findenden Chips, min-Qualität des zu findenden Bildes (Stichwort 'pattern', welches
    ich wohl Zukünftig eher verwende), etc. hinterlegen
    [ ] - Webcam-Aufnahme des Wafers
    [x] - Erkennen der Wafer-Dimensionen/-Kanten (funktioniert so weit am Testbild)
    [ ] - Rotationskontrolle, bzw. Drehung des Bildes, so dass das "Flat" (grade Kante am Wafer) oben ist
    [ ] - Abgleich eines vorher definierten Bildbereichs (pattern) (im Wizard) mit der aktuellen Aufnahme
    [ ] - eventuell die Möglichkeit der manuellen Justage der Parameter, falls das Ergebnis nicht den Erwartungen entspricht
    [ ] - Ausgabe des Ergebnis am Bildschirm und einem Textfile (was wohl das einzige ist, was ich ohne Probleme lösen kann)
    Für den Rest ist lernen, lernen, lernen und noch mehr probieren angesagt :)


    Da das ganze, wenn es denn mal funktioniert, auch für diesen Bot-Mist Verwendung finden könnte, scheu ich mich davor das ganze in einem etwas fertigerem Stadium zu veröffentlichen. Wie ist euere Meinung dazu?

    Zu meinem eigentlichen Problem - gelöst:
    Was ich ein wenig entmutigt hatte, war die Tatsache, dass ich in einem so frühen Stadium bereits an meine Grenzen zu stoßen schien. Aber hey, ich will ja was lernen bei der Sache.

    Mein bisheriger Code, von unnötigem beeinigt:

    Spoiler anzeigen
    [autoit]


    #cs ----------------------------------------------------------------------------
    AutoIt Version: 3.3.6.1
    Author: fred
    Script Function: edge-finding & rect-drawing
    #ce ----------------------------------------------------------------------------

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

    #include <WindowsConstants.au3>
    #include <ButtonConstants.au3>
    #include <GuiConstantsEx.au3>
    #include <array.au3>
    #Include <Timers.au3>
    #include <GDIPlus.au3>
    #include <GDIP.au3>

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

    ;#include <ScreenCapture.au3>

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

    ; GLOBALE VARIABLEN
    Global $hBitmap_work, $hBitmap_show, $hGraphic; Handle der Bilder
    Global $GUI_windowhandle; testweise

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

    ; Bessere Lösung bekannt und wird im späteren Verlauf umgesetzt...
    Global $return_x_left_temp[6]; Array-Rückgabe vom ersten Durchlauf von "wafer_align_horizontal()"
    Global $return_BMP_Info[5]

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

    Global $iX
    Global $iY

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

    ; GUI-VARIABLEN
    Global $btn_1

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

    Opt("GuiOnEventMode", 1)
    Opt("GUICloseOnESC", 1)

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

    $GUI_Form = GUICreate('test-edge-finder', 1000, 700 )
    $btn_1 = GUICtrlCreateButton ( "Ausführen was hinterlegt ist (test)", 890, 600, 100 , 75, $BS_MULTILINE )
    GUICtrlSetOnEvent(-1, 'image_perform'); Funktion definieren (--> Button-Click)
    GUISetState(@SW_SHOW, $GUI_Form )

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "_exit" ); Funktion zum Beenden definieren

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

    $return_BMP_Info = pre_GIU_Funktion()

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

    $iX = $return_BMP_Info[1]; Bildbreite
    $iY = $return_BMP_Info[2]; Bildhöhe
    $hBitmap_show = $return_BMP_Info[3]; Bitmap-Handle - Bild das angezeigt wird

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

    show_in_GUI($GUI_Form, $hBitmap_show, $iX, $iY )

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

    $start = 1
    While $start
    Sleep(250)
    WEnd

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

    ; ############ Start - FUNKTIONSDEFINITIONEN #########################
    Func pre_GIU_Funktion()

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

    _GDIPlus_Startup (); Initialize GDI+ library

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

    $sFileName = @ScriptDir & "\wafer.bmp"; Pfad & Dateinamen zum Bild (BMP)
    $hBitmap_work = _GDIPlus_BitmapCreateFromFile($sFileName); Returns: Handle to a Bitmap object
    $hBitmap_show = $hBitmap_work; Dubliziere BitmapHandle

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

    $iX = _GDIPlus_ImageGetWidth($hBitmap_work); Bildbreite
    $iY = _GDIPlus_ImageGetHeight($hBitmap_work); Bildhöhe

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

    ; Rückgabewerte setzen
    ;$return_BMP_Info[5]
    $return_BMP_Info[0] = 2; Anzahl der Rückgabewerte
    $return_BMP_Info[1] = $iX; Bildbreite
    $return_BMP_Info[2] = $iY; Bildhöhe
    $return_BMP_Info[3] = $hBitmap_show; Bitmap-Handle - Bild das angezeigt wird
    $return_BMP_Info[4] = $hBitmap_work; Bitmap-Handle - Bild das bearbeitet wird
    Return $return_BMP_Info

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

    EndFunc

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

    ; ##################################################################
    Func show_in_GUI($GUI_windowhandle, $bitmap2show, $iW, $iH )
    ;~ Local $GUI_windowhandle; windows handle to show bitmap in
    ;~ Local $bitmap2show; Bitmap Handle
    ;~ ; not used -Local $iX; The X coordinate of the upper left corner of the rendered image
    ;~ ; not used -Local $iY; The Y coordinate of the upper left corner of the rendered image
    ;~ Local $iW; Specifies the width of the destination rectangle at which to draw the image
    ;~ Local $iH; Specifies the height of the destination rectangle at which to draw the image

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

    ; START - Anzeige in GUI
    ;Local $hGraphic = _GDIPlus_GraphicsCreateFromHWND($GUI_windowhandle)
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($GUI_windowhandle)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap_show, 0, 0, $iW, $iH ) ;die Figur wird an der neuen Position gezeichnet
    ; ENDE - Anzeige in GUI
    EndFunc

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

    ; $iX=Bildbreite $iY=Bildhöhe
    Func wafer_align_horizontal($iX, $iY)

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

    ; Variablen
    Local $y_axis_max = $iY; max-Wert der Y-Achse
    Local $x_axis_max = $iX-2; max-Wert der X-Achse-- TESTWEISE
    Local $x_axis_part_A_max = $iX / 2; linke Seite max-Wert
    Local $x_axis_part_B_init = $x_axis_part_A_max; rechte Seite start-Wert
    Local $step = 20; Schrittweite für Überprüfung

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

    Local $starttime = _Timer_Init(); Timer initialisieren (für Laufzeit edge-finding horizontal-left)

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

    ; x- & y-Positionen zu Beginn der Funktion setzen
    Local $cord_x_left_min = $x_axis_part_A_max; Var der x-cord des zuletzt gefundenen min-Werts
    Local $cord_x_left_min_old = 0 ;$x_axis_max; Var der x-cord des zuvor gefundenen min-Werts
    Local $row_cord_left_of_min_x = 0; Var der y-cord des zuletzt gefundenen Werts
    Local $row_cord_left_of_min_x_old = 0; Var der y-cord des zuvor gefundenen Werts

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

    ; jede Zeile prüfen ... von y-Achse=1 bis y-Achse=Bildhöhe
    For $y_axis=1 To $y_axis_max Step $step; ### START - Bild vertikal abarbeiten

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

    ; erstes Pixel der Zeile einlesen
    Local $init_pixel = _GDIPlus_BitmapGetPixel($hBitmap_work, 1, $y_axis) ; init-Pixel, gegen das wir prüfen (1. Pixel in jeder Zeile)

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

    ; jedes Pixel der Zeile gegen das erste auf Änderung prüfen
    For $x_axis=1 To $x_axis_part_A_max ; ####################### START - jedes Pixel der Zeile prüfen - LEFT

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

    Local $left_side_pixel = _GDIPlus_BitmapGetPixel($hBitmap_work, $x_axis, $y_axis ); jedes Pixel der Zeile (linke Seite) einlesen

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

    If $init_pixel = $left_side_pixel Then; Pixel noch NICHT gefunden
    ; nichts unternehmen

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

    ; ### Bei Fund eines geänderten Pixels
    Else; $init_pixel != $left_side_pixel ; geändertes Pixel gefunden

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

    If $cord_x_left_min > $x_axis Then
    $cord_x_left_min_old = $cord_x_left_min
    $cord_x_left_min = $x_axis
    $row_cord_left_of_min_x_old = $row_cord_left_of_min_x
    $row_cord_left_of_min_x = $y_axis
    ; Kontrollmeldung
    ; MsgBox(0,"INFO","IF-Fall --> '$cord_x_left_min > $x_axis' --> 'ExitLoop' ausgeführt" )
    ExitLoop; innere FOR-Schleife verlassen

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

    ElseIf $cord_x_left_min < $x_axis Then ;AND $cord_x_left_min <> $x_axis_part_A_max Then
    $cord_x_left_min_old = $cord_x_left_min
    $cord_x_left_min = $x_axis
    $row_cord_left_of_min_x_old = $row_cord_left_of_min_x
    $row_cord_left_of_min_x = $y_axis

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

    ; Kontrollmeldung
    ;~ MsgBox(0,"INFO","ElseIF-Fall --> '$cord_x_left_min < $x_axis' --> 'ExitLoop 2' ausgeführt" & @CRLF & _
    ;~ "$cord_x_left_min = " & $cord_x_left_min_old & " #|# $x_axis = " & $cord_x_left_min & @CRLF & _
    ;~ "$row_cord_left_of_min_x = " & $row_cord_left_of_min_x )

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

    ExitLoop 2; beide FOR-Schleifen verlassen

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

    Else
    ; Kontrollmeldung
    ;~ MsgBox(0, "Info","Else-Fall --> '$cord_x_left_min = $x_axis' --> 'ExitLoop' ausgeführt" & @CRLF & _
    ;~ "X - Aktueller min-Wert (Links): " & $x_axis & @CRLF & _
    ;~ "Y - Aktueller y-Wert (Links): " & $y_axis & @CRLF & _
    ;~ "$cord_x_left_min = " & $cord_x_left_min & " #|# $x_axis = " & $x_axis )

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

    ExitLoop; innere FOR-Schleife verlassen

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

    EndIf

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

    EndIf
    Next; ############################################################### ENDE - jedes Pixel der Zeile prüfen - LEFT

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

    Next; ### ENDE - Bild vertikal abarbeiten

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

    Local $runtime_left = Round( _Timer_Diff($starttime), 2)

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

    MsgBox(0, "Info","Funktionsdauer (Links): " & $runtime_left & "ms" & @CRLF & _
    "X - Erster min-Wert (Links): " & $cord_x_left_min_old & @CRLF & _
    "Y - Erster, kleinster y-Wert (Links): " & $row_cord_left_of_min_x_old & @CRLF & _
    "X - Letzter min-Wert (Links): " & $cord_x_left_min & @CRLF & _
    "Y - Letzter, kleinster y-Wert (Links): " & $row_cord_left_of_min_x )

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

    $return_x_left_temp[0] = $runtime_left
    $return_x_left_temp[1] = $cord_x_left_min
    $return_x_left_temp[2] = $cord_x_left_min_old
    $return_x_left_temp[3] = $row_cord_left_of_min_x
    $return_x_left_temp[4] = $row_cord_left_of_min_x_old
    $return_x_left_temp[5] = $step

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

    Return $return_x_left_temp

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

    EndFunc ;==>wafer_align_horizontal

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

    Func wafer_align_horizontal_rigid($return_x_left)

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

    $runtime_left = $return_x_left[0]
    $cord_x_left_min = $return_x_left[1]
    $cord_x_left_min_old = $return_x_left[2]
    $row_cord_left_of_min_x = $return_x_left[3]
    $row_cord_left_of_min_x_old = $return_x_left[4]
    $step_used = $return_x_left[5]

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

    Local $upper_left = $cord_x_left_min_old
    Local $lower_left = $cord_x_left_min

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

    If $upper_left < $lower_left Then
    $lower_left = $upper_left
    Else
    $upper_left = $lower_left
    EndIf

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

    ; Variablen
    Local $x_axis_part_A_max = $iX / 2; linke Seite max-Wert
    Local $schalter1 = 0

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

    Local $y_axis_max = $iY; max-Wert der Y-Achse
    Local $x_axis_max = $iX-2; max-Wert der X-Achse-- TESTWEISE
    Local $x_axis_part_B_init = $x_axis_part_A_max; rechte Seite start-Wert
    ;Local $step = 20; Schrittweite für Überprüfung

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

    Local $starttime = _Timer_Init(); Timer initialisieren (für Laufzeit edge-finding horizontal-left)

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

    For $y_axis=$row_cord_left_of_min_x_old - $step_used To $row_cord_left_of_min_x + $step_used; ### START - Bild vertikal abarbeiten

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

    Local $init_pixel = _GDIPlus_BitmapGetPixel($hBitmap_work, 1, $y_axis); $i=$y_axis --> ; erstes Pixel der Zeile einlesen

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

    ; #### START - jedes Pixel der Zeile gegen das erste auf Änderung prüfen (links) ####
    For $x_axis=1 To $x_axis_part_A_max
    Local $left_side_pixel = _GDIPlus_BitmapGetPixel($hBitmap_work, $x_axis, $y_axis ); jedes Pixel der Zeile (linke Seite) einlesen

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

    If $init_pixel = $left_side_pixel Then; Pixel noch NICHT gefunden
    ; nichts unternehmen

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

    Else; $init_pixel != $left_side_pixel ; geändertes Pixel gefunden

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

    If $x_axis > $cord_x_left_min Then
    ; nichts machen, da nicht der "Max-Radius"
    ExitLoop

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

    ElseIf $x_axis = $cord_x_left_min And $schalter1=0 Then
    $cord_x_left_min_old = $x_axis
    $row_cord_left_of_min_x_old = $y_axis
    $cord_x_left_min = $x_axis
    $row_cord_left_of_min_x = $y_axis
    $schalter1=1
    ExitLoop

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

    ElseIf $x_axis = $cord_x_left_min And $schalter1=1 Then
    $cord_x_left_min = $x_axis
    $row_cord_left_of_min_x = $y_axis
    ExitLoop

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

    ElseIf $x_axis < $cord_x_left_min Then
    $cord_x_left_min_old = $x_axis; letzte Position auf x-Achse
    $row_cord_left_of_min_x_old = $y_axis; letzte Position auf y-Achse
    $cord_x_left_min = $x_axis; aktuelle Position auf der x-Achse
    $row_cord_left_of_min_x = $y_axis; aktuelle Position auf der y-Achse
    $schalter1=1
    ExitLoop

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

    ElseIf $x_axis > $cord_x_left_min And $schalter1=1 Then
    ExitLoop 2; beide FOR-Schleifen verlassen

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

    Else
    ; nichts machen, da in einem nicht definierten Zustand

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

    EndIf

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

    EndIf
    Next; ############################################################### ENDE - jedes Pixel der Zeile prüfen - LEFT
    Next; ############################################################### ENDE - Bild vertikal abarbeiten

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

    Local $min_left = $cord_x_left_min
    Local $min_left_row = $row_cord_left_of_min_x_old - $row_cord_left_of_min_x
    $min_left_row = $min_left_row /2
    $min_left_row = $row_cord_left_of_min_x + $min_left_row

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

    Local $runtime_left = Round( _Timer_Diff($starttime)+$runtime_left, 2)

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

    MsgBox(0, "Info","Funktionsdauer Links (Insgesamt): " & $runtime_left & "ms" & @CRLF & _
    "X - Minimaler X-Wert Links (größter 'Radius'): " & $min_left & @CRLF & _
    "Y - Zeile des min-Wert-Y: " & $min_left_row )

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

    $return_x_left_temp[0] = $runtime_left
    $return_x_left_temp[1] = $min_left
    $return_x_left_temp[2] = $min_left_row

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

    Return $return_x_left_temp

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

    EndFunc

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

    Func _draw_a_line($Param)
    ; Syntax.........: _GDIPlus_GraphicsDrawLines($hGraphics, $aPoints[, $hPen = 0])
    ; Parameters ....: $hGraphics - Pointer to a Graphics object
    ; $aPoints - Array of points that specify the starting and ending points of the lines:
    ; |[0][0] - Number of points
    ; |[1][0] - Point 1 X position
    ; |[1][1] - Point 1 Y position
    ; |[2][0] - Point 2 X position
    ; |[2][1] - Point 2 Y position
    ; |[n][0] - Point n X position
    ; |[n][1] - Point n Y position
    ; $hPen - Handle to a pen object that is used to draw the splines. If 0, a solid black pen with a width of
    ; +1 will be used.

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

    Local $min_left
    $min_left = $Param[1]

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

    $hGraphicContext = _GDIPlus_ImageGetGraphicsContext ($hGraphic)
    _GDIPlus_GraphicsDrawLine($hGraphic, $min_left, 20, $min_left, 500 )

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

    EndFunc

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

    Func image_perform()
    wafer_align_horizontal($iX, $iY)
    $return_x_left_temp = wafer_align_horizontal_rigid($return_x_left_temp)
    _draw_a_line($return_x_left_temp)
    EndFunc

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

    Func _exit()

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

    ; Clean up resources
    _GDIPlus_BitmapDispose ($hBitmap_show)
    _GDIPlus_BitmapDispose ($hBitmap_work)
    _GDIPlus_GraphicsDispose($hGraphic)
    ; OLD_WinAPI_DeleteObject ($hBitmap_object)

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

    ; Shut down GDI+ library
    _GDIPlus_ShutDown ()

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

    exit
    EndFunc

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

    ; ############ Ende - FUNKTIONSDEFINITIONEN #########################

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

    ; $iX=Bildbreite $iY=Bildhöhe
    Func wafer_align_vertikal($iX, $iY)

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

    ; ...

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

    EndFunc ;==>wafer_align_vertical

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


    Benötigt wird noch das Testbild: 'wafer.bmp' im Skriptordner
    wafer.bmp

    Die Stelle, die mir Kopfzerbrechen bereitet hatte - gelöst:
    Wieso ich den Grafikkontext erzeugen muss, aber ins Grafikobjekt zeichne, versteh ich immer noch nicht.

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _draw_a_line($Param)
    $hGraphicContext = _GDIPlus_ImageGetGraphicsContext ($hGraphic)
    _GDIPlus_GraphicsDrawLine($hGraphic, $min_left, 20, $min_left, 500 )

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

    EndFunc

    [/autoit]


    Vielleicht hat trotzdem noch jemand eine Idee, wie sich die Kantenfindungs-Funktion besser/schneller umsetzen lässt.

    Wenn es genehm ist werde ich in diesem Thread weitere Fragen und Probleme zu diesem Projekt stellen und den Ausgangs-Thread den Fortschritten entsprechend editieren. Oder macht es mehr Sinn das ganze in "Projekte" zu verlagern?

    Ich bedanke mich schon mal bei allen, die bis hierhin durchgehalten haben ;)

    MfG Freddy

  • Problemchen bei meinem kleinen Auswerte-Tool

    • neod
    • 11. Januar 2011 um 20:26

    Danke für eure Hilfe!

    Das mit dem -1 bei GUICtrlSetState wusste ich bisher auch nicht. Ich hab immer den Variablennamen genommen. Macht das eigentlich einen Unterschied?

    [autoit]


    $Input_selectWafer_Von = GUICtrlCreateInput("", 536, 272, 41, 22)
    GUICtrlSetState($Input_selectWafer_Von, $GUI_HIDE)

    [/autoit]

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™