Jump to content

Recommended Posts

Posted (edited)

UPDATED 14/10/09

EDIT - also see my new GDI+ version of this UDF

Hi!

I've created a lot of programs/calculators that use graphs, and have been meaning to create a simple UDF to allow quick creation of graphs and their x / y axes.

Here is what I have done so far, I'll add other features as I come up with them.... hopefully it should end up with things like bar-charts, scatter plots etc in the future.

FUNCTIONS:

_Graph_Create ...............creates the graph area

_Graph_Clear..................removes any plotted items

_Graph_Delete.................deletes graph and labels

_Graph_SetRange_X.........sets the x axis

_Graph_SetRange_Y.........sets the Y axis

_Graph_Plot_Start............moves the starting plot position (equivalent to $GUI_GR_MOVE)

_Graph_Plot_Line.............draws a line

NEW FUNCTIONS (14/10/09):

_Graph_Plot_Point.............plots small square around x,y

_Graph_Plot_Dot...................plots a single pixel at x,y

_Graph_Set_PenSize................sets next pen size

_Graph_Set_Color..................sets the colour/background colour of next drawing

_Graph_Plot_Bar_X.................plots a bar chart bar along the x axis

_Graph_Plot_Bar_Y.................plots a bar chart bar along the y axis

_Graph_SetGrid_X..................sets the x axis grid

_Graph_SetGrid_Y..................sets the y axis grid

The UDF:

Graph UDF.au3

#include-once
#include <GUIConstantsEx.au3>

; #FUNCTION# ============================================================================
; Name...........: _Graph_Create
; Description ...: Creates graph area, and prepares array of specified data
; Syntax.........: _Graph_Create($iLeft,$iTop,$iWidth,$iHeight)
; Parameters ....: $iLeft - left most position in GUI
;                  $iTop - top most position in GUI
;                   $iWidth - width of graph in pixels
;                   $iHeight - height of graph in pixels
; Return values .: Returns array containing variables for subsequent functions...
;                    Returned Graph array is:
;                    [1] graphic control handle
;                    [2] left
;                    [3] top
;                    [4] width
;                    [5] height
;                    [6] x low
;                    [7] x high
;                    [8] y low
;                    [9] y high
;                    [10] x ticks handles
;                    [11] x labels handles
;                    [12] y ticks handles
;                    [13] y labels handles
;                    [14] Border Colour
;                    [15] Fill Colour
; =======================================================================================
Func _Graph_Create($iLeft,$iTop,$iWidth,$iHeight,$hColourBorder = 0x000000,$hColorFill = 0xFFFFFF)
    $hWnd = GUICtrlCreateGraphic($iLeft,$iTop,$iWidth+1,$iHeight+1)
    GUICtrlSetColor(-1,$hColourBorder)
    GUICtrlSetBkColor(-1,$hColorFill)
    Local $ahTicksLabelsX[1]
    Local $ahTicksLabelsY[1]
    Local $ahTicksX[1]
    Local $ahTicksY[1]
    Dim $aGraphArray[16] = ["",$hWnd,$iLeft,$iTop,$iWidth,$iHeight,0,1,0,1, _
    $ahTicksX,$ahTicksLabelsX,$ahTicksY,$ahTicksLabelsY,$hColourBorder,$hColorFill]
    Return $aGraphArray
EndFunc



; #FUNCTION# ============================================================================
; Name...........: _Graph_Delete
; Description ...: Deletes previously created graph and related ticks/labels
; Syntax.........: _Graph_Delete(ByRef $aGraphArray)
; Parameters ....: $aGraphArray - the array returned from _Graph_Create
; =======================================================================================
Func _Graph_Delete(ByRef $aGraphArray)
;----- delete x ticks/labels -----
    $ahTicksX = $aGraphArray[10]
    $ahTicksLabelsX = $aGraphArray[11]
    For $i = 1 to (UBound($ahTicksX) - 1)
        GUICtrlDelete($ahTicksX[$i])
    Next
    For $i = 1 to (UBound($ahTicksLabelsX) - 1)
        GUICtrlDelete($ahTicksLabelsX[$i])
    Next
;----- delete y ticks/labels -----
    $ahTicksY = $aGraphArray[12]
    $ahTicksLabelsY = $aGraphArray[13]
    For $i = 1 to (UBound($ahTicksY) - 1)
        GUICtrlDelete($ahTicksY[$i])
    Next
    For $i = 1 to (UBound($ahTicksLabelsY) - 1)
        GUICtrlDelete($ahTicksLabelsY[$i])
    Next
    Dim $ahTicksLabelsY[1]
;----- delete graphic control -----
    GUICtrlDelete($aGraphArray[1])
;----- close array -----
    $aGraphArray = 0
EndFunc



; #FUNCTION# ============================================================================
; Name...........: _Graph_Clear
; Description ...: Clears graph content
; Syntax.........: _Graph_Clear(ByRef $aGraphArray)
; Parameters ....: $aGraphArray - the array returned from _Graph_Create
; =======================================================================================
Func _Graph_Clear(ByRef $aGraphArray)
    GUICtrlDelete($aGraphArray[1])
    $aGraphArray[1] = GUICtrlCreateGraphic($aGraphArray[2],$aGraphArray[3], _
    $aGraphArray[4]+1,$aGraphArray[5]+1)
    GUICtrlSetBkColor(-1,0xFFFFFF)
    GUICtrlSetColor(-1,0x000000)
EndFunc



; #FUNCTION# ============================================================================
; Name...........: _Graph_SetRange_X
; Description ...: Allows user to set the range of the X axis and set ticks and rounding levels
; Syntax.........: _Graph_SetRange_X(ByRef $aGraphArray,$iLow,$iHigh,$iXTicks = 1,$bLabels = 1,$iRound = 0)
; Parameters ....:    $aGraphArray - the array returned from _Graph_Create
;                    $iLow - the lowest value for the X axis (can be negative)
;                    $iHigh - the highest value for the X axis
;                    $iXTicks - [optional] number of ticks to show below axis, if = 0 then no ticks created
;                    $bLabels - [optional] 1=show labels, any other number=do not show labels
;                    $iRound - [optional] rounding level of label values
; =======================================================================================
Func _Graph_SetRange_X(ByRef $aGraphArray,$iLow,$iHigh,$iXTicks = 1,$bLabels = 1,$iRound = 0)
;----- load user vars to array -----
    $aGraphArray[6] = $iLow
    $aGraphArray[7] = $iHigh
;----- prepare nested array -----
    $ahTicksX = $aGraphArray[10]
    $ahTicksLabelsX = $aGraphArray[11]
;----- delete any existing ticks -----
    For $i = 1 to (UBound($ahTicksX) - 1)
        GUICtrlDelete($ahTicksX[$i])
    Next
    Dim $ahTicksX[1]
;----- create new ticks -----
    For $i = 1 To $iXTicks + 1
        ReDim $ahTicksX[$i + 1]
        $ahTicksX[$i] = GUICtrlCreateLabel("",(($i - 1) * ($aGraphArray[4] / $iXTicks)) + $aGraphArray[2], _
        $aGraphArray[3] + $aGraphArray[5],1,5)
        GUICtrlSetBkColor(-1,0x000000)
        GUICtrlSetState(-1,$GUI_DISABLE)
    Next
;----- delete any existing labels -----
    For $i = 1 to (UBound($ahTicksLabelsX) - 1)
        GUICtrlDelete($ahTicksLabelsX[$i])
    Next
    Dim $ahTicksLabelsX[1]
;----- create new labels -----
    For $i = 1 To $iXTicks + 1
        ReDim $ahTicksLabelsX[$i + 1]
        $ahTicksLabelsX[$i] = GUICtrlCreateLabel("", _
        ($aGraphArray[2] + (($aGraphArray[4] / $iXTicks) * ($i - 1))) - (($aGraphArray[4] / $iXTicks) / 2), _
        $aGraphArray[3] + $aGraphArray[5] + 10,$aGraphArray[4] / $iXTicks,13,1)
        GUICtrlSetBkColor(-1,$GUI_BKCOLOR_TRANSPARENT)
    Next
;----- if labels are required, then fill -----
    If $bLabels = 1 Then
        For $i = 1 To (UBound($ahTicksLabelsX) - 1)
            GUICtrlSetData($ahTicksLabelsX[$i], _
            StringFormat("%." & $iRound & "f",_Graph_Reference_Pixel("p",(($i - 1) * ($aGraphArray[4] / $iXTicks)), _
            $aGraphArray[6],$aGraphArray[7],$aGraphArray[4])))
        Next
    EndIf
;----- load created arrays back into array -----
    $aGraphArray[10] = $ahTicksX
    $aGraphArray[11] = $ahTicksLabelsX
EndFunc



; #FUNCTION# ============================================================================
; Name...........: _Graph_SetRange_Y
; Description ...: Allows user to set the range of the Y axis and set ticks and rounding levels
; Syntax.........: _Graph_SetRange_Y(ByRef $aGraphArray,$iLow,$iHigh,$iYTicks = 1,$bLabels = 1,$iRound = 0)
; Parameters ....:    $aGraphArray - the array returned from _Graph_Create
;                    $iLow - the lowest value for the Y axis (can be negative)
;                    $iHigh - the highest value for the Y axis
;                    $iYTicks - [optional] number of ticks to show next to axis, if = 0 then no ticks created
;                    $bLabels - [optional] 1=show labels, any other number=do not show labels
;                    $iRound - [optional] rounding level of label values
; =======================================================================================
Func _Graph_SetRange_Y(ByRef $aGraphArray,$iLow,$iHigh,$iYTicks = 1,$bLabels = 1,$iRound = 0)
;----- load user vars to array -----
    $aGraphArray[8] = $iLow
    $aGraphArray[9] = $iHigh
;----- prepare nested array -----
    $ahTicksY = $aGraphArray[12]
    $ahTicksLabelsY = $aGraphArray[13]
;----- delete any existing ticks -----
    For $i = 1 to (UBound($ahTicksY) - 1)
        GUICtrlDelete($ahTicksY[$i])
    Next
    Dim $ahTicksY[1]
;----- create new ticks -----
    For $i = 1 To $iYTicks + 1
        ReDim $ahTicksY[$i + 1]
        $ahTicksY[$i] = GUICtrlCreateLabel("",$aGraphArray[2] - 5, _
        ($aGraphArray[3] + $aGraphArray[5]) - (($aGraphArray[5] / $iYTicks) * ($i - 1)),5,1)
        GUICtrlSetBkColor(-1,0x000000)
        GUICtrlSetState(-1,$GUI_DISABLE)
    Next
;----- delete any existing labels -----
    For $i = 1 to (UBound($ahTicksLabelsY) - 1)
        GUICtrlDelete($ahTicksLabelsY[$i])
    Next
    Dim $ahTicksLabelsY[1]
;----- create new labels -----
    For $i = 1 To $iYTicks + 1
        ReDim $ahTicksLabelsY[$i + 1]
        $ahTicksLabelsY[$i] = GUICtrlCreateLabel("",$aGraphArray[2] - 40, _
        ($aGraphArray[3] + $aGraphArray[5]) - (($aGraphArray[5] / $iYTicks) * ($i - 1)) - 6,30,13,2)
        GUICtrlSetBkColor(-1,$GUI_BKCOLOR_TRANSPARENT)
    Next
;----- if labels are required, then fill -----
    If $bLabels = 1 Then
        For $i = 1 To (UBound($ahTicksLabelsY) - 1)
            GUICtrlSetData($ahTicksLabelsY[$i],StringFormat("%." & $iRound & "f",_Graph_Reference_Pixel("p", _
            (($i - 1) * ($aGraphArray[5] / $iYTicks)),$aGraphArray[8],$aGraphArray[9],$aGraphArray[5])))
        Next
    EndIf
;----- load created arrays back into array -----
    $aGraphArray[12] = $ahTicksY
    $aGraphArray[13] = $ahTicksLabelsY
EndFunc



; #FUNCTION# =============================================================================
; Name...........: _Graph_Plot_Start
; Description ...: Move starting point of plot
; Syntax.........: _Graph_Plot_Start(ByRef $aGraphArray,$iX,$iY)
; Parameters ....:     $aGraphArray - the array returned from _Graph_Create
;                    $iX - x value to start at
;                    $iY - y value to start at
; ========================================================================================
Func _Graph_Plot_Start(ByRef $aGraphArray,$iX,$iY)
;----- MOVE pen to start point -----
    GUICtrlSetGraphic($aGraphArray[1],$GUI_GR_MOVE, _
    _Graph_Reference_Pixel("x",$iX,$aGraphArray[6],$aGraphArray[7],$aGraphArray[4]), _
    _Graph_Reference_Pixel("y",$iY,$aGraphArray[8],$aGraphArray[9],$aGraphArray[5]))
EndFunc



; #FUNCTION# =============================================================================
; Name...........: _Graph_Plot_Line
; Description ...: draws straight line to x,y from previous point / starting point
; Syntax.........: _Graph_Plot_Line(ByRef $aGraphArray,$iX,$iY)
; Parameters ....:     $aGraphArray - the array returned from _Graph_Create
;                    $iX - x value to draw to
;                    $iY - y value to draw to
; ========================================================================================
Func _Graph_Plot_Line(ByRef $aGraphArray,$iX,$iY)
;----- Draw line from previous point to new point -----
    GUICtrlSetGraphic($aGraphArray[1],$GUI_GR_LINE, _
    _Graph_Reference_Pixel("x",$iX,$aGraphArray[6],$aGraphArray[7],$aGraphArray[4]), _
    _Graph_Reference_Pixel("y",$iY,$aGraphArray[8],$aGraphArray[9],$aGraphArray[5]))
EndFunc



; #FUNCTION# =============================================================================
; Name...........: _Graph_Plot_Point
; Description ...: draws point at coords
; Syntax.........: _Graph_Plot_Point(ByRef $aGraphArray,$iX,$iY)
; Parameters ....:     $aGraphArray - the array returned from _Graph_Create
;                    $iX - x value to draw at
;                    $iY - y value to draw at
; ========================================================================================
Func _Graph_Plot_Point(ByRef $aGraphArray,$iX,$iY)
;----- Draw point from previous point to new point -----
    GUICtrlSetGraphic($aGraphArray[1],$GUI_GR_DOT, _
    _Graph_Reference_Pixel("x",$iX,$aGraphArray[6],$aGraphArray[7],$aGraphArray[4]), _
    _Graph_Reference_Pixel("y",$iY,$aGraphArray[8],$aGraphArray[9],$aGraphArray[5]))
EndFunc



; #FUNCTION# =============================================================================
; Name...........: _Graph_Plot_Dot
; Description ...: draws single pixel dot at coords
; Syntax.........: _Graph_Plot_Dot(ByRef $aGraphArray,$iX,$iY)
; Parameters ....:   $aGraphArray - the array returned from _Graph_Create
;                    $iX - x value to draw at
;                    $iY - y value to draw at
; ========================================================================================
Func _Graph_Plot_Dot(ByRef $aGraphArray,$iX,$iY)
;----- Draw point from previous point to new point -----
    GUICtrlSetGraphic($aGraphArray[1],$GUI_GR_PIXEL, _
    _Graph_Reference_Pixel("x",$iX,$aGraphArray[6],$aGraphArray[7],$aGraphArray[4]), _
    _Graph_Reference_Pixel("y",$iY,$aGraphArray[8],$aGraphArray[9],$aGraphArray[5]))
EndFunc



; #FUNCTION# =============================================================================
; Name...........: _Graph_Set_Color
; Description ...: sets the color for the next drawing
; Syntax.........: _Graph_Set_Color(ByRef $aGraphArray,$hColor,$hBkGrdColor = $GUI_GR_NOBKCOLOR)
; Parameters ....:   $aGraphArray - the array returned from _Graph_Create
;                    $hColor - the color of the next item
;                    $hBkGrdColor - the background color of the next item
; ========================================================================================
Func _Graph_Set_Color(ByRef $aGraphArray,$hColor,$hBkGrdColor = $GUI_GR_NOBKCOLOR)
    GUICtrlSetGraphic($aGraphArray[1],$GUI_GR_COLOR,$hColor,$hBkGrdColor)
EndFunc



; #FUNCTION# =============================================================================
; Name...........: _Graph_Set_PenSize
; Description ...: sets the pen for the next drawing
; Syntax.........: _Graph_Set_PenSize(ByRef $aGraphArray,$iSize = 1)
; Parameters ....:   $aGraphArray - the array returned from _Graph_Create
;                    $iSize - size of pen line
; ========================================================================================
Func _Graph_Set_PenSize(ByRef $aGraphArray,$iSize = 1)
    GUICtrlSetGraphic($aGraphArray[1],$GUI_GR_PENSIZE,$iSize)
EndFunc



; #FUNCTION# =============================================================================
; Name...........: _Graph_Plot_Bar_X
; Description ...: Draws bar chart bar from the x axis
; Syntax.........: _Graph_Plot_Bar_X(ByRef $aGraphArray,$iStart,$iWidth,$nYValue,$hColor = 0x000000,$hBkGrdColor = $GUI_GR_NOBKCOLOR)
; Parameters ....:   $aGraphArray - the array returned from _Graph_Create
;                    $iStart - the x axis value for start of bar (in x axis units)
;                    $iWidth - width of the bar (in x axis units)
;                    $nYValue - 'height' of the bar (in y axis units)
;                    $hColor - Bar border colour
;                    $hBkGrdColor - Bar fill colour
; ========================================================================================
Func _Graph_Plot_Bar_X(ByRef $aGraphArray,$iStart,$iWidth,$nYValue,$hColor = 0x000000,$hBkGrdColor = $GUI_GR_NOBKCOLOR)
;----- Draw Bar for BarChart Application -----
    _Graph_Set_Color($aGraphArray,$hColor,$hBkGrdColor)
    GUICtrlSetGraphic($aGraphArray[1],$GUI_GR_RECT, _
        _Graph_Reference_Pixel("x",$iStart,$aGraphArray[6],$aGraphArray[7],$aGraphArray[4]), _ ;x
        $aGraphArray[5]+1, _
        Round(_Graph_Reference_Pixel("x",$iStart + $iWidth,$aGraphArray[6],$aGraphArray[7],$aGraphArray[4]) - _ ;width
        _Graph_Reference_Pixel("x",$iStart,$aGraphArray[6],$aGraphArray[7],$aGraphArray[4]) + 1), _
        - $aGraphArray[5] + _Graph_Reference_Pixel("y",$nYValue,$aGraphArray[8],$aGraphArray[9],$aGraphArray[5]) - 1) ;height
    ;- redraw axis in case coloured -
    _Graph_Set_Color($aGraphArray,$aGraphArray[14],$GUI_GR_NOBKCOLOR)
    GUICtrlSetGraphic($aGraphArray[1],$GUI_GR_RECT,0,0,$aGraphArray[4]+1,$aGraphArray[5]+1)
    ;- set colour back to default -
    _Graph_Set_Color($aGraphArray,0x000000,$GUI_GR_NOBKCOLOR)
EndFunc



; #FUNCTION# =============================================================================
; Name...........: _Graph_Plot_Bar_Y
; Description ...: Draws bar chart bar from the y axis
; Syntax.........: _Graph_Plot_Bar_Y(ByRef $aGraphArray,$iStart,$iWidth,$nYValue,$hColor = 0x000000,$hBkGrdColor = $GUI_GR_NOBKCOLOR)
; Parameters ....:   $aGraphArray - the array returned from _Graph_Create
;                    $iStart - the y axis value for start of bar (in y axis units)
;                    $iWidth - width of the bar (in y axis units)
;                    $nXValue - 'length' of the bar (in x axis units)
;                    $hColor - Bar border colour
;                    $hBkGrdColor - Bar fill colour
; ========================================================================================
Func _Graph_Plot_Bar_Y(ByRef $aGraphArray,$iStart,$iWidth,$nYValue,$hColor = 0x000000,$hBkGrdColor = $GUI_GR_NOBKCOLOR)
;----- Draw Bar for BarChart Application -----
    _Graph_Set_Color($aGraphArray,$hColor,$hBkGrdColor)
    GUICtrlSetGraphic($aGraphArray[1],$GUI_GR_RECT, _
        0, _ ;x
        _Graph_Reference_Pixel("y",$iStart + $iWidth,$aGraphArray[8],$aGraphArray[9],$aGraphArray[5]), _ ;y
        _Graph_Reference_Pixel("x",$nYValue,$aGraphArray[6],$aGraphArray[7],$aGraphArray[4]) + 1, _ ;width
        _Graph_Reference_Pixel("y",$iStart,$aGraphArray[8],$aGraphArray[9],$aGraphArray[5]) - _ ;height
        _Graph_Reference_Pixel("y",$iStart + $iWidth,$aGraphArray[8],$aGraphArray[9],$aGraphArray[5]) + 1)
    ;- redraw axis in case coloured -
    _Graph_Set_Color($aGraphArray,$aGraphArray[14],$GUI_GR_NOBKCOLOR)
    GUICtrlSetGraphic($aGraphArray[1],$GUI_GR_RECT,0,0,$aGraphArray[4]+1,$aGraphArray[5]+1)
    ;- set colour back to default -
    _Graph_Set_Color($aGraphArray,0x000000,$GUI_GR_NOBKCOLOR)
EndFunc



; #FUNCTION# =============================================================================
; Name...........: _Graph_SetGrid_X
; Description ...: Adds X gridlines.
; Syntax.........: _Graph_SetGrid(ByRef $aGraphArray, $Ticks=1, $hColor=0xf0f0f0)
; Parameters ....:  $aGraphArray - the array returned from _Graph_Create
;                   $Ticks - sets line at every nth unit assigned to axis
;                   $hColor - [optional] RGB value, defining color of grid. Default is a light gray
; =======================================================================================
Func _Graph_SetGrid_X(ByRef $aGraphArray, $Ticks=1, $hColor=0xf0f0f0)
    _Graph_Set_Color($aGraphArray,$hColor,$GUI_GR_NOBKCOLOR)
    Select
        Case $Ticks > 0
            For $i = $aGraphArray[6] To $aGraphArray[7] Step $Ticks
                If $i = Number($aGraphArray[6]) Or $i = Number($aGraphArray[7]) Then ContinueLoop
                    GUICtrlSetGraphic($aGraphArray[1],$GUI_GR_RECT, _ ;rectangle
                    _Graph_Reference_Pixel("x",$i,$aGraphArray[6],$aGraphArray[7],$aGraphArray[4]), _ ;x
                    1, _ ;y
                    1, _ ;width
                    $aGraphArray[5] - 1) ;height
            Next
    EndSelect
    _Graph_Set_Color($aGraphArray,0x000000)
EndFunc



; #FUNCTION# =============================================================================
; Name...........: _Graph_SetGrid_Y
; Description ...: Adds Y gridlines.
; Syntax.........: _Graph_SetGrid(ByRef $aGraphArray, $Ticks=1, $hColor=0xf0f0f0)
; Parameters ....:  $aGraphArray - the array returned from _Graph_Create
;                   $Ticks - sets line at every nth unit assigned to axis
;                   $hColor - [optional] RGB value, defining color of grid. Default is a light gray
; =======================================================================================
Func _Graph_SetGrid_Y(ByRef $aGraphArray, $Ticks=1, $hColor=0xf0f0f0)
    _Graph_Set_Color($aGraphArray,$hColor,$GUI_GR_NOBKCOLOR)
    Select
        Case $Ticks > 0
            For $i = $aGraphArray[8] To $aGraphArray[9] Step $Ticks
                If $i = Number($aGraphArray[8]) Or $i = Number($aGraphArray[9]) Then ContinueLoop
                    GUICtrlSetGraphic($aGraphArray[1],$GUI_GR_RECT, _ ;rectangle
                    1, _ ;x
                    _Graph_Reference_Pixel("y",$i,$aGraphArray[8],$aGraphArray[9],$aGraphArray[5]), _ ;y
                    $aGraphArray[4] - 1, _ ;width
                    1) ;height
            Next
    EndSelect
    _Graph_Set_Color($aGraphArray,0x000000)
EndFunc



; #FUNCTION# =============================================================================
; Name...........: _Graph_Refresh
; Description ...: refreshes the graphic
; Syntax.........: _Graph_Refresh(ByRef $aGraphArray)
; Parameters ....:   $aGraphArray - the array returned from _Graph_Create
; ========================================================================================
Func _Graph_Refresh(ByRef $aGraphArray)
    GUICtrlSetGraphic($aGraphArray[1],$GUI_GR_REFRESH)
EndFunc



; #FUNCTION# =============================================================================
; Name...........: _Graph_Reference_Pixel
; Description ...: INTERNAL FUNCTION - performs pixel reference calculations
; Syntax.........: _Graph_Reference_Pixel($iType,$iValue,$iLow,$iHigh,$iTotalPixels)
; Parameters ....:     $iType - "x"=x axis pix, "y" = y axis pix, "p"=value from pixels
;                    $iValue - pixels reference or value
;                    $iLow - lower limit of axis
;                    $iHigh - upper limit of axis
;                    $iTotalPixels - total number of pixels in range (either width or height)
; =========================================================================================
Func _Graph_Reference_Pixel($iType,$iValue,$iLow,$iHigh,$iTotalPixels)
;----- perform pixel reference calculations -----
    Switch $iType
        Case "x"
            Return (($iTotalPixels/($iHigh-$iLow))*(($iHigh-$iLow)*(($iValue-$iLow)/($iHigh-$iLow))))
        Case "y"
            Return ($iTotalPixels - (($iTotalPixels/($iHigh-$iLow))*(($iHigh-$iLow)*(($iValue-$iLow)/($iHigh-$iLow)))))
        Case "p"
            Return ($iValue / ($iTotalPixels/ ($iHigh - $iLow))) + $iLow
    EndSwitch
EndFunc

Example usage:

post-29091-12554827927848_thumb.jpg

post-29091-12554829176563_thumb.jpg

post-29091-12554841977305_thumb.jpg

Notes:

Thanks to joseLB for looking at adding grid lines to the graph area. I hope you don't mind, but I changed the approach quite a bit. I wanted to keep it in line with the 'standardised' approach of the other functions.

Actually, I wish I'd approached this UDF in a completely different way now, but it's used throughout my statistical software and major changes would render those programs useless! argh!

Feel free to comment / criticise!

Edited by andybiochem
- Table UDF - create simple data tables - Line Graph UDF GDI+ - quickly create simple line graphs with x and y axes (uses GDI+ with double buffer) - Line Graph UDF - quickly create simple line graphs with x and y axes (uses AI native graphic control) - Barcode Generator Code 128 B C - Create the 1/0 code for barcodes. - WebCam as BarCode Reader - use your webcam to read barcodes - Stereograms!!! - make your own stereograms in AutoIT - Ziggurat Gaussian Distribution RNG - generate random numbers based on normal/gaussian distribution - Box-Muller Gaussian Distribution RNG - generate random numbers based on normal/gaussian distribution - Elastic Radio Buttons - faux-gravity effects in AutoIT (from javascript)- Morse Code Generator - Generate morse code by tapping your spacebar!
Posted (edited)

Just tested and work fine. Very easy to use. ;)

Gosh, that was quick!! Thank you for testing!

I've just noticed something 'unusual' about the example screen-shot (now removed) I gave above...the x axis labels are 2, 4, 6, 8, 11, 13, 15...

Thought I'd explain why this happens before ppl comment:...

The label names are calculated from the specified upper and lower limits in _Graph_SetRange_X, and the floats are rounded by the function. So make sure you specify a rounding value if you want to avoid this anomaly!!!

Edited by andybiochem
- Table UDF - create simple data tables - Line Graph UDF GDI+ - quickly create simple line graphs with x and y axes (uses GDI+ with double buffer) - Line Graph UDF - quickly create simple line graphs with x and y axes (uses AI native graphic control) - Barcode Generator Code 128 B C - Create the 1/0 code for barcodes. - WebCam as BarCode Reader - use your webcam to read barcodes - Stereograms!!! - make your own stereograms in AutoIT - Ziggurat Gaussian Distribution RNG - generate random numbers based on normal/gaussian distribution - Box-Muller Gaussian Distribution RNG - generate random numbers based on normal/gaussian distribution - Elastic Radio Buttons - faux-gravity effects in AutoIT (from javascript)- Morse Code Generator - Generate morse code by tapping your spacebar!
  • 1 month later...
Posted

Hi!

I've created a lot of programs/calculators that use graphs, and have been meaning to create a simple UDF to allow quick creation of graphs and their x / y axes.

Here is what I have done so far, I'll add other features as I come up with them.... hopefully it should end up with things like bar-charts, scatter plots etc in the future.

Looking forward to that!

Thanks for sharing.

Don't bother, It's inside your monitor!------GUISetOnEvent should behave more like HotKeySet()
  • 6 months later...
  • 3 months later...
Posted

Hi Andy, great job! Simple to use and straigth to the point!

I did an AU3 to graph about 750 points in almost no time with your UDF and your example.

I was tooking lots of time trying to do it with GDI+ functions, but labeling X, Y is a nightmare...

I just would like to suggest one more function for labeling + grid

_Graph_Labels(title, Xlabel,Ylabel,Xgrid,Ygrid, grid intensity)
where:
title= string with title that appears centered at top of graph
Xlabel= string with text that appears centered at bottom of graph
Ylabel= string with text that appears over the x axis
Xgrid= 0 -> no grid, other numbers = multiple/submultiple of Xtics, where:
           1=    one vertical line over each Xtick, 
           0.5=  one vertical line over each half Xtick,
           2=    one vertical line over each 2 Xtick,  and so on... (3, 4,...)
Ygrid= 0 -> no grid, other numbers = multiple/submultiple of Ytics, where:
           1=    one vertical line over each Ytick, 
           0.5=  one vertical line over each half Ytick,
           2=    one vertical line over each 2 Ytick,  and so on... (3, 4,...)
Grid Intensity= 0 to 255 for X/Y grid (gray scale )

Thanks

Jose

Posted (edited)

Hi Andy

I did a Grid Function for your UDF! I hope you like it.

All others interested in grids!

Add this code to Andy's UDF so you can do Grids on your graphics

; #FUNCTION# =============================================================================
; Name...........: _Graph_Grid
; Description ...: makes X and/or Y grid. 
; Syntax.........: _Graph_Grid($graph, $Xlines, $Ylines, $color=0xf0f0f0)
; Parameters ....: $Grap - the array returned from _Graph_Create
;     $Xlines - # of grid lines per _Graph_SetRange_X  Xticks -> 1= one line per tick,   2= 1 line at each 2 ticks...,   
;                0.5= 2 lines per tic.  Default=1,  and 0=no X grid
;     $Ylines - # of grid lines per _Graph_SetRange_Y  Yticks -> 1= one line per tick,   2= 1 line at each 2 ticks...,
;                 0.5= 2 lines per tic.  Default=1,   and 0=no Y grid
;     $color - [optional] RGB value, defining color of grid. Default is a light gray, 0xf0f0f0
; =======================================================================================
Func _Graph_Grid($graph, $Xticks=1, $Yticks=1, $color=0xf0f0f0)
GUICtrlSetGraphic($graph[1], $GUI_GR_COLOR, $color)
  
  If $Xticks > 0 Then
  For $k = $graph[6]+$Xticks to $graph[7] Step $Xticks
   _Graph_Plot_Start($graph,$k,$graph[8]) ;grade
   _Graph_Plot_Line($graph,$k,$graph[9])
  Next
EndIf
If $Yticks > 0 Then
  For $k = $graph[8]+$Yticks to $graph[9] Step $Yticks
   _Graph_Plot_Start($graph,$graph[6],$k) ;grade
   _Graph_Plot_Line($graph,$graph[7],$k)
  Next
EndIf
GUICtrlSetGraphic($graph[1], $GUI_GR_COLOR,0)
EndFunc
Regards

Jose

Edited by joseLB
  • 2 weeks later...
  • 2 weeks later...
Posted

thanks for all incentives.

So, here are 2 new small functions and the complete Graph.udf (nothing changed for old users, just added these 2 functions:

_Graph_LineColor --> changes color for all future drawed lines up to a new _Graph_LineColor.

_Graph_Mark --> start to put "+" marks at the end of each drawed line.

#include-Once

; #FUNCTION# ============================================================================
; Name...........: _Graph_Create
; Description ...: Creates graph area, and prepares array of specified data
; Syntax.........: _Graph_Create($iLeft,$iTop,$iWidth,$iHeight)
; Parameters ....: $iLeft - left most position in GUI
;                  $iTop - top most position in GUI
;       $iWidth - width of graph in pixels
;       $iHeight - height of graph in pixels
; Return values .: Returns array containing variables for subsequent functions...
;        Returned Graph array is: 
;     [1] graphic control handle 
;     [2] left
;     [3] top
;     [4] width
;     [5] height
;     [6] x low
;     [7] x high
;     [8] y low
;     [9] y high
;     [10] x ticks handles
;     [11] x labels handles
;     [12] y ticks handles
;     [13] y labels handles
; =======================================================================================
Func _Graph_Create($iLeft,$iTop,$iWidth,$iHeight)
$hWnd = GUICtrlCreateGraphic($iLeft,$iTop,$iWidth+1,$iHeight+1)
GUICtrlSetBkColor(-1,0xFFFFFF)
GUICtrlSetColor(-1,0x000000)

Local $ahTicksLabelsX[1]
Local $ahTicksLabelsY[1]
Local $ahTicksX[1]
Local $ahTicksY[1]

Dim $aGraphArray[14] = ["",$hWnd,$iLeft,$iTop,$iWidth,$iHeight,0,1,0,1,$ahTicksX,$ahTicksLabelsX,$ahTicksY,$ahTicksLabelsY]
Return $aGraphArray
EndFunc



; #FUNCTION# ============================================================================
; Name...........: _Graph_Delete
; Description ...: Deletes previously created graph and related ticks/labels
; Syntax.........: _Graph_Delete(ByRef $aGraphArray)
; Parameters ....: $aGraphArray - the array returned from _Graph_Create
; =======================================================================================
Func _Graph_Delete(ByRef $aGraphArray)

;----- delete x ticks/labels -----
$ahTicksX = $aGraphArray[10]
$ahTicksLabelsX = $aGraphArray[11]
For $i = 1 to (UBound($ahTicksX) - 1)
  GUICtrlDelete($ahTicksX[$i])
Next
For $i = 1 to (UBound($ahTicksLabelsX) - 1)
  GUICtrlDelete($ahTicksLabelsX[$i])
Next

;----- delete y ticks/labels -----
$ahTicksY = $aGraphArray[12]
$ahTicksLabelsY = $aGraphArray[13]
For $i = 1 to (UBound($ahTicksY) - 1)
  GUICtrlDelete($ahTicksY[$i])
Next
For $i = 1 to (UBound($ahTicksLabelsY) - 1)
  GUICtrlDelete($ahTicksLabelsY[$i])
Next
Dim $ahTicksLabelsY[1]

;----- delete graphic control -----
GUICtrlDelete($aGraphArray[1])

;----- close array -----
$aGraphArray = 0

EndFunc



; #FUNCTION# ============================================================================
; Name...........: _Graph_Clear
; Description ...: Clears graph content
; Syntax.........: _Graph_Clear(ByRef $aGraphArray)
; Parameters ....: $aGraphArray - the array returned from _Graph_Create
; =======================================================================================
Func _Graph_Clear(ByRef $aGraphArray)

GUICtrlDelete($aGraphArray[1])

$aGraphArray[1] = GUICtrlCreateGraphic($aGraphArray[2],$aGraphArray[3],$aGraphArray[4]+1,$aGraphArray[5]+1)
GUICtrlSetBkColor(-1,0xFFFFFF)
GUICtrlSetColor(-1,0x000000)

EndFunc



; #FUNCTION# ============================================================================
; Name...........: _Graph_SetRange_X
; Description ...: Allows user to set the range of the X axis and set ticks and rounding levels
; Syntax.........: _Graph_SetRange_X(ByRef $aGraphArray,$iLow,$iHigh,$iXTicks = 1,$bLabels = 1,$iRound = 0)
; Parameters ....: $aGraphArray - the array returned from _Graph_Create
;     $iLow - the lowest value for the X axis (can be negative)
;     $iHigh - the highest value for the X axis
;     $iXTicks - [optional] number of ticks to show below axis, if = 0 then no ticks created
;     $bLabels - [optional] 1=show labels, any other number=do not show labels
;     $iRound - [optional] rounding level of label values
; =======================================================================================
Func _Graph_SetRange_X(ByRef $aGraphArray,$iLow,$iHigh,$iXTicks = 1,$bLabels = 1,$iRound = 0)

;----- load user vars to array -----
$aGraphArray[6] = $iLow
$aGraphArray[7] = $iHigh

;----- prepare nested array -----
$ahTicksX = $aGraphArray[10]
$ahTicksLabelsX = $aGraphArray[11]

;----- delete any existing ticks -----
For $i = 1 to (UBound($ahTicksX) - 1)
  GUICtrlDelete($ahTicksX[$i])
Next
Dim $ahTicksX[1]

;----- create new ticks -----
For $i = 1 To $iXTicks + 1
  ReDim $ahTicksX[$i + 1]
  $ahTicksX[$i] = GUICtrlCreateLabel("",(($i - 1) * ($aGraphArray[4] / $iXTicks)) + $aGraphArray[2], _
  $aGraphArray[3] + $aGraphArray[5],1,5)
  GUICtrlSetBkColor(-1,0x000000)
  GUICtrlSetState(-1,$GUI_DISABLE)
Next

;----- delete any existing labels -----
For $i = 1 to (UBound($ahTicksLabelsX) - 1)
  GUICtrlDelete($ahTicksLabelsX[$i])
Next
Dim $ahTicksLabelsX[1]

;----- create new labels -----
For $i = 1 To $iXTicks + 1
  ReDim $ahTicksLabelsX[$i + 1]
  $ahTicksLabelsX[$i] = GUICtrlCreateLabel("", _
  ($aGraphArray[2] + (($aGraphArray[4] / $iXTicks) * ($i - 1))) - (($aGraphArray[4] / $iXTicks) / 2), _
  $aGraphArray[3] + $aGraphArray[5] + 10,$aGraphArray[4] / $iXTicks,13,1)
Next

;----- if labels are required, then fill -----
If $bLabels = 1 Then
  For $i = 1 To (UBound($ahTicksLabelsX) - 1)
   GUICtrlSetData($ahTicksLabelsX[$i], _
   StringFormat("%." & $iRound & "f",_Graph_Reference_Pixel("p",(($i - 1) * ($aGraphArray[4] / $iXTicks)), _
   $aGraphArray[6],$aGraphArray[7],$aGraphArray[4])))
  Next
EndIf

;----- load created arrays back into array -----
$aGraphArray[10] = $ahTicksX
$aGraphArray[11] = $ahTicksLabelsX

EndFunc



; #FUNCTION# ============================================================================
; Name...........: _Graph_SetRange_Y
; Description ...: Allows user to set the range of the Y axis and set ticks and rounding levels
; Syntax.........: _Graph_SetRange_Y(ByRef $aGraphArray,$iLow,$iHigh,$iYTicks = 1,$bLabels = 1,$iRound = 0)
; Parameters ....: $aGraphArray - the array returned from _Graph_Create
;     $iLow - the lowest value for the Y axis (can be negative)
;     $iHigh - the highest value for the Y axis
;     $iYTicks - [optional] number of ticks to show next to axis, if = 0 then no ticks created
;     $bLabels - [optional] 1=show labels, any other number=do not show labels
;     $iRound - [optional] rounding level of label values
; =======================================================================================
Func _Graph_SetRange_Y(ByRef $aGraphArray,$iLow,$iHigh,$iYTicks = 1,$bLabels = 1,$iRound = 0)

;----- load user vars to array -----
$aGraphArray[8] = $iLow
$aGraphArray[9] = $iHigh

;----- prepare nested array -----
$ahTicksY = $aGraphArray[12]
$ahTicksLabelsY = $aGraphArray[13]

;----- delete any existing ticks -----
For $i = 1 to (UBound($ahTicksY) - 1)
  GUICtrlDelete($ahTicksY[$i])
Next
Dim $ahTicksY[1]

;----- create new ticks -----
For $i = 1 To $iYTicks + 1
  ReDim $ahTicksY[$i + 1]
  $ahTicksY[$i] = GUICtrlCreateLabel("",$aGraphArray[2] - 5, _
  ($aGraphArray[3] + $aGraphArray[5]) - (($aGraphArray[5] / $iYTicks) * ($i - 1)),5,1)
  GUICtrlSetBkColor(-1,0x000000)
  GUICtrlSetState(-1,$GUI_DISABLE)
Next

;----- delete any existing labels -----
For $i = 1 to (UBound($ahTicksLabelsY) - 1)
  GUICtrlDelete($ahTicksLabelsY[$i])
Next
Dim $ahTicksLabelsY[1]

;----- create new labels -----
  For $i = 1 To $iYTicks + 1
   ReDim $ahTicksLabelsY[$i + 1]
  $ahTicksLabelsY[$i] = GUICtrlCreateLabel("",$aGraphArray[2] - 40, _
  ($aGraphArray[3] + $aGraphArray[5]) - (($aGraphArray[5] / $iYTicks) * ($i - 1)) - 6,30,13,2)
Next

;----- if labels are required, then fill -----
If $bLabels = 1 Then
  For $i = 1 To (UBound($ahTicksLabelsY) - 1)
   GUICtrlSetData($ahTicksLabelsY[$i],StringFormat("%." & $iRound & "f",_Graph_Reference_Pixel("p", _
   (($i - 1) * ($aGraphArray[5] / $iYTicks)),$aGraphArray[8],$aGraphArray[9],$aGraphArray[5])))
  Next
EndIf

;----- load created arrays back into array -----
$aGraphArray[12] = $ahTicksY
$aGraphArray[13] = $ahTicksLabelsY

EndFunc

; #FUNCTION# =============================================================================
; Name...........: _Graph_Plot_Start
; Description ...: Move starting point of plot
; Syntax.........: _Graph_Plot_Start(ByRef $aGraphArray,$iX,$iY)
; Parameters ....:  $aGraphArray - the array returned from _Graph_Create
;     $iX - x value to start at
;     $iY - y value to start at
; ========================================================================================
Func _Graph_Plot_Start(ByRef $aGraphArray,$iX,$iY)
;----- MOVE pen to start point -----
GUICtrlSetGraphic($aGraphArray[1],$GUI_GR_MOVE,_Graph_Reference_Pixel("x",$iX,$aGraphArray[6],$aGraphArray[7], _
$aGraphArray[4]),_Graph_Reference_Pixel("y",$iY,$aGraphArray[8],$aGraphArray[9],$aGraphArray[5]))
EndFunc



; #FUNCTION# =============================================================================
; Name...........: _Graph_Plot_Line
; Description ...: draws straight line to x,y from previous point / starting point
; Syntax.........: _Graph_Plot_Line(ByRef $aGraphArray,$iX,$iY)
; Parameters ....:  $aGraphArray - the array returned from _Graph_Create
;     $iX - x value to draw to
;     $iY - y value to draw to
; ========================================================================================
Func _Graph_Plot_Line(ByRef $aGraphArray,$iX,$iY)
;----- Draw line from previous point to new point -----
GUICtrlSetGraphic($aGraphArray[1],$GUI_GR_LINE,_Graph_Reference_Pixel("x",$iX,$aGraphArray[6],$aGraphArray[7], _
$aGraphArray[4]),_Graph_Reference_Pixel("y",$iY,$aGraphArray[8],$aGraphArray[9],$aGraphArray[5]))
GUICtrlSetGraphic($aGraphArray[1],$GUI_GR_REFRESH)
EndFunc



; #FUNCTION# =============================================================================
; Name...........: _Graph_Reference_Pixel
; Description ...: INTERNAL FUNCTION - performs pixel reference calculations
; Syntax.........: _Graph_Reference_Pixel($iType,$iValue,$iLow,$iHigh,$iTotalPixels)
; Parameters ....:  $iType - "x"=x axis pix, "y" = y axis pix, "p"=value from pixels
;     $iValue - pixels reference or value
;     $iLow - lower limit of axis
;     $iHigh - upper limit of axis
;     $iTotalPixels - total number of pixels in range (either width or height)
; =========================================================================================
Func _Graph_Reference_Pixel($iType,$iValue,$iLow,$iHigh,$iTotalPixels)
;----- perform pixel reference calculations -----
Switch $iType
  Case "x"
   Return (($iTotalPixels/($iHigh-$iLow))*(($iHigh-$iLow)*(($iValue-$iLow)/($iHigh-$iLow))))
  Case "y"
   Return ($iTotalPixels - (($iTotalPixels/($iHigh-$iLow))*(($iHigh-$iLow)*(($iValue-$iLow)/($iHigh-$iLow)))))
  Case "p"
   Return ($iValue / ($iTotalPixels/ ($iHigh - $iLow))) + $iLow
EndSwitch
EndFunc

; #FUNCTION# =============================================================================
; Name...........: _Graph_Grid
; Description ...: makes X and/or Y grid. 
; Syntax.........: _Graph_Grid($graph, $Xlines, $Ylines, $color=0xf0f0f0)
; Parameters ....: $Grap - the array returned from _Graph_Create
;           $Xlines - # of grid lines per _Graph_SetRange_X  Xticks -> 1= one line per tick,   2= 1 line at each 2 ticks...,   
;                 0.5= 2 lines per tic.  Default=1,  and 0=no X grid
;           $Ylines - # of grid lines per _Graph_SetRange_Y  Yticks -> 1= one line per tick,   2= 1 line at each 2 ticks...,
;                       0.5= 2 lines per tic.  Default=1,   and 0=no Y grid
;           $color - [optional] RGB value, defining color of grid. Default is a light gray, 0xf0f0f0
; =======================================================================================

Func _Graph_Grid($graph, $Xticks=1, $Yticks=1, $color=0xf0f0f0)
GUICtrlSetGraphic($graph[1], $GUI_GR_COLOR, $color)
  
  If $Xticks > 0 Then
  For $k = $graph[6]+$Xticks to $graph[7] Step $Xticks
   _Graph_Plot_Start($graph,$k,$graph[8]) ;grade
   _Graph_Plot_Line($graph,$k,$graph[9])
  Next
EndIf
If $Yticks > 0 Then
  For $k = $graph[8]+$Yticks to $graph[9] Step $Yticks
   _Graph_Plot_Start($graph,$graph[6],$k) ;grade
   _Graph_Plot_Line($graph,$graph[7],$k)
  Next
EndIf
GUICtrlSetGraphic($graph[1], $GUI_GR_COLOR,0)
EndFunc
; #FUNCTION# =============================================================================
; Name...........: _Graph_LineColor
; Description ...: changes color for all future drawed lines up to a new _Graph_LineColor. 
; Syntax.........: _Graph_LineColor($graph, $color=0x000000)
; Parameters ....: $Grap - the array returned from _Graph_Create
;           $$color  - [optional] RGB value, defining color of grid. Default is black, 0x000000   
; =======================================================================================
Func _Graph_LineColor($graph, $color=0x000000)
GUICtrlSetGraphic($graph[1], $GUI_GR_COLOR, $color)
EndFunc
; #FUNCTION# =============================================================================
; Name...........: _Graph_Mark
; Description ...: start to put  "+" marks at the end of each drawed line. To stop, call it again (see parameter $on) 
; Syntax.........: _Graph_Mark($graph,$on=0)
; Parameters ....: $Grap - the array returned from _Graph_Create
;           $on  - 1 = after this call, all lines will be marked. 
;        0 = default = stops to mark
;            ==> so, you need to call it with 1 to start the marks and with 0 to stop the marks
; =======================================================================================
Func _Graph_Mark($graph,$on=0)
GUICtrlSetGraphic($graph[1], $GUI_GR_HINT, $on)
EndFunc
Also, to help, follows a real application where I read a text file and display 2 lines in 2 distinct colors, with marks, etc. (this is a internet server performance checker during the day as users "fells" response time -> there is an AU3 script that from time to time simulates an user access to server and record startup time and browse time). Shown just the graph generation.

func Grafico()
; [url="http://www.autoitscript.com/forum/index.php?showtopic=79412&st=0&gopid=722953"]http://www.autoitscript.com/forum/index....ex.php?showtopic=79412&st=0&gopid=722953[/url]&

Local $graph=0
   $nomArqLog= FileOpenDialog("Escolha data LOG",@ScriptDir,"Log(LogTemp*.txt)",1)
   If @error Then Return ;ContinueLoop

   $file = FileOpen($nomArqLog, 0)
   If $file = -1 Then
    MsgBox(0, "Error", "Incapaz de abrir o arquivo")
    Exit
   EndIf
   
   ;---- cria tela q vai receber o grafico e o proprio grafico, com seus eixos x,y
   #Region ### START Koda GUI section ### Form=C:\Projeto\PIC\SalaProc3\GrafTempo1.kxf
   Local $Form1 = GUICreate("GraficoAcesso", 801, 551, 1, 1)  ;cria tela p/ exibir o grafico
   GUISetState(@SW_SHOW)
   #EndRegion ### END Koda GUI section ###
   
   $graph = _Graph_Create(30,15,752,510)  ;left, top, width, height do grafico
   ;----- set graph axes -----
   _Graph_SetRange_X($graph,0,24,24,1)  ;graph name, low, high, number of ticks -> escala X
   _Graph_SetRange_Y($graph,2,16,14)  ;graph name, low, high, number of ticks -> escala Y
   _Graph_Grid($graph,0.5,0.5)
   $x=0
   While 1         ;lê cada linha do log escolhido e captura os campos hora x temperatura
    $line = FileReadLine($file)
    ;$line = FileReadLine($file)
    If @error = -1 Then ExitLoop
    $campos=StringSplit($line,";")
    $x=$x+1
    $z= StringSplit($campos[1],":")  ; converte hh:mm em hh.fracao ex: 12:30 = 12.5
    $px= $Z[1]+($Z[2]/60)
    $py= $campos[2]

    If $x = 1 Then  _Graph_Plot_Start($graph,$px,$py) ;graph name, x, y    -> primeiro ponto
    _Graph_Plot_Line($graph,$px,$py) ;graph name, x, y        -> demais pontos
    If $campos[3] < 0 Then 
     _Graph_LineColor($graph, 0xff0000 ) ;cor vermelha
     _Graph_Mark($graph,1)    ;faz marquinha
     _Graph_Plot_Line($graph,$px,$yAnterior) ;linha vertical p/ cima.
     _Graph_Mark($graph)     ;não faz mais marquinhas
     _Graph_LineColor($graph, 0x000000 ) ;volta cor da linha a preto
    EndIf
    $xAnterior= $px
    $yAnterior= $py
   Wend
   FileClose($file)

   $file = FileOpen($nomArqLog, 0)
   $x=0
   $color=0xf0f000  ;amarelo claro
   _Graph_LineColor($graph, $color)
   While 1         ;lê cada linha do log escolhido e captura os campos hora x temperatura
    $line = FileReadLine($file)
    ;$line = FileReadLine($file)
    If @error = -1 Then ExitLoop
    $campos=StringSplit($line,";")
    $x=$x+1
    $z= StringSplit($campos[1],":")  ; converte hh:mm em hh.fracao ex: 12:30 = 12.5
    $px= $Z[1]+($Z[2]/60)
    $py= $campos[4]/2
    If $x = 1 Then  _Graph_Plot_Start($graph,$px,$py) ;graph name, x, y    -> primeiro ponto
    _Graph_Plot_Line($graph,$px,$py) ;graph name, x, y        -> demais pontos
   Wend
   FileClose($file)

While 1
$nMsg = GUIGetMsg()
Switch $nMsg
  Case $GUI_EVENT_CLOSE ;, $bt_Sair
    ExitLoop
;  Case $bt_arqLog

EndSwitch
WEnd
GUIDelete($Form1)
EndFunc
And here is real data adquired during a part of the day to be used in the above example
00:00;5.2;230;17.7
00:05;3.34;-11;11
00:11;3.76;242.2;17.5
00:17;3.74;203;17.1
00:23;2.9;184.8;13.4
00:29;2.9;177.4;13.6
00:35;2.9;188;17.1
00:41;7.14;202.8;12.7
00:47;2.92;227.4;14.3
00:53;2.9;210.8;13.2
00:59;3.18;155.4;12.9
01:05;3.32;193.6;15.4
01:11;4.02;199.8;15.7
01:17;3.04;194.2;14.2
01:24;8.96;171.8;13.5
01:29;5;258.8;7.2
01:35;2.9;199.2;14.6
01:41;3.18;165.2;16.7
01:47;3.46;202.4;13.8
01:53;3.88;201.6;14.9
01:59;3.6;228.4;13
02:05;3.32;190.6;15.2
02:11;3.18;242.2;12.6
02:17;3.6;214;15.5
02:23;3.32;181.2;16.6
items separated by ";"

1st= time of the day

2nd=secons browsing the homepage

3rd= number of packets received (not shohw in graphics)

4rd= seconds to start the browser and to have the 1st page loaded

Posted

Added new functions.

See OP.

Thanks for all the support / ideas!!!

- Table UDF - create simple data tables - Line Graph UDF GDI+ - quickly create simple line graphs with x and y axes (uses GDI+ with double buffer) - Line Graph UDF - quickly create simple line graphs with x and y axes (uses AI native graphic control) - Barcode Generator Code 128 B C - Create the 1/0 code for barcodes. - WebCam as BarCode Reader - use your webcam to read barcodes - Stereograms!!! - make your own stereograms in AutoIT - Ziggurat Gaussian Distribution RNG - generate random numbers based on normal/gaussian distribution - Box-Muller Gaussian Distribution RNG - generate random numbers based on normal/gaussian distribution - Elastic Radio Buttons - faux-gravity effects in AutoIT (from javascript)- Morse Code Generator - Generate morse code by tapping your spacebar!
  • 2 weeks later...
Posted (edited)

Hi andybiochem,

When I saw this Funcs ,some months ago I thought, that it could be very useful for me to have some similar Functions, which would make my maths homework :)

So I started to edit your Funcs and I also added some. But time changes, so also our topic in school changed and this work seemed useless to me.

Because I think, that they may could help you to make new Funcs or something like this, I post them here. Maybe you find some parts which are useful for you.

And sry this were my first udf's in AutoIT and I'm still a noob in coding so sorry if there are many mistakes or if there's something very complicated in the code

here's the code

#include-Once
#include <GUIConstants.au3>
#include <StaticConstants.au3>


#cs
 -------------------------------------------------------------------------------------
 Name : Graph-Functions
 By : Benedikt B. Boesen
 ; andybiochem : http://www.autoitscript.com/forum/index.php?showtopic=79412&st=0&p=572525&#entry572525
 ; Manadar : http://www.autoitscript.com/forum/index.php?showtopic=36254&hl=
 
 Date : 6.09.09
 
 Functions:
 _Graphcreate ; Done
 _Graphclear ; Done, not tested
 _Graphdrawcosy ; Done
 _Graphdrawstraight 
 _Graphdrawgrid ; Done
 _Graphdrawpoint ; Done
 _Graphdrawline ; 
 _Graphdrawcircle ;  
 _Graphdrawhalfline ; Done
 _Graph_Reference_pixel ;;;; Function completely made by andybiochem

To do:
 _Graphdrawhalfline ; Make lines bigger => $GUI_GR_PENSIZE !
 _Graphdrawstraight ;
 _Graphdrawline ; 
 _Graphaddinfos ; Add infos about the geometrical constructions like radius etc. to the graphic
 _Graphgetpoint ; ??????
 Remove _Graph_Reference_Pixel (?)
 Shorten _Graphdrawhalfline
 Draw nothing beside the Graphic
 Make it work for more than one _Graphcreate
 _Graphdrawpoint in relationship to the graphic
 
 
 Done since 9.9.09
 _Graphdrawhalfline
 _Graphdrawhalfline define graphname function ($xhalflinename,$yhalflinename) and make name larger 
 _Graphdrawpoint make larger X
 _Graphdrawhalfline ; halbgerade ; geht im moment nur mit positiven m-werten (Steigung)
 _Graphdrawhalfline Graphenname bei manchen Graphen noch falsch
 _Graphdrawpoint ; label mit koordinaten und punktnamen
 -Remove ToolTips
 - Fixed some problems with _Graphdrawpoint
 _Graphdrawcircle fertig
 
 
 Date of finishing the udf  :              soooon :D
 
#ce

#Region Functions

; #FUNCTION# ==========================================================================
; Name........: _Graphcreate
; Description.: Creates a graph
; Syntax......: _Graphcreate($gLeft,$gTop,$gRight,$gBottom,$gwidth,$gheight)
; Parameters..: $gLeft - Left end of the graph in Pixel
;               $gTop - Top end of the graph in Pixel
;               $gwidth - width of graph in pixel 
;               $height - height of graph in pixel 
;return values: Returns array containing variables for subsequent functions...
;                  Returned Graph array is: 
;                   [1] graphic control handle 
;                   [2] left
;                   [3] top
;                   [4] width
;                   [5] height
;                   [6] Right
;                   [7] Bottom
;                   [8] x low
;                   [9] x high
;                   [10] y low
;                   [11] y high
;=========================================================
Func _Graphcreate($gLeft,$gTop,$gwidth,$gheight)
    $hwnd = GUICtrlCreateGraphic($gLeft,$gTop,$gwidth,$gheight)
    GuictrlsetBkColor ($hwnd,0xFFFFFF)
    GUICtrlSetColor($hwnd,0x000000)
    $gright = $gwidth+$gLeft
    $gbottom = $gheight+$gTop
    Global $grapharray[14] = ["",$hwnd,$gLeft,$gTop,$gwidth,$Gheight,$gright,$gBottom,0,1,0,1,0,1]
    Global $helparray[8] = ["",0,0,0,0,0,0,0]
EndFunc

; #FUNCTION# ========================================================================
; Name........: _Graphdrawcosy
; Description.: Draws the x and y Axis 
; Syntax......: _Graphdrawcosy($hwnd,$xLow,$xHigh,$yLow,$yHigh,$xticks,$yticks,$blabels=1,$iRound=0)
; Parameters..: $hwnd - The control to interact with 
;               $xLow - Lowest value for the x axis
;               $xHigh - Highest value for the x axis
;               $yLow - Lowest value for the y axis
;               $yHigh - Highest value for the y axis
;               $xticks - Number of ticks for the x axis 
;               $yticks - Number of ticks for the y axis
;               $bLabels - [optional] 1=show labels, any other number=do not show labels
;               $iRound - [optional] rounding level of label values
;=======================================================
Func _Graphdrawcosy($hwnd,$xLow,$xHigh,$ylow,$yHigh,$xticks,$yticks,$blabels=1,$iRound=0)
    
    $grapharray[8]=$xLow
    $grapharray[9]=$xHigh
    $GraphArray[10] = $yLow
    $GraphArray[11] = $yHigh
    $helparray[1] = $xticks
    $helparray[2] = $yticks
    $helparray[3] = $blabels
    $helparray[4] = $iRound
    
    
    Global $xlowpixel = $grapharray[2]
    Global $xhighpixel = ($grapharray[4]/(-$grapharray[8]+$grapharray[9]))*$grapharray[9]
    Global $ylowpixel = ($grapharray[5]/(-$grapharray[10]+$grapharray[11]))*(-$grapharray[10])
    Global $yhighpixel = $grapharray[3]
    
    $0point = Guictrlcreategraphic($grapharray[4]-$xhighpixel+$grapharray[2],$grapharray[5]-$ylowpixel+$grapharray[3])
    GUICtrlSetGraphic($0point,$GUI_GR_DOT)
    GuictrlsetGraphic($0point,$GUI_GR_LINE,$grapharray[4]-$grapharray[9]+$grapharray[2]+20,$grapharray[5]-$grapharray[10]+$grapharray[3]+15)
    GUICtrlSetGraphic($0point,$GUI_GR_REFRESH)
    
    $grapharray[12] = $grapharray[4]-$xhighpixel+$grapharray[2]
    $grapharray[13] = $grapharray[5]-$ylowpixel+$grapharray[3]
    
    ;draw y axis through 0 point
    $yaxis = GuictrlcreateGraphic($grapharray[4]-$xhighpixel+$grapharray[2],$grapharray[5]+$grapharray[3])
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_MOVE,$grapharray[4]-$xhighpixel-2,$grapharray[5])
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_LINE,$grapharray[4]-$xhighpixel-2,$grapharray[3]-$grapharray[3])
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_REFRESH)
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_MOVE,$grapharray[4]-$xhighpixel-1,$grapharray[5])
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_LINE,$grapharray[4]-$xhighpixel-1,$grapharray[3]-$grapharray[3])
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_REFRESH)
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_MOVE,$grapharray[4]-$xhighpixel,$grapharray[5])
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_LINE,$grapharray[4]-$xhighpixel,$grapharray[3]-$grapharray[3])
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_REFRESH)
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_MOVE,$grapharray[4]-$xhighpixel+1,$grapharray[5])
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_LINE,$grapharray[4]-$xhighpixel+1,$grapharray[3]-$grapharray[3])
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_REFRESH)
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_MOVE,$grapharray[4]-$xhighpixel+2,$grapharray[5])
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_LINE,$grapharray[4]-$xhighpixel+2,$grapharray[3]-$grapharray[3])
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_REFRESH)
    
    ;draw x axis through 0 point
    $xaxis = GuictrlcreateGraphic($grapharray[4]-$xhighpixel+$grapharray[2],$grapharray[5]-$ylowpixel+$grapharray[3])
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_MOVE,$grapharray[2]-$grapharray[2],$grapharray[5]-$ylowpixel-2)
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_LINE,$grapharray[4],$grapharray[5]-$ylowpixel-2)
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_REFRESH)
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_MOVE,$grapharray[2]-$grapharray[2],$grapharray[5]-$ylowpixel-1)
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_LINE,$grapharray[4],$grapharray[5]-$ylowpixel-1)
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_REFRESH)
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_MOVE,$grapharray[2]-$grapharray[2],$grapharray[5]-$ylowpixel)
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_LINE,$grapharray[4],$grapharray[5]-$ylowpixel)
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_REFRESH)
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_MOVE,$grapharray[2]-$grapharray[2],$grapharray[5]-$ylowpixel+1)
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_LINE,$grapharray[4],$grapharray[5]-$ylowpixel+1)
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_REFRESH)
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_MOVE,$grapharray[2]-$grapharray[2],$grapharray[5]-$ylowpixel+2)
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_LINE,$grapharray[4],$grapharray[5]-$ylowpixel+2)
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_REFRESH)

        ;----- create new ticks -----
    Dim $ahTicksX[$xticks]
    For $i = 2 To $xticks
        ReDim $ahTicksX[$i + 1]
        $ahTicksX[$i] = GUICtrlCreateLabel("",(($i - 1) * ($grapharray[4] / $xTicks)) + $grapharray[2], _
        $grapharray[5]-$ylowpixel+$grapharray[3],1,5)
        GUICtrlSetBkColor(-1,0x000000)
        GUICtrlSetState(-1,$GUI_DISABLE)
    Next
    
    ;----- delete any existing labels ----
    Dim $ahTicksLabelsX[$xTicks]
    For $i = 1 to (UBound($XTicks) - 1)
        GUICtrlDelete($ahTicksLabelsX[$i])
    Next
    Dim $ahTicksLabelsX[1]
    
    ;----- create new labels -----
    Dim $ahTicksLabelsX[$xTicks]
    For $i = 2 To $XTicks
        ReDim $ahTicksLabelsX[$i + 1]
        $ahTicksLabelsX[$i] = GUICtrlCreateLabel("", _
        ($GraphArray[2] + (($GraphArray[4] / $XTicks) * ($i - 1))) - (($GraphArray[4] / $XTicks) / 2)+5, _
        $grapharray[5]-$ylowpixel+$grapharray[3]+10,$GraphArray[4] / $XTicks,13,1)
            GUICtrlSetBkColor(-1,$GUI_BKCOLOR_TRANSPARENT)
    Next
    
        ;----- if labels are required, then fill -----
    If $bLabels = 1 Then
        For $i = 2 To (UBound($ahTicksLabelsX) - 1)
            GUICtrlSetData($ahTicksLabelsX[$i], _
            StringFormat("%." & $iRound & "f",_Graph_Reference_Pixel("p",(($i - 1) * ($GraphArray[4] / $XTicks)), _
            $GraphArray[8],$GraphArray[9],$GraphArray[4])))
        Next
    EndIf
    
    ;----- create new ticks -----
    Dim $ahTicksY[$YTicks]
    For $i = 2 To $YTicks
        ReDim $ahTicksY[$i + 1]
        $ahTicksY[$i] = GUICtrlCreateLabel("",$grapharray[4]-$xhighpixel-5+$grapharray[2], _
        ($GraphArray[3] + $GraphArray[5]) - (($GraphArray[5] / $YTicks) * ($i - 1)),5,1)
        GUICtrlSetBkColor(-1,0x000000)
        GUICtrlSetState(-1,$GUI_DISABLE)
    Next
    
    ;----- delete any existing labels -----
    Dim $ahTicksLabelsY[$YTicks]
    For $i = 1 to (UBound($ahTicksLabelsY) - 1)
        GUICtrlDelete($ahTicksLabelsY[$i])
    Next
    Dim $ahTicksLabelsY[1]
    
    ;----- create new labels -----
    For $i = 2 To $YTicks
        ReDim $ahTicksLabelsY[$i + 1]
        $ahTicksLabelsY[$i] = GUICtrlCreateLabel("",$grapharray[4]-$xhighpixel-10, _
        ($GraphArray[3] + $GraphArray[5]) - (($GraphArray[5] / $YTicks) * ($i - 1)),20,13,2)
        GUICtrlSetBkColor(-1,$GUI_BKCOLOR_TRANSPARENT)
    Next
    
    ;----- if labels are required, then fill -----
    If $bLabels = 1 Then
        For $i = 2 To (UBound($ahTicksLabelsY) - 1)
            GUICtrlSetData($ahTicksLabelsY[$i],StringFormat("%." & $iRound & "f",_Graph_Reference_Pixel("p", _
            (($i - 1) * ($GraphArray[5] / $YTicks)),$GraphArray[10],$GraphArray[11],$GraphArray[5])))
        Next
    EndIf
    

    EndFunc
    
    
; This is just the beginning of the Func, i was too lazy to finish it ;)

#cs
; #FUNCTION# ============================================================================
; Name...........: _Graphdrawstraight
; Description....: Draws a straight line trough 2 points
; Syntax.........: _Graphdrawstraight($hwnd,$x1,$y1,$x2,$y2,$color=0xFFFFFF)
; Parameters.....:  $hwnd - The control to interact with
;                   $x1 - The x coordinate of the first point
;                   $y1 - The y coordinate of the first point
;                   $x2 - The x coordinate of the second point
;                   $y2 - The y coordinate of the second point
;                   $color - The color, the line schould be 
;=======================================================================================
Func _Graphdrawstraight($hwnd,$x1,$y1,$x2,$y2,$color=0xFFFFFF)
    
    $m = ($y2-$y1)/($x2-$x1) ;Steigung
    $b = -$m*$x1+$y1 ;y- Achsenabschnitt
    
    $grapharray[12] =$grapharray[4]-$xhighpixel+$grapharray[2] ; 0point x
    $grapharray[13] =$grapharray[5]-$ylowpixel+$grapharray[3]  ; 0point y
    
#cs
    $ylinksunten = ($m*$grapharray[8]+$b)*($grapharray[5]/(-$grapharray[10]+$grapharray[11]))
    $ylinksunten1 = ($ylinksunten/$m-$b)
    $yrechtsoben = ($m*$grapharray[9]+$b)*($grapharray[5]/(-$grapharray[10]+$grapharray[11]))
    $xrechtsoben = ($m*$grapharray[9]+$b)*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))
    $xrechtsoben1 = $xrechtsoben/$m-$b


    $x1pixel = ($grapharray[12]+($grapharray[4]/((-$grapharray[8])+$grapharray[9])*$x1))-$grapharray[2] 
    $y1pixel = ($grapharray[13]-($grapharray[5]/((-$grapharray[10])+$grapharray[11])*$y1))-$grapharray[3]
    $x2pixel = ($grapharray[12]+($grapharray[4]/((-$grapharray[8])+$grapharray[9])*$x2))-$grapharray[2]
    $y2pixel = ($grapharray[13]-($grapharray[5]/((-$grapharray[10])+$grapharray[11])*$y2))-$grapharray[3]
    

    Guictrlsetgraphic ($grapharray[1],$GUI_GR_DOT,$x1pixel,$y1pixel)
    Guictrlsetgraphic ($grapharray[1],$GUI_GR_DOT,$x2pixel,$y2pixel)
    Guictrlsetgraphic ($grapharray[1],$GUI_GR_REFRESH)
    Guictrlsetgraphic ($grapharray[1],$GUI_GR_MOVE,$x1pixel,$y1pixel)
    GUICtrlSetGraphic ($grapharray[1],$GUI_GR_LINE,$x2pixel,$y2pixel)
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_REFRESH)
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_MOVE,$grapharray[2],($m*$grapharray[8]+$b)*($grapharray[5]/(-$grapharray[10]+$grapharray[11])))
    Guictrlsetgraphic($grapharray[1],$GUI_GR_LINE,$grapharray[4],($m*$grapharray[9]+$b)*($grapharray[5]/(-$grapharray[10]+$grapharray[11])))
    Guictrlsetgraphic($grapharray[1],$GUI_GR_REFRESH)
    
    If $m*$grapharray[8]+$b <= $grapharray[10] Then
        If $m*$grapharray[9]+$b <= $grapharray[11] Then
            GUICtrlSetGraphic ($grapharray[1],$GUI_GR_MOVE,($ylowpixel-$ylinksunten)/$m-$b/$m,$grapharray[5]) ;;;;;;
            GUICtrlSetGraphic ($grapharray[1],$GUI_GR_LINE,$grapharray[4],($m*$grapharray[9]+$b)*($grapharray[5]/(-$grapharray[10]+$grapharray[11])))
        Else
            GUICtrlSetGraphic ($grapharray[1],$GUI_GR_MOVE,($ylowpixel-$ylinksunten)/$m-$b/$m,$grapharray[5]) ;;;;;;
            Guictrlsetgraphic ($grapharray[1],$GUI_GR_LINE,$grapharray[4]-(0/$m-$b/$m),0)
        EndIf
    Else
        If $m*$grapharray[9]+$b <= $grapharray[11] Then
            GUICtrlSetGraphic ($grapharray[1],$GUI_GR_MOVE,0,($grapharray[5]-$ylowpixel)-$ylinksunten) ;;;;;
            GUICtrlSetGraphic ($grapharray[1],$GUI_GR_LINE,$grapharray[4],($m*$grapharray[9]+$b)*($grapharray[5]/(-$grapharray[10]+$grapharray[11])))
        Else
            GUICtrlSetGraphic ($grapharray[1],$GUI_GR_MOVE,0,($grapharray[5]-$ylowpixel)-$ylinksunten) ;;;;;
            Guictrlsetgraphic ($grapharray[1],$GUI_GR_LINE,0/$m-$b/$m,0)
        EndIf
    EndIf
    
    
    Guictrlsetgraphic ($grapharray[1],$GUI_GR_REFRESH)
    GUICtrlSetGraphic ($grapharray[1],$GUI_GR_DOT,$grapharray[4]/(-$grapharray[8]+$grapharray[9])*$grapharray[8],($grapharray[5]-$ylowpixel)-$ylinksunten)
    Guictrlsetgraphic ($grapharray[1],$GUI_GR_REFRESH)
    GUICtrlSetGraphic ($grapharray[1],$GUI_GR_DOT,0,($grapharray[5]-$ylowpixel)-$ylinksunten)   
    Guictrlsetgraphic ($grapharray[1],$GUI_GR_REFRESH)
    GUICtrlSetGraphic ($grapharray[1],$GUI_GR_DOT,(($grapharray[5]-$ylowpixel)-$ylinksunten-$grapharray[5])/$m-$b,$grapharray[5])
#ce
    
    #cs
    _Graphdrawpoint($hwnd,"A",$x1,$y1)
    _Graphdrawpoint($hwnd,"B",$x2,$y2)
    
    Dim $h = 0
    If $m*$grapharray[8]+$b > $grapharray[11] and If $m*$grapharray[9]+$b < $grapharray[10] Then $h = 1
    If $m*$grapharray[8]+$b > $grapharray[11] ................
    #ce
EndFunc
#ce

; #FUNCTION# ================================================================================
; Name.........: _Graphdrawgrid
; Description..: Draws the grid into the graphic
; Syntax.......: _Graphdrawgrid($hwnd,$xLines=1,$ylines=1,$color=0xf0f0f0
; Parameters...: $hwnd - The cpntrol to interact with
;                $xlines - # of grid lines per Xticks -> 1= one line per tick,   2= 1 line at each 2 ticks...,   
;                             0.5= 2 lines per tic.  Default=1,  and 0=no X grid
;                $ylines - # of grid lines per Yticks -> 1= one line per tick,   2= 1 line at each 2 ticks...,
;                            0.5= 2 lines per tic.  Default=1,   and 0=no Y grid
;                $color - [optional] RGB value, defining color of grid. Default is a light gray, 0x000000
;===========================================================================================
Func _Graphdrawgrid($hwnd,$xLines=1,$yLines=1,$color=0x000000)
    
    $helparray[5] =$xLines
    $helparray[6] =$yLines
    $helparray[7] =$color
    
    GUICtrlSetGraphic($grapharray[1], $GUI_GR_COLOR, $color)
  $b = $xLines
  If $Xlines > 0 Then
  For $k = $grapharray[8] to $grapharray[9]-1 Step $Xlines
      $i = 0
      $a = (($i+$b)*($grapharray[4]/(-$grapharray[8]+$grapharray[9])))
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_REFRESH)
   Guictrlsetgraphic($grapharray[1],$GUI_GR_MOVE,$a,$grapharray[5]) ;grade
   Guictrlsetgraphic($grapharray[1],$GUI_GR_LINE,$a,0)
   GUICtrlSetGraphic($grapharray[1],$GUI_GR_REFRESH)
    $b = $b+$xLines
  Next
EndIf

$c = $ylines
If $Ylines > 0 Then
  For $k = $grapharray[10] to $grapharray[11]-1 Step $Ylines
      $i = 0
      $a = ($i+$c)*($grapharray[5]/(-$grapharray[10]+$grapharray[11]))
      GUICtrlSetGraphic($grapharray[1],$GUI_GR_REFRESH)
   Guictrlsetgraphic($grapharray[1],$GUI_GR_MOVE,0,$a) ;grade
   GUICtrlSetGraphic($grapharray[1],$GUI_GR_LINE,$grapharray[4],$a)
   GUICtrlSetGraphic($grapharray[1],$GUI_GR_REFRESH)
   $c = $c+$ylines
  Next
EndIf
GUICtrlSetGraphic($grapharray[1], $GUI_GR_COLOR,$color)
EndFunc
        
; #FUNCTION# ===============================================================================
; Name.........: _Graphdrawpoint
; Description..: Draws a point with name and cooridnates
; Syntax.......: _Graphdrawpoint($hwnd,$name,$x,$y,$color=0x000000)
; Parameters...: $hwnd - The control to interact With
;                $name - The point's name
;                $x - x position 
;                $y - y position
;                $color - the point's color, default is 0x000000
;==============================================================================================
Func _Graphdrawpoint($hwnd,$name,$x,$y,$color=0x000000) 
    
    If $x <> 0 and $y <> 0 Then
    $xcross = GUICtrlCreateLabel("X",$x*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))+$grapharray[12]-5, _ 
    ($grapharray[11]-$y)*($grapharray[5]/(-$grapharray[10]+$grapharray[11]))+9)
    GUICtrlSetBkColor(-1,$GUI_BKCOLOR_TRANSPARENT)
    Guictrlsetcolor ($xcross,$color)
    guictrlsetfont (-1,14)
    $text = GuictrlcreateLabel ($name & "(" & Round($x,2) & "|" & Round($y,2) & ")",$x*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))+$grapharray[12]+ 10, _
    ($grapharray[11]-$y)*($grapharray[5]/(-$grapharray[10]+$grapharray[11]))+15,100,30)
    GUICtrlSetBkColor($text,$GUI_BKCOLOR_TRANSPARENT)
    Guictrlsetcolor ($text,0x000000)
    guictrlsetfont ($text,12)
    
    ElseIf $x = 0 and $y <> 0 Then
    $xcross = GUICtrlCreateLabel("X",$grapharray[12]-5, _ 
    ($grapharray[11]-$y)*($grapharray[5]/(-$grapharray[10]+$grapharray[11]))+9)
    GUICtrlSetBkColor(-1,$GUI_BKCOLOR_TRANSPARENT)
    Guictrlsetcolor ($xcross,$color)
    guictrlsetfont (-1,14)
    $text = GuictrlcreateLabel ($name & "(" & Round($x,2) & "|" & Round($y,2) & ")",$grapharray[12]-5, _
    ($grapharray[11]-$y)*($grapharray[5]/(-$grapharray[10]+$grapharray[11]))+15,100,30)
    GUICtrlSetBkColor($text,$GUI_BKCOLOR_TRANSPARENT)
    Guictrlsetcolor ($text,0x000000)
    guictrlsetfont ($text,12)
    
    ElseIf $x <> 0 and $y = 0 Then
    $xcross = GUICtrlCreateLabel("X",$x*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))+$grapharray[12]-5, _ 
    $grapharray[13]-$grapharray[3]+9)
    GUICtrlSetBkColor(-1,$GUI_BKCOLOR_TRANSPARENT)
    Guictrlsetcolor ($xcross,$color)
    guictrlsetfont (-1,14)
    $text = GuictrlcreateLabel ($name & "(" & Round($x,2) & "|" & Round($y,2) & ")",$x*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))+$grapharray[12]-8, _
    $grapharray[13]-$grapharray[3]-4,100,30)
    GUICtrlSetBkColor($text,$GUI_BKCOLOR_TRANSPARENT)
    Guictrlsetcolor ($text,0x000000)
    guictrlsetfont ($text,12)
    
    ElseIf $x=0 and $y=0 Then
    $xcross = GUICtrlCreateLabel("X",$grapharray[12]-5, _ 
    $grapharray[13]-$grapharray[3]+9)
    GUICtrlSetBkColor(-1,$GUI_BKCOLOR_TRANSPARENT)
    Guictrlsetcolor ($xcross,$color)
    guictrlsetfont (-1,14)
    $text = GuictrlcreateLabel ($name & "(" & Round($x,2) & "|" & Round($y,2) & ")",$grapharray[12]+8, _
    $grapharray[13]-$grapharray[3]-4,100,30)
    GUICtrlSetBkColor($text,$GUI_BKCOLOR_TRANSPARENT)
    Guictrlsetcolor ($text,0x000000)
    guictrlsetfont ($text,12)
    EndIf

EndFunc
        
; #FUNCTION# ================================================================================
; Name.........: _Graphdrawhalfline
; Description..: Draws a halfline. It starts from 1 point and goes through another one
; Syntax.......: _Graphdrawhalfline($hwnd,$name,$xstart,$ystart,$x2,$y2,$color=0x000000)
; Parameters...: $hwnd - The control to interact with 
;                $name - The graph's name
;                $xstart - The start-point's x coordinate
;                $ystart - The start-point's y coordinate
;                $x2 - The x coordinate of the point to go through
;                $y2 - The y coordinate of the point to go through
;                $color - The color the half line schould be  
;===========================================================================================
Func _Graphdrawhalfline($hwnd,$name,$xstart,$ystart,$x2,$y2,$color=0x000000)
    
    If $name = "" Then 
        $name = "g"
    EndIf

    $m = ($y2-$ystart)/($x2-$xstart)
    $b = -$m*$xstart+$ystart
    

    _Graphdrawpoint($hwnd,"A",$xstart,$ystart,0x000000)
    _Graphdrawpoint($hwnd,"B",$x2,$y2,0x000000)
    
If $xstart < $x2 Then ;fertig
    If $ystart < $y2 Then ;fertig
        If $ystart=0 and $xstart <> 0 Then
            GUICtrlSetGraphic($grapharray[1],$GUI_GR_MOVE,$xstart*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))+($grapharray[4]-$xhighpixel),$grapharray[5]-$ylowpixel) ; stimmt .....!
            GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
            If $m*$grapharray[9]+$b < $grapharray[11] Then
                GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
                GuiCtrlSetGraphic($grapharray[1],$GUI_GR_LINE,$grapharray[4],($grapharray[11]-($m*$grapharray[9]+$b))*($grapharray[5]/(-$grapharray[10]+$grapharray[11]))) ;stimmt 1000% :D:D
            EndIf
            If $m*$grapharray[9]+$b > $grapharray[11] Then
                GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
                GUICtrlSetGraphic($grapharray[1],$GUI_GR_LINE,($grapharray[4]-($grapharray[4]/(-$grapharray[8]+$grapharray[9]))*$grapharray[9])+(($grapharray[11]/$m-$b/$m)*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))),0) ; stimmt
            EndIf
            
            
            
        Elseif $xstart = 0 and $ystart <> 0 Then
            GUICtrlSetGraphic($grapharray[1],$GUI_GR_MOVE,$grapharray[4]-$xhighpixel,($grapharray[11]-$ystart)*($grapharray[5]/(-$grapharray[10]+$grapharray[11]))) ;;;;stimmt
            GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
            If $m*$grapharray[9]+$b <= $grapharray[11] Then
                GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
                GuiCtrlSetGraphic($grapharray[1],$GUI_GR_LINE,$grapharray[4],($grapharray[11]-($m*$grapharray[9]+$b))*($grapharray[5]/(-$grapharray[10]+$grapharray[11]))) ;stimmt
                
                EndIf
            If $m*$grapharray[9]+$b > $grapharray[11] Then
                GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
                GUICtrlSetGraphic($grapharray[1],$GUI_GR_LINE,($grapharray[4]-($grapharray[4]/(-$grapharray[8]+$grapharray[9]))*$grapharray[9])+(($grapharray[11]/$m-$b/$m)*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))),0) ;stimmt
        
                EndIf
        ElseIf $xstart=0 and $ystart = 0 Then
            Guictrlsetgraphic ($grapharray[1],$GUI_GR_MOVE,$grapharray[12]-$grapharray[2],$grapharray[13]-$grapharray[3]);stimmt
            GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
            If $m*$grapharray[9]+$b <= $grapharray[11] Then
                GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
                GuiCtrlSetGraphic($grapharray[1],$GUI_GR_LINE,$grapharray[4],($grapharray[11]-($m*$grapharray[9]+$b))*($grapharray[5]/(-$grapharray[10]+$grapharray[11])));stimmt
            
                EndIf
            If $m*$grapharray[9]+$b > $grapharray[11] Then
                GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
                GUICtrlSetGraphic($grapharray[1],$GUI_GR_LINE,($grapharray[4]-($grapharray[4]/(-$grapharray[8]+$grapharray[9]))*$grapharray[9])+(($grapharray[11]/$m-$b/$m)*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))),0) ;stimmt
            
                EndIf
        
        ElseIf $xstart <> 0 and $ystart <> 0 Then
            GUICtrlSetGraphic($grapharray[1],$GUI_GR_MOVE,$xstart*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))+$grapharray[12]-$grapharray[2],($grapharray[11]-$ystart)*($grapharray[5]/(-$grapharray[10]+$grapharray[11]))) ;stimmt
            GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
            If $m*$grapharray[9]+$b <= $grapharray[11] Then
                GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
                GuiCtrlSetGraphic($grapharray[1],$GUI_GR_LINE,$grapharray[4],($grapharray[11]-($m*$grapharray[9]+$b))*($grapharray[5]/(-$grapharray[10]+$grapharray[11])))
            
                EndIf
            If $m*$grapharray[9]+$b > $grapharray[11] Then
                GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
                GUICtrlSetGraphic($grapharray[1],$GUI_GR_LINE,($grapharray[4]-($grapharray[4]/(-$grapharray[8]+$grapharray[9]))*$grapharray[9])+(($grapharray[11]/$m-$b/$m)*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))),0)
            
            EndIf
        EndIf
    ElseIf $ystart > $y2 Then ;fertig
        If $ystart=0 and $xstart <> 0 Then ;fertig
            GUICtrlSetGraphic($grapharray[1],$GUI_GR_MOVE,$xstart*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))+($grapharray[4]-$xhighpixel),$grapharray[5]-$ylowpixel) ; stimmt .....!
            GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
            If $m*$grapharray[9]+$b > $grapharray[10] Then
                GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
                GuiCtrlSetGraphic($grapharray[1],$GUI_GR_LINE,$grapharray[4],($grapharray[11]-($m*$grapharray[9]+$b))*($grapharray[5]/(-$grapharray[10]+$grapharray[11]))) ;stimmt 1000% :D:D
            EndIf
            If $m*$grapharray[9]+$b <= $grapharray[10] Then
                GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
                GUICtrlSetGraphic($grapharray[1],$GUI_GR_LINE,($grapharray[4]-($grapharray[4]/(-$grapharray[8]+$grapharray[9]))*$grapharray[9])+(($grapharray[10]/$m-$b/$m)*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))),$grapharray[5]) ; stimmt
            EndIf
            
            
            
        Elseif $xstart = 0 and $ystart <> 0 Then ;fertig
            GUICtrlSetGraphic($grapharray[1],$GUI_GR_MOVE,$grapharray[4]-$xhighpixel,($grapharray[11]-$ystart)*($grapharray[5]/(-$grapharray[10]+$grapharray[11]))) ;;;;stimmt
            GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
            If $m*$grapharray[9]+$b > $grapharray[10] Then
                GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
                GUICtrlSetGraphic($grapharray[1],$GUI_GR_LINE,$grapharray[4],($grapharray[13]-$grapharray[3]-(($m*$grapharray[9]+$b)*($grapharray[5]/(-$grapharray[10]+$grapharray[11]))))) ;stimmt
                EndIf
            If $m*$grapharray[9]+$b <= $grapharray[10] Then ;fertig
                GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
                GUICtrlSetGraphic($grapharray[1],$GUI_GR_LINE,($grapharray[4]-($grapharray[4]/(-$grapharray[8]+$grapharray[9]))*$grapharray[9])+(($grapharray[10]/$m-$b/$m)*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))),$grapharray[5]) ;stimmt
        
                EndIf
        ElseIf $xstart=0 and $ystart = 0 Then ;fertig
            Guictrlsetgraphic ($grapharray[1],$GUI_GR_MOVE,$grapharray[12]-$grapharray[2],$grapharray[13]-$grapharray[3]);stimmt
            GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
            If $m*$grapharray[9]+$b > $grapharray[10] Then
                GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
                GUICtrlSetGraphic($grapharray[1],$GUI_GR_LINE,$grapharray[4],($grapharray[13]-$grapharray[3]-(($m*$grapharray[9]+$b)*($grapharray[5]/(-$grapharray[10]+$grapharray[11])))))
            
                EndIf
            If $m*$grapharray[9]+$b <= $grapharray[10] Then
                GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
                GUICtrlSetGraphic($grapharray[1],$GUI_GR_LINE,($grapharray[4]-($grapharray[4]/(-$grapharray[8]+$grapharray[9]))*$grapharray[9])+(($grapharray[10]/$m-$b/$m)*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))),$grapharray[5]) ;stimmt
            
                EndIf
        ElseIf $xstart <> 0 and $ystart <> 0 Then ;fertig
            GUICtrlSetGraphic($grapharray[1],$GUI_GR_MOVE,$xstart*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))+$grapharray[12]-$grapharray[2],($grapharray[11]-$ystart)*($grapharray[5]/(-$grapharray[10]+$grapharray[11]))) ;stimmt
            GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
            If $m*$grapharray[9]+$b > $grapharray[10] Then
                GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
                GUICtrlSetGraphic($grapharray[1],$GUI_GR_LINE,$grapharray[4],($grapharray[13]-$grapharray[3]-(($m*$grapharray[9]+$b)*($grapharray[5]/(-$grapharray[10]+$grapharray[11])))))
            
                EndIf
            If $m*$grapharray[9]+$b <= $grapharray[10] Then
                GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
                GUICtrlSetGraphic($grapharray[1],$GUI_GR_LINE,($grapharray[4]-($grapharray[4]/(-$grapharray[8]+$grapharray[9]))*$grapharray[9])+(($grapharray[10]/$m-$b/$m)*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))),$grapharray[5])
            
            EndIf
        EndIf
    Elseif $ystart = $y2 Then ;fertig
        Guictrlsetgraphic ($grapharray[1],$GUI_GR_MOVE, $xstart*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))+$grapharray[12]-$grapharray[2],($grapharray[11]-$ystart)*($grapharray[5]/(-$grapharray[10]+$grapharray[11])))
        Guictrlsetgraphic ($grapharray[1],$GUI_GR_COLOR,$color)
        GUICtrlSetGraphic ($grapharray[1],$GUI_GR_LINE,$grapharray[4],($grapharray[11]-$ystart)*($grapharray[5]/(-$grapharray[10]+$grapharray[11])))
    EndIf
Elseif $xstart = $x2 Then ;fertig
    If $ystart < $y2 Then ;fertig
        If $xstart = 0 Then
        GUICtrlSetGraphic ($grapharray[1],$GUI_GR_MOVE,$grapharray[12]-$grapharray[2],($grapharray[11]-$ystart)*($grapharray[5]/(-$grapharray[10]+$grapharray[11]))) ; fertig
        GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
        GUICtrlSetGraphic ($grapharray[1],$GUI_GR_LINE,$grapharray[12]-$grapharray[2],0) ; fertig
        Elseif $xstart <> 0 Then
        GUICtrlSetGraphic ($grapharray[1],$GUI_GR_MOVE,$xstart*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))+($grapharray[4]-$xhighpixel),($grapharray[11]-$ystart)*($grapharray[5]/(-$grapharray[10]+$grapharray[11])))
        GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
        GUICtrlSetGraphic ($grapharray[1],$GUI_GR_LINE,$xstart*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))+($grapharray[4]-$xhighpixel),0)
        EndIf
    ElseIf $ystart > $y2 Then ;fertig
        If $xstart = 0 Then
        GUICtrlSetGraphic ($grapharray[1],$GUI_GR_MOVE,$grapharray[12]-$grapharray[2],($grapharray[11]-$ystart)*($grapharray[5]/(-$grapharray[10]+$grapharray[11]))) ; fertig
        GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
        GUICtrlSetGraphic ($grapharray[1],$GUI_GR_LINE,$grapharray[12]-$grapharray[2],$grapharray[5]) ; fertig
        Elseif $xstart <> 0 Then
        GUICtrlSetGraphic ($grapharray[1],$GUI_GR_MOVE,$xstart*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))+($grapharray[4]-$xhighpixel),($grapharray[11]-$ystart)*($grapharray[5]/(-$grapharray[10]+$grapharray[11])))
        GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
        GUICtrlSetGraphic ($grapharray[1],$GUI_GR_LINE,$xstart*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))+($grapharray[4]-$xhighpixel),$grapharray[5])
        EndIf
    EndIf
ElseIf $xstart > $x2 Then ;fertig
    If $ystart < $y2 Then ;fertig
        If $ystart=0 and $xstart <> 0 Then ;fertig
            GUICtrlSetGraphic($grapharray[1],$GUI_GR_MOVE,$xstart*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))+($grapharray[4]-$xhighpixel),$grapharray[5]-$ylowpixel) ; stimmt .....!
            GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
            If $m*$grapharray[8]+$b < $grapharray[11] Then
                GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
                GuiCtrlSetGraphic($grapharray[1],$GUI_GR_LINE,0,($grapharray[11]-($m*$grapharray[8]+$b))*($grapharray[5]/(-$grapharray[10]+$grapharray[11]))) ;stimmt 1000% :D:D
            EndIf
            If $m*$grapharray[8]+$b > $grapharray[11] Then
                GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
                GUICtrlSetGraphic($grapharray[1],$GUI_GR_LINE,($grapharray[12]-$grapharray[2])+(($grapharray[11]/$m-$b/$m)*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))),0) ; stimmt
            EndIf
        Elseif $xstart = 0 and $ystart <> 0 Then ;fertig
            GUICtrlSetGraphic($grapharray[1],$GUI_GR_MOVE,$grapharray[4]-$xhighpixel,($grapharray[11]-$ystart)*($grapharray[5]/(-$grapharray[10]+$grapharray[11]))) ;;;;stimmt
            GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
            If $m*$grapharray[9]+$b <= $grapharray[11] Then
                GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
                GuiCtrlSetGraphic($grapharray[1],$GUI_GR_LINE,0,($grapharray[11]-($m*$grapharray[8]+$b))*($grapharray[5]/(-$grapharray[10]+$grapharray[11]))) ;stimmt
                
                EndIf
            If $m*$grapharray[9]+$b > $grapharray[11] Then
                GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
                GUICtrlSetGraphic($grapharray[1],$GUI_GR_LINE,(($grapharray[12]-$grapharray[2])+(($grapharray[11]/$m-$b/$m)*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))),0) ;stimmt
        
                EndIf
        ElseIf $xstart=0 and $ystart = 0 Then ;fertig
            Guictrlsetgraphic ($grapharray[1],$GUI_GR_MOVE,$grapharray[12]-$grapharray[2],$grapharray[13]-$grapharray[3]);stimmt
            GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
            If $m*$grapharray[9]+$b <= $grapharray[11] Then
                GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
                GuiCtrlSetGraphic($grapharray[1],$GUI_GR_LINE,0,($grapharray[11]-($m*$grapharray[8]+$b))*($grapharray[5]/(-$grapharray[10]+$grapharray[11])));stimmt
                EndIf
            If $m*$grapharray[9]+$b > $grapharray[11] Then
                GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
                GUICtrlSetGraphic($grapharray[1],$GUI_GR_LINE,(($grapharray[12]-$grapharray[2])+(($grapharray[11]/$m-$b/$m)*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))),0) ;stimmt
            EndIf
        ElseIf $xstart <> 0 and $ystart <> 0 Then ;fertig
            GUICtrlSetGraphic($grapharray[1],$GUI_GR_MOVE,$xstart*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))+$grapharray[12]-$grapharray[2],($grapharray[11]-$ystart)*($grapharray[5]/(-$grapharray[10]+$grapharray[11]))) ;stimmt
            GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
            If $m*$grapharray[9]+$b <= $grapharray[11] Then
                GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
                GuiCtrlSetGraphic($grapharray[1],$GUI_GR_LINE,0,($grapharray[11]-($m*$grapharray[8]+$b))*($grapharray[5]/(-$grapharray[10]+$grapharray[11])))
            
                EndIf
            If $m*$grapharray[9]+$b > $grapharray[11] Then
                GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
                GUICtrlSetGraphic($grapharray[1],$GUI_GR_LINE,($grapharray[12]-$grapharray[2]+(($grapharray[11]/$m-$b/$m)*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))),0)
            
            EndIf
        EndIf
    ElseIf $ystart > $y2 Then ;fertig
        If $ystart=0 and $xstart <> 0 Then ;fertig
            GUICtrlSetGraphic($grapharray[1],$GUI_GR_MOVE,$xstart*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))+($grapharray[4]-$xhighpixel),$grapharray[5]-$ylowpixel) ; stimmt .....!
            GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
            If $m*$grapharray[8]+$b > $grapharray[10] Then
                GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
                GuiCtrlSetGraphic($grapharray[1],$GUI_GR_LINE,0,($grapharray[11]-($m*$grapharray[8]+$b))*($grapharray[5]/(-$grapharray[10]+$grapharray[11]))) ;stimmt 1000% :D:D
            EndIf
            If $m*$grapharray[8]+$b <= $grapharray[10] Then
                GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
                GUICtrlSetGraphic($grapharray[1],$GUI_GR_LINE,($grapharray[12]-$grapharray[2])+(($grapharray[10]/$m-$b/$m)*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))),$grapharray[5]) ; stimmt
            EndIf
        Elseif $xstart = 0 and $ystart <> 0 Then ;fertig
            GUICtrlSetGraphic($grapharray[1],$GUI_GR_MOVE,$grapharray[4]-$xhighpixel,($grapharray[11]-$ystart)*($grapharray[5]/(-$grapharray[10]+$grapharray[11]))) ;;;;stimmt
            GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
            If $m*$grapharray[8]+$b > $grapharray[10] Then
                GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
                GUICtrlSetGraphic($grapharray[1],$GUI_GR_LINE,0,($grapharray[13]-$grapharray[3]-(($m*$grapharray[8]+$b)*($grapharray[5]/(-$grapharray[10]+$grapharray[11]))))) ;stimmt
                EndIf
            If $m*$grapharray[8]+$b <= $grapharray[10] Then 
                GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
                GUICtrlSetGraphic($grapharray[1],$GUI_GR_LINE,$grapharray[12]-$grapharray[2]+(($grapharray[10]/$m-$b/$m)*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))),$grapharray[5]) ;stimmt
        
                EndIf
        ElseIf $xstart=0 and $ystart = 0 Then ;fertig
            Guictrlsetgraphic ($grapharray[1],$GUI_GR_MOVE,$grapharray[12]-$grapharray[2],$grapharray[13]-$grapharray[3]);stimmt
            GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
            If $m*$grapharray[8]+$b > $grapharray[10] Then
                GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
                GUICtrlSetGraphic($grapharray[1],$GUI_GR_LINE,0,($grapharray[13]-$grapharray[3]-(($m*$grapharray[8]+$b)*($grapharray[5]/(-$grapharray[10]+$grapharray[11])))))
            
                EndIf
            If $m*$grapharray[8]+$b <= $grapharray[10] Then
                GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
                GUICtrlSetGraphic($grapharray[1],$GUI_GR_LINE,$grapharray[12]-$grapharray[2]+(($grapharray[10]/$m-$b/$m)*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))),$grapharray[5]) ;stimmt
            
                EndIf
        ElseIf $xstart <> 0 and $ystart <> 0 Then ;fertig
            GUICtrlSetGraphic($grapharray[1],$GUI_GR_MOVE,$xstart*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))+$grapharray[12]-$grapharray[2],($grapharray[11]-$ystart)*($grapharray[5]/(-$grapharray[10]+$grapharray[11]))) ;stimmt
            GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
            If $m*$grapharray[8]+$b > $grapharray[10] Then
                GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
                GUICtrlSetGraphic($grapharray[1],$GUI_GR_LINE,0,($grapharray[13]-$grapharray[3]-(($m*$grapharray[8]+$b)*($grapharray[5]/(-$grapharray[10]+$grapharray[11])))))
            
                EndIf
            If $m*$grapharray[8]+$b <= $grapharray[10] Then
                GUICtrlSetGraphic ($grapharray[1],$GUI_GR_COLOR,$color)
                GUICtrlSetGraphic($grapharray[1],$GUI_GR_LINE,$grapharray[12]-$grapharray[2]+(($grapharray[10]/$m-$b/$m)*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))),$grapharray[5])
            
            EndIf
        EndIf   
    ElseIf $ystart = $y2 Then ;fertig
        Guictrlsetgraphic ($grapharray[1],$GUI_GR_MOVE, $xstart*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))+$grapharray[12]-$grapharray[2],($grapharray[11]-$ystart)*($grapharray[5]/(-$grapharray[10]+$grapharray[11])))
        Guictrlsetgraphic ($grapharray[1],$GUI_GR_COLOR,$color)
        GUICtrlSetGraphic ($grapharray[1],$GUI_GR_LINE,0,($grapharray[11]-$ystart)*($grapharray[5]/(-$grapharray[10]+$grapharray[11])))
    EndIf
EndIf

Guictrlsetgraphic ($grapharray[1],$GUI_GR_REFRESH)
    
    #Region Give the Graph a name ; not Ready i think !!
If $xstart < $x2 Then
    If $x2-$xstart > 2.0001 and $x2-$xstart <= 3 Then 
    $help1 = Random($xstart,$x2)
    Elseif $x2-$xstart > 3 Then
    $help1 = Random($xstart+1,$x2-1)
    Elseif $x2-$xstart < 2 Then
    $help1 = Random($xstart-1,$x2+6)
    EndIf
Elseif $xstart > $x2 Then 
    If $x2-$xstart > -2.0001 and $x2-$xstart <= -3 Then 
    $help1 = Random($x2,$xstart)
    Elseif $x2-$xstart > -3 Then
    $help1 = Random($x2-1,$xstart+1)
    Elseif $x2-$xstart < -2 Then
    $help1 = Random($x2+6,$xstart-1)
    EndIf
EndIf

    $xhalflinename = $help1*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))+$grapharray[12]-$grapharray[2]
    $yhalflinename = ($grapharray[11]-($m*$help1+$b))*($grapharray[5]/(-$grapharray[10]+$grapharray[11]))
    GuictrlcreateLabel ($name,$xhalflinename,$yhalflinename-5,30,30)
    GUICtrlSetBkColor(-1,$GUI_BKCOLOR_TRANSPARENT)
    GUICtrlSetColor(-1,$color)
    GUICtrlSetFont(-1,16)
    #EndRegion
        
EndFunc

; #FUNCTION# ==============================================================================
; Name...........: _Graphdrawline
; Description....: Draws a line between two points
; Syntax.........: _Graphdrawline($hwnd,$x1,$y1,$x2,$y2,$color=0x000000)
; Parameters.....: $hwnd - The control Id to interact With
;                  $x1 - x coordinate of the first point
;                  $y1 - y coordinate of the first point
;                  $x2 - x coordinate of the second point
;                  $y2 - y coordinate of the second point
;                  $color - Color the line should be 
;========================================================================================
Func _Graphdrawline($hwnd,$x1,$y1,$x2,$y2,$color=0x000000)
    _Graphdrawpoint ($hwnd,"A",$x1,$y1,0x000000)
    _Graphdrawpoint ($hwnd,"b",$x2,$y2,0x000000)
    
    If $x1 = 0 Then
    Guictrlsetgraphic ($hwnd,$GUI_GR_MOVE,$grapharray[12]-$grapharray[2],$y1*$grapharray)
    EndIf

EndFunc

; #FUNCTION# ==============================================================================
;
;
;
;=========================================================================================
Func _Graphclear($hwnd)
        GUICtrlDelete ($hwnd)
        
        _Graphcreate($grapharray[2],$grapharray[3],$grapharray[6],$grapharray[7],$grapharray[4],$grapharray[5]
        _Graphdrawcosy($grapharray[1],$grapharray[8],$grapharray[9],$grapharray[10],$grapharray[11],$helparray[1],$helparray[2],$helparray[3],$helparray[4])
        _Graphdrawgrid($grapharray[1],$helparray[5],$helparray[6],$helparray[7])
EndFunc

; #FUNCTION# ==============================================================================
;==========================================================================================
Func _Graphdrawcircle($hwnd,$middlex,$middley,$radius,$color=0x000000)
    _Graphdrawpoint($hwnd,"M",$middlex,$middley,$color)
    
    $pixelradius = $radius*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))
    
    IF $middlex=0 and $middley=0 Then ;fertig
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_ELLIPSE,$grapharray[12]+((-$middlex-$radius)*($grapharray[4]/(-$grapharray[8]+$grapharray[9])))-$grapharray[2], _ 
    $grapharray[13]+(($middley-$radius)*($grapharray[5]/(-$grapharray[10]+$grapharray[11])))-$grapharray[3],$pixelradius*2,$pixelradius*2)
ElseIf $middlex=0 and $middley<>0 Then ;fertig
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_ELLIPSE,$grapharray[12]+((-$middlex-$radius)*($grapharray[4]/(-$grapharray[8]+$grapharray[9])))-$grapharray[2], _ 
    (-$middley-$radius)*($grapharray[5]/(-$grapharray[10]+$grapharray[11]))+$grapharray[13]-$grapharray[3],$pixelradius*2,$pixelradius*2)
ElseIf $middlex<>0 and $middley=0 Then 
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_ELLIPSE,($middlex-$radius)*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))+$grapharray[12]-$grapharray[2], _ 
    $grapharray[13]+(($middley-$radius)*($grapharray[5]/(-$grapharray[10]+$grapharray[11])))-$grapharray[3],$pixelradius*2,$pixelradius*2)
ElseIf $middlex<> 0 and $middley<>0 Then ;fertig
    GUICtrlSetGraphic($grapharray[1],$GUI_GR_ELLIPSE,($middlex-$radius)*($grapharray[4]/(-$grapharray[8]+$grapharray[9]))+$grapharray[12]-$grapharray[2], _ 
    (-$middley-$radius)*($grapharray[5]/(-$grapharray[10]+$grapharray[11]))+$grapharray[13]-$grapharray[3],$pixelradius*2,$pixelradius*2)
EndIf

    
EndFunc

; #FUNCTION# =============================================================================
; Name...........: _Graph_Reference_Pixel
; Description ...: INTERNAL FUNCTION - performs pixel reference calculations
; Syntax.........: _Graph_Reference_Pixel($iType,$iValue,$iLow,$iHigh,$iTotalPixels)
; Parameters ....:  $iType - "x"=x axis pix, "y" = y axis pix, "p"=value from pixels
;                   $iValue - pixels reference or value
;                   $iLow - lower limit of axis
;                   $iHigh - upper limit of axis
;                   $iTotalPixels - total number of pixels in range (either width or height)
; =========================================================================================
Func _Graph_Reference_Pixel($iType,$iValue,$iLow,$iHigh,$iTotalPixels)
    ;----- perform pixel reference calculations -----
    Switch $iType
        Case "x"
            Return (($iTotalPixels/($iHigh-$iLow))*(($iHigh-$iLow)*(($iValue-$iLow)/($iHigh-$iLow))))
        Case "y"
            Return ($iTotalPixels - (($iTotalPixels/($iHigh-$iLow))*(($iHigh-$iLow)*(($iValue-$iLow)/($iHigh-$iLow)))))
        Case "p"
            Return ($iValue / ($iTotalPixels/ ($iHigh - $iLow))) + $iLow
    EndSwitch
EndFunc

#EndRegion

You can use it for things like this

Posted Image

M.f.G. BennyBB

Edit 14. Dec : ok still the old code but I began to work on this again... but it's proceeding rather slow

Edited by BennyBB
  • 11 months later...
Posted

Thanks for the udf.

I'm trying to add a graph to my GUI and I don't know the difference between this UDF and GDI+ one.

The case is that I want to fill something like:

Posted Image

with the values of a variable that I change manually with something like guictrlsetdata($variable,10)

Can I draw a line between every point with this version or I'm going to need the GDI+ one?

It would be great to see the evolution of a measuring program.

And when I've more than 10 or 20 result can the first ones be moved outside the graph?

Posted Image

Because there is going to be a moment where the points will not fit inside the graph ;)

(I've a poor english level, maybe _Graph_Plot_Start is what I'm asking for?)

Thanks for your contribution.

Posted (edited)

adolfito121, take a look at this post of andybiochem.

Thanks ;)

EDIT:

I don't know what I'm doing wrong

I've taked the example from andybiochem and tried to adapt to my script like that:

Global $aData = GUICTRLREAD($input7)
Global $i = 1
Global $gGraph = _Graph_Create(30, $altogui4 - 320, $anchogui4 - 250, 280)
_Graph_Set_Color($gGraph, 0x000000)
_Graph_SetRange_X($gGraph, 1, 20, 20)
_Graph_SetRange_Y($gGraph, $valorinput2, $valorinput1, 10);The minimun and max values are going to be variables from an user input at the beggining of the program

Func _Redraw()
    GUISetState(@SW_LOCK)
    _Graph_Clear($gGraph)
    _Graph_SetGrid_X($gGraph, 5, 0x468c2f)
    _Graph_SetGrid_Y($gGraph, 10, 0x468c2f)
    _Graph_Set_Color($gGraph, 0x000000)
    _Graph_Plot_Start($gGraph, 1, $gGraph[1])
    _Graph_Plot_Line($gGraph, $aData, $i)
    _Graph_Plot_Point($gGraph, $aData, $i)
    _Graph_Refresh($gGraph)
    $i = $i + 1
    GUISetState(@SW_UNLOCK)
EndFunc   ;==>_Redraw

I've tried to adapt taking out the random part of this example:

#include <GUIConstantsEx.au3>

GUICreate("", 586, 314, -1, -1, -1, 0x2000000)

Global $aData[101]
Global $gGraph = _Graph_Create(50, 18, 513, 254)
_Graph_SetRange_X($gGraph, 1, 100, 0)
_Graph_SetRange_Y($gGraph, 0, 100, 10)
_Redraw()

GUISetState()
Do
    Sleep(50)
    _Randomise()
    _Redraw()
Until GUIGetMsg() = -3

Func _Randomise()
    For $i = 1 To 99
        $aData[$i] = $aData[$i + 1]
    Next
    $aData[100] = Random(0, 100)
EndFunc   ;==>_Randomise

Func _Redraw()
    GUISetState(@SW_LOCK)
    _Graph_Clear($gGraph)
    _Graph_SetGrid_X($gGraph, 5, 0x468c2f)
    _Graph_SetGrid_Y($gGraph, 10, 0x468c2f)
    _Graph_Set_Color($gGraph, 0xF9F32B)
    _Graph_Plot_Start($gGraph, 1, $gGraph[1])
    For $i = 1 To 100
        _Graph_Plot_Line($gGraph, $i, $aData[$i])
        _Graph_Plot_Point($gGraph, $i, $aData[$i])
    Next
    _Graph_Refresh($gGraph)
    GUISetState(@SW_UNLOCK)
EndFunc   ;==>_Redraw

But trying to make the value $aData the value of a variable:

$coord1 = PixelSearch($size[0], $size[1] + $mitad, $size[0] + $size[2], $size[1] + $mitad, $color, $algoritmo * 3);~a pixelsearch with its coordenates

            If Not @error Then ;
                $medida = ($size[2] - $coord1[0]) / 10;~I just need the distance between the starting coordenates of the searching area of pixelsearch and the point where it found the pixel searched
                
                StringFormat("%#.2f", $medida)
                GUICtrlSetData($input7, $medida);~I tell the script to write on an only read inputbox the value given for that pixel search (a distance between two points, basically)
;~Finally I try to send the data to the graph
                _Redraw()

When I'm doing the pixelsearch the graph flashes and it turns transparent and it doen't shows any point or neither any line.

Do I'm very far of my porpouse?

Thanks again

Edited by adolfito121
Posted (edited)

If you want to draw a value from the input, modify like this

Func _Randomise()


    For $i = 1 To 99
        $aData[$i] = $aData[$i + 1]
    Next
    $aData[100] = GuiCtrlRead($input7)
EndFunc   ;==>_Randomise
Edited by taietel
Posted (edited)

If you want to draw a value from the input, modify like this

Func _Randomise()


    For $i = 1 To 99
        $aData[$i] = $aData[$i + 1]
    Next
    $aData[100] = GuiCtrlRead($input7)
EndFunc   ;==>_Randomise

mersi taietel.

$i value is "how many points are going to be drawed before starting moving the graphs to the side"?

I've two gui (one transparent to limit the pixelsearch area and the main one where grapmust be drawed.)

At the starting of the script the graphs is showed on the maingui, but when is going to draw the firs value the graph remains on it's place and the little gui shows a line.

This is how it looks at the beggining

Posted Image

and this is what it does when it has to draw the first redraw the graph

Posted Image

I'm sure that it has to be my fault (my wife tells me everytime, on everything, so that time is not going to be different).

I call the _redraw and the _randomize functions with a button:

$coord1 = PixelSearch($size[0], $size[1] + $mitad, $size[0] + $size[2], $size[1] + $mitad, $color, $algoritmo * 3);~a pixelsearch with its coordenates
If Not @error Then ;                 
$medida = ($size[2] - $coord1[0]) / 10;~I just need the distance between the starting coordenates of the searching area of pixelsearch and the point where it found the pixel searched                                 
StringFormat("%#.2f", $medida)                 
GUICtrlSetData($input7, $medida);~I tell the script to write on an only read inputbox the value given for that pixel search (a distance between two points, basically) ;~Finally I try to send the data to the graph                 
_Randomise()
_Redraw()

The transparent gui is created with this parameter:

$Guipeque = GUICreate("minigui", $posicionxguipeque1, $posicionyguipeque1, $altoguipeque1, $anchoguipeque1, $WS_POPUPWINDOW, $WS_EX_LAYERED + $GUI_WS_EX_PARENTDRAG, WinGetHandle(AutoItWinGetTitle()))
WinSetOnTop($Guipeque, "minigui", 1);~to make the gui over the main gui, because is going to be a searching area limitator
GUISetBkColor(0xABCDEF)
_WinAPI_SetLayeredWindowAttributes($Guipeque, 0xABCDEF, 255)

Any ideas of what I'm doing wrong?

Thanks again

Edited by adolfito121

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...