; 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 ; #include <_XMLDomWrapper.au3> #include #include #include ; Para _StringExplode #include #include ; Para variables de controles edit #include #include #Include #include "_misfunc.au3" Global $DebugIt=1 ;Para que cw y mb de la UDF _misfunc.au3 muestren la línea desde donde se hace la acción ; ============================ 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 Global $Ventana_Y=-1 Global $Ventana_Ancho=450 Global $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: xxxxxxxxxxxxxxxxxxx" Global $TituloGUI="MiValenBisi (jamaro 2011)" 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 Global $datoslibres,$datosestacion Dim $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) Dim $file = FileRead($sFile) $file = StringReplace($file, @LF, '') $file = StringSplit($file, @CR, 1) Dim $Valenbisi_disponibles=XMLget($file, 'station\available') Dim $Valenbisi_libres=XMLget($file, 'station\free') Dim $Valenbisi_totales=XMLget($file, 'station\total') Dim $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 ;------------------------------------------------------------------------------------------- ;------------------------------------------------------------------------------------------- ; 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 ;-------------------------------------------------------------------------------- ;------------------------------------------------------------------------------------------- ; http://www.autoitscript.com/forum/topic/97466-xml-read/ Func XMLget($file, $Path); XMLget($file,'adc_database\currentconditions\realfeel') Dim $lastline,$hstart,$hstarta,$end $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) ;$var=IniRead(@scriptdir&"\valenbisi_estaciones.ini","Estaciones","num","NO_HAY") CreaIni($var) BActualizar() EndFunc 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 Func GUI_Principal_Cierra() Dim $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 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 Func CreaIni($var="") while 1 Dim $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 Func LeeDatosIni() ; Lectura de datos de archivo .ini Global $archivoini=@scriptdir&"\"& stringleft(@ScriptName,stringlen(@scriptname)-4)&"_estaciones.ini" Global $var, $estaciones 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 dim $TextoCWcolumnas="" $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($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