Je viens de découvrir il y a quelques jours que la NASA partageais un api gratuitement. Il suffit de faire une demande de clé gratuite sur ce site pour l'exploiter:
https://api.nasa.gov/
Une fois fait, j'ai créé un exemple simple qui permet d'exploiter certains API. J'ai commenté le code pour aider ceux qui en ont besoin. Il faut ajouter votre clé api en haut du code pour que ça fonctionne.
Code : Tout sélectionner
; ======================================================================
; Client NASA multi-API
; By MetalOS
; ======================================================================
EnableExplicit
UsePNGImageDecoder()
UseJPEGImageDecoder()
; ----------------------------------------------------------------------
; CONFIGURATION NASA
; ----------------------------------------------------------------------
Global NASA_API_KEY$ = "Votre clé API"
Global NASA_BASE_URL$ = "https://api.nasa.gov"
; ----------------------------------------------------------------------
; CONST / GADGETS
; ----------------------------------------------------------------------
Enumeration 1
#WinMain
#TabMain
; Onglet APOD
#BtnApodLoad
#ImgApod
#EdtApodTitle
#EdtApodDate
#EdtApodUrl
#TxtApodExplanation
; Onglet NEO
#BtnNeoLoad
#ListNeo
; Onglet Mars - Images
#BtnMarsImgSearch
#EdtMarsImgQuery
#ListMarsImg
; Onglet Mars - Météo
#BtnMarsWeatherLoad
#ListMarsWeather
; Onglet Mars - HiRISE
#BtnMarsHiRISELoad
#ListMarsHiRISE
; Onglet EPIC
#BtnEpicLoad
#ListEpic
; Onglet DONKI
#BtnDonkiLoad
#ListDonki
EndEnumeration
; ----------------------------------------------------------------------
; OUTILS HTTP / JSON
; ----------------------------------------------------------------------
; Requête HTTP GET basique, retourne le corps en UTF-8 (ou "")
Procedure.s HttpGet(URL$)
Protected Request, Result$, Status$
Debug "HTTP GET: " + URL$
Request = HTTPRequest(#PB_HTTP_Get, URL$, "", #PB_HTTP_Debug)
If Request
Status$ = HTTPInfo(Request, #PB_HTTP_StatusCode)
Result$ = HTTPInfo(Request, #PB_HTTP_Response)
Debug "HTTP Status: " + Status$
; Si ce n'est pas 200, on log et on renvoie chaîne vide
If Status$ <> "200"
Debug "Réponse NASA (erreur, tronquée à 500 caractères) :"
Debug Left(Result$, 500)
Result$ = "" ; Forcer l'échec dans les LoadXXX()
EndIf
FinishHTTP(Request)
Else
Debug "HTTPRequest() a échoué pour l'URL : " + URL$
Result$ = ""
EndIf
ProcedureReturn Result$
EndProcedure
; Affichage simple d'une erreur
Procedure ShowError(Message$)
MessageRequester("Erreur", Message$, #PB_MessageRequester_Ok | #PB_MessageRequester_Error)
EndProcedure
; Raccourci pour lire une chaîne dans un objet JSON à partir d'une clé
; (utilise la fonction interne GetJSONString(Value) de PureBasic)
; Raccourci pour lire une valeur JSON et la retourner sous forme de texte,
; quel que soit son type (string, nombre, booléen).
Procedure.s JSON_GetField(Value, Key$)
Protected Child, t
Child = GetJSONMember(Value, Key$)
If Child = 0
ProcedureReturn ""
EndIf
t = JSONType(Child)
Select t
Case #PB_JSON_String
ProcedureReturn GetJSONString(Child)
Case #PB_JSON_Number
; On passe les nombres en texte (double)
ProcedureReturn StrD(GetJSONDouble(Child))
Case #PB_JSON_Boolean
If GetJSONBoolean(Child)
ProcedureReturn "true"
Else
ProcedureReturn "false"
EndIf
Default
; Pour objets / tableaux, on ne retourne rien (tu pourras adapter au besoin)
ProcedureReturn ""
EndSelect
EndProcedure
; Encodage minimal pour les requêtes texte (espaces, accents basiques)
Procedure.s UrlEncode(Text$)
Protected i, c, r$
For i = 1 To Len(Text$)
c = Asc(Mid(Text$, i, 1))
Select c
Case 'A' To 'Z', 'a' To 'z', '0' To '9', '-', '_', '.', '~'
r$ + Chr(c)
Case ' '
r$ + "%20"
Default
r$ + "%" + RSet(Hex(c), 2, "0")
EndSelect
Next
ProcedureReturn r$
EndProcedure
; ----------------------------------------------------------------------
; FONCTIONS APOD
; ----------------------------------------------------------------------
Procedure LoadAPOD()
Protected URL$, Json$, JsonID, Root
Protected MediaType$, Title$, Explanation$, Date$, ImageUrl$
Protected HttpReq, *ImgMem, ImgSize, ImgNum, ResizedImg
Protected GadgetW, GadgetH
; Construire l'URL APOD
URL$ = NASA_BASE_URL$ + "/planetary/apod?api_key=" + NASA_API_KEY$
; Récupérer le JSON via HttpGet()
Json$ = HttpGet(URL$)
If Json$ = ""
ShowError("Impossible de récupérer l'APOD.")
ProcedureReturn
EndIf
; Parser le JSON
JsonID = ParseJSON(#PB_Any, Json$)
If JsonID = 0
ShowError("Erreur de parsing JSON APOD.")
ProcedureReturn
EndIf
Root = JSONValue(JsonID)
If Root = 0
ShowError("Format JSON APOD inattendu.")
FreeJSON(JsonID)
ProcedureReturn
EndIf
; Lire les champs principaux
Title$ = JSON_GetField(Root, "title")
Explanation$ = JSON_GetField(Root, "explanation")
Date$ = JSON_GetField(Root, "date")
MediaType$ = JSON_GetField(Root, "media_type")
ImageUrl$ = JSON_GetField(Root, "url")
; Mettre à jour les gadgets texte
SetGadgetText(#EdtApodTitle, Title$)
SetGadgetText(#EdtApodDate, Date$)
SetGadgetText(#EdtApodUrl, ImageUrl$)
SetGadgetText(#TxtApodExplanation, Explanation$)
; Charger l'image uniquement si media_type = "image"
If MediaType$ = "image" And ImageUrl$ <> ""
Debug "APOD image URL: " + ImageUrl$
; --- Téléchargement de l'image via la nouvelle API HTTP ---
HttpReq = HTTPRequest(#PB_HTTP_Get, ImageUrl$, "", #PB_HTTP_Debug)
If HttpReq
*ImgMem = HTTPMemory(HttpReq)
If *ImgMem
ImgSize = MemorySize(*ImgMem)
Debug "Taille image APOD reçue (HTTPMemory) : " + Str(ImgSize)
ImgNum = CatchImage(#PB_Any, *ImgMem, ImgSize)
FreeMemory(*ImgMem)
If ImgNum
Debug "CatchImage OK, ImgNum = " + Str(ImgNum)
; --- Redimensionnement automatique à la taille du gadget ---
GadgetW = GadgetWidth(#ImgApod)
GadgetH = GadgetHeight(#ImgApod)
ResizedImg = CreateImage(#PB_Any, GadgetW, GadgetH)
If ResizedImg
If StartDrawing(ImageOutput(ResizedImg))
Box(0, 0, GadgetW, GadgetH, $000000) ; fond noir (optionnel)
DrawImage(ImageID(ImgNum), 0, 0, GadgetW, GadgetH)
StopDrawing()
EndIf
SetGadgetState(#ImgApod, ImageID(ResizedImg))
Else
; Si on ne peut pas créer l'image redimensionnée, on affiche l'originale
SetGadgetState(#ImgApod, ImageID(ImgNum))
EndIf
; On peut libérer l'image originale si on ne la réutilise pas
FreeImage(ImgNum)
Else
Debug "CatchImage a échoué pour l'image APOD"
ShowError("Impossible de décoder l'image APOD (format non supporté ?).")
SetGadgetState(#ImgApod, 0)
EndIf
Else
Debug "HTTPMemory() a renvoyé 0 pour l'image APOD"
ShowError("Impossible de lire les données de l'image APOD.")
SetGadgetState(#ImgApod, 0)
EndIf
FinishHTTP(HttpReq)
Else
Debug "HTTPRequest() a échoué pour l'image APOD"
ShowError("Impossible de télécharger l'image APOD.")
SetGadgetState(#ImgApod, 0)
EndIf
Else
; Si ce n'est pas une image (vidéo, etc.), on vide l'ImageGadget
Debug "APOD media_type = " + MediaType$ + " -> aucune image à afficher."
SetGadgetState(#ImgApod, 0)
EndIf
FreeJSON(JsonID)
EndProcedure
; ----------------------------------------------------------------------
; FONCTIONS NEO (Near Earth Objects)
; ----------------------------------------------------------------------
; /neo/rest/v1/feed?start_date=...
Procedure LoadNEO()
Protected URL$, Json$, JsonID, Root, NearEarth
Protected DateArrayValue, NeoArray, NeoCount, j
Protected ObjNode, Name$, MagH$, Haz$, Distance$, Speed$
Protected Date$, CAD, CADCount, CADItem, MissDist, RelVel
Protected HazardValue
; On récupère les NEO du jour
Date$ = FormatDate("%yyyy-%mm-%dd", Date())
URL$ = NASA_BASE_URL$ + "/neo/rest/v1/feed?start_date=" + Date$ + "&end_date=" + Date$ + "&api_key=" + NASA_API_KEY$
Json$ = HttpGet(URL$)
If Json$ = ""
ShowError("Impossible de récupérer les données ...")
ProcedureReturn
EndIf
ClearGadgetItems(#ListNeo)
JsonID = ParseJSON(#PB_Any, Json$)
If JsonID = 0
ShowError("Erreur de parsing JSON NEO.")
ProcedureReturn
EndIf
Root = JSONValue(JsonID)
If Root = 0
ShowError("Format NEO inattendu.")
FreeJSON(JsonID)
ProcedureReturn
EndIf
; near_earth_objects est un objet dont chaque clé est une date
NearEarth = GetJSONMember(Root, "near_earth_objects")
If NearEarth = 0
ShowError("Champ 'near_earth_objects' introuvable.")
FreeJSON(JsonID)
ProcedureReturn
EndIf
; On ne lit que la date du jour : near_earth_objects[Date$]
DateArrayValue = GetJSONMember(NearEarth, Date$)
If DateArrayValue = 0
ShowError("Aucun NEO trouvé pour la date " + Date$ + ".")
FreeJSON(JsonID)
ProcedureReturn
EndIf
NeoArray = DateArrayValue
NeoCount = JSONArraySize(NeoArray)
For j = 0 To NeoCount - 1
ObjNode = GetJSONElement(NeoArray, j)
If ObjNode
Name$ = JSON_GetField(ObjNode, "name")
If GetJSONMember(ObjNode, "absolute_magnitude_h")
MagH$ = StrD(GetJSONDouble(GetJSONMember(ObjNode, "absolute_magnitude_h")))
Else
MagH$ = ""
EndIf
HazardValue = GetJSONMember(ObjNode, "is_potentially_hazardous_asteroid")
If HazardValue And GetJSONBoolean(HazardValue)
Haz$ = "Oui"
Else
Haz$ = "Non"
EndIf
Distance$ = ""
Speed$ = ""
; Distance & vitesse approx (première approche close_approach_data)
CAD = GetJSONMember(ObjNode, "close_approach_data")
If CAD
CADCount = JSONArraySize(CAD)
If CADCount > 0
CADItem = GetJSONElement(CAD, 0)
If CADItem
MissDist = GetJSONMember(CADItem, "miss_distance")
If MissDist
Distance$ = JSON_GetField(MissDist, "kilometers")
EndIf
RelVel = GetJSONMember(CADItem, "relative_velocity")
If RelVel
Speed$ = JSON_GetField(RelVel, "kilometers_per_hour")
EndIf
EndIf
EndIf
EndIf
AddGadgetItem(#ListNeo, -1, Date$ + Chr(10) + Name$ + Chr(10) + MagH$ + Chr(10) + Haz$ + Chr(10) + Distance$ + Chr(10) + Speed$)
EndIf
Next j
FreeJSON(JsonID)
EndProcedure
; ----------------------------------------------------------------------
; MARS IMAGES via NASA Image and Video Library
; ----------------------------------------------------------------------
Procedure LoadMarsImages()
Protected Query$, URL$, Json$, JsonID, Root, Collection, Items
Protected Count, i, Item, DataArray, LinksArray, Data0, Link0
Protected Title$, Date$, ImgUrl$
Query$ = Trim(GetGadgetText(#EdtMarsImgQuery))
If Query$ = ""
Query$ = "curiosity rover"
EndIf
URL$ = "https://images-api.nasa.gov/search?q=" + UrlEncode(Query$) + "&media_type=image"
Json$ = HttpGet(URL$)
If Json$ = ""
ShowError("Impossible de récupérer les images pour la requête : " + Query$)
ProcedureReturn
EndIf
ClearGadgetItems(#ListMarsImg)
JsonID = ParseJSON(#PB_Any, Json$)
If JsonID = 0
ShowError("Erreur de parsing JSON (Mars Images).")
ProcedureReturn
EndIf
Root = JSONValue(JsonID)
If Root = 0
ShowError("Format JSON inattendu (Mars Images).")
FreeJSON(JsonID)
ProcedureReturn
EndIf
Collection = GetJSONMember(Root, "collection")
If Collection = 0
ShowError("Champ 'collection' introuvable (Mars Images).")
FreeJSON(JsonID)
ProcedureReturn
EndIf
Items = GetJSONMember(Collection, "items")
If Items = 0 Or JSONType(Items) <> #PB_JSON_Array
ShowError("Champ 'items' introuvable ou invalide (Mars Images).")
FreeJSON(JsonID)
ProcedureReturn
EndIf
Count = JSONArraySize(Items)
For i = 0 To Count - 1
Item = GetJSONElement(Items, i)
If Item
Title$ = ""
Date$ = ""
ImgUrl$ = ""
DataArray = GetJSONMember(Item, "data")
If DataArray And JSONType(DataArray) = #PB_JSON_Array And JSONArraySize(DataArray) > 0
Data0 = GetJSONElement(DataArray, 0)
If Data0
Title$ = JSON_GetField(Data0, "title")
Date$ = JSON_GetField(Data0, "date_created")
EndIf
EndIf
LinksArray = GetJSONMember(Item, "links")
If LinksArray And JSONType(LinksArray) = #PB_JSON_Array And JSONArraySize(LinksArray) > 0
Link0 = GetJSONElement(LinksArray, 0)
If Link0
ImgUrl$ = JSON_GetField(Link0, "href")
EndIf
EndIf
If Title$ <> "" Or ImgUrl$ <> ""
AddGadgetItem(#ListMarsImg, -1, Title$ + Chr(10) + Date$ + Chr(10) + ImgUrl$)
EndIf
EndIf
Next i
FreeJSON(JsonID)
EndProcedure
; ----------------------------------------------------------------------
; MARS METEO (InSight Weather API)
; ----------------------------------------------------------------------
Procedure LoadMarsWeather()
Protected URL$, Json$, JsonID, Root, SolKeys, SolCount, i
Protected SolNode, SolKey$, SolObj
Protected AT, PRE
Protected Tmn$, Tmx$, Pav$, FirstUTC$, Season$
URL$ = "https://api.nasa.gov/insight_weather/?api_key=" + NASA_API_KEY$ + "&feedtype=json&ver=1.0"
Json$ = HttpGet(URL$)
If Json$ = ""
ShowError("Impossible de récupérer la météo InSight (API indisponible ou clé invalide).")
ProcedureReturn
EndIf
ClearGadgetItems(#ListMarsWeather)
JsonID = ParseJSON(#PB_Any, Json$)
If JsonID = 0
ShowError("Erreur de parsing JSON (Mars Météo).")
ProcedureReturn
EndIf
Root = JSONValue(JsonID)
If Root = 0
ShowError("Format JSON inattendu (Mars Météo).")
FreeJSON(JsonID)
ProcedureReturn
EndIf
SolKeys = GetJSONMember(Root, "sol_keys")
If SolKeys = 0 Or JSONType(SolKeys) <> #PB_JSON_Array
ShowError("Champ 'sol_keys' introuvable (Mars Météo).")
FreeJSON(JsonID)
ProcedureReturn
EndIf
SolCount = JSONArraySize(SolKeys)
For i = 0 To SolCount - 1
SolNode = GetJSONElement(SolKeys, i)
If SolNode
SolKey$ = GetJSONString(SolNode)
If SolKey$ <> ""
SolObj = GetJSONMember(Root, SolKey$)
If SolObj
FirstUTC$ = JSON_GetField(SolObj, "First_UTC")
Season$ = JSON_GetField(SolObj, "Season")
Tmn$ = ""
Tmx$ = ""
Pav$ = ""
AT = GetJSONMember(SolObj, "AT")
If AT
Tmn$ = JSON_GetField(AT, "mn")
Tmx$ = JSON_GetField(AT, "mx")
EndIf
PRE = GetJSONMember(SolObj, "PRE")
If PRE
Pav$ = JSON_GetField(PRE, "av")
EndIf
AddGadgetItem(#ListMarsWeather, -1, SolKey$ + Chr(10) + FirstUTC$ + Chr(10) + Tmn$ + Chr(10) + Tmx$ + Chr(10) + Pav$ + Chr(10) + Season$)
EndIf
EndIf
EndIf
Next i
FreeJSON(JsonID)
EndProcedure
; ----------------------------------------------------------------------
; MARS HiRISE (images MRO via NASA Image Library)
; ----------------------------------------------------------------------
Procedure LoadMarsHiRISE()
Protected URL$, Json$, JsonID, Root, Collection, Items
Protected Count, i, Item, DataArray, LinksArray, Data0, Link0
Protected Title$, Date$, ImgUrl$
; Requête fixe pour des images HiRISE de Mars
URL$ = "https://images-api.nasa.gov/search?q=" + UrlEncode("HiRISE Mars") + "&media_type=image"
Json$ = HttpGet(URL$)
If Json$ = ""
ShowError("Impossible de récupérer les images HiRISE.")
ProcedureReturn
EndIf
ClearGadgetItems(#ListMarsHiRISE)
JsonID = ParseJSON(#PB_Any, Json$)
If JsonID = 0
ShowError("Erreur de parsing JSON (Mars HiRISE).")
ProcedureReturn
EndIf
Root = JSONValue(JsonID)
If Root = 0
ShowError("Format JSON inattendu (Mars HiRISE).")
FreeJSON(JsonID)
ProcedureReturn
EndIf
Collection = GetJSONMember(Root, "collection")
If Collection = 0
ShowError("Champ 'collection' introuvable (Mars HiRISE).")
FreeJSON(JsonID)
ProcedureReturn
EndIf
Items = GetJSONMember(Collection, "items")
If Items = 0 Or JSONType(Items) <> #PB_JSON_Array
ShowError("Champ 'items' introuvable ou invalide (Mars HiRISE).")
FreeJSON(JsonID)
ProcedureReturn
EndIf
Count = JSONArraySize(Items)
For i = 0 To Count - 1
Item = GetJSONElement(Items, i)
If Item
Title$ = ""
Date$ = ""
ImgUrl$ = ""
DataArray = GetJSONMember(Item, "data")
If DataArray And JSONType(DataArray) = #PB_JSON_Array And JSONArraySize(DataArray) > 0
Data0 = GetJSONElement(DataArray, 0)
If Data0
Title$ = JSON_GetField(Data0, "title")
Date$ = JSON_GetField(Data0, "date_created")
EndIf
EndIf
LinksArray = GetJSONMember(Item, "links")
If LinksArray And JSONType(LinksArray) = #PB_JSON_Array And JSONArraySize(LinksArray) > 0
Link0 = GetJSONElement(LinksArray, 0)
If Link0
ImgUrl$ = JSON_GetField(Link0, "href")
EndIf
EndIf
If Title$ <> "" Or ImgUrl$ <> ""
AddGadgetItem(#ListMarsHiRISE, -1, Title$ + Chr(10) + Date$ + Chr(10) + ImgUrl$)
EndIf
EndIf
Next i
FreeJSON(JsonID)
EndProcedure
; ----------------------------------------------------------------------
; FONCTIONS EPIC (images de la Terre) - via epic.gsfc.nasa.gov (sans api_key)
; ----------------------------------------------------------------------
; /api/natural
Procedure LoadEPIC()
Protected URL$, Json$, JsonID, Root, Count, i, Node, Date$, Img$
; On n'utilise PAS NASA_BASE_URL ici, on tape directement l'API EPIC
URL$ = "https://epic.gsfc.nasa.gov/api/natural"
Json$ = HttpGet(URL$)
If Json$ = ""
ShowError("Impossible de récupérer les données EPIC (service indisponible).")
ProcedureReturn
EndIf
ClearGadgetItems(#ListEpic)
JsonID = ParseJSON(#PB_Any, Json$)
If JsonID = 0
ShowError("Erreur de parsing JSON EPIC.")
ProcedureReturn
EndIf
Root = JSONValue(JsonID)
If Root = 0 Or JSONType(Root) <> #PB_JSON_Array
ShowError("Format EPIC inattendu (tableau JSON attendu).")
FreeJSON(JsonID)
ProcedureReturn
EndIf
Count = JSONArraySize(Root)
For i = 0 To Count - 1
Node = GetJSONElement(Root, i)
If Node
Date$ = JSON_GetField(Node, "date")
Img$ = JSON_GetField(Node, "image")
AddGadgetItem(#ListEpic, -1, Date$ + Chr(10) + Img$)
EndIf
Next i
FreeJSON(JsonID)
EndProcedure
; ----------------------------------------------------------------------
; FONCTIONS DONKI (Space Weather)
; ----------------------------------------------------------------------
; /DONKI/CME?startDate=YYYY-MM-DD&endDate=YYYY-MM-DD&api_key=...
Procedure LoadDonki()
Protected Start$, End$, URL$, Json$, JsonID, Root
Protected Count, i, Node, Time$, Note$
; On prend les 7 derniers jours
Start$ = FormatDate("%yyyy-%mm-%dd", Date() - 7 * 24 * 60 * 60)
End$ = FormatDate("%yyyy-%mm-%dd", Date())
URL$ = NASA_BASE_URL$ + "/DONKI/CME?startDate=" + Start$ + "&endDate=" + End$ + "&api_key=" + NASA_API_KEY$
Json$ = HttpGet(URL$)
If Json$ = ""
ShowError("Impossible de récupérer les données DONKI CME.")
ProcedureReturn
EndIf
ClearGadgetItems(#ListDonki)
JsonID = ParseJSON(#PB_Any, Json$)
If JsonID = 0
ShowError("Erreur de parsing JSON DONKI.")
ProcedureReturn
EndIf
Root = JSONValue(JsonID)
If Root = 0
ShowError("Format DONKI inattendu.")
FreeJSON(JsonID)
ProcedureReturn
EndIf
Count = JSONArraySize(Root)
For i = 0 To Count - 1
Node = GetJSONElement(Root, i)
If Node
Time$ = JSON_GetField(Node, "startTime")
Note$ = JSON_GetField(Node, "note")
AddGadgetItem(#ListDonki, -1, Time$ + Chr(10) + Note$)
EndIf
Next i
FreeJSON(JsonID)
EndProcedure
; ----------------------------------------------------------------------
; CREATION INTERFACE
; ----------------------------------------------------------------------
Procedure CreateGUI()
Protected w = 1100, h = 700
If OpenWindow(#WinMain, 0, 0, w, h, "Client NASA API", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)
PanelGadget(#TabMain, 10, 10, w - 20, h - 20)
; ====================================================================
; ONGLET APOD
; ====================================================================
AddGadgetItem(#TabMain, -1, "APOD")
ButtonGadget(#BtnApodLoad, 20, 40, 160, 30, "Charger l'APOD du jour")
ImageGadget(#ImgApod, 20, 80, 400, 300, 0, #PB_Image_Border)
TextGadget(#PB_Any, 440, 40, 100, 20, "Titre :")
StringGadget(#EdtApodTitle, 490, 40, 580, 20, "")
TextGadget(#PB_Any, 440, 70, 100, 20, "Date :")
StringGadget(#EdtApodDate, 490, 70, 200, 20, "")
TextGadget(#PB_Any, 440, 100, 100, 20, "URL :")
StringGadget(#EdtApodUrl, 490, 100, 580, 20, "")
TextGadget(#PB_Any, 440, 130, 200, 20, "Description :")
EditorGadget(#TxtApodExplanation, 440, 150, 630, 230)
; ====================================================================
; ONGLET NEO
; ====================================================================
AddGadgetItem(#TabMain, -1, "NEO (Astéroïdes)")
ButtonGadget(#BtnNeoLoad, 20, 40, 250, 30, "Charger les NEO d'aujourd'hui")
ListIconGadget(#ListNeo, 20, 80, w - 60, h - 140, "Date", 100)
AddGadgetColumn(#ListNeo, 1, "Nom", 200)
AddGadgetColumn(#ListNeo, 2, "Mag H", 60)
AddGadgetColumn(#ListNeo, 3, "Dangereux ?", 90)
AddGadgetColumn(#ListNeo, 4, "Dist (km)", 120)
AddGadgetColumn(#ListNeo, 5, "Vitesse (km/h)", 140)
; ====================================================================
; ONGLET MARS - IMAGES
; ====================================================================
AddGadgetItem(#TabMain, -1, "Mars - Images")
TextGadget(#PB_Any, 20, 40, 70, 20, "Rechercher :")
StringGadget(#EdtMarsImgQuery, 90, 40, 250, 20, "curiosity rover")
ButtonGadget(#BtnMarsImgSearch, 360, 40, 260, 30, "Chercher dans NASA Image Library")
ListIconGadget(#ListMarsImg, 20, 80, w - 60, h - 140, "Titre", 300)
AddGadgetColumn(#ListMarsImg, 1, "Date", 150)
AddGadgetColumn(#ListMarsImg, 2, "URL image", 400)
; ====================================================================
; ONGLET MARS - METEO (InSight)
; ====================================================================
AddGadgetItem(#TabMain, -1, "Mars - Météo (InSight)")
ButtonGadget(#BtnMarsWeatherLoad, 20, 40, 260, 30, "Charger la météo (InSight)")
ListIconGadget(#ListMarsWeather, 20, 80, w - 60, h - 140, "Sol", 80)
AddGadgetColumn(#ListMarsWeather, 1, "Date début", 180)
AddGadgetColumn(#ListMarsWeather, 2, "Temp min (°C)", 120)
AddGadgetColumn(#ListMarsWeather, 3, "Temp max (°C)", 120)
AddGadgetColumn(#ListMarsWeather, 4, "Pression moy (Pa)", 140)
AddGadgetColumn(#ListMarsWeather, 5, "Saison", 120)
; ====================================================================
; ONGLET MARS - HiRISE
; ====================================================================
AddGadgetItem(#TabMain, -1, "Mars - HiRISE")
ButtonGadget(#BtnMarsHiRISELoad, 20, 40, 260, 30, "Charger images HiRISE (NASA Library)")
ListIconGadget(#ListMarsHiRISE, 20, 80, w - 60, h - 140, "Titre", 300)
AddGadgetColumn(#ListMarsHiRISE, 1, "Date", 180)
AddGadgetColumn(#ListMarsHiRISE, 2, "URL image", 400)
; ====================================================================
; ONGLET EPIC
; ====================================================================
AddGadgetItem(#TabMain, -1, "EPIC (Terre)")
ButtonGadget(#BtnEpicLoad, 20, 40, 220, 30, "Charger images EPIC")
ListIconGadget(#ListEpic, 20, 80, w - 60, h - 140, "Date", 200)
AddGadgetColumn(#ListEpic, 1, "Image", 400)
; ====================================================================
; ONGLET DONKI
; ====================================================================
AddGadgetItem(#TabMain, -1, "DONKI (Space Weather)")
ButtonGadget(#BtnDonkiLoad, 20, 40, 260, 30, "Charger CME (7 derniers jours)")
ListIconGadget(#ListDonki, 20, 80, w - 60, h - 140, "Start Time", 200)
AddGadgetColumn(#ListDonki, 1, "Note", 500)
EndIf
EndProcedure
; ----------------------------------------------------------------------
; BOUCLE PRINCIPALE
; ----------------------------------------------------------------------
Procedure Main()
Protected Event, GadgetID
CreateGUI()
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
GadgetID = EventGadget()
Select GadgetID
Case #BtnApodLoad
LoadAPOD()
Case #BtnNeoLoad
LoadNEO()
Case #BtnMarsImgSearch
LoadMarsImages()
Case #BtnMarsWeatherLoad
LoadMarsWeather()
Case #BtnMarsHiRISELoad
LoadMarsHiRISE()
Case #BtnEpicLoad
LoadEPIC()
Case #BtnDonkiLoad
LoadDonki()
EndSelect
EndSelect
ForEver
EndProcedure
; ----------------------------------------------------------------------
; LANCEMENT
; ----------------------------------------------------------------------
Main()
End