ThinkGeo.com    |     Documentation    |     Premium Support

Adjusting properties for drawn shapes

My application borrows code from one of the MapSuite 4.5 samples with a toolbar that lets the user draw different shapes (ellipse, square, circle, etc) by setting different trackmodes like:



Map1.TrackOverlay.TrackMode =



TrackMode.Polygon

Map1.TrackOverlay.TrackMode =


TrackMode.Rectangle

etc...


In my MapSuite 2.0 edition of the application I could catch an event when the user completed drawing a shape so I could pop a dialog box to allow the user to select a color, border, text inside the shape, etc.  How can I catch that in MapSuite 4.5 to allow for more than the default blue color shapes?




Michael, 



Yeah things have changed quite a bit from 2.0 in regards to Track Shapes, you have a lot more flexibility to do several new things now. 



The event you will want to use is the TrackEndend event off of the TrackOverlay.  There are a bunch of samples out on the wiki that show how to use the Interactive Overlays, but the link below will show how to wire up the TrackEnded and some of the other common events on the TrackOverlay. 



 wiki.thinkgeo.com/wiki/Map_Suite_Desktop_Edition_InteractiveOverlays_Samples#Dynamic_Info_On_TrackShapes 



Check it out and let us know if you have any questions. 



Thanks! 



Excellent, that’s the ideal sample code I needed. 
  
 Thanks!

One last note then - that project had one typo: 
             System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TestForm)); 
  
 “TestForm” was “Form1” - that was the only fix other than setting references. 
  
 One last question then as I conver the code to VB.Net - can’t get the events to show up in a way similar to C#: 
  
             //Sets the events of TrackOverlay 
             winformsMap1.TrackOverlay.TrackStarted += new EventHandler<TrackStartedTrackInteractiveOverlayEventArgs>(TrackStarted); 
             winformsMap1.TrackOverlay.MouseMoved += new EventHandler<MouseMovedTrackInteractiveOverlayEventArgs>(MouseMoved); 
             winformsMap1.TrackOverlay.TrackEnded += new EventHandler<TrackEndedTrackInteractiveOverlayEventArgs>(TrackEnded); 
  
 If I could see that code snippet in VB.Net that would get me over the hump (the developerfusion.com tool was no help on this one). 
  
 Thanks!

OK,I got it converted ot VB OK with AddHandler.  Next question is how to have control over the shape properties before it is drawn?  I can pop up a dialog at the TrackEnded event so use can select the shape color, etc.  Any sample code out there to control the drawing of the shape on the map at this stage?

Michael,


 To change the styles of the TrackOverlay, you need to understand that actually TrackShapeLayer is a type of InMemoryFeatureLayer and you can change its style as you would do for a regular InMemoryFeatureLayer. For example, here I change the style to transparent red with gray outline for AreaStyle as you can see in the picture. Also see the code below. This is a simple modification from the Code Community sample Dynamic Info on TrackShapes.


 


 



    //Changes the Style of TrackOverlay
    winformsMap1.TrackOverlay.TrackShapeLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle =
    AreaStyles.CreateSimpleAreaStyle(GeoColor.FromArgb(150, GeoColor.StandardColors.Red), GeoColor.StandardColors.DarkGray, 2);


Thanks Val, will work on it from there then.

Michael, 
  
 I am glad it’s working with you. 
  
 Let us know if you have more questions. 
  
 Thanks, 
 James

Follow-up question then, when I do something similar though and allow the user to select a color at the TrackEnded event, as the user draws more shapes and changes the color the colors of previously drawn shapes all change as well.  Is there ability for each drawn shape to have its own properties?

Michael,


You can use ValueStyle to draw shapes with different style, please look at sample code below


            // Set ValueStyle
            winformsMap1.TrackOverlay.TrackShapeLayer.Open();
            winformsMap1.TrackOverlay.TrackShapeLayer.Columns.Add(new FeatureSourceColumn("Color"));
            winformsMap1.TrackOverlay.TrackShapeLayer.Close();
            ValueStyle valueStyle = new ValueStyle();
            valueStyle.ColumnName = "Color";
            valueStyle.ValueItems.Add(new ValueItem("color1", AreaStyles.Antarctica1));
            valueStyle.ValueItems.Add(new ValueItem("color2", AreaStyles.Country1));
            valueStyle.ValueItems.Add(new ValueItem("color3", AreaStyles.Forest1));
            winformsMap1.TrackOverlay.TrackShapeLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(winformsMap1.TrackOverlay.TrackShapeLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.CloneDeep());
            winformsMap1.TrackOverlay.TrackShapeLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(valueStyle);

            winformsMap1.TrackOverlay.TrackShapeLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = null;
            winformsMap1.TrackOverlay.TrackShapeLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = null;
            winformsMap1.TrackOverlay.TrackShapeLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = null;

private void TrackEnded(object sender, TrackEndedTrackInteractiveOverlayEventArgs e)
        {
            //Set to invisible the groupbox with dynamic info after ending the tracking
            groupBoxInfo.Visible = false;
            //Clears the Shapes from TrackOverlay.
            Feature feature = winformsMap1.TrackOverlay.TrackShapeLayer.InternalFeatures[winformsMap1.TrackOverlay.TrackShapeLayer.InternalFeatures.Count - 1];
            if(...)
            {
                feature.ColumnValues["Color"] = "color1";
            }
            else if(...)
            {
                feature.ColumnValues["Color"] = "color2";
            }
            else if(...)
            {
                feature.ColumnValues["Color"] = "color3";
            }
            //winformsMap1.TrackOverlay.TrackShapeLayer.InternalFeatures.Clear();
        }

Thanks,


James