Suite

Tracer une ligne dans la vue de mise en page avec ArcObjects

Tracer une ligne dans la vue de mise en page avec ArcObjects


J'essaie de tracer une ligne sur la vue de mise en page sur ArcMap avec C# et ArcObjects. Je travaille sur cet échantillon. Mais j'ai quelques problèmes.

1.) Ce code pour tracer une ligne sur la vue des données, mais je dois tracer une ligne sur la vue de la mise en page (dans le cadre de la boîte). Je veux voir les propriétés de l'élément de ligne lorsque j'ai sélectionné mon élément de ligne.

2.) Lorsque je clique sur cette ligne dans ArcMap, elle devient invisible… pourquoi cela se produit-il ?

Ceci est un exemple de code :

protected override void OnClick() { //dessin d'une polyligne Point p1 = new PointClass(); p1.X = 10 ; p1.Y = 10 ; IPoint p2 = new PointClass(); p2.X = 20 ; p2.Y = 20 ; IPoint p3 = new PointClass(); p3.X = 35 ; p3.Y = 15 ; IPoint p4 = new PointClass(); p4.X = 40 ; p4.Y = 17 ; IPoint p5 = new PointClass(); p5.X = 50 ; p5.Y = 19 ; IPoint p6 = new PointClass(); p6.X = 60 ; p6.Y = 18 ; IPolyline polyline = new PolylineClass(); IPointCollection pointColl = polyline as IPointCollection; pointColl.AjouterPoint(p1) ; pointColl.AjouterPoint(p2) ; pointColl.AjouterPoint(p3) ; pointColl.AjouterPoint(p4) ; pointColl.AjouterPoint(p5) ; pointColl.AjouterPoint(p6) ; IMxDocument mxdoc = ArcMap.Application.Document en tant que IMxDocument ; IActiveView activeView = mxdoc.ActiveView; IScreenDisplay screenDisp = activeView.ScreenDisplay; short screenCache = Convert.ToInt16(esriScreenCache.esriNoScreenCache); screenDisp.StartDrawing(screenDisp.hDC, screenCache); IRgbColor color = new RgbColorClass(); couleur.Rouge = 0; couleur.Bleu = 0; couleur.Vert = 0 ; ISimpleLineSymbol simpleLineSymbol = new SimpleLineSymbolClass(); simpleLineSymbol.Color = couleur; simpleLineSymbol.Width = 1; screenDisp.SetSymbol(simpleLineSymbol as ISymbol); screenDisp.DrawPolyline(polyligne); screenDisp.FinishDrawing(); }

La raison pour laquelle ce code échoue est que vous écrivez dans le cache d'écran, que vous obtenez à partir duvue activeet cela pourrait être lecarteou alorsmise en page; il faut être plus explicite.

Dès qu'il y a une sorte de rafraîchissement d'écran, vous perdez le graphique que vous avez dessiné. Si vous voulez que les graphiques persistent, vous devez être stockage dans le conteneur graphique PageLayout. Le code VBA suivant vous montre comment procéder à l'aide de vos exemples de points.

Public Sub drawline() ' Créer une polyligne Dim p1 As IPoint Set p1 = New Point p1.X = 10 p1.Y = 10 Dim p2 As IPoint Set p2 = New Point p2.X = 20 p2.Y = 20 Dim p3 As IPoint Set p3 = Nouveau Point p3.X = 30 p3.Y = 15 Dim p4 Comme IPoint Set p4 = Nouveau Point p4.X = 40 p4.Y = 15 Dim p5 Comme IPoint Set p5 = Nouveau Point p5.X = 50 p5 .Y = 19 Dim p6 As IPoint Set p6 = New Point p6.X = 60 p6.Y = 18 Dim pPolyline As IPolyline Set pPolyline = New Polyline Dim pPointColl As IPointCollection Set pPointColl = pPolyline pPointColl.AddPoint p1 pPointColl.AddPoint p2 pPointColl. AddPoint p3 pPointColl.AddPoint p4 pPointColl.AddPoint p5 pPointColl.AddPoint p6 ' Créer une couleur Dim pColour As IRgbColor Set pColour = New RgbColor With pColour .Red = 0 .Blue = 0 .Green = 0 End With ' Créer un symbole de ligne Dim pSimpleLineSymbol As ISimpleLineSymbol Set pSimpleLineSymbol = New SimpleLineSymbol With pSimpleLineSymbol .Width = 1 .Style = esriSLSSolid .Color = pColour End With ' Créer un élément de ligne, c'est le graphique qui w ill sera ajouté au conteneur Dim pElement As IElement Set pElement = New LineElement pElement.Geometry = pPolyline Dim pLineElement As ILineElement Set pLineElement = pElement pLineElement.Symbol = pSimpleLineSymbol ' Get the MXD Dim pMXD As IMxDocument Set a pMXD' la mise en page Dim pPageLayout As IPageLayout Set pPageLayout = pMXD.PageLayout ' Récupère le conteneur graphique du PAGELAYOUT Dim pGraphicsContainer As IGraphicsContainer Set pGraphicsContainer = pPageLayout ' Ajouter un élément et actualiser pGraphicsContainer.AddElement pElement, 0 Dim pActiveView Rafraîchir la fin de l'abonnement

Remarque : les coordonnées sont interprétées comme des coordonnées de page, et non comme géographiques, de sorte que la ligne créée est beaucoup plus grande que votre page.


c'est le code c# pour votre solution :

protected override void OnClick() { //Créer une polyligne Point p1 = new PointClass(); p1.X = 10 ; p1.Y = 10 ; IPoint p2 = new PointClass(); p2.X = 20 ; p2.Y = 20 ; IPoint p3 = new PointClass(); p3.X = 35 ; p3.Y = 15 ; IPoint p4 = new PointClass(); p4.X = 40 ; p4.Y = 17 ; IPoint p5 = new PointClass(); p5.X = 50 ; p5.Y = 19 ; IPoint p6 = new PointClass(); p6.X = 60 ; p6.Y = 18 ; IPolyline polyline = new PolylineClass(); IPointCollection pointColl = polyline as IPointCollection; pointColl.AjouterPoint(p1) ; pointColl.AjouterPoint(p2) ; pointColl.AjouterPoint(p3) ; pointColl.AjouterPoint(p4) ; pointColl.AjouterPoint(p5) ; pointColl.AjouterPoint(p6) ; // Crée une couleur IRgbColor color = new RgbColorClass(); couleur.Rouge = 0; couleur.Bleu = 0; couleur.Vert = 0 ; // Crée un symbole de ligne ISimpleLineSymbol simpleLineSymbol = new SimpleLineSymbolClass(); simpleLineSymbol.Color = couleur; simpleLineSymbol.Width = 1; // Créer un élément de ligne, c'est le graphique qui sera ajouté au conteneur IElement element = new LineElement(); element.Geometry = polyligne; ILineElement lineElement; lineElement = élément comme ILineElement; lineElement.Symbol = simpleLineSymbol; // Obtenir le Mxd IMxDocument mxdoc = ArcMap.Application.Document as IMxDocument; // Récupère le handle sur la mise en page IPageLayout pageLayout = new PageLayout(); pageLayout = mxdoc.PageLayout; // Récupère le conteneur graphique du PageLayout IGraphicsContainer graphicsContainer = pageLayout as IGraphicsContainer; // Ajout d'un élément et actualisation graphicsContainer.AddElement(element, 0); IActiveView activeView = pageLayout as IActiveView; activeView.Refresh(); }

Voir la vidéo: ArcGis 3d analyst Draping an image over a terrain surface