diff --git a/DAML/ADCore.daml.xml b/DAML/ADCore.daml.xml
index 08a3a1e..e1509ea 100644
--- a/DAML/ADCore.daml.xml
+++ b/DAML/ADCore.daml.xml
@@ -24,15 +24,26 @@
+
+
+
+
+
+
+
+
+
+
+ isPrimary="true" category="Catalog" caption="View"
+ description="Use Catalog view shortcuts to navigate the view, manage item collections, create and search for items, edit metadata, display the details pane, and access the location bar.">
-
+
@@ -52,7 +63,7 @@
-
+
@@ -70,7 +81,8 @@
+ isPrimary="true" category="Catalog" caption="Pane"
+ description="Use Catalog pane shortcuts to navigate the pane; manage project, portal, computer, and favorite items; create items, and search for items.">
@@ -92,7 +104,8 @@
-
+
+
@@ -139,7 +152,6 @@
-
@@ -172,27 +184,27 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -200,12 +212,12 @@
-
-
-
-
-
-
+
+
+
+
+
+
@@ -213,8 +225,98 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -290,6 +392,7 @@
+
@@ -343,6 +446,7 @@
+
@@ -382,6 +486,7 @@
+
@@ -480,6 +585,29 @@
+
+
+
+
+
+
+
+
+
-
+
+
@@ -822,7 +967,7 @@ With the Catalog view you can sort items, preview spatial data, edit an item’s
+ assembly="ArcGIS.Desktop.Framework.dll" smallImage="Search_Find16" largeImage="Search_Find32" loadOnClick="false" keytip="H" hidden="true">
Search for and execute commands, tools, and help.
@@ -852,8 +997,8 @@ With the Catalog view you can sort items, preview spatial data, edit an item’s
condition="esri_core_resourcesPane"
smallImage="SortCustom16"
largeImage="SortCustom32"
- caption="Default Sort" extendedCaption="Clear sorting" keytip="S" loadOnClick="false">
-
+ caption="Catalog Sort" extendedCaption="Clear sorting" keytip="S" loadOnClick="false">
+
Remove sorting that was applied to the contents list. Returns items in the list to their original order.
Sorting can only be cleared from the contents list when using the columns display type.
@@ -992,7 +1137,7 @@ Show information such as an item's thumbnail and tags as well as its location in
largeImage="PinFavorite32"
helpContextID="" menuKeytip="J">
- Add the item to project favorites and to all new projects. Project favorites saves a reference to the existing item. When a new project is create, a reference to the item is automatically added.
+ Add the item to project favorites and to all new projects. Project favorites saves a reference to the existing item. When a new project is created, a reference to the item is automatically added.
@@ -1012,6 +1157,15 @@ Show information such as an item's thumbnail and tags as well as its location in
+
+
@@ -2009,6 +2083,8 @@ A new BIM Cloud Connection file is created in the project's home folder and is r
+
+
@@ -2121,6 +2197,16 @@ A new BIM Cloud Connection file is created in the project's home folder and is r
+
+
@@ -2249,6 +2335,23 @@ A new BIM Cloud Connection file is created in the project's home folder and is r
+
+
+
@@ -2755,6 +2858,8 @@ A new BIM Cloud Connection file is created in the project's home folder and is r
+
+
@@ -2769,6 +2874,8 @@ A new BIM Cloud Connection file is created in the project's home folder and is r
+
+
@@ -2787,6 +2894,8 @@ A new BIM Cloud Connection file is created in the project's home folder and is r
+
+
@@ -2797,6 +2906,52 @@ A new BIM Cloud Connection file is created in the project's home folder and is r
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -2857,9 +3012,7 @@ A new BIM Cloud Connection file is created in the project's home folder and is r
-
-
-
+
@@ -3171,6 +3324,22 @@ A new BIM Cloud Connection file is created in the project's home folder and is r
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -3232,6 +3401,31 @@ A new BIM Cloud Connection file is created in the project's home folder and is r
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -3371,6 +3565,7 @@ A new BIM Cloud Connection file is created in the project's home folder and is r
+
@@ -3386,11 +3581,17 @@ A new BIM Cloud Connection file is created in the project's home folder and is r
-
+
+
+
+
+
+
+
@@ -3623,6 +3824,7 @@ A new BIM Cloud Connection file is created in the project's home folder and is r
+
@@ -3867,6 +4092,7 @@ A new BIM Cloud Connection file is created in the project's home folder and is r
+
@@ -3926,6 +4152,7 @@ A new BIM Cloud Connection file is created in the project's home folder and is r
+
@@ -3937,6 +4164,7 @@ A new BIM Cloud Connection file is created in the project's home folder and is r
+
@@ -3945,6 +4173,7 @@ A new BIM Cloud Connection file is created in the project's home folder and is r
+
@@ -3956,8 +4185,21 @@ A new BIM Cloud Connection file is created in the project's home folder and is r
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -3974,6 +4216,7 @@ A new BIM Cloud Connection file is created in the project's home folder and is r
+
@@ -4063,6 +4306,7 @@ A new BIM Cloud Connection file is created in the project's home folder and is r
+
+
+
+
+
@@ -4109,6 +4360,7 @@ A new BIM Cloud Connection file is created in the project's home folder and is r
+
@@ -4277,6 +4529,25 @@ A new server connection file is created in the project's home folder and is refe
A new cloud storage connection file is created in the project's home folder and is referenced by the project.
+
+
+
+ Connect to STAC. Add the connection to the project.
+
+ A new STAC onnection file is created in the project's home folder and is referenced by the project.
+
+
+
+
+ Add a STAC connection.
+
+
+
+
+ Edit a STAC connection.
+
+
+
@@ -4420,6 +4691,15 @@ The project saves a reference to the statistical data collection file.
Remove the locator from the project.
+
+
+ Remove the locator view from the project.
+
+
@@ -4691,6 +4971,92 @@ The project saves a reference to the statistical data collection file.
+
+
+ Generate a report on the schema of the selected workspace.
+
+
+
+
+
+
+ Convert one or more catalog datasets into a CAD file.
+
+
+
+
+
+ Convert this catalog dataset into a catalog dataset.
+
+
+
+
+
+ Convert one or more catalog datasets into a geodatabase.
+
+
+
+
+
+ Convert catalog dataset into shapefile.
+
+
+
+
+
+ Convert one or more catalog datasets into shapefile or shapefiles.
+
+
+
+
+
+ Export data from one or more catalog datasets into an XML document.
+
+
+
+
+
+ Load data into catalog dataset.
+
+
+
+
+
+
+
+ Create a new oriented imagery dataset in the geodatabase.
+
+
+
+
+
+ Create a new GeoPackage.
+
+
Create new spatial analyst models.
+
+
+
+ Create new spatial analyst models.
+
+
+
+ Create locator view.
+
+
+
+
+ Edit the locator view configuration
+
+
-
+
+
+ Search STAC items.
+
+
@@ -5938,13 +6359,20 @@ A new server connection file is created in your roaming profile and is reference
-
Create a new locator
+
+
+ Create a new locator
+
+
+
Validate Topology.
@@ -6013,6 +6441,13 @@ A new server connection file is created in your roaming profile and is reference
+
+
+ Add images to oriented imagery dataset.
+
+
+
@@ -6191,6 +6626,9 @@ A new server connection file is created in your roaming profile and is reference
+
+
+
@@ -6287,6 +6725,9 @@ A new server connection file is created in your roaming profile and is reference
+
+
+
@@ -6376,6 +6817,9 @@ A new server connection file is created in your roaming profile and is reference
+
+
+
@@ -6422,6 +6866,36 @@ A new server connection file is created in your roaming profile and is reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DAML/ADGeoProcessing.daml.xml b/DAML/ADGeoProcessing.daml.xml
index 57eedcb..8951e31 100644
--- a/DAML/ADGeoProcessing.daml.xml
+++ b/DAML/ADGeoProcessing.daml.xml
@@ -20,6 +20,79 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -75,8 +148,10 @@
-
-
+
+
+
+
@@ -515,6 +590,14 @@
+
+
+
+
+
+
+
+
@@ -651,6 +734,7 @@
+
@@ -818,13 +907,13 @@
-
-
+
-
+
+
@@ -860,6 +949,11 @@
+
+
+
+
+
@@ -979,18 +1073,12 @@
-
-
- Flip Orientation along with Reverse Direction results in Left to Right, Top to Bottom, Right to Left and Bottom to Top layout.
-
+
+
+ Layout Orientation
-
-
-
- Reverse Direction along with the Flip Orientation results in Left to Right, Top to Bottom, Right to Left and Bottom to Top layout.
-
-
-
+
+
Checked - The layout's flow and text direction will be set in a Right to Left reading pattern.
@@ -1005,7 +1093,9 @@
-
+
+
+
The layout of independent graphs within a group in a model.
@@ -1207,6 +1297,12 @@ Common environments include: extent, output coordinate system, cell size, and ra
smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/GeoprocessingPythonWindowShow16.png">
Send Python code that executes the tool to the Python window.
+
+
+ Send Python code that executes the tool to an active Notebook.
+
+
@@ -1507,10 +1603,12 @@ Common environments include: extent, output coordinate system, cell size, and ra
Create a summary table grouped by the values in the current field. If any of the rows in the table are currently selected, only the values of the selected rows will be calculated.
-
- Creates a point feature class based on x,y values from the highlighted table.
+
+ Creates a point feature class based on coordinate values stored in the selected table.
+
+
+ Makes an event layer based on coordinate values stored in the selected table.
-
Export current table to new table.This layer or standalone table item does not support the export data capability.
@@ -1528,37 +1626,37 @@ Common environments include: extent, output coordinate system, cell size, and ra
-
+
Save the model edits or save the model as a new model in a new location.Make a model the active view.
-
+
Save the model.Make a model the active view.
-
+
Save the model with a new name and new location.Make a model the active view.
-
+
Export model to an image format.Make a model the active view.
-
+
Export model to a Python file.Make a model the active view.
-
+
Export a model to a graphic, a Python file or send the code to Python window.
-
+
Export model to Python and add the code to Python window.Make a model the active view.
@@ -1569,27 +1667,49 @@ Common environments include: extent, output coordinate system, cell size, and ra
-
+
Expands all groups in a Model
-
+
Collapses all groups in a Model
-
+
Create a new empty group or add selected elements to a new group.Make a model the active view.
-
+
Remove all elements from the selected group.Make a model the active view.
- esri_modelbuilder_ungroupButton
+
+
+
+
+
+ Open the message window.
+ The messages are only available after model is run in the current session.
+
+
+
+
+
+ Zoom into modelMake a model the active view.
+
+
+
+
+ Zoom model outMake a model the active view.
+
-
+
Fit model diagram to window so you can see all model elements.Make a model the active view.
@@ -1614,25 +1734,20 @@ Common environments include: extent, output coordinate system, cell size, and ra
-
+
Zoom in on the model.Make a model the active view.
-
+
Zoom out from the model.Make a model the active view.
-
-
+
+
Automatically arrange the elements in a model.Make a model the active view.
-
-
- Automatically arrange the elements in a model.
-
-
Automatically routes the links in a group.
@@ -1649,7 +1764,7 @@ Common environments include: extent, output coordinate system, cell size, and ra
-
+
Open model tool properties.Make a model the active view.
@@ -1666,39 +1781,39 @@ Common environments include: extent, output coordinate system, cell size, and ra
-
+
Specify the environment settings geoprocessing tools should use.Make a model the active view.
-
+
Show ModelBuilder Report.Make a model the active view.
-
+
Open model tool in geoprocessing pane.
-
+
Find and Replace.
-
-
+
+
Cut selected model elements.Make a model the active view.
-
-
+
+
Copy selected model elements.Make a model the active view.
-
-
+
+
Paste the cut or copied model elements.Make a model the active view.
@@ -1718,28 +1833,28 @@ Common environments include: extent, output coordinate system, cell size, and ra
Redo.-->
-
-
+
Remove selected connections.
-
+
Verify all data elements and parameter values are valid.Make a model the active view.
-
+
Run all ready-to-run processes in the model.Make a model the active view.
@@ -1749,7 +1864,7 @@ Common environments include: extent, output coordinate system, cell size, and ra
-
+
Pan in the model. Make a model the active view.
@@ -1759,7 +1874,7 @@ Common environments include: extent, output coordinate system, cell size, and ra
-
+
Select All model elementsMake a model the active view.
@@ -1773,8 +1888,20 @@ Common environments include: extent, output coordinate system, cell size, and ra
View tool messages.
+
+
+
+
+
+
+
+
+
+
-
+
Open model element. If the element is a tool, the tool dialog is opened. If it is a variable, open the variable control to change the value assigned to the variable.
@@ -1783,68 +1910,129 @@ Common environments include: extent, output coordinate system, cell size, and ra
Open model element. If the element is a tool, the tool dialog is opened. If it is a variable, open the variable control to change the value assigned to the variable.
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Remove model parameter.
+
+
+
+
Remove model parameter.
-
-
+
+
Make model parameter. Model parameters are displayed when the model is opened as a geoprocessing tool. Make an output a parameter so that it is added to the map when the tool runs.
-
-
- Unchecking will prevent the output from being added to display or remove the currently added layer from display.
-
+
+
+
+ Remove Add To Display.
+
+
-
-
- Checking will add the output to the map immediately after the output is generated.
+
+
+ When a model is open in the diagram view, checking Add to Display will add the output to the map and unchecking will prevent the output from being added to the map or will remove the current output from the map. To add output to display from a model tool dialog, make the output a model parameter.
+
-
-
- Set the variable to preserve the output data.
+
+
+
+ When the model is open in a diagram view, checking intermediate data will delete the output after the model runs and Delete Intermediate button is clicked from the ribbon. If the model is run from the model tool dialog, anything checked as intermediate will be automatically deleted.
-
-
- Set the variable to delete the data from the workspace.
+
+
+ Remove Intermediate Data
-
+
Run model up to this process.
-
-
- Rename model element.
+
+
+ Rename.
-
-
+
+
Variables are names that store values which can be changed. These values can be layers, dataset paths, numbers, strings, or many other things.Make a model the active view.
-
+
Variables are names that store values which can be changed. These values can be layers, dataset paths, numbers, strings, or many other things.
-
-
+
+
+
Create label.
@@ -2027,7 +2215,7 @@ Common environments include: extent, output coordinate system, cell size, and ra
-
+
Create a new blank geoprocessing model.
A model is a geoprocessing workflow represented as a diagram that strings together a sequence of tools, using the output of one tool as the input to another tool. You create, edit, and manage models in ModelBuilder.Not available yet.
@@ -2061,6 +2249,8 @@ Common environments include: extent, output coordinate system, cell size, and ra
+
+
@@ -2079,12 +2269,12 @@ Common environments include: extent, output coordinate system, cell size, and ra
-
+
Takes the Group and removes all members from the group and deletes the group.
-
+
Rename the Group.
@@ -2094,25 +2284,25 @@ Common environments include: extent, output coordinate system, cell size, and ra
-
+
Auto layout the group elements when a group is selected.
+ largeImage="FME_WB32" smallImage="FME_WB16" helpContextID="120003896" productID="esri_product_datainterop" condition="esri_geoprocessing_DataInterop_installed">
Workbench is a powerful tool for data conversion, sharing, transformation, validation, and integration.Please check that the Data Interoperability Extension is installed and licensed. Administrators may download software from MyEsri according to the instructions in this article: https://support.esri.com/en/technical-article/000018698
+ largeImage="FMEInspector32" smallImage="FMEInspector16" helpContextID="" productID="esri_product_datainterop" condition="esri_geoprocessing_DataInterop_installed">
Data Inspector lets you visualize and explore any format data against an ArcGIS Online background map and optionally export all or selected features to another format.Authorize and enable the Data Interoperability Extension to access this functionality
+ largeImage="FMEQuickTranslator32" smallImage="FMEQuickTranslator16" helpContextID="" productID="esri_product_datainterop" condition="esri_geoprocessing_DataInterop_installed">
Quick Translator allows you to perform simple translations between formats or run a workspace you have previously configured.Authorize and enable the Data Interoperability Extension to access this functionality
@@ -2167,7 +2357,7 @@ Additionally, use Raster Functions and the Raster Function Editor to build custo
-
Change the spatial reference of the data source.
@@ -2250,7 +2440,7 @@ Additionally, use Raster Functions and the Raster Function Editor to build custo
Show the Geoprocessing pane.
- You can search for a specific tool, see a list of favorite and recently run tools, and explore all tools and toolboxes that are included in ArcGIS Pro.
+You can search for a specific tool, see a list of favorite and recently run tools, and explore all tools and toolboxes that are included in ArcGIS Pro.
@@ -2313,9 +2503,6 @@ Additionally, use Raster Functions and the Raster Function Editor to build custo
-
-
-
@@ -2441,7 +2628,7 @@ Additionally, use Raster Functions and the Raster Function Editor to build custo
-
+
@@ -2647,6 +2834,7 @@ Additionally, use Raster Functions and the Raster Function Editor to build custo
+
@@ -2660,6 +2848,7 @@ Additionally, use Raster Functions and the Raster Function Editor to build custo
+
@@ -2721,6 +2910,7 @@ Additionally, use Raster Functions and the Raster Function Editor to build custo
+
@@ -2893,7 +3083,17 @@ Additionally, use Raster Functions and the Raster Function Editor to build custo
-
+
+
+
+
+
+
+ Menu to create points from a standalone table.
+
+
+
+
@@ -2901,7 +3101,7 @@ Additionally, use Raster Functions and the Raster Function Editor to build custo
-
+
@@ -2909,21 +3109,34 @@ Additionally, use Raster Functions and the Raster Function Editor to build custo
-
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
-
+
@@ -2993,9 +3206,9 @@ Additionally, use Raster Functions and the Raster Function Editor to build custo
-
-
-
+
+
+
@@ -3011,9 +3224,9 @@ Additionally, use Raster Functions and the Raster Function Editor to build custo
-
-
-
+
+
+
@@ -3046,26 +3259,26 @@ Additionally, use Raster Functions and the Raster Function Editor to build custo
ModelBuilder Group.
-
+
-
-
-
+
+
+
ModelBuilder Group.
-
+
-
-
-
+
+
+
@@ -3154,7 +3367,7 @@ Additionally, use Raster Functions and the Raster Function Editor to build custo
Show the Geoprocessing pane.
- You can search for a specific tool, see a list of favorite and recently run tools, and explore all tools and toolboxes that are included in ArcGIS Pro.
+You can search for a specific tool, see a list of favorite and recently run tools, and explore all tools and toolboxes that are included in ArcGIS Pro.
@@ -3219,7 +3432,7 @@ Additionally, use Raster Functions and the Raster Function Editor to build custo
disableIfBusy="false"
resizable="true"
largeImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/GeoprocessingTool32.png"
- condition=""
+ condition="esri_mapping_singleLayerSelectedCondition"
helpContextID="">
A gallery of CAD tools.
@@ -3296,7 +3509,14 @@ Additionally, use Raster Functions and the Raster Function Editor to build custo
+
+
+
+
+
+
+
@@ -3353,13 +3573,13 @@ Additionally, use Raster Functions and the Raster Function Editor to build custo
-
-
+
+
-
-
+
+
@@ -3440,8 +3660,11 @@ Additionally, use Raster Functions and the Raster Function Editor to build custo
+
+
+
-
+
@@ -3464,6 +3687,9 @@ Additionally, use Raster Functions and the Raster Function Editor to build custo
+
+
+
diff --git a/DAML/ADMapping.daml.xml b/DAML/ADMapping.daml.xml
index d1fa05e..8ae8d21 100644
--- a/DAML/ADMapping.daml.xml
+++ b/DAML/ADMapping.daml.xml
@@ -12,22 +12,150 @@
+
-
+
+
-
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -115,7 +243,11 @@
-
+
+
+
+
+
@@ -135,7 +267,7 @@
-
+
@@ -163,7 +295,7 @@
-
+
@@ -190,7 +322,7 @@
-
+
@@ -245,6 +377,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -495,9 +665,10 @@
+
+
-
@@ -509,8 +680,9 @@
+
+
-
@@ -595,6 +767,15 @@
+
+
+
+
+
+
+
+
+
@@ -694,6 +875,7 @@
+
@@ -976,6 +1158,7 @@
+
@@ -1113,6 +1296,15 @@
+
+
+
+
+
+
+
+
+
@@ -1141,13 +1333,12 @@
-
+
-
@@ -1157,15 +1348,6 @@
-
-
-
@@ -1236,6 +1418,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1549,6 +1754,12 @@
+
+
+
+
+
+
@@ -1883,6 +2094,9 @@
+
+
+
@@ -1920,7 +2134,7 @@
-
@@ -2023,14 +2237,43 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
@@ -2162,18 +2405,23 @@
-
+
+
+
+
+
+
-
+
-
+
-
+
@@ -2199,14 +2447,20 @@
+
+
+
+
+
+
-
+
-
-
+
+
@@ -2422,7 +2676,7 @@
-
+
@@ -2450,7 +2704,8 @@
-
+
+
@@ -2472,7 +2727,8 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -2539,7 +2813,6 @@
-
@@ -2553,17 +2826,21 @@
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
@@ -2764,6 +3041,13 @@
Copy the selected layers to the clipboard.
+
+
+ A single layer or standalone table must be selected on the Contents pane.
+
+
@@ -3172,7 +3456,7 @@
- Show or hide the Go To XY control.
+ Show or hide the Go To XY control.Available in maps that have a valid coordinate system.
@@ -3200,7 +3484,7 @@
-
+
A visual effect is a rendering technique that can be applied to everything in a scene view to alter the visual and artistic style of the scene.Visual effects are only available for scene views.
@@ -3212,7 +3496,7 @@
-
+
A camera effect is a rendering technique that applies additional physical properties to the scene view camera, like depth of field.Camera effects are only available for scene views.
@@ -3224,7 +3508,7 @@
-
+
Postprocessing effects are rendering techniques used to enhance the final image after the scene has been drawn.Postprocessing effects are only available for scene views.
@@ -3735,7 +4019,7 @@ Ctrl+Alt+C = quick enable
Select LAS points by clicking them or drawing a box around them.
-
+
Deselect all currently selected features.
@@ -3928,6 +4212,13 @@ Ctrl+Alt+C = quick enable
+
+ Enable or disable the snap chip for interactive tools.Enable the snap chip is available only in 2D maps.
+
+
-
+
Add a keyframe using the selected transition.
@@ -4305,6 +4596,47 @@ Ctrl+Alt+C = quick enable
+
+
+
+ Change the area covered by the simulation.Available with an ArcGIS Pro Advanced license.
+
+
+
+
+ Zoom to the simulation area.
+
+
+
+
+ Capture the terrain and configuration to generate a simulation.Available with an ArcGIS Pro Advanced license.
+
+
+
+
+ Clear the cache that was generated to run the simulation.
+
+
+
+
+ Export the analysis results from the simulation.
+
+
+
+
+ Open simulation configuration.Available with an ArcGIS Pro Advanced license.
+
+
+
+
+
+
+
+
+
+
+
+
- Add a flood simulation to the view.Available in scene views only.
+ Add a flood simulation to the view.Available with an ArcGIS Pro Advanced license in scene views only.
+
+
+
+
+ Specify a simulation area by using the selected features.Select the features to use for defining an area.
+
+
+
+
+ Specify a simulation area by using the selected layers.Select the layers to use for defining an area.
+
+
+
+
+ Specify a simulation area by using the map's extent.
-
-
- Remove the flood simulation from the view.Available in scene views only.
+
+
+ Specify a simulation area by using the current camera view.
-
-
- Open a settings dialog for flood simulations.Available in scene views only.
+
+
+ Show move and rotate handles.
+
+
+
+
+ Show scale handles.
+
+
+
+
+ Create a simulation within the specified area.An area needs to be set to create a simulation layer. Available with an ArcGIS Pro Advanced license.
+
+
+
+
+ Cancel creation of a simulation layer.
@@ -4620,6 +4982,13 @@ Ctrl+Alt+C = quick enable
+
+
+ Create a new surface layer for each source.
+
+
+
Zoom to the extent of the selected layers.
@@ -4681,6 +5050,25 @@ Ctrl+Alt+C = quick enable
+
+
+ Allow individual layers to be turned on and off in the group layer.
+
+
+
+
+ Allow only one layer to be turned on in the group layer.
+
+
+
Turns the selected layers on.
@@ -4778,7 +5166,10 @@ Ctrl+Alt+C = quick enable
Pan to the selected features in this layer.
-
+
Deselect the selected features in this layer.Nothing is selected.
@@ -4799,9 +5190,9 @@ Ctrl+Alt+C = quick enable
- Select All in Selected Layer
+ Select all features in layers that currently have a selection.
-
+
Make a copy of this layer using just the currently selected features.
@@ -4810,7 +5201,7 @@ Ctrl+Alt+C = quick enable
-
+
Make a copy of this layer using just the currently selected features.
@@ -4824,7 +5215,7 @@ Ctrl+Alt+C = quick enable
Remove the selected standalone tables from the map.
-
+
Show the properties for the selected table.
@@ -5064,7 +5455,7 @@ Ctrl+Alt+C = quick enable
- Show the display filters pane.Display Filters are not available for layers in a scene.
+ Show the display filters pane.Display filters are unavailable with layers in scenes and some sublayer types.
@@ -5141,7 +5532,7 @@ Ctrl+Alt+C = quick enable
Define a query expression to display only a subset of features in the layer or table.
-
+
Enter a definition query expression to display only a subset of features in the layer or table.
@@ -5392,7 +5783,7 @@ Ctrl+Alt+C = quick enable
+ smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/ModificationAdd16.png" keytip="AM">
Add a mask for the feature scene layer.
@@ -5400,7 +5791,7 @@ Ctrl+Alt+C = quick enable
+ smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/ModificationRemove16.png" keytip="RM">
Remove the mask for the feature scene layer.
@@ -5411,7 +5802,7 @@ Ctrl+Alt+C = quick enable
keytip="EM" >
-
+
+ smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/ModificationMask16.png" keytip="IC" condition="esri_mapping_canRemoveMaskingLayer">
Create a mask to include features.
@@ -5439,7 +5830,7 @@ Ctrl+Alt+C = quick enable
+ smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/ModificationClip16.png" keytip="EX" condition="esri_mapping_canRemoveMaskingLayer">
Create a mask to exclude features.
@@ -5464,7 +5855,7 @@ Ctrl+Alt+C = quick enable
+ smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/ModificationAdd16.png" condition="esri_mapping_canAddIntegratedMeshModification" keytip="AD">
Add modification for integrated mesh.
@@ -5472,10 +5863,10 @@ Ctrl+Alt+C = quick enable
+ keytip="EN" >
-
+
+ smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/ModificationMask16.png" keytip="IM" condition="esri_mapping_canRemoveIntegratedMeshModification">
Mask an area of the integrated mesh.
@@ -5510,7 +5901,7 @@ Ctrl+Alt+C = quick enable
+ smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/ModificationClip16.png" keytip="CP" condition="esri_mapping_canRemoveIntegratedMeshModification">
Clip an area of the integrated mesh.
@@ -5880,7 +6271,7 @@ Click on the button to directly open the Histogram page.
-
+
Add a custom raster processing template.Not supported.
@@ -5911,7 +6302,7 @@ Click on the button to directly open the Histogram page.
-
+
@@ -5975,14 +6366,30 @@ Click on the button to directly open the Histogram page.
-
+
+
+ Save all edits to fields.Save is enabled when there are valid edits to the fields, but disabled if the current project has unsaved feature edits.
+
+
+
+
+ Discard all unsaved edits to fields.There are no unsaved edits to discard.
+
+
+
+
+ Refreshes fields view with the current state of the workspace.There are unsaved edits in the View. Save or discard edits before refreshing the view.
+
+
+
+
Create a new field.
-
+
- Save the modifications to the table.Save is enabled when there are valid edits to the fields, but disabled if the current project contains unsaved feature edits.
+ Delete the selected items.There are no items selected.
@@ -6079,18 +6486,33 @@ Click on the button to directly open the Histogram page.
-
+
+
- Create a new domain.
+ Save all edits to domains.Save is enabled when there are valid edits to the domains, but disabled if the current project has unsaved feature edits.
-
-
+
+
+ Discard all unsaved edits to domains.There are no unsaved edits to discard.
+
+
+
- Save the modifications to the workspace.Save is enabled when there are valid edits to the domains, but disabled if the current project contains unsaved feature edits.
+ Refreshes domains view with the current state of the workspace.There are unsaved edits in the View. Save or discard edits before refreshing the view.
+
+
+ Create a new domain.
+
+
+
+
+ Delete the selected items.There are no items selected.
+
+
Find the domains in use.
@@ -6424,13 +6846,13 @@ Click on the button to directly open the Histogram page.
- Set a feature layer to use for this layer's popups.
+ Set a feature layer to use for this layer's pop-ups.
- Stop using feature layer for this layer's popups.
+ Stop using a feature layer for this layer's pop-ups.
@@ -6514,12 +6936,12 @@ Click on the button to directly open the Histogram page.
-
+
Hide seleced features.
-
+
Show hidden features.
@@ -6632,8 +7054,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
className="esri_mapping:Commands.StartGeorefenceSession"
loadOnClick="false"
largeImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/CadGeoreferencing-32.png"
- smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/CadGeoreferencing-16.png"
- hidden="true">
+ smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/CadGeoreferencing-16.png">
Start 3D georeferencing the currently selected item.This operation is enabled when both of the following are true: a valid item is selected within the Contents pane, and there are no other active georeferencing sessions within this project.
@@ -6646,8 +7067,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
loadOnClick="false"
condition="esri_mapping_GeoreferenceCondition"
largeImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/GeoreferenceMoveDisplay32.png"
- smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/GeoreferenceMoveDisplay16.png"
- hidden="true">
+ smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/GeoreferenceMoveDisplay16.png">
Center the source layer in the current view.
@@ -6657,8 +7077,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
className="esri_mapping:Commands.ElevateToGround" loadOnClick="false"
condition="esri_mapping_GeoreferenceCondition"
largeImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/ElevationGroupToGround32.png"
- smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/ElevationGroupToGround16.png"
- hidden="true">
+ smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/ElevationGroupToGround16.png">
Elevate the source layer to the top of the elevation surface.
@@ -6668,34 +7087,64 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
className="ArcGIS.Desktop.Internal.Mapping.Georeference.Tools.MoveTool" loadOnClick="false"
condition="esri_mapping_GeoreferenceCondition"
largeImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/EditingMoveTool32.png"
- smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/EditingMoveTool16.png"
- hidden="true">
+ smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/EditingMoveTool16.png">
Move the source layer to shift the data into its correct location.
+
+
+ Open a key-in window to move the source layer to shift the data into its correct location.
+
+
+ smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/EditingScaleTool16.png">
Resize the source layer to bring the data to its correct dimension.
+
+
+ Open a key-in window to resize the source layer to bring the data to its correct dimension.
+
+
+ smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/EditingRotateTool16.png">
Rotate the source layer to orient the data in its correct direction.
+
+
+ Open a key-in window to rotate the source layer to orient the data in its correct direction.
+
+ You need to sign-in through ArcGIS.com
condition="esri_mapping_GeoreferenceCondition"
largeImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/EditUndo_B_32.png"
smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/EditUndo_B_16.png"
- hidden="true"
flipImageRTL="true" >
Reset transformations to place the source layer at its original location.
@@ -6717,8 +7165,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
loadOnClick="false"
condition="esri_mapping_GeoreferenceCondition"
largeImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/GenericSave32.png"
- smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/GenericSave16.png"
- hidden="true">
+ smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/GenericSave16.png">
Save the current georeferencing information to a 3D world file for the current drawing.
@@ -6729,8 +7176,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
loadOnClick="false"
condition="esri_mapping_GeoreferenceCondition"
largeImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/EditingSaveEdits_B_32.png"
- smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/EditingSaveEdits_B_16.png"
- hidden="true">
+ smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/EditingSaveEdits_B_16.png">
Save as universal 3D world file.
@@ -6741,8 +7187,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
loadOnClick="false"
condition="esri_mapping_GeoreferenceCondition"
largeImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/EditingSaveEdits_B_32.png"
- smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/EditingSaveEdits_B_16.png"
- hidden="true">
+ smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/EditingSaveEdits_B_16.png">
Save as a new 3D world file.
@@ -6754,8 +7199,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
loadOnClick="false"
condition="esri_mapping_GeoreferenceCondition"
largeImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/Close32.png"
- smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/Close16.png"
- hidden="true">
+ smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/Close16.png">
Close the current georeferencing edit session.
@@ -7101,6 +7545,90 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
largeImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/TrajectoryPointExport32.png">
Export points from trajectory layer.
+
+
+
+ Duplicate layer in ground elevation surface.
+
+
+
+
+
+ Save items in the project as style items in a new style.
+
+
+
+
+
+
+ Click the map to find all images in the oriented imagery layer that depict that location.
+
+
+
+
+ Click on the image to see where that location is on the map, and vice versa.Image should be loaded in the oriented imagery viewer to use this feature.
+
+
+
+
+
+ Toggle visibility of the displayed image’s footprint.
+
+
+
+
+
+ Toggle visibility of all footprints containing the location of interest.
+
+
+
+
+
+ Toggle visibility of all the camera locations of images containing the location of interest.
+
+
+
+
+
+ Removes all overlay graphics and resets the oriented imagery viewer.
+
+
+
+
+
+ Toggle the drawing performance overlay.
+
+
@@ -7136,7 +7664,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
Filter
-
+
Choose a basemap for your map. The basemap is the reference data that displays under the notes and other GIS data you have added to the map.
@@ -7300,7 +7828,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
loadingMessage="Loading ..." disableIfBusy="true" resizable="true" condition="esri_mapping_renderingRulesSupportedCondition" helpContextID="120004005"
dataTemplateFile="pack://application:,,,/ArcGIS.Desktop.Mapping;component/RasterLayer/Ribbon/Templates.xaml" templateID="RenderingRuleItemTemplateID"
largeImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/RasterProcessingTemplate32.png">
- Choose a predefined processing template to apply on the layer.The selected layer is a function raster layer
+ Choose a predefined processing template to apply on the layer.The selected layer does not support the operation.
@@ -7374,6 +7902,15 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
+
+
+ Add an object to interact with the simulation.
+
+
+
You need to sign-in through ArcGIS.com
Choose a rotation type for the raster layer.
-
+
+
+
+
@@ -7659,6 +8201,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
+
@@ -7670,6 +8213,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
+
@@ -7680,6 +8224,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
+
@@ -7689,6 +8234,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
+
@@ -7746,7 +8292,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
-
+
@@ -7763,7 +8309,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
-
+
@@ -7818,7 +8364,8 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
-
+
+
@@ -7843,7 +8390,8 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
-
+
+
@@ -7867,7 +8415,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
-
+
@@ -7881,6 +8429,8 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
+
+
@@ -7899,7 +8449,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
-
+
@@ -7923,7 +8473,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
-
+
@@ -7936,7 +8486,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
-
+
@@ -7949,7 +8499,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
-
+
@@ -8011,7 +8561,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
-
+
@@ -8034,7 +8584,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
-
+
@@ -8054,7 +8604,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
-
+
@@ -8075,15 +8625,31 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
+
+
@@ -8093,8 +8659,14 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
+
+
+
+
+
+
-
+
@@ -8111,7 +8683,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
-
+
@@ -8124,7 +8696,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
-
+
@@ -8149,7 +8721,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
-
+
@@ -8162,9 +8734,20 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
-
+
+
+
+
+
+
+
+
+
+
-
+
+
+
@@ -8173,27 +8756,31 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
+
-
+
+
-
+
+
+
-
+
@@ -8205,7 +8792,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
-
+
@@ -8217,7 +8804,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
-
+
@@ -8228,7 +8815,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
-
+
@@ -8237,6 +8824,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
+
@@ -8244,7 +8832,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
-
+
@@ -8261,7 +8849,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
-
+
@@ -8276,7 +8864,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
-
+
@@ -8289,7 +8877,8 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
-
+
+
@@ -8304,7 +8893,8 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
-
+
+
@@ -8318,7 +8908,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
-
+
@@ -8349,7 +8939,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
-
+
@@ -8391,6 +8981,15 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
+
+
+
+
+
+
+
+
+
@@ -8424,7 +9023,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
-->
-
+
@@ -8435,12 +9034,13 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
+
-
+
@@ -8452,7 +9052,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
-
+
@@ -8469,7 +9069,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
-
+
@@ -8543,7 +9143,7 @@ This tool consumes credits.You need to sign-in through ArcGIS.com
-
+
@@ -8929,6 +9529,11 @@ The active mode simulates the view as if color blind in one of three primary con
+
+
+
+
+
@@ -8936,11 +9541,6 @@ The active mode simulates the view as if color blind in one of three primary con
-
-
-
-
-
@@ -9102,8 +9702,6 @@ The active mode simulates the view as if color blind in one of three primary con
-
-
@@ -9171,6 +9769,88 @@ The active mode simulates the view as if color blind in one of three primary con
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -9236,6 +9916,12 @@ The active mode simulates the view as if color blind in one of three primary con
+
+
+
+
+
+
@@ -9260,6 +9946,10 @@ The active mode simulates the view as if color blind in one of three primary con
delayLoadMessage="Find routes corresponding x, y location with measure values" hasHelp="true" helpContextID="120002895">
+
+
+
+
@@ -9284,6 +9974,11 @@ The active mode simulates the view as if color blind in one of three primary con
+
+
+
+
+
@@ -9384,7 +10079,7 @@ The active mode simulates the view as if color blind in one of three primary con
-
+
@@ -9495,6 +10190,9 @@ The active mode simulates the view as if color blind in one of three primary con
+
+
+
@@ -9556,6 +10254,19 @@ The active mode simulates the view as if color blind in one of three primary con
+
+
+
+
+
+
+
+
+
@@ -9577,7 +10288,6 @@ The active mode simulates the view as if color blind in one of three primary con
-
@@ -9603,6 +10313,9 @@ The active mode simulates the view as if color blind in one of three primary con
+
+
+
@@ -9660,6 +10373,9 @@ The active mode simulates the view as if color blind in one of three primary con
+
+
+
@@ -9676,6 +10392,9 @@ The active mode simulates the view as if color blind in one of three primary con
+
+
+
@@ -9712,9 +10431,9 @@ The active mode simulates the view as if color blind in one of three primary con
-
+
+
+
@@ -9751,6 +10470,9 @@ The active mode simulates the view as if color blind in one of three primary con
+
+
+
@@ -9859,6 +10581,9 @@ The active mode simulates the view as if color blind in one of three primary con
+
+
+
@@ -9940,11 +10665,11 @@ The active mode simulates the view as if color blind in one of three primary con
+ insert="after" placeWith="esri_core_SecurityPropertyPage">
+ insert="after" placeWith="esri_mapping_navigationPropertyPage">
+
+
+
+
+
+
@@ -10473,9 +11204,6 @@ The active mode simulates the view as if color blind in one of three primary con
-
-
-
@@ -10556,29 +11284,40 @@ The active mode simulates the view as if color blind in one of three primary con
-
-
-
+
+
+
-
-
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
@@ -10587,7 +11326,6 @@ The active mode simulates the view as if color blind in one of three primary con
-
@@ -10710,6 +11448,51 @@ The active mode simulates the view as if color blind in one of three primary con
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -10882,6 +11665,7 @@ The active mode simulates the view as if color blind in one of three primary con
+
@@ -11128,7 +11912,6 @@ The active mode simulates the view as if color blind in one of three primary con
-
@@ -11139,6 +11922,9 @@ The active mode simulates the view as if color blind in one of three primary con
+
+
+
@@ -11197,7 +11983,10 @@ The active mode simulates the view as if color blind in one of three primary con
-
+
+
+
+
@@ -11361,6 +12150,7 @@ The active mode simulates the view as if color blind in one of three primary con
+
@@ -11507,25 +12297,10 @@ The active mode simulates the view as if color blind in one of three primary con
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
@@ -11540,7 +12315,6 @@ The active mode simulates the view as if color blind in one of three primary con
-
@@ -11552,6 +12326,7 @@ The active mode simulates the view as if color blind in one of three primary con
+
@@ -11577,6 +12352,9 @@ The active mode simulates the view as if color blind in one of three primary con
+
+
+
@@ -11585,6 +12363,9 @@ The active mode simulates the view as if color blind in one of three primary con
+
+
+
@@ -11697,6 +12478,7 @@ The active mode simulates the view as if color blind in one of three primary con
+
@@ -11805,9 +12587,17 @@ The active mode simulates the view as if color blind in one of three primary con
+
+
+
+
+
+
+
+
@@ -11893,6 +12683,9 @@ The active mode simulates the view as if color blind in one of three primary con
+
+
+
@@ -11932,7 +12725,12 @@ The active mode simulates the view as if color blind in one of three primary con
-
+
+
+
+
+
+
@@ -12167,8 +12965,12 @@ The active mode simulates the view as if color blind in one of three primary con
-
+
+
+
+
+
@@ -12327,7 +13129,10 @@ The active mode simulates the view as if color blind in one of three primary con
-
+
+
+
+
@@ -12447,6 +13252,7 @@ The active mode simulates the view as if color blind in one of three primary con
+
@@ -12580,15 +13386,7 @@ The active mode simulates the view as if color blind in one of three primary con
-
-
-
-
-
-
-
-
-
+
@@ -12639,6 +13437,16 @@ The active mode simulates the view as if color blind in one of three primary con
+
+
+
+
+
+
+
+
+
+
@@ -12706,6 +13514,7 @@ The active mode simulates the view as if color blind in one of three primary con
+
@@ -12738,6 +13547,7 @@ The active mode simulates the view as if color blind in one of three primary con
+
@@ -12745,6 +13555,7 @@ The active mode simulates the view as if color blind in one of three primary con
+
@@ -12833,6 +13644,7 @@ The active mode simulates the view as if color blind in one of three primary con
+
@@ -12852,6 +13664,7 @@ The active mode simulates the view as if color blind in one of three primary con
+
@@ -13106,7 +13919,15 @@ The active mode simulates the view as if color blind in one of three primary con
-
+
+
+
+
+
+
+
+
+
@@ -13190,7 +14011,6 @@ The active mode simulates the view as if color blind in one of three primary con
-
@@ -13201,6 +14021,8 @@ The active mode simulates the view as if color blind in one of three primary con
+
+
@@ -13210,6 +14032,7 @@ The active mode simulates the view as if color blind in one of three primary con
+
@@ -13236,7 +14059,6 @@ The active mode simulates the view as if color blind in one of three primary con
-
@@ -13246,6 +14068,36 @@ The active mode simulates the view as if color blind in one of three primary con
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -13264,9 +14116,7 @@ The active mode simulates the view as if color blind in one of three primary con
-
-
-
+
@@ -13349,18 +14199,14 @@ The active mode simulates the view as if color blind in one of three primary con
-
-
-
+
-
-
-
+
@@ -13397,6 +14243,13 @@ The active mode simulates the view as if color blind in one of three primary con
+
+
+
+
+
+
+
@@ -13625,6 +14478,10 @@ The active mode simulates the view as if color blind in one of three primary con
+
+
+
+
@@ -13632,10 +14489,23 @@ The active mode simulates the view as if color blind in one of three primary con
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DAML/ArcGISLayout.daml.xml b/DAML/ArcGISLayout.daml.xml
index a939e59..ac59198 100644
--- a/DAML/ArcGISLayout.daml.xml
+++ b/DAML/ArcGISLayout.daml.xml
@@ -10,6 +10,88 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -64,7 +146,7 @@
-
+
@@ -222,6 +304,9 @@
delayLoadMessage="Print Layout...">
+
+
+
@@ -469,9 +554,9 @@
caption="Show"
hidden="true"
smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/Rulers16.png">
-
-
-
+ size="middle"/>
@@ -1214,7 +1297,7 @@
+ extendedCaption="Select layout elements">
@@ -1418,8 +1501,7 @@
- 1. Pan
- 2. Zoom
- 3. Continuous zoom
-
- Quick shortcuts:
- Shift = zoom rectangle
- Insert = zoom to full page
- C = explore when using another tool
- < = previous extent
- > = next extent
+1. Pan
+2. Zoom
+3. Continuous zoom
+
+Quick shortcuts:
+Shift = zoom rectangle
+Insert = zoom to full page
+C = explore when using another tool
+< = previous extent
+> = next extent
@@ -2560,7 +2641,7 @@
condition="esri_layouts_condition"
helpContextID="">
- Zoom to display elements at their actual size.
+ Zoom to display the layout at 100%. At this zoom level the size on the screen matches the size of the page if it were printed.
@@ -3362,7 +3443,7 @@
smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/LayoutSelectTool16.png"
caption="Select"
extendedCaption="Layout"
- condition="esri_layouts_layoutPaneCondition"
+ condition="esri_layouts_layoutPaneOrAnyReportPaneCondition"
helpContextID=""
flipImageRTL="true">
@@ -4725,18 +4806,6 @@
-
-
- View the calculated rotation angle of the north arrow.
-
-
-
+
+
+
+
+
+
+
+
+
+
+
@@ -7374,6 +7481,16 @@
+
+
+
+
+
+
+
@@ -7401,6 +7518,16 @@
smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/NewRelatedReport16.png">
+
+
+
+
+
+
+
@@ -7410,7 +7537,7 @@
keytip="DT"
extendedCaption="Gallery"
itemsInRow="3"
- itemWidth="154"
+ itemWidth="170"
resizable="true"
showGroup="true"
showHelp="true"
@@ -7518,6 +7645,73 @@
+
+
+ Zoom to the extent of the selected elements.
+
+
+
+
+ Zoom to the width of the page.
+
+
+
+
+ Zoom to display elements at their actual size.
+
+
+
+
+ Go to the previous extent.
+
+
+
+
+ Go to the next extent.
+
+
+
+
+ Create a new custom report template. Cannot create a new template. The default template file is missing.
+
+
+
+
+ Create a new custom report template. Cannot create a new template. The default template file is missing.
+
+
+
+
+ Open a custom report template.
+
+
+
+
+ Open a custom report template.
+
+
+
+
+ Save the template edits or save the template as a new template in a new location.Template has not been edited.
+
+
+
+
+ Save the template.Template has not been edited.
+
+
+
+
+ Save the template with a new name and new location.Make a template the active view.
+
+
+
+
+ Create a new report using the active template.Make a template the active view.
+
+
Show the properties for the report.
@@ -7691,7 +7996,7 @@
caption="Properties"
extendedCaption="Open report properties"
smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/GenericProperties16.png"
- condition="esri_reports_reportPane"
+ condition="esri_reports_anyReportPane"
helpContextID="">
Show the properties for the report section.
@@ -7702,7 +8007,7 @@
caption="Properties"
extendedCaption="Properties for the Related Report."
smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/GenericProperties16.png"
- condition="esri_reports_reportPane"
+ condition="esri_reports_anyReportPane"
helpContextID="">
Show the properties for the Related Report.
@@ -7713,7 +8018,7 @@
caption="Properties"
extendedCaption="Open page setup properties"
smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/GenericProperties16.png"
- condition="esri_reports_reportPane"
+ condition="esri_reports_anyReportPane"
helpContextID="">
Show the properties for the report.
@@ -7776,12 +8081,13 @@
+ helpContextID=""
+ loadOnClick="false">
Add a Related Report into the report.Activate a Details or Related Report subsection.
@@ -7789,14 +8095,29 @@
+ helpContextID=""
+ loadOnClick="false">
+
+ Add a Related Report into the report.Cannot create a new related report template. The default template file is missing.
+
+
+
- Add a Related Report into the report.
+ Add a Related Report into the report template.Cannot create a new related report template. Activate a Details or Related Report subsection, or the default template file is missing.
Add a supplemental page into the report.Select a Report section in the Contents pane.
@@ -7849,13 +8170,41 @@
Add a subreport into the report.Select a Report section in the Contents pane.
+
+
+ Add a new template subreport into the report template.The default template file is missing.
+
+
+
+
+ Add an existing template subreport into the report template.Select a Report section in the Contents pane.
+
+
Add a supplemental page into the report above this section.Select a Report section in the Contents pane.
@@ -7867,7 +8216,7 @@
className="esri_reports_module:Commands.AddReportSupplementalPageBelow"
smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/AddSupplementalPageBelow16.png"
largeImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/AddSupplementalPageBelow32.png"
- condition="esri_reports_reportPane"
+ condition="esri_reports_anyReportPane"
helpContextID="">
Add a supplemental page into the report below this section.Select a Report section in the Contents pane.
@@ -7897,13 +8246,61 @@
Add a subreport into the report below this section.Select a Report section in the Contents pane.
+
+
+ Add a new template subreport into the report template above this section.Select a Report section in the Contents pane.
+
+
+
+
+ Add a new template subreport into the report template below this section.Select a Report section in the Contents pane.
+
+
+
+
+ Add an existing template subreport into the report template above this section.Select a Report section in the Contents pane.
+
+
+
+
+ Add an existing template subreport into the report template below this section.Select a Report section in the Contents pane.
+
+
@@ -7916,7 +8313,7 @@
className="esri_reports_module:Commands.MoveReportSectionElementDown"
smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/GenericBlueDownArrowLongTail16.png"
largeImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/GenericBlueDownArrowLongTail32.png"
- condition="esri_reports_reportPane"
+ condition="esri_reports_anyReportPane"
helpContextID=""
loadOnClick="false">
@@ -7941,7 +8338,7 @@
className="esri_reports_module:Commands.RemoveReportSupplementalPage"
smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/GenericDeleteRed16.png"
largeImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/GenericDeleteRed32.png"
- condition="esri_reports_reportPane"
+ condition="esri_reports_anyReportPane"
helpContextID="">
Remove the supplemental page from the report.Select a supplemental page section in the Contents pane.
@@ -7976,20 +8373,31 @@
caption="Include Page Numbers"
extendedCaption="Add page numbers to supplemental page"
className="ArcGIS.Desktop.Internal.Reports.Ribbon.IncludePageNumbersButton"
- condition="esri_reports_supplementalPageSectionActiveCondition"
+ condition="esri_reports_supplementalPageIncludeNumbersCondition"
helpContextID=""
loadOnClick="false">
Include page numbers on this page when exporting the report.A layout page section must be selected in the Contents pane, or the layout is missing or invalid.
+
+
+ Start supplemental page on a new page.A layout page section must be selected in the Contents pane, or the layout is missing or invalid.
+
+
@@ -8055,7 +8463,17 @@
Open the Grouping and Sorting options for the report or related report.Select a Report or Related Report section.
-
+
+
+ Delete the selected items. For items that reference a file or folder on disk, the file or folder is deleted in the file system.
+
+
+
+
+
+
+ Show or hide the rulers.
+
+
+
+
+ Show or hide the guides.
+
+
+
Activate a Group Header, Details or Group Footer subsection.
+
+
+ Add multiple field elements to the report template.Activate the Details subsection.
+
+
@@ -8223,6 +8681,29 @@
+
+
+1. Pan
+2. Zoom
+3. Continuous zoom
+
+Quick shortcuts:
+Shift = zoom rectangle
+Insert = zoom to full page
+C = explore when using another tool
+< = previous extent
+> = next extent
+
+
+
- Insert a dynamic picture on the report based on a field or expression.Activate the Details subsection.
+ Insert a dynamic picture on the report based on a field or expression.Activate a Group Header, Details, or Group Footer subsection.
-
-
+
+
+ Select elements by clicking them or dragging a box around them.
+
+
+
+
+ Select elements by drawing a polygon around them.
+
+
+
+
+ Select elements by drawing a freehand shape around them.
+
+
+
+
+ Select elements by dragging a circle around them.
+
+
+
+
+ Select elements by drawing a line that intersects them.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -->
+
@@ -8590,7 +9166,7 @@
-
+
+
+
+
+
+
+
+
+
+
+
@@ -8617,7 +9205,7 @@
separator="true"/>
-
+
@@ -8717,6 +9305,7 @@
+
@@ -8731,6 +9320,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Add report section above selected section.
+
+
+
+
+
+
+
+
+ Add report section below selected section.
+
+
+
+
+
+
-
+
@@ -8798,7 +9430,7 @@
separator="true"/>
-
+
@@ -8847,7 +9479,7 @@
separator="true"/>
-
+
@@ -8862,7 +9494,6 @@
-
@@ -8872,7 +9503,18 @@
smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/Report16.png"
isClosable="true"
defaultTab="esri_reports_homeTab"
- defaultTool="esri_layouts_selectByRectangleTool"
+ defaultTool="esri_reports_selectByRectangleTool"
+ isDropTarget="false">
+
+
+
+
@@ -8882,21 +9524,24 @@
-
+
+
+
+
-
-
+
@@ -8918,7 +9563,15 @@
-
+
+
+
+
+
+
+
+
+
@@ -8936,8 +9589,8 @@
size="middle"/>
-
-
+
+ -->
+
+
+
+
-
+
- Create a new presentation. The new presentation is saved within the project.
+ Create a new presentation and add it to the project. The new presentation is saved within the project.
@@ -8979,33 +9636,51 @@
Select elements by clicking them or dragging a box around them.
-
-
+
+
- Select all elements.
+ Navigate the page.
+
+
+
+
+
+ Show the Page Properties pane.
+
+
+
+
+
+ Activate the map to navigate and interact with the map.
-
+
- Insert a new map page to the presentation.
+ Select all elements.
-
-
+
+
Insert a new image page to the presentation.
-
-
+
+
Insert a new video page to the presentation.
-
+
Insert a new blank page to the presentation.
@@ -9017,12 +9692,12 @@
- Go to the previous extent.The earliest extent is reached. Or, if you are mapping a location device, turn off its auto-navigation mode.
+ Go to the previous extent.The earliest extent is reached.
- Go to the next extent.The latest extent is reached. Or, if you are mapping a location device, turn off its auto-navigation mode.
+ Go to the next extent.The latest extent is reached.
@@ -9033,12 +9708,12 @@
- Go to the previous extent.The earliest extent is reached. Or, if you are mapping a location device, turn off its auto-navigation mode.
+ Go to the previous extent.The earliest extent is reached.
- Go to the next extent.The latest extent is reached. Or, if you are mapping a location device, turn off its auto-navigation mode.
+ Go to the next extent.The latest extent is reached.
@@ -9086,6 +9761,73 @@
Copy selection to the clipboard.
+
+
+
+ Start presenting in full screen mode.
+
+
+
+
+
+
+
+
+
+ Export the pages to a video or a set of images.
+
+
+
+
+
+ Picture
+
+
+
+
+
+ Select elements by clicking them or dragging a box around them.
+
+
+
+
+
+1. View pop-ups and pan
+2. Zoom, rotate / tilt (3D-only)
+3. Zoom continuous
+
+Quick shortcuts:
+Shift = zoom rectangle
+Ctrl = view pop-ups within rectangle
+N = point north
+B = look around (in 3D)
+C = explore when using another tool
+V = rotate / tilt
+Ctrl+Alt+C = quick enable
+
+
+
@@ -9096,6 +9838,7 @@
extendedCaption="Gallery"
keytip="MG"
loadOnClick="false"
+ condition="esri_projectHasMapsCondition"
itemsInRow="3"
itemWidth="140"
itemHeight="115"
@@ -9105,10 +9848,11 @@
resizable="true"
dataTemplateFile="pack://application:,,,/ArcGIS.Desktop.Layouts;component/Presentations/PresentationGalleryTemplates.xaml"
templateID="MapPageTemplate"
- largeImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/MapFrameNew32.png"
+ largeImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/InsertNewMapPage32.png"
helpContextID="">
- Insert a new map page to the presentation.
+ Insert a new map page to the presentation.
+ A map page requires a map or a scene within the project.
@@ -9129,6 +9873,35 @@
Zoom to, create, or manage bookmarks for maps within your project.
+
+
+
+
+
+
+
+
+
+ Insert a new graphic element.
+
+
+
+
@@ -9149,13 +9922,99 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -9169,6 +10028,11 @@
+
+
+
+
+
@@ -9177,7 +10041,7 @@
+ defaultTab="esri_presentations_homeTab" defaultTool="esri_presentations_pageNavigaionTool">
@@ -9203,12 +10067,21 @@
+
+
+
@@ -9469,6 +10342,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -9618,6 +10526,7 @@
+
@@ -9628,12 +10537,22 @@
+
+
+
+
+
+
+
+
+
+
@@ -9643,6 +10562,7 @@
+
@@ -9899,6 +10819,7 @@
+
@@ -10023,6 +10944,7 @@
+
@@ -10154,7 +11076,10 @@
-
+
+
+
+
@@ -10168,7 +11093,10 @@
-
+
+
+
+
@@ -10179,7 +11107,10 @@
-
+
+
+
+
@@ -10187,7 +11118,10 @@
-
+
+
+
+
@@ -10195,7 +11129,10 @@
-
+
+
+
+
@@ -10203,7 +11140,10 @@
-
+
+
+
+
@@ -10211,7 +11151,10 @@
-
+
+
+
+
@@ -10220,7 +11163,10 @@
-
+
+
+
+
@@ -10228,7 +11174,10 @@
-
+
+
+
+
@@ -10236,7 +11185,10 @@
-
+
+
+
+
@@ -10244,13 +11196,19 @@
-
+
+
+
+
-
+
+
+
+
@@ -10260,7 +11218,10 @@
-
+
+
+
+
@@ -10270,7 +11231,10 @@
-
+
+
+
+
@@ -10287,7 +11251,10 @@
-
+
+
+
+
@@ -10306,7 +11273,10 @@
-
+
+
+
+
@@ -10321,9 +11291,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
@@ -10337,6 +11324,16 @@
+
+
+
+
+
+
+
+
+
+
@@ -10346,7 +11343,10 @@
-
+
+
+
+
@@ -10356,6 +11356,15 @@
+
+
+
+
+
+
+
+
+
@@ -10392,6 +11401,13 @@
+
+
+
+
+
+
+
@@ -10401,7 +11417,7 @@
-
+
@@ -10411,7 +11427,7 @@
-
+
@@ -10420,7 +11436,7 @@
-
+
@@ -10434,5 +11450,9 @@
+
+
+
+
diff --git a/DAML/DataReviewer.daml.xml b/DAML/DataReviewer.daml.xml
index 961572b..b1c700b 100644
--- a/DAML/DataReviewer.daml.xml
+++ b/DAML/DataReviewer.daml.xml
@@ -281,12 +281,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
@@ -295,6 +307,13 @@
+
+
+
+
+
+
+
-
@@ -518,7 +538,14 @@ Results are organized by session and stored in feature classes and tables in eit
You must have an active Reviewer Results session open or a default Reviewer Results session specified in your project.
-
+
+
+
+ Browse features selected in your map and create error results for features that fail visual review.
+ You must have a Data Reviewer extension licensed.
+
+
+
Zoom to selected features
@@ -548,7 +575,12 @@ Results are organized by session and stored in feature classes and tables in eit
-
+
+
+
+
+
@@ -645,6 +677,10 @@ Results are organized by session and stored in feature classes and tables in eit
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -267,6 +286,7 @@
+
@@ -349,6 +369,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -523,7 +558,6 @@
-
@@ -540,7 +574,6 @@
-
@@ -563,7 +596,6 @@
-
@@ -573,7 +605,6 @@
-
@@ -583,7 +614,6 @@
-
@@ -988,6 +1018,9 @@
+
+
+
@@ -1224,12 +1257,15 @@
-
+
-
+
@@ -1256,7 +1292,9 @@
-
+
@@ -1278,7 +1316,8 @@
-
+
@@ -1295,7 +1334,8 @@
-
+
@@ -1311,16 +1351,19 @@
-
+
-
+
-
+
@@ -1328,26 +1371,32 @@
-
+
-
+
-
+
-
+
-
+
-
+
@@ -1356,7 +1405,8 @@
-
+
@@ -1364,12 +1414,14 @@
-
+
-
+
@@ -1377,59 +1429,72 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -1437,20 +1502,24 @@
-
+
-
+
-
+
-
+
@@ -1459,10 +1528,12 @@
-
+
-
+
@@ -1480,6 +1551,7 @@
+
@@ -1554,12 +1626,12 @@
-
+
-
+
@@ -1581,9 +1653,13 @@
-
+
-
+
+
+
+
+
@@ -1703,6 +1779,15 @@
+
+
+
+
+
+
+
+
+
@@ -1767,7 +1852,8 @@
condition="esri_mapping_FeatureLayerRematchAddressesCondition"
delayLoadMessage="Add a geocoded feature class to the map to get started."
disableIfBusy="true"
- hasHelp="false">
+ helpContextID="120001440"
+ hasHelp="true">
+ helpContextID="120004143">
+
+
+
+
+
@@ -1891,6 +1990,23 @@
condition="esri_editing_CanEnableEditingCondition">
Click to disable editing tools and feature templates.
+
+ Click to enable editing tools and feature templates.
+
+
+ Click to disable editing tools and feature templates.
+
+ className="PushPullTool">
Sketch a new multipatch geometry on the scene.Requires a local scene view.
@@ -2195,7 +2311,7 @@
Trace Traverse.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
Create a finished circular multipatch feature.
-
+
Create a finished rectangular or square multipatch feature.
@@ -2673,11 +2789,11 @@
Extrudes a roof to the ground.
-
+
Create a multipatch face offset outline.
@@ -2695,7 +2811,7 @@
-
-
-
-
+
Create annotation that constrains its location relative to the edge of a feature.
-
-
-
-
-
-
-
-
+
+
+ Reverse the direction of the currently selected course.
+
+
- Create features by entering a traverse.
+ Enter a sequence of COGO dimensions to create a traverse of lines or a polygon.
-
-
- Set the highest value for automatic closure.
+
+
+ Set additional options for creating or modifying a traverse.
@@ -4374,11 +4500,11 @@
largeImage="SetParcelsAsHistoric32"
smallImage="SetParcelsAsHistoric16"
licenseLevel="standard"
- condition="esri_editing_activeRecordAndParcelPolygonsOrLinesSelectedCondition"
+ condition="esri_editing_activeRecordAndParcelPolygonsOrLinesOrPointsSelectedCondition"
categoryRefID="esri_editing_CommandList"
disableIfBusy="true">
- Sets all selected parcels as historic. All selected parcels will be retired by the current active record.Available only when there is an active record set in the map and there are selected parcels or lines.
+ Set the selected parcels, lines or points as historic. Selected parcel features will be retired by the active record.Available only when there is an active record in the map and parcels, lines or points are selected.
@@ -4389,11 +4515,11 @@
largeImage="SetParcelsAsCurrent32"
smallImage="SetParcelsAsCurrent16"
licenseLevel="standard"
- condition="esri_editing_parcelPolygonOrLinesSelectedCondition"
+ condition="esri_editing_parcelPolygonOrLinesOrPointsSelectedCondition"
categoryRefID="esri_editing_CommandList"
disableIfBusy="true">
- Sets all selected parcels as current. All selected parcels will have the retired by record ID cleared.Available only when there are selected parcels or lines.
+ Set the selected parcels, lines or points as current. Selected parcel features will no longer be retired by a record.Available only when historic parcels, lines or points are selected.
@@ -4408,7 +4534,7 @@
categoryRefID="esri_editing_CommandList"
disableIfBusy="true">
- Shrink selected parcels to seeds.Available only when there are selected parcels.
+ Replace the selected parcel polygons with seeds. Parcel lines can be edited or modified. Use Reconstruct From Seeds to rebuild the parcels after modfying lines.Available only when at least one parcel is selected.
@@ -4422,7 +4548,7 @@
categoryRefID="esri_editing_CommandList"
disableIfBusy="true">
- Reconstruct parcels from seeds in the current extent.
+ Reconstruct parcels from lines enclosing seeds in the map extent. An active record is not required to reconstruct parcels. Use the Reconstruct From Seeds tool with the Shrink To Seeds tool to replace parcels with seeds, modify parcel lines and rebuild parcels.
@@ -4437,8 +4563,8 @@
condition="esri_editing_parcel_activeRecordAndCopyToFeaturesSelectedCondition"
categoryRefID="esri_editing_CommandList"
disableIfBusy="true">
-
- Copy selected parcels or lines to the parcel type chosen on the Copy Lines To dialog box. Use the copied features to create new parcels in the active record.Available only when there is an active record set in the map and there are selected features.
+
+ Copy the selected lines to the active record and chosen parcel type. Use the copied lines to build parcels in the active record.Available only when there is an active record in the map and line features are selected./>
@@ -4454,7 +4580,7 @@
categoryRefID="esri_editing_CommandList"
disableIfBusy="true">
- Create parcel seeds for lines forming enclosed loops in the map extent. Parcel seeds will be associated to the active parcel record.Available only when an active record has been set in the map.
+ Create parcel seeds for closed loops of lines in the map extent. Seeds are only created for loops of lines associated with the active record. Seeds are used to build parcels from lines.Available only when there is an active record in the map.
@@ -4470,7 +4596,7 @@
categoryRefID="esri_editing_CommandList"
loadOnClick="false">
- Build parcels in the map extent.
+ Build parcels from lines and seeds or polygons in the map extent. Build Extent creates missing parcel features. Build Extent can build up to 1,000 parcels in the map extent."
@@ -4486,7 +4612,7 @@
categoryRefID="esri_editing_CommandList"
loadOnClick="false">
- Build parcels in the active record.Available only where there is an active record set in the map. Set a record as active in the map to build parcels associated to that record.
+ Build parcels from lines and seeds or polygons in the active record. Build creates missing parcel features and associates them to the active record.Available only when there is an active record in the map.
@@ -4501,7 +4627,7 @@
categoryRefID="esri_editing_CommandList"
disableIfBusy="true">
- Delete the selected parcels.Available only when there are selected parcels.
+ Delete parcels in the parcel fabric. Deletes associated lines and points if they are not used by any other parcel, current or historic. If the Preserve field of a point is set to Yes, the point is not deleted.Available only when there are selected parcels.
@@ -4516,7 +4642,7 @@
categoryRefID="esri_editing_CommandList"
disableIfBusy="true">
- Transfer a parcel between source and target parcels.Available only when there is an active record in the map.
+ Transfer a parcel of land between source and target parcels.Available only when there is an active record in the map.
@@ -4531,7 +4657,7 @@
categoryRefID="esri_editing_CommandList"
disableIfBusy="true">
- Reconstruct Parcel Boundaries.
+ Create individual parcel lines for parcel edges and generate missing COGO dimensions.Available only when parcels are selected.
@@ -4560,13 +4686,13 @@
disableIfBusy="true"
loadOnClick="false">
- Create a new parcel fabric record. Records store information about the legal record such as record type and recorded date. Parcels are organized in the parcel fabric by their associated record.
+ Create a parcel fabric record. A record represents the legal document or land transaction that created the parcels. The record will be set as active in the map and new parcel features will be associated with the active record.
-
- Merges collinear parcel boundaries.Available only when there are selected parcel lines or connection lines.
+
+ Merge connected, collinear parcel lines into a single parcel line using an offset tolerance.Available only when there are selected parcel lines or connection lines.
@@ -4592,10 +4718,43 @@
disableIfBusy="true"
loadOnClick="false">
- Merge Parcel Points.
+ Merge selected parcel fabric points to a chosen point. Lines between duplicate points are removed.
+
+
+
+ Set additional options for displaying the parcel lineage.
+
+
+
+
+
+ Show parcel lineage from selected parcel polygon or record features.This tool is not available in 3D views.
+
+
+
+
+
+
+
+ Parcel Lineage using Link Charts.
+
+
+
- Simplifies polygon and line features by replacing consecutive line segments or edges with fewer line segments or edges. Lines segments and polygon edges are simplified based on a specified maximum allowable offset. Additionally, circular arcs can be created from consecutive line segments or polygon edges.
+ Simplify line and polygon features by replacing line segments or edges with fewer line segments or edges.
- Select parcel boundary lines and points based on parcel polygon selection.Available only when there are from 1 to 1000 parcels selected.
+ Select the parcel features of the selected parcel polygons. Parcel lines and points will be added to the selection.Available only when parcel polygons are selected.
@@ -4635,15 +4794,15 @@
largeImage="RecentlyUsed32"
smallImage="RecentlyUsed16">
- Select one of the recently used records.
- Available only when there is a history of active records.
+ Select a recently used record and set it as active in the map.
+ Available only when there is a history of recently used records.
-
+ caption="Point" extendedCaption="Sketch points on the map."
+ largeImage="EditingPointTool32"
+ smallImage="EditingPointTool16"
+ className="CreateLineModeCommand"
+ condition="esri_editing_MapCondition"
+ loadOnClick="false">
Sketch points on the map.
@@ -4753,12 +4912,12 @@
+ caption="Line at right angle" extendedCaption="Sketch lines with right angle on the map."
+ largeImage="EditingRightAngleConstructor32"
+ smallImage="EditingRightAngleConstructor16"
+ className="CreateRightAngleLineModeCommand"
+ condition="esri_editing_LineSketch_condition"
+ loadOnClick="false">
Sketch lines with right angle on the map.
@@ -4940,7 +5099,7 @@
- -->
-
-
-
-
-
-
-
-
+
+
+ Make the right-clicked vertex the origin point of polygon feature.
+
+
+ className="ToggleSelectedVerticesCommand" loadOnClick="false">
Converts a vertex to a control point.
@@ -5706,7 +5873,7 @@
largeImage="EditingControlPointConvertToVertex32"
smallImage="EditingControlPointConvertToVertex16"
condition="esri_editing_ContextSketchControlPointCondition"
- className="DeactivateControlPointCommand" loadOnClick="false">
+ className="ToggleSelectedVerticesCommand" loadOnClick="false">
Converts a control point to a vertex.
@@ -5957,6 +6124,9 @@
Remove the leader or callout line from the selected annotation feature.
+
+ Add, move, or delete leader line vertices and segments for the selected annotation feature.
+ Convert an annotation feature containing multiple words into a series of single-word elements so you can edit the position of individual words. Spaces are used to determine each part.
@@ -6072,6 +6242,24 @@
className="GV_VertexInsertAfterCommand">
Insert after the selected vertices.
+
+
+ Convert the control point to vertex.
+
+
+
+
+ Convert the control point to vertex.
+
+
+
+
+
+ Open the attribute table for this layer.The map service is not configured to support data capabilities.
+
+
Open the attribute table for this layer to show the selected features.No features are selected for this layer.
@@ -7069,6 +7264,11 @@
Turn selected field(s) off to not show here or in any other dialog.
+
+
+ Open the Data Engineering view for the selected field(s) with the field statistics calculated.
+
+
Keep selected field(s) visible when scrolling the table left or right.
@@ -7376,6 +7576,24 @@
+
+
+
+
+
+ Set the appearance of the table.
+
+
+
+
+ Open the application options for the table.
+
+
+
@@ -7619,6 +7837,24 @@
Mark the selected errors as errors.
+
+
+ Mark the selected errors as Acceptable.
+
+
+
+
+ Mark the selected errors as Unacceptable.
+
+
- Click to show only parcels in the active record. Show Only Active can be toggled on or off. If Show Only Active is toggled off, you can set the transparency of parcels that are not part of the active record.Available only when an active record is set and Transparency is turned off.
+ Show only parcels in the active record. Show only Active can be turned on or off. If Show Only Active is turned off, you can set the transparency of parcels that are not part of the active record.
+ Available only when an active record is set and Transparency is turned off.
@@ -8096,7 +8333,8 @@
largeImage="ShowOnlyActive32"
smallImage="ShowOnlyActive16" helpContextID="">
- Click to show only parcels in the active record. If Show Only Active is toggled off, you can set the transparency of parcels that are not part of the active record.Available only when an active record is set.
+ Show only parcels in the active record. Show only Active can be turned on or off. If Show Only Active is turned off, you can set the transparency of parcels that are not part of the active record.
+ Available only when an active record is set and Transparency is turned off.
@@ -8113,8 +8351,8 @@
condition="esri_mapping_mapPane"
largeImage="ManageRecords32"
smallImage="ManageRecords16" helpContextID="">
-
- Search for records by typing a record name or using a search query.
+
+ Search for records and set a record as active in the map.
@@ -8146,7 +8384,7 @@
categoryRefID="esri_editing_CommandList"
condition="esri_editing_EditingMapCondition">
- Show the Align Parcels pane. This allows you to make adjacent parcels coincident using an alignment tolerance and links.
+ Select and align parcels using alignment links generated in an alignment buffer.
@@ -8208,12 +8446,12 @@
-
- Highlight gaps and overlaps in the current extent.
+ Highlight gaps and overlaps for the chosen parcel layer in the current map extent. Gaps and overlaps that are larger than the provided Maximum Width will be highlighted in the specified colors.This command is currently unavailable. Available only when required settings have been chosen. Click the dropdown arrow to choose what layer to use and whether to highlight gaps, overlaps or both.
@@ -8223,11 +8461,11 @@
-
- Clear highlight.
+ Clear highlighted gaps and overlaps in the dashed-line extent boundary.
@@ -8262,7 +8500,7 @@
smallImage="ConsistencyCheck16"
condition="esri_editing_EditingMapCondition" keytip="LSCC" helpContextID="">
- Analyzes the parcel fabric measurement network by running a least-squares adjustment on the input parcels. A free-network least-squares adjustment checks dimensions on parcel lines for inconsistencies and mistakes. Fixed or weighted control points are not used by the adjustment.
+ Use a least-squares adjustment to check parcel line dimensions for blunders and outliers. Adjustment results are stored in adjustment layers that are added to the map.
@@ -8273,7 +8511,7 @@
smallImage="WeightedLeastSquaresAdjustment16"
condition="esri_editing_EditingMapCondition" keytip="LSW" helpContextID="">
- Analyzes the parcel fabric measurement network by running a least-squares adjustment on the input parcels. A weighted least-squares adjustment computes updated coordinates for parcel points. The parcels being adjusted should connect to at least two fixed or weighted control points.
+ Use a least-squares adjustment with control points to estimate updated coordinates for points. Adjustment results are stored in adjustment layers that are added to the map.
@@ -8284,7 +8522,7 @@
smallImage="ApplyLeastSquaresAdjustment16"
condition="esri_editing_EditingMapCondition" keytip="LSA" helpContextID="">
- Applies the results of a least squares adjustment to parcel fabric feature classes.
+ Apply the adjustment results stored in adjustment layers to parcel fabric feature classes.
@@ -8429,7 +8667,7 @@
condition="esri_editing_parcelToolsVisibleCondition"
disableIfBusy="true">
- Search for records by typing a record name or using a search query.
+ Search for records and set a record as active in the map.
@@ -8443,7 +8681,7 @@
condition="esri_editing_parcelFabricFeaturesExtendedSelectedCondition"
disableIfBusy="true">
- Activate the record of the selected feature.No parcel features are selected. Select at least one parcel feature (point, line, polygon, or record).
+ Set the record of the selected feature as the active record in the map.Available only when there are selected parcel features in the map (points, lines, polygons).
@@ -8485,11 +8723,66 @@
condition="esri_editing_activeParcelRecordCondition"
disableIfBusy="true">
- Select the active record in the map.Available only when there is an active record set.
+ Select the active record polygon in the map.Available only when there is an active record set for the map.
+
+
+ Select all the features in the active record.Available only when an active record is set in the map.
+
+
+
+
+
+ Select polygon features in the active record.Available only when an active record is set in the map.
+
+
+
+
+
+ Select line features in the active record.Available only when an active record is set in the map.
+
+
+
+
+
+ Select point features in the active record.Available only when an active record is set in the map.
+
+
+
+
+
+ Select connection line features in the active record.Available only when an active record is set in the map.
+
+
+
-
- Click to select features in the active record.Available only when there is an active record set.
-
@@ -8527,7 +8817,7 @@
condition="esri_editing_activeParcelRecordCondition"
disableIfBusy="true">
- Show active record properties.Available only when there is an active record set.
+ Display the attributes of the active record.Available only when there is an active record set for the map.
@@ -8541,11 +8831,32 @@
condition="esri_editing_parcelToolsVisibleCondition"
disableIfBusy="true">
- Show Heads Up Display options.Available only when there are selected parcels.
+ Set options for displaying the active record control and for displaying record extent warnings.Available only when there are selected parcels.
+
+
+
+
+ Specify a simulation area by sketching a rectangle.
+
+
+
+
+ Specify a simulation area by clicking a center location and a distance from it.
+
+
+
@@ -8622,6 +8933,7 @@
+
@@ -8724,7 +9036,7 @@
-
+
@@ -8765,6 +9077,9 @@
+
+
+
@@ -8882,6 +9197,9 @@
+
+
+
@@ -8897,6 +9215,7 @@
+
@@ -9410,6 +9729,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -9484,7 +9817,7 @@
-
@@ -9492,10 +9825,12 @@
-
+
+
+
@@ -9719,6 +10054,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -9728,11 +10083,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -10092,6 +10465,7 @@
+
@@ -10143,6 +10517,7 @@
+
@@ -10285,6 +10660,7 @@
+
@@ -10409,12 +10785,13 @@
-
-
+
+
+
+
-
@@ -10531,11 +10908,15 @@
+
+
+
+
@@ -10565,6 +10946,8 @@
+
+
@@ -10911,7 +11294,7 @@
showItemCaption="true" showGroup="true" showItemCaptionBelow="true" resizable="true"
condition="esri_editing_parcelToolsVisibleCondition">
- Set the symbology for parcel layers.
+ Choose a configured layer to display data quality errors for features in the parcel fabric.
Available only when there is a parcel fabric in the map.
diff --git a/DAML/NetworkAnalysisUtilityNetwork.daml.xml b/DAML/NetworkAnalysisUtilityNetwork.daml.xml
index 12bb9ea..d77e88f 100644
--- a/DAML/NetworkAnalysisUtilityNetwork.daml.xml
+++ b/DAML/NetworkAnalysisUtilityNetwork.daml.xml
@@ -165,9 +165,10 @@
-
+
+
@@ -556,8 +557,8 @@
smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/SetStartingPoints16.png"
className="esri_networkanalysis_utility_module:ShowModifyStartingPointsWindow"
keytip="SP">
-
- Show the set trace locations pane. This allows you to access commands and tools to set starting points.
+
+ Show the Trace pane. This allows you to access commands and tools to set starting points.
- Show the set trace locations pane. This allows you to access commands and tools to set barriers.
+ Show the Trace pane. This allows you to access commands and tools to set barriers.
+
+
+
+
+ Show the Trace pane. This allows you to access commands and tools to select and run named trace configurations in your network.
- Clear All Trace Locations.
+ Clear all trace locations and unselect named trace configuration.
Select barriers where the trace will terminate.
-
+
+
diff --git a/Examples/Arcade/Arcade.csproj b/Examples/Arcade/Arcade.csproj
new file mode 100644
index 0000000..bffbb38
--- /dev/null
+++ b/Examples/Arcade/Arcade.csproj
@@ -0,0 +1,79 @@
+
+
+
+ net6.0
+ enable
+ enable
+ x64
+
+
+
+ C:\Program Files\ArcGIS\Pro\bin\Extensions\Core\ArcGIS.Desktop.Core.dll
+ False
+
+
+ C:\Program Files\ArcGIS\Pro\bin\Extensions\Mapping\ArcGIS.Desktop.Mapping.dll
+ False
+
+
+ C:\Program Files\ArcGIS\Pro\bin\ArcGIS.Desktop.Framework.dll
+ False
+
+
+ C:\Program Files\ArcGIS\Pro\bin\ArcGIS.Core.dll
+ False
+
+
+ C:\Program Files\ArcGIS\Pro\bin\Extensions\Editing\ArcGIS.Desktop.Editing.dll
+ False
+
+
+ C:\Program Files\ArcGIS\Pro\bin\Extensions\Catalog\ArcGIS.Desktop.Catalog.dll
+ False
+
+
+ C:\Program Files\ArcGIS\Pro\bin\Extensions\DesktopExtensions\ArcGIS.Desktop.Extensions.dll
+ False
+
+
+ C:\Program Files\ArcGIS\Pro\bin\ArcGIS.Desktop.Shared.Wpf.dll
+ False
+
+
+ C:\Program Files\ArcGIS\Pro\bin\Extensions\ArcGISSearch\ArcGIS.Desktop.Search.dll
+ False
+
+
+ C:\Program Files\ArcGIS\Pro\bin\Extensions\DataSourcesRaster\ArcGIS.Desktop.DataSourcesRaster.dll
+ False
+
+
+ C:\Program Files\ArcGIS\Pro\bin\Extensions\GeoProcessing\ArcGIS.Desktop.GeoProcessing.dll
+ False
+
+
+ C:\Program Files\ArcGIS\Pro\bin\Extensions\Layout\ArcGIS.Desktop.Layouts.dll
+ False
+
+
+ C:\Program Files\ArcGIS\Pro\bin\Extensions\Sharing\ArcGIS.Desktop.Sharing.dll
+ False
+
+
+ C:\Program Files\ArcGIS\Pro\bin\Extensions\TaskAssistant\ArcGIS.Desktop.TaskAssistant.dll
+ False
+
+
+ C:\Program Files\ArcGIS\Pro\bin\Extensions\Workflow\ArcGIS.Desktop.Workflow.dll
+ False
+
+
+ C:\Program Files\ArcGIS\Pro\bin\ArcGIS.CoreHost.dll
+ False
+
+
+ C:\Program Files\ArcGIS\Pro\bin\Extensions\DataReviewer\ArcGIS.Desktop.DataReviewer.dll
+ False
+
+
+
diff --git a/Examples/Arcade/Prosnippets.cs b/Examples/Arcade/Prosnippets.cs
new file mode 100644
index 0000000..ae27b33
--- /dev/null
+++ b/Examples/Arcade/Prosnippets.cs
@@ -0,0 +1,851 @@
+/*
+
+ Copyright 2023 Esri
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+using System.Text;
+using System.Windows;
+using System.Windows.Input;
+using ArcGIS.Core.Arcade;
+using ArcGIS.Desktop.Core;
+using ArcGIS.Desktop.Framework;
+using ArcGIS.Desktop.Framework.Contracts;
+using System.Threading.Tasks;
+using System;
+using ArcGIS.Desktop.Catalog;
+using System.Linq;
+using System.Collections.Generic;
+using ArcGIS.Desktop.Mapping;
+using ArcGIS.Desktop.Framework.Threading.Tasks;
+using ArcGIS.Desktop.Layouts;
+using ArcGIS.Desktop.GeoProcessing;
+using System.IO;
+using ArcGIS.Core.CIM;
+using ArcGIS.Desktop.Core.UnitFormats;
+using ArcGIS.Desktop.Core.Events;
+using ArcGIS.Core.Data;
+
+namespace Arcade
+{
+ public class Prosnippets
+ {
+ #region ProSnippet Group: Basic Queries
+ #endregion
+
+ public static void BasicQuery1()
+ {
+ var featLayer = MapView.Active.Map.GetLayersAsFlattenedList()
+ .OfType().FirstOrDefault();
+ if (featLayer == null)
+ return;
+
+ //cref: ArcGIS.Core.CIM.CIMExpressionInfo
+ //cref: ArcGIS.Core.CIM.CIMExpressionInfo.Expression
+ //cref: ArcGIS.Core.CIM.CIMExpressionInfo.ReturnType
+ //cref: ArcGIS.Core.Arcade.ArcadeScriptEngine.CreateEvaluator(ArcGIS.Core.CIM.CIMExpressionInfo,ArcGIS.Core.Arcade.ArcadeProfile)
+ //cref: ArcGIS.Core.Arcade.ArcadeEvaluator.Evaluate(IEnumerable>)
+ //cref: ArcGIS.Core.Arcade.ArcadeEvaluationResult.GetResult()
+ #region Basic Query
+
+ //Consult https://github.com/Esri/arcade-expressions/ and
+ //https://developers.arcgis.com/arcade/ for more examples
+ //and arcade reference
+
+ QueuedTask.Run(() =>
+ {
+ //construct an expression
+ var query = @"Count($layer)";//count of features in "layer"
+
+ //construct a CIMExpressionInfo
+ var arcade_expr = new CIMExpressionInfo()
+ {
+ Expression = query.ToString(),
+ //Return type can be string, numeric, or default
+ //When set to default, addin is responsible for determining
+ //the return type
+ ReturnType = ExpressionReturnType.Default
+ };
+
+ //Construct an evaluator
+ //select the relevant profile - it must support Pro and it must
+ //contain any profile variables you are using in your expression.
+ //Consult: https://developers.arcgis.com/arcade/profiles/
+ using (var arcade = ArcadeScriptEngine.Instance.CreateEvaluator(
+ arcade_expr, ArcadeProfile.Popups))
+ {
+ //Provision values for any profile variables referenced...
+ //in our case '$layer'
+ var variables = new List>() {
+ new KeyValuePair("$layer", featLayer)
+ };
+ //evaluate the expression
+ try
+ {
+ var result = arcade.Evaluate(variables).GetResult();
+ System.Diagnostics.Debug.WriteLine($"Result: {result.ToString()}");
+ }
+ //handle any exceptions
+ catch (InvalidProfileVariableException ipe)
+ {
+ //something wrong with the profile variable specified
+ //TODO...
+ }
+ catch (EvaluationException ee)
+ {
+ //something wrong with the query evaluation
+ //TODO...
+ }
+
+ }
+ });
+
+ #endregion
+ }
+
+ public static void BasicQuery2()
+ {
+ var featLayer = MapView.Active.Map.GetLayersAsFlattenedList()
+ .OfType().FirstOrDefault();
+ if (featLayer == null)
+ return;
+
+ //cref: ArcGIS.Core.CIM.CIMExpressionInfo
+ //cref: ArcGIS.Core.CIM.CIMExpressionInfo.Expression
+ //cref: ArcGIS.Core.CIM.CIMExpressionInfo.ReturnType
+ //cref: ArcGIS.Core.Arcade.ArcadeScriptEngine.CreateEvaluator(ArcGIS.Core.CIM.CIMExpressionInfo,ArcGIS.Core.Arcade.ArcadeProfile)
+ //cref: ArcGIS.Core.Arcade.ArcadeEvaluator.Evaluate(IEnumerable>)
+ //cref: ArcGIS.Core.Arcade.ArcadeEvaluationResult.GetResult()
+ #region Basic Query using Features
+
+ //Consult https://github.com/Esri/arcade-expressions/ and
+ //https://developers.arcgis.com/arcade/ for more examples
+ //and arcade reference
+
+ QueuedTask.Run(() =>
+ {
+ //construct an expression
+ var query = @"$feature.AreaInAcres * 43560.0";//convert acres to ft 2
+
+ //construct a CIMExpressionInfo
+ var arcade_expr = new CIMExpressionInfo()
+ {
+ Expression = query.ToString(),
+ //Return type can be string, numeric, or default
+ //When set to default, addin is responsible for determining
+ //the return type
+ ReturnType = ExpressionReturnType.Default
+ };
+
+ //Construct an evaluator
+ //select the relevant profile - it must support Pro and it must
+ //contain any profile variables you are using in your expression.
+ //Consult: https://developers.arcgis.com/arcade/profiles/
+ using (var arcade = ArcadeScriptEngine.Instance.CreateEvaluator(
+ arcade_expr, ArcadeProfile.Popups))
+ {
+ //we are evaluating the expression against all features
+ using (var rc = featLayer.Search())
+ {
+
+ while (rc.MoveNext())
+ {
+ //Provision values for any profile variables referenced...
+ //in our case '$feature'
+ var variables = new List>() {
+ new KeyValuePair("$feature", rc.Current)
+ };
+ //evaluate the expression (per feature in this case)
+ try
+ {
+ var result = arcade.Evaluate(variables).GetResult();
+ var val = ((double)result).ToString("0.0#");
+ System.Diagnostics.Debug.WriteLine(
+ $"{rc.Current.GetObjectID()} area: {val} ft2");
+ }
+ //handle any exceptions
+ catch (InvalidProfileVariableException ipe)
+ {
+ //something wrong with the profile variable specified
+ //TODO...
+ }
+ catch (EvaluationException ee)
+ {
+ //something wrong with the query evaluation
+ //TODO...
+ }
+ }
+ }
+ }
+ });
+
+ #endregion
+ }
+
+ public static void BasicQuery3()
+ {
+ var featLayer = MapView.Active.Map.GetLayersAsFlattenedList()
+ .OfType().FirstOrDefault();
+ if (featLayer == null)
+ return;
+
+ //cref: ArcGIS.Core.Arcade.ArcadeEvaluator.Evaluate(IEnumerable>)
+ //cref: ArcGIS.Core.Arcade.ArcadeEvaluationResult.GetResult()
+ #region Retrieve features using FeatureSetByName
+
+ //Consult https://github.com/Esri/arcade-expressions/ and
+ //https://developers.arcgis.com/arcade/ for more examples
+ //and arcade reference
+
+ var map = MapView.Active.Map;
+ QueuedTask.Run(() =>
+ {
+ //construct a query
+ var query = new StringBuilder();
+ var layer_name = "USA Current Wildfires - Current Incidents";
+ //https://developers.arcgis.com/arcade/function-reference/featureset_functions/
+ query.AppendLine(
+ $"var features = FeatureSetByName($map,'{layer_name}', ['*'], false);");
+ query.AppendLine("return Count(features);");
+
+ //construct a CIMExpressionInfo
+ var arcade_expr = new CIMExpressionInfo()
+ {
+ Expression = query.ToString(),
+ //Return type can be string, numeric, or default
+ //When set to default, addin is responsible for determining
+ //the return type
+ ReturnType = ExpressionReturnType.Default
+ };
+
+ //Construct an evaluator
+ //select the relevant profile - it must support Pro and it must
+ //contain any profile variables you are using in your expression.
+ //Consult: https://developers.arcgis.com/arcade/profiles/
+ using (var arcade = ArcadeScriptEngine.Instance.CreateEvaluator(
+ arcade_expr, ArcadeProfile.Popups))
+ {
+ //Provision values for any profile variables referenced...
+ //in our case '$map'
+ var variables = new List>() {
+ new KeyValuePair("$map", map)
+ };
+ //evaluate the expression
+ try
+ {
+ var result = arcade.Evaluate(variables).GetResult();
+ System.Diagnostics.Debug.WriteLine($"Result: {result.ToString()}");
+ }
+ //handle any exceptions
+ catch (InvalidProfileVariableException ipe)
+ {
+ //something wrong with the profile variable specified
+ //TODO...
+ }
+ catch (EvaluationException ee)
+ {
+ //something wrong with the query evaluation
+ //TODO...
+ }
+ }
+ });
+
+ #endregion
+ }
+
+ public static void BasicQuery4()
+ {
+ var featLayer = MapView.Active.Map.GetLayersAsFlattenedList()
+ .OfType().FirstOrDefault();
+ if (featLayer == null)
+ return;
+
+ //cref: ArcGIS.Core.Arcade.ArcadeEvaluator.Evaluate(IEnumerable>)
+ //cref: ArcGIS.Core.Arcade.ArcadeEvaluationResult.GetResult()
+ #region Retrieve features using Filter
+
+ //Consult https://github.com/Esri/arcade-expressions/ and
+ //https://developers.arcgis.com/arcade/ for more examples
+ //and arcade reference
+
+ QueuedTask.Run(() =>
+ {
+ //construct a query
+ var query = new StringBuilder();
+ //https://developers.arcgis.com/arcade/function-reference/featureset_functions/
+ query.AppendLine(
+ "var features = Filter($layer, 'DailyAcres is not NULL');");
+ query.AppendLine("return Count(features);");
+
+ //construct a CIMExpressionInfo
+ var arcade_expr = new CIMExpressionInfo()
+ {
+ Expression = query.ToString(),
+ //Return type can be string, numeric, or default
+ //When set to default, addin is responsible for determining
+ //the return type
+ ReturnType = ExpressionReturnType.Default
+ };
+
+ //Construct an evaluator
+ //select the relevant profile - it must support Pro and it must
+ //contain any profile variables you are using in your expression.
+ //Consult: https://developers.arcgis.com/arcade/profiles/
+ using (var arcade = ArcadeScriptEngine.Instance.CreateEvaluator(
+ arcade_expr, ArcadeProfile.Popups))
+ {
+ //Provision values for any profile variables referenced...
+ //in our case '$layer'
+ var variables = new List>() {
+ new KeyValuePair("$layer", featLayer)
+ };
+ //evaluate the expression
+ try
+ {
+ var result = arcade.Evaluate(variables).GetResult();
+ System.Diagnostics.Debug.WriteLine($"Result: {result.ToString()}");
+ }
+ //handle any exceptions
+ catch (InvalidProfileVariableException ipe)
+ {
+ //something wrong with the profile variable specified
+ //TODO...
+ }
+ catch (EvaluationException ee)
+ {
+ //something wrong with the query evaluation
+ //TODO...
+ }
+ }
+ });
+
+ #endregion
+ }
+
+ public static void BasicQuery6()
+ {
+ var featLayer = MapView.Active.Map.GetLayersAsFlattenedList()
+ .OfType().FirstOrDefault();
+ if (featLayer == null)
+ return;
+
+ //cref: ArcGIS.Core.Arcade.ArcadeEvaluator.Evaluate(IEnumerable>)
+ //cref: ArcGIS.Core.Arcade.ArcadeEvaluationResult.GetResult()
+ #region Calculate basic statistics with Math functions
+
+ //Consult https://github.com/Esri/arcade-expressions/ and
+ //https://developers.arcgis.com/arcade/ for more examples
+ //and arcade reference
+
+ QueuedTask.Run(() =>
+ {
+ //construct a query
+ var query = new StringBuilder();
+ //https://developers.arcgis.com/arcade/function-reference/math_functions
+
+ query.AppendLine("var features = Filter($layer, 'DailyAcres is not NULL');");
+
+ query.AppendLine("var count_feat = Count(features);");
+ query.AppendLine("var sum_feat = Sum(features, 'DailyAcres');");
+ query.AppendLine("var max_feat = Max(features, 'DailyAcres');");
+ query.AppendLine("var min_feat = Min(features, 'DailyAcres');");
+ query.AppendLine("var avg_feat = Average(features, 'DailyAcres');");
+
+ query.AppendLine("var answer = [count_feat, sum_feat, max_feat, min_feat, avg_feat]");
+ query.AppendLine("return Concatenate(answer,'|');");
+
+ //construct a CIMExpressionInfo
+ var arcade_expr = new CIMExpressionInfo()
+ {
+ Expression = query.ToString(),
+ //Return type can be string, numeric, or default
+ //When set to default, addin is responsible for determining
+ //the return type
+ ReturnType = ExpressionReturnType.Default
+ };
+
+ //Construct an evaluator
+ //select the relevant profile - it must support Pro and it must
+ //contain any profile variables you are using in your expression.
+ //Consult: https://developers.arcgis.com/arcade/profiles/
+ using (var arcade = ArcadeScriptEngine.Instance.CreateEvaluator(
+ arcade_expr, ArcadeProfile.Popups))
+ {
+ //Provision values for any profile variables referenced...
+ //in our case '$layer'
+ var variables = new List>() {
+ new KeyValuePair("$layer", featLayer)
+ };
+ //evaluate the expression
+ try
+ {
+ var result = arcade.Evaluate(variables).GetResult();
+ System.Diagnostics.Debug.WriteLine($"Result: {result.ToString()}");
+ }
+ //handle any exceptions
+ catch (InvalidProfileVariableException ipe)
+ {
+ //something wrong with the profile variable specified
+ //TODO...
+ }
+ catch (EvaluationException ee)
+ {
+ //something wrong with the query evaluation
+ //TODO...
+ }
+ }
+ });
+
+ #endregion
+ }
+
+ public static void BasicQuery7()
+ {
+ var crimes_layer = MapView.Active.Map.GetLayersAsFlattenedList()
+ .OfType().FirstOrDefault();
+ if (crimes_layer == null)
+ return;
+
+ //cref: ArcGIS.Core.Arcade.ArcadeEvaluator.Evaluate(IEnumerable>)
+ //cref: ArcGIS.Core.Arcade.ArcadeEvaluationResult.GetResult()
+ #region Using FeatureSet functions Filter and Intersects
+
+ //Consult https://github.com/Esri/arcade-expressions/ and
+ //https://developers.arcgis.com/arcade/ for more examples
+ //and arcade reference
+
+ var map = MapView.Active.Map;
+ QueuedTask.Run(() =>
+ {
+ //construct a query
+ var query = new StringBuilder();
+ //https://developers.arcgis.com/arcade/function-reference/featureset_functions/
+
+ //Assume we have two layers - Oregon Counties (poly) and Crimes (points). Crimes
+ //is from the Pro SDK community sample data.
+ //Select all crime points within the relevant county boundaries and sum the count
+ query.AppendLine("var results = [];");
+
+ query.AppendLine("var counties = FeatureSetByName($map, 'Oregon_Counties', ['*'], true);");
+
+ //'Clackamas','Multnomah','Washington'
+ query.AppendLine("var sel_counties = Filter(counties, 'DHS_Districts IN (2, 15, 16)');");
+
+ query.AppendLine("for(var county in sel_counties) {");
+ query.AppendLine(" var name = county.County_Name;");
+ query.AppendLine(" var cnt_crime = Count(Intersects($layer, Geometry(county)));");
+ query.AppendLine(" Insert(results, 0, cnt_crime);");
+ query.AppendLine(" Insert(results, 0, name);");
+ query.AppendLine("}");
+
+ query.AppendLine("return Concatenate(results,'|');");
+
+ //construct a CIMExpressionInfo
+ var arcade_expr = new CIMExpressionInfo()
+ {
+ Expression = query.ToString(),
+ //Return type can be string, numeric, or default
+ //When set to default, addin is responsible for determining
+ //the return type
+ ReturnType = ExpressionReturnType.Default
+ };
+
+ //Construct an evaluator
+ //select the relevant profile - it must support Pro and it must
+ //contain any profile variables you are using in your expression.
+ //Consult: https://developers.arcgis.com/arcade/profiles/
+ using (var arcade = ArcadeScriptEngine.Instance.CreateEvaluator(
+ arcade_expr, ArcadeProfile.Popups))
+ {
+ //Provision values for any profile variables referenced...
+ //in our case '$layer' and '$map'
+ var variables = new List>() {
+ new KeyValuePair("$layer", crimes_layer),
+ new KeyValuePair("$map", map)
+ };
+ //evaluate the expression
+ try
+ {
+ var result = arcade.Evaluate(variables).GetResult();
+
+ var results = result.ToString().Split('|', StringSplitOptions.None);
+ var entries = results.Length / 2;
+ int i = 0;
+ for (var e = 0; e < entries; e++)
+ {
+ var name = results[i++];
+ var count = results[i++];
+ System.Diagnostics.Debug.WriteLine($"'{name}' crime count: {count}");
+ }
+ }
+ //handle any exceptions
+ catch (InvalidProfileVariableException ipe)
+ {
+ //something wrong with the profile variable specified
+ //TODO...
+ }
+ catch (EvaluationException ee)
+ {
+ //something wrong with the query evaluation
+ //TODO...
+ }
+ }
+ });
+
+ #endregion
+ }
+
+ #region ProSnippet Group: Evaluating Expressions
+ #endregion
+
+ public static void LabelQuery1()
+ {
+ var oregon_cnts = MapView.Active.Map.GetLayersAsFlattenedList()
+ .OfType().FirstOrDefault();
+ if (oregon_cnts == null)
+ return;
+
+ //cref: ArcGIS.Core.CIM.CIMLabelClass
+ //cref: ArcGIS.Core.Arcade.ArcadeEvaluator.Evaluate(IEnumerable>)
+ //cref: ArcGIS.Core.Arcade.ArcadeEvaluationResult.GetResult()
+ #region Evaluating an Arcade Labelling Expression
+
+ //Consult https://github.com/Esri/arcade-expressions/ and
+ //https://developers.arcgis.com/arcade/ for more examples
+ //and arcade reference
+
+ var map = MapView.Active.Map;
+ QueuedTask.Run(() =>
+ {
+ //Assume we a layer - Oregon County (poly) that has an arcade labelling
+ //expression and we want to evaluate that interactively...
+ var def = oregon_cnts.GetDefinition() as CIMFeatureLayer;
+ //Get the label class
+ var label_class = def.LabelClasses
+ .FirstOrDefault(lc => {
+ return lc.Name == "Arcade_Example_1" &&
+ lc.ExpressionEngine == LabelExpressionEngine.Arcade;
+ });
+ if (label_class == null)
+ return;
+
+ //evaluate the label expression against the features
+ var expr_info = new CIMExpressionInfo()
+ {
+ Expression = label_class.Expression,
+ ReturnType = ExpressionReturnType.String
+ };
+
+ //https://developers.arcgis.com/arcade/profiles/labeling/
+ using (var arcade = ArcadeScriptEngine.Instance.CreateEvaluator(
+ expr_info, ArcadeProfile.Labeling))
+ {
+ //loop through the features
+ using (var rc = oregon_cnts.Search())
+ {
+ while (rc.MoveNext())
+ {
+ var variables = new List>() {
+ new KeyValuePair("$feature", rc.Current)
+ };
+ var result = arcade.Evaluate(variables).GetResult();
+ //output
+ System.Diagnostics.Debug.WriteLine(
+ $"[{rc.Current.GetObjectID()}]: {result}");
+ }
+ }
+ }
+ });
+
+ #endregion
+ }
+
+ public static void VVQuery1()
+ {
+ var oregon_cnts = MapView.Active.Map.GetLayersAsFlattenedList()
+ .OfType().FirstOrDefault();
+ if (oregon_cnts == null)
+ return;
+
+ //cref: ArcGIS.Core.CIM.CIMVisualVariable
+ //cref: ArcGIS.Core.CIM.CIMColorVisualVariable
+ //cref: ArcGIS.Core.CIM.CIMTransparencyVisualVariable
+ //cref: ArcGIS.Core.CIM.CIMSizeVisualVariable
+ //cref: ArcGIS.Core.CIM.CIMUniqueValueRenderer.ValueExpressionInfo
+ //cref: ArcGIS.Core.Arcade.ArcadeEvaluator.Evaluate(IEnumerable>)
+ //cref: ArcGIS.Core.Arcade.ArcadeEvaluationResult.GetResult()
+ #region Evaluating Arcade Visual Variable Expressions on a Renderer
+
+ //Consult https://github.com/Esri/arcade-expressions/ and
+ //https://developers.arcgis.com/arcade/ for more examples
+ //and arcade reference
+
+ var mv = MapView.Active;
+ var map = mv.Map;
+
+ QueuedTask.Run(() =>
+ {
+ //Assume we a layer - Oregon County (poly) that is using Visual Variable
+ //expressions that we want to evaluate interactively...
+ var def = oregon_cnts.GetDefinition() as CIMFeatureLayer;
+
+ //Most all feature renderers have a VisualVariable collection
+ var renderer = def.Renderer as CIMUniqueValueRenderer;
+ var vis_variables = renderer.VisualVariables?.ToList() ??
+ new List();
+ if (vis_variables.Count == 0)
+ return;//there are none
+ var vis_var_with_expr = new Dictionary();
+ //see if any are using expressions
+ foreach (var vv in vis_variables)
+ {
+ if (vv is CIMColorVisualVariable cvv)
+ {
+ if (!string.IsNullOrEmpty(cvv.ValueExpressionInfo?.Expression))
+ vis_var_with_expr.Add("Color", cvv.ValueExpressionInfo?.Expression);
+ }
+ else if (vv is CIMTransparencyVisualVariable tvv)
+ {
+ if (!string.IsNullOrEmpty(tvv.ValueExpressionInfo?.Expression))
+ vis_var_with_expr.Add("Transparency", tvv.ValueExpressionInfo?.Expression);
+ }
+ else if (vv is CIMSizeVisualVariable svv)
+ {
+ if (!string.IsNullOrEmpty(svv.ValueExpressionInfo?.Expression))
+ vis_var_with_expr.Add("Outline", svv.ValueExpressionInfo?.Expression);
+ }
+ }
+ if (vis_var_with_expr.Count == 0)
+ return;//there arent any with expressions
+
+ //loop through the features (outer)
+ //per feature evaluate each visual variable.... (inner)
+ //....
+ //the converse is to loop through the expressions (outer)
+ //then per feature evaluate the expression (inner)
+ using (var rc = oregon_cnts.Search())
+ {
+ while (rc.MoveNext())
+ {
+ foreach (var kvp in vis_var_with_expr)
+ {
+ var expr_info = new CIMExpressionInfo()
+ {
+ Expression = kvp.Value,
+ ReturnType = ExpressionReturnType.Default
+ };
+ //per feature eval each expression...
+ using (var arcade = ArcadeScriptEngine.Instance.CreateEvaluator(
+ expr_info, ArcadeProfile.Visualization))
+ {
+
+ var variables = new List>() {
+ new KeyValuePair("$feature", rc.Current)
+ };
+ //note 2D maps can also have view scale...
+ //...if necessary...
+ if (mv.ViewingMode == MapViewingMode.Map)
+ {
+ variables.Add(new KeyValuePair(
+ "$view.scale", mv.Camera.Scale));
+ }
+ var result = arcade.Evaluate(variables).GetResult().ToString();
+ //output
+ System.Diagnostics.Debug.WriteLine(
+ $"[{rc.Current.GetObjectID()}] '{kvp.Key}': {result}");
+ }
+ }
+ }
+ }
+
+ ////foreach (var kvp in vis_var_with_expr)
+ ////{
+ //// var expr_info = new CIMExpressionInfo()
+ //// {
+ //// Expression = kvp.Value,
+ //// ReturnType = ExpressionReturnType.Default
+ //// };
+
+ //// using (var arcade = ArcadeScriptEngine.Instance.CreateEvaluator(
+ //// expr_info, ArcadeProfile.Visualization))
+ //// {
+ //// //loop through the features
+ //// using (var rc = oregon_cnts.Search())
+ //// {
+ //// while (rc.MoveNext())
+ //// {
+ //// var variables = new List>() {
+ //// new KeyValuePair("$feature", rc.Current)
+ //// };
+
+ //// var result = arcade.Evaluate(variables).GetResult();
+ //// //output
+ //// //...
+ //// }
+ //// }
+ //// }
+ ////}
+ });
+
+ #endregion
+ }
+
+ protected static void ArcadeRenderer()
+ {
+ // cref: ArcGIS.Core.CIM.CIMExpressionInfo
+ // cref: ArcGIS.Core.CIM.CIMExpressionInfo.Expression
+ // cref: ArcGIS.Core.CIM.CIMExpressionInfo.Title
+ // cref: ArcGIS.Core.CIM.CIMUniqueValueRenderer.ValueExpressionInfo
+ // cref: ArcGIS.Desktop.Mapping.FeatureLayer.GetRenderer
+ // cref: ArcGIS.Desktop.Mapping.FeatureLayer.SetRenderer
+ #region Modify renderer using Arcade
+ var lyr = MapView.Active.Map.GetLayersAsFlattenedList().OfType().FirstOrDefault(f => f.ShapeType == esriGeometryType.esriGeometryPolygon);
+ if (lyr == null) return;
+ QueuedTask.Run(() =>
+ {
+ // GetRenderer from Layer (assumes it is a unique value renderer)
+ var uvRenderer = lyr.GetRenderer() as CIMUniqueValueRenderer;
+ if (uvRenderer == null) return;
+ //layer has STATE_NAME field
+ //community sample Data\Admin\AdminSample.aprx
+ string expression = "if ($view.scale > 21000000) { return $feature.STATE_NAME } else { return 'All' }";
+ CIMExpressionInfo updatedExpressionInfo = new CIMExpressionInfo
+ {
+ Expression = expression,
+ Title = "Custom" // can be any string used for UI purpose.
+ };
+ //set the renderer's expression
+ uvRenderer.ValueExpressionInfo = updatedExpressionInfo;
+
+ //SetRenderer on Layer
+ lyr.SetRenderer(uvRenderer);
+ });
+ #endregion
+ }
+ protected static void ArcadeLabeling()
+ {
+ // cref: ArcGIS.Desktop.Mapping.FeatureLayer.GetRenderer
+ // cref: ArcGIS.Core.CIM.CIMGeoFeatureLayerBase.LabelClasses
+ // cref: ArcGIS.Core.CIM.CIMLabelClass
+ // cref: ArcGIS.Core.CIM.CIMLabelClass.Expression
+ // cref: ArcGIS.Desktop.Mapping.FeatureLayer.SetRenderer
+ #region Modify label expression using Arcade
+ var lyr = MapView.Active.Map.GetLayersAsFlattenedList().OfType().FirstOrDefault(f => f.ShapeType == esriGeometryType.esriGeometryPolygon);
+ if (lyr == null) return;
+ QueuedTask.Run(() =>
+ {
+ //Get the layer's definition
+ //community sample Data\Admin\AdminSample.aprx
+ var lyrDefn = lyr.GetDefinition() as CIMFeatureLayer;
+ if (lyrDefn == null) return;
+ //Get the label classes - we need the first one
+ var listLabelClasses = lyrDefn.LabelClasses.ToList();
+ var theLabelClass = listLabelClasses.FirstOrDefault();
+ //set the label class Expression to use the Arcade expression
+ theLabelClass.Expression = "return $feature.STATE_NAME + TextFormatting.NewLine + $feature.POP2000;";
+ //Set the label definition back to the layer.
+ lyr.SetDefinition(lyrDefn);
+ });
+
+ #endregion
+ }
+
+ public static void AttributeRules1()
+ {
+ var featLayer = MapView.Active.Map.GetLayersAsFlattenedList()
+ .OfType().FirstOrDefault();
+ if (featLayer == null)
+ return;
+
+ //cref: ArcGIS.Core.Data.TableDefinition.GetAttributeRules(AttributeRuleType)
+ //cref: ArcGIS.Core.Data.AttributeRuleDefinition.GetScriptExpression()
+ #region Evaluate AttributeRule Expression
+
+ //Consult https://github.com/Esri/arcade-expressions/ and
+ //https://developers.arcgis.com/arcade/profiles/attribute-rules/ for
+ //more examples and arcade reference
+
+ QueuedTask.Run(() =>
+ {
+ //Retrieve the desired feature class/table
+ var def = featLayer.GetFeatureClass().GetDefinition();
+
+ //get the desired attribute rule whose expression is to be
+ //evaluated.
+ //AttributeRuleType.All, Calculation, Constraint, Validation
+ var validation_rule = def.GetAttributeRules(
+ AttributeRuleType.Validation).FirstOrDefault();
+ if (validation_rule == null)
+ return;
+
+ //Get the expression
+ var expr = validation_rule.GetScriptExpression();
+ //construct a CIMExpressionInfo
+ var arcade_expr = new CIMExpressionInfo()
+ {
+ Expression = expr,
+ //Return type can be string, numeric, or default
+ ReturnType = ExpressionReturnType.Default
+ };
+
+ System.Diagnostics.Debug.WriteLine($"Evaluating {expr}:");
+ //Construct an evaluator
+ //we are using ArcadeProfile.AttributeRules profile...
+ //Consult: https://developers.arcgis.com/arcade/profiles/
+ using (var arcade = ArcadeScriptEngine.Instance.CreateEvaluator(
+ arcade_expr, ArcadeProfile.AttributeRuleValidation))
+ {
+ //we are evaluating the expression against all features
+ using (var rc = featLayer.Search())
+ {
+
+ while (rc.MoveNext())
+ {
+ //Provision values for any profile variables referenced...
+ //in our case we assume '$feature'
+ //...use arcade.ProfileVariablesUsed() if necessary...
+ var variables = new List>() {
+ new KeyValuePair("$feature", rc.Current)
+ };
+
+ //evaluate the expression per feature
+ try
+ {
+ var result = arcade.Evaluate(variables).GetResult();
+ //'Validation' attribute rules return true or false...
+ var valid = System.Boolean.Parse(result.ToString());
+ System.Diagnostics.Debug.WriteLine(
+ $"{rc.Current.GetObjectID()} valid: {valid}");
+ }
+ //handle any exceptions
+ catch (InvalidProfileVariableException ipe)
+ {
+ //something wrong with the profile variable specified
+ //TODO...
+ }
+ catch (EvaluationException ee)
+ {
+ //something wrong with the query evaluation
+ //TODO...
+ }
+ }
+ }
+ }
+ });
+
+ #endregion
+ }
+ }
+}
\ No newline at end of file
diff --git a/Examples/Editing/ProSnippet.cs b/Examples/Editing/ProSnippet.cs
index 7a117f5..1137102 100644
--- a/Examples/Editing/ProSnippet.cs
+++ b/Examples/Editing/ProSnippet.cs
@@ -867,7 +867,7 @@ public void EditOperations()
long newFeatureID = -1;
//The Create operation has to execute so we can get an object_id
var token2 = editOperation1.Create(this.CurrentTemplate, polygon);
-
+
//Must be within a QueuedTask
editOperation1.Execute(); //Note: Execute and ExecuteAsync will return true if the operation was successful and false if not
if (editOperation1.IsSucceeded)
@@ -881,7 +881,7 @@ public void EditOperations()
editOperation2.AddAttachment(this.CurrentTemplate.Layer, newFeatureID, @"C:\data\images\Hydrant.jpg");
//Execute the chained edit operation. editOperation1 and editOperation2 show up as a single Undo operation
//on the UI even though we had two transactions
- editOperation2.Execute();
+ editOperation2.Execute();
}
#endregion
diff --git a/Examples/Editing/ProSnippetCS6.cs b/Examples/Editing/ProSnippetCS6.cs
index 9460de7..17aba04 100644
--- a/Examples/Editing/ProSnippetCS6.cs
+++ b/Examples/Editing/ProSnippetCS6.cs
@@ -520,6 +520,41 @@ internal async void UpdateAnnotation()
{
BasicFeatureLayer annoLayer = MapView.Active.Map.GetLayersAsFlattenedList().First() as BasicFeatureLayer;
var oid = 1;
+ MapPoint pnt = null;
+
+ // cref: ArcGIS.Desktop.Editing.Attributes.Inspector.GetAnnotationProperties
+ // cref: ArcGIS.Desktop.Editing.AnnotationProperties.TextString
+ // cref: ArcGIS.Desktop.Editing.Attributes.Inspector.SetAnnotationProperties(ArcGIS.Desktop.Editing.AnnotationProperties)
+ // cref: ArcGIS.Desktop.Editing.EditOperation.Create(ArcGIS.Desktop.Mapping.MapMember,ArcGIS.Desktop.Editing.Attributes.Inspector)
+ #region Programmatically Create an Annotation Feature
+
+ await QueuedTask.Run(() =>
+ {
+ // annoLayer is ~your~ Annotation layer...
+ // pnt is ~your~ Annotation geometry ...
+ var op = new EditOperation();
+ // Use the inspector
+ var insp = new Inspector();
+ insp.LoadSchema(annoLayer);
+ // get the annotation properties from the inspector
+ AnnotationProperties annoProperties = insp.GetAnnotationProperties();
+ // change the annotation text
+ annoProperties.TextString = DateTime.Now.ToLongTimeString();
+ // change font color to green
+ annoProperties.Color = ColorFactory.Instance.GreenRGB;
+ // change the horizontal alignment
+ annoProperties.HorizontalAlignment = HorizontalAlignment.Center;
+ annoProperties.Shape = pnt;
+ // set the annotation properties back on the inspector
+ insp.SetAnnotationProperties(annoProperties);
+ // create the annotation
+ op.Create(annoLayer, insp);
+ if (!op.IsEmpty)
+ {
+ var result = op.Execute(); //Execute and ExecuteAsync will return true if the operation was successful and false if not
+ }
+ });
+ #endregion
// cref: ArcGIS.Desktop.Editing.Attributes.Inspector.GetAnnotationProperties
// cref: ArcGIS.Desktop.Editing.AnnotationProperties.TextString
@@ -705,7 +740,7 @@ public async void Topology()
});
#endregion
- // cref: ArcGIS.Desktop.Mapping.MappingExtensions.GetActiveTopologyAsync(ArcGIS.Desktop.Mapping.Map, System.String)
+ // cref: ArcGIS.Desktop.Mapping.MappingExtensions.GetActiveTopologyAsync(ArcGIS.Desktop.Mapping.Map)
// cref: ArcGIS.Desktop.Editing.TopologyProperties
// cref: ArcGIS.Desktop.Editing.MapTopologyProperties
// cref: ArcGIS.Desktop.Editing.GeodatabaseTopologyProperties
diff --git a/Examples/Framework/ProSnippets.cs b/Examples/Framework/ProSnippets.cs
index 8e42575..eb86453 100644
--- a/Examples/Framework/ProSnippets.cs
+++ b/Examples/Framework/ProSnippets.cs
@@ -34,6 +34,8 @@ limitations under the License.
using ArcGIS.Core.Events;
using ArcGIS.Desktop.Mapping.Events;
using System.Linq;
+using ArcGIS.Desktop.Framework.Controls;
+using ArcGIS.Desktop.Internal.Framework.Metro;
namespace Framework.Snippets
{
@@ -184,6 +186,39 @@ public void Snippets()
}
+ //public class ProWindow1 : Window
+ //{
+ // public ProWindow1(double x, double y)
+ // {
+ // }
+ // public bool SaveWindowPosition { get; set; }
+ //}
+
+ public void ShowProWindow()
+ {
+ #region ProWindow Position on Screen
+ ProWindow1 _prowindow1 = null;
+ {
+ double left = 150; //Window's left edge, in relation to the desktop
+ double top = 150; //Window's top edge, in relation to the desktop
+ //already open?
+ if (_prowindow1 != null)
+ return;
+ _prowindow1 = new ProWindow1(left, top); //create window
+ _prowindow1.Owner = FrameworkApplication.Current.MainWindow;
+ _prowindow1.Closed += (o, e) => { _prowindow1 = null; };
+
+ //MetroWindows remember their last location unless SaveWindowPosition is set to
+ //false.
+ _prowindow1.SaveWindowPosition = false; //set to false to override the last position
+
+ _prowindow1.Show();
+ //uncomment for modal
+ //_prowindow1.ShowDialog();
+ }
+ #endregion
+ }
+
public void Foo()
{
// cref: ArcGIS.Desktop.Framework.FrameworkApplication.GetAddInInfos
diff --git a/Examples/Framework/ProWindow1.xaml b/Examples/Framework/ProWindow1.xaml
new file mode 100644
index 0000000..9095671
--- /dev/null
+++ b/Examples/Framework/ProWindow1.xaml
@@ -0,0 +1,13 @@
+
+
+
+
+
diff --git a/Examples/Framework/ProWindow1.xaml.cs b/Examples/Framework/ProWindow1.xaml.cs
new file mode 100644
index 0000000..655a5e7
--- /dev/null
+++ b/Examples/Framework/ProWindow1.xaml.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Framework
+{
+ ///
+ /// Interaction logic for ProWindow1.xaml
+ ///
+ public partial class ProWindow1 : ArcGIS.Desktop.Framework.Controls.ProWindow
+ {
+ public ProWindow1(double left, double top)
+ {
+ this.Left = left;
+ this.Top = top;
+ InitializeComponent();
+
+ }
+ }
+}
diff --git a/Examples/Geodatabase/3DAnalystData/ProSnippets3DAnalystData.cs b/Examples/Geodatabase/3DAnalystData/ProSnippets3DAnalystData.cs
new file mode 100644
index 0000000..8f0fef0
--- /dev/null
+++ b/Examples/Geodatabase/3DAnalystData/ProSnippets3DAnalystData.cs
@@ -0,0 +1,857 @@
+/*
+
+ Copyright 2023 Esri
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+using ArcGIS.Core.CIM;
+using ArcGIS.Core.Data;
+using ArcGIS.Core.Data.Exceptions;
+using ArcGIS.Core.Data.Realtime;
+using ArcGIS.Core.Geometry;
+using ArcGIS.Desktop.Framework.Threading.Tasks;
+using ArcGIS.Desktop.Mapping;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace GeodatabaseSDK._3DAnalystData
+{
+ internal class ProSnippets3DAnalystData
+ {
+
+ #region ProSnippet Group: TIN
+ #endregion
+
+ // cref: ArcGIS.Core.Data.FileSystemDatastoreType.Tin
+ // cref: ArcGIS.Core.Data.Analyst3D.TinDataset
+ // cref: ArcGIS.Core.Data.FileSystemDatastore.#ctor(ArcGIS.Core.Data.FileSystemConnectionPath)
+ // cref: ArcGIS.Core.Data.FileSystemDatastore.OpenDataset``1(System.String)
+ #region Open a TIN Dataset
+
+ public async Task OpenTinDataset()
+ {
+ try
+ {
+ await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() =>
+ {
+ string path = @"d:\Data\Tin";
+ var fileConnection = new FileSystemConnectionPath(new Uri(path), FileSystemDatastoreType.Tin);
+
+ using (FileSystemDatastore dataStore = new FileSystemDatastore(fileConnection))
+ {
+ // TIN is in a folder at d:\Data\Tin\TinDataset
+
+ string dsName = "TinDataset";
+
+ using (var dataset = dataStore.OpenDataset(dsName))
+ {
+
+ }
+ }
+ });
+ }
+ catch (GeodatabaseNotFoundOrOpenedException exception)
+ {
+ // Handle Exception.
+ }
+ }
+ #endregion
+
+ // cref: ArcGIS.Core.Data.FileSystemDatastoreType.Tin
+ // cref: ArcGIS.Core.Data.Analyst3D.TinDatasetDefinition
+ // cref: ArcGIS.Core.Data.FileSystemDatastore.#ctor(ArcGIS.Core.Data.FileSystemConnectionPath)
+ // cref: ArcGIS.Core.Data.FileSystemDatastore.GetDefinition``1(System.String)
+ #region Get a TIN Defintion
+ public async Task GetTinDatasetDefinition()
+ {
+ try
+ {
+ await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() =>
+ {
+ string path = @"d:\Data\Tin";
+ var fileConnection = new FileSystemConnectionPath(new Uri(path), FileSystemDatastoreType.Tin);
+
+ using (FileSystemDatastore dataStore = new FileSystemDatastore(fileConnection))
+ {
+ // TIN is in a folder at d:\Data\Tin\TinDataset
+
+ string dsName = "TinDataset";
+
+ using (var def = dataStore.GetDefinition(dsName))
+ {
+
+ }
+ }
+ });
+ }
+ catch (GeodatabaseNotFoundOrOpenedException exception)
+ {
+ // Handle Exception.
+ }
+ }
+ #endregion
+
+ public void TinProperties(ArcGIS.Core.Data.Analyst3D.TinDataset tinDataset)
+ {
+ // cref: ArcGIS.Core.Data.Analyst3D.TinDataset.GetSuperNodeExtent
+ #region Get Super Node Extent
+ var superNodeExtent = tinDataset.GetSuperNodeExtent();
+
+ #endregion
+
+ // cref: ArcGIS.Core.Data.Analyst3D.TinDataset.GetDataArea
+ #region Get Data Area
+ var dataArea = tinDataset.GetDataArea();
+ #endregion
+
+ // cref: ArcGIS.Core.Data.Analyst3D.TinDataset.GetNodeCount
+ // cref: ArcGIS.Core.Data.Analyst3D.TinDataset.GetOutsideNodeCount
+ // cref: ArcGIS.Core.Data.Analyst3D.TinDataset.GetEdgeCount
+ // cref: ArcGIS.Core.Data.Analyst3D.TinDataset.GetOutsideEdgeCount
+ // cref: ArcGIS.Core.Data.Analyst3D.TinDataset.GetTriangleCount
+ // cref: ArcGIS.Core.Data.Analyst3D.TinDataset.GetOutsideTriangleCount
+ #region Element Counts
+
+ var nodeCount = tinDataset.GetNodeCount();
+ var outsideNodeCount = tinDataset.GetOutsideNodeCount();
+ var edgeCount = tinDataset.GetEdgeCount();
+ var outsideEdgecount = tinDataset.GetOutsideEdgeCount();
+ var triCount = tinDataset.GetTriangleCount();
+ var outsideTriCount = tinDataset.GetOutsideTriangleCount();
+
+ #endregion
+
+ // cref: ArcGIS.Core.Data.Analyst3D.TinDataset.GetIsEmpty
+ // cref: ArcGIS.Core.Data.Analyst3D.TinDataset.HasHardEdges
+ // cref: ArcGIS.Core.Data.Analyst3D.TinDataset.HasSoftEdges
+ // cref: ArcGIS.Core.Data.Analyst3D.TinDataset.UsesConstrainedDelaunay
+ #region Tin Properties
+
+ var isEmpty = tinDataset.GetIsEmpty();
+ var hasHardEdges = tinDataset.HasHardEdges();
+ var hasSoftEdges = tinDataset.HasSoftEdges();
+
+ var isConstrainedDelaunay = tinDataset.UsesConstrainedDelaunay();
+
+ #endregion
+
+ // cref: ArcGIS.Core.Data.Analyst3D.TinDataset.GetNodeByIndex(System.Int32)
+ // cref: ArcGIS.Core.Data.Analyst3D.TinNode
+ // cref: ArcGIS.Core.Data.Analyst3D.TinDataset.GetEdgeByIndex(System.Int32)
+ // cref: ArcGIS.Core.Data.Analyst3D.TinEdge
+ // cref: ArcGIS.Core.Data.Analyst3D.TinDataset.GetTriangleByIndex(System.Int32)
+ // cref: ArcGIS.Core.Data.Analyst3D.TinTriangle
+ #region Access TIN Elements By Index
+
+ using (ArcGIS.Core.Data.Analyst3D.TinNode node = tinDataset.GetNodeByIndex(23))
+ {
+
+ }
+
+ using (ArcGIS.Core.Data.Analyst3D.TinEdge edge = tinDataset.GetEdgeByIndex(45))
+ {
+
+ }
+ using (ArcGIS.Core.Data.Analyst3D.TinTriangle triangle = tinDataset.GetTriangleByIndex(22))
+ {
+
+ }
+
+ #endregion
+
+ Envelope envelope = null;
+ // cref: ArcGIS.Core.Data.Analyst3D.TinDataset.SearchNodes(ArcGIS.Core.Data.Analyst3D.TinNodeFilter)
+ // cref: ArcGIS.Core.Data.Analyst3D.TinNodeCursor
+ // cref: ArcGIS.Core.Data.Analyst3D.TinNodeCursor.MoveNext
+ // cref: ArcGIS.Core.Data.Analyst3D.TinNodeCursor.Current
+ // cref: ArcGIS.Core.Data.Analyst3D.TinNode
+ // cref: ArcGIS.Core.Data.Analyst3D.TinNodeFilter
+ // cref: ArcGIS.Core.Data.Analyst3D.TinNodeFilter.#ctor
+ // cref: ArcGIS.Core.Data.Analyst3D.TinNodeFilter.SuperNode
+ // cref: ArcGIS.Core.Data.Analyst3D.TinFilter.FilterType
+ // cref: ArcGIS.Core.Data.Analyst3D.TinFilter.FilterEnvelope
+ // cref: ArcGIS.Core.Data.Analyst3D.TinFilterType
+ #region Search for TIN Nodes
+
+ // search all nodes
+ using (ArcGIS.Core.Data.Analyst3D.TinNodeCursor nodeCursor = tinDataset.SearchNodes(null))
+ {
+ while (nodeCursor.MoveNext())
+ {
+ using (ArcGIS.Core.Data.Analyst3D.TinNode node = nodeCursor.Current)
+ {
+
+ }
+ }
+ }
+
+ // search within an extent
+ ArcGIS.Core.Data.Analyst3D.TinNodeFilter nodeFilter = new ArcGIS.Core.Data.Analyst3D.TinNodeFilter();
+ nodeFilter.FilterEnvelope = envelope;
+ using (ArcGIS.Core.Data.Analyst3D.TinNodeCursor nodeCursor = tinDataset.SearchNodes(nodeFilter))
+ {
+ while (nodeCursor.MoveNext())
+ {
+ using (ArcGIS.Core.Data.Analyst3D.TinNode node = nodeCursor.Current)
+ {
+
+ }
+ }
+ }
+
+ // search all "inside" nodes
+ nodeFilter = new ArcGIS.Core.Data.Analyst3D.TinNodeFilter();
+ nodeFilter.FilterType = ArcGIS.Core.Data.Analyst3D.TinFilterType.InsideDataArea;
+ using (ArcGIS.Core.Data.Analyst3D.TinNodeCursor nodeCursor = tinDataset.SearchNodes(nodeFilter))
+ {
+ while (nodeCursor.MoveNext())
+ {
+ using (ArcGIS.Core.Data.Analyst3D.TinNode node = nodeCursor.Current)
+ {
+
+ }
+ }
+ }
+
+ // search for super nodes only
+ nodeFilter = new ArcGIS.Core.Data.Analyst3D.TinNodeFilter();
+ nodeFilter.FilterEnvelope = tinDataset.GetSuperNodeExtent();
+ nodeFilter.SuperNode = true;
+ using (ArcGIS.Core.Data.Analyst3D.TinNodeCursor nodeCursor = tinDataset.SearchNodes(nodeFilter))
+ {
+ while (nodeCursor.MoveNext())
+ {
+ using (ArcGIS.Core.Data.Analyst3D.TinNode node = nodeCursor.Current)
+ {
+
+ }
+ }
+ }
+
+ #endregion
+
+ // cref: ArcGIS.Core.Data.Analyst3D.TinDataset.SearchEdges(ArcGIS.Core.Data.Analyst3D.TinEdgeFilter)
+ // cref: ArcGIS.Core.Data.Analyst3D.TinEdgeCursor
+ // cref: ArcGIS.Core.Data.Analyst3D.TinEdge
+ // cref: ArcGIS.Core.Data.Analyst3D.TinEdgeFilter
+ // cref: ArcGIS.Core.Data.Analyst3D.TinEdgeFilter.#ctor
+ // cref: ArcGIS.Core.Data.Analyst3D.TinFilter.FilterType
+ // cref: ArcGIS.Core.Data.Analyst3D.TinFilter.FilterEnvelope
+ // cref: ArcGIS.Core.Data.Analyst3D.TinEdgeFilter.FilterByEdgeType
+ // cref: ArcGIS.Core.Data.Analyst3D.TinEdgeFilter.EdgeType
+ // cref: ArcGIS.Core.Data.Analyst3D.TinEdgeType
+ // cref: ArcGIS.Core.Data.Analyst3D.TinFilterType
+ #region Search for TIN Edges
+
+ // search all edges
+ using (ArcGIS.Core.Data.Analyst3D.TinEdgeCursor edgeCursor = tinDataset.SearchEdges(null))
+ {
+ while (edgeCursor.MoveNext())
+ {
+ using (ArcGIS.Core.Data.Analyst3D.TinEdge edge = edgeCursor.Current)
+ {
+
+ }
+ }
+ }
+
+ // search within an extent
+ ArcGIS.Core.Data.Analyst3D.TinEdgeFilter edgeFilter = new ArcGIS.Core.Data.Analyst3D.TinEdgeFilter();
+ edgeFilter.FilterEnvelope = envelope;
+ using (ArcGIS.Core.Data.Analyst3D.TinEdgeCursor edgeCursor = tinDataset.SearchEdges(edgeFilter))
+ {
+ while (edgeCursor.MoveNext())
+ {
+ using (ArcGIS.Core.Data.Analyst3D.TinEdge edge = edgeCursor.Current)
+ {
+
+ }
+ }
+ }
+
+ // search all "inside" edges
+ edgeFilter = new ArcGIS.Core.Data.Analyst3D.TinEdgeFilter();
+ edgeFilter.FilterType = ArcGIS.Core.Data.Analyst3D.TinFilterType.InsideDataArea;
+ using (ArcGIS.Core.Data.Analyst3D.TinEdgeCursor edgeCursor = tinDataset.SearchEdges(edgeFilter))
+ {
+ while (edgeCursor.MoveNext())
+ {
+ using (ArcGIS.Core.Data.Analyst3D.TinEdge edge = edgeCursor.Current)
+ {
+
+ }
+ }
+ }
+
+ // search for hard edges
+ edgeFilter = new ArcGIS.Core.Data.Analyst3D.TinEdgeFilter();
+ edgeFilter.FilterByEdgeType = true;
+ edgeFilter.EdgeType = ArcGIS.Core.Data.Analyst3D.TinEdgeType.HardEdge;
+ using (ArcGIS.Core.Data.Analyst3D.TinEdgeCursor edgeCursor = tinDataset.SearchEdges(edgeFilter))
+ {
+ while (edgeCursor.MoveNext())
+ {
+ using (ArcGIS.Core.Data.Analyst3D.TinEdge edge = edgeCursor.Current)
+ {
+
+ }
+ }
+ }
+ #endregion
+
+ // cref: ArcGIS.Core.Data.Analyst3D.TinDataset.SearchTriangles(ArcGIS.Core.Data.Analyst3D.TinTriangleFilter)
+ // cref: ArcGIS.Core.Data.Analyst3D.TinTriangleCursor
+ // cref: ArcGIS.Core.Data.Analyst3D.TinTriangle
+ // cref: ArcGIS.Core.Data.Analyst3D.TinTriangleFilter
+ // cref: ArcGIS.Core.Data.Analyst3D.TinTriangleFilter.#ctor
+ // cref: ArcGIS.Core.Data.Analyst3D.TinFilter.FilterType
+ // cref: ArcGIS.Core.Data.Analyst3D.TinFilter.FilterEnvelope
+ // cref: ArcGIS.Core.Data.Analyst3D.TinFilterType
+ #region Search for TIN Triangles
+
+ // search all triangles
+ using (ArcGIS.Core.Data.Analyst3D.TinTriangleCursor triangleCursor = tinDataset.SearchTriangles(null))
+ {
+ while (triangleCursor.MoveNext())
+ {
+ using (ArcGIS.Core.Data.Analyst3D.TinTriangle triangle = triangleCursor.Current)
+ {
+
+ }
+ }
+ }
+
+ // search within an extent
+ ArcGIS.Core.Data.Analyst3D.TinTriangleFilter triangleFilter = new ArcGIS.Core.Data.Analyst3D.TinTriangleFilter();
+ triangleFilter.FilterEnvelope = envelope;
+ using (ArcGIS.Core.Data.Analyst3D.TinTriangleCursor triangleCursor = tinDataset.SearchTriangles(triangleFilter))
+ {
+ while (triangleCursor.MoveNext())
+ {
+ using (ArcGIS.Core.Data.Analyst3D.TinTriangle triangle = triangleCursor.Current)
+ {
+
+ }
+ }
+ }
+
+ // search all "inside" triangles
+ triangleFilter = new ArcGIS.Core.Data.Analyst3D.TinTriangleFilter();
+ triangleFilter.FilterType = ArcGIS.Core.Data.Analyst3D.TinFilterType.InsideDataArea;
+ using (ArcGIS.Core.Data.Analyst3D.TinTriangleCursor triangleCursor = tinDataset.SearchTriangles(triangleFilter))
+ {
+ while (triangleCursor.MoveNext())
+ {
+ using (ArcGIS.Core.Data.Analyst3D.TinTriangle triangle = triangleCursor.Current)
+ {
+
+ }
+ }
+ }
+
+ #endregion
+
+
+ MapPoint mapPoint = null;
+ // cref: ArcGIS.Core.Data.Analyst3D.TinDataset.GetNearestNode(ArcGIS.Core.Geometry.MapPoint)
+ // cref: ArcGIS.Core.Data.Analyst3D.TinDataset.GetNearestEdge(ArcGIS.Core.Geometry.MapPoint)
+ // cref: ArcGIS.Core.Data.Analyst3D.TinDataset.GetTriangleByPoint(ArcGIS.Core.Geometry.MapPoint)
+ // cref: ArcGIS.Core.Data.Analyst3D.TinDataset.GetNaturalNeighbors(ArcGIS.Core.Geometry.MapPoint)
+ // cref: ArcGIS.Core.Data.Analyst3D.TinDataset.GetTriangleNeighborhood(ArcGIS.Core.Geometry.MapPoint)
+ #region Access TIN Elements by MapPoint
+
+ // "identify" the closest node, edge, triangle
+ using (var nearestNode = tinDataset.GetNearestNode(mapPoint))
+ {
+ }
+
+ using (var nearestEdge = tinDataset.GetNearestEdge(mapPoint))
+ {
+ }
+ using (var triangle = tinDataset.GetTriangleByPoint(mapPoint))
+ {
+
+ }
+
+ // get the set of natural neighbours
+ // (set of nodes that "mapPoint" would connect with to form triangles if it was added to the TIN)
+ IReadOnlyList naturalNeighbors = tinDataset.GetNaturalNeighbors(mapPoint);
+
+ // get the set of triangles whose circumscribed circle contains "mapPoint"
+ IReadOnlyList triangles = tinDataset.GetTriangleNeighborhood(mapPoint);
+ #endregion
+ }
+
+ public void TinElements(ArcGIS.Core.Data.Analyst3D.TinNode node, ArcGIS.Core.Data.Analyst3D.TinEdge edge, ArcGIS.Core.Data.Analyst3D.TinTriangle triangle)
+ {
+ // cref: ArcGIS.Core.Data.Analyst3D.TinNode
+ // cref: ArcGIS.Core.Data.Analyst3D.TinNode.Coordinate3D
+ // cref: ArcGIS.Core.Data.Analyst3D.TinNode.ToMapPoint
+ // cref: ArcGIS.Core.Data.Analyst3D.TinNode.IsInsideDataArea
+ // cref: ArcGIS.Core.Data.Analyst3D.TinNode.GetAdjacentNodes
+ // cref: ArcGIS.Core.Data.Analyst3D.TinNode.GetIncidentEdges
+ // cref: ArcGIS.Core.Data.Analyst3D.TinNode.GetIncidentTriangles
+ #region TIN Nodes
+
+ // node coordinates
+ var coord3D = node.Coordinate3D;
+ var mapPoint = node.ToMapPoint();
+ // is the node "inside"
+ var isInsideNode = node.IsInsideDataArea;
+
+ // get all other nodes connected to "node"
+ IReadOnlyList adjNodes = node.GetAdjacentNodes();
+
+ // get all edges that share "node" as a from node.
+ IReadOnlyList edges = node.GetIncidentEdges();
+
+ // get all triangles that share "node"
+ IReadOnlyList triangles = node.GetIncidentTriangles();
+
+ #endregion
+
+ // cref: ArcGIS.Core.Data.Analyst3D.TinEdge
+ // cref: ArcGIS.Core.Data.Analyst3D.TinEdge.Nodes
+ // cref: ArcGIS.Core.Data.Analyst3D.TinEdge.ToPolyline
+ // cref: ArcGIS.Core.Data.Analyst3D.TinEdge.Length
+ // cref: ArcGIS.Core.Data.Analyst3D.TinEdge.IsInsideDataArea
+ // cref: ArcGIS.Core.Data.Analyst3D.TinEdge.EdgeType
+ // cref: ArcGIS.Core.Data.Analyst3D.TinEdgeType
+ // cref: ArcGIS.Core.Data.Analyst3D.TinEdge.GetNextEdgeInTriangle
+ // cref: ArcGIS.Core.Data.Analyst3D.TinEdge.GetPreviousEdgeInTriangle
+ // cref: ArcGIS.Core.Data.Analyst3D.TinEdge.GeNeighbor
+ // cref: ArcGIS.Core.Data.Analyst3D.TinEdge.LeftTriangle
+ // cref: ArcGIS.Core.Data.Analyst3D.TinEdge.RightTriangle
+ #region TIN Edges
+
+ // nodes of the edge
+ var nodes = edge.Nodes;
+
+ // edge geometry
+ var polyline = edge.ToPolyline();
+ // edge length
+ var length = edge.Length;
+ // is the edge "inside"
+ var isInsideEdge = edge.IsInsideDataArea;
+ // edge type - regular/hard/soft
+ var edgeType = edge.EdgeType;
+
+ // get next (clockwise) edge in the triangle
+ var nextEdge = edge.GetNextEdgeInTriangle();
+ // get previous (anti-clockwise) edge in the triangle
+ var prevEdge = edge.GetPreviousEdgeInTriangle();
+
+ // get opposite edge
+ var oppEdge = edge.GeNeighbor();
+
+ // get left triangle
+ var leftTriangle = edge.LeftTriangle;
+ // get right triangle
+ var rightTriangle = edge.RightTriangle;
+ #endregion
+
+ // cref: ArcGIS.Core.Data.Analyst3D.TinTriangle
+ // cref: ArcGIS.Core.Data.Analyst3D.TinTriangle.Nodes
+ // cref: ArcGIS.Core.Data.Analyst3D.TinTriangle.Edges
+ // cref: ArcGIS.Core.Data.Analyst3D.TinTriangle.ToPolygon
+ // cref: ArcGIS.Core.Data.Analyst3D.TinTriangle.Length
+ // cref: ArcGIS.Core.Data.Analyst3D.TinTriangle.Area
+ // cref: ArcGIS.Core.Data.Analyst3D.TinTriangle.IsInsidedataArea
+ // cref: ArcGIS.Core.Data.Analyst3D.TinTriangle.Aspect
+ // cref: ArcGIS.Core.Data.Analyst3D.TinTriangle.Slope
+ // cref: ArcGIS.Core.Data.Analyst3D.TinTriangle.GetCentroid
+ // cref: ArcGIS.Core.Data.Analyst3D.TinTriangle.GetNormal
+ // cref: ArcGIS.Core.Data.Analyst3D.TinTriangle.GetAdjacentTriangles
+ // cref: ArcGIS.Core.Data.Analyst3D.TinTriangle.GetPointsBetweenZs
+ #region TIN Triangles
+ // nodes, edges of the triangle
+ var triNnodes = triangle.Nodes;
+ var triEdges = triangle.Edges;
+
+ // triangle geometry
+ var polygon = triangle.ToPolygon();
+ // triangle length
+ var triLength = triangle.Length;
+ // triangle area
+ var triArea = triangle.Area;
+ // is the triangle "inside"
+ var isInsideTriangle = triangle.IsInsideDataArea;
+
+ // triangle aspect and slope (radians)
+ var aspect = triangle.Aspect;
+ var slope = triangle.Slope;
+
+ // get centroid
+ var centroid = triangle.GetCentroid();
+
+ // get normal
+ var normal = triangle.GetNormal();
+
+ // get adjacent triangles
+ var adjTriangles = triangle.GetAdjacentTriangles();
+
+ // get area of triangle that falls between the z values
+ double minZ = 1.0;
+ double maxZ = 3.0;
+ IReadOnlyList coords = triangle.GetPointsBetweenZs(minZ, maxZ);
+ #endregion
+ }
+
+ #region ProSnippet Group: Terrain
+ #endregion
+
+ // cref: ArcGIS.Core.Data.Analyst3D.Terrain
+ // cref: ArcGIS.Core.Data.Geodatabase.OpenDataset``1(System.String)
+ #region Open a Terrain
+
+ public async Task OpenTerrain()
+ {
+ try
+ {
+ await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() =>
+ {
+ string path = @"d:\Data\Terrain\filegdb_Containing_A_Terrain.gdb";
+ var fileConnection = new FileGeodatabaseConnectionPath(new Uri(path));
+
+ using (Geodatabase dataStore = new Geodatabase(fileConnection))
+ {
+ string dsName = "nameOfTerrain";
+
+ using (var dataset = dataStore.OpenDataset(dsName))
+ {
+ }
+ }
+ });
+ }
+ catch (GeodatabaseNotFoundOrOpenedException exception)
+ {
+ // Handle Exception.
+ }
+ }
+
+ #endregion
+
+ // cref: ArcGIS.Core.Data.Analyst3D.TerrainDefinition
+ // cref: ArcGIS.Core.Data.Analyst3D.Terrain.GetDefinition
+ // cref: ArcGIS.Core.Data.Analyst3D.TerrainDefinition.GetFeatureClassNames
+ #region Get a Terrain Definition
+
+ public async Task GetTerrainDefinition()
+ {
+ try
+ {
+ await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() =>
+ {
+ string path = @"d:\Data\Terrain\filegdb_Containing_A_Terrain.gdb";
+ var fileConnection = new FileGeodatabaseConnectionPath(new Uri(path));
+
+ using (Geodatabase dataStore = new Geodatabase(fileConnection))
+ {
+ string dsName = "nameOfTerrain";
+
+ using (var terrainDef = dataStore.GetDefinition(dsName))
+ {
+ // get the feature class names that are used in the terrain
+ var fcNames = terrainDef.GetFeatureClassNames();
+ }
+ }
+ });
+ }
+ catch (GeodatabaseNotFoundOrOpenedException exception)
+ {
+ // Handle Exception.
+ }
+ }
+
+ #endregion
+
+ public void TerrainProperties(ArcGIS.Core.Data.Analyst3D.Terrain terrain)
+ {
+ // cref: ArcGIS.Core.Data.Analyst3D.Terrain.GetDataSourceCount
+ // cref: ArcGIS.Core.Data.Analyst3D.Terrain.GetDataSources
+ // cref: ArcGIS.Core.Data.Analyst3D.TerrainDataSource
+ // cref: ArcGIS.Core.Data.Analyst3D.TerrainDataSource.DataSourceName
+ // cref: ArcGIS.Core.Data.Analyst3D.TerrainDataSource.SurfaceType
+ // cref: ArcGIS.Core.Data.Analyst3D.TinSurfaceType
+ // cref: ArcGIS.Core.Data.Analyst3D.TerrainDataSource.MinimumResolution
+ // cref: ArcGIS.Core.Data.Analyst3D.TerrainDataSource.MaximumResolution
+ #region Get datasources from a Terrain
+ var dsCount = terrain.GetDataSourceCount();
+ IReadOnlyList dataSources = terrain.GetDataSources();
+ foreach (var ds in dataSources)
+ {
+ var dsName = ds.DataSourceName;
+ var surfaceType = ds.SurfaceType;
+ var maxResolution = ds.MaximumResolution;
+ var minResolution = ds.MinimumResolution;
+ }
+
+ #endregion
+
+ // cref: ArcGIS.Core.Data.Analyst3D.Terrain.GetPyramidLevelCount
+ // cref: ArcGIS.Core.Data.Analyst3D.Terrain.GetPyramidLevels
+ // cref: ArcGIS.Core.Data.Analyst3D.TerrainPyramidLevel
+ // cref: ArcGIS.Core.Data.Analyst3D.TerrainPyramidLevel.Resolution
+ // cref: ArcGIS.Core.Data.Analyst3D.TerrainPyramidLevel.MaximumScale
+ #region Get Pyramid Level Information from a Terrain
+ var levelCount = terrain.GetPyramidLevelCount();
+ IReadOnlyList pyramidLevels = terrain.GetPyramidLevels();
+ foreach (var pyramidLevel in pyramidLevels)
+ {
+ var resolution = pyramidLevel.Resolution;
+ var maxScale = pyramidLevel.MaximumScale;
+ }
+ #endregion
+
+ // cref: ArcGIS.Core.Data.Analyst3D.Terrain.GetTileProperties
+ // cref: ArcGIS.Core.Data.Analyst3D.TerrainTileProperties
+ // cref: ArcGIS.Core.Data.Analyst3D.TerrainTileProperties.ColumnCount
+ // cref: ArcGIS.Core.Data.Analyst3D.TerrainTileProperties.RowCount
+ // cref: ArcGIS.Core.Data.Analyst3D.TerrainTileProperties.TileSize
+ // cref: ArcGIS.Core.Data.Analyst3D.TerrainTileProperties.TileCount
+ #region Get Tile Information from a Terrain
+ var tileInfo = terrain.GetTileProperties();
+ var colCount = tileInfo.ColumnCount;
+ var rowCount = tileInfo.RowCount;
+ var tileSize = tileInfo.TileSize;
+ var tileCount = tileInfo.TileCount;
+
+ #endregion
+
+ }
+
+ public void TerrainDefinitionProperties(ArcGIS.Core.Data.Analyst3D.TerrainDefinition terrainDef)
+ {
+ // cref: ArcGIS.Core.Data.Analyst3D.TerrainDefinition.GetPyramidType
+ // cref: ArcGIS.Core.Data.Analyst3D.TerrainPyramidType
+ // cref: ArcGIS.Core.Data.Analyst3D.TerrainDefinition.GetPyramidWindowSizeProperties
+ // cref: ArcGIS.Core.Data.Analyst3D.TerrainWindowSizeProperties
+ // cref: ArcGIS.Core.Data.Analyst3D.TerrainWindowSizeProperties.Method
+ // cref: ArcGIS.Core.Data.Analyst3D.TerrainWindowSizeMethod
+ // cref: ArcGIS.Core.Data.Analyst3D.TerrainWindowSizeProperties.ZThreshold
+ // cref: ArcGIS.Core.Data.Analyst3D.TerrainWindowSizeProperties.ZThresholdStrategy
+ #region Get Pyramid Information from a TerrainDefinition
+ var pyramidType = terrainDef.GetPyramidType();
+ var pyramidProps = terrainDef.GetPyramidWindowSizeProperties();
+
+ var method = pyramidProps.Method;
+ var threshold = pyramidProps.ZThreshold;
+ var strategy = pyramidProps.ZThresholdStrategy;
+ #endregion
+ }
+
+ #region ProSnippet Group: LAS Dataset
+ #endregion
+
+ // cref: ArcGIS.Core.Data.FileSystemDatastoreType.LasDataset
+ // cref: ArcGIS.Core.Data.Analyst3D.LasDataset
+ // cref: ArcGIS.Core.Data.FileSystemDatastore.#ctor(ArcGIS.Core.Data.FileSystemConnectionPath)
+ // cref: ArcGIS.Core.Data.FileSystemDatastore.OpenDataset``1(System.String)
+ #region Open a LAS Dataset
+
+ public async Task OpenLasDataset()
+ {
+ try
+ {
+ await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() =>
+ {
+ string path = @"d:\Data\LASDataset";
+ var fileConnection = new FileSystemConnectionPath(new Uri(path), FileSystemDatastoreType.LasDataset);
+
+ using (FileSystemDatastore dataStore = new FileSystemDatastore(fileConnection))
+ {
+ string name = "utrecht_tile.lasd"; // can specify with or without the .lasd extension
+
+ using (var dataset = dataStore.OpenDataset(name))
+ {
+
+ }
+ }
+ });
+ }
+ catch (GeodatabaseNotFoundOrOpenedException exception)
+ {
+ // Handle Exception.
+ }
+ }
+
+ #endregion
+
+ // cref: ArcGIS.Core.Data.FileSystemDatastoreType.LasDataset
+ // cref: ArcGIS.Core.Data.Analyst3D.LasDatasetDefinition
+ // cref: ArcGIS.Core.Data.FileSystemDatastore.#ctor(ArcGIS.Core.Data.FileSystemConnectionPath)
+ // cref: ArcGIS.Core.Data.FileSystemDatastore.GetDefinition``1(System.String)
+ #region Get a LAS Dataset Defintion
+ public async Task GetLasDatasetDefinition()
+ {
+ try
+ {
+ await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() =>
+ {
+ string path = @"d:\Data\LASDataset";
+ var fileConnection = new FileSystemConnectionPath(new Uri(path), FileSystemDatastoreType.LasDataset);
+
+ using (FileSystemDatastore dataStore = new FileSystemDatastore(fileConnection))
+ {
+ string name = "utrecht_tile.lasd"; // can specify with or without the .lasd extension
+
+ using (var dataset = dataStore.GetDefinition(name))
+ {
+
+ }
+ }
+ });
+ }
+ catch (GeodatabaseNotFoundOrOpenedException exception)
+ {
+ // Handle Exception.
+ }
+ }
+ #endregion
+
+ public void LasDatasetProperties(ArcGIS.Core.Data.Analyst3D.LasDataset lasDataset)
+ {
+ // cref: ArcGIS.Core.Data.Analyst3D.LasDataset.GetFileCounts
+ // cref: ArcGIS.Core.Data.Analyst3D.LasDataset.GetFiles
+ // cref: ArcGIS.Core.Data.Analyst3D.LasFile
+ // cref: ArcGIS.Core.Data.Analyst3D.LasFile.FilePath
+ // cref: ArcGIS.Core.Data.Analyst3D.LasFile.FileName
+ // cref: ArcGIS.Core.Data.Analyst3D.LasFile.PointCount
+ // cref: ArcGIS.Core.Data.Analyst3D.LasFile.ZMin
+ // cref: ArcGIS.Core.Data.Analyst3D.LasFile.ZMax
+ #region Get Individual File Information from a LAS Dataset
+
+ var (lasFileCount, zLasFileCount) = lasDataset.GetFileCounts();
+ IReadOnlyList fileInfo = lasDataset.GetFiles();
+ foreach (var file in fileInfo)
+ {
+ var path = file.FilePath;
+ var name = file.FileName;
+ var ptCount = file.PointCount;
+ var zMin = file.ZMin;
+ var zMax = file.ZMax;
+ }
+ #endregion
+
+ // cref: ArcGIS.Core.Data.Analyst3D.LasDataset.GetSurfaceConstraintCount
+ // cref: ArcGIS.Core.Data.Analyst3D.LasDataset.GetSurfaceConstraints
+ // cref: ArcGIS.Core.Data.Analyst3D.SurfaceConstraint
+ // cref: ArcGIS.Core.Data.Analyst3D.SurfaceConstraint.DataSourceName
+ // cref: ArcGIS.Core.Data.Analyst3D.SurfaceConstraint.WorkspacePath
+ // cref: ArcGIS.Core.Data.Analyst3D.SurfaceConstraint.HeightField
+ // cref: ArcGIS.Core.Data.Analyst3D.SurfaceConstraint.SurfaceType
+ // cref: ArcGIS.Core.Data.Analyst3D.TinSurfaceType
+ #region Get Surface Constraint information from a LAS Dataset
+
+ var constraintCount = lasDataset.GetSurfaceConstraintCount();
+ IReadOnlyList constraints = lasDataset.GetSurfaceConstraints();
+ foreach (var constraint in constraints)
+ {
+ var dsName = constraint.DataSourceName;
+ var wksPath = constraint.WorkspacePath;
+ var heightField = constraint.HeightField;
+ var surfaceType = constraint.SurfaceType;
+ }
+ #endregion
+
+
+ // cref: ArcGIS.Core.Data.Analyst3D.LasDataset.GetUniqueClassCodes
+ // cref: ArcGIS.Core.Data.Analyst3D.LasDataset.GetUniqueReturns
+ // cref: ArcGIS.Core.Data.Analyst3D.LasReturnType
+ #region Get classification codes / Returns from a LAS Dataset
+
+ var classCodes = lasDataset.GetUniqueClassCodes();
+ var returns = lasDataset.GetUniqueReturns();
+
+ #endregion
+
+ Envelope envelope = null;
+
+ // cref: ArcGIS.Core.Data.Analyst3D.LasDataset.GetPointByID(System.Double, ArcGIS.Core.Geometry.Geometry)
+ // cref: ArcGIS.Core.Data.Analyst3D.LasPoint
+ // cref: ArcGIS.Core.Data.Analyst3D.LasPoint.Coordinate3D
+ // cref: ArcGIS.Core.Data.Analyst3D.LasPoint.ToMapPoint
+ #region Access LAS Points by ID
+
+ // access by ID
+ IReadOnlyList pts = lasDataset.GetPointByID(123456);
+
+ pts = lasDataset.GetPointByID(123456, envelope);
+ ArcGIS.Core.Data.Analyst3D.LasPoint pt = pts.FirstOrDefault();
+
+ var coords = pt.Coordinate3D;
+ var mapPoint = pt.ToMapPoint();
+ #endregion
+
+ // cref: ArcGIS.Core.Data.Analyst3D.LasDataset.SearchPoints(ArcGIS.Core.Data.Analyst3D.LasPointFilter, Systen.Double, System.Double)
+ // cref: ArcGIS.Core.Data.Analyst3D.LasPointCursor
+ // cref: ArcGIS.Core.Data.Analyst3D.LasPointCursor.MoveNext
+ // cref: ArcGIS.Core.Data.Analyst3D.LasPointCursor.Current
+ // cref: ArcGIS.Core.Data.Analyst3D.LasPoint
+ // cref: ArcGIS.Core.Data.Analyst3D.LasPointFilter
+ // cref: ArcGIS.Core.Data.Analyst3D.LasPointFilter.#ctor
+ // cref: ArcGIS.Core.Data.Analyst3D.LasPointFilter.FilterGeometry
+ // cref: ArcGIS.Core.Data.Analyst3D.LasPointFilter.ClassCodes
+ #region Search LAS Points
+
+ // search all points
+ using (ArcGIS.Core.Data.Analyst3D.LasPointCursor ptCursor = lasDataset.SearchPoints(null))
+ {
+ while (ptCursor.MoveNext())
+ {
+ using (ArcGIS.Core.Data.Analyst3D.LasPoint point = ptCursor.Current)
+ {
+
+ }
+ }
+ }
+
+ // search within an extent
+ ArcGIS.Core.Data.Analyst3D.LasPointFilter pointFilter = new ArcGIS.Core.Data.Analyst3D.LasPointFilter();
+ pointFilter.FilterGeometry = envelope;
+ using (ArcGIS.Core.Data.Analyst3D.LasPointCursor ptCursor = lasDataset.SearchPoints(pointFilter))
+ {
+ while (ptCursor.MoveNext())
+ {
+ using (ArcGIS.Core.Data.Analyst3D.LasPoint point = ptCursor.Current)
+ {
+
+ }
+ }
+ }
+
+ // search within an extent and limited to specific classsification codes
+ pointFilter = new ArcGIS.Core.Data.Analyst3D.LasPointFilter();
+ pointFilter.FilterGeometry = envelope;
+ pointFilter.ClassCodes = new List { 4, 5 };
+ using (ArcGIS.Core.Data.Analyst3D.LasPointCursor ptCursor = lasDataset.SearchPoints(pointFilter))
+ {
+ while (ptCursor.MoveNext())
+ {
+ using (ArcGIS.Core.Data.Analyst3D.LasPoint point = ptCursor.Current)
+ {
+
+ }
+ }
+ }
+ //
+ #endregion
+ }
+ }
+}
diff --git a/Examples/Geodatabase/ProSnippets.cs b/Examples/Geodatabase/ProSnippets.cs
index cf0f389..98d9bbd 100644
--- a/Examples/Geodatabase/ProSnippets.cs
+++ b/Examples/Geodatabase/ProSnippets.cs
@@ -18,7 +18,6 @@ limitations under the License.
*/
using System;
using System.Collections.Generic;
-using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
@@ -281,7 +280,7 @@ await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() =>
RelationshipClassDefinition enterpriseDefinition = geodatabase.GetDefinition("LocalGovernment.GDB.AddressPointHasSiteAddresses");
IReadOnlyList enterpriseDefinitions = geodatabase.GetRelatedDefinitions(enterpriseDefinition, DefinitionRelationshipType.DatasetsRelatedThrough);
- FeatureClassDefinition enterpriseAddressPointDefinition = enterpriseDefinitions.First(defn => defn.GetName().Equals("LocalGovernment.GDB.AddressPoint"))
+ FeatureClassDefinition enterpriseAddressPointDefinition = enterpriseDefinitions.First(defn => defn.GetName().Equals("LocalGovernment.GDB.AddressPoint"))
as FeatureClassDefinition;
FeatureDatasetDefinition featureDatasetDefinition = geodatabase.GetDefinition("LocalGovernment.GDB.Address");
@@ -1252,13 +1251,13 @@ await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() =>
{
using (Geodatabase geodatabase = new Geodatabase(new FileGeodatabaseConnectionPath(new Uri("C:\\Data\\LocalGovernment.gdb"))))
using (Database database = new Database(new DatabaseConnectionProperties(EnterpriseDatabaseType.Oracle)
- {
- AuthenticationMode = AuthenticationMode.DBMS,
- Instance = "instance",
- User = "user",
- Password = "password",
- Database = "database"
- }))
+ {
+ AuthenticationMode = AuthenticationMode.DBMS,
+ Instance = "instance",
+ User = "user",
+ Password = "password",
+ Database = "database"
+ }))
using (FeatureClass leftFeatureClass = geodatabase.OpenDataset("Hospital"))
using (Table rightTable = database.OpenTable(database.GetQueryDescription("FacilitySite")))
@@ -2638,6 +2637,91 @@ public void PartialPostingSnippet(Version designVersion, FeatureClass supportStr
#endregion
}
+ // cref: ArcGIS.Core.Data.FeatureDataset.GetDefinition``1(String)
+ // cref: ArcGIS.Core.Data.FeatureDataset.GetDefinition
+ #region Iterate datasets inside a feature dataset
+
+ public void IterateDatasetsFromAFeatureDataset(Geodatabase geodatabase, string featureDatasetName = "City", string featureClassInFeatureDataset = "Buildings")
+ {
+ // Open a feature dataset
+ using (FeatureDataset cityFeatureDataset = geodatabase.OpenDataset(featureDatasetName))
+ {
+ // Get a feature class definition from a feature dataset
+ FeatureClassDefinition buildingsFeatureClassDefinition = cityFeatureDataset.GetDefinition(featureClassInFeatureDataset);
+
+ // Iterate dataset definition
+ IReadOnlyList cityFeatureClassDefinitions = cityFeatureDataset.GetDefinitions();
+ foreach (FeatureClassDefinition cityFeatureClassDefinition in cityFeatureClassDefinitions)
+ {
+ // Use feature class definition
+ }
+ }
+ }
+
+ #endregion
+
+ // cref: ArcGIS.Core.Data.AttributeRuleDefinition.GetIsFieldEditable
+ // cref: ArcGIS.Core.Data.AttributeRuleDefinition.GetEvaluationOrder
+ // cref: ArcGIS.Core.Data.AttributeRuleDefinition.GetTriggeringEvents
+ // cref: ArcGIS.Core.Data.AttributeRuleDefinition.GetScriptExpression
+ // cref: ArcGIS.Core.Data.TableDefinition.GetAttributeRules
+ #region Get attribute rules of a dataset
+
+ public void GetAttributeRules(Geodatabase geodatabase, string tableName)
+ {
+ using (TableDefinition tableDefinition = geodatabase.GetDefinition(tableName))
+ {
+ // Get all attribute rule types
+ IReadOnlyList ruleDefinitions = tableDefinition.GetAttributeRules();
+
+ // Iterate rule definitions
+ foreach (AttributeRuleDefinition ruleDefinition in ruleDefinitions)
+ {
+ AttributeRuleType ruleType = ruleDefinition.GetAttributeRuleType();
+ string ruleDescription = ruleDefinition.GetDescription();
+ bool isAttributeFieldEditable = ruleDefinition.GetIsFieldEditable();
+ string arcadeVersionToSupportRule = ruleDefinition.GetMinimumArcadeVersion();
+ int ruleEvaluationOrder = ruleDefinition.GetEvaluationOrder();
+ AttributeRuleTriggers triggeringEvents = ruleDefinition.GetTriggeringEvents();
+ string scriptExpression = ruleDefinition.GetScriptExpression();
+
+ // more properties
+ }
+ }
+ }
+
+ #endregion
+
+ // cref: ARCGIS.CORE.DATA.TABLE.CREATEROWBUFFER
+ // cref: ARCGIS.CORE.DATA.TABLE.CREATEROWBUFFER()
+ #region Creating a row buffer from a template row
+
+ public void CreateRowBufferFromARow(Table table)
+ {
+ using (RowCursor rowCursor = table.Search())
+ {
+ if (rowCursor.MoveNext())
+ {
+ using (Row templateRow = rowCursor.Current)
+ {
+ RowBuffer rowBuffer = table.CreateRowBuffer(templateRow);
+
+ // Manipulate row buffer
+ // Doesn't allow copying values of ObjectID and GlobalID
+ //
+ // rowBuffer["Field"] = "Update";
+ //
+
+ // create a new row
+ table.CreateRow(rowBuffer);
+ }
+ }
+ }
+ }
+
+ #endregion
+
+
#region ProSnippet Group: Extension Ids
#endregion
@@ -2684,7 +2768,58 @@ public void ExtensionIds1(Table table)
#region ProSnippet Group: DDL
#endregion
+
+ // cref: ArcGIS.Core.Data.DDL.FeatureClassDescription
+ // cref: ArcGIS.Core.Data.DDL.FieldDescription
+ // cref: ArcGIS.Core.Data.DDL.ShapeDescription
+ // cref: ArcGIS.Core.Data.FieldType
+ #region 64-bit Integer field
+
+ FieldDescription bigIntegerFieldDescription = new FieldDescription("BigInteger_64", FieldType.BigInteger);
+
+ #endregion
+
+ // cref: ArcGIS.Core.Data.DDL.FeatureClassDescription
+ // cref: ArcGIS.Core.Data.DDL.FieldDescription
+ // cref: ArcGIS.Core.Data.DDL.ShapeDescription
+ // cref: ArcGIS.Core.Data.FieldType
+ #region ObjectID field
+
+ // 64-bit
+ FieldDescription oidFieldDescription_64 = new FieldDescription("ObjectID_64", FieldType.OID)
+ {
+ Length = 8
+ };
+
+ // 32-bit
+ FieldDescription oidFieldDescription_32 = new FieldDescription("ObjectID_32", FieldType.OID)
+ {
+ Length = 4
+ };
+
+ #endregion
+
+ // cref: ArcGIS.Core.Data.DDL.FeatureClassDescription
+ // cref: ArcGIS.Core.Data.DDL.FieldDescription
+ // cref: ArcGIS.Core.Data.DDL.ShapeDescription
+ // cref: ArcGIS.Core.Data.FieldType
+ #region DateOnly, TimeOnly, and TimestampOffset field
+ // Earthquake occurrences date and time
+ // 9/28/2014 (DateOnly)
+ FieldDescription earthquakeDateOnlyFieldDescription = new FieldDescription("Earthquake_DateOnly", FieldType.DateOnly);
+
+ // 1:16:42 AM (TimeOnly)
+ FieldDescription earthquakeTimeOnlyFieldDescription = new FieldDescription("Earthquake_TimeOnly", FieldType.TimeOnly);
+
+ // 9/28/2014 1:16:42.000 AM -09:00 (Timestamp with Offset)
+ FieldDescription earthquakeTimestampOffsetFieldDescription = new FieldDescription("Earthquake_TimestampOffset_Local", FieldType.TimestampOffset);
+
+ // 9/28/2014 1:16:42 AM (DateTime)
+ FieldDescription earthquakeDateFieldDescription = new FieldDescription("Earthquake_Date", FieldType.Date);
+
+ #endregion
+
// cref: ArcGIS.Core.Data.DDL.SchemaBuilder.Create(ArcGIS.Core.Data.DDL.TableDescription)
// cref: ArcGIS.Core.Data.DDL.SchemaBuilder.Build
// cref: ArcGIS.Core.Data.DDL.SchemaBuilder.ErrorMessages
@@ -3830,8 +3965,8 @@ public void CreateAnnotationFeatureClassUsingExistingAnnotationFeatureClassInDat
}
#endregion
- // cref: ArcGIS.Core.ArcGIS.Core.Data.MemoryConnectionProperties.#ctor()
- // cref: ArcGIS.Core.ArcGIS.Core.Data.DDL.SchemaBuilder.CreateGeodatabase(MemoryConnectionProperties)
+ // cref: ArcGIS.Core.Data.MemoryConnectionProperties.#ctor
+ // cref: ArcGIS.Core.Data.DDL.SchemaBuilder.CreateGeodatabase(ArcGIS.Core.Data.MemoryConnectionProperties)
#region Creating the memory geodatabase
public Geodatabase GetMemoryGeodatabase()
{
@@ -3847,8 +3982,8 @@ public Geodatabase GetMemoryGeodatabase()
}
#endregion
- // cref: ARCGIS.CORE.ARCGIS.CORE.DATA.SPATIALQUERYFILTER.SPATIALRELATIONSHIP
- // cref: ArcGIS.Core.ArcGIS.Core.Data.SpatialQueryFilter.SpatialRelationshipDescription
+ // cref: ArcGIS.Core.Data.SPATIALQUERYFILTER.SPATIALRELATIONSHIP
+ // cref: ArcGIS.Core.Data.SpatialQueryFilter.SpatialRelationshipDescription
#region Spatial query filter with DE9-IM spatial relationships
public void FindSpatiallyRelatedFeaturesUsingDE9IMPredicate(Geodatabase geodatabase, FeatureClass polygonFeatureClass, FeatureClass polylineFeatureClass)
{
@@ -3881,8 +4016,8 @@ public void FindSpatiallyRelatedFeaturesUsingDE9IMPredicate(Geodatabase geodatab
}
#endregion
- // cref: ARCGIS.CORE.ARCGIS.CORE.DATA.GEODATABASE.OPENDATASET
- // cref: ARCGIS.CORE.ARCGIS.CORE.DATA.REGISTRATIONTYPE
+ // cref: ArcGIS.Core.Data.GEODATABASE.OpenDataset``1(System.String)
+ // cref: ArcGIS.Core.Data.REGISTRATIONTYPE
#region Check if table is versioned
public bool IsTableVersioned(Geodatabase geodatabase, string tableName)
{
@@ -3899,9 +4034,9 @@ public bool IsTableVersioned(Geodatabase geodatabase, string tableName)
}
#endregion
- // cref: ArcGIS.Core.ArcGIS.Core.Data.DDL.AttributeIndexDescription.#ctor(String,TableDescription,IEnumerable{String})
- // cref: ArcGIS.Core.ArcGIS.Core.Data.DDL.AttributeIndexDescription.#ctor(Index,TableDescription)
- // cref: ArcGIS.Core.ArcGIS.Core.Data.DDL.SchemaBuilder.Create(IndexDescription)
+ // cref: ArcGIS.Core.Data.DDL.AttributeIndexDescription.#ctor(System.String,ArcGIS.Core.Data.DDL.TableDescription,System.Collections.Generic.IEnumerable{System.String})
+ // cref: ArcGIS.Core.Data.DDL.AttributeIndexDescription.#ctor(Index,TableDescription)
+ // cref: ArcGIS.Core.Data.DDL.SchemaBuilder.Create(IndexDescription)
#region Creating a table with index from scratch
public void CreatingTableWithIndex(SchemaBuilder schemaBuilder)
{
@@ -3926,8 +4061,8 @@ public void CreatingTableWithIndex(SchemaBuilder schemaBuilder)
}
#endregion
- // cref: ArcGIS.Core.Data.DDL.AttributeIndexDescription#ctor(String,TableDescription,IEnumerable{String})
- // cref: ArcGIS.Core.Data.DDL.SpatialIndexDescription#ctor
+ // cref: ArcGIS.Core.Data.DDL.AttributeIndexDescription.#ctor(String,TableDescription,IEnumerable{String})
+ // cref: ArcGIS.Core.Data.DDL.SpatialIndexDescription.#ctor(ArcGIS.Core.Data.DDL.FeatureClassDescription)
// cref: ArcGIS.Core.Data.DDL.SchemaBuilder.Create(IndexDescription)
#region Adding indexes in pre-existing dataset
public void AddingIndexes(SchemaBuilder schemaBuilder, FeatureClassDefinition featureClassDefinition)
@@ -3959,8 +4094,8 @@ public void AddingIndexes(SchemaBuilder schemaBuilder, FeatureClassDefinition fe
}
#endregion
- // cref: ArcGIS.Core.Data.DDL.AttributeIndexDescription#ctor(Index,TableDescription)
- // cref: cref: ArcGIS.Core.Data.DDL.SchemaBuilder.Delete
+ // cref: ArcGIS.Core.Data.DDL.AttributeIndexDescription.#ctor(Index,TableDescription)
+ // cref: ArcGIS.Core.Data.DDL.SchemaBuilder.Delete
#region Removing attribute index
public void RemoveAttributeIndex(SchemaBuilder schemaBuilder, FeatureClassDefinition featureClassDefinition, string attributeIndexName)
{
@@ -3978,7 +4113,7 @@ public void RemoveAttributeIndex(SchemaBuilder schemaBuilder, FeatureClassDefini
}
#endregion
- // cref: ArcGIS.Core.Data.DDL.SpatialIndexDescription#ctor
+ // cref: ArcGIS.Core.Data.DDL.SpatialIndexDescription.#ctor
// cref: ArcGIS.Core.Data.DDL.SchemaBuilder.Delete
#region Removing spatial index
public void RemoveSpatialIndex(SchemaBuilder schemaBuilder, FeatureClassDefinition featureClassDefinition)
@@ -4018,7 +4153,7 @@ public void ModifyDomain(Geodatabase geodatabase, string codedValueDomainName =
}
#endregion
- // cref: ArcGIS.Core.Data.DDL.SchemaBuilder.Rename.
+ // cref: ArcGIS.Core.Data.DDL.SchemaBuilder.Rename
#region Rename domain
public void RenameDomain(Geodatabase geodatabase, string rangeDomainOldName = "PipeDiameter", string rangeDomainNewName = "PipeDiam")
{
@@ -4046,7 +4181,7 @@ public void DeleteDomain(Geodatabase geodatabase, string domainNameToBeDeleted =
#endregion
// cref: ArcGIS.Core.Data.DDL.SchemaBuilder.Create(TableDescription)
- // cref: ArcGIS.Core.Data.DDL.SubtypeFieldDescription#ctor
+ // cref: ArcGIS.Core.Data.DDL.SubtypeFieldDescription.#ctor
#region Creating table with subtypes
public void CreateTableWithSubtypes(SchemaBuilder schemaBuilder)
{
@@ -4105,8 +4240,8 @@ public void ModifySubtypes(SchemaBuilder schemaBuilder, TableDefinition tableDef
#endregion
// cref: ArcGIS.Core.Data.DDL.SchemaBuilder.Create(RelationshipClassDescription)
- // cref: ArcGIS.Core.Data.DDL.RelationshipClassDescription#ctor
- // cref: ArcGIS.Core.Data.DDL.SubtypeFieldDescription#ctor
+ // cref: ArcGIS.Core.Data.DDL.RelationshipClassDescription.#ctor
+ // cref: ArcGIS.Core.Data.DDL.SubtypeFieldDescription.#ctor
#region Creating relationship class
public void CreateRelationshipWithRelationshipRules(SchemaBuilder schemaBuilder)
{
@@ -4318,6 +4453,6 @@ private void ModifyExistingField(SchemaBuilder schemaBuilder, TableDefinition ta
schemaBuilder.Build();
}
#endregion
-
+
}
}
diff --git a/Examples/Geometry/ProSnippets.cs b/Examples/Geometry/ProSnippets.cs
index 2219f4b..d6f7c0e 100644
--- a/Examples/Geometry/ProSnippets.cs
+++ b/Examples/Geometry/ProSnippets.cs
@@ -307,6 +307,121 @@ public void SpatialReference()
#endregion
}
+ {
+ // cref: ArcGIS.Core.Geometry.SpatialReference.GetWkt2(ArcGIS.Core.Geometry.WktFormatMode)
+ // cref: ArcGIS.Core.Geometry.SpatialReferenceBuilder.GetWkt2(ArcGIS.Core.Geometry.WktFormatMode)
+ // cref: ArcGIS.Core.Geometry.WktFormatMode
+ #region SpatialReference WKT2
+
+ SpatialReference sr = SpatialReferences.WebMercator;
+
+ // Get Esri WKT
+ string wkt = sr.Wkt;
+ /*
+ PROJCS["WGS_1984_Web_Mercator_Auxiliary_Sphere",
+ GEOGCS["GCS_WGS_1984",
+ DATUM["D_WGS_1984",
+ SPHEROID["WGS_1984", 6378137.0, 298.257223563]],
+ PRIMEM["Greenwich", 0.0],
+ UNIT["Degree", 0.0174532925199433]],
+ PROJECTION["Mercator_Auxiliary_Sphere"],
+ PARAMETER["False_Easting", 0.0],
+ PARAMETER["False_Northing", 0.0],
+ PARAMETER["Central_Meridian", 0.0],
+ PARAMETER["Standard_Parallel_1", 0.0],
+ PARAMETER["Auxiliary_Sphere_Type", 0.0],
+ UNIT["Meter", 1.0]]
+ */
+
+ // Get OGC WKT2
+ string wkt2 = sr.GetWkt2(WktFormatMode.None);
+ /*
+ PROJCRS["WGS_1984_Web_Mercator_Auxiliary_Sphere",
+ BASEGEOGCRS["GCS_WGS_1984",
+ DYNAMIC[FRAMEEPOCH[1990.5], MODEL["AM0-2"]],
+ DATUM["D_WGS_1984",
+ ELLIPSOID["WGS_1984", 6378137.0, 298.257223563, LENGTHUNIT["Meter", 1.0]]],
+ PRIMEM["Greenwich", 0.0, ANGLEUNIT["Degree", 0.0174532925199433]],
+ CS[ellipsoidal, 2],
+ AXIS["Latitude (lat)", north, ORDER[1]],
+ AXIS["Longitude (lon)", east, ORDER[2]],
+ ANGLEUNIT["Degree", 0.0174532925199433]],
+ CONVERSION["Mercator_Auxiliary_Sphere",
+ METHOD["Mercator_Auxiliary_Sphere"],
+ PARAMETER["False_Easting", 0.0, LENGTHUNIT["Meter", 1.0]],
+ PARAMETER["False_Northing", 0.0, LENGTHUNIT["Meter", 1.0]],
+ PARAMETER["Central_Meridian", 0.0, ANGLEUNIT["Degree", 0.0174532925199433]],
+ PARAMETER["Standard_Parallel_1", 0.0, ANGLEUNIT["Degree", 0.0174532925199433]],
+ PARAMETER["Auxiliary_Sphere_Type", 0.0]],
+ CS[Cartesian, 2],
+ AXIS["Easting (X)", east, ORDER[1]],
+ AXIS["Northing (Y)", north, ORDER[2]],
+ LENGTHUNIT["Meter", 1.0]]
+ */
+
+ // You can create a spatial reference with the Esri WKT string or the OCG WKT2 string
+ sr = SpatialReferenceBuilder.CreateSpatialReference(wkt2);
+
+ // Get OGC WKT2 including authority in top-level objects
+ // In this case the authority is written as ID["EPSG",3857]
+ wkt2 = sr.GetWkt2(WktFormatMode.AuthorityTop);
+ /*
+ PROJCRS["WGS_1984_Web_Mercator_Auxiliary_Sphere",
+ BASEGEOGCRS["GCS_WGS_1984",
+ DYNAMIC[FRAMEEPOCH[1990.5],MODEL["AM0-2"]],
+ DATUM["D_WGS_1984",
+ ELLIPSOID["WGS_1984",6378137.0,298.257223563,LENGTHUNIT["Meter",1.0]]],
+ PRIMEM["Greenwich",0.0,ANGLEUNIT["Degree",0.017453292519943295]],
+ CS[ellipsoidal,2],
+ AXIS["Latitude (lat)",north,ORDER[1]],
+ AXIS["Longitude(lon)",east,ORDER[2]],
+ ANGLEUNIT["Degree",0.017453292519943295]],
+ CONVERSION["Mercator_Auxiliary_Sphere",
+ METHOD["Mercator_Auxiliary_Sphere"],
+ PARAMETER["False_Easting",0.0,LENGTHUNIT["Meter",1.0]],
+ PARAMETER["False_Northing",0.0,LENGTHUNIT["Meter",1.0]],
+ PARAMETER["Central_Meridian",0.0,ANGLEUNIT["Degree",0.017453292519943295]],
+ PARAMETER["Standard_Parallel_1",0.0,ANGLEUNIT["Degree",0.017453292519943295]],
+ PARAMETER["Auxiliary_Sphere_Type",0.0]],
+ CS[Cartesian,2],
+ AXIS["Easting (X)",east,ORDER[1]],
+ AXIS["Northing (Y)",north,ORDER[2]],
+ LENGTHUNIT["Meter",1.0],
+ ID["EPSG",3857]]
+ */
+
+ // Get OGC WKT2 including authority in all objects
+ // Authority is written as ID["ESPG",] or ID["Esri",]
+ wkt2 = sr.GetWkt2(WktFormatMode.AuthorityAll);
+ /*
+ PROJCRS["WGS_1984_Web_Mercator_Auxiliary_Sphere",
+ BASEGEOGCRS["GCS_WGS_1984",
+ DYNAMIC[FRAMEEPOCH[1990.5],MODEL["AM0-2"]],
+ DATUM["D_WGS_1984",
+ ELLIPSOID["WGS_1984",6378137.0,298.257223563,LENGTHUNIT["Meter",1.0,ID["EPSG",9001]],ID["EPSG",7030]],
+ ID["EPSG",6326]],
+ PRIMEM["Greenwich",0.0,ANGLEUNIT["Degree",0.017453292519943295,ID["EPSG",9102]],ID["EPSG",8901]],
+ CS[ellipsoidal,2],
+ AXIS["Latitude (lat)",north,ORDER[1]],
+ AXIS["Longitude(lon)",east,ORDER[2]],
+ ANGLEUNIT["Degree",0.017453292519943295,ID["EPSG",9102]],ID["EPSG",4326]],
+ CONVERSION["Mercator_Auxiliary_Sphere",
+ METHOD["Mercator_Auxiliary_Sphere",ID["Esri",43104]],
+ PARAMETER["False_Easting",0.0,LENGTHUNIT["Meter",1.0,ID["EPSG",9001]],ID["Esri",100001]],
+ PARAMETER["False_Northing",0.0,LENGTHUNIT["Meter",1.0,ID["EPSG",9001]],ID["Esri",100002]],
+ PARAMETER["Central_Meridian",0.0,ANGLEUNIT["Degree",0.017453292519943295,ID["EPSG",9102]],ID["Esri",100010]],
+ PARAMETER["Standard_Parallel_1",0.0,ANGLEUNIT["Degree",0.017453292519943295,ID["EPSG",9102]],ID["Esri",100025]],
+ PARAMETER["Auxiliary_Sphere_Type",0.0,ID["Esri",100035]]],
+ CS[Cartesian,2],
+ AXIS["Easting(X)",east,ORDER[1]],
+ AXIS["Northing (Y)",north,ORDER[2]],
+ LENGTHUNIT["Meter",1.0,ID["EPSG",9001]],
+ ID["EPSG",3857]]
+ */
+
+ #endregion Spatial Reference WKT2
+ }
+
{
// cref: ArcGIS.Core.Geometry.SpatialReference.ToJson
// cref: ArcGIS.Core.Geometry.SpatialReference.ToXml
@@ -1441,6 +1556,84 @@ public void SplitPolyline()
#endregion
}
+ public Polyline Create3DPolylineFrom2DPolyline(Polyline polyline)
+ {
+ // cref: ArcGIS.Core.Geometry.MultipartBuilderEx.HasZ
+ // cref: ArcGIS.Core.Geometry.MultipartBuilderEx.ReplaceSegment
+ #region Create 3D Polyline and set Z-values while preserving curve segments
+
+ PolylineBuilderEx polylineBuilder = new PolylineBuilderEx(polyline);
+ polylineBuilder.HasZ = true;
+
+ // The HasZ property is set to true for all the points in
+ // polyline3D when you call ToGeometry().
+ Polyline polyline3D = polylineBuilder.ToGeometry();
+
+ // For this example, create Z-values.
+ // You may want to pass them in as a parameter.
+ int numPoints = polyline3D.PointCount;
+ double[] zValues = new double[numPoints];
+ for (int i = 0; i < numPoints; i++)
+ {
+ zValues[i] = i % 2 == 0 ? 2 : 1;
+ }
+
+ // We need to know at which point index each part starts
+ int partPointIndex = 0;
+ int numParts = polyline3D.PartCount;
+
+ for (int i = 0; i < numParts; i++)
+ {
+ var part = polyline3D.Parts[i];
+ int numSegments = part.Count;
+
+ for (int j = 0; j < numSegments; j++)
+ {
+ Segment segment = part[j];
+
+ MapPointBuilderEx pointBuilder = new MapPointBuilderEx(segment.StartPoint);
+ pointBuilder.Z = zValues[partPointIndex++];
+ MapPoint startPoint = pointBuilder.ToGeometry();
+
+ // Make sure that the end point of this segment is the same as the start point of the next segment
+ pointBuilder = new MapPointBuilderEx(segment.EndPoint);
+ pointBuilder.Z = zValues[partPointIndex];
+ MapPoint endPoint = pointBuilder.ToGeometry();
+
+ SegmentType segmentType = segment.SegmentType;
+ SegmentBuilderEx segmentBuilder = null;
+ switch (segmentType)
+ {
+ case SegmentType.Line:
+ segmentBuilder = new LineBuilderEx((LineSegment)segment);
+ break;
+ case SegmentType.Bezier:
+ segmentBuilder = new CubicBezierBuilderEx((CubicBezierSegment)segment);
+ break;
+ case SegmentType.EllipticArc:
+ segmentBuilder = new EllipticArcBuilderEx((EllipticArcSegment)segment);
+ break;
+ }
+
+ // Only change the start and end point which now have Z-values set.
+ // This will preserve the curve if the segment is an EllipticArcSegment or CubicBezierSegment.
+ segmentBuilder.StartPoint = startPoint;
+ segmentBuilder.EndPoint = endPoint;
+ segment = segmentBuilder.ToSegment();
+
+ polylineBuilder.ReplaceSegment(i, j, segment);
+ }
+
+ // Move point index for the next part
+ partPointIndex++;
+ }
+
+ polyline3D = polylineBuilder.ToGeometry();
+ return polyline3D;
+
+ #endregion
+ }
+
#region ProSnippet Group: Polygon
#endregion
diff --git a/Examples/Geoprocessing/Geoprocessing_Examples.cs b/Examples/Geoprocessing/Geoprocessing_Examples.cs
index a1c2569..3a4fcf6 100644
--- a/Examples/Geoprocessing/Geoprocessing_Examples.cs
+++ b/Examples/Geoprocessing/Geoprocessing_Examples.cs
@@ -143,8 +143,8 @@ await Geoprocessing.ExecuteToolAsync("management.CopyFeatures", parameters,
public async void ExecuteEBK()
{
- // cref: gp_events;ArcGIS.Desktop.Core.Geoprocessing.Geoprocessing.ExecuteToolAsync(System.String,System.Collections.Generic.IEnumerable{System.String},System.Collections.Generic.IEnumerable{System.Collections.Generic.KeyValuePair{System.String,System.String}},System.Nullable{System.Threading.CancellationToken},ArcGIS.Desktop.Core.Geoprocessing.GPToolExecuteEventHandler,ArcGIS.Desktop.Core.Geoprocessing.GPExecuteToolFlags)
- // cref: gp_events;ArcGIS.Desktop.Core.Geoprocessing.GPToolExecuteEventHandler
+ // cref: ArcGIS.Desktop.Core.Geoprocessing.Geoprocessing.ExecuteToolAsync(System.String,System.Collections.Generic.IEnumerable{System.String},System.Collections.Generic.IEnumerable{System.Collections.Generic.KeyValuePair{System.String,System.String}},System.Nullable{System.Threading.CancellationToken},ArcGIS.Desktop.Core.Geoprocessing.GPToolExecuteEventHandler,ArcGIS.Desktop.Core.Geoprocessing.GPExecuteToolFlags)
+ // cref: ArcGIS.Desktop.Core.Geoprocessing.GPToolExecuteEventHandler
#region GPTool Execute Event Handler
System.Threading.CancellationTokenSource _cts;
@@ -195,7 +195,7 @@ public async void ShowMessageBox()
// cref: ArcGIS.Desktop.Core.Geoprocessing.Geoprocessing.ExecuteToolAsync
// cref: ArcGIS.Desktop.Core.Geoprocessing.Geoprocessing.ExecuteToolAsync(STRING,IENUMERABLE{STRING},IENUMERABLE{KEYVALUEPAIR{STRING,STRING}},NULLABLE{CANCELLATIONTOKEN},GPTOOLEXECUTEEVENTHANDLER,GPEXECUTETOOLFLAGS)
// cref: ArcGIS.Desktop.Core.Geoprocessing.Geoprocessing.ExecuteToolAsync(STRING,IENUMERABLE{STRING},IENUMERABLE{KEYVALUEPAIR{STRING,STRING}},CANCELABLEPROGRESSOR,GPEXECUTETOOLFLAGS)
- // cref: message_box;ArcGIS.Desktop.Core.Geoprocessing.Geoprocessing.ShowMessageBox(System.Collections.Generic.IEnumerable{ArcGIS.Desktop.Core.Geoprocessing.IGPMessage},System.String,ArcGIS.Desktop.Core.Geoprocessing.GPMessageBoxStyle,System.String,System.String,ArcGIS.Desktop.Framework.Contracts.ViewModelBase)
+ // cref: ArcGIS.Desktop.Core.Geoprocessing.Geoprocessing.ShowMessageBox(System.Collections.Generic.IEnumerable{ArcGIS.Desktop.Core.Geoprocessing.IGPMessage},System.String,ArcGIS.Desktop.Core.Geoprocessing.GPMessageBoxStyle,System.String,System.String,ArcGIS.Desktop.Framework.Contracts.ViewModelBase)
#region Geoprocessing specialized MessageBox
var gp_result = await Geoprocessing.ExecuteToolAsync("management.GetCount", Geoprocessing.MakeValueArray(@"C:\data\f.gdb\hello"));
// this icon shows up left of content_header
@@ -207,7 +207,7 @@ public async void ShowMessageBox()
private void OpenBufferToolDialog()
{
// cref: ARCGIS.DESKTOP.CORE.GEOPROCESSING.GEOPROCESSING.MakeValueArray
- // cref: open_dialog;ArcGIS.Desktop.Core.Geoprocessing.Geoprocessing.OpenToolDialog(System.String,System.Collections.Generic.IEnumerable{System.String},System.Collections.Generic.IEnumerable{System.Collections.Generic.KeyValuePair{System.String,System.String}},System.Boolean,ArcGIS.Desktop.Core.Geoprocessing.GPToolExecuteEventHandler)
+ // cref: ArcGIS.Desktop.Core.Geoprocessing.Geoprocessing.OpenToolDialog(System.String,System.Collections.Generic.IEnumerable{System.String},System.Collections.Generic.IEnumerable{System.Collections.Generic.KeyValuePair{System.String,System.String}},System.Boolean,ArcGIS.Desktop.Core.Geoprocessing.GPToolExecuteEventHandler)
#region Geoprocessing Open ToolDialog
string input_points = @"C:\data\ca_ozone.gdb\ozone_points";
string output_polys = @"C:\data\ca_ozone.gdb\ozone_buff";
diff --git a/Examples/KnowledgeGraph/KnowledgeGraph.csproj b/Examples/KnowledgeGraph/KnowledgeGraph.csproj
new file mode 100644
index 0000000..b02f31d
--- /dev/null
+++ b/Examples/KnowledgeGraph/KnowledgeGraph.csproj
@@ -0,0 +1,79 @@
+
+
+
+ net6.0
+ enable
+ enable
+ x64
+
+
+
+ C:\Program Files\ArcGIS\Pro\bin\Extensions\Core\ArcGIS.Desktop.Core.dll
+ False
+
+
+ C:\Program Files\ArcGIS\Pro\bin\Extensions\Mapping\ArcGIS.Desktop.Mapping.dll
+ False
+
+
+ C:\Program Files\ArcGIS\Pro\bin\ArcGIS.Desktop.Framework.dll
+ False
+
+
+ C:\Program Files\ArcGIS\Pro\bin\ArcGIS.Core.dll
+ False
+
+
+ C:\Program Files\ArcGIS\Pro\bin\Extensions\Editing\ArcGIS.Desktop.Editing.dll
+ False
+
+
+ C:\Program Files\ArcGIS\Pro\bin\Extensions\Catalog\ArcGIS.Desktop.Catalog.dll
+ False
+
+
+ C:\Program Files\ArcGIS\Pro\bin\Extensions\DesktopExtensions\ArcGIS.Desktop.Extensions.dll
+ False
+
+
+ C:\Program Files\ArcGIS\Pro\bin\ArcGIS.Desktop.Shared.Wpf.dll
+ False
+
+
+ C:\Program Files\ArcGIS\Pro\bin\Extensions\ArcGISSearch\ArcGIS.Desktop.Search.dll
+ False
+
+
+ C:\Program Files\ArcGIS\Pro\bin\Extensions\DataSourcesRaster\ArcGIS.Desktop.DataSourcesRaster.dll
+ False
+
+
+ C:\Program Files\ArcGIS\Pro\bin\Extensions\GeoProcessing\ArcGIS.Desktop.GeoProcessing.dll
+ False
+
+
+ C:\Program Files\ArcGIS\Pro\bin\Extensions\Layout\ArcGIS.Desktop.Layouts.dll
+ False
+
+
+ C:\Program Files\ArcGIS\Pro\bin\Extensions\Sharing\ArcGIS.Desktop.Sharing.dll
+ False
+
+
+ C:\Program Files\ArcGIS\Pro\bin\Extensions\TaskAssistant\ArcGIS.Desktop.TaskAssistant.dll
+ False
+
+
+ C:\Program Files\ArcGIS\Pro\bin\Extensions\Workflow\ArcGIS.Desktop.Workflow.dll
+ False
+
+
+ C:\Program Files\ArcGIS\Pro\bin\ArcGIS.CoreHost.dll
+ False
+
+
+ C:\Program Files\ArcGIS\Pro\bin\Extensions\DataReviewer\ArcGIS.Desktop.DataReviewer.dll
+ False
+
+
+
diff --git a/Examples/KnowledgeGraph/ProSnippetsKnowledgeGraph.cs b/Examples/KnowledgeGraph/ProSnippetsKnowledgeGraph.cs
new file mode 100644
index 0000000..21efa94
--- /dev/null
+++ b/Examples/KnowledgeGraph/ProSnippetsKnowledgeGraph.cs
@@ -0,0 +1,893 @@
+/*
+
+ Copyright 2023 Esri
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+using ArcGIS.Core.CIM;
+using ArcGIS.Core.Data;
+using ArcGIS.Core.Data.Exceptions;
+using ArcGIS.Core.Data.Knowledge;
+using ArcGIS.Core.Data.Realtime;
+using ArcGIS.Core.Geometry;
+using ArcGIS.Desktop.Framework.Threading.Tasks;
+using ArcGIS.Desktop.Mapping;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace KnowledgeGraphSnippets
+{
+ internal class ProSnippetsKnowledgeGraph
+ {
+
+ #region ProSnippet Group: KnowledgeGraph Datastore
+ #endregion
+
+ public static void Datastore1()
+ {
+ var featLayer = MapView.Active.Map.GetLayersAsFlattenedList()
+ .OfType().FirstOrDefault();
+ if (featLayer == null)
+ return;
+
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraph.#CTOR(ArcGIS.Core.Data.Knowledge.KnowledgeGraphConnectionProperties)
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphConnectionProperties.#CTOR(System.Uri)
+ #region Opening a Connection to a KnowledgeGraph
+
+ string url =
+ @"https://acme.server.com/server/rest/services/Hosted/AcmeKnowledgeGraph/KnowledgeGraphServer";
+
+ QueuedTask.Run(() =>
+ {
+ //Create a connection properties
+ var kg_props =
+ new KnowledgeGraphConnectionProperties(new Uri(url));
+ try
+ {
+ //Open a connection
+ using (var kg = new KnowledgeGraph(kg_props))
+ {
+ //TODO...use the KnowledgeGraph
+ }
+ }
+ catch (GeodatabaseNotFoundOrOpenedException ex)
+ {
+ System.Diagnostics.Debug.WriteLine(ex.ToString());
+ }
+ });
+
+ #endregion
+ }
+
+ public static void Datastore2()
+ {
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraph
+ //cref: ArcGIS.Desktop.Mapping.KnowledgeGraphLayer
+ #region Getting a Connection from a KnowledgeGraphLayer
+
+ var kgLayer = MapView.Active.Map.GetLayersAsFlattenedList()
+ .OfType().FirstOrDefault();
+ //KnowledgeGraphLayer is a composite layer - get the first
+ //child feature layer or standalone table
+ QueuedTask.Run(() =>
+ {
+ var featlayer = kgLayer?.GetLayersAsFlattenedList()?
+ .OfType()?.FirstOrDefault();
+ KnowledgeGraph kg = null;
+ if (featlayer != null)
+ {
+ using (var fc = featlayer.GetFeatureClass())
+ kg = fc.GetDatastore() as KnowledgeGraph;
+ //TODO use KnowledgeGraph
+ }
+ else
+ {
+ //try standalone table
+ var stbl = kgLayer?.GetStandaloneTablesAsFlattenedList()?
+ .FirstOrDefault();
+ if (stbl != null)
+ {
+ using (var tbl = stbl.GetTable())
+ kg = tbl.GetDatastore() as KnowledgeGraph;
+ //TODO use KnowledgeGraph
+ }
+ }
+ });
+ #endregion
+ }
+
+ public void Datastore3()
+ {
+ var url = "";
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraph.#CTOR(ArcGIS.Core.Data.Knowledge.KnowledgeGraphConnectionProperties)
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphConnectionProperties.#CTOR(System.Uri)
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraph.GetDefinitions
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraph.OpenDataset(string)
+ #region Retrieving FeatureClasses and Definitions
+
+ QueuedTask.Run(() =>
+ {
+ //Create a connection properties
+ var kg_props =
+ new KnowledgeGraphConnectionProperties(new Uri(url));
+ //Connect to the KnowledgeGraph datastore
+ //KnowledgeGraph datastores contain tables and feature classes
+ using (var kg = new KnowledgeGraph(kg_props))
+ {
+ //Get the featureclass definitions from the KG datastore
+ var fc_defs = kg.GetDefinitions();
+ //For each feature class definition, get the corresponding
+ //feature class. Note: The name of the feature class will match
+ //the name of its corresponding KnowledgeGraph named object type
+ //in the KnowledgeGraph graph data model
+ foreach (var fc_def in fc_defs)
+ {
+ var fc_name = fc_def.GetName();
+ using (var fc = kg.OpenDataset(fc_name))
+ {
+ //TODO - use the feature class
+ }
+ }
+ }
+ });
+ #endregion
+ }
+
+ public void Datastore4()
+ {
+ var url = "";
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraph.#CTOR(ArcGIS.Core.Data.Knowledge.KnowledgeGraphConnectionProperties)
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphConnectionProperties.#CTOR(System.Uri)
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraph.GetDefinitions
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraph.OpenDataset(string)
+ #region Retrieving Tables and Definitions
+
+ QueuedTask.Run(() =>
+ {
+ //Create a connection properties
+ var kg_props =
+ new KnowledgeGraphConnectionProperties(new Uri(url));
+ //Connect to the KnowledgeGraph datastore
+ //KnowledgeGraph datastores contain tables and feature classes
+ using (var kg = new KnowledgeGraph(kg_props))
+ {
+ //Get the table definitions from the KG datastore
+ var tbl_defs = kg.GetDefinitions();
+ //For each table definition, get the corresponding
+ //table. Note: The name of the table will match the name
+ //of its corresponding KnowledgeGraph named object type in
+ //the KnowledgeGraph graph data model
+ foreach (var tbl_def in tbl_defs)
+ {
+ var tbl_name = tbl_def.GetName();
+ using (var fc = kg.OpenDataset
(tbl_name))
+ {
+ //TODO - use the table
+ }
+ }
+ }
+ });
+ #endregion
+ }
+
+ #region ProSnippet Group: KnowledgeGraph Graph Data Model
+ #endregion
+
+ public void DataModel1()
+ {
+ var url = "";
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraph.GetDataModel()
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphDataModel
+ #region Retrieving the Data Model
+
+ QueuedTask.Run(() =>
+ {
+ //Create a connection properties
+ var kg_props =
+ new KnowledgeGraphConnectionProperties(new Uri(url));
+ using (var kg = new KnowledgeGraph(kg_props))
+ {
+ //Get the KnowledgeGraph Data Model
+ using(var kg_dm = kg.GetDataModel())
+ {
+ //TODO use KG data model...
+ }
+ }
+ });
+
+ #endregion
+ }
+
+ public void DataModel2()
+ {
+ var url = "";
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraph.GetDataModel()
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphDataModel.GetTimestamp
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraph.GetSpatialReference()
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphDataModel
+ #region Get Data Model Properties
+
+ QueuedTask.Run(() =>
+ {
+ //Create a connection properties
+ var kg_props =
+ new KnowledgeGraphConnectionProperties(new Uri(url));
+ using (var kg = new KnowledgeGraph(kg_props))
+ {
+ //Get the KnowledgeGraph Data Model
+ using (var kg_dm = kg.GetDataModel())
+ {
+ var kg_name = System.IO.Path.GetFileName(
+ System.IO.Path.GetDirectoryName(kg_props.URL.ToString()));
+
+ System.Diagnostics.Debug.WriteLine(
+ $"\r\n'{kg_name}' Datamodel:\r\n-----------------");
+ var time_stamp = kg_dm.GetTimestamp();
+ var sr = kg_dm.GetSpatialReference();
+ System.Diagnostics.Debug.WriteLine($"Timestamp: {time_stamp}");
+ System.Diagnostics.Debug.WriteLine($"Sref: {sr.Wkid}");
+ System.Diagnostics.Debug.WriteLine(
+ $"IsStrict: {kg_dm.GetIsStrict()}");
+ System.Diagnostics.Debug.WriteLine(
+ $"OIDPropertyName: {kg_dm.GetOIDPropertyName()}");
+ System.Diagnostics.Debug.WriteLine(
+ $"IsArcGISManaged: {kg_dm.GetIsArcGISManaged()}");
+ }
+ }
+ });
+
+ #endregion
+ }
+
+ public void DataModel3()
+ {
+ var url = "";
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphDataModel.GetIdentifierInfo
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphIdentifierInfo
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphIdentifierInfo.GetIdentifierGeneration
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphIdentifierGeneration
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphNativeIdentifier
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphUniformIdentifier
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphUniformIdentifier.GetIdentifierName
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphIdentifierGeneration.GetMethodHint
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphUUIDMethodHint
+ #region Get Data Model Identifier Info
+
+ QueuedTask.Run(() =>
+ {
+ //Create a connection properties
+ var kg_props =
+ new KnowledgeGraphConnectionProperties(new Uri(url));
+ using (var kg = new KnowledgeGraph(kg_props))
+ {
+ //Get the KnowledgeGraph Data Model
+ using (var kg_dm = kg.GetDataModel())
+ {
+ var kg_id_info = kg_dm.GetIdentifierInfo();
+ var kg_id_gen = kg_id_info.GetIdentifierGeneration();
+ if (kg_id_info is KnowledgeGraphNativeIdentifier kg_ni)
+ {
+ System.Diagnostics.Debug.WriteLine(
+ $"IdentifierInfo: KnowledgeGraphNativeIdentifier");
+ }
+ else if (kg_id_info is KnowledgeGraphUniformIdentifier kg_ui)
+ {
+ System.Diagnostics.Debug.WriteLine(
+ $"IdentifierInfo: KnowledgeGraphUniformIdentifier");
+ System.Diagnostics.Debug.WriteLine(
+ $"IdentifierName: '{kg_ui.GetIdentifierName()}'");
+ }
+ System.Diagnostics.Debug.WriteLine(
+ $"Identifier MethodHint: {kg_id_gen.GetMethodHint()}");
+ }
+ }
+ });
+
+ #endregion
+ }
+
+ public void DataModel5()
+ {
+ var url = "";
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphDataModel.GetMetaEntityTypes
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphEntityType
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphNamedObjectType.GetRole
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphNamedObjectType.GetName
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphNamedObjectTypeRole
+ #region Get Data Model MetaEntityTypes/Provenance
+
+ //Provenance entity type is stored as a MetaEntityType
+ QueuedTask.Run(() =>
+ {
+ //Create a connection properties
+ var kg_props =
+ new KnowledgeGraphConnectionProperties(new Uri(url));
+ using (var kg = new KnowledgeGraph(kg_props))
+ {
+ //Get the KnowledgeGraph Data Model
+ using (var kg_dm = kg.GetDataModel())
+ {
+ var dict_types = kg_dm.GetMetaEntityTypes();
+ //If there is no provenance then MetaEntityTypes will be
+ //an empty collection
+ foreach (var kvp in dict_types)
+ {
+ var meta_entity_type = kvp.Value;
+ if (meta_entity_type.GetRole() ==
+ KnowledgeGraphNamedObjectTypeRole.Provenance)
+ {
+ //TODO - use the provenance entity type
+ var name = meta_entity_type.GetName();
+
+ }
+ }
+
+ }
+ }
+ });
+
+ #endregion
+ }
+
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphDataModel.GetMetaEntityTypes
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphEntityType
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphNamedObjectType.GetRole
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphNamedObjectType.GetName
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphNamedObjectTypeRole
+ #region Get Whether KG Supports Provenance
+ internal string GetProvenanceEntityTypeName(KnowledgeGraphDataModel kg_dm)
+ {
+ var entity_types = kg_dm.GetMetaEntityTypes();
+ foreach (var entity_type in entity_types)
+ {
+ if (entity_type.Value.GetRole() == KnowledgeGraphNamedObjectTypeRole.Provenance)
+ return entity_type.Value.GetName();
+ }
+ return "";
+ }
+ internal bool KnowledgeGraphSupportsProvenance(KnowledgeGraph kg)
+ {
+ //if there is a provenance entity type then the KnowledgeGraph
+ //supports provenance
+ return !string.IsNullOrEmpty(
+ GetProvenanceEntityTypeName(kg.GetDataModel()));
+ }
+ #endregion
+
+ public void DataModel6()
+ {
+ var url = "";
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphDataModel.GetEntityTypes
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphEntityType
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphNamedObjectType.GetRole
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphNamedObjectType.GetName
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphNamedObjectTypeRole
+ #region Get KnowledgeGraph Entity Types
+
+ QueuedTask.Run(() =>
+ {
+ //Create a connection properties
+ var kg_props =
+ new KnowledgeGraphConnectionProperties(new Uri(url));
+ using (var kg = new KnowledgeGraph(kg_props))
+ {
+ //Get the KnowledgeGraph Data Model
+ using (var kg_dm = kg.GetDataModel())
+ {
+ var dict_types = kg_dm.GetEntityTypes();
+
+ foreach (var kvp in dict_types)
+ {
+ var entity_type = kvp.Value;
+ var role = entity_type.GetRole();
+ //note "name" will be the same name as the corresponding
+ //feature class or table in the KG's relational gdb model
+ var name = entity_type.GetName();
+ //etc
+
+ }
+
+ }
+ }
+ });
+
+ #endregion
+ }
+
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphDataModel.GetMetaEntityTypes
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphEntityType
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphNamedObjectType.GetRole
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphNamedObjectType.GetName
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphNamedObjectTypeRole
+ #region Get Whether KG Has a Document Type
+ internal string GetDocumentEntityTypeName(KnowledgeGraphDataModel kg_dm)
+ {
+ var entity_types = kg_dm.GetEntityTypes();
+ foreach (var entity_type in entity_types)
+ {
+ var role = entity_type.Value.GetRole();
+ if (role == KnowledgeGraphNamedObjectTypeRole.Document)
+ return entity_type.Value.GetName();
+ }
+ return "";//Unusual - probably Neo4j user-managed
+ }
+
+ internal bool KnowledgeGraphHasDocumentType(KnowledgeGraph kg)
+ {
+ //uncommon for there not to be a document type
+ return !string.IsNullOrEmpty(
+ GetDocumentEntityTypeName(kg.GetDataModel()));
+ }
+ #endregion
+
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphEntityValue
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphEntityType
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphNamedObjectValue.GetTypeName
+ #region Check Whether A KG Entity Is a Document
+
+ //Use GetDocumentEntityTypeName(KnowledgeGraphDataModel kg_dm) from
+ //the 'Get Whether KG Has a Document Type' snippet to
+ //get the documentNameType parameter
+ protected bool GetEntityIsDocument(KnowledgeGraphEntityValue entity,
+ string documentNameType = "")
+ {
+ if (string.IsNullOrEmpty(documentNameType))
+ return false;
+ return entity.GetTypeName() == documentNameType;
+ }
+
+ #endregion
+
+ public void DataModel7()
+ {
+ var url = "";
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphDataModel.GetRelationshipTypes
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphRelationshipType
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphNamedObjectType.GetRole
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphNamedObjectType.GetName
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphNamedObjectTypeRole
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphRelationshipType.GetEndPoints
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphEndPoint
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphEndPoint.GetOriginEntityTypeName
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphEndPoint.GetDestinationEntityTypeName
+ #region Get KnowledgeGraph Relationship Types
+
+ QueuedTask.Run(() =>
+ {
+ //Create a connection properties
+ var kg_props =
+ new KnowledgeGraphConnectionProperties(new Uri(url));
+ using (var kg = new KnowledgeGraph(kg_props))
+ {
+ //Get the KnowledgeGraph Data Model
+ using (var kg_dm = kg.GetDataModel())
+ {
+ var dict_types = kg_dm.GetRelationshipTypes();
+
+ foreach (var kvp in dict_types)
+ {
+ var rel_type = kvp.Value;
+ var role = rel_type.GetRole();
+ //note "name" will be the same name as the corresponding
+ //feature class or table in the KG's relational gdb model
+ var name = rel_type.GetName();
+ //etc.
+ //Get relationship end points
+ var end_points = rel_type.GetEndPoints();
+ foreach (var end_point in end_points)
+ {
+ System.Diagnostics.Debug.WriteLine(
+ $"Origin: '{end_point.GetOriginEntityTypeName()}', " +
+ $"Destination: '{end_point.GetDestinationEntityTypeName()}'");
+ }
+ }
+
+ }
+ }
+ });
+
+ #endregion
+ }
+
+ #region ProSnippet Group: Graph Query and Text Search
+ #endregion
+
+ public async void QueryAndSearch1()
+ {
+ KnowledgeGraph kg = null;
+ bool includeProvenanceIfPresent = false;
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraph.SubmitQuery
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraph.KnowledgeGraphQueryFilter.#Ctor
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphQueryFilter.QueryText
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphQueryFilter.ProvenanceBehavior
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphProvenanceBehavior
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphCursor.MoveNext
+ //cref: ArcGIS.Core.Data.Realtime.RealtimeCursorBase.WaitForRowsAsync()
+ //cref: ArcGIS.Core.Data.Realtime.RealtimeCursorBase.WaitForRowsAsync(System.Threading.CancellationToken)
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphCursor.Current
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphRow.GetCount
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphRow.Item(System.Int32)
+ #region Submit a Graph Query
+
+ //On the QueuedTask...
+ //and assuming you have established a connection to a knowledge graph
+ //...
+ //Construct an openCypher query - return the first 10 entities (whatever
+ //they are...)
+ var query = "MATCH (n) RETURN n LIMIT 10";//default limit is 100 if not specified
+ //other examples...
+ //query = "MATCH (a:Person) RETURN [a.name, a.age] ORDER BY a.age DESC LIMIT 50";
+ //query = "MATCH (b:Person) RETURN { Xperson: { Xname: b.name, Xage: b.age } } ORDER BY b.name DESC";
+ //query = "MATCH p = (c:Person)-[:HasCar]-() RETURN p ORDER BY c.name DESC";
+
+ //Create a query filter
+ //Note: OutputSpatialReference is currently ignored
+ var kg_qf = new KnowledgeGraphQueryFilter()
+ {
+ QueryText = query
+ };
+ //Optionally - u can choose to include provenance in the results
+ //(_if_ the KG has provenance - otherwise the query will fail)
+ if (includeProvenanceIfPresent)
+ {
+ //see "Get Whether KG Supports Provenance" snippet
+ if (KnowledgeGraphSupportsProvenance(kg))
+ {
+ //Only include if the KG has provenance
+ kg_qf.ProvenanceBehavior =
+ KnowledgeGraphProvenanceBehavior.Include;//default is exclude
+ }
+ }
+ //submit the query - returns a KnowledgeGraphCursor
+ using (var kg_rc = kg.SubmitQuery(kg_qf))
+ {
+ //wait for rows to be returned from the server
+ //note the "await"...
+ while (await kg_rc.WaitForRowsAsync())
+ {
+ //Rows have been retrieved - process this "batch"...
+ while (kg_rc.MoveNext())
+ {
+ //Get the current KnowledgeGraphRow
+ using (var graph_row = kg_rc.Current)
+ {
+ //Graph row is an array, process all returned values...
+ var val_count = (int)graph_row.GetCount();
+ for (int i = 0; i < val_count; i++)
+ {
+ var retval = graph_row[i];
+ //Process row value (note: recursive)
+ //See "Process a KnowledgeGraphRow Value" snippet
+ ProcessKnowledgeGraphRowValue(retval);
+ }
+ }
+ }
+ }//WaitForRowsAsync
+ }//SubmitQuery
+ #endregion
+ }
+
+ public async void QueryAndSearch2()
+ {
+ KnowledgeGraph kg = null;
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraph.SubmitSearch
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphCursor.MoveNext
+ //cref: ArcGIS.Core.Data.Realtime.RealtimeCursorBase.WaitForRowsAsync()
+ //cref: ArcGIS.Core.Data.Realtime.RealtimeCursorBase.WaitForRowsAsync(System.Threading.CancellationToken)
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphCursor.Current
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphRow.GetCount
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphRow.Item(System.Int32)
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphSearchFilter.#ctor
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphSearchFilter.SearchTarget
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphSearchFilter.SearchText
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphSearchFilter.ReturnSearchContext
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphSearchFilter.MaxRowCount
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphNamedTypeCategory
+ #region Submit a Text Search
+
+ //On the QueuedTask...
+ //and assuming you have established a connection to a knowledge graph
+ //...
+ //Construct a KG search filter. Search text uses Apache Lucene Query Parser
+ //syntax - https://lucene.apache.org/core/2_9_4/queryparsersyntax.html
+ var kg_sf = new KnowledgeGraphSearchFilter()
+ {
+ SearchTarget = KnowledgeGraphNamedTypeCategory.Entity,
+ SearchText = "Acme Electric Co.",
+ ReturnSearchContext = true,
+ MaxRowCount = 10 //Default is 100 if not specified
+ };
+
+ //submit the search - returns a KnowledgeGraphCursor
+ using (var kg_rc = kg.SubmitSearch(kg_sf))
+ {
+ //wait for rows to be returned from the server
+ //note the "await"...
+ while (await kg_rc.WaitForRowsAsync())
+ {
+ //Rows have been retrieved - process this "batch"...
+ while (kg_rc.MoveNext())
+ {
+ //Get the current KnowledgeGraphRow
+ using (var graph_row = kg_rc.Current)
+ {
+ //Graph row is an array, process all returned values...
+ var val_count = (int)graph_row.GetCount();
+ for (int i = 0; i < val_count; i++)
+ {
+ var retval = graph_row[i];
+ //Process row value (note: recursive)
+ //See "Process a KnowledgeGraphRow Value" snippet
+ ProcessKnowledgeGraphRowValue(retval);
+ }
+ }
+ }
+ }//WaitForRowsAsync
+ }//SubmitSearch
+ #endregion
+ }
+
+ public async void QueryAndSearch3()
+ {
+ KnowledgeGraph kg = null;
+ KnowledgeGraphCursor kg_rc = null;
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraph.SubmitQuery
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraph.SubmitSearch
+ //cref: ArcGIS.Core.Data.Realtime.RealtimeCursorBase.WaitForRowsAsync(System.Threading.CancellationToken)
+ #region Call WaitForRowsAsync With Cancellation
+
+ //On the QueuedTask...
+ //and assuming you have established a connection to a knowledge graph
+ //...
+ //submit query or search to return a KnowledgeGraphCursor
+ //using (var kg_rc = kg.SubmitQuery(kg_qf)) {
+ //using (var kg_rc = kg.SubmitSearch(kg_sf)) {
+ //...
+ //wait for rows to be returned from the server
+ //"auto-cancel" after 20 seconds
+ var cancel = new CancellationTokenSource(new TimeSpan(0, 0, 20));
+ //catch TaskCanceledException
+ try
+ {
+ while (await kg_rc.WaitForRowsAsync(cancel.Token))
+ {
+ //check for row events
+ while (kg_rc.MoveNext())
+ {
+ using (var graph_row = kg_rc.Current)
+ {
+ //Graph row is an array, process all returned values...
+ var val_count = (int)graph_row.GetCount();
+ for (int i = 0; i < val_count; i++)
+ {
+ var retval = graph_row[i];
+ //Process row value (note: recursive)
+ //See "Process a KnowledgeGraphRow Value" snippet
+ ProcessKnowledgeGraphRowValue(retval);
+ }
+ }
+ }
+ }
+ }
+ //Timeout expired
+ catch (TaskCanceledException tce)
+ {
+ //Handle cancellation as needed
+ }
+ cancel.Dispose();
+ #endregion
+ }
+
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphValue
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphValue.KnowledgeGraphValueType
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphPrimitiveValue.GetValue
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphArrayValue.GetSize
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphArrayValue.Item(System.UInt64)
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphPathValue.GetEntityCount
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphPathValue.GetEntity
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphPathValue.GetRelationshipCount
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphPathValue.GetRelationship
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphObjectValue.GetKeys
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphObjectValue.Item(System.String)
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphNamedObjectValue.GetID
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphNamedObjectValue.GetObjectID
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphNamedObjectValue.GetTypeName
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphEntityValue.GetLabel
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphRelationshipValue.GetHasRelatedEntityIDs
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphRelationshipValue.GetOriginID
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphRelationshipValue.GetDestinationID
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphRelationshipValue.GetHasRelatedEntityIDs
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphCursor.MoveNext
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphCursor.Current
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphRow.GetCount
+ //cref: ArcGIS.Core.Data.Knowledge.KnowledgeGraphRow.Item(System.Int32)
+ #region Process a KnowledgeGraphRow Value
+
+ //Base class for entities and relationships
+ //(including documents and provenance)
+ public void ProcessGraphNamedObjectValue(
+ KnowledgeGraphNamedObjectValue kg_named_obj_val)
+ {
+ if (kg_named_obj_val is KnowledgeGraphEntityValue kg_entity)
+ {
+ var label = kg_entity.GetLabel();
+ //TODO - use label
+ }
+ else if (kg_named_obj_val is KnowledgeGraphRelationshipValue kg_rel)
+ {
+ var has_entity_ids = kg_rel.GetHasRelatedEntityIDs();
+ if (kg_rel.GetHasRelatedEntityIDs())
+ {
+ var origin_id = kg_rel.GetOriginID();
+ var dest_id = kg_rel.GetDestinationID();
+ //TODO - use ids
+ }
+ }
+ var id = kg_named_obj_val.GetID();
+ var oid = kg_named_obj_val.GetObjectID();
+ //Note: Typename corresponds to the name of the feature class or table
+ //in the relational gdb model -and- to the name of the KnowledgeGraphNamedObjectType
+ //in the knowledge graph data model
+ var type_name = kg_named_obj_val.GetTypeName();
+ //TODO use id, object id, etc.
+ }
+
+ //Object values include entities, relationships, and anonymous objects
+ public void ProcessGraphObjectValue(KnowledgeGraphObjectValue kg_obj_val)
+ {
+ switch (kg_obj_val)
+ {
+ case KnowledgeGraphEntityValue kg_entity:
+ ProcessGraphNamedObjectValue(kg_entity);
+ break;
+ case KnowledgeGraphRelationshipValue kg_rel:
+ ProcessGraphNamedObjectValue(kg_rel);
+ break;
+ default:
+ //Anonymous objects
+ break;
+ }
+ //graph object values have a set of properties (equivalent
+ //to a collection of key/value pairs)
+ var keys = kg_obj_val.GetKeys();
+ foreach (var key in keys)
+ ProcessKnowledgeGraphRowValue(kg_obj_val[key]);//Recurse
+ }
+
+ //Process a KnowledgeGraphValue from a query or search
+ public void ProcessGraphValue(KnowledgeGraphValue kg_val)
+ {
+ switch (kg_val)
+ {
+ case KnowledgeGraphPrimitiveValue kg_prim:
+ //KnowledgeGraphPrimitiveValue not currently used in
+ //query and search
+ ProcessKnowledgeGraphRowValue(kg_prim.GetValue());//Recurse
+ return;
+ case KnowledgeGraphArrayValue kg_array:
+ var count = kg_array.GetSize();
+ //Recursively process each value in the array
+ for (ulong i = 0; i < count; i++)
+ ProcessKnowledgeGraphRowValue(kg_array[i]);//Recurse
+ return;
+ case KnowledgeGraphPathValue kg_path:
+ //Entities
+ var entity_count = kg_path.GetEntityCount();
+ //Recursively process each entity value in the path
+ for (ulong i = 0; i < entity_count; i++)
+ ProcessGraphObjectValue(kg_path.GetEntity(i));//Recurse
+
+ //Recursively process each relationship value in the path
+ var relate_count = kg_path.GetRelationshipCount();
+ for (ulong i = 0; i < relate_count; i++)
+ ProcessGraphObjectValue(kg_path.GetRelationship(i));//Recurse
+ return;
+ case KnowledgeGraphObjectValue kg_object:
+ ProcessGraphObjectValue(kg_object);//Recurse
+ return;
+ default:
+ var type_string = kg_val.GetType().ToString();
+ System.Diagnostics.Debug.WriteLine(
+ $"Unknown: '{type_string}'");
+ return;
+ }
+ }
+
+ //Process each value from the KnowledgeGraphRow array
+ public void ProcessKnowledgeGraphRowValue(object value)
+ {
+ switch (value)
+ {
+ //Graph value?
+ case KnowledgeGraphValue kg_val:
+ var kg_type = kg_val.KnowledgeGraphValueType.ToString();
+ System.Diagnostics.Debug.WriteLine(
+ $"KnowledgeGraphValue: '{kg_type}'");
+ ProcessGraphValue(kg_val);//Recurse
+ return;
+ //Primitive types...add additional logic as needed
+ case System.DBNull dbn:
+ System.Diagnostics.Debug.WriteLine("DBNull.Value");
+ return;
+ case string str:
+ System.Diagnostics.Debug.WriteLine($"'{str}' (string)");
+ return;
+ case long l_val:
+ System.Diagnostics.Debug.WriteLine($"{l_val} (long)");
+ return;
+ case int i_val:
+ System.Diagnostics.Debug.WriteLine($"{i_val} (int)");
+ return;
+ case short s_val:
+ System.Diagnostics.Debug.WriteLine($"{s_val} (short)");
+ return;
+ case double d_val:
+ System.Diagnostics.Debug.WriteLine($"{d_val} (double)");
+ return;
+ case float f_val:
+ System.Diagnostics.Debug.WriteLine($"{f_val} (float)");
+ return;
+ case DateTime dt_val:
+ System.Diagnostics.Debug.WriteLine($"{dt_val} (DateTime)");
+ return;
+ case DateOnly dt_only_val:
+ System.Diagnostics.Debug.WriteLine($"{dt_only_val} (DateOnly)");
+ return;
+ case TimeOnly tm_only_val:
+ System.Diagnostics.Debug.WriteLine($"{tm_only_val} (TimeOnly)");
+ return;
+ case DateTimeOffset dt_tm_offset_val:
+ System.Diagnostics.Debug.WriteLine(
+ $"{dt_tm_offset_val} (DateTimeOffset)");
+ return;
+ case System.Guid guid_val:
+ var guid_string = guid_val.ToString("B");
+ System.Diagnostics.Debug.WriteLine($"'{guid_string}' (Guid)");
+ return;
+ case Geometry geom_val:
+ var geom_type = geom_val.GeometryType.ToString();
+ var is_empty = geom_val.IsEmpty;
+ var wkid = geom_val.SpatialReference?.Wkid ?? 0;
+ System.Diagnostics.Debug.WriteLine(
+ $"geometry: {geom_type}, empty: {is_empty}, sr_wkid {wkid} (shape)");
+ return;
+ default:
+ //Blob? Others?
+ var type_str = value.GetType().ToString();
+ System.Diagnostics.Debug.WriteLine($"Primitive: {type_str}");
+ return;
+ }
+ }
+
+ // ...submit query or search
+ //using (var kg_rc = kg.SubmitQuery(kg_qf)) {
+ //using (var kg_rc = kg.SubmitSearch(kg_sf)) {
+ // ...wait for rows ...
+ // while (await kg_rc.WaitForRowsAsync()) {
+ // ...rows have been retrieved
+ // while (kg_rc.MoveNext()) {
+ // ...get the current KnowledgeGraphRow
+ // using (var graph_row = kg_rc.Current) {
+ // var val_count = (int)graph_row.GetCount();
+ // for (int i = 0; i layout.Export(pdf)); //Export the PDF
}
#endregion Layout_ExportPDF
}
diff --git a/Examples/Layouts/ProSnippets.cs b/Examples/Layouts/ProSnippets.cs
index 6a678ea..be573bd 100644
--- a/Examples/Layouts/ProSnippets.cs
+++ b/Examples/Layouts/ProSnippets.cs
@@ -1250,7 +1250,7 @@ await QueuedTask.Run(() =>
// LayoutElementFactory.Instance.CreatePointTextGraphicElement(
// layout, llTitle, null) as TextElement;
TextElement titleGraphics = ElementFactory.Instance.CreateTextGraphicElement(
- container, TextType.PointText, llTitle.ToMapPoint()) as TextElement;
+ container, TextType.PointText, llTitle.ToMapPoint(), null, title) as TextElement;
//Modify the text properties
titleGraphics.SetTextProperties(new TextProperties(title, "Arial", 24, "Bold"));
@@ -2772,6 +2772,140 @@ public void snippets_UpdateElements()
#endregion
}
+ #region ProSnippet Group: Style Layout Elements
+ #endregion
+ public void ApplyNorthArrowStyle()
+ {
+ var layout = LayoutView.Active?.Layout;
+ if (layout == null) return;
+ QueuedTask.Run(() => {
+ // cref: ArcGIS.Desktop.Layouts.Element.CanApplyStyle
+ // cref: ArcGIS.Desktop.Layouts.Element.ApplyStyle
+ #region Apply a style to a North Arrow
+ //Run within QueuedTask context.
+ //Get the Style project items in the project
+ var styleProjectItems = Project.Current?.GetItems();
+ //Get the ArcGIS 2D Style Project Item
+ var styleProjectItem =
+ styleProjectItems.FirstOrDefault(s => s.Name == "ArcGIS 2D");
+ if (styleProjectItem == null) return;
+ //Get the north arrow style item you need
+ var northArrowStyleItem =
+ styleProjectItem.SearchSymbols(StyleItemType.NorthArrow, "ArcGIS North 18").FirstOrDefault();
+ if (northArrowStyleItem == null) return;
+ //Select a North arrow layout element
+ var northArrowElement = layout.GetSelectedElements().OfType().FirstOrDefault();
+ if (northArrowElement != null)
+ {
+ //Check if the input style can be applied to the element
+ if (northArrowElement.CanApplyStyle(northArrowStyleItem))
+ //Apply the style
+ northArrowElement.ApplyStyle(northArrowStyleItem);
+ }
+ #endregion
+ });
+ }
+
+ public void ApplyGridAndGraticulesStyle()
+ {
+ var layout = LayoutView.Active?.Layout;
+ if (layout == null) return;
+ QueuedTask.Run(() => {
+ // cref: ArcGIS.Core.CIM.CIMGraticule
+ // cref: ArcGIS.Core.CIM.CIMMapGrid
+ // cref: ArcGIS.Core.CIM.CIMMapGrid
+ #region Apply a style to Grid and Graticules
+ //Run within QueuedTask context.
+ //Get the Style project items in the project
+ var styleProjectItems = Project.Current?.GetItems();
+ //Get the ArcGIS 2D Style Project Item
+ var styleProjectItem =
+ styleProjectItems.OfType().FirstOrDefault(s => s.Name == "ArcGIS 2D");
+ if (styleProjectItem == null) return;
+ //Get the grid style item you need
+ var gridStyleItem =
+ styleProjectItem.SearchSymbols(StyleItemType.Grid, "Blue Vertical Label Graticule").FirstOrDefault();
+ if (gridStyleItem == null) return;
+ var symbolItemName = gridStyleItem.Name;
+ var girdGraticuleObject = gridStyleItem.GetObject() as CIMMapGrid;
+
+ var mapFrame = layout.GetElements().OfType().FirstOrDefault();
+ var cmf = mapFrame.GetDefinition() as CIMMapFrame;
+ //note, if page units are _not_ inches then grid's gridline
+ //lengths and offsets would need to be converted to the page units
+ var mapGrids = new List();
+ if (cmf.Grids != null)
+ mapGrids.AddRange(cmf.Grids);
+
+ //var cimMapGrid = SymbolStyleItem.GetObject() as CIMMapGrid;
+
+ switch (girdGraticuleObject)
+ {
+ case CIMGraticule:
+ var gridGraticule = girdGraticuleObject as CIMGraticule;
+ gridGraticule.Name = symbolItemName;
+ gridGraticule.SetGeographicCoordinateSystem(mapFrame.Map.SpatialReference);
+ //assign grid to the frame
+ mapGrids.Add(gridGraticule);
+
+ break;
+ case CIMMeasuredGrid:
+ var gridMeasure = girdGraticuleObject as CIMMeasuredGrid;
+ gridMeasure.Name = symbolItemName;
+ gridMeasure.SetProjectedCoordinateSystem(mapFrame.Map.SpatialReference);
+ //assign grid to the frame
+ mapGrids.Add(gridMeasure);
+
+ break;
+ case CIMReferenceGrid:
+ var gridReference = girdGraticuleObject as CIMReferenceGrid;
+ gridReference.Name = symbolItemName;
+ //assign grid to the frame
+ mapGrids.Add(gridReference);
+ break;
+ }
+
+ cmf.Grids = mapGrids.ToArray();
+ mapFrame.SetDefinition(cmf);
+ #endregion
+ });
+
+ }
+
+ public void ApplyStyleToGraphicElements()
+ {
+ var layout = LayoutView.Active?.Layout;
+ if (layout == null) return;
+ QueuedTask.Run(() => {
+ // cref: ArcGIS.Desktop.Layouts.GraphicElement.CanApplyStyle
+ // cref: ArcGIS.Desktop.Layouts.GraphicElement.ApplyStyle
+ #region Apply a style to a Graphic Element
+ //Run within QueuedTask context.
+ //Get the Style project items in the project
+ var styleProjectItems = Project.Current?.GetItems();
+ //Get the ArcGIS 2D Style Project Item
+ var styleProjectItem =
+ styleProjectItems.OfType().FirstOrDefault(s => s.Name == "ArcGIS 2D");
+ if (styleProjectItem == null) return;
+ //Get the north arrow style item you need
+ var pointStyleItem =
+ styleProjectItem.SearchSymbols(StyleItemType.PointSymbol, "Circle 3").FirstOrDefault();
+ if (pointStyleItem == null) return;
+ //Select a North arrow layout element
+ var layoutPointElement = layout.GetSelectedElements().FirstOrDefault();
+ if (layoutPointElement != null && layoutPointElement is GraphicElement ge)
+ {
+ if (layoutPointElement.CanApplyStyle(pointStyleItem))
+ {
+ //The magic happens here
+ //for Graphic Elements such as Point, Lines, Polys, text, preserve size.
+ ge.ApplyStyle(pointStyleItem, true);
+ }
+ }
+ #endregion
+ });
+ }
+
#region ProSnippet Group: Layout Snapping
#endregion
diff --git a/Examples/MapAuthoring/ProSnippet.cs b/Examples/MapAuthoring/ProSnippet.cs
index 23713af..3211906 100644
--- a/Examples/MapAuthoring/ProSnippet.cs
+++ b/Examples/MapAuthoring/ProSnippet.cs
@@ -16,6 +16,7 @@ You may obtain a copy of the License at
limitations under the License.
*/
+using ArcGIS.Core.Arcade;
using ArcGIS.Core.CIM;
using ArcGIS.Core.Data;
using ArcGIS.Core.Geometry;
@@ -2195,69 +2196,6 @@ await QueuedTask.Run(() =>
#endregion
}
- #region ProSnippet Group: Arcade
- #endregion
-
- protected static void ArcadeRenderer()
- {
- // cref: ArcGIS.Core.CIM.CIMExpressionInfo
- // cref: ArcGIS.Core.CIM.CIMExpressionInfo.Expression
- // cref: ArcGIS.Core.CIM.CIMExpressionInfo.Title
- // cref: ArcGIS.Core.CIM.CIMUniqueValueRenderer.ValueExpressionInfo
- // cref: ArcGIS.Desktop.Mapping.FeatureLayer.GetRenderer
- // cref: ArcGIS.Desktop.Mapping.FeatureLayer.SetRenderer
- #region Modify renderer using Arcade
- var lyr = MapView.Active.Map.GetLayersAsFlattenedList().OfType().FirstOrDefault(f => f.ShapeType == esriGeometryType.esriGeometryPolygon);
- if (lyr == null) return;
- QueuedTask.Run(() =>
- {
- // GetRenderer from Layer (assumes it is a unique value renderer)
- var uvRenderer = lyr.GetRenderer() as CIMUniqueValueRenderer;
- if (uvRenderer == null) return;
- //layer has STATE_NAME field
- //community sample Data\Admin\AdminSample.aprx
- string expression = "if ($view.scale > 21000000) { return $feature.STATE_NAME } else { return 'All' }";
- CIMExpressionInfo updatedExpressionInfo = new CIMExpressionInfo
- {
- Expression = expression,
- Title = "Custom" // can be any string used for UI purpose.
- };
- //set the renderer's expression
- uvRenderer.ValueExpressionInfo = updatedExpressionInfo;
-
- //SetRenderer on Layer
- lyr.SetRenderer(uvRenderer);
- });
- #endregion
- }
- protected static void ArcadeLabeling()
- {
- // cref: ArcGIS.Desktop.Mapping.FeatureLayer.GetRenderer
- // cref: ArcGIS.Core.CIM.CIMGeoFeatureLayerBase.LabelClasses
- // cref: ArcGIS.Core.CiM.CIMLabelClass
- // cref: ArcGIS.Core.CiM.CIMLabelClass.Expression
- // cref: ArcGIS.Desktop.Mapping.FeatureLayer.SetRenderer
- #region Modify label expression using Arcade
- var lyr = MapView.Active.Map.GetLayersAsFlattenedList().OfType().FirstOrDefault(f => f.ShapeType == esriGeometryType.esriGeometryPolygon);
- if (lyr == null) return;
- QueuedTask.Run(() =>
- {
- //Get the layer's definition
- //community sample Data\Admin\AdminSample.aprx
- var lyrDefn = lyr.GetDefinition() as CIMFeatureLayer;
- if (lyrDefn == null) return;
- //Get the label classes - we need the first one
- var listLabelClasses = lyrDefn.LabelClasses.ToList();
- var theLabelClass = listLabelClasses.FirstOrDefault();
- //set the label class Expression to use the Arcade expression
- theLabelClass.Expression = "return $feature.STATE_NAME + TextFormatting.NewLine + $feature.POP2000;";
- //Set the label definition back to the layer.
- lyr.SetDefinition(lyrDefn);
- });
-
- #endregion
- }
-
#region ProSnippet Group: Elevation Surface Layers
#endregion
@@ -3728,5 +3666,6 @@ public void Masking1()
#endregion
}
+
}
}
diff --git a/Examples/MapAuthoring/ProSnippetRealtime.cs b/Examples/MapAuthoring/ProSnippetRealtime.cs
index d67321c..5fbb6cb 100644
--- a/Examples/MapAuthoring/ProSnippetRealtime.cs
+++ b/Examples/MapAuthoring/ProSnippetRealtime.cs
@@ -621,7 +621,7 @@ public async void SearchAndSubscribeToStreamData()
QueryFilter qfilter = null;
// cref: ArcGIS.Desktop.Mapping.StreamLayer.SearchAndSubscribe(ArcGIS.Core.Data.QueryFilter,System.Boolean)
- // cref: ArcGIS.Core.Data.Realtime.RealtimeCursor.WaitForRowsAsync()
+ // cref: ArcGIS.Core.Data.Realtime.RealtimeCursorBase.WaitForRowsAsync()
// cref: ArcGIS.Core.Data.Realtime.RealtimeCursor.MoveNext()
// cref: ArcGIS.Core.Data.Realtime.RealtimeCursor.Current
// cref: ArcGIS.Core.Data.Realtime.RealtimeRow.GetRowSource()
@@ -681,7 +681,7 @@ await QueuedTask.Run(async () =>
#endregion
// cref: ArcGIS.Desktop.Mapping.StreamLayer.SearchAndSubscribe(ArcGIS.Core.Data.QueryFilter,System.Boolean)
- // cref: ArcGIS.Core.Data.Realtime.RealtimeCursor.WaitForRowsAsync()
+ // cref: ArcGIS.Core.Data.Realtime.RealtimeCursorBase.WaitForRowsAsync()
// cref: ArcGIS.Core.Data.Realtime.RealtimeCursor.MoveNext()
// cref: ArcGIS.Core.Data.Realtime.RealtimeCursor.Current
// cref: ArcGIS.Core.Data.Realtime.RealtimeRow.GetRowSource()
@@ -729,7 +729,7 @@ private async void Foo()
bool SomeConditionForCancel = false;
// cref: ArcGIS.Desktop.Mapping.StreamLayer.SearchAndSubscribe(ArcGIS.Core.Data.QueryFilter,System.Boolean)
- // cref: ArcGIS.Core.Data.Realtime.RealtimeCursor.WaitForRowsAsync(System.Threading.CancellationToken)
+ // cref: ArcGIS.Core.Data.Realtime.RealtimeCursorBase.WaitForRowsAsync(System.Threading.CancellationToken)
// cref: ArcGIS.Core.Data.Realtime.RealtimeCursor.MoveNext()
// cref: ArcGIS.Core.Data.Realtime.RealtimeCursor.Current
#region Explicitly Cancel WaitForRowsAsync
@@ -862,7 +862,7 @@ public async void SubscribeToStreamData()
// cref: ArcGIS.Core.Data.Realtime.RealtimeFeatureClass.Subscribe(ArcGIS.Core.Data.QueryFilter,System.Boolean)
// cref: ArcGIS.Desktop.Mapping.StreamLayer.Subscribe(ArcGIS.Core.Data.QueryFilter,System.Boolean)
- // cref: ArcGIS.Core.Data.Realtime.RealtimeCursor.WaitForRowsAsync()
+ // cref: ArcGIS.Core.Data.Realtime.RealtimeCursorBase.WaitForRowsAsync(System.Threading.CancellationToken)
// cref: ArcGIS.Core.Data.Realtime.RealtimeCursor.MoveNext()
// cref: ArcGIS.Core.Data.Realtime.RealtimeCursor.Current
// cref: ArcGIS.Core.Data.Realtime.RealtimeRow.GetRowSource()
@@ -922,7 +922,7 @@ public async void Example8()
// cref: ArcGIS.Core.Data.Realtime.RealtimeFeatureClass.Subscribe(ArcGIS.Core.Data.QueryFilter,System.Boolean)
// cref: ArcGIS.Desktop.Mapping.StreamLayer.Subscribe(ArcGIS.Core.Data.QueryFilter,System.Boolean)
- // cref: ArcGIS.Core.Data.Realtime.RealtimeCursor.WaitForRowsAsync()
+ // cref: ArcGIS.Core.Data.Realtime.RealtimeCursorBase.WaitForRowsAsync()
// cref: ArcGIS.Core.Data.Realtime.RealtimeCursor.MoveNext()
// cref: ArcGIS.Core.Data.Realtime.RealtimeCursor.Current
// cref: ArcGIS.Core.Data.Realtime.RealtimeRow.GetRowSource()
@@ -972,7 +972,7 @@ await System.Threading.Tasks.Task.Run(async () =>
#endregion
// cref: ArcGIS.Desktop.Mapping.StreamLayer.Subscribe(ArcGIS.Core.Data.QueryFilter,System.Boolean)
- // cref: ArcGIS.Core.Data.Realtime.RealtimeCursor.WaitForRowsAsync(System.Threading.CancellationToken)
+ // cref: ArcGIS.Core.Data.Realtime.RealtimeCursorBase.WaitForRowsAsync(System.Threading.CancellationToken)
// cref: ArcGIS.Core.Data.Realtime.RealtimeCursor.MoveNext()
// cref: ArcGIS.Core.Data.Realtime.RealtimeCursor.Current
// cref: ArcGIS.Core.Data.Realtime.RealtimeRow.GetRowSource()
diff --git a/Examples/MapAuthoring/ProSnippets3DAnalystLayers.cs b/Examples/MapAuthoring/ProSnippets3DAnalystLayers.cs
new file mode 100644
index 0000000..487ac5f
--- /dev/null
+++ b/Examples/MapAuthoring/ProSnippets3DAnalystLayers.cs
@@ -0,0 +1,1257 @@
+/*
+
+ Copyright 2023 Esri
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+using ArcGIS.Core.CIM;
+using ArcGIS.Core.Data;
+using ArcGIS.Core.Data.Realtime;
+using ArcGIS.Core.Geometry;
+using ArcGIS.Desktop.Framework.Threading.Tasks;
+using ArcGIS.Desktop.Mapping;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace MapAuthoring
+{
+ internal class ProSnippets3DAnalystLayers
+ {
+ #region PrSnippet Group: Layer Methods for TIN, Terrain, LasDataset
+ #endregion
+
+ public void GetLayers()
+ {
+ // cref: ArcGIS.Desktop.Mapping.TinLayer
+ // cref: ArcGIS.Desktop.Mapping.TerrainLayer
+ // cref: ArcGIS.Desktop.Mapping.LasDatasetLayer
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer
+ #region Retrieve layers
+
+ // find the first TIN layer
+ var tinLayer = MapView.Active.Map.GetLayersAsFlattenedList().OfType().FirstOrDefault();
+
+ // find the first Terrain layer
+ var terrainLayer = MapView.Active.Map.GetLayersAsFlattenedList().OfType().FirstOrDefault();
+
+ // find the first LAS dataset layer
+ var lasDatasetLayer = MapView.Active.Map.GetLayersAsFlattenedList().OfType().FirstOrDefault();
+
+ // find the set of surface layers
+ var surfacelayers = MapView.Active.Map.GetLayersAsFlattenedList().OfType();
+ #endregion
+
+ // cref: ArcGIS.Desktop.Mapping.TinLayer.GetTinDataset
+ // cref: ArcGIS.Core.Data.Analyst3D.TinDataset
+ // cref: ArcGIS.Core.Data.Analyst3D.TinDataset.GetDefinition
+ // cref: ArcGIS.Core.Data.Analyst3D.TinDatasetDefinition
+ // cref: ArcGIS.Core.Data.Analyst3D.TinDatasetDefinition.GetExtent
+ // cref: ArcGIS.Core.Data.Analyst3D.TinDatasetDefinition.GetSpatialReference
+ // cref: ArcGIS.Desktop.Mapping.TerrainLayer.GetTerrain
+ // cref: ArcGIS.Core.Data.Analyst3D.Terrain
+ // cref: ArcGIS.Core.Data.Analyst3D.Terrain.GetDefinition
+ // cref: ArcGIS.Core.Data.Analyst3D.TerrainDefinition
+ // cref: ArcGIS.Core.Data.Analyst3D.TerrainDefinition.GetExtent
+ // cref: ArcGIS.Core.Data.Analyst3D.TerrainDefinition.GetSpatialReference
+ // cref: ArcGIS.Desktop.Mapping.LasDatasetLayer.GetLasDataset
+ // cref: ArcGIS.Core.Data.Analyst3D.LasDataset
+ // cref: ArcGIS.Core.Data.Analyst3D.LasDataset.GetDefinition
+ // cref: ArcGIS.Core.Data.Analyst3D.LasDatasetDefinition
+ // cref: ArcGIS.Core.Data.Analyst3D.LasDatasetDefinition.GetExtent
+ // cref: ArcGIS.Core.Data.Analyst3D.LasDatasetDefinition.GetSpatialReference
+ #region Retrieve dataset objects
+
+ //Must be on the QueuedTask.Run()
+
+ Envelope extent;
+ SpatialReference sr;
+ using (var tin = tinLayer.GetTinDataset())
+ {
+ using (var tinDef = tin.GetDefinition())
+ {
+ extent = tinDef.GetExtent();
+ sr = tinDef.GetSpatialReference();
+ }
+ }
+
+ using (var terrain = terrainLayer.GetTerrain())
+ {
+ using (var terrainDef = terrain.GetDefinition())
+ {
+ extent = terrainDef.GetExtent();
+ sr = terrainDef.GetSpatialReference();
+ }
+ }
+
+ using (var lasDataset = lasDatasetLayer.GetLasDataset())
+ {
+ using (var lasDatasetDef = lasDataset.GetDefinition())
+ {
+ extent = lasDatasetDef.GetExtent();
+ sr = lasDatasetDef.GetSpatialReference();
+ }
+ }
+ #endregion
+ }
+
+ public void SurfaceLayerCreation()
+ {
+ Map map = null;
+
+ // cref: ArcGIS.Desktop.Mapping.TinLayerCreationParams
+ // cref: ArcGIS.Desktop.Mapping.TinLayerCreationParams.#ctor(System.Uri)
+ // cref: ArcGIS.Desktop.Mapping.TinLayer
+ #region Create a TinLayer
+ //Must be on the QueuedTask.Run()
+
+ string tinPath = @"d:\Data\Tin\TinDataset";
+ var tinURI = new Uri(tinPath);
+
+ var tinCP = new TinLayerCreationParams(tinURI);
+ tinCP.Name = "My TIN Layer";
+ tinCP.IsVisible = false;
+
+ //Create the layer to the TIN
+ var tinLayer = LayerFactory.Instance.CreateLayer(tinCP, map);
+ #endregion
+
+ ArcGIS.Core.Data.Analyst3D.TinDataset tinDataset = null;
+
+ // cref: ArcGIS.Core.Data.Analyst3D.TinDataset
+ // cref: ArcGIS.Desktop.Mapping.TinLayerCreationParams
+ // cref: ArcGIS.Desktop.Mapping.TinLayerCreationParams.#ctor(ArcGIS.Core.Data.Analyst3D.TinDataset)
+ // cref: ArcGIS.Desktop.Mapping.TinLayer
+ #region Create a TinLayer from a dataset
+ //Must be on the QueuedTask.Run()
+
+ var tinCP_ds = new TinLayerCreationParams(tinDataset);
+ tinCP_ds.Name = "My TIN Layer";
+ tinCP_ds.IsVisible = false;
+
+ //Create the layer to the TIN
+
+ var tinLayer_ds = LayerFactory.Instance.CreateLayer(tinCP_ds, map);
+ #endregion
+
+ // cref: ArcGIS.Core.Data.Analyst3D.TinDataset
+ // cref: ArcGIS.Desktop.Mapping.TinLayerCreationParams
+ // cref: ArcGIS.Desktop.Mapping.TinLayerCreationParams.#ctor(ArcGIS.Core.Data.Analyst3D.TinDataset)
+ // cref: ArcGIS.Desktop.Mapping.TinLayer
+ // cref: ArcGIS.Desktop.Mapping.TinLayerCreationParams.RendererDefinitions
+ // cref: ArcGIS.Desktop.Mapping.TinRendererDefinition
+ // cref: ArcGIS.Desktop.Mapping.SurfaceRendererTarget
+ // cref: ArcGIS.Desktop.Mapping.TinNodeRendererDefinition
+ // cref: ArcGIS.Desktop.Mapping.TinNodeRendererDefinition.#ctor
+ // cref: ArcGIS.Desktop.Mapping.TinFaceClassBreaksRendererDefinition
+ // cref: ArcGIS.Desktop.Mapping.TinFaceClassBreaksRendererDefinition.#ctor
+ // cref: ArcGIS.Desktop.Mapping.TinColorRampRendererDefinition.ClassificationMethod
+ #region Create a TinLayer with renderers
+ //Must be on the QueuedTask.Run()
+
+ var tinCP_renderers = new TinLayerCreationParams(tinDataset);
+ tinCP_renderers.Name = "My TIN layer";
+ tinCP_renderers.IsVisible = true;
+
+ // define the node renderer - use defaults
+ var node_rd = new TinNodeRendererDefinition();
+
+ // define the face/surface renderer
+ var face_rd = new TinFaceClassBreaksRendererDefinition();
+ face_rd.ClassificationMethod = ClassificationMethod.NaturalBreaks;
+ // accept default color ramp, breakCount
+
+ // set up the renderer dictionary
+ var rendererDict = new Dictionary();
+ rendererDict.Add(SurfaceRendererTarget.Points, node_rd);
+ rendererDict.Add(SurfaceRendererTarget.Surface, face_rd);
+
+ // assign the dictionary to the creation params
+ tinCP_renderers.RendererDefinitions = rendererDict;
+
+ // create the layer
+ var tinLayer_rd = LayerFactory.Instance.CreateLayer(tinCP_renderers, MapView.Active.Map);
+ #endregion
+
+
+ // cref: ArcGIS.Desktop.Mapping.TerrainLayerCreationParams
+ // cref: ArcGIS.Desktop.Mapping.TerrainLayerCreationParams.#ctor(System.Uri)
+ // cref: ArcGIS.Desktop.Mapping.TerrainLayer
+ #region Create a TerrainLayer
+ //Must be on the QueuedTask.Run()
+
+ string terrainPath = @"d:\Data\Terrain\filegdb_Containing_A_Terrain.gdb";
+ var terrainURI = new Uri(terrainPath);
+
+ var terrainCP = new TerrainLayerCreationParams(terrainURI);
+ terrainCP.Name = "My Terrain Layer";
+ terrainCP.IsVisible = false;
+
+ //Create the layer to the terrain
+ var terrainLayer = LayerFactory.Instance.CreateLayer(terrainCP, map);
+
+ #endregion
+
+ ArcGIS.Core.Data.Analyst3D.Terrain terrain = null;
+
+ // cref: ArcGIS.Core.Data.Analyst3D.Terrain
+ // cref: ArcGIS.Desktop.Mapping.TerrainLayerCreationParams
+ // cref: ArcGIS.Desktop.Mapping.TerrainLayerCreationParams.#ctor(ArcGIS.Core.Data.Analyst3D.Terrain)
+ // cref: ArcGIS.Desktop.Mapping.TerrainLayer
+ #region Create a TerrainLayer from a dataset
+ //Must be on the QueuedTask.Run()
+
+ var terrainCP_ds = new TerrainLayerCreationParams(terrain);
+ terrainCP_ds.Name = "My Terrain Layer";
+ terrainCP_ds.IsVisible = true;
+
+ //Create the layer to the terrain
+ var terrainLayer_ds = LayerFactory.Instance.CreateLayer(terrainCP_ds, map);
+ #endregion
+
+ // cref: ArcGIS.Core.Data.Analyst3D.Terrain
+ // cref: ArcGIS.Desktop.Mapping.TerrainLayerCreationParams
+ // cref: ArcGIS.Desktop.Mapping.TerrainLayerCreationParams.#ctor(ArcGIS.Core.Data.Analyst3D.Terrain)
+ // cref: ArcGIS.Desktop.Mapping.TerrainLayer
+ // cref: ArcGIS.Desktop.Mapping.TerrainLayerCreationParams.RendererDefinitions
+ // cref: ArcGIS.Desktop.Mapping.TinRendererDefinition
+ // cref: ArcGIS.Desktop.Mapping.SurfaceRendererTarget
+ // cref: ArcGIS.Desktop.Mapping.TinBreaklineRendererDefinition
+ // cref: ArcGIS.Desktop.Mapping.TinBreaklineRendererDefinition.#ctor
+ // cref: ArcGIS.Desktop.Mapping.TinFaceClassBreaksRendererDefinition
+ // cref: ArcGIS.Desktop.Mapping.TinFaceClassBreaksRendererDefinition.#ctor
+ // cref: ArcGIS.Desktop.Mapping.TinColorRampRendererDefinition.ClassificationMethod
+ // cref: ArcGIS.Desktop.Mapping.TerrainDirtyAreaRendererDefinition
+ // cref: ArcGIS.Desktop.Mapping.TerrainDirtyAreaRendererDefinition.#ctor
+ #region Create a TerrainLayer with renderers
+ //Must be on the QueuedTask.Run()
+
+ var terrainCP_renderers = new TerrainLayerCreationParams(terrain);
+ terrainCP_renderers.Name = "My LAS Layer";
+ terrainCP_renderers.IsVisible = true;
+
+ // define the edge type renderer - use defaults
+ var edgeRD = new TinBreaklineRendererDefinition();
+
+ // define the face/surface renderer
+ var faceRD = new TinFaceClassBreaksRendererDefinition();
+ faceRD.ClassificationMethod = ClassificationMethod.NaturalBreaks;
+ // accept default color ramp, breakCount
+
+ // define the dirty area renderer - use defaults
+ var dirtyAreaRD = new TerrainDirtyAreaRendererDefinition();
+
+ // add renderers to dictionary
+ var t_dict = new Dictionary();
+ t_dict.Add(SurfaceRendererTarget.Edges, edgeRD);
+ t_dict.Add(SurfaceRendererTarget.Surface, faceRD);
+ t_dict.Add(SurfaceRendererTarget.DirtyArea, dirtyAreaRD);
+
+ // assign dictionary to creation params
+ terrainCP_renderers.RendererDefinitions = t_dict;
+
+ //Create the layer to the terrain
+ var terrainLayer_rd = LayerFactory.Instance.CreateLayer(terrainCP_renderers, map);
+ #endregion
+
+
+ // cref: ArcGIS.Desktop.Mapping.LasDatasetLayerCreationParams
+ // cref: ArcGIS.Desktop.Mapping.LasDatasetLayerCreationParams.#ctor(System.Uri)
+ // cref: ArcGIS.Desktop.Mapping.LasDatasetLayer
+ #region Create a LasDatasetLayer
+ //Must be on the QueuedTask.Run()
+
+ string lasPath = @"d:\Data\LASDataset.lasd";
+ var lasURI = new Uri(lasPath);
+
+ var lasCP = new LasDatasetLayerCreationParams(lasURI);
+ lasCP.Name = "My LAS Layer";
+ lasCP.IsVisible = false;
+
+ //Create the layer to the LAS dataset
+ var lasDatasetLayer = LayerFactory.Instance.CreateLayer(lasCP, map);
+
+ #endregion
+
+ ArcGIS.Core.Data.Analyst3D.LasDataset lasDataset = null;
+
+ // cref: ArcGIS.Core.Data.Analyst3D.LasDataset
+ // cref: ArcGIS.Desktop.Mapping.LasDatasetLayerCreationParams
+ // cref: ArcGIS.Desktop.Mapping.LasDatasetLayerCreationParams.#ctor(ArcGIS.Core.Data.Analyst3D.LasDataset)
+ // cref: ArcGIS.Desktop.Mapping.LasDatasetLayer
+ #region Create a LasDatasetLayer from a LasDataset
+ //Must be on the QueuedTask.Run()
+
+ var lasCP_ds = new LasDatasetLayerCreationParams(lasDataset);
+ lasCP_ds.Name = "My LAS Layer";
+ lasCP_ds.IsVisible = false;
+
+ //Create the layer to the LAS dataset
+ var lasDatasetLayer_ds = LayerFactory.Instance.CreateLayer(lasCP_ds, map);
+
+ #endregion
+
+
+ // cref: ArcGIS.Core.Data.Analyst3D.LasDataset
+ // cref: ArcGIS.Desktop.Mapping.LasDatasetLayerCreationParams
+ // cref: ArcGIS.Desktop.Mapping.LasDatasetLayerCreationParams.#ctor(ArcGIS.Core.Data.Analyst3D.LasDataset)
+ // cref: ArcGIS.Desktop.Mapping.LasDatasetLayerCreationParams.RendererDefinitions
+ // cref: ArcGIS.Desktop.Mapping.TinRendererDefinition
+ // cref: ArcGIS.Desktop.Mapping.SurfaceRendererTarget
+ // cref: ArcGIS.Desktop.Mapping.LasStretchRendererDefinition
+ // cref: ArcGIS.Desktop.Mapping.LasStretchRendererDefinition.#ctor
+ // cref: ArcGIS.Desktop.Mapping.TinEdgeRendererDefintion
+ // cref: ArcGIS.Desktop.Mapping.TinEdgeRendererDefintion.#ctor
+ // cref: ArcGIS.Desktop.Mapping.LasDatasetLayer
+ #region Create a LasDatasetLayer with renderers
+ //Must be on the QueuedTask.Run()
+
+ var lasCP_renderers = new LasDatasetLayerCreationParams(lasDataset);
+ lasCP_renderers.Name = "My LAS Layer";
+ lasCP_renderers.IsVisible = false;
+
+ // create a point elevation renderer
+ var ptR = new LasStretchRendererDefinition();
+ // accept all defaults
+
+ // create a simple edge renderer
+ var edgeR = new TinEdgeRendererDefintion();
+ // accept all defaults
+
+ // add renderers to dictionary
+ var l_dict = new Dictionary();
+ l_dict.Add(SurfaceRendererTarget.Points, ptR);
+ l_dict.Add(SurfaceRendererTarget.Edges, edgeR);
+
+ // assign dictionary to creation params
+ lasCP_renderers.RendererDefinitions = l_dict;
+
+ //Create the layer to the LAS dataset
+ var lasDatasetLayer_rd = LayerFactory.Instance.CreateLayer(lasCP_renderers, map);
+
+ #endregion
+ }
+
+ #region ProSnippet Group: Renderers for TinLayer, TerrainLayer, LasDatasetLayer
+ #endregion
+
+ public void SurfaceLayerRenderers()
+ {
+ SurfaceLayer surfaceLayer = null;
+
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.GetRenderers
+ // cref: ArcGIS.Core.CIM.CIMTinRenderer
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.GetRenderersAsDictionary
+ // cref: ArcGIS.Desktop.Mapping.SurfaceRendererTarget
+ #region Get Renderers
+ // get the list of renderers
+ IReadOnlyList renderers = surfaceLayer.GetRenderers();
+
+ // get the renderers as a dictionary
+ Dictionary dict = surfaceLayer.GetRenderersAsDictionary();
+ #endregion
+
+ CIMPointSymbol nodeSymbol = null;
+ // cref: ArcGIS.Desktop.Mapping.TinNodeRendererDefinition
+ // cref: ArcGIS.Desktop.Mapping.TinNodeRendererDefinition.#ctor
+ // cref: ArcGIS.Desktop.Mapping.TinSimpleRendererDefinition.Label
+ // cref: ArcGIS.Desktop.Mapping.TinSimpleRendererDefinition.Description
+ // cref: ArcGIS.Desktop.Mapping.TinSimpleRendererDefinition.SymbolTemplate
+ // cref: ArcGIS.Core.CIM.CIMTinRenderer
+ // cref: ArcGIS.Core.CIM.CIMTinNodeRenderer
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanCreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanSetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.SetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceRendererTarget
+ // cref: ArcGIS.Desktop.Mapping.TinLayer
+ #region Simple Node Renderer
+ // applies to TIN layers only
+
+ var nodeRendererDef = new TinNodeRendererDefinition();
+ nodeRendererDef.Description = "Nodes";
+ nodeRendererDef.Label = "Nodes";
+ nodeRendererDef.SymbolTemplate = nodeSymbol.MakeSymbolReference();
+
+ var tinLayer = MapView.Active.Map.GetLayersAsFlattenedList().OfType().FirstOrDefault();
+ if (tinLayer == null)
+ return;
+
+ if (tinLayer.CanCreateRenderer(nodeRendererDef))
+ {
+ CIMTinRenderer renderer = tinLayer.CreateRenderer(nodeRendererDef);
+ if (tinLayer.CanSetRenderer(renderer, SurfaceRendererTarget.Points))
+ tinLayer.SetRenderer(renderer, SurfaceRendererTarget.Points);
+ }
+ #endregion
+
+ // cref: ArcGIS.Desktop.Mapping.TinNodeClassBreaksRendererDefinition
+ // cref: ArcGIS.Desktop.Mapping.TinNodeClassBreaksRendererDefinition.#ctor
+ // cref: ArcGIS.Desktop.Mapping.TinColorRampRendererDefinition.BreakCount
+ // cref: ArcGIS.Core.CIM.CIMTinRenderer
+ // cref: ArcGIS.Core.CIM.CIMTinNodeElevationRenderer
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanCreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanSetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.SetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceRendererTarget
+ #region Elevation Node Renderer - Equal Breaks
+ // applies to TIN layers only
+
+ var equalBreaksNodeRendererDef = new TinNodeClassBreaksRendererDefinition();
+ equalBreaksNodeRendererDef.BreakCount = 7;
+
+ if (tinLayer.CanCreateRenderer(equalBreaksNodeRendererDef))
+ {
+ CIMTinRenderer renderer = tinLayer.CreateRenderer(equalBreaksNodeRendererDef);
+ if (tinLayer.CanSetRenderer(renderer, SurfaceRendererTarget.Edges))
+ tinLayer.SetRenderer(renderer, SurfaceRendererTarget.Edges);
+ }
+
+ #endregion
+
+ // cref: ArcGIS.Desktop.Mapping.TinNodeClassBreaksRendererDefinition
+ // cref: ArcGIS.Core.CIM.ClassificationMethod
+ // cref: ArcGIS.Core.CIM.CIMTinRenderer
+ // cref: ArcGIS.Core.CIM.CIMTinNodeElevationRenderer
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanCreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanSetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.SetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceRendererTarget
+ #region Elevation Node Renderer - Defined Interval
+ // applies to TIN layers only
+
+ var defiendIntervalNodeRendererDef = new TinNodeClassBreaksRendererDefinition();
+ defiendIntervalNodeRendererDef.ClassificationMethod = ClassificationMethod.DefinedInterval;
+ defiendIntervalNodeRendererDef.IntervalSize = 4;
+ defiendIntervalNodeRendererDef.SymbolTemplate = nodeSymbol.MakeSymbolReference();
+
+ if (tinLayer.CanCreateRenderer(defiendIntervalNodeRendererDef))
+ {
+ CIMTinRenderer renderer = tinLayer.CreateRenderer(defiendIntervalNodeRendererDef);
+ if (tinLayer.CanSetRenderer(renderer, SurfaceRendererTarget.Edges))
+ tinLayer.SetRenderer(renderer, SurfaceRendererTarget.Edges);
+ }
+ #endregion
+
+ // cref: ArcGIS.Desktop.Mapping.TinNodeClassBreaksRendererDefinition
+ // cref: ArcGIS.Core.CIM.ClassificationMethod
+ // cref: ArcGIS.Desktop.Mapping.StandardDeviationInterval
+ // cref: ArcGIS.Core.CIM.CIMTinRenderer
+ // cref: ArcGIS.Core.CIM.CIMTinNodeElevationRenderer
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanCreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanSetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.SetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceRendererTarget
+ #region Elevation Node Renderer - Standard Deviation
+ // applies to TIN layers only
+
+ var stdDevNodeRendererDef = new TinNodeClassBreaksRendererDefinition();
+ stdDevNodeRendererDef.ClassificationMethod = ClassificationMethod.StandardDeviation;
+ stdDevNodeRendererDef.DeviationInterval = StandardDeviationInterval.OneHalf;
+ stdDevNodeRendererDef.ColorRamp = ColorFactory.Instance.GetColorRamp("Cyan to Purple");
+
+ if (tinLayer.CanCreateRenderer(stdDevNodeRendererDef))
+ {
+ CIMTinRenderer renderer = tinLayer.CreateRenderer(stdDevNodeRendererDef);
+ if (tinLayer.CanSetRenderer(renderer, SurfaceRendererTarget.Edges))
+ tinLayer.SetRenderer(renderer, SurfaceRendererTarget.Edges);
+ }
+
+ #endregion
+
+ CIMLineSymbol lineSymbol = null;
+ // cref: ArcGIS.Desktop.Mapping.TinEdgeRendererDefintion
+ // cref: ArcGIS.Desktop.Mapping.TinEdgeRendererDefintion.#ctor
+ // cref: ArcGIS.Desktop.Mapping.TinSimpleRendererDefinition
+ // cref: ArcGIS.Desktop.Mapping.TinSimpleRendererDefinition.Description
+ // cref: ArcGIS.Desktop.Mapping.TinSimpleRendererDefinition.Label
+ // cref: ArcGIS.Desktop.Mapping.TinSimpleRendererDefinition.SymbolTemplate
+ // cref: ArcGIS.Core.CIM.CIMTinRenderer
+ // cref: ArcGIS.Core.CIM.CIMTinEdgeRenderer
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanCreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanSetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.SetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceRendererTarget
+ #region Simple Edge Renderer
+ // applies to TIN or LAS dataset layers only
+
+ var edgeRendererDef = new TinEdgeRendererDefintion();
+ edgeRendererDef.Description = "Edges";
+ edgeRendererDef.Label = "Edges";
+ edgeRendererDef.SymbolTemplate = lineSymbol.MakeSymbolReference();
+
+ if (surfaceLayer.CanCreateRenderer(edgeRendererDef))
+ {
+ CIMTinRenderer renderer = surfaceLayer.CreateRenderer(edgeRendererDef);
+ if (surfaceLayer.CanSetRenderer(renderer, SurfaceRendererTarget.Edges))
+ surfaceLayer.SetRenderer(renderer, SurfaceRendererTarget.Edges);
+ }
+ #endregion
+
+ CIMLineSymbol hardEdgeSymbol = null;
+ CIMLineSymbol softEdgeSymbol = null;
+ CIMLineSymbol outsideEdgeSymbol = null;
+ // cref: ArcGIS.Desktop.Mapping.TinBreaklineRendererDefinition
+ // cref: ArcGIS.Desktop.Mapping.TinBreaklineRendererDefinition.#ctor
+ // cref: ArcGIS.Desktop.Mapping.TinBreaklineRendererDefinition.HardEdgeSymbol
+ // cref: ArcGIS.Desktop.Mapping.TinBreaklineRendererDefinition.SoftEdgeSymbol
+ // cref: ArcGIS.Desktop.Mapping.TinBreaklineRendererDefinition.OutsideEdgeSymbol
+ // cref: ArcGIS.Desktop.Mapping.TinBreaklineRendererDefinition.RegularEdgeSymbol
+ // cref: ArcGIS.Core.CIM.CIMTinRenderer
+ // cref: ArcGIS.Core.CIM.CIMTinBreaklineRenderer
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanCreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanSetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.SetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceRendererTarget
+ #region Edge Type Renderer
+ var breaklineRendererDef = new TinBreaklineRendererDefinition();
+ // use default symbol for regular edge but specific symbols for hard,soft,outside
+ breaklineRendererDef.HardEdgeSymbol = hardEdgeSymbol.MakeSymbolReference();
+ breaklineRendererDef.SoftEdgeSymbol = softEdgeSymbol.MakeSymbolReference();
+ breaklineRendererDef.OutsideEdgeSymbol = outsideEdgeSymbol.MakeSymbolReference();
+
+ if (surfaceLayer.CanCreateRenderer(breaklineRendererDef))
+ {
+ CIMTinRenderer renderer = surfaceLayer.CreateRenderer(breaklineRendererDef);
+ if (surfaceLayer.CanSetRenderer(renderer, SurfaceRendererTarget.Edges))
+ surfaceLayer.SetRenderer(renderer, SurfaceRendererTarget.Edges);
+ }
+ #endregion
+
+ CIMLineSymbol contourLineSymbol = null;
+ CIMLineSymbol indexLineSymbol = null;
+ // cref: ArcGIS.Desktop.Mapping.TinContourRendererDefinition
+ // cref: ArcGIS.Desktop.Mapping.TinContourRendererDefinition.#ctor
+ // cref: ArcGIS.Desktop.Mapping.TinContourRendererDefinition.Label
+ // cref: ArcGIS.Desktop.Mapping.TinContourRendererDefinition.SymbolTemplate
+ // cref: ArcGIS.Desktop.Mapping.TinContourRendererDefinition.ContourInterval
+ // cref: ArcGIS.Desktop.Mapping.TinContourRendererDefinition.IndexLabel
+ // cref: ArcGIS.Desktop.Mapping.TinContourRendererDefinition.IndexSymbolTemplate
+ // cref: ArcGIS.Desktop.Mapping.TinContourRendererDefinition.ContourFactor
+ // cref: ArcGIS.Desktop.Mapping.TinContourRendererDefinition.ReferenceHeight
+ // cref: ArcGIS.Core.CIM.CIMTinRenderer
+ // cref: ArcGIS.Core.CIM.CIMTinContourRenderer
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanCreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanSetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.SetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceRendererTarget
+ #region Contour Renderer
+
+ var contourDef = new TinContourRendererDefinition();
+
+ // now customize with a symbol
+ contourDef.Label = "Contours";
+ contourDef.SymbolTemplate = contourLineSymbol.MakeSymbolReference();
+ contourDef.ContourInterval = 6;
+
+ contourDef.IndexLabel = "Index Contours";
+ contourDef.IndexSymbolTemplate = indexLineSymbol.MakeSymbolReference();
+ contourDef.ContourFactor = 4;
+ contourDef.ReferenceHeight = 7;
+
+ if (surfaceLayer.CanCreateRenderer(contourDef))
+ {
+ CIMTinRenderer renderer = surfaceLayer.CreateRenderer(contourDef);
+ if (surfaceLayer.CanSetRenderer(renderer, SurfaceRendererTarget.Contours))
+ surfaceLayer.SetRenderer(renderer, SurfaceRendererTarget.Contours);
+ }
+
+ #endregion
+
+ CIMPolygonSymbol polySymbol = null;
+ // cref: ArcGIS.Desktop.Mapping.TinFaceRendererDefinition
+ // cref: ArcGIS.Desktop.Mapping.TinFaceRendererDefinition.#ctor
+ // cref: ArcGIS.Desktop.Mapping.TinSimpleRendererDefinition.SymbolTemplate
+ // cref: ArcGIS.Core.CIM.CIMTinRenderer
+ // cref: ArcGIS.Core.CIM.CIMTinFaceRenderer
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanCreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanSetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.SetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceRendererTarget
+ #region Simple Face Renderer
+ var simpleFaceRendererDef = new TinFaceRendererDefinition();
+ simpleFaceRendererDef.SymbolTemplate = polySymbol.MakeSymbolReference();
+
+ if (surfaceLayer.CanCreateRenderer(simpleFaceRendererDef))
+ {
+ CIMTinRenderer renderer = surfaceLayer.CreateRenderer(simpleFaceRendererDef);
+ if (surfaceLayer.CanSetRenderer(renderer, SurfaceRendererTarget.Surface))
+ surfaceLayer.SetRenderer(renderer, SurfaceRendererTarget.Surface);
+ }
+ #endregion
+
+ // cref: ArcGIS.Desktop.Mapping.TinFaceClassBreaksAspectRendererDefinition
+ // cref: ArcGIS.Desktop.Mapping.TinFaceClassBreaksAspectRendererDefinition.#ctor
+ // cref: ArcGIS.Desktop.Mapping.TinFaceClassBreaksAspectRendererDefinition.SymbolTemplate
+ // cref: ArcGIS.Core.CIM.CIMTinRenderer
+ // cref: ArcGIS.Core.CIM.CIMTinFaceClassBreaksRenderer
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanCreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanSetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.SetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceRendererTarget
+ #region Aspect Face Renderer
+ var aspectFaceRendererDef = new TinFaceClassBreaksAspectRendererDefinition();
+ aspectFaceRendererDef.SymbolTemplate = polySymbol.MakeSymbolReference();
+ // accept default color ramp
+
+ if (surfaceLayer.CanCreateRenderer(aspectFaceRendererDef))
+ {
+ CIMTinRenderer renderer = surfaceLayer.CreateRenderer(aspectFaceRendererDef);
+ if (surfaceLayer.CanSetRenderer(renderer, SurfaceRendererTarget.Surface))
+ surfaceLayer.SetRenderer(renderer, SurfaceRendererTarget.Surface);
+ }
+ #endregion
+
+ // cref: ArcGIS.Desktop.Mapping.TinFaceClassBreaksRendererDefinition
+ // cref: ArcGIS.Desktop.Mapping.TinFaceClassBreaksRendererDefinition.#ctor(ArcGIS.Core.CIM.TerrainDrawCursorType, ArcGIS.Core.CIM.ClassificationMethod, System.Int32, ArcGIS.Core.CIM.CIMSymbolReference, ArcGIS.Core.CIM.CIMColorRamp)
+ // cref: ArcGIS.Core.CIM.CIMTinRenderer
+ // cref: ArcGIS.Core.CIM.CIMTinFaceClassBreaksRenderer
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanCreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanSetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.SetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceRendererTarget
+ #region Slope Face Renderer - Equal Interval
+ var slopeFaceClassBreaksEqual = new TinFaceClassBreaksRendererDefinition(TerrainDrawCursorType.FaceSlope);
+ // accept default breakCount, symbolTemplate, color ramp
+
+ if (surfaceLayer.CanCreateRenderer(slopeFaceClassBreaksEqual))
+ {
+ CIMTinRenderer renderer = surfaceLayer.CreateRenderer(slopeFaceClassBreaksEqual);
+ if (surfaceLayer.CanSetRenderer(renderer, SurfaceRendererTarget.Surface))
+ surfaceLayer.SetRenderer(renderer, SurfaceRendererTarget.Surface);
+ }
+ #endregion
+
+ // cref: ArcGIS.Desktop.Mapping.TinFaceClassBreaksRendererDefinition
+ // cref: ArcGIS.Core.CIM.TerrainDrawCursorType
+ // cref: ArcGIS.Core.CIM.ClassificationMethod
+ // cref: ArcGIS.Core.CIM.CIMTinRenderer
+ // cref: ArcGIS.Core.CIM.CIMTinFaceClassBreaksRenderer
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanCreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanSetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.SetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceRendererTarget
+ #region Slope Face Renderer - Quantile
+ var slopeFaceClassBreaksQuantile = new TinFaceClassBreaksRendererDefinition(TerrainDrawCursorType.FaceSlope);
+ slopeFaceClassBreaksQuantile.ClassificationMethod = ClassificationMethod.Quantile;
+ // accept default breakCount, symbolTemplate, color ramp
+
+ if (surfaceLayer.CanCreateRenderer(slopeFaceClassBreaksQuantile))
+ {
+ CIMTinRenderer renderer = surfaceLayer.CreateRenderer(slopeFaceClassBreaksQuantile);
+ if (surfaceLayer.CanSetRenderer(renderer, SurfaceRendererTarget.Surface))
+ surfaceLayer.SetRenderer(renderer, SurfaceRendererTarget.Surface);
+ }
+ #endregion
+
+ // cref: ArcGIS.Desktop.Mapping.TinFaceClassBreaksRendererDefinition
+ // cref: ArcGIS.Core.CIM.CIMTinRenderer
+ // cref: ArcGIS.Core.CIM.CIMTinFaceClassBreaksRenderer
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanCreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanSetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.SetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceRendererTarget
+ #region Elevation Face Renderer - Equal Interval
+
+ var elevFaceClassBreaksEqual = new TinFaceClassBreaksRendererDefinition();
+ // accept default breakCount, symbolTemplate, color ramp
+
+ if (surfaceLayer.CanCreateRenderer(slopeFaceClassBreaksEqual))
+ {
+ CIMTinRenderer renderer = surfaceLayer.CreateRenderer(slopeFaceClassBreaksEqual);
+ if (surfaceLayer.CanSetRenderer(renderer, SurfaceRendererTarget.Surface))
+ surfaceLayer.SetRenderer(renderer, SurfaceRendererTarget.Surface);
+ }
+ #endregion
+
+ // cref: ArcGIS.Desktop.Mapping.TerrainDirtyAreaRendererDefinition
+ // cref: ArcGIS.Desktop.Mapping.TerrainDirtyAreaRendererDefinition.#ctor
+ // cref: ArcGIS.Core.CIM.CIMTinRenderer
+ // cref: ArcGIS.Core.CIM.CIMTerrainDirtyAreaRenderer
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanCreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanSetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.SetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceRendererTarget
+ // cref: ArcGIS.Desktop.Mapping.TerrainLayer
+ #region Dirty Area Renderer
+ // applies to Terrain layers only
+
+ var dirtyAreaRendererDef = new TerrainDirtyAreaRendererDefinition();
+ // accept default labels, symbolTemplate
+
+ var terrainLayer = MapView.Active.Map.GetLayersAsFlattenedList().OfType().FirstOrDefault();
+ if (terrainLayer == null)
+ return;
+
+ if (terrainLayer.CanCreateRenderer(dirtyAreaRendererDef))
+ {
+ CIMTinRenderer renderer = terrainLayer.CreateRenderer(dirtyAreaRendererDef);
+ if (terrainLayer.CanSetRenderer(renderer, SurfaceRendererTarget.DirtyArea))
+ terrainLayer.SetRenderer(renderer, SurfaceRendererTarget.DirtyArea);
+ }
+ #endregion
+
+ // cref: ArcGIS.Desktop.Mapping.TerrainPointClassBreaksRendererDefinition
+ // cref: ArcGIS.Desktop.Mapping.TerrainPointClassBreaksRendererDefinition.#ctor
+ // cref: ArcGIS.Core.CIM.CIMTinRenderer
+ // cref: ArcGIS.Core.CIM.CIMTerrainPointElevationRenderer
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanCreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanSetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.SetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceRendererTarget
+ #region Terrain Point Class Breaks Renderer
+ // applies to Terrain layers only
+
+ var terrainPointClassBreaks = new TerrainPointClassBreaksRendererDefinition();
+ // accept defaults
+
+ if (terrainLayer.CanCreateRenderer(terrainPointClassBreaks))
+ {
+ CIMTinRenderer renderer = terrainLayer.CreateRenderer(terrainPointClassBreaks);
+ if (terrainLayer.CanSetRenderer(renderer, SurfaceRendererTarget.Points))
+ terrainLayer.SetRenderer(renderer, SurfaceRendererTarget.Points);
+ }
+ #endregion
+
+ // cref: ArcGIS.Desktop.Mapping.LasUniqueValueRendererDefinition
+ // cref: ArcGIS.Desktop.Mapping.LasUniqueValueRendererDefinition.#ctor(ArcGIS.Desktop.Mapping.LasAttributeType,System.Boolean,ArcGIS.Core.CIM.CIMSymbolReference,System.Double,ArcGIS.Core.CIM.CIMColorRamp)
+ // cref: ArcGIS.Desktop.Mapping.LasAttributeType
+ // cref: ArcGIS.Core.CIM.CIMTinRenderer
+ // cref: ArcGIS.Core.CIM.CIMLASUniqueValueRenderer
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanCreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanSetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.SetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceRendererTarget
+ // cref: ArcGIS.Desktop.Mapping.LasDatasetLayer
+ #region LAS Points Classification Unique Value Renderer
+ // applies to LAS dataset layers only
+
+ var lasPointsClassificationRendererDef = new LasUniqueValueRendererDefinition(LasAttributeType.Classification);
+ // accept the defaults for color ramp, symbolTemplate, symbol scale factor
+
+ var lasDatasetLayer = MapView.Active.Map.GetLayersAsFlattenedList().OfType().FirstOrDefault();
+ if (lasDatasetLayer == null)
+ return;
+
+ if (lasDatasetLayer.CanCreateRenderer(lasPointsClassificationRendererDef))
+ {
+ CIMTinRenderer renderer = lasDatasetLayer.CreateRenderer(lasPointsClassificationRendererDef);
+ if (lasDatasetLayer.CanSetRenderer(renderer, SurfaceRendererTarget.Points))
+ lasDatasetLayer.SetRenderer(renderer, SurfaceRendererTarget.Points);
+ }
+ #endregion
+
+ // cref: ArcGIS.Desktop.Mapping.LasUniqueValueRendererDefinition
+ // cref: ArcGIS.Desktop.Mapping.LasUniqueValueRendererDefinition.#ctor(ArcGIS.Desktop.Mapping.LasAttributeType,System.Boolean,ArcGIS.Core.CIM.CIMSymbolReference,System.Double,ArcGIS.Core.CIM.CIMColorRamp)
+ // cref: ArcGIS.Desktop.Mapping.LasAttributeType
+ // cref: ArcGIS.Desktop.Mapping.LasUniqueValueRendererDefinition.ModulateUsingIntensity
+ // cref: ArcGIS.Desktop.Mapping.LasUniqueValueRendererDefinition.SymbolScaleFactor
+ // cref: ArcGIS.Core.CIM.CIMTinRenderer
+ // cref: ArcGIS.Core.CIM.CIMLASUniqueValueRenderer
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanCreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanSetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.SetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceRendererTarget
+ #region LAS Points Returns Unique Value Renderer
+ // applies to LAS dataset layers only
+
+ var lasPointsReturnsRendererDef = new LasUniqueValueRendererDefinition(LasAttributeType.ReturnNumber);
+ lasPointsReturnsRendererDef.ModulateUsingIntensity = true;
+ lasPointsReturnsRendererDef.SymbolScaleFactor = 1.0;
+ // accept the defaults for color ramp, symbolTemplate
+
+ if (lasDatasetLayer.CanCreateRenderer(lasPointsReturnsRendererDef))
+ {
+ CIMTinRenderer renderer = lasDatasetLayer.CreateRenderer(lasPointsReturnsRendererDef);
+ if (lasDatasetLayer.CanSetRenderer(renderer, SurfaceRendererTarget.Points))
+ lasDatasetLayer.SetRenderer(renderer, SurfaceRendererTarget.Points);
+ }
+ #endregion
+
+ // cref: ArcGIS.Desktop.Mapping.LasStretchRendererDefinition
+ // cref: ArcGIS.Desktop.Mapping.LasStretchRendererDefinition.#ctor(ArcGIS.Core.CIM.LASStretchAttribute,ArcGIS.Core.CIM.LASStretchType,System.Double,ArcGIS.Core.CIM.CIMColorRamp)
+ // cref: ArcGIS.Core.CIM.LASStretchAttribute
+ // cref: ArcGIS.Core.CIM.CIMTinRenderer
+ // cref: ArcGIS.Core.CIM.CIMLASStretchRenderer
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanCreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanSetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.SetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceRendererTarget
+ // cref: ArcGIS.Desktop.Mapping.LasStretchRendererDefinition.StretchType
+ // cref: ArcGIS.Core.CIM.LASStretchType
+ // cref: ArcGIS.Desktop.Mapping.LasStretchRendererDefinition.NumberOfStandardDeviations
+ #region LAS Points Elevation Stretch Renderer
+ // applies to LAS dataset layers only
+
+ var elevLasStretchRendererDef = new LasStretchRendererDefinition(ArcGIS.Core.CIM.LASStretchAttribute.Elevation);
+ // accept the defaults for color ramp, etc
+
+ if (lasDatasetLayer.CanCreateRenderer(elevLasStretchRendererDef))
+ {
+ CIMTinRenderer renderer = lasDatasetLayer.CreateRenderer(elevLasStretchRendererDef);
+ if (lasDatasetLayer.CanSetRenderer(renderer, SurfaceRendererTarget.Points))
+ lasDatasetLayer.SetRenderer(renderer, SurfaceRendererTarget.Points);
+ }
+
+
+ // OR use a stretch renderer with stretchType standard Deviations
+ var elevLasStretchStdDevRendererDef = new LasStretchRendererDefinition(ArcGIS.Core.CIM.LASStretchAttribute.Elevation);
+ elevLasStretchStdDevRendererDef.StretchType = LASStretchType.StandardDeviations;
+ elevLasStretchStdDevRendererDef.NumberOfStandardDeviations = 2;
+ // accept the defaults for color ramp, etc
+
+ if (lasDatasetLayer.CanCreateRenderer(elevLasStretchStdDevRendererDef))
+ {
+ CIMTinRenderer renderer = lasDatasetLayer.CreateRenderer(elevLasStretchStdDevRendererDef);
+ if (lasDatasetLayer.CanSetRenderer(renderer, SurfaceRendererTarget.Points))
+ lasDatasetLayer.SetRenderer(renderer, SurfaceRendererTarget.Points);
+ }
+ #endregion
+
+ // cref: ArcGIS.Desktop.Mapping.LasPointClassBreaksRendererDefinition
+ // cref: ArcGIS.Desktop.Mapping.LasPointClassBreaksRendererDefinition.#ctor
+ // cref: ArcGIS.Desktop.Mapping.TinColorRampRendererDefinition.ClassificationMethod
+ // cref: ArcGIS.Core.CIM.ClassificationMethod
+ // cref: ArcGIS.Desktop.Mapping.LasPointClassBreaksRendererDefinition.ModulateUsingIntensity
+ // cref: ArcGIS.Desktop.Mapping.LasPointClassBreaksRendererDefinition.SymbolScaleFactor
+ // cref: ArcGIS.Core.CIM.CIMTinRenderer
+ // cref: ArcGIS.Core.CIM.CIMLASPointElevationRenderer
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanCreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanSetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CreateRenderer(ArcGIS.Desktop.Mapping.TinRendererDefinition)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.SetRenderer(ArcGIS.Core.CIM.CIMTinRenderer, ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceRendererTarget
+ #region LAS Points Classified Elevation Renderer
+ // applies to LAS dataset layers only
+
+ var lasPointsClassBreaksRendererDef = new LasPointClassBreaksRendererDefinition();
+ lasPointsClassBreaksRendererDef.ClassificationMethod = ClassificationMethod.NaturalBreaks;
+ lasPointsClassBreaksRendererDef.ModulateUsingIntensity = true;
+ // increase the symbol size by a factor
+ lasPointsClassBreaksRendererDef.SymbolScaleFactor = 1.0;
+
+ if (lasDatasetLayer.CanCreateRenderer(lasPointsClassBreaksRendererDef))
+ {
+ CIMTinRenderer renderer = lasDatasetLayer.CreateRenderer(lasPointsClassBreaksRendererDef);
+ if (lasDatasetLayer.CanSetRenderer(renderer, SurfaceRendererTarget.Points))
+ lasDatasetLayer.SetRenderer(renderer, SurfaceRendererTarget.Points);
+ }
+ #endregion
+
+ {
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.RemoveRenderer(ArcGIS.Desktop.Mapping.SurfaceRendererTarget)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceRendererTarget
+ #region Remove an edge renderer
+ var layer = MapView.Active.Map.GetLayersAsFlattenedList().OfType().FirstOrDefault();
+ if (layer == null)
+ return;
+
+ QueuedTask.Run(() =>
+ {
+ layer.RemoveRenderer(SurfaceRendererTarget.Edges);
+ });
+
+ #endregion
+ }
+ }
+
+
+ #region ProSnippet Group: TIN Layer Searching
+ #endregion
+
+ public void TinLayer_Search()
+ {
+ TinLayer tinLayer = null;
+ Envelope envelope = null;
+ ArcGIS.Core.Data.Analyst3D.TinDataset tinDataset = null;
+
+ // cref: ArcGIS.Desktop.Mapping.TinLayer.SearchNodes
+ // cref: ArcGIS.Core.Data.Analyst3D.TinNodeCursor
+ // cref: ArcGIS.Core.Data.Analyst3D.TinNode
+ // cref: ArcGIS.Core.Data.Analyst3D.TinNodeFilter
+ // cref: ArcGIS.Core.Data.Analyst3D.TinNodeFilter.#ctor
+ // cref: ArcGIS.Core.Data.Analyst3D.TinFilter.FilterEnvelope
+ // cref: ArcGIS.Core.Data.Analyst3D.TinFilter.DataElementsOnly
+ // cref: ArcGIS.Core.Data.Analyst3D.TinNodeFilter.SuperNode
+ // cref: ArcGIS.Desktop.Mapping.TinLayer.SearchEdges
+ // cref: ArcGIS.Core.Data.Analyst3D.TinEdgeCursor
+ // cref: ArcGIS.Core.Data.Analyst3D.TinEdge
+ // cref: ArcGIS.Core.Data.Analyst3D.TinEdgeFilter
+ // cref: ArcGIS.Core.Data.Analyst3D.TinEdgeFilter.#ctor
+ // cref: ArcGIS.Core.Data.Analyst3D.TinFilter.FilterEnvelope
+ // cref: ArcGIS.Core.Data.Analyst3D.TinFilter.DataElementsOnly
+ // cref: ArcGIS.Core.Data.Analyst3D.TinEdgeFilter.FilterByEdgeType
+ // cref: ArcGIS.Core.Data.Analyst3D.TinEdgeFilter.EdgeType
+ // cref: ArcGIS.Desktop.Mapping.TinLayer.SearchTriangles
+ // cref: ArcGIS.Core.Data.Analyst3D.TinTriangleCursor
+ // cref: ArcGIS.Core.Data.Analyst3D.TinTriangle
+ // cref: ArcGIS.Core.Data.Analyst3D.TinTriangleFilter
+ // cref: ArcGIS.Core.Data.Analyst3D.TinTriangleFilter.#ctor
+ // cref: ArcGIS.Core.Data.Analyst3D.TinFilter.FilterEnvelope
+ // cref: ArcGIS.Core.Data.Analyst3D.TinFilter.DataElementsOnly
+ #region Seach for TIN Nodes, Edges, Triangles
+ // search all "inside" nodes
+ using (ArcGIS.Core.Data.Analyst3D.TinNodeCursor nodeCursor = tinLayer.SearchNodes(null))
+ {
+ while (nodeCursor.MoveNext())
+ {
+ using (ArcGIS.Core.Data.Analyst3D.TinNode node = nodeCursor.Current)
+ {
+
+ }
+ }
+ }
+
+ // search "inside" nodes with an extent
+ ArcGIS.Core.Data.Analyst3D.TinNodeFilter nodeFilter = new ArcGIS.Core.Data.Analyst3D.TinNodeFilter();
+ nodeFilter.FilterEnvelope = envelope;
+ using (ArcGIS.Core.Data.Analyst3D.TinNodeCursor nodeCursor = tinLayer.SearchNodes(nodeFilter))
+ {
+ while (nodeCursor.MoveNext())
+ {
+ using (ArcGIS.Core.Data.Analyst3D.TinNode node = nodeCursor.Current)
+ {
+
+ }
+ }
+ }
+
+ // search for super nodes only
+ var supernodeFilter = new ArcGIS.Core.Data.Analyst3D.TinNodeFilter();
+ supernodeFilter.FilterEnvelope = tinDataset.GetSuperNodeExtent();
+ supernodeFilter.DataElementsOnly = false;
+ supernodeFilter.SuperNode = true;
+ using (ArcGIS.Core.Data.Analyst3D.TinNodeCursor nodeCursor = tinLayer.SearchNodes(nodeFilter))
+ {
+ while (nodeCursor.MoveNext())
+ {
+ using (ArcGIS.Core.Data.Analyst3D.TinNode node = nodeCursor.Current)
+ {
+
+ }
+ }
+ }
+
+
+ // search all edges within an extent
+ // this could include outside or edges attached to super nodes depending upon the extent
+ ArcGIS.Core.Data.Analyst3D.TinEdgeFilter edgeFilterAll = new ArcGIS.Core.Data.Analyst3D.TinEdgeFilter();
+ edgeFilterAll.FilterEnvelope = envelope;
+ edgeFilterAll.DataElementsOnly = false;
+ using (ArcGIS.Core.Data.Analyst3D.TinEdgeCursor edgeCursor = tinLayer.SearchEdges(edgeFilterAll))
+ {
+ while (edgeCursor.MoveNext())
+ {
+ using (ArcGIS.Core.Data.Analyst3D.TinEdge edge = edgeCursor.Current)
+ {
+ }
+ }
+ }
+
+
+ // search for hard edges in the TIN
+ var edgeFilter = new ArcGIS.Core.Data.Analyst3D.TinEdgeFilter();
+ edgeFilter.FilterByEdgeType = true;
+ edgeFilter.EdgeType = ArcGIS.Core.Data.Analyst3D.TinEdgeType.HardEdge;
+ using (ArcGIS.Core.Data.Analyst3D.TinEdgeCursor edgeCursor = tinLayer.SearchEdges(edgeFilter))
+ {
+ while (edgeCursor.MoveNext())
+ {
+ using (ArcGIS.Core.Data.Analyst3D.TinEdge edge = edgeCursor.Current)
+ {
+
+ }
+ }
+ }
+
+
+ // search for "inside" triangles in an extent
+ ArcGIS.Core.Data.Analyst3D.TinTriangleFilter triangleFilter = new ArcGIS.Core.Data.Analyst3D.TinTriangleFilter();
+ triangleFilter.FilterEnvelope = envelope;
+ triangleFilter.DataElementsOnly = true;
+ using (ArcGIS.Core.Data.Analyst3D.TinTriangleCursor triangleCursor = tinLayer.SearchTriangles(triangleFilter))
+ {
+ while (triangleCursor.MoveNext())
+ {
+ using (ArcGIS.Core.Data.Analyst3D.TinTriangle triangle = triangleCursor.Current)
+ {
+ }
+ }
+ }
+ #endregion
+
+ }
+
+
+ #region ProSnippet Group: LAS Dataset Layer Display Filter
+ #endregion
+
+ public void SetLasDisplayFilter()
+ {
+ LasDatasetLayer lasDatasetLayer = null;
+
+ // cref: ArcGIS.Desktop.Mapping.LasDatasetLayer.GetDisplayFilter
+ // cref: ArcGIS.Desktop.Mapping.LasPointDisplayFilter
+ // cref: ArcGIS.Desktop.Mapping.LasDatasetLayer.SetDisplayFilter(ArcGIS.Desktop.Mapping.LasPointDisplayFilterType)
+ // cref: ArcGIS.Desktop.Mapping.LasPointDisplayFilterType
+ // cref: ArcGIS.Desktop.Mapping.LasDatasetLayer.SetDisplayFilter(List)
+ // cref: ArcGIS.Desktop.Mapping.LasDatasetLayer.SetDisplayFilter(List)
+ // cref: ArcGIS.Desktop.Mapping.LasPointDisplayFilter.#ctor
+ // cref: ArcGIS.Desktop.Mapping.LasPointDisplayFilter.Returns
+ // cref: ArcGIS.Desktop.Mapping.LasPointDisplayFilter.ClassCodes
+ // cref: ArcGIS.Desktop.Mapping.LasPointDisplayFilter.KeyPoints
+ // cref: ArcGIS.Desktop.Mapping.LasPointDisplayFilter.SyntheticPoints
+ // cref: ArcGIS.Desktop.Mapping.LasPointDisplayFilter.NotFlagged
+ // cref: ArcGIS.Desktop.Mapping.LasPointDisplayFilter.WithheldPoints
+ // cref: ArcGIS.Desktop.Mapping.LasDatasetLayer.SetDisplayFilter(ArcGIS.Desktop.Mapping.LasPointDisplayFilter)
+ #region Get and Set Display Filter
+
+ // get the current display filter
+ LasPointDisplayFilter ptFilter = lasDatasetLayer.GetDisplayFilter();
+
+
+ // display only ground points
+ lasDatasetLayer.SetDisplayFilter(LasPointDisplayFilterType.Ground);
+
+ // display first return points
+ lasDatasetLayer.SetDisplayFilter(LasPointDisplayFilterType.FirstReturnPoints);
+
+ // set display filter to a set of classification codes
+ List classifications = new List() { 4, 5, 7, 10 };
+ lasDatasetLayer.SetDisplayFilter(classifications);
+
+ // set display filter to a set of returns
+ List returns = new List()
+ { ArcGIS.Core.Data.Analyst3D.LasReturnType.ReturnFirstOfMany};
+ lasDatasetLayer.SetDisplayFilter(returns);
+
+ // set up a display filter
+ var newDisplayFilter = new LasPointDisplayFilter();
+ newDisplayFilter.Returns = new List()
+ { ArcGIS.Core.Data.Analyst3D.LasReturnType.ReturnFirstOfMany, ArcGIS.Core.Data.Analyst3D.LasReturnType.ReturnLastOfMany};
+ newDisplayFilter.ClassCodes = new List() { 2, 4 };
+ newDisplayFilter.KeyPoints = true;
+ newDisplayFilter.WithheldPoints = false;
+ newDisplayFilter.SyntheticPoints = false;
+ newDisplayFilter.NotFlagged = false;
+ lasDatasetLayer.SetDisplayFilter(returns);
+
+ #endregion
+
+ // cref: ArcGIS.Desktop.Mapping.LasDatasetLayer.GetActiveSurfaceConstraints
+ // cref: ArcGIS.Core.Data.Analyst3D.SurfaceConstraint
+ // cref: ArcGIS.Desktop.Mapping.LasDatasetLayer.SetActiveSurfaceConstraints(List)
+ #region Active Surface Constraints
+ var activeSurfaceConstraints = lasDatasetLayer.GetActiveSurfaceConstraints();
+
+ // clear all surface constraints (i.e. none are active)
+ lasDatasetLayer.SetActiveSurfaceConstraints(null);
+
+ // set all surface constraints active
+ using (var lasDataset = lasDatasetLayer.GetLasDataset())
+ {
+ var surfaceConstraints = lasDataset.GetSurfaceConstraints();
+ var names = surfaceConstraints.Select(sc => sc.DataSourceName).ToList();
+ lasDatasetLayer.SetActiveSurfaceConstraints(names);
+ }
+ #endregion
+ }
+
+ #region ProSnippet Group: LAS Dataset Layer Searching
+ #endregion
+
+ public void LasDatasetLayer_Search()
+ {
+ LasDatasetLayer lasDatasetLayer = null;
+ Envelope envelope = null;
+
+ // cref: ArcGIS.Desktop.Mapping.LasDatasetLayer.SearchPoints(LasPointFilter)
+ // cref: ArcGIS.Core.Data.Analyst3D.LasPointFilter
+ // cref: ArcGIS.Core.Data.Analyst3D.LasPointFilter.#ctor
+ // cref: ArcGIS.Core.Data.Analyst3D.LasPointFilter.FilterGeometry
+ // cref: ArcGIS.Core.Data.Analyst3D.LasPointFilter.ClassCodes
+ // cref: ArcGIS.Core.Data.Analyst3D.LasPointCursor
+ // cref: ArcGIS.Core.Data.Analyst3D.LasPointCursor.MoveNext
+ // cref: ArcGIS.Core.Data.Analyst3D.LasPointCursor.Current
+ // cref: ArcGIS.Core.Data.Analyst3D.LasPoint
+ #region Search for LAS Points
+
+ // searching on the LasDatasetLayer will honor any LasPointDisplayFilter
+
+ // search all points
+ using (ArcGIS.Core.Data.Analyst3D.LasPointCursor ptCursor = lasDatasetLayer.SearchPoints(null))
+ {
+ while (ptCursor.MoveNext())
+ {
+ using (ArcGIS.Core.Data.Analyst3D.LasPoint point = ptCursor.Current)
+ {
+
+ }
+ }
+ }
+
+ // search within an extent
+ ArcGIS.Core.Data.Analyst3D.LasPointFilter pointFilter = new ArcGIS.Core.Data.Analyst3D.LasPointFilter();
+ pointFilter.FilterGeometry = envelope;
+ using (ArcGIS.Core.Data.Analyst3D.LasPointCursor ptCursor = lasDatasetLayer.SearchPoints(pointFilter))
+ {
+ while (ptCursor.MoveNext())
+ {
+ using (ArcGIS.Core.Data.Analyst3D.LasPoint point = ptCursor.Current)
+ {
+
+ }
+ }
+ }
+
+ // search within an extent and limited to specific classsification codes
+ pointFilter = new ArcGIS.Core.Data.Analyst3D.LasPointFilter();
+ pointFilter.FilterGeometry = envelope;
+ pointFilter.ClassCodes = new List { 4, 5 };
+ using (ArcGIS.Core.Data.Analyst3D.LasPointCursor ptCursor = lasDatasetLayer.SearchPoints(pointFilter))
+ {
+ while (ptCursor.MoveNext())
+ {
+ using (ArcGIS.Core.Data.Analyst3D.LasPoint point = ptCursor.Current)
+ {
+
+ }
+ }
+ }
+
+ #endregion
+ }
+
+ #region ProSnippet Group: LAS Dataset Layer Eye Dome Lighting
+ #endregion
+
+ public void LasDatasetLayer_EDL()
+ {
+ LasDatasetLayer lasDatasetLayer = null;
+
+
+ // cref: ArcGIS.Desktop.Mapping.LasDatasetLayer.IsEyeDomeLightingEnabled
+ // cref: ArcGIS.Desktop.Mapping.LasDatasetLayer.EyeDomeLightingRadius
+ // cref: ArcGIS.Desktop.Mapping.LasDatasetLayer.EyeDomeLightingStrength
+ // cref: ArcGIS.Desktop.Mapping.LasDatasetLayer.SetEyeDomeLightingEnabled(System.Boolean)
+ // cref: ArcGIS.Desktop.Mapping.LasDatasetLayer.SetEyeDomeLightingStrength(System.Double)
+ // cref: ArcGIS.Desktop.Mapping.LasDatasetLayer.SetEyeDomeLightingRadius(System.Double)
+ #region Eye Dome Lighting
+
+ // get current EDL settings
+ bool isEnabled = lasDatasetLayer.IsEyeDomeLightingEnabled;
+ var radius = lasDatasetLayer.EyeDomeLightingRadius;
+ var strength = lasDatasetLayer.EyeDomeLightingStrength;
+
+ // set EDL values
+ lasDatasetLayer.SetEyeDomeLightingEnabled(true);
+ lasDatasetLayer.SetEyeDomeLightingStrength(65.0);
+ lasDatasetLayer.SetEyeDomeLightingRadius(2.0);
+
+ #endregion
+
+ }
+
+ #region ProSnippet Group: Line of Sight
+ #endregion
+ public void GetLineOfSight()
+ {
+ TinLayer tinLayer = null;
+ MapPoint observerPoint = null;
+ MapPoint targetPoint = null;
+ CIMPointSymbol obstructionPointSymbol = null;
+ CIMLineSymbol visibleLineSymbol = null;
+ CIMLineSymbol invisibleLineSymbol = null;
+
+ // cref: ArcGIS.Desktop.Mapping.LineOfSightParams
+ // cref: ArcGIS.Desktop.Mapping.LineOfSightParams.#ctor
+ // cref: ArcGIS.Desktop.Mapping.LineOfSightParams.ObserverPoint
+ // cref: ArcGIS.Desktop.Mapping.LineOfSightParams.TargetPoint
+ // cref: ArcGIS.Desktop.Mapping.LineOfSightParams.ObserverHeightOffset
+ // cref: ArcGIS.Desktop.Mapping.LineOfSightParams.TargetHeightOffset
+ // cref: ArcGIS.Desktop.Mapping.LineOfSightParams.OutputSpatialReference
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.CanGetLineOfSight(ArcGIS.Desktop.Mapping.LineOfSightParams)
+ // cref: ArcGIS.Desktop.Mapping.SurfaceLayer.GetLineOfSight(ArcGIS.Desktop.Mapping.LineOfSightParams)
+ // cref: ArcGIS.Desktop.Mapping.LineOfSightResult
+ // cref: ArcGIS.Desktop.Mapping.LineOfSightResult.IsTargetVisibleFromObserverPoint
+ // cref: ArcGIS.Desktop.Mapping.LineOfSightResult.VisibleLine
+ // cref: ArcGIS.Desktop.Mapping.LineOfSightResult.InvisibleLine
+ // cref: ArcGIS.Desktop.Mapping.LineOfSightResult.ObstructionPoint
+ // cref: ArcGIS.Desktop.Mapping.LineOfSightResult.IsTargetVisibleFromVisibleLine
+ // cref: ArcGIS.Desktop.Mapping.LineOfSightResult.IsTargetVisibleFromInvisibleLine
+ #region Get Line of Sight
+ var losParams = new LineOfSightParams();
+ losParams.ObserverPoint = observerPoint;
+ losParams.TargetPoint = targetPoint;
+
+ // add offsets if appropriate
+ // losParams.ObserverHeightOffset = observerOffset;
+ // losParams.TargetHeightOffset = targerOffset;
+
+ // set output spatial reference
+ losParams.OutputSpatialReference = MapView.Active.Map.SpatialReference;
+
+ LineOfSightResult results = null;
+ try
+ {
+ if (tinLayer.CanGetLineOfSight(losParams))
+ results = tinLayer.GetLineOfSight(losParams);
+ }
+ catch (Exception ex)
+ {
+ // log exception message
+ }
+
+ if (results != null)
+ {
+ bool targetIsVisibleFromObserverPoint = results.IsTargetVisibleFromObserverPoint;
+ bool targetVisibleFromVisibleLine = results.IsTargetVisibleFromVisibleLine;
+ bool targetVisibleFromInVisibleLine = results.IsTargetVisibleFromInvisibleLine;
+
+
+ if (results.VisibleLine != null)
+ MapView.Active.AddOverlay(results.VisibleLine, visibleLineSymbol.MakeSymbolReference());
+ if (results.InvisibleLine != null)
+ MapView.Active.AddOverlay(results.VisibleLine, invisibleLineSymbol.MakeSymbolReference());
+ if (results.ObstructionPoint != null)
+ MapView.Active.AddOverlay(results.ObstructionPoint, obstructionPointSymbol.MakeSymbolReference());
+ }
+ #endregion
+
+ }
+ }
+}
+
+
+
diff --git a/Examples/MapExploration/ProSnippet.cs b/Examples/MapExploration/ProSnippet.cs
index bc1fd95..d8accb7 100644
--- a/Examples/MapExploration/ProSnippet.cs
+++ b/Examples/MapExploration/ProSnippet.cs
@@ -983,7 +983,7 @@ public void GetSelectionTableView()
public void SetSelectionTableView()
{
- // cref: ArcGIS.Desktop.Mapping.TableView.Select(IEnumerable<, System.Boolean)
+ // cref: ArcGIS.Desktop.Mapping.TableView.Select(System.Collections.Generic.IEnumerable{System.Int64},System.Boolean)
// cref: ArcGIS.Desktop.Mapping.TableView.GetSelectedRowIndexes
#region Change selected rows
var tv = TableView.Active;
@@ -1104,7 +1104,7 @@ public void GetHighlightTableView()
public void SetHighlightedTableView()
{
// cref: ArcGIS.Desktop.Mapping.TableView.CanHighlight
- // cref: ArcGIS.Desktop.Mapping.TableView.Highlight(IEnumerable<, System.Boolean)
+ // cref: ArcGIS.Desktop.Mapping.TableView.Highlight(System.Collections.Generic.IEnumerable{System.Int64},System.Boolean)
#region Change highlighted rows
var tv = TableView.Active;
if (tv == null)
diff --git a/Examples/SDKExamples2022.sln b/Examples/SDKExamples2022.sln
index 2782527..92e6de0 100644
--- a/Examples/SDKExamples2022.sln
+++ b/Examples/SDKExamples2022.sln
@@ -1,7 +1,7 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 16
-VisualStudioVersion = 16.0.31911.196
+# Visual Studio Version 17
+VisualStudioVersion = 17.6.33829.357
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Content", "Content\Content.csproj", "{60013234-CCE0-B0CF-D5F8-3BA641571731}"
EndProject
@@ -33,90 +33,184 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SceneLayers", "SceneLayers\
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sharing", "Sharing\Sharing.csproj", "{B16A95F2-1D4A-148E-2662-9F6492C07AEF}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Task", "Tasks\Task.csproj", "{38CB8C7C-2402-8E0D-CDEE-7310B9040A0F}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Task", "Tasks\Task.csproj", "{38CB8C7C-2402-8E0D-CDEE-7310B9040A0F}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UtilityNetwork", "UtilityNetwork\UtilityNetwork.csproj", "{6355DB8A-4F23-CF90-38B7-3FB72424ABF5}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WorkflowManager", "WorkflowManager\WorkflowManager.csproj", "{7B4BC9D2-E7D6-3697-F0E7-B98B5CF29297}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KnowledgeGraph", "KnowledgeGraph\KnowledgeGraph.csproj", "{6DD2B170-63B2-478A-8308-D70688DCDB1C}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Arcade", "Arcade\Arcade.csproj", "{22B1984A-5ADF-41A5-8B5F-074C1785D7EC}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
+ Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {60013234-CCE0-B0CF-D5F8-3BA641571731}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {60013234-CCE0-B0CF-D5F8-3BA641571731}.Debug|Any CPU.Build.0 = Debug|Any CPU
{60013234-CCE0-B0CF-D5F8-3BA641571731}.Debug|x64.ActiveCfg = Debug|Any CPU
{60013234-CCE0-B0CF-D5F8-3BA641571731}.Debug|x64.Build.0 = Debug|Any CPU
+ {60013234-CCE0-B0CF-D5F8-3BA641571731}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {60013234-CCE0-B0CF-D5F8-3BA641571731}.Release|Any CPU.Build.0 = Release|Any CPU
{60013234-CCE0-B0CF-D5F8-3BA641571731}.Release|x64.ActiveCfg = Release|x64
{60013234-CCE0-B0CF-D5F8-3BA641571731}.Release|x64.Build.0 = Release|x64
+ {EC7DA7C2-D84A-02CE-0164-F075ED8F375C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {EC7DA7C2-D84A-02CE-0164-F075ED8F375C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EC7DA7C2-D84A-02CE-0164-F075ED8F375C}.Debug|x64.ActiveCfg = Debug|Any CPU
{EC7DA7C2-D84A-02CE-0164-F075ED8F375C}.Debug|x64.Build.0 = Debug|Any CPU
+ {EC7DA7C2-D84A-02CE-0164-F075ED8F375C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {EC7DA7C2-D84A-02CE-0164-F075ED8F375C}.Release|Any CPU.Build.0 = Release|Any CPU
{EC7DA7C2-D84A-02CE-0164-F075ED8F375C}.Release|x64.ActiveCfg = Release|x64
{EC7DA7C2-D84A-02CE-0164-F075ED8F375C}.Release|x64.Build.0 = Release|x64
+ {695223B4-D531-A24F-DE49-2D264AA808B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {695223B4-D531-A24F-DE49-2D264AA808B1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{695223B4-D531-A24F-DE49-2D264AA808B1}.Debug|x64.ActiveCfg = Debug|Any CPU
{695223B4-D531-A24F-DE49-2D264AA808B1}.Debug|x64.Build.0 = Debug|Any CPU
+ {695223B4-D531-A24F-DE49-2D264AA808B1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {695223B4-D531-A24F-DE49-2D264AA808B1}.Release|Any CPU.Build.0 = Release|Any CPU
{695223B4-D531-A24F-DE49-2D264AA808B1}.Release|x64.ActiveCfg = Release|x64
{695223B4-D531-A24F-DE49-2D264AA808B1}.Release|x64.Build.0 = Release|x64
+ {1362EE31-7FCC-A2A8-C80A-544E34B480FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1362EE31-7FCC-A2A8-C80A-544E34B480FD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1362EE31-7FCC-A2A8-C80A-544E34B480FD}.Debug|x64.ActiveCfg = Debug|Any CPU
{1362EE31-7FCC-A2A8-C80A-544E34B480FD}.Debug|x64.Build.0 = Debug|Any CPU
+ {1362EE31-7FCC-A2A8-C80A-544E34B480FD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1362EE31-7FCC-A2A8-C80A-544E34B480FD}.Release|Any CPU.Build.0 = Release|Any CPU
{1362EE31-7FCC-A2A8-C80A-544E34B480FD}.Release|x64.ActiveCfg = Release|x64
{1362EE31-7FCC-A2A8-C80A-544E34B480FD}.Release|x64.Build.0 = Release|x64
+ {9DC590DF-0986-0C16-D2C0-55933E4051F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9DC590DF-0986-0C16-D2C0-55933E4051F2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9DC590DF-0986-0C16-D2C0-55933E4051F2}.Debug|x64.ActiveCfg = Debug|Any CPU
{9DC590DF-0986-0C16-D2C0-55933E4051F2}.Debug|x64.Build.0 = Debug|Any CPU
+ {9DC590DF-0986-0C16-D2C0-55933E4051F2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9DC590DF-0986-0C16-D2C0-55933E4051F2}.Release|Any CPU.Build.0 = Release|Any CPU
{9DC590DF-0986-0C16-D2C0-55933E4051F2}.Release|x64.ActiveCfg = Release|x64
{9DC590DF-0986-0C16-D2C0-55933E4051F2}.Release|x64.Build.0 = Release|x64
+ {37503055-231E-245B-0CB2-9481F81E00C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {37503055-231E-245B-0CB2-9481F81E00C0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{37503055-231E-245B-0CB2-9481F81E00C0}.Debug|x64.ActiveCfg = Debug|Any CPU
{37503055-231E-245B-0CB2-9481F81E00C0}.Debug|x64.Build.0 = Debug|Any CPU
+ {37503055-231E-245B-0CB2-9481F81E00C0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {37503055-231E-245B-0CB2-9481F81E00C0}.Release|Any CPU.Build.0 = Release|Any CPU
{37503055-231E-245B-0CB2-9481F81E00C0}.Release|x64.ActiveCfg = Release|x64
{37503055-231E-245B-0CB2-9481F81E00C0}.Release|x64.Build.0 = Release|x64
+ {31B8896B-1D85-E476-469E-D21E32CA1905}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {31B8896B-1D85-E476-469E-D21E32CA1905}.Debug|Any CPU.Build.0 = Debug|Any CPU
{31B8896B-1D85-E476-469E-D21E32CA1905}.Debug|x64.ActiveCfg = Debug|Any CPU
{31B8896B-1D85-E476-469E-D21E32CA1905}.Debug|x64.Build.0 = Debug|Any CPU
+ {31B8896B-1D85-E476-469E-D21E32CA1905}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {31B8896B-1D85-E476-469E-D21E32CA1905}.Release|Any CPU.Build.0 = Release|Any CPU
{31B8896B-1D85-E476-469E-D21E32CA1905}.Release|x64.ActiveCfg = Release|x64
{31B8896B-1D85-E476-469E-D21E32CA1905}.Release|x64.Build.0 = Release|x64
+ {E63AE9CD-D208-DDD3-BB9C-4DFAA709B938}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E63AE9CD-D208-DDD3-BB9C-4DFAA709B938}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E63AE9CD-D208-DDD3-BB9C-4DFAA709B938}.Debug|x64.ActiveCfg = Debug|Any CPU
{E63AE9CD-D208-DDD3-BB9C-4DFAA709B938}.Debug|x64.Build.0 = Debug|Any CPU
+ {E63AE9CD-D208-DDD3-BB9C-4DFAA709B938}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E63AE9CD-D208-DDD3-BB9C-4DFAA709B938}.Release|Any CPU.Build.0 = Release|Any CPU
{E63AE9CD-D208-DDD3-BB9C-4DFAA709B938}.Release|x64.ActiveCfg = Release|x64
{E63AE9CD-D208-DDD3-BB9C-4DFAA709B938}.Release|x64.Build.0 = Release|x64
+ {D67F1AC9-425F-9964-4B77-243BB7D5FFC5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D67F1AC9-425F-9964-4B77-243BB7D5FFC5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D67F1AC9-425F-9964-4B77-243BB7D5FFC5}.Debug|x64.ActiveCfg = Debug|Any CPU
{D67F1AC9-425F-9964-4B77-243BB7D5FFC5}.Debug|x64.Build.0 = Debug|Any CPU
+ {D67F1AC9-425F-9964-4B77-243BB7D5FFC5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D67F1AC9-425F-9964-4B77-243BB7D5FFC5}.Release|Any CPU.Build.0 = Release|Any CPU
{D67F1AC9-425F-9964-4B77-243BB7D5FFC5}.Release|x64.ActiveCfg = Release|x64
{D67F1AC9-425F-9964-4B77-243BB7D5FFC5}.Release|x64.Build.0 = Release|x64
+ {14FC59C8-005F-E96C-A9E4-21239526B5EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {14FC59C8-005F-E96C-A9E4-21239526B5EF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{14FC59C8-005F-E96C-A9E4-21239526B5EF}.Debug|x64.ActiveCfg = Debug|Any CPU
{14FC59C8-005F-E96C-A9E4-21239526B5EF}.Debug|x64.Build.0 = Debug|Any CPU
+ {14FC59C8-005F-E96C-A9E4-21239526B5EF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {14FC59C8-005F-E96C-A9E4-21239526B5EF}.Release|Any CPU.Build.0 = Release|Any CPU
{14FC59C8-005F-E96C-A9E4-21239526B5EF}.Release|x64.ActiveCfg = Release|Any CPU
{14FC59C8-005F-E96C-A9E4-21239526B5EF}.Release|x64.Build.0 = Release|Any CPU
+ {7806E446-64D4-D74C-4D68-487339D5B3B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7806E446-64D4-D74C-4D68-487339D5B3B1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7806E446-64D4-D74C-4D68-487339D5B3B1}.Debug|x64.ActiveCfg = Debug|Any CPU
{7806E446-64D4-D74C-4D68-487339D5B3B1}.Debug|x64.Build.0 = Debug|Any CPU
+ {7806E446-64D4-D74C-4D68-487339D5B3B1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7806E446-64D4-D74C-4D68-487339D5B3B1}.Release|Any CPU.Build.0 = Release|Any CPU
{7806E446-64D4-D74C-4D68-487339D5B3B1}.Release|x64.ActiveCfg = Release|x64
{7806E446-64D4-D74C-4D68-487339D5B3B1}.Release|x64.Build.0 = Release|x64
+ {A3A78B5F-8F0A-1B04-3890-53BA24D2E686}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A3A78B5F-8F0A-1B04-3890-53BA24D2E686}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A3A78B5F-8F0A-1B04-3890-53BA24D2E686}.Debug|x64.ActiveCfg = Debug|Any CPU
{A3A78B5F-8F0A-1B04-3890-53BA24D2E686}.Debug|x64.Build.0 = Debug|Any CPU
+ {A3A78B5F-8F0A-1B04-3890-53BA24D2E686}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A3A78B5F-8F0A-1B04-3890-53BA24D2E686}.Release|Any CPU.Build.0 = Release|Any CPU
{A3A78B5F-8F0A-1B04-3890-53BA24D2E686}.Release|x64.ActiveCfg = Release|x64
{A3A78B5F-8F0A-1B04-3890-53BA24D2E686}.Release|x64.Build.0 = Release|x64
+ {B65B42CE-A2FD-6CA4-8BB8-80F877F9F3F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B65B42CE-A2FD-6CA4-8BB8-80F877F9F3F4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B65B42CE-A2FD-6CA4-8BB8-80F877F9F3F4}.Debug|x64.ActiveCfg = Debug|Any CPU
{B65B42CE-A2FD-6CA4-8BB8-80F877F9F3F4}.Debug|x64.Build.0 = Debug|Any CPU
+ {B65B42CE-A2FD-6CA4-8BB8-80F877F9F3F4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B65B42CE-A2FD-6CA4-8BB8-80F877F9F3F4}.Release|Any CPU.Build.0 = Release|Any CPU
{B65B42CE-A2FD-6CA4-8BB8-80F877F9F3F4}.Release|x64.ActiveCfg = Release|x64
{B65B42CE-A2FD-6CA4-8BB8-80F877F9F3F4}.Release|x64.Build.0 = Release|x64
+ {43211249-AFD6-8A3E-38CB-8415A47F8142}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {43211249-AFD6-8A3E-38CB-8415A47F8142}.Debug|Any CPU.Build.0 = Debug|Any CPU
{43211249-AFD6-8A3E-38CB-8415A47F8142}.Debug|x64.ActiveCfg = Debug|Any CPU
{43211249-AFD6-8A3E-38CB-8415A47F8142}.Debug|x64.Build.0 = Debug|Any CPU
+ {43211249-AFD6-8A3E-38CB-8415A47F8142}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {43211249-AFD6-8A3E-38CB-8415A47F8142}.Release|Any CPU.Build.0 = Release|Any CPU
{43211249-AFD6-8A3E-38CB-8415A47F8142}.Release|x64.ActiveCfg = Release|x64
{43211249-AFD6-8A3E-38CB-8415A47F8142}.Release|x64.Build.0 = Release|x64
+ {B16A95F2-1D4A-148E-2662-9F6492C07AEF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B16A95F2-1D4A-148E-2662-9F6492C07AEF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B16A95F2-1D4A-148E-2662-9F6492C07AEF}.Debug|x64.ActiveCfg = Debug|Any CPU
{B16A95F2-1D4A-148E-2662-9F6492C07AEF}.Debug|x64.Build.0 = Debug|Any CPU
+ {B16A95F2-1D4A-148E-2662-9F6492C07AEF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B16A95F2-1D4A-148E-2662-9F6492C07AEF}.Release|Any CPU.Build.0 = Release|Any CPU
{B16A95F2-1D4A-148E-2662-9F6492C07AEF}.Release|x64.ActiveCfg = Release|x64
{B16A95F2-1D4A-148E-2662-9F6492C07AEF}.Release|x64.Build.0 = Release|x64
+ {38CB8C7C-2402-8E0D-CDEE-7310B9040A0F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {38CB8C7C-2402-8E0D-CDEE-7310B9040A0F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{38CB8C7C-2402-8E0D-CDEE-7310B9040A0F}.Debug|x64.ActiveCfg = Debug|Any CPU
{38CB8C7C-2402-8E0D-CDEE-7310B9040A0F}.Debug|x64.Build.0 = Debug|Any CPU
+ {38CB8C7C-2402-8E0D-CDEE-7310B9040A0F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {38CB8C7C-2402-8E0D-CDEE-7310B9040A0F}.Release|Any CPU.Build.0 = Release|Any CPU
{38CB8C7C-2402-8E0D-CDEE-7310B9040A0F}.Release|x64.ActiveCfg = Release|x64
{38CB8C7C-2402-8E0D-CDEE-7310B9040A0F}.Release|x64.Build.0 = Release|x64
+ {6355DB8A-4F23-CF90-38B7-3FB72424ABF5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6355DB8A-4F23-CF90-38B7-3FB72424ABF5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6355DB8A-4F23-CF90-38B7-3FB72424ABF5}.Debug|x64.ActiveCfg = Debug|Any CPU
{6355DB8A-4F23-CF90-38B7-3FB72424ABF5}.Debug|x64.Build.0 = Debug|Any CPU
+ {6355DB8A-4F23-CF90-38B7-3FB72424ABF5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6355DB8A-4F23-CF90-38B7-3FB72424ABF5}.Release|Any CPU.Build.0 = Release|Any CPU
{6355DB8A-4F23-CF90-38B7-3FB72424ABF5}.Release|x64.ActiveCfg = Release|x64
{6355DB8A-4F23-CF90-38B7-3FB72424ABF5}.Release|x64.Build.0 = Release|x64
+ {7B4BC9D2-E7D6-3697-F0E7-B98B5CF29297}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7B4BC9D2-E7D6-3697-F0E7-B98B5CF29297}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7B4BC9D2-E7D6-3697-F0E7-B98B5CF29297}.Debug|x64.ActiveCfg = Debug|Any CPU
{7B4BC9D2-E7D6-3697-F0E7-B98B5CF29297}.Debug|x64.Build.0 = Debug|Any CPU
+ {7B4BC9D2-E7D6-3697-F0E7-B98B5CF29297}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7B4BC9D2-E7D6-3697-F0E7-B98B5CF29297}.Release|Any CPU.Build.0 = Release|Any CPU
{7B4BC9D2-E7D6-3697-F0E7-B98B5CF29297}.Release|x64.ActiveCfg = Release|x64
{7B4BC9D2-E7D6-3697-F0E7-B98B5CF29297}.Release|x64.Build.0 = Release|x64
+ {6DD2B170-63B2-478A-8308-D70688DCDB1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6DD2B170-63B2-478A-8308-D70688DCDB1C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6DD2B170-63B2-478A-8308-D70688DCDB1C}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {6DD2B170-63B2-478A-8308-D70688DCDB1C}.Debug|x64.Build.0 = Debug|Any CPU
+ {6DD2B170-63B2-478A-8308-D70688DCDB1C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6DD2B170-63B2-478A-8308-D70688DCDB1C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6DD2B170-63B2-478A-8308-D70688DCDB1C}.Release|x64.ActiveCfg = Release|Any CPU
+ {6DD2B170-63B2-478A-8308-D70688DCDB1C}.Release|x64.Build.0 = Release|Any CPU
+ {22B1984A-5ADF-41A5-8B5F-074C1785D7EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {22B1984A-5ADF-41A5-8B5F-074C1785D7EC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {22B1984A-5ADF-41A5-8B5F-074C1785D7EC}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {22B1984A-5ADF-41A5-8B5F-074C1785D7EC}.Debug|x64.Build.0 = Debug|Any CPU
+ {22B1984A-5ADF-41A5-8B5F-074C1785D7EC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {22B1984A-5ADF-41A5-8B5F-074C1785D7EC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {22B1984A-5ADF-41A5-8B5F-074C1785D7EC}.Release|x64.ActiveCfg = Release|Any CPU
+ {22B1984A-5ADF-41A5-8B5F-074C1785D7EC}.Release|x64.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/Examples/UtilityNetwork/ProSnippets.cs b/Examples/UtilityNetwork/ProSnippets.cs
index 4eaef2e..8abf2c2 100644
--- a/Examples/UtilityNetwork/ProSnippets.cs
+++ b/Examples/UtilityNetwork/ProSnippets.cs
@@ -32,7 +32,8 @@ limitations under the License.
using ArcGIS.Desktop.Editing;
using ArcGIS.Core.Geometry;
-namespace UtilityNetworkProSnippets {
+namespace UtilityNetworkProSnippets
+{
class ProSnippetsUtilityNetwork
{
@@ -153,7 +154,58 @@ public static Row FetchRowFromElement(UtilityNetwork utilityNetwork, Element ele
}
}
#endregion
-
+
+ #region Get percentage along a polyline
+ public double GetPolylineStartingPercentage(Element startingPointElement, Geometry clickedPoint, FeatureLayer featureLayer)
+ {
+ // Find feature
+ QueryFilter queryFilter = new QueryFilter()
+ {
+ ObjectIDs = new List() { startingPointElement.ObjectID }
+ };
+
+
+ using (RowCursor rowCursor = featureLayer.GetFeatureClass().Search(queryFilter, false))
+ {
+ if (!rowCursor.MoveNext())
+ {
+ return 0;
+ }
+
+ using (Row row = rowCursor.Current)
+ {
+ try
+ {
+ Feature feature = row as Feature;
+
+ Polyline polyline = feature.GetShape() as Polyline;
+ ICollection segments = new List();
+ polyline.GetAllSegments(ref segments);
+
+ IList segments2 = segments as IList;
+
+ MapPoint startPoint = segments2[0].StartPoint;
+ MapPoint endPoint = segments2[segments2.Count - 1].EndPoint;
+ MapPoint clickedMapPoint = clickedPoint as MapPoint;
+
+
+ LineSegment line = LineBuilderEx.CreateLineSegment(startPoint, endPoint);
+ MapPoint outPoint = GeometryEngine.Instance.QueryPointAndDistance(line, SegmentExtensionType.NoExtension, clickedMapPoint, AsRatioOrLength.AsRatio,
+ out double distanceAlongCurve, out double distanceFromCurve, out LeftOrRightSide side);
+
+
+ return distanceAlongCurve;
+ }
+ catch (Exception e)
+ {
+ // Handle exceptions
+ }
+ }
+ }
+ return 0;
+ }
+ #endregion
+
#region ProSnippet Group: Editing Associations
#endregion
@@ -262,9 +314,9 @@ public static void GetTraverseAssociationsResultFromUpwardTraversalWithDepthLimi
List additionalFieldsToFetch = new List { "ObjectId", "AssetName", "AssetGroup", "AssetType" };
// Set downward traversal with maximum depth level of 3
- TraverseAssociationsDescription traverseAssociationsDescription = new TraverseAssociationsDescription(TraversalDirection.Ascending, 3)
- {
- AdditionalFields = additionalFieldsToFetch
+ TraverseAssociationsDescription traverseAssociationsDescription = new TraverseAssociationsDescription(TraversalDirection.Ascending, 3)
+ {
+ AdditionalFields = additionalFieldsToFetch
};
// Get traverse associations result from the staring element up to depth level 3
@@ -275,7 +327,7 @@ public static void GetTraverseAssociationsResultFromUpwardTraversalWithDepthLimi
// KeyValue mapping between involved elements and their field name-values
//At 2.x - IReadOnlyDictionary> associationElementValuePairs = traverseAssociationsResult.AdditionalFieldValues;
- IReadOnlyDictionary> associationElementValuePairs =
+ IReadOnlyDictionary> associationElementValuePairs =
traverseAssociationsResult.AdditionalFieldValues;
foreach (KeyValuePair> keyValuePair in associationElementValuePairs)
@@ -306,7 +358,7 @@ void FindATierFromDomainNetworkNameAndTierName(UtilityNetwork utilityNetwork, st
DomainNetwork domainNetwork = utilityNetworkDefinition.GetDomainNetwork(domainNetworkName);
Tier tier = domainNetwork.GetTier(tierName);
}
-
+
#endregion
}
@@ -324,7 +376,7 @@ void UpdateAllDirtySubnetworks(UtilityNetwork utilityNetwork, Tier tier, MapView
mapView.Redraw(true);
}
-
+
#endregion
}
@@ -350,7 +402,7 @@ void RadialNetworkLifecycle(SubnetworkManager subnetworkManager, Tier mediumVolt
// ...
// At some point, a subnetwork will need to be deleted.
-
+
// First step is to disable the controller
subnetworkManager.DisableControllerInEditOperation(elementR1);
@@ -424,6 +476,46 @@ void MultifeedRadialLifeCycle(SubnetworkManager subnetworkManager, Tier mediumVo
#endregion
}
+ // cref:ArcGIS.Core.Data.UtilityNetwork.Subnetwork.Export
+ #region Export Subnetwork
+
+ public void ExportSubnetwork(UtilityNetwork utilityNetwork, string subnetworkName, Uri exportResultJsonPath)
+ {
+ using (UtilityNetworkDefinition utilityNetworkDefinition = utilityNetwork.GetDefinition())
+ using (SubnetworkManager subnetworkManager = utilityNetwork.GetSubnetworkManager())
+ {
+ Subnetwork subnetwork = subnetworkManager.GetSubnetwork(subnetworkName);
+
+ IReadOnlyList networkAttributes = utilityNetworkDefinition.GetNetworkAttributes();
+ IReadOnlyList networkSources = utilityNetworkDefinition.GetNetworkSources();
+
+ // Export options
+ SubnetworkExportOptions subnetworkExportOptions = new SubnetworkExportOptions()
+ {
+ SetAcknowledged = false,
+ IncludeDomainDescriptions = true,
+ IncludeGeometry = true,
+ ServiceSynchronizationType = ServiceSynchronizationType.Asynchronous,
+
+ SubnetworkExportResultTypes = new List()
+ {
+ SubnetworkExportResultType.Connectivity,
+ SubnetworkExportResultType.Features
+ },
+
+ ResultNetworkAttributes = new List(networkAttributes),
+
+ ResultFieldsByNetworkSourceID = new Dictionary>()
+ { { networkSources[0].ID, new List() { "OBJECTID" } } }
+ };
+
+
+ subnetwork.Export(exportResultJsonPath, subnetworkExportOptions);
+ }
+ }
+ #endregion
+
+
#region ProSnippet Group: Tracing
#endregion
@@ -491,14 +583,14 @@ private void CreateNetworkAttributeComparison(UtilityNetworkDefinition utilityNe
// Combine these two comparisons together with "And"
And lifecycleFilter = new And(inDesignNetworkAttributeComparison, inServiceNetworkAttributeComparison);
-
+
// Final condition stops traversal if Lifecycle <> "In Design" and Lifecycle <> "In Service"
traceConfiguration.Traversability.Barriers = lifecycleFilter;
}
#endregion
}
-
+
private void ApplyFunction(UtilityNetworkDefinition utilityNetworkDefinition, TraceConfiguration traceConfiguration)
{
// cref: ArcGIS.Core.Data.UtilityNetwork.UtilityNetworkDefinition.GetNetworkAttribute(System.String)
@@ -661,10 +753,10 @@ private void TraceUtilityNetworkUsingNamedTraceConfiguration(UtilityNetwork util
{
// Get a tracer from the trace manager using the named trace configuration
Tracer upstreamTracer = traceManager.GetTracer(namedTraceConfiguration);
-
+
// Trace argument holding the trace input parameters
- TraceArgument upstreamTraceArgument = new TraceArgument(namedTraceConfiguration, new List {startElement});
-
+ TraceArgument upstreamTraceArgument = new TraceArgument(namedTraceConfiguration, new List { startElement });
+
// Trace results
IReadOnlyList upstreamTraceResults = upstreamTracer.Trace(upstreamTraceArgument);
}
@@ -672,7 +764,6 @@ private void TraceUtilityNetworkUsingNamedTraceConfiguration(UtilityNetwork util
#endregion
-
#region ProSnippet Group: Network Diagrams
#endregion
diff --git a/Examples/WorkflowManager/Prosnippets.cs b/Examples/WorkflowManager/Prosnippets.cs
index 59a66ce..706e0c3 100644
--- a/Examples/WorkflowManager/Prosnippets.cs
+++ b/Examples/WorkflowManager/Prosnippets.cs
@@ -1,6 +1,6 @@
/*
- Copyright 2022 Esri
+ Copyright 2023 Esri
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -27,6 +27,7 @@ limitations under the License.
using ArcGIS.Desktop.Mapping;
using ArcGIS.Desktop.Workflow;
using ArcGIS.Desktop.Workflow.Client;
+using ArcGIS.Desktop.Workflow.Client.Exceptions;
using ArcGIS.Desktop.Workflow.Client.Models;
namespace WorkflowManagerProSnippets
@@ -67,6 +68,7 @@ public static async Task GetServerUrl()
public static async Task GetJobId()
{
+ // cref: ArcGIS.Desktop.Workflow.Client.WorkflowClientModule.JobsManager
// cref: ArcGIS.Desktop.Workflow.Client.Models.IJobsManager
// cref: ArcGIS.Desktop.Workflow.Client.Models.IJobsManager.GetJobId()
#region How to get the job Id associated with the active map view
@@ -79,8 +81,9 @@ public static async Task GetJobId()
public static async Task GetJobId(string mapUri)
{
+ // cref: ArcGIS.Desktop.Workflow.Client.WorkflowClientModule.JobsManager
// cref: ArcGIS.Desktop.Workflow.Client.Models.IJobsManager
- // cref: ArcGIS.Desktop.Workflow.Client.Models.IJobsManager.GetJobId()
+ // cref: ArcGIS.Desktop.Workflow.Client.Models.IJobsManager.GetJobId(System.String)
#region How to get the job Id associated with a map
// Get the job Id associated with a map
@@ -89,5 +92,199 @@ public static async Task GetJobId(string mapUri)
var jobId = jobManager.GetJobId(mapUri);
#endregion
}
+
+ public static async Task GetJob(string jobId)
+ {
+ // cref: ArcGIS.Desktop.Workflow.Client.WorkflowClientModule.JobsManager
+ // cref: ArcGIS.Desktop.Workflow.Client.Models.IJobsManager
+ // cref: ArcGIS.Desktop.Workflow.Client.Models.IJobsManager.GetJob(System.String,System.Boolean,System.Boolean)
+ // cref: ArcGIS.Desktop.Workflow.Client.Models.Job
+ #region How to get a job
+
+ // GetJob returns an existing job
+ try
+ {
+ var jobManager = WorkflowClientModule.JobsManager;
+ var job = jobManager.GetJob(jobId);
+ // Do something with the job
+ }
+ catch (NotConnectedException)
+ {
+ // Not connected to Workflow Manager server, do some error handling
+ }
+ #endregion
+ }
+
+ public static async Task SearchJobs()
+ {
+ // cref: ArcGIS.Desktop.Workflow.Client.WorkflowClientModule.JobsManager
+ // cref: ArcGIS.Desktop.Workflow.Client.Models.IJobsManager
+ // cref: ArcGIS.Desktop.Workflow.Client.Swagger.Api.JobsApi.SearchJobs(System.String,System.String,System.String,ArcGIS.Desktop.Workflow.Client.Swagger.Model.EsriWorkflowModelsRestJobQuery)
+ // cref: ArcGIS.Desktop.Workflow.Client.Models.SearchQuery
+ // cref: ArcGIS.Desktop.Workflow.Client.Models.SearchResult
+ #region Search for jobs using a detailed query
+
+ var search = new SearchQuery()
+ {
+ // Search for all open high priority jobs assigned to users
+ Q = "closed=0 AND assignedType='User' AND priority='High'",
+ Fields = new List { "jobId", "jobName", "assignedTo", "dueDate" },
+ // Sort by job assignment in ascending order and due date in descending order
+ SortFields = new List
+ {
+ new SortField() { FieldName = "assignedTo", SortOrder = ArcGIS.Desktop.Workflow.Client.Models.SortOrder.Asc },
+ new SortField() { FieldName = "dueDate", SortOrder = ArcGIS.Desktop.Workflow.Client.Models.SortOrder.Desc }
+ }
+ };
+ var jobManager = WorkflowClientModule.JobsManager;
+ var searchResults = jobManager.SearchJobs(search);
+ var fields = searchResults.Fields;
+ var results = searchResults.Results;
+ #endregion
+ }
+
+ public static async Task SearchJobsArcadeExpression()
+ {
+ // cref: ArcGIS.Desktop.Workflow.Client.WorkflowClientModule.JobsManager
+ // cref: ArcGIS.Desktop.Workflow.Client.Models.IJobsManager
+ // cref: ArcGIS.Desktop.Workflow.Client.Swagger.Api.JobsApi.SearchJobs(System.String,System.String,System.String,ArcGIS.Desktop.Workflow.Client.Swagger.Model.EsriWorkflowModelsRestJobQuery)
+ // cref: ArcGIS.Desktop.Workflow.Client.Models.SearchQuery
+ // cref: ArcGIS.Desktop.Workflow.Client.Models.SearchResult
+ #region Search for jobs using a detailed query with an arcade expression
+
+ var search = new SearchQuery()
+ {
+ // Search for jobs assigned to the current user using the arcade expression '$currentUser'
+ Q = "\"assignedType='User' AND closed=0 AND assignedTo='\" + $currentUser + \"' \"",
+ Fields = new List { "jobId", "jobName", "assignedTo", "dueDate"},
+ // Sort by job name in ascending order
+ SortFields = new List { new SortField() { FieldName = "jobName", SortOrder = ArcGIS.Desktop.Workflow.Client.Models.SortOrder.Asc }}
+ };
+ var jobManager = WorkflowClientModule.JobsManager;
+ var searchResults = jobManager.SearchJobs(search);
+ var fields = searchResults.Fields;
+ var results = searchResults.Results;
+ #endregion
+ }
+
+ public static async Task SearchJobsSimpleSearch()
+ {
+ // cref: ArcGIS.Desktop.Workflow.Client.WorkflowClientModule.JobsManager
+ // cref: ArcGIS.Desktop.Workflow.Client.Models.IJobsManager
+ // cref: ArcGIS.Desktop.Workflow.Client.Swagger.Api.JobsApi.SearchJobs(System.String,System.String,System.String,ArcGIS.Desktop.Workflow.Client.Swagger.Model.EsriWorkflowModelsRestJobQuery)
+ // cref: ArcGIS.Desktop.Workflow.Client.Models.SearchQuery
+ // cref: ArcGIS.Desktop.Workflow.Client.Models.SearchResult
+ #region Search for jobs using a simple string
+
+ var search = new SearchQuery() { Search = "My Search String" };
+ var jobManager = WorkflowClientModule.JobsManager;
+ var searchResults = jobManager.SearchJobs(search);
+ var fields = searchResults.Fields;
+ var results = searchResults.Results;
+ #endregion
+ }
+
+ public static async Task CalculateJobStatistics()
+ {
+ // cref: ArcGIS.Desktop.Workflow.Client.WorkflowClientModule.JobsManager
+ // cref: ArcGIS.Desktop.Workflow.Client.Models.IJobsManager
+ // cref: ArcGIS.Desktop.Workflow.Client.Models.IJobsManager.CalculateJobStatistics()
+ // cref: ArcGIS.Desktop.Workflow.Client.Models.JobStatisticsQuery
+ // cref: ArcGIS.Desktop.Workflow.Client.Models.JobStatistics
+ #region Get statistics for jobs
+
+ var query = new JobStatisticsQuery()
+ {
+ // Search for open jobs assigned to users
+ Q = "\"assignedType='User' AND closed=0 \""
+ };
+ var jobManager = WorkflowClientModule.JobsManager;
+ var results = jobManager.CalculateJobStatistics(query);
+ var totalJobs = results.Total;
+ #endregion
+ }
+
+ public static async Task RunSteps(string jobId)
+ {
+ // cref: ArcGIS.Desktop.Workflow.Client.WorkflowClientModule.JobsManager
+ // cref: ArcGIS.Desktop.Workflow.Client.Models.IJobsManager
+ // cref: ArcGIS.Desktop.Workflow.Client.Models.IJobsManager.RunSteps(System.String,System.Collections.Generic.List{System.String})
+ #region How to run steps on a job
+
+ var jobManager = WorkflowClientModule.JobsManager;
+ jobManager.RunSteps(jobId);
+ #endregion
+ }
+
+ public static async Task RunSteps(string jobId, List stepIds)
+ {
+ // cref: ArcGIS.Desktop.Workflow.Client.WorkflowClientModule.JobsManager
+ // cref: ArcGIS.Desktop.Workflow.Client.Models.IJobsManager
+ // cref: ArcGIS.Desktop.Workflow.Client.Models.IJobsManager.RunSteps(System.String,System.Collections.Generic.List{System.String})
+ #region How to run specific steps on a job
+
+ var jobManager = WorkflowClientModule.JobsManager;
+ // Specify specific current steps in a job to run
+ stepIds = new List { "step12345", "step67890" };
+ jobManager.RunSteps(jobId, stepIds);
+ #endregion
+ }
+
+ public static async Task StopSteps()
+ {
+ // cref: ArcGIS.Desktop.Workflow.Client.WorkflowClientModule.JobsManager
+ // cref: ArcGIS.Desktop.Workflow.Client.Models.IJobsManager
+ // cref: ArcGIS.Desktop.Workflow.Client.Models.IJobsManager.StopSteps(System.String,System.Collections.Generic.List{System.String})
+ #region How to stop running steps on a job
+
+ var jobManager = WorkflowClientModule.JobsManager;
+ // Get the job Id associated with the active map view
+ var jobId = jobManager.GetJobId();
+ // Stop the current steps in the job with the given id.
+ jobManager.StopSteps(jobId);
+ #endregion
+ }
+
+ public static async Task StopSteps(List stepIds)
+ {
+ // cref: ArcGIS.Desktop.Workflow.Client.WorkflowClientModule.JobsManager
+ // cref: ArcGIS.Desktop.Workflow.Client.Models.IJobsManager
+ // cref: ArcGIS.Desktop.Workflow.Client.Models.IJobsManager.StopSteps(System.String,System.Collections.Generic.List{System.String})
+ #region How to stop specific running steps on a job
+
+ var jobManager = WorkflowClientModule.JobsManager;
+ // Get the job Id associated with the active map view
+ var jobId = jobManager.GetJobId();
+ // Specify specific running steps in a job to stop
+ stepIds = new List { "step12345", "step67890" };
+ jobManager.StopSteps(jobId, stepIds);
+ #endregion
+ }
+
+ public static async Task FinishSteps(string jobId)
+ {
+ // cref: ArcGIS.Desktop.Workflow.Client.WorkflowClientModule.JobsManager
+ // cref: ArcGIS.Desktop.Workflow.Client.Models.IJobsManager
+ // cref: ArcGIS.Desktop.Workflow.Client.Models.IJobsManager.FinishSteps(System.String,System.Collections.Generic.List{System.String})
+ #region How to finish steps on a job
+
+ var jobManager = WorkflowClientModule.JobsManager;
+ // Finish the current steps in the job with the given id.
+ jobManager.FinishSteps(jobId);
+ #endregion
+ }
+
+ public static async Task FinishSteps(string jobId, List stepIds)
+ {
+ // cref: ArcGIS.Desktop.Workflow.Client.WorkflowClientModule.JobsManager
+ // cref: ArcGIS.Desktop.Workflow.Client.Models.IJobsManager
+ // cref: ArcGIS.Desktop.Workflow.Client.Models.IJobsManager.FinishSteps(System.String,System.Collections.Generic.List{System.String})
+ #region How to finish specific steps on a job
+
+ var jobManager = WorkflowClientModule.JobsManager;
+ stepIds = new List { "step12345", "step67890" };
+ jobManager.FinishSteps(jobId, stepIds);
+ #endregion
+ }
}
}
diff --git a/README.md b/README.md
index a671ace..c6a1add 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
-## ArcGIS Pro 3.1 SDK for .NET
+## ArcGIS Pro 3.2 SDK for .NET
```
-ArcGIS Pro Version: 3.1.0.41833
+ArcGIS Pro Version: 3.2.0.49743
```
Extend ArcGIS Pro with the ArcGIS Pro SDK for Microsoft .NET. The ArcGIS Pro SDK provides four main extensibility patterns: add-ins, managed configurations, plugin datasources and CoreHost applications. You can leverage modern .NET features and patterns such as Task Asynchronous Programming (TAP), LINQ, WPF Binding, and MVVM to build integrated 2D and 3D add-ins with the ArcGIS Pro APIs.
@@ -39,6 +39,7 @@ Extend ArcGIS Pro with the ArcGIS Pro SDK for Microsoft .NET. The ArcGIS Pro SD
* [ProGuide: Licensing](../../wiki/ProGuide-License-Your-Add-in)
* [ProGuide: Digital signatures](../../wiki/ProGuide-Digitally-signed-add-ins-and-configurations)
* [ProGuide: Command Search](../../wiki/ProGuide-Command-Search)
+* [ProGuide: Keyboard shortcuts](../../wiki/ProGuide-Keyboard-shortcuts)
**Add-ins**
@@ -80,6 +81,13 @@ Extend ArcGIS Pro with the ArcGIS Pro SDK for Microsoft .NET. The ArcGIS Pro SD
-------------------------
+### Arcade
+
+* [ProSnippets: Arcade](../../wiki/ProSnippets-Arcade)
+* [ProConcepts: Arcade](../../wiki/ProConcepts-Arcade)
+
+-------------------------
+
### Content
* [ProSnippets: Content](../../wiki/ProSnippets-content)
@@ -126,6 +134,10 @@ Extend ArcGIS Pro with the ArcGIS Pro SDK for Microsoft .NET. The ArcGIS Pro SD
* [ProConcepts: Geodatabase](../../wiki/ProConcepts-Geodatabase)
* [ProConcepts: DDL](../../wiki/ProConcepts-DDL)
+ **3D Analyst Data**
+* [ProSnippets: 3D Analyst Data](../../wiki/ProSnippets-3D-Analyst-Data)
+* [ProConcepts: 3D Analyst Data](../../wiki/ProConcepts-3D-Analyst-Data)
+
**Plugin Datasources**
* [ProConcepts: Plugin Datasources](../../wiki/ProConcepts-Plugin-Datasources)
@@ -192,6 +204,10 @@ Extend ArcGIS Pro with the ArcGIS Pro SDK for Microsoft .NET. The ArcGIS Pro SD
* [ProGuide: Custom Dictionary Style](../../wiki/ProGuide-Custom-Dictionary-Style)
* [ProGuide: Geocoding](../../wiki/ProGuide-Geocoding)
+ **3D Analyst**
+* [ProSnippets: 3D Analyst Layers](../../wiki/ProSnippets-3D-Analyst-Layers)
+* [ProConcepts: 3D Analyst Layers](../../wiki/ProConcepts-3D-Analyst-Layers)
+
**CIM**
* [CIM Resources](../../wiki/CIM-Resources)
@@ -306,7 +322,7 @@ Extend ArcGIS Pro with the ArcGIS Pro SDK for Microsoft .NET. The ArcGIS Pro SD
#### ArcGIS Pro
-* ArcGIS Pro 3.1
+* ArcGIS Pro 3.2
#### Supported platforms
@@ -328,7 +344,7 @@ We recommend installing a minimum version of 17.2 of Visual Studio. This version
#### Third party assemblies
_**Newtonsoft Json**_
-* At 3.1, ArcGIS Pro is using version 13.0.1.25517 of the Newtonsoft Json NuGet. If you require Newtonsoft NuGet in your add-ins it is recommended to use the same version.
+* At 3.2, ArcGIS Pro is using version 13.0.1.25517 of the Newtonsoft Json NuGet. If you require Newtonsoft NuGet in your add-ins it is recommended to use the same version.
_**WebView2**_
* Add-in developers can use the new WebViewBrowser control based on Microsoft Edge WebView2. Consult the WebView2 manifest in the Pro bin\WebView folder for the current WebView2 fixed version runtime in use by ArcGIS Pro.
@@ -381,6 +397,7 @@ There are extension assemblies in {ArcGIS Pro Installation folder}\bin\Extension
* ArcGIS.Desktop.Analyst3D.dll
* ArcGIS.Desktop.Aviation.dll
+* ArcGIS.Desktop.Bathymetry.dll
* ArcGIS.Desktop.BusinessAnalyst.dll
* ArcGIS.Desktop.CAD.dll
* ArcGIS.Desktop.Charts.dll
@@ -402,6 +419,7 @@ There are extension assemblies in {ArcGIS Pro Installation folder}\bin\Extension
* ArcGIS.Desktop.Maritime.dll
* ArcGIS.Desktop.Metadata.dll
* ArcGIS.Desktop.MotionImagery.dll
+* ArcGIS.Desktop.NeighborhoodExplorer.dll
* ArcGIS.Desktop.NetworkAnalysis.Facility.dll
* ArcGIS.Desktop.NetworkAnalysis.NetworkDiagrams.dll
* ArcGIS.Desktop.NetworkAnalysis.Transportation.dll
@@ -419,39 +437,46 @@ To use the ArcGIS Pro Extensions NuGet, set the NuGet Package Management format
[ProGuide: ArcGIS Pro Extensions NuGet](https://github.com/Esri/arcgis-pro-sdk/wiki/ProGuide-ArcGIS-Pro-Extensions-NuGet)
-## What's New for Developers at 3.1
+## What's New for Developers at 3.2
+
+**3D Analyst:**
+* New TinLayer, LasDatasetLayer, and TerrainLayer classes.
+* Support for Line of Sight analysis via the public API on TinLayer.
+* New TIN, LAS (point cloud), and Terrain datasets added to ArcGIS.Core. Access individual TIN triangle, edge, and nodes and points from LAS point clouds.
-#### 1. API enhancements
-At 3.1 you can take advantage of API enhancements for:
+**Arcade:**
+* Interactive arcade expression evaluation via the ArcadeScriptEngine and ArcadeEvaluator objects.
+
+**Knowledge Graph:**
+* Access to KnowledgeGraph data sources, and support for openCypher graph queries and full text search.
**Geodatabase:**
-* DDL enhancements for Relates, Domains, and Subtypes.
+* Retrieve stored attribute rules and associated properties from TableDefinition.
+* Support for the new GDB date and time field types has been added.
**Editing:**
* New Extensibility API for Customizing Editor Attributes window.
-**Framework:**
-* New Start Page Controls for use within Configurations.
-
**Map Authoring:**
-* Improvements to Layout tool and Tray button patterns.
-* Time support on layers and new Time Picker control.
-* Catalog layer creation for storing references to multiple different data types.
+* A new date-time picker control and SymbolFactory enhancements for new 3D symbol creation options.
**Layout:**
-* Map frame activation API in Layout
+* Apply styles (i.e. style “items”) directly to layout and graphic layer elements to style their appearance.
A complete list of the API enhancements is provided in the [API Changes section of the API Reference](https://pro.arcgis.com/en/pro-app/latest/sdk/api-reference/topic15120.html).
#### 2. SDK Resources
There are many ProConcepts, ProGuide, ProSnippets, and samples to help you get up and running with the new SDK features. Updates to the SDK Resources include, but are not limited to:
-* [ProConcepts: Framework](https://github.com/Esri/arcgis-pro-sdk/wiki/ProConcepts-Framework)
-* [ProConcepts: Editing](https://github.com/Esri/arcgis-pro-sdk/wiki/ProConcepts-Editing)
-* [ProConcepts: Map Authoring](https://github.com/Esri/arcgis-pro-sdk/wiki/ProConcepts-Map-Authoring)
+* [ProConcepts: 3D Analyst Data](https://github.com/Esri/arcgis-pro-sdk/wiki/ProConcepts-3D-Analyst-Data)
+* [ProConcepts: 3D Analyst Layers](https://github.com/Esri/arcgis-pro-sdk/wiki/ProConcepts-3D-Analyst-Layers)
+* [ProConcepts: Arcade](https://github.com/Esri/arcgis-pro-sdk/wiki/ProConcepts-Arcade)
+* [ProConcepts: Knowledge Graph](https://github.com/Esri/arcgis-pro-sdk/wiki/ProConcepts-Knowledge-Graph)
+* [ProConcepts: Geodatabase](https://github.com/Esri/arcgis-pro-sdk/wiki/ProConcepts-Geodatabase)
* [ProConcepts: Layouts](https://github.com/Esri/arcgis-pro-sdk/wiki/ProConcepts-Layouts)
-* [ProGuide: Tray buttons](https://github.com/Esri/arcgis-pro-sdk/wiki/ProGuide-Tray-buttons)
-* [ProConcepts: Geometry](https://github.com/Esri/arcgis-pro-sdk/wiki/ProConcepts-Geometry)
-* [ProSnippets: Charts](https://github.com/Esri/arcgis-pro-sdk/wiki/ProSnippets-Charts)
+* [ProSnippets: 3D Analyst Data](https://github.com/Esri/arcgis-pro-sdk/wiki/ProSnippets-3D-Analyst-Data)
+* [ProSnippets: 3D Analyst Layers](https://github.com/Esri/arcgis-pro-sdk/wiki/ProSnippets-3D-Analyst-Layers)
+* [ProSnippets: Arcade](https://github.com/Esri/arcgis-pro-sdk/wiki/ProSnippets-Arcade)
+* [ProSnippets: Knowledge Graph](https://github.com/Esri/arcgis-pro-sdk/wiki/ProSnippets-KnowledgeGraph)
* The [Pro Community Samples](https://github.com/Esri/arcgis-pro-sdk-community-samples) and [Snippets](https://github.com/Esri/arcgis-pro-sdk/wiki/ProSnippets)
## Installing ArcGIS Pro SDK for .NET
@@ -461,9 +486,9 @@ ArcGIS Pro SDK for .NET can be downloaded and installed from within Visual Studi
* ArcGIS Pro SDK for .NET (Utilities)
**Notes:**
-Moving to ArcGIS Pro 3.1 SDK (or 3.0 SDK) from 2.x is not an upgrade. To install ,
-1. Consult [Migrating from 2.x](https://github.com/arcgis/arcgis-pro-sdk/wiki/ProGuide-Installation-and-Upgrade#migrating-from-2x) if you want to install ArcGIS Pro 3.1 SDK and you are on 2.x, **_not_** 3.0.
-2. If you are migrating a 2.x add-in to 3.1 you can install the migration tool to help automate the conversion process. Refer to the migration guide [ProConcepts: 3.0 Migration Guide](https://github.com/Esri/arcgis-pro-sdk/wiki/ProConcepts-3.0-Migration-Guide) for more details. ArcGIS Pro SDK for .NET (Migration).
+Moving to ArcGIS Pro 3.2 SDK (or 3.0 SDK) from 2.x is not an upgrade. To install ,
+1. Consult [Migrating from 2.x](https://github.com/arcgis/arcgis-pro-sdk/wiki/ProGuide-Installation-and-Upgrade#migrating-from-2x) if you want to install ArcGIS Pro 3.2 SDK and you are on 2.x, **_not_** 3.0.
+2. If you are migrating a 2.x add-in to 3.2 you can install the migration tool to help automate the conversion process. Refer to the migration guide [ProConcepts: 3.0 Migration Guide](https://github.com/Esri/arcgis-pro-sdk/wiki/ProConcepts-3.0-Migration-Guide) for more details. ArcGIS Pro SDK for .NET (Migration).
Read the [ProGuide: Installation](http://github.com/Esri/arcgis-pro-sdk/wiki/ProGuide-Installation-and-Upgrade) for detailed installation instructions.
@@ -548,6 +573,7 @@ Package: proapp-sdk-migration.vsix
ArcGIS Pro SDK for .NET (Migration) provides support to migrate ArcGIS Pro SDK 2.x extensions to ArcGIS Pro SDK 3.X for .NET. **Note:** When you migrate your add-in, the dekstopVersion attribute in your config.daml will be set to the current version of ArcGIS Pro installed.
### Previous versions
+* [ArcGIS Pro 3.1 SDK for .NET](https://github.com/Esri/arcgis-pro-sdk/releases/tag/3.1.0.41833)
* [ArcGIS Pro 3.0 SDK for .NET](https://github.com/Esri/arcgis-pro-sdk/releases/tag/3.0.0.36056)
* [ArcGIS Pro 2.9 SDK for .NET](https://github.com/Esri/arcgis-pro-sdk/releases/tag/2.9.0.32739)
* [ArcGIS Pro 2.8 SDK for .NET](https://github.com/Esri/arcgis-pro-sdk/releases/tag/2.8.0.29751)
@@ -573,7 +599,7 @@ ArcGIS Pro SDK for .NET (Migration) provides support to migrate ArcGIS Pro SDK 2
* [arcgis-pro-sdk-community-samples](http://github.com/Esri/arcgis-pro-sdk-community-samples)
* [ArcGIS Pro DAML ID Reference](http://github.com/Esri/arcgis-pro-sdk/wiki/ArcGIS-Pro-DAML-ID-Reference)
* [FAQ](http://github.com/Esri/arcgis-pro-sdk/wiki/FAQ)
-* [ArcGIS Pro SDK icons](https://github.com/Esri/arcgis-pro-sdk/releases/tag/3.1.0.41833)
+* [ArcGIS Pro SDK icons](https://github.com/Esri/arcgis-pro-sdk/releases/tag/3.2.0.49743)
## Contributing
@@ -601,7 +627,7 @@ limitations under the License.
A copy of the license is available in the repository's [license.txt](./License.txt) file.
-
ArcGIS Pro 3.1 SDK for Microsoft .NET Framework
+
ArcGIS Pro 3.2 SDK for Microsoft .NET Framework
[Home](https://github.com/Esri/arcgis-pro-sdk/wiki) | API Reference | [Requirements](#requirements) | [Download](#installing-arcgis-pro-sdk-for-net) | Samples