banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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

 

Pied de page des forums

Powered by FluxBB