Sommaire  Sommaire

Ajouter cette page aux favoris

Cartes  Cartes
Portail  Portail
Géomatique  Géomatique
Informatique  Informatique
Télécharger  Télécharger
Emploi  Emploi

Personnaliser  Personnaliser
Jeux  Jeux
Forums  Forums
Livre d'or  Livre d'or

RC SIG & PGL  RC SIG & PGL
GeoRezo  GeoRezo
Georama  Georama




54.196.105.235
Web design
Daniel FAIVRE©
|

MakeRelTab

  English English 
Introduction
Le script MakeRelTab
Le code source
Le script "Update" du bouton
 Introduction Retour en haut de la page
    On ne vous a jamais demandé la liste des rivières par communes ? Ou celle des parcelles par rues ? Le script MakeRelTab sert à construire une table des relations spatiales existantes entre les entités de deux thèmes. Il permet ainsi d'exporter des tables de relations spatiales, utilisables pour un mailing, ou un annuaire, par exemple, en plus des usages statistiques courants ...
 Le script MakeRelTab Retour en haut de la page
    Ce script automatise l'exécution de nombreuses requêtes spatiales (des sélections par thème). Chaque entité du thème source est successivement sélectionnée pour établir la liste des objets du thème cible qu'elle contient (totalement ou partiellement).
    Installation:
    1) Créer deux scripts, nommés dF.View.MakeRelTab, et dF.View.MakeRelTabUpdate, avec le code source ci-dessous.
    2) Dans l'interface utilisateur projet, cliquez sur personnaliser, puis créez une nouvelle option de menu (dans le menu vue) avec les options suivantes (sauf pour HelpTopic: laissez-le vide):
   
   
 Le code source Retour en haut de la page
    MakeRelTab peut aisément être modifié pour d'autres types de relations spatiales (en remplaçant #FTAB_RELTYPE_INTERSECTS par un autre type de relation). Les possibilités d'utilisations sont ainsi très variées.
'---Crée  une  table  des  objets  sélectionnés  du  Thème  1  contenus  dans  chacun  de  ceux  de  Thème  2:
'---Copyright  Daniel  FAIVRE  1999  -  www.geomaticien.com  -  Libre  si  cette  notice  est  incluse
'---Une  version  plus  récente  peut  exister  sur  le  site.  Ceci  est  dF.View.MakeRelTab  version  1.0
'---Sans  garanties  de  quelque  nature  que  ce  soit.  

'Ce  script  doit  être  attaché  à  une  option  du  menu  "View"
'Il  est  conseillé  d'utiliser  conjointement  le  script  dF.View.MakeRelTabUpdate.  Ne  fonctionne  bien  sur  que  pour  des  thèmes  VECTEURS,  pas  pour  des  images  ;-)


theView  =  av.GetActiveDoc
theThemes  =  theView.GetActiveThemes
if  (theThemes.Count  <>  2)  then
   MsgBox.Warning  ("Ne  fonctionne  que  si  DEUX  thèmes  sont  sélectionnés","")
   return  nil
end
the1stTheme  =  theThemes.Get(0)
the2ndTheme  =  theThemes.Get(1)
theChoiceList  =  {the1stTheme,the2ndTheme}
theChoice  =  MsgBox.Choice  (theChoiceList,"Quel  thème  sera  du  côté  UN  de  la  relation?  (C'est  celui  qui  contient  plusieurs  objets  de  l'autre  thème)","Choix  de  la  source")
if  (nil=theChoice)  then  return  nil  end
if  (theChoice  =  the2ndTheme)  then
   the1stTheme  =  theThemes.Get(1)
   the2ndTheme  =  theThemes.Get(0)
end    

'---Crée  la  nouvelle  table:    
rel1  =  the1stTheme.GetName.Left(the1stTheme.GetName.IndexOf(".")).Substitute("  ","_")
relN  =  the2ndTheme.GetName.Left(the2ndTheme.GetName.IndexOf(".")).Substitute("  ","_")                                          
theNewTabName  =  FileDialog.Put(av.GetProject.MakeFileName(Rel1  +  relN,"dbf"),  
                                                 "*.dbf",  
                                                 "Nouvelle  relation  entre"  ++  rel1  ++  "et"  ++  relN)
if  (theNewTabName  =  NIL)  then
   return  nil
end                            
theNewTab  =  VTab.MakeNew(theNewTabName,dBase)

'---Crée  les  champs  à  partir  de  ceux  des  tables  attributaires  des  deux  thèmes  utilisés:
the1stTab  =  the1stTheme.GetFTab
for  each  aField  in  the1stTab.GetFields
   if  (aField.GetName  =  "Shape")  then  Continue  end
   theNewTab.AddFields({aField.Clone})
end
theNewTab.AddFields({Field.Make("Num",#FIELD_LONG,16,0)}.Clone)
the2ndTab  =  the2ndTheme.GetFTab
for  each  aField  in  the2ndTab.GetFields
   if  (aField.GetName  =  "Shape")  then  Continue  end
   theNewTab.AddFields({aField.Clone})
end


'---Traite  les  sélections  (boucle):
for  each  rec1  in  the1stTab
'---Sélectionne  l'enregistrement:
   the1stTab.GetSelection.Set(rec1)
   the1stTab.UpdateSelection
'---Recherche  les  entités  du  thème  2  qui  intersectent  l'entité  sélectionnée  du  thème  1:
   the2ndTheme.SelectByTheme(the1stTheme,  #FTAB_RELTYPE_INTERSECTS,  0,  #VTAB_SELTYPE_NEW)
'--Export  des  champs  des  entités  sélectionnées:
   nb  =  0
   for  each  rec2  in  the2ndTab.GetSelection
       nb  =  nb  +  1
       newRecNo  =  theNewTab.AddRecord    
       for  each  F1  in  the1stTab.GetFields
           if  (F1.GetName  =  "Shape")  then  Continue  end
           theDestField  =  theNewTab.FindField(F1.GetName)        
           theNewTab.SetValue(theDestField,newRecNo,the1stTab.ReturnValue(F1,rec1))
       end
       theNewTab.SetValue(theNewTab.FindField("Num"),newRecNo,nb)
       for  each  F2  in  the2ndTab.GetFields
       if  (F2.GetName  =  "Shape")  then  Continue  end
           theDestField  =  theNewTab.FindField(F2.GetName)        
           theNewTab.SetValue(theDestField,newRecNo,the2ndTab.ReturnValue(F2,rec2))
       end
   end        

'---Déselectionne  l'enregistrement  traité:  
   the1stTab.GetSelection.Clear(rec1)
   the1stTab.UpdateSelection  
end

 Le script "Update" du bouton Retour en haut de la page
    Ce script, attaché à la propriété "Update" de la nouvelle option du menu vue, permet de n'activer celle-ci que si deux thèmes sont sélectionnés.
'---  Deux  thèmes  doivent  être  sélectionnés.

theView  =  av.GetActiveDoc
SELF.SetEnabled((2  =  theView.GetActiveThemes.Count))