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=awaitQueuedTask.Run(()=>someLytItem.GetLayout());//Worker thread//Create the new paneILayoutPaneiNewLayoutPane=awaitProApp.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(varpaneinProApp.Panes){varlayoutPane=paneasILayoutPane;if(layoutPane==null)//if not a layout view, continue to the next panecontinue;if(layoutPane.LayoutView.Layout==layout)//if there is a match, activate the view{(layoutPaneasPane).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 fileIProjectItempagx=ItemFactory.Instance.Create(@"C:\Temp\Layout.pagx")asIProjectItem;Project.Current.AddItem(pagx);
Remove a layout project item
//Remove a layout project item.//Remove the layout fro the projectProject.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 threadLayoutnewLayout=awaitQueuedTask.Run<Layout>(()=>{newLayout=LayoutFactory.Instance.CreateLayout(8.5,11,LinearUnit.Inches);newLayout.SetName("New 8.5x11 Layout");returnnewLayout;});//Open new layout on the GUI threadawaitProApp.Panes.CreateLayoutPaneAsync(newLayout);
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=awaitQueuedTask.Run<Layout>(()=>{//Set up a CIM pageCIMPagenewPage=newCIMPage{//required parametersWidth=8.5,Height=11,Units=LinearUnit.Inches,//optional rulersShowRulers=true,SmallestRulerDivision=0.5,//optional guidesShowGuides=true};CIMGuideguide1=newCIMGuide{Position=1,Orientation=Orientation.Vertical};CIMGuideguide2=newCIMGuide{Position=6.5,Orientation=Orientation.Vertical};CIMGuideguide3=newCIMGuide{Position=1,Orientation=Orientation.Horizontal};CIMGuideguide4=newCIMGuide{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 definitionsnewCIMLayout=LayoutFactory.Instance.CreateLayout(newPage);newCIMLayout.SetName("New 8.5x11 Layout");returnnewCIMLayout;});//Open new layout on the GUI threadawaitProApp.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){awaitQueuedTask.Run(()=>{//Get the layoutLayoutlyt=lytItem.GetLayout();if(layout!=null){//Change propertiesCIMPagepage=layout.GetPage();page.Width=8.5;page.Height=11;//Apply the changes to the layoutlayout.SetPage(page);}});}
Create Layout Elements
Create Element using the CIMElement
//on the QueuedTask//Place symbol on the layoutMapPointpoint=MapPointBuilder.CreateMapPoint(newCoordinate2D(9,1));//specify a symbolvarpt_symbol=SymbolFactory.Instance.ConstructPointSymbol(ColorFactory.Instance.GreenRGB);//create a CIMGraphic vargraphic=newCIMGraphicElement(){Graphic=newCIMPointGraphic(){Symbol=pt_symbol.MakeSymbolReference(),Location=point//A point in the layout}};LayoutElementFactory.Instance.CreateElement(layout,graphic);
Create Graphic Element using CIMGraphic
//on the QueuedTask//Place symbol on the layoutMapPointlocation=MapPointBuilder.CreateMapPoint(newCoordinate2D(9,1));//specify a symbolvarpt_symbol=SymbolFactory.Instance.ConstructPointSymbol(ColorFactory.Instance.GreenRGB);//create a CIMGraphic vargraphic=newCIMPointGraphic(){Symbol=pt_symbol.MakeSymbolReference(),Location=location//center of map};LayoutElementFactory.Instance.CreateGraphicElement(layout,graphic);
Create Graphic Element using CIMSymbol
//on the QueuedTask//Place symbol on the layoutMapPointlocation=MapPointBuilder.CreateMapPoint(newCoordinate2D(9,1));//specify a symbolvarpt_symbol=SymbolFactory.Instance.ConstructPointSymbol(ColorFactory.Instance.GreenRGB);LayoutElementFactory.Instance.CreateGraphicElement(layout,location,pt_symbol);
Bulk Element creation
//on the QueuedTask//List of Point graphicsvarlistGraphics=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){point=MapPointBuilder.CreateMapPoint(col,row);//create a CIMGraphic vargraphic=newCIMPointGraphic(){Symbol=pointSymbol.MakeSymbolReference(),Location=point//center of map};listGraphics.Add(graphic);}}//Draw the array of graphicsvarbulkgraphics=LayoutElementFactory.Instance.CreateGraphicElements(layout,listGraphics,null);
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 threadawaitQueuedTask.Run(()=>{//Build 2D point geometry Coordinate2Dcoord2D=newCoordinate2D(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.SymbolasCIMPointSymbol;pointSym.SetSize(50);//Set symbolology, create and add element to layout//An alternative simple symbol is also commented out below. This would elminate the four //optional lines of code above that reference a style.//CIMPointSymbol pointSym = SymbolFactory.Instance.ConstructPointSymbol(ColorFactory.Instance.RedRGB, 25.0, SimpleMarkerStyle.Star); //Alternative simple symbolGraphicElementptElm=LayoutElementFactory.Instance.CreatePointGraphicElement(layout,coord2D,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 threadawaitQueuedTask.Run(()=>{//Build 2d line geometryList<Coordinate2D>plCoords=newList<Coordinate2D>();plCoords.Add(newCoordinate2D(1,8.5));plCoords.Add(newCoordinate2D(1.66,9));plCoords.Add(newCoordinate2D(2.33,8.1));plCoords.Add(newCoordinate2D(3,8.5));PolylinelinePl=PolylineBuilder.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.SymbolasCIMLineSymbol;lineSym.SetSize(20);//Set symbolology, create and add element to layout//An alternative simple symbol is also commented out below. This would elminate the four //optional lines of code above that reference a style.//CIMLineSymbol lineSym = SymbolFactory.Instance.ConstructLineSymbol(ColorFactory.Instance.BlueRGB, 4.0, SimpleLineStyle.Solid); //Alternative simple symbolGraphicElementlineElm=LayoutElementFactory.Instance.CreateLineGraphicElement(layout,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 threadawaitQueuedTask.Run(()=>{//Build 2D envelope geometryCoordinate2Drec_ll=newCoordinate2D(1.0,4.75);Coordinate2Drec_ur=newCoordinate2D(3.0,5.75);Enveloperec_env=EnvelopeBuilder.CreateEnvelope(rec_ll,rec_ur);//Set symbolology, 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);GraphicElementrecElm=LayoutElementFactory.Instance.CreateRectangleGraphicElement(layout,rec_env,polySym);recElm.SetName("New Rectangle");});
Create text element with basic font properties
//Create a simple point text element and assign basic symbology and text settings.//Construct on the worker threadawaitQueuedTask.Run(()=>{//Build 2D point geometryCoordinate2Dcoord2D=newCoordinate2D(3.5,10);//Set symbolology, create and add element to layoutCIMTextSymbolsym=SymbolFactory.Instance.ConstructTextSymbol(ColorFactory.Instance.RedRGB,32,"Arial","Regular");stringtextString="Point text";GraphicElementptTxtElm=LayoutElementFactory.Instance.CreatePointTextGraphicElement(layout,coord2D,textString,sym);ptTxtElm.SetName("New Point Text");//Change additional text propertiesptTxtElm.SetAnchor(Anchor.CenterPoint);ptTxtElm.SetX(4.5);ptTxtElm.SetY(9.5);ptTxtElm.SetRotation(45);});
Create rectangle text with more advanced symbol settings
//Create rectangle text with background and border symbology. //Construct on the worker threadawaitQueuedTask.Run(()=>{//Build 2D polygon geometryList<Coordinate2D>plyCoords=newList<Coordinate2D>();plyCoords.Add(newCoordinate2D(3.5,7));plyCoords.Add(newCoordinate2D(4.5,7));plyCoords.Add(newCoordinate2D(4.5,6.7));plyCoords.Add(newCoordinate2D(5.5,6.7));plyCoords.Add(newCoordinate2D(5.5,6.1));plyCoords.Add(newCoordinate2D(3.5,6.1));Polygonpoly=PolygonBuilder.CreatePolygon(plyCoords);//Set symbolology, 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."asString;GraphicElementpolyTxtElm=LayoutElementFactory.Instance.CreatePolygonParagraphGraphicElement(layout,poly,text,sym);polyTxtElm.SetName("New Polygon Text");//(Optionally) Modify paragraph border CIMGraphicpolyTxtGra=polyTxtElm.GetGraphic();CIMParagraphTextGraphiccimPolyTxtGra=polyTxtGraasCIMParagraphTextGraphic;cimPolyTxtGra.Frame.BorderSymbol=newCIMSymbolReference();cimPolyTxtGra.Frame.BorderSymbol.Symbol=SymbolFactory.Instance.ConstructLineSymbol(ColorFactory.Instance.GreyRGB,1.0,SimpleLineStyle.Solid);polyTxtElm.SetGraphic(polyTxtGra);});
Create a new picture element with advanced symbol settings
//Create a picture element and also set background and border symbology.//Construct on the worker threadawaitQueuedTask.Run(()=>{//Build 2D envelope geometryCoordinate2Dpic_ll=newCoordinate2D(6,1);Coordinate2Dpic_ur=newCoordinate2D(8,2);Envelopeenv=EnvelopeBuilder.CreateEnvelope(pic_ll,pic_ur);//Create and add element to layoutstringpicPath=@"C:\Temp\WhitePass.jpg";GraphicElementpicElm=LayoutElementFactory.Instance.CreatePictureGraphicElement(layout,env,picPath);picElm.SetName("New Picture");//(Optionally) Modify the border and shadow CIMGraphicpicGra=picElm.GetGraphic();CIMPictureGraphiccimPicGra=picGraasCIMPictureGraphic;cimPicGra.Frame.BorderSymbol=newCIMSymbolReference();cimPicGra.Frame.BorderSymbol.Symbol=SymbolFactory.Instance.ConstructLineSymbol(ColorFactory.Instance.BlueRGB,2.0,SimpleLineStyle.Solid);cimPicGra.Frame.ShadowSymbol=newCIMSymbolReference();cimPicGra.Frame.ShadowSymbol.Symbol=SymbolFactory.Instance.ConstructPolygonSymbol(ColorFactory.Instance.BlackRGB,SimpleFillStyle.Solid);//Update the elementpicElm.SetGraphic(picGra);});
Create a map frame and zoom to a bookmark
//Create a map frame and set its camera by zooming to the extent of an existing bookmark.//Construct on the worker threadawaitQueuedTask.Run(()=>{//Build 2D envelope geometryCoordinate2Dmf_ll=newCoordinate2D(6.0,8.5);Coordinate2Dmf_ur=newCoordinate2D(8.0,10.5);Envelopemf_env=EnvelopeBuilder.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();MapFramemfElm=LayoutElementFactory.Instance.CreateMapFrame(layout,mf_env,mfMap);mfElm.SetName("New Map Frame");//Zoom to bookmarkBookmarkbookmark=mfElm.Map.GetBookmarks().FirstOrDefault(b =>b.Name=="Great Lakes");mfElm.SetCamera(bookmark);});
Apply a background color to a MapFrame element
//Apply a background color to the map frame element using the CIM.//Perform on the worker threadawaitQueuedTask.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")asMapFrame;if(mapFrame==null){ArcGIS.Desktop.Framework.Dialogs.MessageBox.Show("Map frame not found","WARNING");return;}//Get the map frame's definition in order to modify the background.varmapFrameDefn=mapFrame.GetDefinition()asCIMMapFrame;//Construct the polygon symbol to use to create a backgroundvarpolySymbol=SymbolFactory.Instance.ConstructPolygonSymbol(ColorFactory.Instance.BlueRGB,SimpleFillStyle.Solid);//Set the backgroundmapFrameDefn.GraphicFrame.BackgroundSymbol=polySymbol.MakeSymbolReference();//Set the map frame definitionmapFrame.SetDefinition(mapFrameDefn);});
Create a legend for a specific map frame
//Create a legend for an associated map frame.//Construct on the worker threadawaitQueuedTask.Run(()=>{//Build 2D envelope geometryCoordinate2Dleg_ll=newCoordinate2D(6,2.5);Coordinate2Dleg_ur=newCoordinate2D(8,4.5);Envelopeleg_env=EnvelopeBuilder.CreateEnvelope(leg_ll,leg_ur);//Reference MF, create legend and add to layoutMapFramemapFrame=layout.FindElement("New Map Frame")asMapFrame;if(mapFrame==null){ArcGIS.Desktop.Framework.Dialogs.MessageBox.Show("Map frame not found","WARNING");return;}LegendlegendElm=LayoutElementFactory.Instance.CreateLegend(layout,leg_env,mapFrame);legendElm.SetName("New Legend");});
Creating empty group elements
//Create an empty group element at the root level of the contents pane//Create on worker threadawaitQueuedTask.Run(()=>{GroupElementgrp1=LayoutElementFactory.Instance.CreateGroupElement(layout);grp1.SetName("Group");});// *** or ***//Create a group element inside another group element//Find an existing group elementGroupElementexistingGroup=layout.FindElement("Group")asGroupElement;//Create on worker threadawaitQueuedTask.Run(()=>{GroupElementgrp2=LayoutElementFactory.Instance.CreateGroupElement(existingGroup);grp2.SetName("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 elementsElementscaleBar=layout.FindElement("Scale Bar")asElement;ElementnorthArrow=layout.FindElement("North Arrow")asElement;Elementlegend=layout.FindElement("Legend")asElement;//Construct a list and add the elementsList<Element>elmList=newList<Element>{scaleBar,northArrow,legend};//Perform on the worker threadawaitQueuedTask.Run(()=>{GroupElementgroupWithListOfElementsAtRoot=LayoutElementFactory.Instance.CreateGroupElement(layout,elmList);groupWithListOfElementsAtRoot.SetName("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[]{"Table Frame","Chart Frame"};//Perform on the worker threadawaitQueuedTask.Run(()=>{GroupElementgroupWithListOfElementNamesAtRoot=LayoutElementFactory.Instance.CreateGroupElement(layout,elmNameList);groupWithListOfElementNamesAtRoot.SetName("Group with list of element names at root");});
Create a scale bar using a style
//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 threadawaitQueuedTask.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")asMapFrame;Coordinate2Dcoord2D=newCoordinate2D(10.0,7.0);//Construct the scale barLayoutElementFactory.Instance.CreateScaleBar(layout,coord2D,myMapFrame,scaleBarItem);});
Create a north arrow using a style
//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 threadawaitQueuedTask.Run(()=>{NorthArrowStyleItemnaStyleItem=arcgis2dStyles.SearchNorthArrows("ArcGIS North 13").FirstOrDefault();//Reference the map frame and define the locationMapFramenewFrame=layout.FindElement("New Map Frame")asMapFrame;Coordinate2DnArrow=newCoordinate2D(6,2.5);//Construct the north arrowvarnewNorthArrow=LayoutElementFactory.Instance.CreateNorthArrow(layout,nArrow,newFrame,naStyleItem);});
Create a dynamic text element
//Create a dynamic text element.//Set the string with tags and the locationStringtitle=@"<dyn type = ""page"" property = ""name"" />";Coordinate2DllTitle=newCoordinate2D(6,2.5);//Construct element on worker threadawaitQueuedTask.Run(()=>{//Create with default text propertiesTextElementtitleGraphics=LayoutElementFactory.Instance.CreatePointTextGraphicElement(layout,llTitle,null)asTextElement;//Modify the text propertiestitleGraphics.SetTextProperties(newTextProperties(title,"Arial",24,"Bold"));});
Create a table frame
//Create a table frame.//Construct on the worker threadawaitQueuedTask.Run(()=>{//Build 2D envelope geometryCoordinate2Drec_ll=newCoordinate2D(1.0,3.5);Coordinate2Drec_ur=newCoordinate2D(7.5,4.5);Enveloperec_env=EnvelopeBuilder.CreateEnvelope(rec_ll,rec_ur);//Reference map frame and layerMapFramemf=layout.FindElement("Map Frame")asMapFrame;Mapm=mf.Map;FeatureLayerlyr=m.FindLayers("GreatLakes").First()asFeatureLayer;//Build fields listvarfields=new[]{"NAME","Shape_Area","Shape_Length"};//Construct the table frameTableFrametabFrame=LayoutElementFactory.Instance.CreateTableFrame(layout,rec_env,mf,lyr,fields);});
Layout Elements & 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(layout!=null){//Find a single specific elementElementrect=mylayout.FindElement("Rectangle")asElement;//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()isCIMPointGraphic);//Find all line graphics in the Graphics LayervarlineGraphics=graphicElements.Where(elem =>elem.GetGraphic()isCIMLineGraphic);////Find all polygon graphics in the Graphics Layer////Find all text graphics in the Graphics LayervartextGraphics=graphicElements.Where(elem =>elem.GetGraphic()isCIMTextGraphic);////Find all picture graphics in the Graphics LayervarpictureGraphic=graphicElements.Where(elem =>elem.GetGraphic()isCIMPictureGraphic);
Update element properties
//Update an element's properties.//Performed on worker threadQueuedTask.Run(()=>{// update an element's nameelement.SetName("New Name");// update and element's visibilityelement.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 threadQueuedTask.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 selectionactiveLayoutView.SelectElements(elmList);});}
UnSelect elements on the Layout
//Unselect one element.varelementToUnSelect=layout.FindElements(newList<string>(){"MyPoint"}).FirstOrDefault();layout.UnSelectElement(elementToUnSelect);//Unselect multiple elements.varelementsToUnSelect=layout.FindElements(newList<string>(){"Point 1","Line 3","Text 1"});layout.UnSelectElements(elementsToUnSelect);
UnSelect elements on the LayoutView
LayoutViewlayoutView=LayoutView.Active;//Unselect one element.varelementToUnSelectInView=layout.FindElements(newList<string>(){"MyPoint"}).FirstOrDefault();layoutView.UnSelectElement(elementToUnSelect);//Unselect multiple elements.varelementsToUnSelectInView=layout.FindElements(newList<string>(){"Point 1","Line 3","Text 1"});layoutView.UnSelectElements(elementsToUnSelect);
Clear the selection in a layout view
//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 threadQueuedTask.Run(()=>{//Delete a specific element on a layoutaLayout.DeleteElement(elm);//Or delete a group of elements using a filteraLayout.DeleteElements(item =>item.Name.Contains("Clone"));//Or delete all elements on a layoutaLayout.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 threadQueuedTask.Run(()=>{//Get definition of north arrow...varcim=northArrow.GetDefinition()asCIMMarkerNorthArrow;//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 defintion 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 elementnorthArrow.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 elementslayout.UnGroupElements(elementsToUnGroup);//Ungroup one grouped elementlayout.UnGroupElement(elementsToUnGroup.FirstOrDefault());
Parent of GroupElement
//check the parentvarparent=groupElement.Elements.First().GetParent();//will be the group element//top-most parentvartop_most=groupElement.Elements.First().GetParent(true);//will be the GraphicsLayer
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 forwardlayout.BringForward(sel_elems);//bring to front (of parent)//graphicsLayer.BringToFront(sel_elems);}elseif(layout.CanSendBackward(sel_elems)){//send backlayout.SendBackward(sel_elems);//send to the back (of parent)//graphicsLayer.SendToBack(sel_elems);}
Get Z-Order
varselElementsZOrder=layout.GetSelectedElements();//list out the z orderforeach(vareleminselElementsZOrder)System.Diagnostics.Debug.WriteLine($"{elem.Name}: z-order {elem.GetZOrder()}");
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 threadQueuedTask.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")asTextElement;if(txtElm!=null){// Change placement propertiestxtElm.SetAnchor(Anchor.CenterPoint);txtElm.SetX(x);txtElm.SetY(y);// Change TextPropertiesTextPropertiestxtProperties=newTextProperties("Hello world","Times New Roman",48,"Regular");txtElm.SetTextProperties(txtProperties);}}});}
Update a picture element
//Update a picture element.//Perform on the worker threadQueuedTask.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")asPictureElement;// Change the path to a new sourceif(picElm!=null)picElm.SetSourcePath(@"D:\MyData\Pics\somePic.jpg");}});
Update a map surround
//Update a map surround.//Perform on the worker threadQueuedTask.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")asMapSurround;// Reference a map frame element by nameMapFramemf=layout.FindElement("MyMapFrame")asMapFrame;if((scaleBar!=null)&&(mf!=null))//Set the scale bar to the newly referenced map framescaleBar.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 threadQueuedTask.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()asCIMElement;CIMElement.Locked=true;element.SetDefinition(CIMElement);}}});
Update an elements transparency
//Update an element's transparency using the CIM.//Perform on the worker threadQueuedTask.Run(()=>{// Reference and load the layout associated with the layout itemLayoutlayout=layoutItem.GetLayout();if(layout!=null){// Reference a element by nameGraphicElementgraphicElement=layout.FindElement("MyElement")asGraphicElement;if(graphicElement!=null){// Modify the Transparency property that exists only in the CIMGraphic class.CIMGraphicCIMGraphic=graphicElement.GetGraphic()asCIMGraphic;CIMGraphic.Transparency=50;// mark it 50% transparentgraphicElement.SetGraphic(CIMGraphic);}}});
Clone an element
//Clone a layout graphic element and apply an offset.//Perform on the worker threadQueuedTask.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")asGraphicElement;if(graphicElement!=null){//Clone and set the new x,yGraphicElementcloneElement=graphicElement.Clone("Clone");cloneElement.SetX(cloneElement.GetX()+xOffset);cloneElement.SetY(cloneElement.GetY()+yOffset);}}});
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 backlayout.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")asMapFrame;//Peform on worker threadawaitQueuedTask.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 framemfrm.SetMap(map);});
Change map frame camera settings
//Change a map frame's camera settings.//Perform on the worker threadawaitQueuedTask.Run(()=>{//Reference MapFrameMapFramemf=layout.FindElement("Map Frame")asMapFrame;//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 infomf.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 threadawaitQueuedTask.Run(()=>{//Reference MapFrameMapFramemf=layout.FindElement("Map Frame")asMapFrame;//Reference map and layerMapm=mf.Map;FeatureLayerlyr=m.FindLayers("GreatLakes").First()asFeatureLayer;//Set the map frame extent to all features in the layermf.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 threadawaitQueuedTask.Run(()=>{//Reference MapFrameMapFramemf=layout.FindElement("Map Frame")asMapFrame;//Reference map, layers and create layer listMapm=mf.Map;FeatureLayerfl_1=m.FindLayers("GreatLakes").First()asFeatureLayer;FeatureLayerfl_2=m.FindLayers("States_WithRegions").First()asFeatureLayer;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 layersmf.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 threadawaitQueuedTask.Run(()=>{//Reference the mapframe and its associated mapMapFramemf=layout.FindElement("Map Frame")asMapFrame;Mapm=mf.Map;//Reference a feature layer and build a query (to return a single feature)FeatureLayerfl=m.FindLayers("GreatLakes").First()asFeatureLayer;QueryFilterqf=newQueryFilter();stringwhereClause="NAME = 'Lake Erie'";qf.WhereClause=whereClause;//Zoom to the featureusing(ArcGIS.Core.Data.RowCursorrowCursor=fl.Search(qf)){while(rowCursor.MoveNext()){//Get the shape from the row and set extentusing(varfeature=rowCursor.CurrentasArcGIS.Core.Data.Feature){Polygonpolygon=feature.GetShape()asPolygon;Envelopeenv=polygon.ExtentasEnvelope;mf.SetCamera(env);//Zoom out 15 percentCameracam=mf.Camera;cam.Scale=cam.Scale*1.15;mf.SetCamera(cam);}}}});
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")asMapFrame;//Get a point in the center of the Map framevarmapFrameCenterPoint=mapFrame.GetBounds().CenterCoordinate;//Convert to MapPointvarpointInMapFrame=MapPointBuilder.CreateMapPoint(mapFrameCenterPoint);//Find the corresponding point in the MapViewvarpointOnMap=mapFrame.PageToMap(pointInMapFrame);//Create a point graphic on the MapView.varcimGraphicElement=newCIMPointGraphic{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}protectedoverrideTaskHandleMouseDownAsync(MapViewMouseButtonEventArgse){returnQueuedTask.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")asMapFrame;varpointOnLayoutFrame=mapFrame.MapToPage(mapPoint);//Create a point graphic on the Layout.varcimGraphicElement=newCIMPointGraphic{Location=pointOnLayoutFrame,Symbol=pointSymbol.MakeSymbolReference()};LayoutElementFactory.Instance.CreateGraphicElement(layout,cimGraphicElement);});}}
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 threadawaitQueuedTask.Run(()=>{SpatialMapSeriesSMS=layout.MapSeriesasSpatialMapSeries;//cast as spatial map seris for additional membersSMS.SortField="State_Name";SMS.SortAscending=true;SMS.PageNumberField="PageNum";//Overwrite the current map series with these new settingslayout.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")asMapFrame;Mapm=mf.Map;BasicFeatureLayerindexLyr=m.FindLayers("Countries").FirstOrDefault()asBasicFeatureLayer;//Construct map series on worker threadawaitQueuedTask.Run(()=>{//SpatialMapSeries constructor - required parametersSpatialMapSeriesSMS=MapSeries.CreateSpatialMapSeries(layout,mf,indexLyr,"Name");//Set optional, non-default valuesSMS.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=newPDFFormat(){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()){awaitQueuedTask.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 exportJPEGFormatJPG=newJPEGFormat(){HasWorldFile=true,Resolution=300,OutputFileName=filePath,JPEGColorMode=JPEGColorMode.TwentyFourBitTrueColor,Height=800,Width=1200};//Reference the map frameMapFramemf=layout.FindElement("MyMapFrame")asMapFrame;//Export on the worker threadawaitQueuedTask.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=newBMPFormat(){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")asMapFrame;MapViewmv_bmp=mf_bmp.GetMapView(lytView);if(mv_bmp!=null){//Export on the worker threadawaitQueuedTask.Run(()=>{//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=newPDFFormat(){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=newMapSeriesExportOptions(){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 threadawaitQueuedTask.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=newTIFFFormat(){OutputFileName=filePath,Resolution=300,ColorMode=ColorMode.TwentyFourBitTrueColor,HasGeoTiffTags=true,HasWorldFile=true,TIFFImageCompression=TIFFImageCompression.LZW};//Set up map series export optionsMapSeriesExportOptionsMSExportOptions_TIFF=newMapSeriesExportOptions(){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 threadawaitQueuedTask.Run(()=>{//Check to see if the path is valid and exportif(TIFF.ValidateOutputFilePath()){layout.Export(TIFF,MSExportOptions_TIFF);//Export to TIFF}});