Suite

Activer l'accrochage pour la méthode OnLine du complément ArcPy Python ?

Activer l'accrochage pour la méthode OnLine du complément ArcPy Python ?


Je travaille sur un complément Python à l'aide d'ArcGIS 10.2.2 où l'utilisateur peut tracer des lignes et le complément ajoutera une annotation de dimension indiquant la longueur pour chaque segment de la ligne dessinée. Je peux faire en sorte que cela fonctionne très bien et que le texte soit correctement orienté, mais la méthode OnLine () n'utilise pas l'accrochage dans la carte. Le complément définit cependant correctement l'accrochage (j'ai vérifié la tolérance d'accrochage dans la carte et testé avec différentes tolérances) dans la carte pour tout MAIS la méthode onLine() pour l'outil.

Dans la documentation d'aide d'ArcObjects, il est indiqué que cela est généralement invoqué sur une méthode OnClick à partir de l'interface ICommand. Je ne sais pas comment je pourrais l'utiliser dans un complément Python. Voici ma tentative d'utiliser des comtypes et des modules personnalisés pour invoquer l'accrochage pour mon complément. Malheureusement, cela ne fonctionne pas. Peut-être devrais-je essayer cela en .NET ?

importer arcobjects #custom module from arcobjects importer des éléments #custom module importer arcpy importer pythonaddins importer math importer comtypes.gen.esriControls as esriControls importer comtypes.gen.esriArcMapUI as esriArcMapUI as esriArcMapUI from arcobjects importer CType, NewObj, CLSID #custom def midpoint(point_a, point_b ): x1 = point_a.X y1 = point_a.Y x2 = point_b.X y2 = point_b.Y # Trouver le milieu x = (x1 + x2) / 2.0 y = (y1 + y2) / 2.0 return (x, y) def get_angle(xy1, xy2) : """Calculer l'angle d'azimut à partir de deux points. (Zéro est le nord.)""" # Objets ponctuels ArcPy x1, y1, x2, y2 = xy1.X, xy1.Y, xy2.X, xy2.Y dx, dy = (x2 - x1, y2 - y1) return math.degrees(math.atan2(dy, dx)) classe DrawLine(object): """Implémentation pour AddMeasurementAnno_addin.tool (Tool)""" def __init__(self): self.enabled = True self.shape = 'Line' self.cursor = 3 # arcobjects obtient l'application actuelle (IApplication interface Pointer) self.pApp = arcobjects.GetCurrentApp() self.pDoc = self.pApp. Document self.pMxDoc = CType(self.pDoc, esriArcMapUI.IM XDocument) m_SnappingEnv = newobj (esriControls.Snapping, esriControls.ISnappingEnvironment) m_SnappingEnv.Enabled = true m_SnappingEnv.IgnoreIMSLayers = True m_SnappingEnv.ShowSnapTips = true m_SnappingEnv.ShowSnapTipBackground = True m_SnappingEnv.Tolerance = 10 m_SnappingEnv.SnappingType = esriControls.esriSnappingTypeVertex +  esriControls. esriSnappingTypeEndpoint +  esriControls.esriSnappingTypeEdge print m_SnappingEnv.SnappingType m_Snapper = m_SnappingEnv.PointSnapper m_SnappingFeedback = NewObj(esriControls.SnappingFeedback, esriControls.ISnappingselfFenaedback) : line(esriControls.SnappingFeedback, esriControls.ISnappingselfFenaedback) position de la souris à l'extrémité de la ligne # m_CurrentMouseCoords = self.pMxDoc.CurrentLocation print m_CurrentMouseCoords.X, m_CurrentMouseCoords.Y # boucle à travers geom et récupère les sommets pour une partie dans line_geometry: for i in range(part.count): if i != (part. count - 1) : pt1, pt2 = part.getObject(i), part.getObject(i+1) ligne = arc py.Polyline(arcpy.Array([pt1, pt2])) length = str(round(line.length,1)) + "'" x, y = midpoint(pt1, pt2) elements.add_text(self.pApp, text=length, name="length", size=9, bold=True, x=x, y=y, angle=get_angle(pt1, pt2), view="data")

Voici ce qu'il fait dans ArcMap, mais les distances ne sont pas correctes car la ligne n'a pas été capturée. Sans accrochage, ce complément est plutôt inutile :

Et la fenêtre des options d'accrochage :

Quelqu'un a-t-il réussi à le faire ?


Comme commenté par @JasonScheirer :

Oui, vous devrez peut-être vous pencher sur le développement .Net. Les compléments Python n'étaient pas vraiment conçus pour ce niveau de personnalisation, ils étaient destinés à des fonctionnalités extrêmement simples.


Pour compléter les autres réponses, il semble que l'outil Python Addin dessine un graphique et non un ESQUISSER c'est ce que vous utiliseriez dans .NET. À ma connaissance, lorsque je dessine des graphiques sur une carte, un graphique ne respecte pas l'environnement de capture (je me trompe peut-être?).

En regardant votre capture d'écran, ils semblent être de simples rectangles. Une approche alternative serait de sélectionner le bord et d'extraire ce segment de ligne. Je suppose que vos polygones sont composés de 4 sommets.