private static IEnumerable <Object> getFeatureIdsFromIndexes(IFeatureLayer layer, IEnumerable <Int32> indexes) { foreach (Int32 index in indexes) { FeatureDataRow feature = layer.SelectedFeatures[index].Row as FeatureDataRow; Debug.Assert(feature != null); if (!feature.HasOid) { throw new InvalidOperationException("Feature must have Object identifier " + "in order to highlight."); } yield return(feature.GetOid()); } }
private static String fdrLabel(FeatureDataRow fdr) { return(String.Format("Feature {0} with GeometryType {1}: {2}", fdr.GetOid(), fdr.Geometry.GeometryTypeName, fdr.Geometry)); }
protected override IEnumerable <TRenderObject> DoRenderFeature(IFeatureDataRecord inFeature, LabelStyle style, RenderState renderState, ILayer inLayer) { FeatureDataRow feature = inFeature as FeatureDataRow; LabelLayer layer = inLayer as LabelLayer; if (style == null) { throw new ArgumentNullException("style", "LabelStyle is a required argument " + "to properly render the label"); } Label2D newLabel = null; LabelLayer.LabelTextFormatter formatter = null; LabelCollisionDetection2D collisionDetector; if (layer != null) { if (!layer.RenderCache.TryGetValue(feature.GetOid(), out newLabel)) { formatter = layer.TextFormatter; } collisionDetector = layer.CollisionDetector; collisionDetector.TextRenderer = TextRenderer; } else { if (!textFormatters.TryGetValue(style, out formatter)) { // setup formatter based on style.LabelFormatExpression formatter = delegate(FeatureDataRow row) { return(row.Evaluate(style.LabelExpression)); }; textFormatters.Add(style, formatter); } if (!collisionDetectors.TryGetValue(style, out collisionDetector)) { collisionDetector = new LabelCollisionDetection2D(); collisionDetector.TextRenderer = TextRenderer; collisionDetectors.Add(style, collisionDetector); } } if (newLabel == null) { String labelText = formatter.Invoke(feature); if (feature.Geometry is ILineString) { newLabel = new Label2D(labelText, new Point2D(), style); calculateLabelOnLineString(feature.Geometry as ILineString, ref newLabel); } else { ICoordinate p = feature.Geometry.Extents.Center; Double x = p[Ordinates.X], y = p[Ordinates.Y]; /* Moved to RenderLabel function * if (style.HorizontalAlignment != HorizontalAlignment.Right || style.VerticalAlignment != VerticalAlignment.Bottom) * { * Size2D size = TextRenderer.MeasureString(labelText, style.Font); * //Point2D pt = RenderTransform.TransformVector(Math.Ceiling(size.Width), Math.Ceiling(size.Height)); * size = new Size2D(size.Width / (Double)RenderTransform[0,0], size.Height / (Double)RenderTransform[1,1]); * switch (style.HorizontalAlignment) * { * case HorizontalAlignment.Center: * x -= (Int32)(size.Width / 2.0f); * break; * case HorizontalAlignment.Left: * x -= size.Width; * break; * default: * break; * } * * switch (style.VerticalAlignment) * { * case VerticalAlignment.Middle: * y += (Int32)(size.Height / 2.0f); * break; * case VerticalAlignment.Top: * y += size.Height; * break; * default: * break; * } * } */ newLabel = new Label2D(labelText, new Point2D(x, y), style); } if (layer != null) { layer.RenderCache.Add(feature.GetOid(), newLabel); } } // now find out if we even need to render this label... if (style.CollisionDetectionType != CollisionDetectionType.None) { if (style.CollisionDetectionType == CollisionDetectionType.Simple) { if (collisionDetector.SimpleCollisionTest(newLabel)) { // we are not going to render this label if (layer != null) { layer.RenderCache.Remove(newLabel); } yield break; } } else if (style.CollisionDetectionType == CollisionDetectionType.Advanced) { if (collisionDetector.AdvancedCollisionTest(newLabel)) { // we are not going to render this label if (layer != null) { layer.RenderCache.Remove(newLabel); } yield break; } } } foreach (TRenderObject ro in RenderLabel(newLabel)) { yield return(ro); } }