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 paneILayoutPaneiNewLayoutPane=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)//if there is a match, 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 fileIProjectItempagx= 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 project
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 threadLayoutnewLayout=await QueuedTask.Run<Layout>(()=>{newLayout= 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(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=await QueuedTask.Run<Layout>(()=>{//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 definitionsnewCIMLayout= LayoutFactory.Instance.CreateLayout(newPage); newCIMLayout.SetName("New 8.5x11 Layout");returnnewCIMLayout;});//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(layout!=null){//Change propertiesCIMPagepage= layout.GetPage(); page.Width =8.5; page.Height =11;//Apply the changes to the layout layout.SetPage(page);}});}
Create Layout Elements
Create Element using the CIMElement
//on the QueuedTask//Place symbol on the layoutMapPointpoint= MapPointBuilder.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}};
LayoutElementFactory.Instance.CreateElement(layout, graphic);
Create Graphic Element using CIMGraphic
//on the QueuedTask//Place symbol on the layoutMapPointlocation= MapPointBuilder.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};
LayoutElementFactory.Instance.CreateGraphicElement(layout, graphic);
Create Graphic Element using CIMSymbol
//on the QueuedTask//Place symbol on the layoutMapPointlocation= MapPointBuilder.CreateMapPoint(new Coordinate2D(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=new CIMPointGraphic(){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 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 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 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));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.Symbol as CIMLineSymbol; 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 threadawait QueuedTask.Run(()=>{//Build 2D envelope geometryCoordinate2Drec_ll=new Coordinate2D(1.0,4.75);Coordinate2Drec_ur=new Coordinate2D(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 threadawait QueuedTask.Run(()=>{//Build 2D point geometryCoordinate2Dcoord2D=new Coordinate2D(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 properties ptTxtElm.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 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));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."as String;GraphicElementpolyTxtElm= LayoutElementFactory.Instance.CreatePolygonParagraphGraphicElement(layout, poly, text, sym); polyTxtElm.SetName("New Polygon Text");//(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 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);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= 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 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 threadawait QueuedTask.Run(()=>{//Build 2D envelope geometryCoordinate2Dmf_ll=new Coordinate2D(6.0,8.5);Coordinate2Dmf_ur=new Coordinate2D(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 threadawait 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){ 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()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);});
Create a legend for a specific map frame
//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);Envelopeleg_env= EnvelopeBuilder.CreateEnvelope(leg_ll, leg_ur);//Reference MF, create legend and add to layoutMapFramemapFrame= layout.FindElement("New Map Frame")as MapFrame;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 threadawait QueuedTask.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")as GroupElement;//Create on worker threadawait QueuedTask.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")as Element;ElementnorthArrow= layout.FindElement("North Arrow")as Element;Elementlegend= layout.FindElement("Legend")as Element;//Construct a list and add the elementsList<Element>elmList=newList<Element>{
scaleBar,
northArrow,
legend
};//Perform on the worker threadawait QueuedTask.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 threadawait QueuedTask.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 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 LayoutElementFactory.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 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 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=new Coordinate2D(6,2.5);//Construct element on worker threadawait QueuedTask.Run(()=>{//Create with default text propertiesTextElementtitleGraphics= LayoutElementFactory.Instance.CreatePointTextGraphicElement(layout, llTitle,null)as TextElement;//Modify the text properties titleGraphics.SetTextProperties(new TextProperties(title,"Arial",24,"Bold"));});
Create a table frame
//Create a table frame.//Construct on the worker threadawait QueuedTask.Run(()=>{//Build 2D envelope geometryCoordinate2Drec_ll=new Coordinate2D(1.0,3.5);Coordinate2Drec_ur=new Coordinate2D(7.5,4.5);Enveloperec_env= EnvelopeBuilder.CreateEnvelope(rec_ll, rec_ur);//Reference map frame and layerMapFramemf= layout.FindElement("Map Frame")as MapFrame;Mapm= mf.Map;FeatureLayerlyr= m.FindLayers("GreatLakes").First()as FeatureLayer;//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")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 Layer////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 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 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 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 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)
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 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");}});
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);}}});
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;//Peform 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);}}}});
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 MapPointvarpointInMapFrame= MapPointBuilder.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()}; 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 threadawait QueuedTask.Run(()=>{SpatialMapSeriesSMS= layout.MapSeries as SpatialMapSeries;//cast as spatial map seris 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 exportJPEGFormatJPG=new JPEGFormat(){HasWorldFile=true,Resolution=300,OutputFileName=filePath,JPEGColorMode= 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;MapViewmv_bmp= mf_bmp.GetMapView(lytView);if(mv_bmp!=null){//Export on the worker threadawait QueuedTask.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=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= ColorMode.TwentyFourBitTrueColor,HasGeoTiffTags=true,HasWorldFile=true,TIFFImageCompression= 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}});