#1 Tue 02 March 2010 09:06
- jmz
- Participant actif
- Lieu: Anthon
- Date d'inscription: 5 Sep 2005
- Messages: 142
ArcMap Etiquettes orientées (VBA)
Bonjour,
Je cherche a réaliser sur une couche dans arcMap un étiquetage avec orientation des textes et positionnement relatifs à des champs de ma table. (texte, texte_x, texte_y, text_angle). Le but ultime est de créer un outil en VBA qui va générer les étiquettes, mais avant tout il faut pouvoir le faire dans l'interface arcMap, en effet, les fonctions non accessibles dans arcmap ne le seront pas plus dans VBA.
1. A priori cette fonction ne fait pas partie de la licence de base d'arcGIS mais nécessite d'acheter une licence du moteur d'étiquetage MapLex ! Pouvez-vous me confirmer cela ?
2. N'y a t-il pas possibilité de passer par les classes ITextElement ou IAnnotation directement via VBA pour contourner le problème, positionner les textes et effectuer la rotation ? Et si quelqu'un a déjà réalisé la manipe, je suis preneur ...
Je suis sur ArcGIS 9.3 (sans Maplex)
Cordialement
Julien
Hors ligne
#2 Tue 02 March 2010 17:21
- Nicolas Granier
- Participant assidu
- Date d'inscription: 19 Apr 2007
- Messages: 271
Re: ArcMap Etiquettes orientées (VBA)
Bonjour,
Effectivement je ne pense pas que l'on puisse depuis l'interface d'argis réaliser les opérations que vous avez citées.
Mais toutefois je ne suis pas sur que l'utilisation de MapLex vous permette de réaliser exactement ce type d'opération.
Je pense qu'il est plus facile d'étiquetter sur une couche de point invisible qui aurait pour coordonnées (texte_x, texte_y) et pour valeur l'attribut d'une seconde couche accessible par une liaison.
Concernant l'utilisation de VBA, il existe deux objets de base pour la création d'étiquette qui sont :
- LabelEngineLayerProperties et
- MaplexLabelEngineLayerProperties
Le second objet "semble" soumis à la licence dont vous parliez.
mais j'ai fait un test qui donne à réfléchir :
Code:
Public Sub test() MsgBox "1" Dim etiq As IAnnotateLayerProperties Set etiq = New MaplexLabelEngineLayerProperties MsgBox "2" End Sub
et ce code fonctionne ...
A mon sens ( à mettre en guillemets car je n'ai jamais manipulé les étiquettes en VBA), le moteur d'étiquettage MapLex est un outil avec une interface utilisateur qui est payant mais qui n'est pas protégé par une licence. Autrement dit, l'interface est payante, le codage VBA serait libre...
une chose sure : les arcobjets sur le poste sont toujours complets (c'est la licence qui bride l'outil), par exemple appeler un objet en lien avec la topologie (licence ArcEditor) provoqie une erreur due à la licence.
je vous invite donc à essayer en VBA de manipuler directement les classes relatives à MapLex. Les diagrammes Objet model disponibles à l'adresse suivante http://resources.esri.com/help/9.3/arcg … _start.htm.
C'est en vb6 mais le fonctionnement est identique en VBA.
Bon Courage
Hors ligne
#3 Tue 02 March 2010 20:38
- jmz
- Participant actif
- Lieu: Anthon
- Date d'inscription: 5 Sep 2005
- Messages: 142
Re: ArcMap Etiquettes orientées (VBA)
Merci bien pour ces infos !
L'utilisation d'une couche de ponctuels généré sur des couples X,Y est également ma conclusion ...
Si jamais je persiste dans cette voie et trouve le code qui va bien dans le cadre du moteur d'étiquetage 'standard', j'en ferai profiter la communauté.
Cordialement
julien
Hors ligne
#4 Fri 05 March 2010 21:08
- jmz
- Participant actif
- Lieu: Anthon
- Date d'inscription: 5 Sep 2005
- Messages: 142
Re: ArcMap Etiquettes orientées (VBA)
Bonjour,
Pour suite, j'ai trouvé une propriété 'angle' attachée à l'interface de ITextSymbol, et je défini ce symbole comme symbole texte du moteur d'étiquetage standard. Mais peut importe la valeur que je met pour 'angle' mes étiquettes sont toujours posée à plat.
Si je pouvais faire fonctionner cela pour orienter mes labels, je n'ai plus qu'à trouver une astuce pour étiqueter mes objets un par un. Je mets mon code pour que vous y voyiez plus clair ^^
Code:
Dim pflayer As IFeatureLayer Set player = FindLayerByName(pmxmap, list_couches.Value) Set pflayer = player 'QI Dim lpGeoFeatureLayer As IGeoFeatureLayer Set lpGeoFeatureLayer = pflayer 'Get Annotation Properties Collection Dim lpAnnoPropColl As IAnnotateLayerPropertiesCollection Set lpAnnoPropColl = lpGeoFeatureLayer.AnnotationProperties 'Get the Annotate Layer Properties Dim lpAnnoProp As IAnnotateLayerProperties lpAnnoPropColl.QueryItem 0, lpAnnoProp ' .... Dim pAnnoLayerPropsColl As IAnnotateLayerPropertiesCollection Set pAnnoLayerPropsColl = lpGeoFeatureLayer.AnnotationProperties ' then get the (first) property set in the collection Dim pAnnoLayerProps As IAnnotateLayerProperties pAnnoLayerPropsColl.QueryItem 0, pAnnoLayerProps, Nothing, Nothing ' Update LabelEngineLayerProperties Dim pLabelEngineLayerProps2 As ILabelEngineLayerProperties2 Set pLabelEngineLayerProps2 = pAnnoLayerProps ' symbol ITextSymbol utilisé par le moteur Dim lpTextSym As ITextSymbol Set lpTextSym = New TextSymbol Dim lpFont As IFont Set lpFont = New SystemFont lpFont.Name = "Arial" lpFont.Italic = True lpFont.Bold = True lpFont.size = 11 lpTextSym.Angle = 125 lpTextSym.Font = lpFont 'QI Dim lpLabelEngine As ILabelEngineLayerProperties Set lpLabelEngine = lpAnnoProp Set lpLabelEngine.Symbol = lpTextSym 'Set the expression lpLabelEngine.Expression = "[" & list_champs.Value & "]" 'Switch on labels lpGeoFeatureLayer.DisplayAnnotation = True 'Refresh the map pmxdoc.ActiveView.Refresh
J'ai loupé un truc ?? ^^
Cordialement
Julien
Hors ligne
#5 Sat 06 March 2010 18:19
- Nicolas Granier
- Participant assidu
- Date d'inscription: 19 Apr 2007
- Messages: 271
Re: ArcMap Etiquettes orientées (VBA)
Bonjour Julien,
Désolé mais je n'ai pas de réponse. Je pense qu'il s'agit d'un beug d'Arcgis. j'avais constaté que la propriété "angle" était disponible dans l'interface d'Arcgis lors de la définition des étiquettes. j'avais fait un test et le résultat est le même que toi - autrement dit il ne se passe rien.
Donc il n'y a pas d'erreur dans ton code, c'est juste que la propriété angle ne fait rien ou que nous l'utilisons mal
Pas d'explication ....
Nicolas
Hors ligne
#6 Mon 08 March 2010 13:56
- jmz
- Participant actif
- Lieu: Anthon
- Date d'inscription: 5 Sep 2005
- Messages: 142
Re: ArcMap Etiquettes orientées (VBA)
Bonjour,
Merci d'avoir testé ça chez toi.
Finalement j'ai fais une recherche et j'ai trouvé ça sur le site du support ESRI :
http://support.esri.com/index.cfm?fa=kn … mp;d=20360
Il faut passer par un ITextElement, qui s'appuie sur un IPoint d'ancrage, et appliquer une méthode de rotation de la classe ITransform2D après le changement d'interface :
Dim pTwoD As ITransform2D
Set pTwoD = pElem
pTwoD.Rotate pPoint, angle_en_radians
Le pElem correspond au changement d'interface du ITextElement vers un IElement, c'est donc au final un IElement. Attention car l'angle est exprimé en radians, et la rotation s'effectue dans le sens contraire des aiguilles d'une montre (pour ceux qui ont toujours des montres à Aiguille ^^).
Au final, voici le code qui me permet de boucler sur mes entités, d'ajouter un ITextElement pour chaque entité, avec positionnement X,Y et rotation Angle qui sont stockés dans ma table attributaire.
Code:
' etiquetage ' init Dim pmxdoc As IMxDocument Dim pmxmap As IMap Dim penumlayer As IEnumLayer Dim player As ILayer Set pmxdoc = Application.Document Set pmxmap = pmxdoc.FocusMap Dim pfclass As IFeatureClass Dim pflayer As IFeatureLayer Dim pfeat As IFeature Set player = FindLayerByName(pmxmap, list_couches.Value) Set pflayer = player Set pfclass = pflayer.FeatureClass Dim pGraphicsContainer As IGraphicsContainer Dim pActiveView As IActiveView Dim pTextElement As ITextElement Dim pElement As IElement Set pGraphicsContainer = pmxdoc.FocusMap Set pActiveView = pmxdoc.FocusMap ' hop Dim ppoint As IPoint Dim i As Integer For i = 0 To pfclass.FeatureCount(Nothing) - 1 Set pfeat = pfclass.GetFeature(i) Set pTextElement = New TextElement Set pElement = pTextElement pTextElement.Text = pfeat.Value(pfclass.FindField(list_champs.Value)) pTextElement.ScaleText = No ' comment ça marche ? Set ppoint = New Point ppoint.x = pfeat.Value(pfclass.FindField(list_x.Value)) ppoint.y = pfeat.Value(pfclass.FindField(list_y.Value)) pElement.Geometry = ppoint pGraphicsContainer.AddElement pTextElement, 0 Angle = pfeat.Value(pfclass.FindField(list_angle.Value)) Angle_R = 3.1416 * Angle / 180 Dim pTwoD As ITransform2D Set pTwoD = pElement pTwoD.Rotate ppoint, Angle_R Next i ' Refresh the Data Frame pActiveView.PartialRefresh esriViewGraphics, Nothing, Nothing
Je dois encore améliorer le truc, notamment en choisissant de manière interactive une police pour mes textes, et ensuite en convertissant mes textes en couche d'annotations (si c'est possible mais ça devrait se faire).
Et tout ça sans acheter MapLex !! Hoorah ! En tout cas j'espère que ça servira à d'autres ^^
Cordialement
Julien
Dernière modification par Jeirhome (Mon 08 March 2010 13:59)
Hors ligne
#7 Mon 08 March 2010 17:18
- Nicolas Granier
- Participant assidu
- Date d'inscription: 19 Apr 2007
- Messages: 271
Re: ArcMap Etiquettes orientées (VBA)
Bien joué !
Merci pour le suivi
Hors ligne
#8 Fri 12 March 2010 08:49
- jmz
- Participant actif
- Lieu: Anthon
- Date d'inscription: 5 Sep 2005
- Messages: 142
Re: ArcMap Etiquettes orientées (VBA)
Bonjour,
Pour finir, je n'ai pas trouvé la solution qui me permette de transformer mes IElement ou ITextElement en couche d'annotations, cependant, j'ai découvert que dans les propriétés des étiquettes d'ArcGIS, il existe la possibilité d'orienter les labels sur la base d'un champs 'angle' ! Fonction uniquement disponible pour une couche de ponctuels.
Cordialement
Julien
Hors ligne
#9 Fri 12 March 2010 09:27
- crossbones
- Participant actif
- Lieu: Bertreville
- Date d'inscription: 17 Feb 2006
- Messages: 99
Re: ArcMap Etiquettes orientées (VBA)
Merci julien pour le suivi et cette info précieuse (etiquette champ angle sur ponctuel), car j'étais entrain de m'acharner sur mes annotations...
Hors ligne