2009-08-12 20 views

Répondre

1

Ce n'est pas joli, mais dans le passé j'ai ajouté un guid dans la description de la couche. Quelque chose comme ceci:

<LAYER guid='a9843c88-3caa-4953-ad96-ca9990b410e9' revision='1' /> 

J'ai une DLL flottant autour qui claquent ces xml frags dans chaque couche d'un MXD (avec assez cr/lf devant pour faire défiler le fragment XML de la description de couche Boîte de dialogue Prop de calque ArcMap).

Il y a un fichier d'aide dans le fichier 7z (la documentation est rare parce que je fais d'autres choses): http://code.google.com/p/umbriel/downloads/list

+0

Je suppose que je peux exécuter une routine qui l'ajoute à chaque couche lorsque mon premier outil commence. Vous penseriez qu'après toutes ces années ESRI ajouterait cette propriété simple ou restreindrait au moins les noms en double. Merci –

+1

Kirk Kuykendall fait mention d'ajouter un PropertySet à ILayerExtensions et qu'il reste avec la couche ... même avec la couche est enregistrée dans un fichier de couche: http://bit.ly/38PAK –

2

Il existe une interface présente ArcObjects pour obtenir un réglage ou Id pour une couche. Vous devriez regarder ILayerDescriptor: ID, http://resources.esri.com/help/9.3/ArcGISDesktop/ArcObjects/esriCarto/ILayerDescriptor_ID.htm

Voici un VBA Snippet qui montre comment il peut être utilisé:

Public Sub layerInfo() 

Dim app As IApplication ' 
Set app = Application 

Dim mxDoc As IMxDocument 
Set mxDoc = app.Document 

Dim myMap As IMap 
Set myMap = mxDoc.ActiveView 

Dim mapServer As IMxdServer 
Set mapServer = New MxdServer 

'''Point to your .mxd... 
mapServer.Start ("D:\Test.mxd") 

Dim myArray As IArray 
Set myArray = mapServer.LayerDescriptors(myMap.Name) 

MsgBox myArray.Count 

Dim x As ILayerDescriptor 
Dim intX As Integer 
intX = 0 

For intX = 0 To myArray.Count - 1 
Set x = myArray.Element(intX) 
MsgBox x.ID 
MsgBox x.Name 
Next 

End Sub 
+0

J'ai jamais utilisé ILayerDescriptor avant. J'ai juste essayé votre code - il ne fournit pas d'ID pour les couches qui sont ajoutées après l'ouverture (une sauvegarde mxd préalable est nécessaire). Est-il possible d'obtenir LayerDescriptors sans avoir à démarrer un MXD? –

+0

Même question ici. –

+0

Oui, vous avez raison. Cette interface est essentiellement destinée aux MXD qui sont fournis à partir d'un serveur ArcGIS. Ils peuvent également être utilisés, lorsque le MXD est enregistré et en cours de lecture. Cependant, comme vous l'avez découvert, le document de carte doit être sauvegardé, avant que cela puisse être utilisé. –

0

facile. Un effet secondaire de l'utilisation de COM et de la disposition des vtables est que vous pouvez utiliser l'adresse mémoire de la couche elle-même comme identifiant unique. À l'intérieur de la mise en œuvre de nombreux GeoDatabase ESRI et le code Carto lui-même, cette astuce est utilisée partout.

+0

Comment obtenez-vous l'adresse mémoire? Aussi cette adresse change-t-elle pendant qu'ils travaillent dans le mxd ou l'enregistre-t-elle? –

+0

Dépend de la langue. En C++, l'interface * pointeur * lui-même est un pointeur, utilisez-le. En VB6 (ou VBA), la même chose est vraie. En d'autres termes: PLAYER dim comme ILayer set = PLAYER pMap.Layers (0) utilisation PLAYER comme la clé dans votre collection/dictionnaire. Non, il ne changera pas pendant la durée de vie de l'objet COM (alors qu'il fonctionne toujours dans le même MxD). S'ils enregistrent, * et continuent leur session *, ils resteront les mêmes ... cependant, si le document est fermé et l'ouvre à nouveau, alors ce sera différent. – rburhum

1

J'aime l'idée d'utiliser un GUID. Cela peut ensuite être stocké dans la propriété ModelName qui est un outil pour les développeurs d'objets personnalisés à utiliser pour garantir les noms des objets indépendants du vrai nom ou du nom d'alias.

Il y a plus de détails et des exemples de code à http://geographika.co.uk/?p=58