ThinkGeo.com    |     Documentation    |     Premium Support

Draw line from point to moving mouse

I would like to Draw a route on a layer.


While drawing the Route, As the User clicks a new point is added to the route layer which becmoes a polyline.


While the user is plotting the route I would like a line to follow the mouse as it moves and only become part of the polyline once the user clicks to set the end point.


 


What I am currently doing is upodating the polyline on the mouse move event. and then doing a map.refresh.


This is VERY Slow and doesnt seem practical.  IS there a way to draw the moving portion ( Last Clicked point to mouse position) in a more efficient manner?  Preferably without the continuous map.refresh.


 


 


 



Hello Steve, 
  
 Thanks for your post, could you please provide  your sample to us? I can test and modify your code and make it work. 
  
 Regards, 
  
 Gary

Steve, 



It seems to me like you might be able to pull this off by using the EditOverlay. It has a VertexAdded event that should let you add each segment as the user clicks, perhaps into an InMemoryLayer until it's finalized. The edit overlay has all the gadgetry expected while editing but you can turn almost everything off. We use the EditOverlay to let the user do free-form drawing with all the edit gadgetry (rotate, drag, etc.) turned off. 



Allen



Hello Allen, 
  
 Thanks for your sharing, and Steve, if you still can’t make it work, upload your sample, I can analysis it in details and make it work. 
  
 Regards, 
  
 Gary

Unfortunately creating a sample would be quite a task as the code resides in Many modules.


What I can show you is the core issue routine


 


Drawroute.  Is called when the mouse moves  on the map and  A global routeDrawing is set to true.


The mouse click event causes each point to be added to the polyline.


The Drawsimply draws the line plus the last point to Mouse position.


What makes sense is to draw  the Last Line ( Last Point to Cursor) seperately so Im not constantly updating the polyline.


Just dont know how.


 


 


 


  Public Sub drawroute()

        ' build points for each element last element is mouse pos

        Dim pstr As String = ""

        Dim pts() As String

        If gvRoute.Rows.Count = 0 Then Exit Sub ' IF only one point on the route, then dont draw

        For i = 0 To gvRoute.Rows.Count - 1     ' For each point in the list

            If i <> 0 Then pstr &= ","

            pstr &= gvRoute.Rows(i).Cells(2).Value & " " & gvRoute.Rows(i).Cells(1).Value ' add to polyline points list

        Next

        pstr &= "," & Form1.TSlon.Text & " " & Form1.tslat.Text ' Add the current mouse position. ( Always Changing  makes it very slow)  

        pts = Split(pstr, ",")

        routes(CmbAsset.SelectedIndex) = pstr   ' Also add to the ROutes array

        RouteLayer.InternalFeatures.Remove("VD-" & CmbAsset.Text)   ' Remove existing polyline

        drawpline("VD-" & CmbAsset.Text, RouteLayer, GeoColor.StandardColors.BlueViolet, 4, pts)  ' Draw new

        Form1.WinformsMap1.Refresh()  ' The slow refresh

    End Sub

 



Hi Steve,  
  
 What about the TrackOverlay? This would seem to be a good option for you as we can simply pass back to you the features you have drawn while in some TrackMode. 
 You can see the TrackOverlay in action in the Editing FeatureLayers - TrackAndEditShapes sample application in the Desktop Edition Sample Applications installed with Map Suite Desktop.

Oh yeah Ryan, I probably should have suggested TrackOverlay before EditOverlay…I think that was what I had in mind.  We use TrackOverlay in our app to let the user draw shapes of different types. 
  
 Allen

No problem! :) 
  
 Thanks for contributing and being an active part of our forums. This type of interaction is what we hope for.