Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>
#Include <File.au3>
#include <Array.au3>
#include <SliderConstants.au3>
#include <ListviewConstants.au3>
Opt("GUIOnEventMode", 1)
Opt("MouseCoordMode", 2)
;==================================
Global $dossierOusKyaLesCsv = @ScriptDir & "\"
Global $my_file, $array
Global $middle, $coeffV, $Mcourbe, $nblignes, $step
Global $gui, $child, $g, $grafic_width, $slider, $dot, $bar, $LVitem
Global $btn_left, $btn_right, $input_pasdefil
Global $Hcourbe = 300
Global $Wcourbe = 800
_OpenAndLoadAllZeStuff()
While 1
If WinActive($gui) Then
_ReadZeSlider()
_CheckBtnsGrafik()
ElseIf WinActive($child) Then
_DragZeGrafik()
EndIf
Wend
;=================================
; FONCTIONS
;=================================
Func _ChouzeFile()
Local $var = FileOpenDialog("Choisir un csv...", $dossierOusKyaLesCsv, "TXT (*.txt)", 1)
If @error Then Exit
Return $var
EndFunc
Func _OpenAndLoadAllZeStuff()
If WinExists($gui) Then GuiDelete($gui)
If WinExists($child) Then GuiDelete($child)
$my_file = _ChouzeFile()
_BuildZeArray()
_BuildZeGuis()
EndFunc
Func _BuildZeArray()
$file = FileRead($my_file)
$res = StringRegExp($file, '([\d.]+;\h*[\d.]+)', 3)
Dim $array[UBound($res)][2]
For $i = 0 to UBound($res)-1
$split = StringRegExp($res[$i], '[\d.]+', 3)
$array[$i][0] = $split[0]
$array[$i][1] = $split[1]
Next
;_ArrayDisplay($array)
EndFunc
Func _BuildZeGuis()
;;== échelle verticale
$max_y = _ArrayMaxOrMin($array, "max", 2)
$min_y = _ArrayMaxOrMin($array, "min", 2)
Local $bord_inf = Floor($min_y)
Local $bord_sup = Ceiling($max_y)
$middle = ($bord_sup + $bord_inf)/2
$coeffV = $Hcourbe/($bord_sup - $bord_inf)
$Mcourbe = $Hcourbe/2
;;== échelle horizontale
$nblignes = UBound($array)-1
If $nblignes >= $Wcourbe Then
$step = 1
Else
For $i = 1 to $Wcourbe
If $nblignes < $Wcourbe/$i and $nblignes > $Wcourbe/($i+1) Then
$step = $i+1
Exitloop
EndIf
Next
EndIf
$grafic_width = $nblignes*$step
;;==guis
Local $left = 50
$gui = GUICreate($my_file, $Wcourbe+$left+20, $Hcourbe+105)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
Local $a = Number(StringLen(Int($bord_sup - $bord_inf))-2)
Local $b = 10^$a
For $i = $bord_inf to $bord_sup step $b
GuiCtrlCreateLabel("", 0, _GetZePosY($i)+4, $left, 17, 2)
GuiCtrlSetFont(-1, 8, 400, 0, "Arial Unicode MS")
GuiCtrlSetData(-1, Round($i, 2) & " " & ChrW(9472) )
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
Next
$btn_left = GuiCtrlCreateButton(ChrW(9668), $left+($Wcourbe/2)-27, $Hcourbe+15, 25, 20)
$btn_right = GuiCtrlCreateButton(ChrW(9658), $left+($Wcourbe/2)+2, $Hcourbe+15, 25, 20)
$btn_open = GuiCtrlCreateButton("...", 10, $Hcourbe+40, 25, 20)
GUICtrlSetOnEvent(-1, "_OpenAndLoadAllZeStuff")
$slider = GUICtrlCreateSlider($left-10, $Hcourbe+40, $Wcourbe+20, 20, $TBS_NOTICKS+$TBS_TOP+ $TBS_FIXEDLENGTH)
GUICtrlSetLimit(-1, $Wcourbe/$step, 0)
GUICtrlSendMsg($slider, $TBM_SETTHUMBLENGTH, 16, 0)
GuiCtrlCreateLabel("défilement", 10, $Hcourbe+72, 50, 15)
$input_pasdefil = GuiCtrlCreateInput("1", 65, $Hcourbe+70, 30, 18)
$LV = GuiCtrlCreateListview(" | | ", $Wcourbe+$left-540, $Hcourbe+60, 250, 35, $LVS_NOCOLUMNHEADER, $LVS_EX_GRIDLINES)
GUICtrlSendMsg($LV, $LVM_SETCOLUMNWIDTH, 0, 80)
GUICtrlSendMsg($LV, $LVM_SETCOLUMNWIDTH, 1, 80)
GUICtrlSendMsg($LV, $LVM_SETCOLUMNWIDTH, 2, 80)
GuiCtrlCreateListViewItem("index|mm|kN|", $LV)
$LVitem = GuiCtrlCreateListViewItem(" | | ", $LV)
GUISetState()
$child = GUICreate("courbe", $Wcourbe, $Hcourbe, $left, 10, BitOR($WS_POPUP, $WS_BORDER), _
BitOR($WS_EX_MDICHILD, $WS_EX_COMPOSITED), $gui)
GUISetBkColor(0xffffff)
$g = GUICtrlCreateGraphic(0, 0, $grafic_width, $Hcourbe)
GUICtrlSetBkColor(-1, 0xffffff)
GUICtrlSetGraphic($g, $GUI_GR_MOVE, 0, _GetZePosY($array[0][1])) ; init
GUICtrlSetGraphic($g, $GUI_GR_PENSIZE, 1)
For $i = 1 to $nblignes-1
GUICtrlSetGraphic($g, $GUI_GR_COLOR, 0xff)
GUICtrlSetGraphic($g, $GUI_GR_LINE, $i*$step, _GetZePosY($array[$i][1]) )
Next
GUICtrlSetGraphic($g, $GUI_GR_HINT, 2)
$bar = GuiCtrlCreateLabel("", 0, 0, 1, $Hcourbe)
GUICtrlSetBkColor(-1, 0x8888ff)
GUICtrlSetState(-1, $GUI_ONTOP)
$dot = GuiCtrlCreateLabel("", -1, _GetZePosY($array[0][1]), 3, 3)
GUICtrlSetBkColor(-1, 0xff0000)
GUICtrlSetData($LVitem, "0|"& $array[0][0] &"|"& $array[0][1])
GUISetState()
EndFunc
Func _GetZePosY($array_value)
Return ($middle-$array_value)*$coeffV+$Mcourbe
EndFunc
Func _CheckBtnsGrafik()
If _IsPressed("01") Then
Local $info = GUIGetCursorInfo($gui)
If $info[4] = $btn_left Then
Do
_MoveZeGrafik(1)
Until not _IsPressed("01")
ElseIf $info[4] = $btn_right Then
Do
_MoveZeGrafik(-1)
Until not _IsPressed("01")
EndIf
EndIf
EndFunc
Func _DragZeGrafik()
If _IsPressed("01") Then
Local $info = GUIGetCursorInfo($child)
If $info[4] = $g and $info[0]>0 and $info[0]<$Wcourbe Then
Do
$m0 = MouseGetPos()
Sleep(10)
$m = MouseGetPos()
_MoveZeGrafik($m[0]-$m0[0])
Until not _IsPressed("01")
EndIf
EndIf
If _IsPressed("25") Then ; left
Do
_MoveZeGrafik(-1)
; Sleep(100)
Until not _IsPressed("25")
EndIf
If _IsPressed("27") Then ; right
Do
_MoveZeGrafik(1)
; Sleep(100)
Until not _IsPressed("27")
EndIf
EndFunc
Func _MoveZeGrafik($val)
Local $pas, $p, $newx
$pas = GuiCtrlRead($input_pasdefil)
$p = ControlGetPos($child, "", $g)
$newx = $p[0]+($val*$pas*$step)
If $newx <= 0 and $newx >= $Wcourbe-$grafic_width Then
ControlMove($child, "", $g, $newx, 0)
_SetZeInfos()
EndIf
EndFunc
Func _ReadZeSlider()
If _IsPressed("01") Then
$info = GUIGetCursorInfo($gui)
If $info[4] = $slider Then
Do
$slider_val0 = GuiCtrlRead($slider)
Sleep(10)
$slider_val = GuiCtrlRead($slider)
If $slider_val<>$slider_val0 Then
_SetZeInfos()
EndIf
Until not _IsPressed("01")
EndIf
EndIf
EndFunc
Func _SetZeInfos()
Sleep(10)
Local $slider_val, $pos[4], $index
$slider_val = GuiCtrlRead($slider)
$pos = ControlGetPos($child, "", $g)
$index = $slider_val - $pos[0]/$step
GUICtrlSetPos($bar, $slider_val*$step, 0)
If $index = 0 Then
GUICtrlSetPos($dot, 0, _GetZePosY($array[0][1])-1)
Else
GUICtrlSetPos($dot, ($slider_val*$step)-1, _GetZePosY($array[$index][1])-1)
EndIf
GUICtrlSetData($LVitem, $index &"|"& $array[$index][0] &"|"& $array[$index][1])
EndFunc
;===================================================
; bricolage maison hâtif et abomifreux
Func _ArrayMaxOrMin($avArray, $op = "max", $iCol = 1)
Local $iIndex = 0, $iRows = UBound($avArray), $iDims = UBound($avArray, 0)
If $op = "max" Then $op = "<"
If $op = "min" Then $op = ">"
Switch $iDims
Case 1 ; 1D
For $i = 0 To $iRows-1
If Execute(Number($avArray[$iIndex]) &$op& Number($avArray[$i])) Then $iIndex = $i
Next
Return $avArray[$iIndex]
Case 2 ; 2D
For $i = 0 To $iRows-1
If Execute(Number($avArray[$iIndex][$iCol-1]) &$op& Number($avArray[$i][$iCol-1])) Then $iIndex = $i
Next
Return $avArray[$iIndex][$iCol-1]
EndSwitch
EndFunc
Func _Exit()
Exit
EndFunc