ThinkGeo.com    |     Documentation    |     Premium Support

Clearing tracking with only one point defined

I allow a user to track polygons with my software. I give them the option to hit ESC to cancel out of the tracking and this works just fine when the user has clicked 2 or more points. If they've only clicked 1 point though, it doesn't. The point will stay there and be present when they try to start tracking again.


If I set a break point in the track ended event handler, it never gets reached if there is only one tracked point.


My code that catches the ESC key press looks like this:


 



//my own flags above this
map.TrackOverlay.MouseDoubleClick(new InteractionArguments());
map.TrackOverlay.TrackMode = TrackMode.None;
map.Refresh(map.TrackOverlay);


Kimberly



Kimberly, 
  
   i am not sure right off the bat but I have some quick ideas you can try. 
  
 1. Before the refresh call do a Map.TrackOverlay.Lock.IsDirty = true;  I want to make sure the overlay actually thinks it is dirty. 
  
 2. Remove any features in the internal feature using the .TrackOverlay.TrackShapeLayer.InternalFeatures.clear…  When you do this you will want to wrap it in a write lock. 
  
 Setting the mode to None should be enough with the refresh.  You should not have to do the double click call you are making.  When you catch the escape key are you doing that though our KeyDown in the Overlay or are you catching that outside of the overlay in your own code?  If you want to do it through our KeyDown i can send you some code for that as well.  Let me know what you find. 
  
 David 
  


Hi David, thanks for the quick response. 
  
 Right before the call to refresh, I check the dirty flag and it’s dirty whether or not there is one point or multiple points in the track shape.  
  
 In my track ended event handler, I am clearing the track shapes layer. But with one point, that handler isn’t being reached.  
  
 I added the call to clear the track shapes layer directly (in the key down/esc hander) and right before the call to refresh (is dirty is true), I check the count of the internal features and I get 0. When the map comes up, I don’t see the blue tracking feature, but when I initialize tracking again, it still has the old point in it already and that shows up. The same thing happens without the call to MouseDoubleClick(new InteractionArguments), but only setting the trackMode to none. 
  
 I’m using the map.KeyDown event to handle the esc button.  
  
 Thanks! 
 Kimberly

Kimberly, 
  
 Sorry for the delay on replying post. 
  
 I willl try to recreate this problem and may be have a way out to wok around it as soon as possible when I am back to school. Sorry for the inconvinice now. 
  
 Thanks. 
  
 Yale

Hello, I am having a similar problem.  We allow users to track polygons in our software as well, but differing from Kimberly’s original post, I was wondering if there is a way to only remove the last point clicked in the polygon?  To enable the ability to correct the polygon if a mistake was made in placing a point. 
  
 Thanks in advance. 
  
 Andy 
  


 There is a project in the Code Community that shows how to cancel the tracked shape by pressing ESC key. You can check it out at code.thinkgeo.com/projects/show/cancelingtrack.


 For Andy's question, this is definitly possible and we will show an example for that in the Code Community this week. Thank you for your idea.


 



I downloaded that code. It doesn’t clear the polygon when you hit ESC after only clicking one point, which is the problem I need solved. I already have the code to clear the polygon if more than one point has been clicked, I need it to work if only a single point has been clicked for the polygon.  
  
 Any luck Yale? 
  
 Andy, I like that idea. That would be a nice feature that I hadn’t thought of.

Kimberly, 
  
   We should have the solution to that problem tomorrow. Thank you.

Kimberly, 
  
 I am sorry to say that this feature cannot not be achieved in the current version, because a property called MouseDownCount is not exposed to public, while it is marked as protected. We will consider to change this to public in next version to fix this problem. 
  
 Thanks. 
  
 Yale 


I don't know that you should expose the MouseDownCount. I don't have to know the MouseDownCount to cancel the partially drawn polygon if it has 2 or more points. I don't think I should have to treat the case where it has only a single point separately. Since there is obviously a need, maybe you should add a Cancel method to your API. It seems like that's an added feature rather than exposing a low level detail. Again, I DO NOT want to have to treat the single point clicked separately than the 2+ point cancellation. I just want to be able to cancel.



I second that motion!

Kimberly & Ted, 
  
 Thanks for your input and suggestion. 
  
 I think the way to expose a low level property (MouseDownCount) out is just give a way to solve this problem even though I do not think it is an ideal solution. While, as Kimberly said, just treat the single point polygon the same way with more than 2+ mouse down click will cause some problem in tracking a polygon.  
  
 For example, if you track one point or only two points polygon and then double click to end it, it will have a invalid polygon shape created which will cause exception in our validates. 
 I am not sure I am clear enough. 
  
 Thanks. 
  
 Yale 


I understand that 1 or 2 points do not make a valid polygon, but I don’t see how that is relevant. The code that I got from your site to cancel the polygon works with 2 points, but even that is beside the point. 
  
 If I’m allowing the user to hit ESC, I don’t want a polygon back. I want whatever portion of the polygon that they’ve started with to go away. It seems the low level code is the best place to do that.  
  
 Aside from that, the fact that my clearing all the features off the track layer doesn’t clear the single point that was defined seems like a bug.

Kimberly, 
  
   You are right. I think that Yale is not getting the point. I am pretty sure that the issue that you reported will be fairly easy to fix. I will personally contact the Desktop team and explain to them exactely what is going on. Sorry for the miscommunication. We will provide a fix for you next week. 


Kimberly,


I have discussed this problem with Val and agree to expose the property out, in next version, please try following code to fix this problem:

if (winformsMap1.TrackOverlay.TrackMode == TrackMode.Polygon ) 
{
          //Polygon needs to call MouseDoubleClick. Event that marks finishing tracking a Polygon. 
          //Same thing for Line.
          winformsMap1.TrackOverlay.MouseDownCount = 2;
          winformsMap1.TrackOverlay.MouseDoubleClick(new InteractionArguments());
}

 
Any more questions just feel free to let me know.
 
Thanks.
 
Yale

Attached is a code sample that should work for you.  It will let you dismiss a trackshape with just 1 point.


Ed



1914-WindowsFormsApplication2.zip (10.7 KB)

Well, I'm confused. What Val said seemed like it would be good, and then what Yale says seems to 100% contradict that. If that's the route you choose, fine, but I think this is a poor solution.


I'll look at what Ed posted now. Thanks.



Ed, Thanks for your sharing, your solution works perfectly. 
  
 Kimberly, I found we are trapped by the prototype of the sample from the code community which has no inheritance contained. I should have take a new thinking about this requirement and implements as Ed way, creating our own TrackInteractiveOverlay. 
  
 Any all, I feel glad we found a way to this problem. 
  
 Thanks. 
  
 Yale 


I let everybody know that a new project in the Code Community, TrackOverlay with Esc (New), was created today based on the participation of Ed in this Discussion Forum thread. Thank you so much, Ed!


code.thinkgeo.com/projects/s...rlayescnew



Hi I was looking at this project, and I mentioned something before about clearing only the last point defined in a track overlay shape, is there a way to do that? 
  
 Like i see how the event handlers and everything works, but I don’t want to clear all the features out, merely the last point clicked.