ThinkGeo.com    |     Documentation    |     Premium Support

MouseMove SnapToVertex

 Hello,


I have already seen the examples on how to snap to vertex and to layer. I am trying to implement a functionality that when you move the mouse over features you can snap to the vertex and the line with a tolerance. After i do the calculations i cant move the mouse coursor. I have used the following code.


Protected Overrides Function MouseMoveCore(ByVal interactionArguments As ThinkGeo.MapSuite.DesktopEdition.InteractionArguments) As ThinkGeo.MapSuite.DesktopEdition.InteractiveResult


 


        Dim snapPointShape As PointShape = Nothing


        If m_toleranceType = ToleranceCoordinates.Screen Then


            snapPointShape = FindNearestSnappingPointPixel(New PointShape(interactionArguments.WorldX, interactionArguments.WorldY), interactionArguments.CurrentExtent, interactionArguments.MapWidth, interactionArguments.MapHeight)


        Else


            snapPointShape = FindNearestSnappingPoint(New PointShape(interactionArguments.WorldX, interactionArguments.WorldY))


        End If


        Dim oInteractionArguments As New InteractionArguments()


 


        If snapPointShape IsNot Nothing Then


            If m_toleranceType = ToleranceCoordinates.Screen Then


 


                Dim oScreenPoint As ScreenPointF


 


                oScreenPoint = ExtentHelper.ToScreenCoordinate(interactionArguments.CurrentExtent, snapPointShape, interactionArguments.MapWidth, interactionArguments.MapHeight)


 


                oInteractionArguments.ScreenX = oScreenPoint.X


                oInteractionArguments.ScreenY = oScreenPoint.Y


   


            End If


      


        End If


'**********************************************************************************


After the calculations are done i should move the mouse coursor. Dont really know 


what does the following line, but i think that it should do the job


'**********************************************************************************


        Return MyBase.MouseMoveCore(oInteractionArguments)


 


End Function


 

 



Edi,


  I am sure you saw the two Code Community samples:


-Snap To Layer wiki.thinkgeo.com/wiki/Map_Suite_De...p_To_Layer 


-Snapping to Vertex wiki.thinkgeo.com/wiki/Map_Suite_De..._to_Vertex  


 I would think that they give you most of what you need for your case. I read your description and looked at your code, but I am still a little bit in the dark on what you are trying to accomplish exactely as I don't see your MouseMoveCore in its larger context. Can you send us a little self contained sample app that we can run? That way, I think that we will have a better understanding to help you. Thank you.



 Hi,


the idea was that i wanted to restrict the mouse movement before starting to edit. So if you want to add a point over anoter vertex,


the mouse will snap to the vertex and than the user can start to create the feature. I dont know if this will be possible, but i calculated if the mouse is inside the tolerance, now i just need to move the mouse coursor over the vertex that it will be snaped. Also i am trying to snap to a line. Tomorrow as soon as possible i will attach the code.


Best Regards


Edi Karadumi



Edi, 
  
  Thank you for the more detailed explanation. What you just described is possible. I am just wondering how to implement this for a natural user experience when editing manually the geometry. Thank you for sending us the sample app. This is going to help.

 I havent done to many changes. Just removed some of the code i dont need and modyfied the following functions 


FindNearestSnappingPointPixel


MouseMoveCore


 



SnapToLayerEditInteractiveOverlay.txt (9.43 KB)
HowToCall.txt (1.24 KB)

Edi,


Here we provided a sample to demonstrate how to move the mouse cursor while snapping. Please check the attachment for more information.


Regards,


Ivan



SnapAndMoveMouse.zip (155 KB)

 Thnx Ivan,


It works great. I need just another thing. Im drawing a label on mouse move. Which is the code that i should add to fire the draw core on mouse move. I have alredy tryed to add the following lines



        Dim oRes As New InteractiveResult


        oRes.DrawThisOverlay = InteractiveOverlayDrawType.Draw


        oRes.ProcessOtherOverlaysMode = ProcessOtherOverlaysMode.DoNotProcessOtherOverlays


 


return oRes


in the MouseMoveCore, but it doesnt work




Hi Edi, 
  
 I’m sorry that I can’t catch your idea just from your description and code snippet. Could you please tell us your detailed procedure according to your requirement? For example: 
  
 1. When do you need to draw the label? Does the label always move along with your mouse cursor, or it’s just visible when snapping to vertex. 
 2. What’s the logic to draw your label? 
  
 Regards, 
 Ivan

 Well i have to snapping options, one is moving the mouse, the example that you gave to me. Now i need the second option, to draw the point where the mouse will be snapped with a different style while moving the mouse. After that  if i add, move or any other edit will be done at the snapped point. Also if it will be possible, i would like an  option to show the coordinates of the snapped point like a tooltip while the mouse moves. The tooltip should move with the mouse, also the point where it will be snapped.


Best Regards 


Edi Karadumi



Hi Edi,


Please check the attachment "SnapWithLabel.zip" to see if it meets your requirement.


In this sample, the snaped point will be drawn with a different style and label (longitude and latitude), when you move mouse to leave the tolerance range of snapped point, the style will restore to default style, the label will also disappear.


Please let us know if you have further questions.


Regards,


Ivan



SnapWithLabel.zip (36 KB)

Thank you Ivan, that did the job. 
  
 Best Regards  
  
 Edi Karadumi

Edi, 
  
 You’re welcome. Have a good day. :) 
  
 Regards, 
  
 Ivan

 Ivan one more thing,


I need to snap to a layer so i use an entire layer as a m_toSnapLayer. In most cases it works fine, but in the example like the image that i have attached it doesnt work. The following line


m_toSnapInMemoryFeatureLayer.FeatureSource.GetFeaturesNearestTo(targetPointShape, ThinkGeo.MapSuite.Core.GeographyUnit.Meter, 1, ReturningColumnsType.AllColumns)


gets the feature where the mouse is over, the red one (nearest) , not the blue one, the feature that logically i need to snap. I have increased the number of returning features to 2, but now sometimes works and sometimes not. I cant increase the number of returning features, because it becomes very slow. Is there any method to resolve this?


Best Regards


Edi Karadumi



Edi, 
  
 Thanks for your post. 
  
 I am sorry to say that it seems you are missing to attach the images. Could you re-attach them for us to better understand the issue? 
  
 Thanks 
  
 Yale 


Sry,


im sending it again



Hi Edi, 
  
 Could you please attach the image to illustrate the issue you encountered. We’ll keep an eye on your feedback. 
  
 Regards, 
  
 Ivan

 Aw, 


it seems the attachment does not work or smth else. Trying again



Hi Edi,
 
The sample we provided just used method "GetFeaturesNearestTo" to get the snapped polygon. In "FeatureLayer.QueryTools", there are lots of methods (started with "GetFeatures"), which provide different behaviors for searching features. 
 
You may need to customize the search logic to meet your requirement. For example, you can use the following code to get features which contains your mouse pointer.
 
m_toSnapInMemoryFeatureLayer.QueryTools.GetFeaturesContaining(targetPointShape, ReturningColumnsType.AllColumns);
Please let us know if you have further questions.
 
Regards,
 
Ivan

Is there any method to find the nearest Vertex ? I cant find anything suitable to my problem. As you can see from the image the only resolution that comes  in my mind is to increase the number of returned features. So the second closest one should be the blue feature (the one needed). But it seems that getClosestFeatures are not ordered or maybe they are, but the second closest feature in my application not always is the needed one. As a result i have no snapping at all. If i increase the number of returned features for example 10, it works but it becomes extremely slow and unusable.  
  
 Best Regards 
  
 Edi Karadumi

Is there any method to find the nearest Vertex ? I cant find anything suitable to my problem. As you can see from the image the only resolution that comes  in my mind is to increase the number of returned features. So the second closest one should be the blue feature (the one needed). But it seems that getClosestFeatures are not ordered or maybe they are, but the second closest feature in my application not always is the needed one. As a result i have no snapping at all. If i increase the number of returned features for example 10, it works but it becomes extremely slow and unusable.  
  
 Best Regards 
  
 Edi Karadumi