private async void CreateEllipseFeature(Geometry geom, EllipseAttributes ellipseAttributes) { string message = string.Empty; await QueuedTask.Run(async() => message = await AddFeatureToLayer(geom, ellipseAttributes)); RaisePropertyChanged(() => HasMapGraphics); if (!string.IsNullOrEmpty(message)) { ArcGIS.Desktop.Framework.Dialogs.MessageBox.Show(message, DistanceAndDirectionLibrary.Properties.Resources.ErrorFeatureCreateTitle); } }
private Geometry DrawEllipse() { if (Point1 == null || double.IsNaN(MajorAxisDistance) || double.IsNaN(MinorAxisDistance)) { return(null); } try { var nameConverter = new EnumToFriendlyNameConverter(); var param = new GeodesicEllipseParameter(); param.Center = new Coordinate2D(Point1); param.AxisDirection = GetRadiansFrom360Degrees(GetAzimuthAsDegrees()); param.LinearUnit = GetLinearUnit(LineDistanceType); param.OutGeometryType = GeometryType.Polygon; param.SemiAxis1Length = MajorAxisDistance; param.SemiAxis2Length = MinorAxisDistance; param.VertexCount = VertexCount; var geom = GeometryEngine.Instance.GeodesicEllipse(param, MapView.Active.Map.SpatialReference); // Hold onto the attributes in case user saves graphics to file later var displayValue = nameConverter.Convert(LineDistanceType, typeof(string), new object(), CultureInfo.CurrentCulture); EllipseAttributes ellipseAttributes = new EllipseAttributes() { mapPoint = Point1, minorAxis = MinorAxisDistance * 2, // TRICKY: Label/Attribute always shows the "full" value majorAxis = MajorAxisDistance * 2, angle = Azimuth, angleunit = AzimuthType.ToString(), centerx = Point1.X, centery = Point1.Y, distanceunit = displayValue.ToString() }; CreateEllipseFeature(geom, ellipseAttributes); return((Geometry)geom); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.Message); return(null); } }
private Geometry DrawEllipse() { if (Point1 == null || double.IsNaN(MajorAxisDistance) || double.IsNaN(MinorAxisDistance)) { return(null); } try { var param = new GeodesicEllipseParameter(); param.Center = new Coordinate2D(Point1); param.AxisDirection = GetRadiansFrom360Degrees(GetAzimuthAsDegrees()); param.LinearUnit = GetLinearUnit(LineDistanceType); param.OutGeometryType = GeometryType.Polygon; param.SemiAxis1Length = MajorAxisDistance; param.SemiAxis2Length = MinorAxisDistance; param.VertexCount = VertexCount; var geom = GeometryEngine.Instance.GeodesicEllipse(param, MapView.Active.Map.SpatialReference); // Hold onto the attributes in case user saves graphics to file later EllipseAttributes ellipseAttributes = new EllipseAttributes() { mapPoint = Point1, minorAxis = MinorAxisDistance, majorAxis = MajorAxisDistance, angle = Azimuth, angleunit = AzimuthType.ToString(), centerx = Point1.X, centery = Point1.Y, distanceunit = LineDistanceType.ToString() }; CreateEllipseFeature(geom, ellipseAttributes); return((Geometry)geom); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.Message); return(null); } }
private async Task <string> AddFeatureToLayer(Geometry geom, EllipseAttributes attributes) { string message = String.Empty; if (attributes == null) { message = "Attributes are Empty"; // For debug does not need to be resource return(message); } FeatureClass ellipseFeatureClass = await GetFeatureClass(addToMapIfNotPresent : true); if (ellipseFeatureClass == null) { message = DistanceAndDirectionLibrary.Properties.Resources.ErrorFeatureClassNotFound + this.GetLayerName(); return(message); } bool creationResult = false; FeatureClassDefinition ellipseDefinition = ellipseFeatureClass.GetDefinition(); EditOperation editOperation = new EditOperation(); editOperation.Name = "Ellipse Feature Insert"; editOperation.Callback(context => { try { RowBuffer rowBuffer = ellipseFeatureClass.CreateRowBuffer(); if (ellipseDefinition.FindField("Major") >= 0) { rowBuffer["Major"] = attributes.majorAxis; // Text } if (ellipseDefinition.FindField("Minor") >= 0) { rowBuffer["Minor"] = attributes.minorAxis; // Double } if (ellipseDefinition.FindField("DistUnit") >= 0) { rowBuffer["DistUnit"] = attributes.distanceunit; // Text } if (ellipseDefinition.FindField("Angle") >= 0) { rowBuffer["Angle"] = attributes.angle; // Double } if (ellipseDefinition.FindField("AngleUnit") >= 0) { rowBuffer["AngleUnit"] = attributes.angleunit; // Text } if (ellipseDefinition.FindField("CenterX") >= 0) { rowBuffer["CenterX"] = attributes.centerx; // Double } if (ellipseDefinition.FindField("CenterY") >= 0) { rowBuffer["CenterY"] = attributes.centery; // Double } rowBuffer["Shape"] = GeometryEngine.Instance.Project(geom, ellipseDefinition.GetSpatialReference()); Feature feature = ellipseFeatureClass.CreateRow(rowBuffer); feature.Store(); //To indicate that the attribute table has to be updated context.Invalidate(feature); } catch (GeodatabaseException geodatabaseException) { message = geodatabaseException.Message; } catch (Exception ex) { message = ex.Message; } }, ellipseFeatureClass); await QueuedTask.Run(async() => { creationResult = await editOperation.ExecuteAsync(); }); if (!creationResult) { message = editOperation.ErrorMessage; } return(message); }