//Create an empty project. The project will be created in the default folder//It will be named MyProject1, MyProject2, or similar...awaitProject.CreateAsync();
New project with specified name
//Settings used to create a new projectCreateProjectSettingsprojectSettings=newCreateProjectSettings(){//Sets the name of the project that will be createdName=@"C:\Data\MyProject1\MyProject1.aprx"};//Create the new projectawaitProject.CreateAsync(projectSettings);
Create new project using Pro's default settings
//Get Pro's default project settings.vardefaultProjectSettings=Project.GetDefaultProjectSettings();//Create a new project using the default project settingsawaitProject.CreateAsync(defaultProjectSettings);
New project using a custom template file
//Settings used to create a new projectCreateProjectSettingsprojectSettings=newCreateProjectSettings(){//Sets the project's nameName="New Project",//Path where new project will be stored inLocationPath=@"C:\Data\NewProject",//Sets the project template that will be used to create the new projectTemplatePath=@"C:\Data\MyProject1\CustomTemplate.aptx"};//Create the new projectawaitProject.CreateAsync(projectSettings);
Create project using template available with ArcGIS Pro
//Settings used to create a new projectCreateProjectSettingsproTemplateSettings=newCreateProjectSettings(){//Sets the project's nameName="New Project",//Path where new project will be stored inLocationPath=@"C:\Data\NewProject",//Select which Pro template you like to useTemplateType=TemplateType.Catalog//TemplateType = TemplateType.LocalScene//TemplateType = TemplateType.GlobalScene//TemplateType = TemplateType.Map};//Create the new projectawaitProject.CreateAsync(proTemplateSettings);
Open project
//Opens an existing project or project packageawaitProject.OpenAsync(@"C:\Data\MyProject1\MyProject1.aprx");
Current project
//Gets the current projectvarproject=Project.Current;
Get location of current project
//Gets the location of the current project; that is, the path to the current project file (*.aprx) stringprojectPath=Project.Current.URI;
//Saves the projectawaitProject.Current.SaveAsync();
Check if project needs to be saved
//The project's dirty state indicates changes made to the project have not yet been saved. boolisProjectDirty=Project.Current.IsDirty;
SaveAs project
//Saves a copy of the current project file (*.aprx) to the specified location with the specified file name, //then opens the new project fileawaitProject.Current.SaveAsAsync(@"C:\Data\MyProject1\MyNewProject1.aprx");
Close project
//A project cannot be closed using the ArcGIS Pro API. //A project is only closed when another project is opened, a new one is created, or the application is shutdown.
How to add a new map to a project
awaitQueuedTask.Run(()=>{//Note: see also MapFactory in ArcGIS.Desktop.Mappingvarmap=MapFactory.Instance.CreateMap("New Map",MapType.Map,MapViewingMode.Map,Basemap.Oceans);ProApp.Panes.CreateMapPaneAsync(map);});
Project Items
Adds item to the current project
//Adding a folder connectionstringfolderPath="@C:\\myDataFolder";varfolder=awaitQueuedTask.Run(()=>{//Create the folder connection project itemvaritem=ItemFactory.Instance.Create(folderPath)asIProjectItem;//If it is succesfully added to the project, return it otherwise nullreturnProject.Current.AddItem(item)?itemasFolderConnectionProjectItem:null;});//Adding a Geodatabase:stringgdbPath="@C:\\myDataFolder\\myData.gdb";varnewlyAddedGDB=awaitQueuedTask.Run(()=>{//Create the File GDB project itemvaritem=ItemFactory.Instance.Create(gdbPath)asIProjectItem;//If it is succesfully added to the project, return it otherwise nullreturnProject.Current.AddItem(item)?itemasGDBProjectItem:null;});
IEnumerable<MapProjectItem>newMapItemsContainer=project.GetItems<MapProjectItem>();awaitQueuedTask.Run(()=>{foreach(varmpinnewMapItemsContainer){//Do Something with the map. For Example:MapmyMap=mp.GetMap();}});
IEnumerable<StyleProjectItem>newStyleItemsContainer=null;newStyleItemsContainer=Project.Current.GetItems<StyleProjectItem>();foreach(varstyleIteminnewStyleItemsContainer){//Do Something with the style.}
IEnumerable<GDBProjectItem>newGDBItemsContainer=null;newGDBItemsContainer=Project.Current.GetItems<GDBProjectItem>();foreach(varGDBIteminnewGDBItemsContainer){//Do Something with the GDB.}
IEnumerable<ServerConnectionProjectItem>newServerConnections=null;newServerConnections=project.GetItems<ServerConnectionProjectItem>();foreach(varserverIteminnewServerConnections){//Do Something with the server connection.}
//Gets all the folder connections in the current projectvarprojectFolders=Project.Current.GetItems<FolderConnectionProjectItem>();foreach(varFolderIteminprojectFolders){//Do Something with the Folder connection.}
Gets a specific folder connection
//Gets a specific folder connection in the current projectFolderConnectionProjectItemmyProjectFolder=Project.Current.GetItems<FolderConnectionProjectItem>().FirstOrDefault(folderPI =>folderPI.Name.Equals("myDataFolder"));
Remove a specific folder connection
// Remove a folder connection from a project; the folder stored on the local disk or the network is not deletedFolderConnectionProjectItemfolderToRemove=Project.Current.GetItems<FolderConnectionProjectItem>().FirstOrDefault(myfolder =>myfolder.Name.Equals("PlantSpecies"));if(folderToRemove!=null)Project.Current.RemoveItem(folderToRemoveasIProjectItem);
//Gets all the layouts in the current projectvarprojectLayouts=Project.Current.GetItems<LayoutProjectItem>();foreach(varlayoutIteminprojectLayouts){//Do Something with the layout}
//Gets all the GeoprocessingProjectItem in the current projectvarGPItems=Project.Current.GetItems<GeoprocessingProjectItem>();foreach(vartbxinGPItems){//Do Something with the toolbox}
Search project for a specific item
List<Item>_mxd=newList<Item>();//Gets all the folder connections in the current projectvarallFoldersItem=Project.Current.GetItems<FolderConnectionProjectItem>();if(allFoldersItem!=null){//iterate through all the FolderConnectionProjectItems foundforeach(varfolderIteminallFoldersItem){//Search for mxd files in that folder connection and add it to the List<T>//Note:ArcGIS Pro automatically creates and dynamically updates a searchable index as you build and work with projects. //Items are indexed when they are added to a project.//The first time a folder or database is indexed, indexing may take a while if it contains a large number of items. //While the index is being created, searches will not return any results._mxd.AddRange(folderItem.GetItems());}}
// Get the ItemCategories with which an item is associatedItemgdb=ItemFactory.Instance.Create(@"E:\CurrentProject\RegionalPolling\polldata.gdb");List<ItemCategory>gdbItemCategories=gdb.ItemCategories;
Using Item Categories
// Browse items using an ItemCategory as a filterIEnumerable<Item>gdbContents=gdb.GetItems();IEnumerable<Item>filteredGDBContents1=gdbContents.Where(item =>item.ItemCategories.OfType<ItemCategoryDataSet>().Any());IEnumerable<Item>filteredGDBContents2=newItemCategoryDataSet().Items(gdbContents);
//GetItems searches project contentvarmap=Project.Current.GetItems<MapProjectItem>().FirstOrDefault(m =>m.Name=="Map1");varlayout=Project.Current.GetItems<LayoutProjectItem>().FirstOrDefault(m =>m.Name=="Layout1");varfolders=Project.Current.GetItems<FolderConnectionProjectItem>();varstyle=Project.Current.GetItems<StyleProjectItem>().FirstOrDefault(s =>s.Name=="ArcGIS 3D");//Find item uses a catalog path. The path can be to a file or datasetvarfcPath=@"C:\Pro\CommunitySampleData\Interacting with Maps\Interacting with Maps.gdb\Crimes";varpdfPath=@"C:\Temp\Layout1.pdf";varimgPath=@"C:\Temp\AddinDesktop16.png";varfc=Project.Current.FindItem(fcPath);varpdf=Project.Current.FindItem(pdfPath);varimg=Project.Current.FindItem(imgPath);
Select an item in the Catalog pane
//Get the catalog paneArcGIS.Desktop.Core.IProjectWindowprojectWindow=Project.GetCatalogPane();//or get the active catalog view...//ArcGIS.Desktop.Core.IProjectWindow projectWindow = Project.GetActiveCatalogWindow();//eg Find a toolbox in the projectstringgpName="Interacting with Maps.tbx";vartoolbox=Project.Current.GetItems<GeoprocessingProjectItem>().FirstOrDefault(tbx =>tbx.Name==gpName);//Select it under ToolboxesprojectWindow.SelectItemAsync(toolbox,true,true,null);//null selects it in the first container - optionally await//Note: Project.Current.GetProjectItemContainer("GP") would get toolbox container...//assume toolbox is also under Folders container. Select it under Folders instead of ToolboxesvarfoldersContainer=Project.Current.ProjectItemContainers.First(c =>c.Path=="FolderConnection");//We must specify the container because Folders comes second (after Toolboxes)projectWindow.SelectItemAsync(toolbox,true,true,foldersContainer);//optionally await//Find a map and select itvarmapItem=Project.Current.GetItems<MapProjectItem>().FirstOrDefault(m =>m.Name=="Map");//Map only occurs under "Maps" so the container need not be specifiedprojectWindow.SelectItemAsync(mapItem,true,false,null);
stringgdbXMLMetadataXmlAsString=string.Empty;gdbXMLMetadataXmlAsString=awaitQueuedTask.Run(()=>gdbMetadataItem.GetXml());//check metadata was returnedif(!string.IsNullOrEmpty(gdbXMLMetadataXmlAsString)){//use the metadata}
Item: Set the metadata of an item: SetXML
awaitQueuedTask.Run(()=>{varxml=System.IO.File.ReadAllText(@"E:\Data\Metadata\MetadataForFeatClass.xml");//Will throw InvalidOperationException if the metadata cannot be changed//so check "CanEdit" firstif(featureClassMetadataItem.CanEdit())featureClassMetadataItem.SetXml(xml);});
Item: Check the metadata can be edited: CanEdit
boolcanEdit1;//Call CanEdit before calling SetXmlawaitQueuedTask.Run(()=>canEdit1=metadataItemToCheck.CanEdit());
Item: Updates metadata with the current properties of the item: Synchronize
Item: Updates metadata with the imported metadata - the input path can be the path to an item with metadata, or a URI to a XML file: ImportMetadata
// the input path can be the path to an item with metadata, or a URI to an XML fileIMetadatametadataItemImport1=null;awaitQueuedTask.Run(()=>metadataItemImport1.ImportMetadata(@"E:\YellowStone.gdb\MyDataset\MyFeatureClass",MDImportExportOption.esriCurrentMetadataStyle));
Item: Updates metadata with the imported metadata: ImportMetadata
// the input path can be the path to an item with metadata, or a URI to an XML fileawaitQueuedTask.Run(()=>metadataItemImport2.ImportMetadata(@"E:\YellowStone.gdb\MyDataset\MyFeatureClass",MDImportExportOption.esriCustomizedStyleSheet,@"E:\StyleSheets\Import\MyImportStyleSheet.xslt"));
Item: export the metadata of the currently selected item: ExportMetadata
//Must be on the QueuedTask.Run()varunit_formats=Enum.GetValues(typeof(UnitFormatType)).OfType<UnitFormatType>().ToList();System.Diagnostics.Debug.WriteLine("All available units\r\n");foreach(varunit_formatinunit_formats){varunits=DisplayUnitFormats.Instance.GetPredefinedProjectUnitFormats(unit_format);System.Diagnostics.Debug.WriteLine(unit_format.ToString());foreach(vardisplay_unit_formatinunits){varline=$"{display_unit_format.DisplayName}, {display_unit_format.UnitCode}";System.Diagnostics.Debug.WriteLine(line);}System.Diagnostics.Debug.WriteLine("");}
Get The List of Unit Formats for the Current Project
//Must be on the QueuedTask.Run()varunit_formats=Enum.GetValues(typeof(UnitFormatType)).OfType<UnitFormatType>().ToList();System.Diagnostics.Debug.WriteLine("Project units\r\n");foreach(varunit_formatinunit_formats){varunits=DisplayUnitFormats.Instance.GetProjectUnitFormats(unit_format);System.Diagnostics.Debug.WriteLine(unit_format.ToString());foreach(vardisplay_unit_formatinunits){varline=$"{display_unit_format.DisplayName}, {display_unit_format.UnitCode}";System.Diagnostics.Debug.WriteLine(line);}System.Diagnostics.Debug.WriteLine("");}
Get A Specific List of Unit Formats for the Current Project
//Must be on the QueuedTask.Run()//UnitFormatType.Angular, UnitFormatType.Area, UnitFormatType.Distance, //UnitFormatType.Direction, UnitFormatType.Location, UnitFormatType.Page//UnitFormatType.Symbol2D, UnitFormatType.Symbol3Dvarunits=DisplayUnitFormats.Instance.GetProjectUnitFormats(UnitFormatType.Distance);
Get The List of Default Formats for the Current Project
//Must be on the QueuedTask.Run()varunit_formats=Enum.GetValues(typeof(UnitFormatType)).OfType<UnitFormatType>().ToList();System.Diagnostics.Debug.WriteLine("Default project units\r\n");foreach(varunit_formatinunit_formats){vardefault_unit=DisplayUnitFormats.Instance.GetDefaultProjectUnitFormat(unit_format);varline=$"{unit_format.ToString()}: {default_unit.DisplayName}, {default_unit.UnitCode}";System.Diagnostics.Debug.WriteLine(line);}System.Diagnostics.Debug.WriteLine("");
Get A Specific Default Unit Format for the Current Project
//Must be on the QueuedTask.Run()//UnitFormatType.Angular, UnitFormatType.Area, UnitFormatType.Distance, //UnitFormatType.Direction, UnitFormatType.Location, UnitFormatType.Page//UnitFormatType.Symbol2D, UnitFormatType.Symbol3Dvardefault_unit=DisplayUnitFormats.Instance.GetDefaultProjectUnitFormat(UnitFormatType.Distance);
Set a Specific List of Unit Formats for the Current Project
//Must be on the QueuedTask.Run()//UnitFormatType.Angular, UnitFormatType.Area, UnitFormatType.Distance, //UnitFormatType.Direction, UnitFormatType.Location//Get the full list of all available location unitsvarall_units=DisplayUnitFormats.Instance.GetPredefinedProjectUnitFormats(UnitFormatType.Location);//keep units with an even factory codevarlist_units=all_units.Where(du =>du.UnitCode%2==0).ToList();//set them as the new location unit collection. A new default is not being specified...DisplayUnitFormats.Instance.SetProjectUnitFormats(list_units);//set them as the new location unit collection along with a new defaultDisplayUnitFormats.Instance.SetProjectUnitFormats(list_units,list_units.First());//Note: UnitFormatType.Page, UnitFormatType.Symbol2D, UnitFormatType.Symbol3D//cannot be set.
Set the Defaults for the Project Unit Formats
//Must be on the QueuedTask.Run()varunit_formats=Enum.GetValues(typeof(UnitFormatType)).OfType<UnitFormatType>().ToList();foreach(varunit_typeinunit_formats){varcurrent_default=DisplayUnitFormats.Instance.GetDefaultProjectUnitFormat(unit_type);//Arbitrarily pick the last unit in each unit format listvarreplacement=DisplayUnitFormats.Instance.GetProjectUnitFormats(unit_type).Last();DisplayUnitFormats.Instance.SetDefaultProjectUnitFormat(replacement);varline=$"{current_default.DisplayName}, {current_default.UnitName}, {current_default.UnitCode}";varline2=$"{replacement.DisplayName}, {replacement.UnitName}, {replacement.UnitCode}";System.Diagnostics.Debug.WriteLine($"Format: {unit_type.ToString()}");System.Diagnostics.Debug.WriteLine($" Current default: {line}");System.Diagnostics.Debug.WriteLine($" Replacement default: {line2}");}
Update Unit Formats for the Project
//UnitFormatType.Angular, UnitFormatType.Area, UnitFormatType.Distance, //UnitFormatType.Direction, UnitFormatType.Locationvarangle_units=DisplayUnitFormats.Instance.GetProjectUnitFormats(UnitFormatType.Angular);//Edit the display name of each unit - append the abbreviationforeach(varunitinangle_units){unit.DisplayName=$"{unit.DisplayName} ({unit.Abbreviation})";}//apply the changes to the units and set the default to be the first entryDisplayUnitFormats.Instance.SetProjectUnitFormats(angle_units,angle_units.First());//The project must be saved to persist the changes...