|
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):
'---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
'--- Deux thèmes doivent être sélectionnés. theView = av.GetActiveDoc SELF.SetEnabled((2 = theView.GetActiveThemes.Count)) |