;------------------------------------------------------------ ;------------------------------------------------------------ ;------------------------------------------------------------ ;+ ; NAME:extractstru ; ; PURPOSE:extrait des elements d''une structure pour constituer une ; nouvelle structure ; ; CATEGORY: dibouille sur les structures ; ; CALLING SEQUENCE: res = extractstru(stru, liste) ; ; INPUTS: ; ; stru: une structure ; ; liste: un vecteur de string comportant les noms des elements de ; stru a virer (par DEFAUT) ou a garder (si GARDE est active) ; ; KEYWORD PARAMETERS: ; ; /GARDE: specifie que la liste donnee concerne les elements de ; stru a garder ; ; /VIRE: specifie que la liste donnee concerne les elements de ; stru a virer. Ce mot cle est active par defaut ; ; OUTPUTS:une stucture ou -1 en cas de pb ; ; COMMON BLOCKS: ; ; SIDE EFFECTS: ; ; RESTRICTIONS: none !!! ; liste peut contenir des noms d''elements qui ne sont pas ds stru, ; le programme se debrouille avec ; ; EXAMPLE: ; ; IDL> extra=get_extra(/ok, year=1999, age_capitaine=35 ) ; IDL> help, extra,/struct ; ** Structure <83e66bc>, 3 tags, length=6, refs=1: ; AGE_CAPITAINE INT 35 ; OK INT 1 ; YEAR INT 1999 ; IDL> help, extractstru(extra,['ok','hhuihi','YEAR']),/stru ; ** Structure <831afac>, 1 tags, length=2, refs=1: ; AGE_CAPITAINE INT 35 ; IDL> help, extractstru(extra,['ok','hhuihi','YEAR'],/garde),/stru ; ** Structure <834bbc4>, 2 tags, length=4, refs=1: ; OK INT 1 ; YEAR INT 1999 ; ; MODIFICATION HISTORY:Sebastien Masson (smasson@lodyc.jussieu.fr) ; 8/10/1999 ;- ;------------------------------------------------------------ ;------------------------------------------------------------ ;------------------------------------------------------------ FUNCTION extractstru, stru, liste, GARDE = garde, VIRE = vire if size(stru, /type) NE 8 then return, -1 if size(liste, /type) NE 7 then return, -1 ; cheking for garde and vire keywords garde = keyword_set(garde)*(1-keyword_set(vire)) vire = keyword_set(vire)*(1-keyword_set(garde)) +(keyword_set(vire) EQ garde) ; tname = tag_names(stru) index = make_selection(tname, strupcase(liste), /only_valid, /quiet) ; if garde then BEGIN ; on garde que la liste if index[0] EQ -1 then return, -1 if n_elements(index) EQ n_elements(tname) then return, stru res = create_struct(tname[index[0]], stru.(index[0])) if n_elements(index) GT 1 then for i = 1, n_elements(index)-1 do $ res = create_struct(res, tname[index[i]], stru.(index[i])) ENDIF ELSE BEGIN ; on vire la liste if n_elements(index) EQ n_elements(tname) then return, -1 if index[0] EQ -1 then return, stru ; on prend le complementaire de index pour obtenir les indices que ; l''on garde index = different(indgen(n_elements(tname)), index) res = create_struct(tname[index[0]], stru.(index[0])) if n_elements(index) GT 1 then for i = 1, n_elements(index)-1 do $ res = create_struct(res, tname[index[i]], stru.(index[i])) ENDELSE return, res end