; Lee datos de estación de Valenbisi según explicación en ; http://boozox.net/boozox/api-de-valenbisi-servicio-de-jcdeacaux/ ; ; ; http://www.valenbisi.es/service/stationdetails/num_estacion ; Contiene los datos de la estación "num_estacion" relativos al número de bornetas totales, libres y número de bicicletas libres ; ; http://www.valenbisi.es/service/carto ; Contiene listado de estaciones con su información (nombre, número, dirección, latitud, longitud,...) ; ---------- Versiones ; 20110213: Guarda posición y dimensiones de ventana, y anchos de columna en archivo .ini para utilizarlo en la siguiente sesión ; 20110225: Corregidos errores con ayuda del foro Autoit en Español: http://www.emesn.com/autoitforum/viewtopic.php?f=12&t=2545 ; #include <_XMLDomWrapper.au3> #include #include #include ; Para _StringExplode #include #include ; Para variables de controles edit #include #include #include #include "_misfunc.au3" ; ============================ Opciones ============================ ; AutoItSetOption("MustDeclareVars", 1) ;Opt("GUIResizeMode", 802) ; ============================ Definición de variables para GUI ============================ ; Opt("GUIOnEventMode", 1) ; Para tener un evento en cada control #Region Variables ; ============================ Definición de variables ============================ ; Global $oXML = ObjCreate("Microsoft.XMLHTTP") Global $Ventana_X = -1, $Ventana_Y = -1 Global $Ventana_Ancho = 450, $Ventana_Alto = 325 Global $columnaLV[5] = [50, 175, 65, 65, 65] Global $columnaLVleida[5] Global $sFile, $sFile1, $file1, $fileXML, $sXPath, $direccion_estacion ; Para LeeDatosEstacion() Global $MensajeEstaciones = "Los números de estación puede obtenerlos del plano de estaciones de Valenbisi de:" & @CR & "- mapa en papel" & @CR & "- página oficial www.valenbisi.es (pulsando sobre el icono de la estación)" & @CR & "- Página no oficial www.bicivalencia.com (pulsando sobre el icono de la estación)" Global $MensajeAutor = "Para cualquier sugerencia puede contactar con el autor en: ja_ma_ro@hotmail.com" Global $TituloGUI = "MiValenBisi (jamaro 2011)" ; Utilizadas primero en LeeDatosIni() Global $archivoini = @ScriptDir & "\" & StringLeft(@ScriptName, StringLen(@ScriptName) - 4) & "_estaciones.ini" Global $var, $estaciones ; Utilizadas primero en Principal() Global $datoslibres, $datosestacion LeeDatosIni() ; Lectura de datos de archivo .ini ;_ArrayDisplay($num_estacion) ; Create GUI Global $gui_main = GUICreate($TituloGUI, $Ventana_Ancho, $Ventana_Alto, $Ventana_X, $Ventana_Y, $WS_SIZEBOX) GUISetOnEvent($GUI_EVENT_CLOSE, "GUI_Principal_Cierra") GUISetOnEvent($GUI_EVENT_MINIMIZE, "SpecialEvents") GUISetOnEvent($GUI_EVENT_MAXIMIZE, "SpecialEvents") GUISetOnEvent($GUI_EVENT_RESTORE, "SpecialEvents") ;$hListView = GUICtrlCreateListView("", 2, 2, 394, 268) Global $hListView = GUICtrlCreateListView("", 2, 2, $Ventana_Ancho - 10, $Ventana_Alto - 100) _GUICtrlListView_SetUnicodeFormat($hListView, False) GUICtrlSetResizing($hListView, $GUI_DOCKAUTO) ;$BActualizar=GUICtrlCreateButton("Actualizar",2,275,394,20) Global $CajaTextoMensaje = GUICtrlCreateEdit("Utilice el menú contextual (botón derecho del ratón) para opciones", 2, $Ventana_Alto - 80, $Ventana_Ancho - 10, 20, $ES_CENTER + $ES_READONLY) GUICtrlSetResizing($CajaTextoMensaje, $GUI_DOCKBOTTOM + $GUI_DOCKHEIGHT + $GUI_DOCKHCENTER) Global $BActualizar = GUICtrlCreateButton("Actualizar", 2, $Ventana_Alto - 50, $Ventana_Ancho - 10, 20) GUICtrlSetResizing($BActualizar, $GUI_DOCKBOTTOM + $GUI_DOCKHEIGHT + $GUI_DOCKHCENTER) GUICtrlSetOnEvent($BActualizar, "BActualizar") GUISetState() ; Add columns _GUICtrlListView_AddColumn($hListView, "Estación", $columnaLVleida[0]) _GUICtrlListView_AddColumn($hListView, "Dirección", $columnaLVleida[1]) _GUICtrlListView_AddColumn($hListView, "Bicis Libres", $columnaLVleida[2]) _GUICtrlListView_AddColumn($hListView, "Bornetas Libres", $columnaLVleida[3]) _GUICtrlListView_AddColumn($hListView, "Bornetas Totales", $columnaLVleida[4]) Global $contextmenu = GUICtrlCreateContextMenu($hListView) Global $ItemEditarEstaciones = GUICtrlCreateMenuItem("Editar estaciones", $contextmenu) GUICtrlSetOnEvent(-1, "EditaEstaciones") GUICtrlCreateMenuItem("", $contextmenu) ; separator Global $infoitem = GUICtrlCreateMenuItem("Info", $contextmenu) GUICtrlSetOnEvent(-1, "MuestraInfo") principal() While 1 ; WEnd Func principal() ;Global $datoslibres,$num_estacion[UBound($estaciones)][5],$datosestacion Local $ColorListViewActual $ColorListViewActual = 0xFFFFFF ; Define el blanco como color de fondo del ListView GUICtrlSetBkColor($hListView, $CLR_MONEYGREEN) ; Cambia el color de fondo a verde GUICtrlSetData($BActualizar, "... Actualizando datos de estaciones ...") For $a = 0 To UBound($estaciones) - 1 ; Número de estaciones $datoslibres = leelibres($num_estacion[$a][0]) cw("Leido datoslibres de " & $num_estacion[$a][0]) $datoslibres = StringSplit($datoslibres, ",") ;_ArrayDisplay($datoslibres) $datosestacion = leedatosestacion($num_estacion[$a][0]) cw("Leido datosestacion de " & $num_estacion[$a][0]) $num_estacion[$a][1] = $datosestacion cw("Estación " & $num_estacion[$a][0]) cw("Dirección " & $num_estacion[$a][1]) $num_estacion[$a][2] = $datoslibres[1] $num_estacion[$a][3] = $datoslibres[2] $num_estacion[$a][4] = $datoslibres[3] cw("Estación: " & $num_estacion[$a][0] & " - Bicis libres / Bornetas libres / Bornetas totales: " & $num_estacion[$a][2] & " / " & $num_estacion[$a][3] & " / " & $num_estacion[$a][4]) _GUICtrlListView_AddItem($hListView, $num_estacion[$a][0], 0) _GUICtrlListView_AddSubItem($hListView, $a, $num_estacion[$a][1], 1) _GUICtrlListView_AddSubItem($hListView, $a, $num_estacion[$a][2], 2) _GUICtrlListView_AddSubItem($hListView, $a, $num_estacion[$a][3], 3) _GUICtrlListView_AddSubItem($hListView, $a, $num_estacion[$a][4], 4) Next GUICtrlSetBkColor($hListView, $ColorListViewActual) ; Vuelve a poner el color de fondo original GUICtrlSetData($BActualizar, "Actualizar") WinSetTitle($gui_main, "", $TituloGUI & " - Última actualización de datos (" & @HOUR & ":" & @MIN & ":" & @SEC & ")") ;_ArrayDisplay($num_estacion,"Estaciones del entorno") ;_GUICtrlListView_AddArray($hListView, $num_estacion) EndFunc ;==>principal Func leelibres($num_estacion) $oXML.Open("GET", "http://www.valenbisi.es/service/stationdetails/" & $num_estacion, 0) $oXML.Send $sFile = _TempFile(@TempDir, '~', '.xml') FileWrite($sFile, $oXML.responseText) Local $file = FileRead($sFile) $file = StringReplace($file, @LF, '') $file = StringSplit($file, @CR, 1) Local $Valenbisi_disponibles = XMLget($file, 'station\available') Local $Valenbisi_libres = XMLget($file, 'station\free') Local $Valenbisi_totales = XMLget($file, 'station\total') Local $DisponibilidadEstacion = $Valenbisi_disponibles & @TAB & "Bicis disponibles" & @CRLF & $Valenbisi_libres & @TAB & "Bornetas libres" & @CRLF & $Valenbisi_totales & @TAB & "Bornetas totales" ;MsgBox(0, 'Estación ' & $num_estacion & ' de Valenbisi' , $Valenbisi_disponibles & @TAB & "Bicis disponibles"& @crlf & $Valenbisi_libres & @TAB & "Bornetas libres" & @CRLF & $Valenbisi_totales & @TAB & "Bornetas totales") FileDelete($sFile) return ($Valenbisi_disponibles & "," & $Valenbisi_libres & "," & $Valenbisi_totales) EndFunc ;==>leelibres ;------------------------------------------------------------------------------------------- ;------------------------------------------------------------------------------------------- ; Lectura de datos (dirección) una estación num_estacion ;------------------------------------------------------------------------------------------- Func LeeDatosEstacion($num_estacion) $oXML.Open("GET", "http://www.valenbisi.es/service/carto", 0) $oXML.Send $sFile1 = _TempFile(@TempDir, '~', '.xml') FileWrite($sFile1, $oXML.responseText) $file1 = FileRead($sFile1) $fileXML = _XMLLoadXML($file1) $sXPath = '//carto/markers/marker[@number="' & $num_estacion & '"]' $direccion_estacion = _XMLGetAttrib($sXPath, 'address') cw("Valor obtenido con _XMLGetAttrib: " & $direccion_estacion & @CRLF & " Error: " & @error) #cs Select case $ValenBisi_disponibles=0 msgbox(0,"AVISO","No quedan bicicletas en la estación " & $num_estacion & " " & $direccion_estacion) case $ValenBisi_disponibles>=1 and $ValenBisi_disponibles<5 msgbox(0,"AVISO","Quedan menos de 5 bicicletas en la estación " & $num_estacion & " " & $direccion_estacion) EndSelect #ce ; msgbox(0,"Estación: "& $num_estacion & " de Valenbisi - Dirección: " & $direccion_estacion,$DisponibilidadEstacion) FileDelete($sFile1) Return $direccion_estacion EndFunc ;==>LeeDatosEstacion ;-------------------------------------------------------------------------------- ;------------------------------------------------------------------------------------------- ; http://www.autoitscript.com/forum/topic/97466-xml-read/ Func XMLget($file, $Path); XMLget($file,'adc_database\currentconditions\realfeel') Local $lastline, $hstart, $hstarta, $end, $ends, $return $Path = StringSplit($Path, '/\|', 0) $lastline = 0 For $lvl = 1 To $Path[0] Step 1 For $line = $lastline To $file[0] Step 1 $lastline = $line $hstart = StringInStr($file[$line], '<' & $Path[$lvl] & '>', 0) $hstarta = StringInStr($file[$line], '<' & $Path[$lvl] & ' ', 0) If $hstart Or $hstarta Then If $lvl == $Path[0] Then If $hstart Then $end = StringInStr($file[$line], '', 0) If $end Then $hstart = $hstart + StringLen('<' & $Path[$lvl] & '>') Return StringMid($file[$line], $hstart, $end - $hstart) EndIf EndIf If $hstarta Then $end = StringInStr($file[$line], '/>', 0) If $end Then $hstarta = $hstarta + StringLen('<' & $Path[$lvl] & ' ') $return = StringMid($file[$line], $hstarta, $end - $hstarta) Return $return EndIf $ends = StringInStr($file[$line], '>', 0) If $ends Then $hstart = $ends + 1 $end = StringInStr($file[$line], '', 0) If $end Then $return = StringMid($file[$line], $hstart, $end - $hstart) Return $return EndIf EndIf EndIf EndIf ContinueLoop 2 EndIf Next If $line == $file[0] Then ExitLoop Next Return 'not found' EndFunc ;==>XMLget Func EditaEstaciones() ;$var=IniRead(@scriptdir&"\valenbisi_estaciones.ini","Estaciones","num","NO_HAY") CreaIni($var) BActualizar() EndFunc ;==>EditaEstaciones Func MuestraInfo() MsgBox(0, "Información", "Esta utilidad permite mostrar la situación actual de las estaciones indicadas en el archivo .ini" & @CR & @CR & "Puede introducir nuevas estaciones o modificar la existentes con 'Editar estaciones' del menú contextual." & @CR & @CR & $MensajeEstaciones & @CR & @CR & $MensajeAutor) EndFunc ;==>MuestraInfo Func GUI_Principal_Cierra() Local $size = WinGetPos($gui_main) ; Obtiene las coordenadas de la ventana ;MsgBox(0, "Coordenadas de ventana $gui_main (x,y,width,height):", $size[0] & " " & $size[1] & " " & $size[2] & " " & $size[3]) IniWrite($archivoini, "Configuracion", "Ventana_X", $size[0]) IniWrite($archivoini, "Configuracion", "Ventana_Y", $size[1]) IniWrite($archivoini, "Configuracion", "Ventana_Ancho", $size[2]) IniWrite($archivoini, "Configuracion", "Ventana_Alto", $size[3]) For $i = 0 To 4 $columnaLV[$i] = _GUICtrlListView_GetColumnWidth($hListView, $i) IniWrite($archivoini, "Configuracion", "Columna" & $i, $columnaLV[$i]) cw("Columna " & $i & " ancho: " & $columnaLV[$i]) Next cw("Borrando: " & $sFile) FileDelete($sFile) Exit EndFunc ;==>GUI_Principal_Cierra Func SpecialEvents() Select Case @GUI_CtrlId = $GUI_EVENT_CLOSE ;MsgBox(0, "Close Pressed", "ID=" & @GUI_CtrlId & " WinHandle=" & @GUI_WinHandle) GUISetState(@SW_HIDE, @GUI_WinHandle) ; Esconde la ventana Case @GUI_CtrlId = $GUI_EVENT_MINIMIZE ;MsgBox(0, "Window Minimized", "ID=" & @GUI_CtrlId & " WinHandle=" & @GUI_WinHandle) Case @GUI_CtrlId = $GUI_EVENT_RESTORE ;MsgBox(0, "Window Restored", "ID=" & @GUI_CtrlId & " WinHandle=" & @GUI_WinHandle) EndSelect EndFunc ;==>SpecialEvents Func BActualizar() LeeDatosIni() ; Lectura de datos de archivo .ini _GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($hListView)) principal() EndFunc ;==>BActualizar Func CreaIni($var = "") While 1 Local $estaciones_usuario = InputBox("Nuevas estaciones", "Introduzca las estaciones que desea mostrar, separadas por coma. (ej: 173,172,143)" & @CR & @CR & $MensajeEstaciones & @CR & @CR, $var, " M", 500, 250) ; M para que necesariamente se introduzca algún valor If StringRegExp($estaciones_usuario, "[^0-9|,]", 0) = 1 Then ; si no se introducen sólo digitos y comas mb("Se ha introducido caracteres no válidos." & @CR & "Sólo puede introducir números y comas." & @CRLF) $var = $estaciones_usuario ; Pone en $var el texto introducido para que pueda ser modificado Else cw("Parece que se ha introducido datos correctos en el INPUTBOX." & @CRLF) If $estaciones_usuario = "" Then cw("Se ha cancelado la operación de modificar estaciones. Se saldrá de la operación.") ExitLoop Else ; Elimina posibles comas al inicio y/o final del texto introducido While StringInStr($estaciones_usuario, ",,") ;mientras encuentre comas repetidas $estaciones_usuario = stringreplace($estaciones_usuario, ",,", ",") ;reemplaza ,, por , en caso de que se haya introducido repetida WEnd If StringLeft($estaciones_usuario, 1) = "," Then $estaciones_usuario = StringRight($estaciones_usuario, StringLen($estaciones_usuario) - 1) If StringRight($estaciones_usuario, 1) = "," Then $estaciones_usuario = StringLeft($estaciones_usuario, StringLen($estaciones_usuario) - 1) IniWrite(@ScriptDir & "\" & StringLeft(@ScriptName, StringLen(@ScriptName) - 4) & "_estaciones.ini", "Estaciones", "Num", $estaciones_usuario) ExitLoop EndIf EndIf WEnd EndFunc ;==>CreaIni Func LeeDatosIni() ; Lectura de datos de archivo .ini If FileExists($archivoini) Then ; Si existe el archivo .ini ;MsgBox(0,"Aviso","Existe el archivo .ini") $Ventana_X = IniRead($archivoini, "Configuracion", "Ventana_X", 400) $Ventana_Y = IniRead($archivoini, "Configuracion", "Ventana_Y", 325) $Ventana_Ancho = IniRead($archivoini, "Configuracion", "Ventana_Ancho", -1) $Ventana_Alto = IniRead($archivoini, "Configuracion", "Ventana_Alto", -1) cw("Datos de ventana: " & $Ventana_X & "," & $Ventana_Y & "," & $Ventana_Ancho & "," & $Ventana_Alto) Else MsgBox(0, "Aviso", "No existe el archivo .ini necesario." & @CR & @CR & "A continuación se le pedirá que introduzca los números de estación deseados, separados por comas." & @CR & @CR & $MensajeEstaciones) CreaIni() EndIf Local $TextoCWcolumnas = "" ;$var=IniRead(@scriptdir&"\valenbisi_estaciones.ini","Estaciones","num","NO_HAY") $var = IniRead($archivoini, "Estaciones", "num", "NO_HAY") If $var = "NO_HAY" Then MsgBox(0, "Aviso", "No existe ninguna estación en el archivo .ini" & @CR & @CR & "A continuación se le pedirá que introduzca los números de estación deseados, separados por comas." & @CR & @CR & $MensajeEstaciones) CreaIni() ;$var=IniRead(@scriptdir&"\valenbisi_estaciones.ini","Estaciones","num","NO_HAY") $var = IniRead($archivoini, "Estaciones", "num", "NO_HAY") EndIf cw("Estaciones leidas: " & $var) $estaciones = _StringExplode($var, ",", 0) For $i = 0 To 4 $columnaLVleida[$i] = IniRead($archivoini, "Configuracion", "Columna" & $i, $columnaLV[$i]) $TextoCWcolumnas = $TextoCWcolumnas & " " & $columnaLVleida[$i] Next cw("Ancho Columnas: " & $TextoCWcolumnas) Global $num_estacion[UBound($estaciones)][5] ;Estación, Dirección, BicisLibres, BornetasLibres, BornetasTotales For $i = 0 To UBound($estaciones) - 1 $num_estacion[$i][0] = $estaciones[$i] ; Estación $num_estacion[$i][1] = 0 ; Dirección $num_estacion[$i][2] = 0 ; BicisLibres $num_estacion[$i][3] = 0 ; BornetasLibres $num_estacion[$i][4] = 0 ; BornetasTotales Next EndFunc ;==>LeeDatosIni