pinkfoyd

Generate Pie Graph Image File

6 posts in this topic

#1 ·  Posted (edited)

HI,

I have made an AutoIt script to chek report of Calypso and BackupExec at work. I generate an html page that i send by email to us. It works pretty well.

But now, i want to improve the report with some graph. After 2 hours search, i can't find a good an eay solution.

I want to integrate a Pie graph in my report, so the easiest and safer way to to this is to integrate a PNG or JPG image in my html report.

But do you know a method to generate a pie in autoit or in command line. The closest solution is to use ImageMagick tools, but the syntax is pretty complicated. ( and i can't successfully use the "_GDIPlus_ImageSaveToFile" function work with pie )

I CAN'T USE any web online or PHP tools, like my script run on a PROD server without any appache, php, or internet access.

Thanks a lot !

Edited by pinkfoyd

Share this post


Link to post
Share on other sites



I know you can draw it with _GDIPlus_GraphicsDrawPie, you might have a run at playing with that. Maybe one of our GDI+ folks will wander by regarding integrating it into your report.


√-1 2^3 ∑ π, and it was delicious!

Share this post


Link to post
Share on other sites

#3 ·  Posted (edited)

Don't need to reinvent the wheel.

Check this out: >www.autoitscript.com/forum/topic/161750-pie-chart or >www.autoitscript.com/forum/topic/97241-3d-pie-chart

Edited by UEZ

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites

#4 ·  Posted (edited)

Thanks guy, but i need to save the pie in an image format ( PNG, JPG ... ) to integrate it in my html page....

The problem is the mail, witch limit me to display the chart...

 

EDIT : oh ! Trying to play with the code in #4 of topic www.autoitscript.com/forum/topic/161750-pie-chart

added   "_GDIPlus_ImageSaveToFile($hBitmap, @ScriptDir & "Image.jpg")   " and it works !

will study the code to understand why it works with this code, thanks :!

Edited by pinkfoyd

Share this post


Link to post
Share on other sites

You can use GDI+ to save the created bitmap to JPG using compression settings to reduce the size at cost of quality.

Maybe you share some parts of your code that we have an impression what you did wrong.


Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites

#6 ·  Posted (edited)

I successfully change the code to obtain what i want ( delete the graphical interface, fixed pie size & position, white background, external data file, etc...)

Here is the code if it interest something else ( the script check data in a ini file )

;http://www.autoitscript.com/forum/index.php?showtopic=97241
#include <GDIPlus.au3>
#include <WinAPI.au3>
#include <GUISlider.au3>
#include <GUIConstants.au3>
#include <WindowsConstants.au3>
#include <Date.au3>

; Let's be strict here
;~ Opt("MustDeclareVars", 1)

; Controls the size of the pie and also the depth
Global Const $PIE_DIAMETER = 400
Global Const $PIE_MARGIN = $PIE_DIAMETER * 0.025
Global Const $PIE_DEPTH  = $PIE_DIAMETER * 0.2
Global Const $PIE_AREA   = $PIE_DIAMETER + 2 * $PIE_MARGIN

; Random data for values and colours
Global Const $NUM_VALUES = 5
Global $aChartValue[$NUM_VALUES]
Global $aChartColour[$NUM_VALUES]


;~ TERMINEE
$aChartValue [0] = IniRead("data.ini","CALYPSO","TERMINEE",0)
$aChartColour[0] =   0 * 0x10000 + 255 * 0x100 + 0

;~ TERMINEE EXCEPTION
$aChartValue [1] = IniRead("data.ini","CALYPSO","TERMINEE_EXECP",0)
$aChartColour[1] =   50 * 0x10000 + 200 * 0x100 + 0

;~ EN_COURS
$aChartValue [2] = IniRead("data.ini","CALYPSO","EN_COURS",0)
$aChartColour[2] =   0 * 0x10000 +  150 * 0x100 + 255

;~ En erreur
$aChartValue [3] = IniRead("data.ini","CALYPSO","EN_ERREUR",0)
$aChartColour[3] = 255 * 0x10000 +   0 * 0x100 + 0

;~ INCONNUES
$aChartValue [4] = IniRead("data.ini","CALYPSO","INCONNUE",0)
$aChartColour[4] = 0 * 0x10000 + 0 * 0x100 + 0

; The value of PI
Global Const $PI = ATan(1) * 4

; Start GDI+
_GDIPlus_Startup()

; Create the brushes and pens
Global $ahBrush[$NUM_VALUES][2], $ahPen[$NUM_VALUES]
For $i = 0 To $NUM_VALUES - 1
    $ahBrush[$i][0] = _GDIPlus_BrushCreateSolid(BitOR(0xff000000, $aChartColour[$i]))
    $ahBrush[$i][1] = _GDIPlus_BrushCreateSolid(BitOR(0xff000000, _GetDarkerColour($aChartColour[$i])))
    $ahPen[$i]      = _GDIPlus_PenCreate(BitOR(0xff000000, _GetDarkerColour(_GetDarkerColour($aChartColour[$i]))))
Next


; Set up GDI+
Global $hWnd = GUICreate("Pie Chart", $PIE_AREA, $PIE_AREA + 100, Default, Default)
GUISetBkColor(0xFFFFFF,$hWnd)
Global $hDC         = _WinAPI_GetDC($hWnd)
Global $hGraphics   = _GDIPlus_GraphicsCreateFromHDC($hDC)
Global $hBitmap     = _GDIPlus_BitmapCreateFromGraphics($PIE_AREA, $PIE_AREA, $hGraphics)
Global $hBuffer     = _GDIPlus_ImageGetGraphicsContext($hBitmap)
_GDIPlus_GraphicsSetSmoothingMode($hBuffer, 2)

; Draw the initial pie chart
;~ _DrawPie($aChartValue, _GUICtrlSlider_GetPos($hSlideAspect) / 100, _GUICtrlSlider_GetPos($hSlideRotation), (GUICtrlRead($cStyle) = $GUI_CHECKED),  _GUICtrlSlider_GetPos($hHoleSize))
_DrawPie($aChartValue, 0.45, 10, 0,  0)


_GDIPlus_ImageSaveToFile($hBitmap, @ScriptDir & "\GDIPlus_Image.jpg")


; Release the resources
For $i = 0 To UBound($aChartColour) - 1
    _GDIPlus_PenDispose($ahPen[$i])
    _GDIPlus_BrushDispose($ahBrush[$i][0])
    _GDIPlus_BrushDispose($ahBrush[$i][1])
Next
_GDIPlus_GraphicsDispose($hBuffer)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_GraphicsDispose($hGraphics)
_WinAPI_ReleaseDC($hWnd, $hDC)

; Shut down GDI+
_GDIPlus_Shutdown()

; Done
Exit




;~ ============================================================ FUNCTIONS

; Get a darker version of a colour by extracting the RGB components
Func _GetDarkerColour($Colour)
    Local $Red, $Green, $Blue
    $Red = (BitAND($Colour, 0xff0000) / 0x10000) - 40
    $Green = (BitAND($Colour, 0x00ff00) / 0x100) - 40
    $Blue = (BitAND($Colour, 0x0000ff)) - 40
    If $Red   < 0 Then $Red = 0
    If $Green < 0 Then $Green = 0
    If $Blue  < 0 Then $Blue = 0
    Return ($Red * 0x10000) + ($Green * 0x100) + $Blue
EndFunc ;==>_GetDarkerColour

; Draw the pie chart
Func _DrawPie($Percentage, $Aspect, $rotation, $style = 0, $holesize = 100)

    If $style <> 0 Then $Aspect = 1
    Local $nCount, $nTotal = 0, $angleStart, $angleSweep, $X, $Y
    Local $pieLeft = $PIE_MARGIN, $pieTop = $PIE_AREA / 2 - ($PIE_DIAMETER / 2) * $Aspect
    Local $pieWidth = $PIE_DIAMETER, $pieHeight = $PIE_DIAMETER * $Aspect, $hPath

; Total up the values
    For $nCount = 0 To UBound($Percentage) - 1
        $nTotal += $Percentage[$nCount]
    Next

; Set the fractional values
    For $nCount = 0 To UBound($Percentage) - 1
        $Percentage[$nCount] /= $nTotal
    Next

; Make sure we don't over-rotate
    $rotation = Mod($rotation, 360)

; Clear the graphics buffer
    _GDIPlus_GraphicsClear($hBuffer, 0xFFFFFFFF)

; Set the initial angles based on the fractional values
    Local $Angles[UBound($Percentage) + 1]
    For $nCount = 0 To UBound($Percentage)
        If $nCount = 0 Then
            $Angles[$nCount] = $rotation
        Else
            $Angles[$nCount] = $Angles[$nCount - 1] + ($Percentage[$nCount - 1] * 360)
        EndIf
    Next

    Switch $style
        Case 0
    ; Adjust the angles based on the aspect
            For $nCount = 0 To UBound($Percentage)
                $X = $PIE_DIAMETER * Cos($Angles[$nCount] * $PI / 180)
                $Y = $PIE_DIAMETER * Sin($Angles[$nCount] * $PI / 180)
                $Y -= ($PIE_DIAMETER - $pieHeight) * Sin($Angles[$nCount] * $PI / 180)
                If $X = 0 Then
                    $Angles[$nCount] = 90 + ($Y < 0) * 180
                Else
                    $Angles[$nCount] = ATan($Y / $X) * 180 / $PI
                EndIf
                If $X < 0 Then $Angles[$nCount] += 180
                If $X >= 0 And $Y < 0 Then $Angles[$nCount] += 360
                $X = $PIE_DIAMETER * Cos($Angles[$nCount] * $PI / 180)
                $Y = $pieHeight * Sin($Angles[$nCount] * $PI / 180)
            Next

    ; Decide which pieces to draw first and last
            Local $nStart = -1, $nEnd = -1
            For $nCount = 0 To UBound($Percentage) - 1
                $angleStart = Mod($Angles[$nCount], 360)
                $angleSweep = Mod($Angles[$nCount + 1] - $Angles[$nCount] + 360, 360)
                If $angleStart <= 270 And ($angleStart + $angleSweep) >= 270 Then
                    $nStart = $nCount
                EndIf
                If ($angleStart <= 90 And ($angleStart + $angleSweep) >= 90) _
                        Or ($angleStart <= 450 And ($angleStart + $angleSweep) >= 450) Then
                    $nEnd = $nCount
                EndIf
                If $nEnd >= 0 And $nStart >= 0 Then ExitLoop
            Next

    ; Draw the first piece
            _DrawPiePiece($hBuffer, $pieLeft, $pieTop, $pieWidth, $pieHeight, $PIE_DEPTH * (1 - $Aspect), $nStart, $Angles)

    ; Draw pieces "to the right"
            $nCount = Mod($nStart + 1, UBound($Percentage))
            While $nCount <> $nEnd
                _DrawPiePiece($hBuffer, $pieLeft, $pieTop, $pieWidth, $pieHeight, $PIE_DEPTH * (1 - $Aspect), $nCount, $Angles)
                $nCount = Mod($nCount + 1, UBound($Percentage))
            WEnd

    ; Draw pieces "to the left"
            $nCount = Mod($nStart + UBound($Percentage) - 1, UBound($Percentage))
            While $nCount <> $nEnd
                _DrawPiePiece($hBuffer, $pieLeft, $pieTop, $pieWidth, $pieHeight, $PIE_DEPTH * (1 - $Aspect), $nCount, $Angles)
                $nCount = Mod($nCount + UBound($Percentage) - 1, UBound($Percentage))
            WEnd

    ; Draw the last piece
            _DrawPiePiece($hBuffer, $pieLeft, $pieTop, $pieWidth, $pieHeight, $PIE_DEPTH * (1 - $Aspect), $nEnd, $Angles)

    EndSwitch

; Now draw the bitmap on to the device context of the window
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap, 0, 0)
EndFunc ;==>_DrawPie


Func _DrawPiePiece($hGraphics, $iX, $iY, $iWidth, $iHeight, $iDepth, $nCount, $Angles)
    Local $hPath, $cX = $iX + ($iWidth / 2), $cY = $iY + ($iHeight / 2), $fDrawn = False
    Local $iStart = Mod($Angles[$nCount], 360), $iSweep = Mod($Angles[$nCount+1] - $Angles[$nCount] + 360, 360)

; Draw side
    $hPath = _GDIPlus_PathCreate()
    If $iStart < 180 And ($iStart + $iSweep > 180) Then
        _GDIPlus_PathAddArc($hPath, $iX, $iY, $iWidth, $iHeight, $iStart, 180 - $iStart)
        _GDIPlus_PathAddArc($hPath, $iX, $iY + $iDepth, $iWidth, $iHeight, 180, $iStart - 180)
        _GDIPlus_PathCloseFigure($hPath)
        _GDIPlus_GraphicsFillPath($hGraphics, $hPath, $ahBrush[$nCount][1])
        _GDIPlus_GraphicsDrawPath($hGraphics, $hPath, $ahPen[$nCount])
        $fDrawn = True
    EndIf
    If $iStart + $iSweep > 360 Then
        _GDIPlus_PathAddArc($hPath, $iX, $iY, $iWidth, $iHeight, 0, $iStart + $iSweep - 360)
        _GDIPlus_PathAddArc($hPath, $iX, $iY + $iDepth, $iWidth, $iHeight, $iStart + $iSweep - 360, 360 - $iStart - $iSweep)
        _GDIPlus_PathCloseFigure($hPath)
        _GDIPlus_GraphicsFillPath($hGraphics, $hPath, $ahBrush[$nCount][1])
        _GDIPlus_GraphicsDrawPath($hGraphics, $hPath, $ahPen[$nCount])
        $fDrawn = True
    EndIf
    If $iStart < 180 And (Not $fDrawn) Then
        _GDIPlus_PathAddArc($hPath, $iX, $iY, $iWidth, $iHeight, $iStart, $iSweep)
        _GDIPlus_PathAddArc($hPath, $iX, $iY + $iDepth, $iWidth, $iHeight, $iStart + $iSweep, -$iSweep)
        _GDIPlus_PathCloseFigure($hPath)
        _GDIPlus_GraphicsFillPath($hGraphics, $hPath, $ahBrush[$nCount][1])
        _GDIPlus_GraphicsDrawPath($hGraphics, $hPath, $ahPen[$nCount])
    EndIf
    _GDIPlus_PathDispose($hPath)

; Draw top
    _GDIPlus_GraphicsFillPie($hGraphics, $iX, $iY, $iWidth, $iHeight, $iStart, $iSweep, $ahBrush[$nCount][0])
    _GDIPlus_GraphicsDrawPie($hGraphics, $iX, $iY, $iWidth, $iHeight, $iStart, $iSweep, $ahPen[$nCount])

EndFunc ;==>_DrawPiePiece

and here is the DATA.ini file :

[CALYPSO]
EN_ERREUR=5
EN_COURS=6
TERMINEE=80
TERMINEE_EXECP=3
INCONNUE=1

and the result :

post-9368-0-38741100-1429112342_thumb.jp

All credits to WideBoyDixon -> '?do=embed' frameborder='0' data-embedContent>>

Edited by pinkfoyd

Share this post


Link to post
Share on other sites

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