ThinkGeo.com    |     Documentation    |     Premium Support

Customize EditInteractiveOveraly

Hi,


Using the code example 'DraggedPointStyle' as an example, I am attempting to customize the EditInteractiveOverlay.  What I would like to do is add a column to the ExistingControlPointsLayer ("nodetype") and then draw the point differently depending on this value.  However, when I try to query the ExistingControlPointsLayer with QueryTools.GetFeaturesWithinDistanceOf I get an error, "The given key was not present in the dictionary."


Here is the code that adds the extra column to the ExistingControlPointsLayer:


 



ExistingControlPointsLayer.Open()
ExistingControlPointsLayer.Columns.Add(New FeatureSourceColumn("nodetype"))
ExistingControlPointsLayer.Close()

 


I want to be able to set the "nodetype" based on whether or not the shift key is pressed and then draw the vertex a certain way.  Is this possible?


Thanks,


Steve



If your goal is to have the dragged vertex in a different style while pressing the shift key, I slightly changed the dragInteractiveOverlay class in the DraggedPointStyle project to show how to do that. Notice that now we have a new property DraggedControlPointStyleWithShiftKey.


 



    class DragInteractiveOverlay : EditInteractiveOverlay
    {
        private PointStyle controlPointStyle;
        private PointStyle draggedControlPointStyle;
        private PointStyle draggedControlPointStyleWithShiftKey;
        private bool IsShiftKeyDown = false;
       
       public PointStyle ControlPointStyle
        {
            get { return controlPointStyle; }
            set { controlPointStyle = value; }
        }

        public PointStyle DraggedControlPointStyle
        {
            get { return draggedControlPointStyle; }
            set { draggedControlPointStyle = value; }
        }

        public PointStyle DraggedControlPointStyleWithShiftKey
        {
            get { return draggedControlPointStyleWithShiftKey; }
            set { draggedControlPointStyleWithShiftKey = value; }
        }

        protected override InteractiveResult KeyDownCore(KeyEventInteractionArguments interactionArguments)
        {
            IsShiftKeyDown = interactionArguments.IsShiftKeyPressed;
            return base.KeyDownCore(interactionArguments);
        }

        protected override InteractiveResult KeyUpCore(KeyEventInteractionArguments interactionArguments)
        {
            IsShiftKeyDown = interactionArguments.IsShiftKeyPressed;

            return base.KeyUpCore(interactionArguments);
        }

        //Overrides the DrawCore function.
        protected override void DrawCore(GeoCanvas canvas)
        {
            //Draws the Edit Shapes as default.
            Collection<SimpleCandidate> labelsInAllLayers = new Collection<SimpleCandidate>();
            EditShapesLayer.Open();
            EditShapesLayer.Draw(canvas, labelsInAllLayers);
            canvas.Flush();
           
            //Draws the control points. 
            ExistingControlPointsLayer.Open();
            Collection<Feature> controlPoints = ExistingControlPointsLayer.FeatureSource.GetAllFeatures(ReturningColumnsType.AllColumns);

            //Loops thru the control points.
            foreach (Feature feature in controlPoints)
            {
                //Looks at the value of "state" to draw the control point as dragged or not.
                if (feature.ColumnValues["state"] != "selected")
                {
                    Feature[] features = new Feature[1] { feature };
                    controlPointStyle.Draw(features, canvas, labelsInAllLayers, labelsInAllLayers);
                   
                }
                else
                {
                    Feature[] features = new Feature[1] { feature };
                    if (IsShiftKeyDown == false)
                    {
                       draggedControlPointStyle.Draw(features, canvas, labelsInAllLayers, labelsInAllLayers);
                    }
                    else
                    {
                       draggedControlPointStyleWithShiftKey.Draw(features, canvas, labelsInAllLayers, labelsInAllLayers);
                    }
                }
            }
        }
     }


Val, 
  
 Thanks very much for your example code, it was very helpful to my understanding of what’s going on inside some of the protected methods.   
  
 What I would eventually like to be able to do is to allow the user to select multiple points (maybe with the shift or control key pressed to indicate multiple selection).  I would like the control points to stay ‘selected’ after the control points are drawn.  This is helpful when, say, deleting multiple nodes and we use something similar in our current application.   
  
 The ultimate goal is to be able to select a control point, then select another control point somewhere else on a the feature (line or polygon).  Then all of the nodes in between would become ‘selected’.  This same ‘tracing’ would be available when drawing a new polygon and would make it easier to draw a new polygon adjacent to an existing one.  In our current app this is a great time saver. 
  
 Ordinarily I would study the documentation and come up with a way to do this, but some of the ThinkGEO documentation is a little sparse.  The code examples are a great help and the new WIKI is excellent! 
  
 Any pointers? 
  
 Thanks, 
  
 Steve

Steve,  
  
 Actually your case got me inspired and I am currently working on a new Code Community project resembling what you are trying to accomplish. I think that the project should be published tomorrow. I will let you know when we have it out.  
  
 Thank you for your remark on the new WIKI. Everyday we are adding new content for a more complete documentation.

Val, 
  
 That’s great!  I’ll look for it tomorrow.

Steven,


  You can find the Code Community project Dragged PointStyle Advanced at wiki.thinkgeo.com/wiki/Map_Suite_De...e_Advanced


 It is not exactely what you are doing but I think it is going to give you a good idea on how to extend the EditInteractiveOverlay and especially how to override the protected functions.


I am still interested in creating a project exactely like your case with selecting multiple vertices with the shift key etc. Do you mind sharing some more information on what you expect exactely and we will see if we can publish another project for this?


Thank you.


 



Val,


Thanks for posting the project, I will be downloading it and taking a look.


The functionality I would like to achieve is as follows:



        
  1. When the user cliks on or moves a vertex, that vertex becomes 'selected' and remains selected even after it is moved.

  2.     
  3. If the user selects a vertex and then holds the shift key while  selecting a second vertex, all vertices between the first  and second vertex would be selected.

  4.     
  5. If the user presses the shift key and clicks a vertex that is already selected, it would be deselected.

  6.     
  7. If the user hits the Delete key any selected vertices would be deleted.


In addition, I would like to implement the ability to edit multiple, adjacent features simultaneously.  Say you have a layer with features that are supposed to match adjacent features vertex for vertex.  If you move a vertex in one feature, your implied topological rule would dictate that the matching vertex in the adjacent feature be moved as well.  Selected vertices with two or more features in common ('common vertices') would be displayed with a different symbol than vertices that do not intersect any other features.


Hopefully you get the idea.  Let me know if any of this is unclear!


Thanks again!


 


 



Thank you for the detailed explanation. That gives us a really good idea for the type of editing our users need to perform. Everything you described should be possible extending EditInteractiveOverlay and it should give us some good samples for the Code Community. If we have doubts while implementing this, I will ask you for more explanations.

Steven, 
  
  I let you know that we have not forgotten this post. We got delayed but early next week we will work on a sample showing how to accomplish the functions you described in the points 1 thru 4. We will make a seperate sample for the part of the topological rule because it is quite different. 
  
 Thank you.

Val, 
  
 Thanks very much.  I have managed to implement a good bit of it already but haven’t yet completed it.  I look forward to more clarity in how to do things from the code sample. 
  
 Steve

Yes, it will be interessting to see our implementations compared to yours. I will let you know as soon as we have the Code Community samples published in our Wiki.

Steven, 
  
  I let you know that while implementing the solution using a class inheriting from EditInteractiveOverlay, I ran into a bug in the MouseUpCore. I contacted the Development team on that issue and I am waiting for their response for the fix to continue. Thank you for your patience.

Val, 
  
 Thanks for the update!  I am looking forward to learning from your solution.

 The developement team told me that they should have the fix for MouseUpCore bug early next week and that way we should be able to continue on the solution. Also, I let you know that there seem to be more requests similar to yours as you can see in this new post: gis.thinkgeo.com/Support/Discussion...aspx#21055



Val, 
  
 Thanks for the update, looking forward to the sample solution. 
  
 Steve

Steven, 
  
 We are working on the MouseUpCore bug with Val, please keep your eyes on this, if we have any responses on this solution we will let you know, 
  
 Thanks for your post, 
  
 Scott,

Steven,


 Today we published a Code Community sample related to what you are looking for. I got delayed because I could not rely on the development teams due to the 4.5 version of products being released. And myself I was struggling understanding some intricacies of the EditInteractiveOverlay. The sample shows how to drag a vertex and keep the vertex selected even after finishing dragging. It is far short of what you are requesting but by looking at the code and by reading the comments I think that it will help you get further in customizing your own editing logic. You can check the sample, Select Vertices, at wiki.thinkgeo.com/wiki/Map_Suite_De...ys_Samples


Now that the development teams are more available with the 4.5 public release behind us, I will work more with them and add more more samples according to your descriptions.


Val.



Val, 



Thanks very much for the new code sample!  It is very helpful in understanding how to use some of the protected methods.  In particular, it helps to know that the control points are cleared in the mouse-up event.  In my own development, I noticed the column values were disappearing each time a vertex was moved. This example will aid me in refining my own project.



Thanks, 



Steve



You are welcome. We should have for tomorrow another sample with EditInteractiveOverlay that shows how to select vertices at mouse click and then drag them as a group. I think that you will also that this interesting for refining your own projects.

Val, 



That sounds great.  One problem I am running into is that the selection is lost when a vertex is added.  MouseUpCore is not called when a vertex is added, yet it appears that the control points might be being cleared.  Can you help with this? 



Thanks, 



Steve