Reference layout project items and their associated layout
//Reference layout project items and their associated layout.//A layout project item is an item that appears in the Layouts//folder in the Catalog pane.//Reference all the layout project itemsIEnumerable<LayoutProjectItem>layouts=
Project.Current.GetItems<LayoutProjectItem>();//Or reference a specific layout project item by nameLayoutProjectItemlayoutItem= Project.Current.GetItems<LayoutProjectItem>().FirstOrDefault(item => item.Name.Equals("MyLayout"));
Open a layout project item in a new view
//Open a layout project item in a new view.//A layout project item may exist but it may not be open in a view. //Reference a layout project item by nameLayoutProjectItemsomeLytItem= Project.Current.GetItems<LayoutProjectItem>().FirstOrDefault(item => item.Name.Equals("MyLayout"));//Get the layout associated with the layout project itemLayoutlayout=await QueuedTask.Run(()=> someLytItem.GetLayout());//Worker thread//Create the new pane - call on UIILayoutPaneiNewLayoutPane=await ProApp.Panes.CreateLayoutPaneAsync(layout);//GUI thread
Activate an already open layout view
//Activate an already open layout view.//A layout view may be open but it may not be active.//Find the pane that references the layout and activate it. //Note - there can be multiple panes referencing the same layout.foreach(var pane in ProApp.Panes){varlayoutPane= pane as ILayoutPane;if(layoutPane==null)//if not a layout view, continue to the next panecontinue;if(layoutPane.LayoutView.Layout ==layout)//activate the view{(layoutPane as Pane).Activate();return;}}
Reference the active layout view
//Reference the active layout view.//Confirm if the current, active view is a layout view.//If it is, do something.LayoutViewactiveLayoutView= LayoutView.Active;if(activeLayoutView!=null){// do something}
Import a pagx into a project
//Import a pagx into a project.//Create a layout project item from importing a pagx fileawait QueuedTask.Run(()=>{IProjectItempagx= ItemFactory.Instance.Create(@"C:\Temp\Layout.pagx")as IProjectItem; Project.Current.AddItem(pagx);});
Remove a layout project item
//Remove a layout project item.//Remove the layout fro the projectawait QueuedTask.Run(()=> Project.Current.RemoveItem(layoutItem));
Create a new, basic layout and open it
//Create a new, basic layout and open it.//Create layout with minimum set of parameters on the worker threadLayoutlyt=await QueuedTask.Run(()=>{varnewLayout= LayoutFactory.Instance.CreateLayout(8.5,11, LinearUnit.Inches); newLayout.SetName("New 8.5x11 Layout");returnnewLayout;});//Open new layout on the GUI threadawait ProApp.Panes.CreateLayoutPaneAsync(lyt);
Create a new layout using a modified CIM and open it
//Create a new layout using a modified CIM and open it.//The CIM exposes additional members that may not be//available through the managed API. //In this example, optional guides are added.//Create a new CIMLayout on the worker threadLayoutnewCIMLayout=await QueuedTask.Run(()=>{//Set up a CIM pageCIMPagenewPage=new CIMPage{//required parametersWidth=8.5,Height=11,Units= LinearUnit.Inches,//optional rulersShowRulers=true,SmallestRulerDivision=0.5,//optional guidesShowGuides=true};CIMGuideguide1=new CIMGuide{Position=1,Orientation= Orientation.Vertical};CIMGuideguide2=new CIMGuide{Position=6.5,Orientation= Orientation.Vertical};CIMGuideguide3=new CIMGuide{Position=1,Orientation= Orientation.Horizontal};CIMGuideguide4=new CIMGuide{Position=10,Orientation= Orientation.Horizontal};List<CIMGuide>guideList=newList<CIMGuide>{ guide1, guide2, guide3, guide4}; newPage.Guides = guideList.ToArray();//Construct the new layout using the customized cim definitionsvarlayout_local= LayoutFactory.Instance.CreateLayout(newPage); layout_local.SetName("New 8.5x11 Layout");returnlayout_local;});//Open new layout on the GUI threadawait ProApp.Panes.CreateLayoutPaneAsync(newCIMLayout);
Change the layout page size
//Change the layout page size.//Reference the layout project itemLayoutProjectItemlytItem= Project.Current.GetItems<LayoutProjectItem>().FirstOrDefault(item => item.Name.Equals("MyLayout"));if(layoutItem!=null){await QueuedTask.Run(()=>{//Get the layoutLayoutlyt= lytItem.GetLayout();if(lyt!=null){//Change propertiesCIMPagepage= lyt.GetPage(); page.Width =8.5; page.Height =11;//Apply the changes to the layout lyt.SetPage(page);}});}
ProSnippet Group CIM Graphics and GraphicFactory
Create Circle Graphic
//Must be on QueuedTask.Run(() => { ...//Build geometryCoordinate2Dcenter=new Coordinate2D(2,4);EllipticArcSegmentcircle_seg= EllipticArcBuilderEx.CreateCircle(new Coordinate2D(2,4),0.5, ArcOrientation.ArcClockwise,null);varcircle_poly= PolygonBuilderEx.CreatePolygon(PolylineBuilderEx.CreatePolyline(circle_seg));//PolylineBuilderEx.CreatePolyline(cir, AttributeFlags.AllAttributes));//Set symbology, create and add element to layoutCIMStrokeoutline= SymbolFactory.Instance.ConstructStroke(
ColorFactory.Instance.BlackRGB,2.0, SimpleLineStyle.Dash);CIMPolygonSymbolcircleSym= SymbolFactory.Instance.ConstructPolygonSymbol(
ColorFactory.Instance.RedRGB, SimpleFillStyle.Solid, outline);
SymbolFactory.Instance.ConstructPolygonSymbol(null,
SymbolFactory.Instance.ConstructStroke(ColorFactory.Instance.RedRGB,2));varcircleGraphic= GraphicFactory.Instance.CreateSimpleGraphic(circle_poly, circleSym);//Make an element to add to GraphicsLayer or Layout//var elemInfo = new ElementInfo() { Anchor = Anchor.CenterPoint };//GraphicElement cirElm = ElementFactory.Instance.CreateGraphicElement(// container, circleGraphic, "New Circle", true, elemInfo);
Create Circle Text Graphic
//Must be on QueuedTask.Run(() => { ...//Build geometryCoordinate2Dcenter=new Coordinate2D(4.5,4);vareabCir=new EllipticArcBuilderEx(center,0.5, ArcOrientation.ArcClockwise);varcir= eabCir.ToSegment();varpoly= PolygonBuilderEx.CreatePolygon(
PolylineBuilderEx.CreatePolyline(cir, AttributeFlags.AllAttributes));//Set symbology, create and add element to layoutCIMTextSymbolsym= SymbolFactory.Instance.ConstructTextSymbol(
ColorFactory.Instance.GreenRGB,10,"Arial","Regular");stringtext="Circle, circle, circle";vargraphic= GraphicFactory.Instance.CreateSimpleTextGraphic(
TextType.CircleParagraph, poly, sym, text);//Make an element to add to GraphicsLayer or Layout//var ge = ElementFactory.Instance.CreateGraphicElement(container, graphic,// "New Circle Text", true);
Create Bezier Graphic
//Must be on QueuedTask.Run(() => { ...//Build geometryCoordinate2Dpt1=new Coordinate2D(3.5,7.5);Coordinate2Dpt2=new Coordinate2D(4.16,8);Coordinate2Dpt3=new Coordinate2D(4.83,7.1);Coordinate2Dpt4=new Coordinate2D(5.5,7.5);varbez=new CubicBezierBuilderEx(pt1, pt2, pt3, pt4);varbezSeg= bez.ToSegment();PolylinebezPl= PolylineBuilderEx.CreatePolyline(bezSeg, AttributeFlags.AllAttributes);//Set symbology, create and add element to layoutCIMTextSymbolsym= SymbolFactory.Instance.ConstructTextSymbol(
ColorFactory.Instance.BlackRGB,24,"Comic Sans MS","Regular");vargraphic= GraphicFactory.Instance.CreateSimpleTextGraphic(
TextType.SplinedText, bezPl, sym,"Splined text");//Make an element to add to GraphicsLayer or Layout//var ge = ElementFactory.Instance.CreateGraphicElement(container, graphic);
Create Legend Patch Graphic
//Must be on QueuedTask.Run(() => { ...//Build geometryList<Coordinate2D>plyCoords=newList<Coordinate2D>();
plyCoords.Add(new Coordinate2D(1,1));
plyCoords.Add(new Coordinate2D(1.25,2));
plyCoords.Add(new Coordinate2D(1.5,1.1));
plyCoords.Add(new Coordinate2D(1.75,2));
plyCoords.Add(new Coordinate2D(2,1.1));
plyCoords.Add(new Coordinate2D(2.25,2));
plyCoords.Add(new Coordinate2D(2.5,1.1));
plyCoords.Add(new Coordinate2D(2.75,2));
plyCoords.Add(new Coordinate2D(3,1));Polygonpoly= PolygonBuilderEx.CreatePolygon(plyCoords);//Set symbology, create and add element to layoutCIMStrokeoutline= SymbolFactory.Instance.ConstructStroke(
ColorFactory.Instance.BlackRGB,2.0, SimpleLineStyle.Solid);CIMPolygonSymbolpolySym= SymbolFactory.Instance.ConstructPolygonSymbol(
ColorFactory.Instance.RedRGB, SimpleFillStyle.ForwardDiagonal, outline);vargraphic= GraphicFactory.Instance.CreateLegendPatchGraphic(
PatchShape.AreaBoundary, poly.Extent, polySym);//Make an element to add to GraphicsLayer or Layout////var elemInfo = new ElementInfo()//{// CustomProperties = null,// Anchor = Anchor.LeftMidPoint//};//var ge = ElementFactory.Instance.CreateGraphicElement(container, graphic,// "New Legend Patch", true, elemInfo);
Create Arrow Graphic
//Must be on QueuedTask.Run(() => { ...//Build geometryList<Coordinate2D>plCoords=newList<Coordinate2D>();
plCoords.Add(new Coordinate2D(1,8.5));
plCoords.Add(new Coordinate2D(1.66,9));
plCoords.Add(new Coordinate2D(2.33,8.1));
plCoords.Add(new Coordinate2D(3,8.5));PolylinelinePl= PolylineBuilderEx.CreatePolyline(plCoords);//Set up the arrow infovararrowInfo=new ArrowInfo(){ArrowHeadKey= ArrowInfo.DefaultArrowHeadKeys[1],ArrowOnBothEnds=true,ArrowSizePoints=30,LineWidthPoints=15};vargraphic= GraphicFactory.Instance.CreateArrowGraphic(linePl, arrowInfo);//Make an element to add to GraphicsLayer or Layout//var ge = ElementFactory.Instance.CreateGraphicElement(// container, graphic, "Arrow Line", false);
Create Picture Graphic
//Must be on QueuedTask.Run(() => { ...//Build geometryCoordinate2Dll=new Coordinate2D(3.5,1);Coordinate2Dur=new Coordinate2D(5.5,2);Envelopeenv= EnvelopeBuilderEx.CreateEnvelope(ll, ur);//Create and add element to layout//string picPath = ApplicationUtilities.BASEPATH + _settings.baseFolder + "irefusetowatchthismovi�.jpg";vargraphic= GraphicFactory.Instance.CreatePictureGraphic(env.Center, picPath);//Make an element to add to GraphicsLayer or Layout//var ge = ElementFactory.Instance.CreateGraphicElement(layout, graphic);
Get Graphic Outline
//given a graphic, extract its outline geometryvargraphic_outline= GraphicFactory.Instance.GetGraphicOutline(
layout, cim_graphic);//TODO - use the geometry - eg, make another graphicvaroutline_graphic= GraphicFactory.Instance.CreateSimpleGraphic(graphic_outline);//... etc.
Get Graphic Outline from Graphic Element
//given a graphic, extract its outline geometryvargraphic_elem= layout.GetElementsAsFlattenedList().OfType<GraphicElement>()?.FirstOrDefault();if(graphic_elem!=null)//can be point, line, poly, or textreturn;varoutline= GraphicFactory.Instance.GetGraphicOutline(
layout, graphic_elem.GetGraphic());//create an element using the outlinevarelem= ElementFactory.Instance.CreateGraphicElement(
layout, outline);//... etc.
Create Layout Graphic Elements
Create Ellipse Graphic Element
//Must be on QueuedTask.Run(() => { ...//Build geometryCoordinate2Dcenter=new Coordinate2D(2,2.75);vareabElp=new EllipticArcBuilderEx(center,0,1,0.45,
ArcOrientation.ArcClockwise);varellipse= eabElp.ToSegment();//Set symbology, create and add element to layoutCIMStrokeoutline= SymbolFactory.Instance.ConstructStroke(
ColorFactory.Instance.GreenRGB,2.0,
SimpleLineStyle.Dot);CIMPolygonSymbolellipseSym= SymbolFactory.Instance.ConstructPolygonSymbol(
ColorFactory.Instance.GreyRGB, SimpleFillStyle.Vertical,
outline);varpoly= PolygonBuilderEx.CreatePolygon(
PolylineBuilderEx.CreatePolyline(ellipse, AttributeFlags.AllAttributes));varelpElm= ElementFactory.Instance.CreateGraphicElement(
container, poly, ellipseSym,"New Ellipse");
Create Lasso Line, Freehand Graphic Element
//Must be on QueuedTask.Run(() => { ...//Build geometryList<Coordinate2D>plCoords=newList<Coordinate2D>();
plCoords.Add(new Coordinate2D(1.5,10.5));
plCoords.Add(new Coordinate2D(1.25,9.5));
plCoords.Add(new Coordinate2D(1,10.5));
plCoords.Add(new Coordinate2D(0.75,9.5));
plCoords.Add(new Coordinate2D(0.5,10.5));
plCoords.Add(new Coordinate2D(0.5,1));
plCoords.Add(new Coordinate2D(0.75,2));
plCoords.Add(new Coordinate2D(1,1));PolylinelinePl= PolylineBuilderEx.CreatePolyline(plCoords);//Set symbology, create and add element to layoutCIMLineSymbollineSym= SymbolFactory.Instance.ConstructLineSymbol(
ColorFactory.Instance.BlackRGB,2.0, SimpleLineStyle.Solid);//var graphic = GraphicFactory.Instance.CreateShapeGraphic(linePl, lineSym);varge= ElementFactory.Instance.CreateGraphicElement(
container, linePl, lineSym,"New Freehand");
Create Lasso Polygon, Freehand Element
//Must be on QueuedTask.Run(() => { ...List<Coordinate2D>plyCoords=newList<Coordinate2D>();
plyCoords.Add(new Coordinate2D(1,1));
plyCoords.Add(new Coordinate2D(1.25,2));
plyCoords.Add(new Coordinate2D(1.5,1.1));
plyCoords.Add(new Coordinate2D(1.75,2));
plyCoords.Add(new Coordinate2D(2,1.1));
plyCoords.Add(new Coordinate2D(2.25,2));
plyCoords.Add(new Coordinate2D(2.5,1.1));
plyCoords.Add(new Coordinate2D(2.75,2));
plyCoords.Add(new Coordinate2D(3,1));Polygonpoly= PolygonBuilderEx.CreatePolygon(plyCoords);//Set symbology, create and add element to layoutCIMStrokeoutline= SymbolFactory.Instance.ConstructStroke(
ColorFactory.Instance.BlackRGB,2.0, SimpleLineStyle.Solid);CIMPolygonSymbolpolySym= SymbolFactory.Instance.ConstructPolygonSymbol(
ColorFactory.Instance.RedRGB, SimpleFillStyle.ForwardDiagonal, outline);
ElementFactory.Instance.CreateGraphicElement(
container, poly, polySym,"New Lasso");
Create Line Element
//Must be on QueuedTask.Run(() => { ...//Build geometryList<Coordinate2D>plCoords=newList<Coordinate2D>();
plCoords.Add(new Coordinate2D(1,8.5));
plCoords.Add(new Coordinate2D(1.66,9));
plCoords.Add(new Coordinate2D(2.33,8.1));
plCoords.Add(new Coordinate2D(3,8.5));PolylinelinePl= PolylineBuilderEx.CreatePolyline(plCoords);//Reference a line symbol in a stylevarProjectStyles= Project.Current.GetItems<StyleProjectItem>();StyleProjectItemstyle= ProjectStyles.First(x => x.Name =="ArcGIS 2D");varsymStyle= style.SearchSymbols(StyleItemType.LineSymbol,"Line with 2 Markers")[0];CIMLineSymbollineSym= symStyle.Symbol as CIMLineSymbol;
lineSym.SetSize(20);//Set symbology, create and add element to layout//CIMLineSymbol lineSym = SymbolFactory.Instance.ConstructLineSymbol(ColorFactory.Instance.BlueRGB, 4.0, SimpleLineStyle.Solid);
ElementFactory.Instance.CreateGraphicElement(
container, linePl, lineSym,"New Line");
Create Point Element
//Must be on QueuedTask.Run(() => { ...//Build geometryCoordinate2Dcoord2D=new Coordinate2D(2.0,10.0);//Reference a point symbol in a styleStyleProjectItemstylePrjItm= Project.Current.GetItems<StyleProjectItem>().FirstOrDefault(item => item.Name =="ArcGIS 2D");SymbolStyleItemsymStyleItm= stylePrjItm.SearchSymbols(
StyleItemType.PointSymbol,"City Hall")[0];CIMPointSymbolpointSym= symStyleItm.Symbol as CIMPointSymbol;
pointSym.SetSize(50);varelemInfo=new ElementInfo(){CustomProperties=newList<CIMStringMap>(){new CIMStringMap(){Key="Key1",Value="Value1"},new CIMStringMap(){Key="Key2",Value="Value2"}},Anchor= Anchor.TopRightCorner,Rotation=45.0};vargraphic= GraphicFactory.Instance.CreateSimpleGraphic(
coord2D.ToMapPoint(), pointSym);
ElementFactory.Instance.CreateGraphicElement(
container, graphic,"New Point",true, elemInfo);
Create Polygon Element
//Must be on QueuedTask.Run(() => { ...//Build geometryList<Coordinate2D>plyCoords=newList<Coordinate2D>();
plyCoords.Add(new Coordinate2D(1,7));
plyCoords.Add(new Coordinate2D(2,7));
plyCoords.Add(new Coordinate2D(2,6.7));
plyCoords.Add(new Coordinate2D(3,6.7));
plyCoords.Add(new Coordinate2D(3,6.1));
plyCoords.Add(new Coordinate2D(1,6.1));Polygonpoly= PolygonBuilderEx.CreatePolygon(plyCoords);//Set symbology, create and add element to layoutCIMStrokeoutline= SymbolFactory.Instance.ConstructStroke(
ColorFactory.Instance.BlueRGB,2.0, SimpleLineStyle.DashDotDot);CIMPolygonSymbolpolySym= SymbolFactory.Instance.ConstructPolygonSymbol(
ColorFactory.Instance.RedRGB, SimpleFillStyle.ForwardDiagonal, outline);
ElementFactory.Instance.CreateGraphicElement(
container, poly, polySym,"New Polygon",false);
Create Rectangle Element
//Must be on QueuedTask.Run(() => { ...//Build geometryCoordinate2Dll=new Coordinate2D(1.0,4.75);Coordinate2Dur=new Coordinate2D(3.0,5.75);Envelopeenv= EnvelopeBuilderEx.CreateEnvelope(ll, ur);//Set symbology, create and add element to layoutCIMStrokeoutline= SymbolFactory.Instance.ConstructStroke(
ColorFactory.Instance.BlackRGB,5.0, SimpleLineStyle.Solid);CIMPolygonSymbolpolySym= SymbolFactory.Instance.ConstructPolygonSymbol(
ColorFactory.Instance.GreenRGB, SimpleFillStyle.DiagonalCross, outline);varge= GraphicFactory.Instance.CreateSimpleGraphic(env, polySym);varelemInfo=new ElementInfo(){Anchor= Anchor.CenterPoint,Rotation=45.0,CornerRounding=5.0};
ElementFactory.Instance.CreateGraphicElement(
container, env, polySym,"New Rectangle",false, elemInfo);
Create Bezier Curve Element
//Must be on QueuedTask.Run(() => { ...//Build geometryCoordinate2Dpt1=new Coordinate2D(1,7.5);Coordinate2Dpt2=new Coordinate2D(1.66,8);Coordinate2Dpt3=new Coordinate2D(2.33,7.1);Coordinate2Dpt4=new Coordinate2D(3,7.5);varbez=new CubicBezierBuilderEx(pt1, pt2, pt3, pt4);varbezSeg= bez.ToSegment();PolylinebezPl= PolylineBuilderEx.CreatePolyline(bezSeg, AttributeFlags.AllAttributes);//Set symbology, create and add element to layoutCIMLineSymbollineSym= SymbolFactory.Instance.ConstructLineSymbol(
ColorFactory.Instance.RedRGB,4.0, SimpleLineStyle.DashDot);
ElementFactory.Instance.CreateGraphicElement(container, bezPl, lineSym,"New Bezier");
//on the QueuedTask//Place symbol on the layout//At 2.x - MapPoint location = MapPointBuilder.CreateMapPoint(// new Coordinate2D(9, 1));MapPointlocation= MapPointBuilderEx.CreateMapPoint(new Coordinate2D(9,1));//specify a symbolvarpt_symbol= SymbolFactory.Instance.ConstructPointSymbol(
ColorFactory.Instance.GreenRGB);//create a CIMGraphic vargraphic=new CIMPointGraphic(){Symbol= pt_symbol.MakeSymbolReference(),Location=location//center of map};//Or use GraphicFactoryvargraphic2= GraphicFactory.Instance.CreateSimpleGraphic(location, pt_symbol);//At 2.x - LayoutElementFactory.Instance.CreateGraphicElement(layout, graphic);
ElementFactory.Instance.CreateGraphicElement(container, graphic);
ElementFactory.Instance.CreateGraphicElement(container, graphic2);
Create Graphic Element using CIMSymbol
//Must be on QueuedTask.Run(() => { ...//Place symbol on the layout//At 2.x - MapPoint location = MapPointBuilder.CreateMapPoint(// new Coordinate2D(9, 1));MapPointlocation= MapPointBuilderEx.CreateMapPoint(new Coordinate2D(9,1));//specify a symbolvarpt_symbol= SymbolFactory.Instance.ConstructPointSymbol(
ColorFactory.Instance.GreenRGB);//At 2.x -// LayoutElementFactory.Instance.CreateGraphicElement(// layout, location, pt_symbol);
ElementFactory.Instance.CreateGraphicElement(container, location, pt_symbol);
Bulk Element creation
//Must be on QueuedTask.Run(() => { ...//List of Point graphicsvarlistGraphics=newList<CIMPointGraphic>();varlistGraphics2=newList<CIMPointGraphic>();//SymbolvarpointSymbol= SymbolFactory.Instance.ConstructPointSymbol(
ColorFactory.Instance.BlackRGB);//Define size of the arrayintdx=5;intdy=5;MapPointpoint=null;//Create the List of graphics for the arrayfor(introw=0;row <= dx;++row){for(intcol=0;col <= dy;++col){//At 2.x - point = MapPointBuilder.CreateMapPoint(col, row);point= MapPointBuilderEx.CreateMapPoint(col, row);//create a CIMGraphic vargraphic=new CIMPointGraphic(){Symbol= pointSymbol.MakeSymbolReference(),Location=point};
listGraphics.Add(graphic);//Or use GraphicFactoryvargraphic2= GraphicFactory.Instance.CreateSimpleGraphic(
point, pointSymbol)as CIMPointGraphic;
listGraphics2.Add(graphic2);}}//Draw the array of graphics//At 2.x - var bulkgraphics =// LayoutElementFactory.Instance.CreateGraphicElements(// layout, listGraphics, null);varbulkgraphics= ElementFactory.Instance.CreateGraphicElements(
container, listGraphics);varbulkgraphics2= ElementFactory.Instance.CreateGraphicElements(
container, listGraphics2);
Create Element using a CIMGraphicElement
//Must be on QueuedTask.Run(() => { ...//Place symbol on the layout//At 2.x - MapPoint point = MapPointBuilder.CreateMapPoint(new Coordinate2D(9, 1));MapPointpoint= MapPointBuilderEx.CreateMapPoint(new Coordinate2D(9,1));//specify a symbolvarpt_symbol= SymbolFactory.Instance.ConstructPointSymbol(
ColorFactory.Instance.GreenRGB);//create a CIMGraphic vargraphic=new CIMGraphicElement(){Graphic=new CIMPointGraphic(){Symbol= pt_symbol.MakeSymbolReference(),Location=point//A point in the layout}};//At 2.x - LayoutElementFactory.Instance.CreateElement(layout, graphic);
ElementFactory.Instance.CreateElement(container, graphic);
Create point graphic with symbology
//Create a simple 2D point graphic and apply an existing point style item as the symbology.//Construct on the worker threadawait QueuedTask.Run(()=>{//Build 2D point geometry Coordinate2Dcoord2D=new Coordinate2D(2.0,10.0);//(optionally) Reference a point symbol in a styleStyleProjectItemptStylePrjItm= Project.Current.GetItems<StyleProjectItem>().FirstOrDefault(item => item.Name =="ArcGIS 2D");SymbolStyleItemptSymStyleItm= ptStylePrjItm.SearchSymbols( StyleItemType.PointSymbol,"City Hall")[0];CIMPointSymbolpointSym= ptSymStyleItm.Symbol as CIMPointSymbol; pointSym.SetSize(50);//Set symbology, create and add element to layout//An alternative simple symbol is also commented out below.//This would eliminate the four optional lines of code above that//reference a style.//CIMPointSymbol pointSym = SymbolFactory.Instance.ConstructPointSymbol(// ColorFactory.Instance.RedRGB, 25.0, SimpleMarkerStyle.Star); //At 2.x - GraphicElement ptElm =// LayoutElementFactory.Instance.CreatePointGraphicElement(// layout, coord2D, pointSym);GraphicElementptElm= ElementFactory.Instance.CreateGraphicElement( container, coord2D.ToMapPoint(), pointSym); ptElm.SetName("New Point");});
Create line graphic with symbology
//Create a simple 2D line graphic and apply an existing line//style item as the symbology.//Construct on the worker threadawait QueuedTask.Run(()=>{//Build 2d line geometryList<Coordinate2D>plCoords=newList<Coordinate2D>(); plCoords.Add(new Coordinate2D(1,8.5)); plCoords.Add(new Coordinate2D(1.66,9)); plCoords.Add(new Coordinate2D(2.33,8.1)); plCoords.Add(new Coordinate2D(3,8.5));//At 2.x - Polyline linePl = PolylineBuilder.CreatePolyline(plCoords);PolylinelinePl= PolylineBuilderEx.CreatePolyline(plCoords);//(optionally) Reference a line symbol in a styleStyleProjectItemlnStylePrjItm= Project.Current.GetItems<StyleProjectItem>().FirstOrDefault(item => item.Name =="ArcGIS 2D");SymbolStyleItemlnSymStyleItm= lnStylePrjItm.SearchSymbols( StyleItemType.LineSymbol,"Line with 2 Markers")[0];CIMLineSymbollineSym= lnSymStyleItm.Symbol as CIMLineSymbol; lineSym.SetSize(20);//Set symbology, create and add element to layout//An alternative simple symbol is also commented out below.//This would eliminate the four optional lines of code above that//reference a style.////CIMLineSymbol lineSym = SymbolFactory.Instance.ConstructLineSymbol(// ColorFactory.Instance.BlueRGB, 4.0, SimpleLineStyle.Solid); //At 2.x - GraphicElement lineElm =// LayoutElementFactory.Instance.CreateLineGraphicElement(// layout, linePl, lineSym);GraphicElementlineElm= ElementFactory.Instance.CreateGraphicElement( container, linePl, lineSym); lineElm.SetName("New Line");});
Create rectangle graphic with simple symbology
//Create a simple 2D rectangle graphic and apply simple fill and//outline symbols.//Construct on the worker threadawait QueuedTask.Run(()=>{//Build 2D envelope geometryCoordinate2Drec_ll=new Coordinate2D(1.0,4.75);Coordinate2Drec_ur=new Coordinate2D(3.0,5.75);//At 2.x - Envelope rec_env = EnvelopeBuilder.CreateEnvelope(rec_ll, rec_ur);Enveloperec_env= EnvelopeBuilderEx.CreateEnvelope(rec_ll, rec_ur);//Set symbology, create and add element to layoutCIMStrokeoutline= SymbolFactory.Instance.ConstructStroke( ColorFactory.Instance.BlackRGB,5.0, SimpleLineStyle.Solid);CIMPolygonSymbolpolySym= SymbolFactory.Instance.ConstructPolygonSymbol( ColorFactory.Instance.GreenRGB, SimpleFillStyle.DiagonalCross, outline);//At 2.x - GraphicElement recElm =// LayoutElementFactory.Instance.CreateRectangleGraphicElement(// layout, rec_env, polySym);// recElm.SetName("New Rectangle");//GraphicElementrecElm= ElementFactory.Instance.CreateGraphicElement( container, rec_env, polySym,"New Rectangle");//Or use Predefined shapeGraphicElementrecElm2= ElementFactory.Instance.CreatePredefinedShapeGraphicElement( container, PredefinedShape.Rectangle, rec_env, polySym,"New Rectangle2");});
Create Text Graphic Elements
Create Point Text Element 1
//Create a simple point text element and assign basic symbology and text settings.//Construct on the worker threadawait QueuedTask.Run(()=>{//Build 2D point geometryCoordinate2Dcoord2D=new Coordinate2D(3.5,10);//Set symbology, create and add element to layoutCIMTextSymbolsym= SymbolFactory.Instance.ConstructTextSymbol( ColorFactory.Instance.RedRGB,32,"Arial","Regular");stringtextString="Point text";//At 2.x - GraphicElement ptTxtElm =// LayoutElementFactory.Instance.CreatePointTextGraphicElement(// layout, coord2D, textString, sym);//ptTxtElm.SetName("New Point Text");//ptTxtElm.SetAnchor(Anchor.CenterPoint);//ptTxtElm.SetX(4.5);//ptTxtElm.SetY(9.5);//ptTxtElm.SetRotation(45);//use ElementInfo to set placement properties during createvarelemInfo=new ElementInfo(){Anchor= Anchor.CenterPoint,Rotation=45};varptTxtElm= ElementFactory.Instance.CreateTextGraphicElement( container, TextType.PointText, coord2D.ToMapPoint(), sym, textString,"New Point Text",true, elemInfo);//Change additional text properties ptTxtElm.SetX(4.5); ptTxtElm.SetY(9.5);});
Create Rectangle Paragraph Text Element 1
//Create rectangle text with background and border symbology. //Construct on the worker threadawait QueuedTask.Run(()=>{//Build 2D polygon geometryList<Coordinate2D>plyCoords=newList<Coordinate2D>(); plyCoords.Add(new Coordinate2D(3.5,7)); plyCoords.Add(new Coordinate2D(4.5,7)); plyCoords.Add(new Coordinate2D(4.5,6.7)); plyCoords.Add(new Coordinate2D(5.5,6.7)); plyCoords.Add(new Coordinate2D(5.5,6.1)); plyCoords.Add(new Coordinate2D(3.5,6.1));//At 2.x - Polygon poly = PolygonBuilder.CreatePolygon(plyCoords);Polygonpoly= PolygonBuilderEx.CreatePolygon(plyCoords);//Set symbology, create and add element to layout//Also notice how formatting tags are using within the text string.CIMTextSymbolsym= SymbolFactory.Instance.ConstructTextSymbol( ColorFactory.Instance.GreyRGB,10,"Arial","Regular");stringtext="Some Text String that is really long and is "+"<BOL>forced to wrap to other lines</BOL> so that "+"we can see the effects."as String;//At 2.x - GraphicElement polyTxtElm =// LayoutElementFactory.Instance.CreatePolygonParagraphGraphicElement(// layout, poly, text, sym);// polyTxtElm.SetName("New Polygon Text");GraphicElementpolyTxtElm= ElementFactory.Instance.CreateTextGraphicElement( container, TextType.RectangleParagraph, poly, sym, text,"Polygon Paragraph");//(Optionally) Modify paragraph border CIMGraphicpolyTxtGra= polyTxtElm.GetGraphic();CIMParagraphTextGraphiccimPolyTxtGra= polyTxtGra as CIMParagraphTextGraphic; cimPolyTxtGra.Frame.BorderSymbol =new CIMSymbolReference(); cimPolyTxtGra.Frame.BorderSymbol.Symbol = SymbolFactory.Instance.ConstructLineSymbol( ColorFactory.Instance.GreyRGB,1.0, SimpleLineStyle.Solid); polyTxtElm.SetGraphic(polyTxtGra);});
Create a Dynamic Point Text Element
//Create a dynamic text element.//Set the string with tags and the locationStringtitle=@"<dyn type = ""page"" property = ""name"" />";Coordinate2DllTitle=new Coordinate2D(6,2.5);//Construct element on worker threadawait QueuedTask.Run(()=>{//Create with default text properties//At 2.x - TextElement titleGraphics =// LayoutElementFactory.Instance.CreatePointTextGraphicElement(// layout, llTitle, null) as TextElement;TextElementtitleGraphics= ElementFactory.Instance.CreateTextGraphicElement( container, TextType.PointText, llTitle.ToMapPoint(),null, title)as TextElement;//Modify the text properties titleGraphics.SetTextProperties(new TextProperties(title,"Arial",24,"Bold"));});
Create Point Text Element 2
//Must be on QueuedTask.Run(() => { ...//Build geometryCoordinate2Dcoord2D=new Coordinate2D(3.5,10);//Set symbology, create and add element to layoutCIMTextSymbolsym= SymbolFactory.Instance.ConstructTextSymbol(
ColorFactory.Instance.RedRGB,32,"Arial","Regular");stringtextString="Point text";varelemInfo=new ElementInfo(){Anchor= Anchor.BottomLeftCorner };GraphicElementptTxtElm= ElementFactory.Instance.CreateTextGraphicElement(
container, TextType.PointText, coord2D.ToMapPoint(), sym, textString,"New Point Text",true, elemInfo);
Create Polygon Paragraph Text Element
//Must be on QueuedTask.Run(() => { ...//Build geometryList<Coordinate2D>plyCoords=newList<Coordinate2D>();
plyCoords.Add(new Coordinate2D(3.5,7));
plyCoords.Add(new Coordinate2D(4.5,7));
plyCoords.Add(new Coordinate2D(4.5,6.7));
plyCoords.Add(new Coordinate2D(5.5,6.7));
plyCoords.Add(new Coordinate2D(5.5,6.1));
plyCoords.Add(new Coordinate2D(3.5,6.1));Polygonpoly= PolygonBuilderEx.CreatePolygon(plyCoords);//Set symbology, create and add element to layoutCIMTextSymbolsym= SymbolFactory.Instance.ConstructTextSymbol(
ColorFactory.Instance.GreyRGB,10,"Arial","Regular");stringtext="Some text string that is really long and "+"<BOL>wraps to other lines</BOL>"+" so that we can see the effects.";varge= ElementFactory.Instance.CreateTextGraphicElement(
container, TextType.PolygonParagraph, poly, sym, text,"New Polygon Text",true);
Create Rectangle Paragraph Text Element 2
//Must be on QueuedTask.Run(() => { ...//Build geometryCoordinate2Dll=new Coordinate2D(3.5,4.75);Coordinate2Dur=new Coordinate2D(5.5,5.75);Envelopeenv= EnvelopeBuilderEx.CreateEnvelope(ll, ur);//Set symbology, create and add element to layoutCIMTextSymbolsym= SymbolFactory.Instance.ConstructTextSymbol(
ColorFactory.Instance.WhiteRGB,10,"Arial","Regular");stringtext="Some text string that is really long and "+"<BOL>wraps to other lines</BOL>"+" so that we can see the effects.";//(Optionally) Modify border and background with 50% transparency //CIMGraphic recTxtGra = recTxtElm.Graphic;//CIMParagraphTextGraphic cimRecTxtGra = recTxtGra as CIMParagraphTextGraphic;//CIMSymbolReference cimRecTxtBorder = cimRecTxtGra.Frame.BorderSymbol;////CIMLineSymbol lineSym = SymbolFactory.Instance.ConstructLineSymbol(// ColorFactory.Instance.BlackRGB, 1.0, SimpleLineStyle.Solid);//cimRecTxtBorder.Symbol = lineSym;////CIMSymbolReference cimRecTxtBkgrd = cimRecTxtGra.Frame.BackgroundSymbol;//CIMPolygonSymbol polySym = SymbolFactory.Instance.ConstructPolygonSymbol(// ColorFactory.Instance.GreyRGB, SimpleFillStyle.Solid);////CIMColor symCol = polySym.GetColor(IElementContainer container);//symCol.SetAlphaValue(50);//cimRecTxtBkgrd.Symbol = polySym;//recTxtElm.SetGraphic(recTxtGra);varge= ElementFactory.Instance.CreateTextGraphicElement(container,
TextType.RectangleParagraph, env, sym, text,"New Rectangle Text");
Create Circle Text Element
//Must be on QueuedTask.Run(() => { ...//Build geometryCoordinate2Dcenter=new Coordinate2D(4.5,4);vareabCir=new EllipticArcBuilderEx(center,0.5, ArcOrientation.ArcClockwise);varcir= eabCir.ToSegment();varpoly= PolygonBuilderEx.CreatePolygon(
PolylineBuilderEx.CreatePolyline(cir, AttributeFlags.AllAttributes));//Set symbology, create and add element to layoutCIMTextSymbolsym= SymbolFactory.Instance.ConstructTextSymbol(
ColorFactory.Instance.GreenRGB,10,"Arial","Regular");stringtext="Circle, circle, circle";GraphicElementcirTxtElm= ElementFactory.Instance.CreateTextGraphicElement(
container, TextType.CircleParagraph, poly, sym, text,"New Circle Text",false);
Create Bezier Text Element
//Must be on QueuedTask.Run(() => { ...//Build geometryCoordinate2Dpt1=new Coordinate2D(3.5,7.5);Coordinate2Dpt2=new Coordinate2D(4.16,8);Coordinate2Dpt3=new Coordinate2D(4.83,7.1);Coordinate2Dpt4=new Coordinate2D(5.5,7.5);varbez=new CubicBezierBuilderEx(pt1, pt2, pt3, pt4);varbezSeg= bez.ToSegment();PolylinebezPl= PolylineBuilderEx.CreatePolyline(bezSeg, AttributeFlags.AllAttributes);//Set symbology, create and add element to layoutCIMTextSymbolsym= SymbolFactory.Instance.ConstructTextSymbol(
ColorFactory.Instance.BlackRGB,24,"Comic Sans MS","Regular");varge= ElementFactory.Instance.CreateTextGraphicElement(
container, TextType.SplinedText, bezPl, sym,"this is the bezier text","New Bezier Text",true,new ElementInfo(){Anchor= Anchor.CenterPoint });
Create Ellipse Text Element
//Must be on QueuedTask.Run(() => { ...//Build geometryCoordinate2Dcenter=new Coordinate2D(4.5,2.75);vareabElp=new EllipticArcBuilderEx(center,0,1,0.45, ArcOrientation.ArcClockwise);varellipse= eabElp.ToSegment();varpoly= PolygonBuilderEx.CreatePolygon(
PolylineBuilderEx.CreatePolyline(ellipse, AttributeFlags.AllAttributes));//Set symbology, create and add element to layoutCIMTextSymbolsym= SymbolFactory.Instance.ConstructTextSymbol(
ColorFactory.Instance.BlueRGB,10,"Arial","Regular");stringtext="Ellipse, ellipse, ellipse";GraphicElementge= ElementFactory.Instance.CreateTextGraphicElement(
container, TextType.PolygonParagraph, poly, sym, text,"New Ellipse Text",false);
//Must be on QueuedTask.Run(() => { ...//Build geometryCoordinate2Dcenter=new Coordinate2D(2,2.75);vareabElp=new EllipticArcBuilderEx(
center,0,1,0.45, ArcOrientation.ArcClockwise);varellipse= eabElp.ToSegment();//Set symbology, create and add element to layoutCIMStrokeoutline= SymbolFactory.Instance.ConstructStroke(
ColorFactory.Instance.GreenRGB,2.0, SimpleLineStyle.Dot);CIMPolygonSymbolellipseSym= SymbolFactory.Instance.ConstructPolygonSymbol(
ColorFactory.Instance.GreyRGB, SimpleFillStyle.Vertical, outline);varpoly= PolygonBuilderEx.CreatePolygon(
PolylineBuilderEx.CreatePolyline(ellipse, AttributeFlags.AllAttributes));varge= ElementFactory.Instance.CreatePredefinedShapeGraphicElement(
container, PredefinedShape.Ellipse, poly.Extent.Center,0,0, ellipseSym,"New Ellipse2",false,new ElementInfo(){Anchor= Anchor.TopRightCorner });
Create Line Arrow Element
//Must be on QueuedTask.Run(() => { ...//Build geometryList<Coordinate2D>plCoords=newList<Coordinate2D>();
plCoords.Add(new Coordinate2D(1,8.5));
plCoords.Add(new Coordinate2D(1.66,9));
plCoords.Add(new Coordinate2D(2.33,8.1));
plCoords.Add(new Coordinate2D(3,8.5));PolylinelinePl= PolylineBuilderEx.CreatePolyline(plCoords);vararrowInfo=new ArrowInfo(){ArrowHeadKey= ArrowInfo.DefaultArrowHeadKeys[8],ArrowOnBothEnds=true,ArrowSizePoints=24,LineWidthPoints=12};//Create and add element to layoutGraphicElementlineElm= ElementFactory.Instance.CreateArrowGraphicElement(
container, linePl, arrowInfo,"Arrow Line",true,new ElementInfo(){Rotation=15.0});//lineElm.SetName("New Line");
Picture Elements
Create Picture Graphic Element using CIMSymbol
//Must be on QueuedTask.Run(() => { ...//Build geometryCoordinate2Dll=new Coordinate2D(0.5,1);Coordinate2Dur=new Coordinate2D(2.5,2);Envelopeenv= EnvelopeBuilderEx.CreateEnvelope(ll, ur);//Create and add element to layout//string picPath = ApplicationUtilities.BASEPATH + _settings.baseFolder + "irefusetowatchthismovi�.jpg";varpic_gr= ElementFactory.Instance.CreatePictureGraphicElement(
layout, env.Center, picPath,"New Picture",true,new ElementInfo(){Anchor= Anchor.CenterPoint });
Create a new picture element with advanced symbol settings
//Create a picture element and also set background and border symbology.//Construct on the worker threadawait QueuedTask.Run(()=>{//Build 2D envelope geometryCoordinate2Dpic_ll=new Coordinate2D(6,1);Coordinate2Dpic_ur=new Coordinate2D(8,2);//At 2.x - Envelope env = EnvelopeBuilder.CreateEnvelope(pic_ll, pic_ur);Envelopeenv= EnvelopeBuilderEx.CreateEnvelope(pic_ll, pic_ur);//Create and add element to layoutstringpicPath=@"C:\Temp\WhitePass.jpg";//At 2.x - GraphicElement picElm =// LayoutElementFactory.Instance.CreatePictureGraphicElement(// layout, env, picPath);// picElm.SetName("New Picture");//GraphicElementpicElm= ElementFactory.Instance.CreatePictureGraphicElement( layout, env, picPath,"New Picture");//(Optionally) Modify the border and shadow CIMGraphicpicGra= picElm.GetGraphic();CIMPictureGraphiccimPicGra= picGra as CIMPictureGraphic; cimPicGra.Frame.BorderSymbol =new CIMSymbolReference(); cimPicGra.Frame.BorderSymbol.Symbol = SymbolFactory.Instance.ConstructLineSymbol( ColorFactory.Instance.BlueRGB,2.0, SimpleLineStyle.Solid); cimPicGra.Frame.ShadowSymbol =new CIMSymbolReference(); cimPicGra.Frame.ShadowSymbol.Symbol = SymbolFactory.Instance.ConstructPolygonSymbol( ColorFactory.Instance.BlackRGB, SimpleFillStyle.Solid);//Update the element picElm.SetGraphic(picGra);});
Create MapFrame and Surrounds
Create Map Frame and Set Camera
//Create a map frame and set its camera by zooming to the extent of an existing bookmark.//Construct on the worker threadawait QueuedTask.Run(()=>{//Build 2D envelope geometryCoordinate2Dmf_ll=new Coordinate2D(6.0,8.5);Coordinate2Dmf_ur=new Coordinate2D(8.0,10.5);//At 2.x - Envelope mf_env = EnvelopeBuilder.CreateEnvelope(mf_ll, mf_ur);Envelopemf_env= EnvelopeBuilderEx.CreateEnvelope(mf_ll, mf_ur);//Reference map, create MF and add to layoutMapProjectItemmapPrjItem= Project.Current.GetItems<MapProjectItem>().FirstOrDefault(item => item.Name.Equals("Map"));MapmfMap= mapPrjItem.GetMap();Bookmarkbookmark= mfMap.GetBookmarks().FirstOrDefault(b => b.Name =="Great Lakes");//At 2.x - MapFrame mfElm =// LayoutElementFactory.Instance.CreateMapFrame(// layout, mf_env, mfMap);// mfElm.SetName("New Map Frame");//MapFramemfElm= ElementFactory.Instance.CreateMapFrameElement( layout, mf_env, mfMap,"New Map Frame");//Zoom to bookmark mfElm.SetCamera(bookmark);});
Create Legend
//Create a legend for an associated map frame.//Construct on the worker threadawait QueuedTask.Run(()=>{//Build 2D envelope geometryCoordinate2Dleg_ll=new Coordinate2D(6,2.5);Coordinate2Dleg_ur=new Coordinate2D(8,4.5);//At 2.x - Envelope leg_env = EnvelopeBuilder.CreateEnvelope(leg_ll, leg_ur);Envelopeleg_env= EnvelopeBuilderEx.CreateEnvelope(leg_ll, leg_ur);//Reference MF, create legend and add to layoutMapFramemapFrame= layout.FindElement("New Map Frame")as MapFrame;if(mapFrame==null){//TODO handle null map framereturn;}//At 2.x - Legend legendElm = LayoutElementFactory.Instance.CreateLegend(// layout, leg_env, mapFrame);// legendElm.SetName("New Legend"); varlegendInfo=new LegendInfo(){MapFrameName= mapFrame.Name};LegendlegendElm= ElementFactory.Instance.CreateMapSurroundElement( layout, leg_env, legendInfo,"New Legend")as Legend;});
Create Scale Bar From StyleItem
//Create a scale bar using a style.//Search for a style project item by nameStyleProjectItemarcgis_2dStyle= Project.Current.GetItems<StyleProjectItem>().First(si => si.Name =="ArcGIS 2D");//Construct on the worker threadawait QueuedTask.Run(()=>{//Reference the specific scale bar by name ScaleBarStyleItemscaleBarItem= arcgis_2dStyle.SearchScaleBars("Double Alternating Scale Bar").FirstOrDefault();//Reference the map frame and define the locationMapFramemyMapFrame= layout.FindElement("Map Frame")as MapFrame;Coordinate2Dcoord2D=new Coordinate2D(10.0,7.0);//Construct the scale bar//At 2.x - LayoutElementFactory.Instance.CreateScaleBar(// layout, coord2D, myMapFrame, scaleBarItem);varsbarInfo=new ScaleBarInfo(){MapFrameName= myMapFrame.Name,ScaleBarStyleItem=scaleBarItem}; ElementFactory.Instance.CreateMapSurroundElement( layout, coord2D.ToMapPoint(), sbarInfo);});
Create North Arrow From StyleItem 1
//Create a north arrow using a style.//Search for a style project item by nameStyleProjectItemarcgis2dStyles= Project.Current.GetItems<StyleProjectItem>().First(si => si.Name =="ArcGIS 2D");//Construct on the worker threadawait QueuedTask.Run(()=>{NorthArrowStyleItemnaStyleItem= arcgis2dStyles.SearchNorthArrows("ArcGIS North 13").FirstOrDefault();//Reference the map frame and define the locationMapFramenewFrame= layout.FindElement("New Map Frame")as MapFrame;Coordinate2DnArrow=new Coordinate2D(6,2.5);//Construct the north arrow//At 2.x - var newNorthArrow = LayoutElementFactory.Instance.CreateNorthArrow(// layout, nArrow, newFrame, naStyleItem);varnaInfo=new NorthArrowInfo(){MapFrameName= newFrame.Name,NorthArrowStyleItem=naStyleItem};varnewNorthArrow= ElementFactory.Instance.CreateMapSurroundElement( layout, nArrow.ToMapPoint(), naInfo);});
//Must be on QueuedTask.Run(() => { ...//Build geometryCoordinate2Dll=new Coordinate2D(2.0,4.5);Coordinate2Dur=new Coordinate2D(4.0,6.5);Envelopeenv= EnvelopeBuilderEx.CreateEnvelope(ll, ur);//Reference map, create MF and add to layout//var map = MapView.Active.Map;//var map = mapProjectItem.GetMap();//...MapFramemfElm= ElementFactory.Instance.CreateMapFrameElement(
layout, env, map);
Create Map Frame 2
//Must be on QueuedTask.Run(() => { ...//Build geometryCoordinate2Dll=new Coordinate2D(4.0,2.5);Coordinate2Dur=new Coordinate2D(7.0,5.5);Envelopeenv= EnvelopeBuilderEx.CreateEnvelope(ll, ur);//Reference map, create MF and add to layout//var map = MapView.Active.Map;//var map = mapProjectItem.GetMap();//...MapFramemfElm= ElementFactory.Instance.CreateMapFrameElement(
layout, env.Center, map);
Create Legend 2
//Must be on QueuedTask.Run(() => { ...//Build geometryCoordinate2Dll=new Coordinate2D(6,2.5);Coordinate2Dur=new Coordinate2D(8,4.5);Envelopeenv= EnvelopeBuilderEx.CreateEnvelope(ll, ur);//Reference MF, create legend and add to layoutMapFramemf= layout.FindElement(mapFrameName)as MapFrame;varsurroundInfo=new LegendInfo(){MapFrameName= mf.Name
};varlegendElm= ElementFactory.Instance.CreateMapSurroundElement(
layout, env.Center, surroundInfo)as Legend;
legendElm.SetName("New Legend");
Create North Arrow From StyleItem 2
//Must be on QueuedTask.Run(() => { ...//Build geometryCoordinate2Dcenter=new Coordinate2D(7,5.5);//Reference a North Arrow in a styleStyleProjectItemstylePrjItm= Project.Current.GetItems<StyleProjectItem>().FirstOrDefault(item => item.Name =="ArcGIS 2D");NorthArrowStyleItemnaStyleItm= stylePrjItm.SearchNorthArrows("ArcGIS North 10")[0];//Reference MF, create north arrow and add to layout //var mf = container.FindElement("New Map Frame") as MapFrame;varmf= layout.FindElement(MapFrameName)as MapFrame;varnarrow_info=new NorthArrowInfo(){MapFrameName= mf.Name,NorthArrowStyleItem=naStyleItm};vararrowElm=(NorthArrow)ElementFactory.Instance.CreateMapSurroundElement(
layout, center.ToMapPoint(), narrow_info)as NorthArrow;
arrowElm.SetName("New North Arrow");
arrowElm.SetHeight(1.75);
arrowElm.SetX(7);
arrowElm.SetY(6);
//Must be on QueuedTask.Run(() => { ...//Build geometryCoordinate2Dll=new Coordinate2D(5.0,6);Coordinate2Dur=new Coordinate2D(6.0,7);EnvelopesbEnv= EnvelopeBuilderEx.CreateEnvelope(ll, ur);//Reference a Scale Bar in a styleStyleProjectItemstylePrjItm= Project.Current.GetItems<StyleProjectItem>().FirstOrDefault(item => item.Name =="ArcGIS 2D");ScaleBarStyleItemsbStyleItm= stylePrjItm.SearchScaleBars("Alternating Scale Bar 1")[0];//ScaleBarStyleItem sbStyleItm = stylePrjItm.SearchScaleBars(// "Double Alternating Scale Bar 1")[0];//ScaleBarStyleItem sbStyleItm = stylePrjItm.SearchScaleBars(// "Hollow Scale Bar 1")[0];//Create Scale BarScaleBarInfosbInfo=new ScaleBarInfo(){MapFrameName= mapFrame.Name
};varsbElm= ElementFactory.Instance.CreateMapSurroundElement(
layout, sbEnv, sbInfo)as ScaleBar;
Create Scale Line
//Must be on QueuedTask.Run(() => { ...//Build geometryCoordinate2Dll=new Coordinate2D(5.0,8);Coordinate2Dur=new Coordinate2D(6.0,9);EnvelopesbEnv= EnvelopeBuilderEx.CreateEnvelope(ll, ur);//Reference a Scale Bar in a styleStyleProjectItemstylePrjItm= Project.Current.GetItems<StyleProjectItem>().FirstOrDefault(item => item.Name =="ArcGIS 2D");ScaleBarStyleItemsbStyleItm= stylePrjItm.SearchScaleBars("Scale Line 1")[0];//ScaleBarStyleItem sbStyleItm = stylePrjItm.SearchScaleBars(// "Stepped Scale Line")[0];//ScaleBarStyleItem sbStyleItm = stylePrjItm.SearchScaleBars(// "Scale Line 2")[0];//Create Scale BarScaleBarInfosbInfo=new ScaleBarInfo(){MapFrameName= mapFrame.Name,ScaleBarStyleItem=sbStyleItm};varsbElm= ElementFactory.Instance.CreateMapSurroundElement(
layout, sbEnv, sbInfo,"ScaleBar Line")as ScaleBar;
Group Elements
Creating empty group elements
//Create an empty group element at the root level of the contents pane//Create on worker threadawait QueuedTask.Run(()=>{//At 2.x - GroupElement grp1 =// LayoutElementFactory.Instance.CreateGroupElement(layout);// grp1.SetName("Group"); //container is IElementContainer - GroupLayer or LayoutGroupElementgrp1= ElementFactory.Instance.CreateGroupElement( container,null,"Group");});// *** or ***//Create a group element inside another group element//Find an existing group element//container is IElementContainer - GroupLayer or LayoutGroupElementexistingGroup= container.FindElement("Group")as GroupElement;//Create on worker threadawait QueuedTask.Run(()=>{//At 2.x - GroupElement grp2 =// LayoutElementFactory.Instance.CreateGroupElement(existingGroup);// grp2.SetName("Group in Group");GroupElementgrp2= ElementFactory.Instance.CreateGroupElement( existingGroup,null,"Group in Group");});
Create a group element with elements
//Create a group with a list of elements at the root level of the contents pane.//Find an existing elements//container is IElementContainer - GroupLayer or Layoutvarelem1= container.FindElement("Polygon 1");varelem2= container.FindElement("Bezier Text");varelem3= container.FindElement("Cloud Shape 2");//Construct a list and add the elementsvarelmList=newList<Element>{
elem1,
elem2,
elem3
};//Perform on the worker threadawait QueuedTask.Run(()=>{//At 2.x - GroupElement groupWithListOfElementsAtRoot =// LayoutElementFactory.Instance.CreateGroupElement(layout, elmList);//groupWithListOfElementsAtRoot.SetName("Group with list of elements at root");//GroupElementgroupWithListOfElementsAtRoot= ElementFactory.Instance.CreateGroupElement( container, elmList,"Group with list of elements at root");});// *** or ***//Create a group using a list of element names at the root level of the contents pane.//List of element namesvarelmNameList=new[]{"Para Text1","Line 3"};//Perform on the worker threadawait QueuedTask.Run(()=>{//At 2.x - GroupElement groupWithListOfElementNamesAtRoot =// LayoutElementFactory.Instance.CreateGroupElement(layout, elmNameList);// groupWithListOfElementNamesAtRoot.SetName(// "Group with list of element names at root");//At 3.x, use the names to find the relevant elements first//container is IElementContainer - GroupLayer or Layoutvarelems= container.FindElements(elmNameList);GroupElementgroupWithListOfElementNamesAtRoot= ElementFactory.Instance.CreateGroupElement( container, elems,"Group with list of element names at root");});
Layout Elements and Selection
Find an element on a layout
//Find an element on a layout.// Reference a layout project item by nameLayoutProjectItemlayoutItem= Project.Current.GetItems<LayoutProjectItem>().FirstOrDefault(item => item.Name.Equals("MyLayout"));if(layoutItem!=null){
QueuedTask.Run(()=>{// Reference and load the layout associated with the layout itemLayoutmylayout= layoutItem.GetLayout();if(mylayout!=null){//Find a single specific elementElementrect= mylayout.FindElement("Rectangle")as Element;//Or use the Elements collectionElementrect2= mylayout.Elements.FirstOrDefault(item => item.Name.Equals("Rectangle"));}});}
Find layout elements
//on the QueuedTask//Find elements by namevarlayoutElementsToFind= layout.FindElements(newList<string>(){"Point 1","Line 3","Text 1"});//Get the collection of elements from the page layout. Nesting within GroupElement is preserved.varelementCollection= layout.GetElements();//Get the collection of Element from the page layout as a flattened list. Nested groups within GroupElement are not preserved.varelements= layout.GetElementsAsFlattenedList();//Convert collection of the elements to a collection of GraphicElements.vargraphicElements= elements.ToList().ConvertAll(x =>(GraphicElement)x);//Find elements by type//Find all point graphics in the LayoutvarpointGraphics= graphicElements.Where(elem => elem.GetGraphic()is CIMPointGraphic);//Find all line graphics in the Graphics LayervarlineGraphics= graphicElements.Where(elem => elem.GetGraphic()is CIMLineGraphic);////Find all polygon graphics in the Graphics LayervarpolyGraphics= graphicElements.Where(elem => elem.GetGraphic()is CIMPolygonGraphic);////Find all text graphics in the Graphics LayervartextGraphics= graphicElements.Where(elem => elem.GetGraphic()is CIMTextGraphic);////Find all picture graphics in the Graphics LayervarpictureGraphic= graphicElements.Where(elem => elem.GetGraphic()is CIMPictureGraphic);
Update element properties
//Update an element's properties.//Performed on worker thread
QueuedTask.Run(()=>{// update an element's name element.SetName("New Name");// update and element's visibility element.SetVisible(true);});
Get element selection count
//Get element's selection count.//Count the number of selected elements on the active layout viewLayoutViewactiveLayoutView= LayoutView.Active;if(activeLayoutView!=null){varselectedElements= activeLayoutView.GetSelectedElements();
ArcGIS.Desktop.Framework.Dialogs.MessageBox.Show($@"Selected elements: {selectedElements.Count}");}
Set element selection
//Set the active layout view's selection to include 2 rectangle elements.//Reference the active view LayoutViewactiveLayoutView= LayoutView.Active;if(activeLayoutView!=null){//Perform on the worker thread
QueuedTask.Run(()=>{//Reference the layoutLayoutlyt= activeLayoutView.Layout;//Reference the two rectangle elementsElementrec= lyt.FindElement("Rectangle");Elementrec2= lyt.FindElement("Rectangle 2");//Construct a list and add the elementsList<Element>elmList=newList<Element>{ rec, rec2};//Set the selection activeLayoutView.SelectElements(elmList);});}
//If the a layout view is active, clear its selectionLayoutViewactiveLayoutView= LayoutView.Active;if(activeLayoutView!=null){
activeLayoutView.ClearElementSelection();}
Clear the selection in a layout
//Clear the layout selection.
layout.ClearElementSelection();
Copy Layout Elements
//on the QueuedTaskvarelems= layout.FindElements(newList<string>(){"Point 1","Line 3","Text 1"});varcopiedElements= layout.CopyElements(elems);
Delete Layout Elements
//on the QueuedTask varelementsToRemove= layout.GetSelectedElements();
layout.DeleteElements(elementsToRemove);
Delete an element or elements on a layout
//Delete an element or elements on a layout.//Perform on the worker thread
QueuedTask.Run(()=>{//Delete a specific element on a layout aLayout.DeleteElement(elm);//Or delete a group of elements using a filter aLayout.DeleteElements(item => item.Name.Contains("Clone"));//Or delete all elements on a layout aLayout.DeleteElements(item =>true);});
Zoom to elements
LayoutViewlytView= LayoutView.Active;//Zoom to an elementvarelementToZoomTo= layout.FindElements(newList<string>(){"MyPoint"}).FirstOrDefault();
lytView.ZoomToElement(elementToZoomTo);//Zoom to multiple elements.varelementsToZoomTo= layout.FindElements(newList<string>(){"Point 1","Line 3","Text 1"});
lytView.ZoomToElements(elementsToZoomTo);
Set halo property of north arrow
//Set the CIM halo properties of a north arrow.//Reference the first selected element (assumption is it is a north arrow)ElementnorthArrow= LayoutView.Active.GetSelectedElements().First();//Perform on the worker thread
QueuedTask.Run(()=>{//Get definition of north arrow...varcim= northArrow.GetDefinition()as CIMMarkerNorthArrow;//this halo symbol is 50% transparent, no outline (i.e. 0 width)//First construct a polygon symbol to use in the Halo//Polygon symbol will need a fill and a strokevarpolyFill= SymbolFactory.Instance.ConstructSolidFill(ColorFactory.Instance.CreateRGBColor(0,0,0,50));varpolyStroke= SymbolFactory.Instance.ConstructStroke(ColorFactory.Instance.BlackRGB,0);varhaloPoly= SymbolFactory.Instance.ConstructPolygonSymbol(polyFill, polyStroke);//Set the north arrow definition of HaloSymbol and HaloSize ((CIMPointSymbol)cim.PointSymbol.Symbol).HaloSymbol =haloPoly;((CIMPointSymbol)cim.PointSymbol.Symbol).HaloSize =3;//size of the halo//Apply the CIM changes back to the element northArrow.SetDefinition(cim);});
Grouping and Ordering Graphic Elements
Group Graphic Elements
//on the QueuedTaskvarelemsToGroup= layout.GetSelectedElements();//Note: run within the QueuedTask//group elementsvargroupElement= layout.GroupElements(elemsToGroup);
Un-Group Graphic Elements
varselectedElements= layout.GetSelectedElements().ToList();if(selectedElements?.Any()==false)//must be at least 1.return;varelementsToUnGroup=newList<GroupElement>();//All selected elements should be grouped elements.if(selectedElements.Count()== selectedElements.OfType<GroupElement>().Count()){//Convert to a GroupElement list.elementsToUnGroup= selectedElements.ConvertAll(x =>(GroupElement)x);}if(elementsToUnGroup.Count()==0)return;//UnGroup many grouped elements
layout.UnGroupElements(elementsToUnGroup);//Ungroup one grouped element
layout.UnGroupElement(elementsToUnGroup.FirstOrDefault());
Parent of GroupElement
//check the parentvarparent= groupElement.Elements.First().GetParent();//will be the group element//top-most parent//will be a GraphicsLayer or Layoutvartop_most= groupElement.Elements.First().GetParent(true);
Children in a Group Element
// Nested groups within ArcGIS.Desktop.Layouts.GroupElement are not preserved.varchildren= groupElement.GetElementsAsFlattenedList();
Ordering: Send backward and Bring forward
//On the QueuedTask//get the current selection setvarsel_elems= layout.GetSelectedElements();//can they be brought forward? This will also check that all elements have the same parentif(layout.CanBringForward(sel_elems)){//bring forward
layout.BringForward(sel_elems);//bring to front (of parent)//graphicsLayer.BringToFront(sel_elems);}elseif(layout.CanSendBackward(sel_elems)){//send back
layout.SendBackward(sel_elems);//send to the back (of parent)//graphicsLayer.SendToBack(sel_elems);}
Get Z-Order
varselElementsZOrder= layout.GetSelectedElements();//list out the z orderforeach(var elem in selElementsZOrder)//At 2.x - System.Diagnostics.Debug.WriteLine($"{elem.Name}: z-order {elem.GetZOrder()}");
System.Diagnostics.Debug.WriteLine($"{elem.Name}: z-order {elem.ZOrder}");
Update Layout Elements
Update text element properties
//Update text element properties for an existing text element.// Reference a layoutitem in a project by nameLayoutProjectItemlayoutItem= Project.Current.GetItems<LayoutProjectItem>().FirstOrDefault(item => item.Name.Equals("MyLayout"));if(layoutItem!=null){//Perform on the worker thread
QueuedTask.Run(()=>{// Reference and load the layout associated with the layout itemLayoutlayout= layoutItem.GetLayout();if(layout!=null){// Reference a text element by nameTextElementtxtElm= layout.FindElement("MyTextElement")as TextElement;if(txtElm!=null){// Change placement properties txtElm.SetAnchor(Anchor.CenterPoint); txtElm.SetX(x); txtElm.SetY(y);// Change TextPropertiesTextPropertiestxtProperties=new TextProperties("Hello world","Times New Roman",48,"Regular"); txtElm.SetTextProperties(txtProperties);}}});}
Update a picture element
//Update a picture element.//Perform on the worker thread
QueuedTask.Run(()=>{// Reference and load the layout associated with the layout itemLayoutlayout= layoutItem.GetLayout();if(layout!=null){// Reference a picture element by namePictureElementpicElm= layout.FindElement("MyPicture")as PictureElement;// Change the path to a new sourceif(picElm!=null) picElm.SetSourcePath(@"D:\MyData\Pics\somePic.jpg");}});
Apply a Background Color to a MapFrame
//Apply a background color to the map frame element using the CIM.//Perform on the worker thread
QueuedTask.Run(()=>{//Get the layoutvarmyLayout= Project.Current.GetItems<LayoutProjectItem>()?.First().GetLayout();if(myLayout==null)return;//Get the map frame in the layoutMapFramemapFrame= myLayout.FindElement("New Map Frame")as MapFrame;if(mapFrame==null){//TODO Handle null mapframereturn;}//Get the map frame's definition in order to modify the background.varmapFrameDefn= mapFrame.GetDefinition()as CIMMapFrame;//Construct the polygon symbol to use to create a backgroundvarpolySymbol= SymbolFactory.Instance.ConstructPolygonSymbol( ColorFactory.Instance.BlueRGB, SimpleFillStyle.Solid);//Set the background mapFrameDefn.GraphicFrame.BackgroundSymbol = polySymbol.MakeSymbolReference();//Set the map frame definition mapFrame.SetDefinition(mapFrameDefn);});
Update a map surround
//Update a map surround.//Perform on the worker thread
QueuedTask.Run(()=>{// Reference and load the layout associated with the layout itemLayoutlayout= layoutItem.GetLayout();if(layout!=null){// Reference a scale bar element by nameMapSurroundscaleBar= layout.FindElement("MyScaleBar")as MapSurround;// Reference a map frame element by nameMapFramemf= layout.FindElement("MyMapFrame")as MapFrame;if((scaleBar!=null)&&(mf!=null))//Set the scale bar to the newly referenced map frame scaleBar.SetMapFrame(mf);}});
Lock an element
// The Locked property is displayed in the TOC as a lock symbol next// to each element. If locked the element can't be selected in the layout// using the graphic selection tools.//Perform on the worker thread
QueuedTask.Run(()=>{// Reference and load the layout associated with the layout itemLayoutlayout= layoutItem.GetLayout();if(layout!=null){//Reference an element by nameElementelement= layout.FindElement("MyElement");if(element!=null){// Modify the Locked property via the CIMCIMElementCIMElement= element.GetDefinition()as CIMElement; CIMElement.Locked =true; element.SetDefinition(CIMElement);}}});
Update an elements transparency
//Update an element's transparency using the CIM.//Perform on the worker thread
QueuedTask.Run(()=>{// Reference and load the layout associated with the layout itemLayoutlayout= layoutItem.GetLayout();if(layout!=null){// Reference a element by nameGraphicElementgraphicElement= layout.FindElement("MyElement")as GraphicElement;if(graphicElement!=null){// Modify the Transparency property that exists only in the CIMGraphic class.CIMGraphicCIMGraphic= graphicElement.GetGraphic()as CIMGraphic; CIMGraphic.Transparency =50;// mark it 50% transparent graphicElement.SetGraphic(CIMGraphic);}}});
Clone an element
//Clone a layout graphic element and apply an offset.//Perform on the worker thread
QueuedTask.Run(()=>{// Reference and load the layout associated with the layout itemLayoutlayout= layoutItem.GetLayout();if(layout!=null){// Reference a graphic element by nameGraphicElementgraphicElement= layout.FindElement("MyElement")as GraphicElement;if(graphicElement!=null){//Clone and set the new x,yGraphicElementcloneElement= graphicElement.Clone("Clone"); cloneElement.SetX(cloneElement.GetX()+xOffset); cloneElement.SetY(cloneElement.GetY()+yOffset);}}});
Style Layout Elements
Apply a style to a North Arrow
//Run within QueuedTask context.//Get the Style project items in the projectvarstyleProjectItems= Project.Current?.GetItems<StyleProjectItem>();//Get the ArcGIS 2D Style Project ItemvarstyleProjectItem=
styleProjectItems.FirstOrDefault(s => s.Name =="ArcGIS 2D");if(styleProjectItem==null)return;//Get the north arrow style item you needvarnorthArrowStyleItem=
styleProjectItem.SearchSymbols(StyleItemType.NorthArrow,"ArcGIS North 18").FirstOrDefault();if(northArrowStyleItem==null)return;//Select a North arrow layout elementvarnorthArrowElement= layout.GetSelectedElements().OfType<NorthArrow>().FirstOrDefault();if(northArrowElement!=null){//Check if the input style can be applied to the elementif(northArrowElement.CanApplyStyle(northArrowStyleItem))//Apply the style
northArrowElement.ApplyStyle(northArrowStyleItem);}
Apply a style to Grid and Graticules
//Run within QueuedTask context.//Get the Style project items in the projectvarstyleProjectItems= Project.Current?.GetItems<StyleProjectItem>();//Get the ArcGIS 2D Style Project ItemvarstyleProjectItem=
styleProjectItems.OfType<StyleProjectItem>().FirstOrDefault(s => s.Name =="ArcGIS 2D");if(styleProjectItem==null)return;//Get the grid style item you needvargridStyleItem=
styleProjectItem.SearchSymbols(StyleItemType.Grid,"Blue Vertical Label Graticule").FirstOrDefault();if(gridStyleItem==null)return;varsymbolItemName= gridStyleItem.Name;vargirdGraticuleObject= gridStyleItem.GetObject()as CIMMapGrid;varmapFrame= layout.GetElements().OfType<MapFrame>().FirstOrDefault();varcmf= mapFrame.GetDefinition()as CIMMapFrame;//note, if page units are _not_ inches then grid's gridline//lengths and offsets would need to be converted to the page unitsvarmapGrids=newList<CIMMapGrid>();if(cmf.Grids !=null)
mapGrids.AddRange(cmf.Grids);//var cimMapGrid = SymbolStyleItem.GetObject() as CIMMapGrid;switch(girdGraticuleObject){case CIMGraticule:vargridGraticule= girdGraticuleObject as CIMGraticule;
gridGraticule.Name =symbolItemName;
gridGraticule.SetGeographicCoordinateSystem(mapFrame.Map.SpatialReference);//assign grid to the frame
mapGrids.Add(gridGraticule);break;case CIMMeasuredGrid:vargridMeasure= girdGraticuleObject as CIMMeasuredGrid;
gridMeasure.Name =symbolItemName;
gridMeasure.SetProjectedCoordinateSystem(mapFrame.Map.SpatialReference);//assign grid to the frame
mapGrids.Add(gridMeasure);break;case CIMReferenceGrid:vargridReference= girdGraticuleObject as CIMReferenceGrid;
gridReference.Name =symbolItemName;//assign grid to the frame
mapGrids.Add(gridReference);break;}
cmf.Grids = mapGrids.ToArray();
mapFrame.SetDefinition(cmf);
Apply a style to a Graphic Element
//Run within QueuedTask context.//Get the Style project items in the projectvarstyleProjectItems= Project.Current?.GetItems<StyleProjectItem>();//Get the ArcGIS 2D Style Project ItemvarstyleProjectItem=
styleProjectItems.OfType<StyleProjectItem>().FirstOrDefault(s => s.Name =="ArcGIS 2D");if(styleProjectItem==null)return;//Get the north arrow style item you needvarpointStyleItem=
styleProjectItem.SearchSymbols(StyleItemType.PointSymbol,"Circle 3").FirstOrDefault();if(pointStyleItem==null)return;//Select a North arrow layout elementvarlayoutPointElement= layout.GetSelectedElements().FirstOrDefault();if(layoutPointElement!=null&& layoutPointElement is GraphicElement ge){if(layoutPointElement.CanApplyStyle(pointStyleItem)){//The magic happens here//for Graphic Elements such as Point, Lines, Polys, text, preserve size.
ge.ApplyStyle(pointStyleItem,true);}}
// sets only the Guide snapping mode
ArcGIS.Desktop.Layouts.LayoutSnapping.SetSnapModes(new[]{ LayoutSnapMode.Guide });// sets only Element and Page snapping modes
ArcGIS.Desktop.Layouts.LayoutSnapping.SetSnapModes(new[]{ LayoutSnapMode.Element, LayoutSnapMode.Page });// clear all snap modes
ArcGIS.Desktop.Layouts.LayoutSnapping.SetSnapModes(null);// set snap modes one at a time
ArcGIS.Desktop.Layouts.LayoutSnapping.SetSnapMode(LayoutSnapMode.Margins,true);
ArcGIS.Desktop.Layouts.LayoutSnapping.SetSnapMode(LayoutSnapMode.Guide,true);/// LayoutSnapping.SetSnapModes(new[]{ LayoutSnapMode.Guide }); // sets only the Guide snapping mode // get current snap modesvarsnapModes= ArcGIS.Desktop.Layouts.LayoutSnapping.SnapModes;// get state of a specific snap modeboolisOn= ArcGIS.Desktop.Layouts.LayoutSnapping.GetSnapMode(LayoutSnapMode.Guide);
Layout Metadata
Layout Metadata
//var layout = ...;//Must be on the QueuedTask.Run()//Gets the Layout metadata.varlayout_xml= layout.GetMetadata();//Can metadata be edited?if(layout.GetCanEditMetadata())//Set the metadata back
layout.SetMetadata(layout_xml);
Layout MapFrame
Change the map associated with a map frame
//Change the map associated with a map frame//Reference a map frame on a layoutMapFramemfrm= layout.FindElement("Map Frame")as MapFrame;//Perform on worker threadawait QueuedTask.Run(()=>{//Reference map from the project item Mapmap= Project.Current.GetItems<MapProjectItem>().FirstOrDefault(m => m.Name.Equals("Map1")).GetMap();//Set the map to the map frame mfrm.SetMap(map);});
Change map frame camera settings
//Change a map frame's camera settings.//Perform on the worker threadawait QueuedTask.Run(()=>{//Reference MapFrameMapFramemf= layout.FindElement("Map Frame")as MapFrame;//Reference the camera associated with the map frame and change the scaleCameracam= mf.Camera; cam.Scale =100000;//Set the map frame extent based on the new camera info mf.SetCamera(cam);});
Zoom map frame to extent of a single layer
//Zoom map frame to the extent of a single layer.//Perform on the worker threadawait QueuedTask.Run(()=>{//Reference MapFrameMapFramemf= layout.FindElement("Map Frame")as MapFrame;//Reference map and layerMapm= mf.Map;FeatureLayerlyr= m.FindLayers("GreatLakes").First()as FeatureLayer;//Set the map frame extent to all features in the layer mf.SetCamera(lyr,false);});
Change map frame extent to selected features in multiple layers
//Change the extent of a map frame to the selected features multiple layers.//Perform on the worker threadawait QueuedTask.Run(()=>{//Reference MapFrameMapFramemf= layout.FindElement("Map Frame")as MapFrame;//Reference map, layers and create layer listMapm= mf.Map;FeatureLayerfl_1= m.FindLayers("GreatLakes").First()as FeatureLayer;FeatureLayerfl_2= m.FindLayers("States_WithRegions").First()as FeatureLayer;varlayers=new[]{ fl_1, fl_2 };//IEnumerable<Layer> layers = m.Layers; //This creates a list of ALL layers in map.//Set the map frame extent to the selected features in the list of layers mf.SetCamera(layers,true);});
Change map frame extent to single feature with 15 percent buffer
//Change map frame extent to single feature with 10 percent buffer//Process on the worker threadawait QueuedTask.Run(()=>{//Reference the mapframe and its associated mapMapFramemf= layout.FindElement("Map Frame")as MapFrame;Mapm= mf.Map;//Reference a feature layer and build a query (to return a single feature)FeatureLayerfl= m.FindLayers("GreatLakes").First()as FeatureLayer;QueryFilterqf=new QueryFilter();stringwhereClause="NAME = 'Lake Erie'"; qf.WhereClause =whereClause;//Zoom to the featureusing(ArcGIS.Core.Data.RowCursor rowCursor= fl.Search(qf)){while(rowCursor.MoveNext()){//Get the shape from the row and set extentusing(varfeature= rowCursor.Current as ArcGIS.Core.Data.Feature){Polygonpolygon= feature.GetShape()as Polygon;Envelopeenv= polygon.Extent as Envelope; mf.SetCamera(env);//Zoom out 15 percentCameracam= mf.Camera; cam.Scale = cam.Scale *1.15; mf.SetCamera(cam);}}}});
Activate Map Frame
//The active view must be a layout view.varlv= LayoutView.Active;if(lv==null)return;varlayout= lv.Layout;if(layout==null)return;//We can activate a map frame on the layout of the active viewvarmap_frame= layout.GetElementsAsFlattenedList().OfType<MapFrame>().FirstOrDefault(mf => mf.Name =="Map 1");if(map_frame==null)return;//can we activate the map frame?if(lv.CanActivateMapFrame(map_frame))//activate it - Note: we are on the UI thread!
lv.ActivateMapFrame(map_frame);
Deactivate Map Frame
//The active view must be a layout view.varlv= LayoutView.Active;if(lv==null)return;varlayout= lv.Layout;if(layout==null)return;//Deactivate any activated map frame//Note: we are on the UI thread!
lv.DeactivateMapFrame();//no-op if nothing activated//or - check if a map frame is activated first...if(lv.ActivatedMapFrame !=null)//Note: we are on the UI thread!
lv.DeactivateMapFrame();
Get the Activated Map Frame and MapView
//The active view must be a layout view.varlv= LayoutView.Active;if(lv==null)return;varmap_view= lv.ActivatedMapView;if(map_view!=null){//TODO - use activated map view}varmap_frame= lv.ActivatedMapFrame;if(map_frame!=null){//TODO - use activated map frame}
Translates a point in page coordinates to a point in map coordinates.
//On the QueuedTaskvarlayout= Project.Current.GetItems<LayoutProjectItem>().FirstOrDefault().GetLayout();varmapFrame= layout.FindElement("New Map Frame")as MapFrame;//Get a point in the center of the Map framevarmapFrameCenterPoint= mapFrame.GetBounds().CenterCoordinate;//Convert to MapPoint//At 2.x - var pointInMapFrame = MapPointBuilder.CreateMapPoint(mapFrameCenterPoint);varpointInMapFrame= MapPointBuilderEx.CreateMapPoint(mapFrameCenterPoint);//Find the corresponding point in the MapViewvarpointOnMap= mapFrame.PageToMap(pointInMapFrame);//Create a point graphic on the MapView.varcimGraphicElement=new CIMPointGraphic
{Location=pointOnMap,Symbol= pointSymbol.MakeSymbolReference()};
graphicsLayer.AddElement(cimGraphicElement);
Translates a point in map coordinates to a point in page coordinates
internalclassGetMapCoordinates:MapTool{protectedoverridevoidOnToolMouseDown(MapViewMouseButtonEventArgse){if(e.ChangedButton == System.Windows.Input.MouseButton.Left)
e.Handled =true;//Handle the event args to get the call to the corresponding async method}protectedoverride Task HandleMouseDownAsync(MapViewMouseButtonEventArgse){return QueuedTask.Run(()=>{varpointSymbol= SymbolFactory.Instance.ConstructPointSymbol(ColorFactory.Instance.BlackRGB,8);varlayout= Project.Current.GetItems<LayoutProjectItem>().FirstOrDefault().GetLayout();//Convert the clicked point in client coordinates to the corresponding map coordinates.varmapPoint= MapView.Active.ClientToMap(e.ClientPoint); ArcGIS.Desktop.Framework.Dialogs.MessageBox.Show(string.Format("X: {0} Y: {1} Z: {2}", mapPoint.X, mapPoint.Y, mapPoint.Z),"Map Coordinates");//Get the corresponding layout pointvarmapFrame= layout.FindElement("New Map Frame")as MapFrame;varpointOnLayoutFrame= mapFrame.MapToPage(mapPoint);//Create a point graphic on the Layout.varcimGraphicElement=new CIMPointGraphic{Location=pointOnLayoutFrame,Symbol= pointSymbol.MakeSymbolReference()};//Or use GraphicFactoryvarcimGraphicElement2= GraphicFactory.Instance.CreateSimpleGraphic( pointOnLayoutFrame, pointSymbol);//At 2.x - LayoutElementFactory.Instance.CreateGraphicElement(layout, cimGraphicElement); ElementFactory.Instance.CreateGraphicElement(layout, cimGraphicElement); ElementFactory.Instance.CreateGraphicElement(layout, cimGraphicElement2);});}}
Layout MapSeries
Modify an existing map series
//Modify the currently active map series and changes its sort field and page number field.//Perform on the worker threadawait QueuedTask.Run(()=>{SpatialMapSeriesSMS= layout.MapSeries as SpatialMapSeries;//cast as spatial map series for additional members SMS.SortField ="State_Name"; SMS.SortAscending =true; SMS.PageNumberField ="PageNum";//Overwrite the current map series with these new settings layout.SetMapSeries(SMS);});
Create a new spatial map series
// This example create a new spatial map series and then applies it to the active layout. This will automatically // overwrite an existing map series if one is already present.//Reference map frame and index layerMapFramemf= layout.FindElement("Map Frame")as MapFrame;Mapm= mf.Map;BasicFeatureLayerindexLyr= m.FindLayers("Countries").FirstOrDefault()as BasicFeatureLayer;//Construct map series on worker threadawait QueuedTask.Run(()=>{//SpatialMapSeries constructor - required parametersSpatialMapSeriesSMS= MapSeries.CreateSpatialMapSeries(layout, mf, indexLyr,"Name");//Set optional, non-default values SMS.CategoryField ="Continent"; SMS.SortField ="Population"; SMS.ExtentOptions = ExtentFitType.BestFit; SMS.MarginType = ArcGIS.Core.CIM.UnitType.PageUnits; SMS.MarginUnits = ArcGIS.Core.Geometry.LinearUnit.Centimeters; SMS.Margin =1; SMS.ScaleRounding =1000; layout.SetMapSeries(SMS);//Overwrite existing map series.});
Layout Export
Export a layout to PDF
//Export a single page layout to PDF.//Create a PDF format with appropriate settings//BMP, EMF, EPS, GIF, JPEG, PNG, SVG, TGA, and TFF formats are also available for exportPDFFormatPDF=new PDFFormat(){OutputFileName=filePath,Resolution=300,DoCompressVectorGraphics=true,DoEmbedFonts=true,HasGeoRefInfo=true,ImageCompression= ImageCompression.Adaptive,ImageQuality= ImageQuality.Best,LayersAndAttributes= LayersAndAttributes.LayersAndAttributes
};//Check to see if the path is valid and exportif(PDF.ValidateOutputFilePath()){await QueuedTask.Run(()=> layout.Export(PDF));//Export the layout to PDF on the worker thread}
Export a map frame to JPG
//Export a map frame to JPG.//Create JPEG format with appropriate settings//BMP, EMF, EPS, GIF, PDF, PNG, SVG, TGA, and TFF formats are also available for export//at 2.x - JPEGFormat JPG = new JPEGFormat()//{// HasWorldFile = true,// Resolution = 300,// OutputFileName = filePath,// JPEGColorMode = JPEGColorMode.TwentyFourBitTrueColor,// Height = 800,// Width = 1200//};JPEGFormatJPG=new JPEGFormat(){HasWorldFile=true,Resolution=300,OutputFileName=filePath,ColorMode= JPEGColorMode.TwentyFourBitTrueColor,Height=800,Width=1200};//Reference the map frameMapFramemf= layout.FindElement("MyMapFrame")as MapFrame;//Export on the worker threadawait QueuedTask.Run(()=>{//Check to see if the path is valid and exportif(JPG.ValidateOutputFilePath()){ mf.Export(JPG);//Export the map frame to JPG}});
Export the map view associated with a map frame to BMP
//Export the map view associated with a map frame to BMP.//Create BMP format with appropriate settings//EMF, EPS, GIF, JPEG, PDF, PNG, SVG, TGA, and TFF formats are also available for exportBMPFormatBMP=new BMPFormat(){Resolution=300,Height=500,Width=800,HasWorldFile=true,OutputFileName=filePath};//Reference the active layout viewLayoutViewlytView= LayoutView.Active;//Reference the map frame and its map viewMapFramemf_bmp= layout.FindElement("Map Frame")as MapFrame;//Export on the worker threadawait QueuedTask.Run(()=>{MapViewmv_bmp= mf_bmp.GetMapView(lytView);if(mv_bmp!=null){//Check to see if the path is valid and exportif(BMP.ValidateOutputFilePath()){ mv_bmp.Export(BMP);//Export to BMP}}});
Export a map series to single PDF
//Export a map series with multiple pages to a single PDF.//Create PDF format with appropriate settingsPDFFormatMS_PDF=new PDFFormat(){OutputFileName=filePath,Resolution=300,DoCompressVectorGraphics=true,DoEmbedFonts=true,HasGeoRefInfo=true,ImageCompression= ImageCompression.Adaptive,ImageQuality= ImageQuality.Best,LayersAndAttributes= LayersAndAttributes.LayersAndAttributes
};//Set up map series export optionsMapSeriesExportOptionsMS_ExportOptions=new MapSeriesExportOptions(){ExportPages= ExportPages.Custom,//Provide a specific list of pagesCustomPages="1-3, 5",//Only used if ExportPages.Custom is setExportFileOptions= ExportFileOptions.ExportAsSinglePDF,//Export all pages to a single, multi-page PDFShowSelectedSymbology=false//Do no show selection symbology in the output};//Export on the worker threadawait QueuedTask.Run(()=>{//Check to see if the path is valid and exportif(MS_PDF.ValidateOutputFilePath()){ layout.Export(MS_PDF, MS_ExportOptions);//Export to PDF}});
Export a map series to individual TIFF files
//Export each page of a map series to an individual TIFF file.//Create TIFF format with appropriate settingsTIFFFormatTIFF=new TIFFFormat(){OutputFileName=filePath,Resolution=300,ColorMode= TIFFColorMode.TwentyFourBitTrueColor,HasGeoTiffTags=true,HasWorldFile=true,ImageCompression= TIFFImageCompression.LZW
};//Set up map series export optionsMapSeriesExportOptionsMSExportOptions_TIFF=new MapSeriesExportOptions(){ExportPages= ExportPages.All,//All pagesExportFileOptions= ExportFileOptions.ExportMultipleNames,//Export each page to an individual file using page name as a suffix.ShowSelectedSymbology=true//Include selection symbology in the output};//Export on the worker threadawait QueuedTask.Run(()=>{//Check to see if the path is valid and exportif(TIFF.ValidateOutputFilePath()){ layout.Export(TIFF, MSExportOptions_TIFF);//Export to TIFF}});
//keep graphic element insert tool active
ApplicationOptions.LayoutOptions.KeepLastToolActive =true;//no warning when deleting a map frame results in other elements being deleted
ApplicationOptions.LayoutOptions.WarnAboutAssociatedSurrounds =false;//path to .pagx files used as templates
ApplicationOptions.LayoutOptions.LayoutTemplatePath =@"D:\data\layout_templates";
QueuedTask.Run(()=>{varguideColor= ApplicationOptions.LayoutOptions.GetGuideColor();// set guide color ApplicationOptions.LayoutOptions.SetGuideColor(ColorFactory.Instance.RedRGB);});
TextAndGraphicsElementsOptions
Get All Available Fonts
//Note: see also SymbolFactory.Instance.GetAvailableFonts() which returns the//same list. Use for TextAndGraphicsElementsOptions.GetAvailableFonts() convenience
QueuedTask.Run(()=>{//A list of tuples of Font name + associated Font Styles, one tuple per//font, is returnedvarfonts= ApplicationOptions.TextAndGraphicsElementsOptions.GetAvailableFonts();StringBuildersb=new StringBuilder(); sb.AppendLine("Pro Fonts\r\n============================");foreach(var font in fonts){varstyles=string.Join(",", font.fontStyles); sb.AppendLine($"{font.fontName}, [{styles}]");} System.Diagnostics.Debug.WriteLine(sb.ToString());});
Get TextAndGraphicsElementsOptions
QueuedTask.Run(()=>{//Get the default font (see also 'SymbolFactory.Instance.DefaultFont')vardef_font= ApplicationOptions.TextAndGraphicsElementsOptions.GetDefaultFont(); System.Diagnostics.Debug.WriteLine($"\r\ndefault font: {def_font.fontName}, {def_font.styleName}");//Get the default graphics element symbols - point, line, poly, textvarptSymbol= ApplicationOptions.TextAndGraphicsElementsOptions.GetDefaultPointSymbol();varlineSymbol= ApplicationOptions.TextAndGraphicsElementsOptions.GetDefaultLineSymbol();varpolySymbol= ApplicationOptions.TextAndGraphicsElementsOptions.GetDefaultPolygonSymbol();vartextSymbol= ApplicationOptions.TextAndGraphicsElementsOptions.GetDefaultTextSymbol();});
Set TextAndGraphicsElementsOptions
QueuedTask.Run(()=>{//Set a default font. Use its default style ApplicationOptions.TextAndGraphicsElementsOptions.SetDefaultFont("tahoma");//or specify an explicit style ApplicationOptions.TextAndGraphicsElementsOptions.SetDefaultFont("tahoma","bold");//Create symbolsvarptSymbol2= SymbolFactory.Instance.ConstructPointSymbol( ColorFactory.Instance.RedRGB,14, SimpleMarkerStyle.Diamond);varlineSymbol2= SymbolFactory.Instance.ConstructLineSymbol( ColorFactory.Instance.RedRGB,2, SimpleLineStyle.Dash);varpolySymbol2= SymbolFactory.Instance.ConstructPolygonSymbol( ColorFactory.Instance.RedRGB, SimpleFillStyle.DiagonalCross);vartextSymbol2= SymbolFactory.Instance.ConstructTextSymbol( ColorFactory.Instance.RedRGB,12);//Set default point, line, poly, text graphics element symbols ApplicationOptions.TextAndGraphicsElementsOptions.SetDefaultPointSymbol(ptSymbol2); ApplicationOptions.TextAndGraphicsElementsOptions.SetDefaultLineSymbol(lineSymbol2); ApplicationOptions.TextAndGraphicsElementsOptions.SetDefaultPolygonSymbol(polySymbol2); ApplicationOptions.TextAndGraphicsElementsOptions.SetDefaultTextSymbol(textSymbol2);});