zoukankan      html  css  js  c++  java
  • ArcGIS Pro二次开发画注记

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using ArcGIS.Core.CIM;
    using ArcGIS.Core.Data;
    using ArcGIS.Core.Geometry;
    using ArcGIS.Desktop.Catalog;
    using ArcGIS.Desktop.Core;
    using ArcGIS.Desktop.Editing;
    using ArcGIS.Desktop.Extensions;
    using ArcGIS.Desktop.Framework;
    using ArcGIS.Desktop.Framework.Contracts;
    using ArcGIS.Desktop.Framework.Dialogs;
    using ArcGIS.Desktop.Framework.Threading.Tasks;
    using ArcGIS.Desktop.Mapping;
    using System.Windows.Input;
    
    
    
    
    
    namespace ProAppModule1
    {
        internal class MapToolSelect : MapTool
        {
            public MapToolSelect()
    
            {
    
                IsSketchTool = true;
    
                UseSnapping = true;
    
                // set the sketch type to line
    
                SketchType = SketchGeometryType.Line;
    
            }
    
    
    
            /// <summary>
    
            /// Restrict the sketch to a two point line
    
            /// </summary>
    
            /// <returns></returns>
    
            protected override async Task<bool> OnSketchModifiedAsync()
    
            {
    
                // restrict the sketch to a 2 point line
    
                bool finish = await QueuedTask.Run(async () =>
    
                {
    
                    // get the current sketch
    
                    var geometry = await base.GetCurrentSketchAsync();
    
                    // cast to a polyline - the geometry will always be a polyline because the SketchType (set in the constructor) is set to Line.
    
                    var geom = geometry as ArcGIS.Core.Geometry.Polyline;
    
                    // check the point count
    
                    return geom?.PointCount >= 2;
    
                });
    
    
    
                // call FinishSketchAsync if we have 2 points
    
                if (finish)
    
                    finish = await base.FinishSketchAsync();
    
    
    
                return finish;
    
            }
    
    
    
            /// <summary>
    
            /// Called when the sketch finishes. This is where we will create the edit operation and then execute it.
    
            /// </summary>
    
            /// <param name="geometry">The geometry created by the sketch.</param>
    
            /// <returns>A Task returning a Boolean indicating if the sketch complete event was successfully handled.</returns>
    
            protected override async Task<bool> OnSketchCompleteAsync(Geometry geometry)
    
            {
    
                if (CurrentTemplate == null || geometry == null)
    
                    return false;
    
    
    
                bool result = await QueuedTask.Run(() =>
    
                {
    
                    // get the anno layer
    
                    AnnotationLayer annoLayer = CurrentTemplate.Layer as AnnotationLayer;
    
                    if (annoLayer == null)
    
                        return false;
    
    
    
                    // get the anno feature class
    
                    var fc = annoLayer.GetFeatureClass() as ArcGIS.Core.Data.Mapping.AnnotationFeatureClass;
    
                    if (fc == null)
    
                        return false;
    
    
    
                    // get the featureclass CIM definition which contains the labels, symbols
    
                    var cimDefinition = fc.GetDefinition() as ArcGIS.Core.Data.Mapping.AnnotationFeatureClassDefinition;
    
                    var labels = cimDefinition.GetLabelClassCollection();
    
                    var symbols = cimDefinition.GetSymbolCollection();
    
    
    
                    // make sure there are labels, symbols
    
                    if ((labels.Count == 0) || (symbols.Count == 0))
    
                        return false;
    
    
    
    
    
                    // find the label class required
    
                    //   typically you would use a subtype name or some other characteristic
    
    
    
                    // use the first label class
    
                    var label = labels[0];
    
                    if (labels.Count > 1)
    
                    {
    
                        // find a label class based on template name 
    
                        foreach (var LabelClass in labels)
    
                        {
    
                            if (LabelClass.Name == CurrentTemplate.Name)
    
                            {
    
                                label = LabelClass;
    
                                break;
    
                            }
    
                        }
    
                    }
    
    
    
                    // each label has a textSymbol
    
                    // the symbolName *should* be the symbolID to be used
    
                    var symbolName = label.TextSymbol.SymbolName;
    
                    int symbolID = -1;
    
                    if (!int.TryParse(symbolName, out symbolID))
    
                    {
    
                        // int.TryParse fails - attempt to find the symbolName in the symbol collection
    
                        foreach (var symbol in symbols)
    
                        {
    
                            if (symbol.Name == symbolName)
    
                            {
    
                                symbolID = symbol.ID;
    
                                break;
    
                            }
    
                        }
    
                    }
    
                    // no symbol?
    
                    if (symbolID == -1)
    
                        return false;
    
    
    
    
    
                    // use the template's inspector object
    
                    var inspector = CurrentTemplate.Inspector;
    
                    // get the annotation properties
    
                    var annoProperties = inspector.GetAnnotationProperties();
    
    
    
                    // AnnotationClassID, SymbolID and Shape are the bare minimum for an annotation feature
    
    
    
                    // use the inspector[fieldName] to set the annotationClassid - this is allowed since annotationClassID is a guaranteed field in the annotation schema
    
                    inspector["AnnotationClassID"] = label.ID;
    
                    // set the symbolID too
    
                    inspector["SymbolID"] = symbolID;
    
    
    
                    // use the annotation properties to set the other attributes
    
                    annoProperties.TextString = "My annotation feature";
    
                    annoProperties.Color = ColorFactory.Instance.GreenRGB;
    
                    annoProperties.VerticalAlignment = ArcGIS.Core.CIM.VerticalAlignment.Top;
    
                    annoProperties.Underline = true;
    
    
    
                    // set the geometry to be the sketched line
    
                    // when creating annotation features the shape to be passed in the create operation is the CIMTextGraphic shape
    
                    annoProperties.Shape = geometry;
    
    
    
                    // set the annotation properties back on the inspector
    
                    inspector.SetAnnotationProperties(annoProperties);
    
    
    
                    // Create an edit operation
    
                    var createOperation = new EditOperation();
    
                    createOperation.Name = string.Format("Create {0}", CurrentTemplate.Layer.Name);
    
                    createOperation.SelectNewFeatures = true;
    
    
    
                    // create and execute using the inspector
    
                    createOperation.Create(CurrentTemplate.Layer, inspector);
    
                    return createOperation.Execute();
    
                });
    
    
    
                return result;
    
            }
    
        }
    }
  • 相关阅读:
    UDP协议
    发送大数据文件
    socket
    异常处理
    网络编程
    JupyterStudy——安装与环境部署
    PythonStudy——封装
    PythonStudy——继承、接口、鸭子类型
    PythonStudy——面向对象
    PythonStudy——xml 模块
  • 原文地址:https://www.cnblogs.com/gisoracle/p/12466185.html
Copyright © 2011-2022 走看看