ThinkGeo.com    |     Documentation    |     Premium Support

Change TrackingShape

 Hi,


I want to change the current tracking feature. I want to add for example a polgyon and after inputing some vertexes i want to add the next vertex from 2 text boxes (x and y coordinates). Than continue to do the tracking and finish the shape normally with a double click. I have used the following code but it doesnt work


Dim oPolygon as New PolygonShape


oPolygon = map.TrackOverlay.GetTrackingShape


oPolygon.OuterRing.Vertices.Insert(oPolygon.OuterRing.Vertices.Count - 1, New Vertex(TextBox1.Text, TextBox2.Text))


map.TrackOverlay.GetTrackingShape.LoadFromWellKnownData(oPolygon.GetWellKnownText)


map.refresh


Reagards


Edi Karadumi



Edi, 
  
 Thanks for your post and question. 
  
 So can I understand the requirement as following: we will have two preset vertices from two textboxes as the first two when tracing a polygon, and the first click vertex would be the third one as in the real polygon tracking?  And I am curious where you add the code attached in your previous post? It would be helpful and convenient if a self-contained sample could be provided to show what we are going to achieve. 
  
 Any more questions please feel free to let me know. 
  
 Thanks. 
  
 Yale 


The situation is like the following example: 
  
 I am creating a polygon in the TrackOverlay. I click on a button that changes the trackmode to polygon, than i start creating the polygon.  
 For example i click on the first point with coordinates (10,10), than i click on a second point (30,20). Now i have to add the third vertex. I am still in tracking mode. I know the coordinates of the third vertex, lets suppose that they are (260,20) and also lets suppose that i cant reach it with mouse to add the next vertex with a click. Even if i can do it with mouse i have to add the requirement to add it with coordinates. So ill continue to create the polygon ill still be in tracking mode. Ill fill two textboxes, one for the x coordinates and another for the y coordinates. Than ill click a button AddVertex. 
 The code above is implemented in the Click Event of the AddVertex button. Than after adding the third vertex ill add one or more vertices with mouse click, for example (50,50)  (40,50). And than finish to track the new polygon.  
  
 Best Regards 
  
 Edi Karadumi

 



Edi,


Thanks for your post and explanations.
 
We probably need to create our own customized TrackInterativeOverlay system to get it implemented, please try the following customized one. Moreover, you can change the preset point to the text box values in your application.
 

public class PresetTrackInterativeOverlay: TrackInteractiveOverlay
{
        private PointShape presetPointShape = null;
        public PointShape PresetPointShape
        {
            get { return presetPointShape; }
            set { presetPointShape = value; }
        }
        protected override BaseShape GetTrackingShapeCore()
        {
            BaseShape baseShape = base.GetTrackingShapeCore();
 
            if (baseShape is PolygonShape)
            {
                PolygonShape polygon = (PolygonShape)baseShape;
                if (polygon != null && presetPointShape != null)
                {
                    Vertices[0] = new Vertex(presetPointShape);
                }
            }
 
            return baseShape;
        }
}
 
PresetTrackInterativeOverlay presetInterativeOverlay = new PresetTrackInterativeOverlay();
presetInterativeOverlay.PresetPointShape = new PointShape(112,37);
 
winformsMap1.TrackOverlay = presetInterativeOverlay;
winformsMap1.TrackOverlay.TrackMode = TrackMode.Polygon;

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

Sorry Yale but i cant put it in work. I have to add vertices, but it only moves first vertex. Maybe im doing smth wrong. 
  
 Best Regards 
  
 Edi Karadumi

Edi,


Thanks for your post and feedbacks.


It is not just move the first vertex, it will add a preset vertex when tracking a polygon, I think that is what we are trying to achieve from the very beginning. I have wrapped the code into an executable sample, please try it.


Any more questions please feel free to let me know.


Thanks.


Yale

 



Post8958Sample.zip (10.2 KB)

It works only if i am adding the second vertex as preset. If i want to add the third vertex it adds still the second. And if i want to add more than one preset vertices iit just modifies the second vertex. Isn’t there a way to fire the addVertex event on button click? In this method you modify the feature that is displayed not the one that is saved in the TrackOverlay. 
  
 Best Regards  
  
 Edi Karadumi

Edi,


Thanks for your post and questions.
 
If you want to add the third vertex as preset one, you only need to change to the following code snippet. The VertexAdded event will only be fired automatically when a new vertex is added by mouse click event; we have no way to fire it in a button click event.


protected override BaseShape GetTrackingShapeCore()
        {
            BaseShape baseShape = base.GetTrackingShapeCore();
 
            if (baseShape is PolygonShape)
            {
                PolygonShape polygon = (PolygonShape)baseShape;
                if (polygon != null && presetPointShape != null)
                {
                    Vertices[1] = new Vertex(presetPointShape);
                }
            }
 
            return baseShape;
        }


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

How can i add the first vertex? Also what values should i put in the Vertices[index] when ill try to add the 8th vertex for polygons (more than four)? 
 Also what index value should i put for a line when ill add the 5th vertex? Cant this be better resolved by overriding the OnVertexAdding? 
  
 Edi

Edi,


 We are working on a sample that will allow tracking a polygon and add a preset vertex at any time and then keep on tracking normally. I think that with this sample, you will have a more concrete idea on how to proceed. It should be ready tomorrow. Thank you.



ok, 
  
 thnx Val, ill be waiting 
  
 Regards 
  
 Edi Karadumi

Edi Karadumi,


 See the attached sample. In this this sample, you can start track polygon and while you are tracking polygon you can add a preset vertex with the value from the text boxes and then keep tracking polygon normally. Notice that once you add the preset vertex, you have to click one time on the map to get the mouse move vertex on again. I will look later if this is something that can be enhanced.  I  think that this sample app will resolve your problem of adding a preset vertex that is outside the current extent of the map and still continue track polygon after that.


 


 



PresetVertexToTrackedPolygonUpdate_110330.zip (264 KB)

Sorry Val, but it doesn’t work.  
 When trackoverlay starts creating a polygon it adds four vertexes. Than on each click it modifies vertex 0, 1,2 and after four clicks it modifies vertices.count - 2. Thats not the same to always modify vertices.count - 2. So if i add the second vertex as e preset one it will modify vertices.count -2 equal to 4-2 = 2. It means it will modify the third vertex not the second one, the one that i added as preset. I have event tried to get the vertex that is being add as preset using mouseDownCount, but when i add a preset vertex it is not increased, as expected to not increase. Anyways i think the workaround logic is bad. It doesn’t modify the tracking shape, it modifies the shape that you get. I have been trying to modify the MouseClickCore and VertexAdding, but without success. 
  
 Regards  
  
 Edi Karadumi

Edi Karadumi, 
  
  Well, it is working for what it is intended to do. Start tracking a polygon add a vertex with some preset X and Y values and keep tracking the polygon normally.  
  I read several times your description of what you want but I still don’t understand very well what you expect exactely. I am still very confused of what you are looking for. I am sorry but can you try to explain precisely step by step how the track polygon should work from the user’s perspective. Again, I apologize for not being able to undestand exactely how the track polygon should work for you. Thank you for your patience.

 The problem is that my polygons are parcels. And when someone adds a new parcel, they will have to load it from a file or add it manually. In the case that we will have to add it manually, ill need snapping if the parcel will have vertices that should be in the boundary of another parcel and i should be able to add a vertex with coordinates if the vertex is to be added at an empty space. Im attaching e image of the situation. I'll also want to be able to start to trach a shape by adding the first shape. To accomplish the result above i have modified only the following event


 
    Protected Overrides Function MouseClickCore(ByVal interactionArguments As ThinkGeo.MapSuite.DesktopEdition.InteractionArguments) As ThinkGeo.MapSuite.DesktopEdition.InteractiveResult
        If m_presetPointShape IsNot Nothing Then
            Dim res As New InteractionArguments
 
            res = interactionArguments
 
            res.WorldX = m_presetPointShape.X
            res.WorldY = m_presetPointShape.Y
 
            m_presetPointShape = Nothing
            Return MyBase.MouseClickCore(res)
        Else
            Return MyBase.MouseClickCore(interactionArguments)
        End If
 
    End Function
 
but im trying to resolve the issue. It's to strange to click on a button to add a point (in the code to set the preset point), than to click on the map to add it to the shape. Two clicks to add a point. It will be very confusing for my application end users
 
The first point is successfully added. Now ill need to add the next vertex in an empty space by coordinates.
 

 
This is an entire shape that should be added by coordinates
 
Best Regards 
 
Edi Karadumi

Edi Karadumi,


 If I understand well you want your tpolygon tracking to work the following way:


-Have the manually added vertex snapped to the vertex of another polygon if it is within a certain tolerance.


-Add a vertex to the track polygon from preset X and Y values.


-Otherwise track polygon normally.


My question is: With what action are you going to add the preset vertex? In the sample I have, you click on a button and it is going to put the vertex of the track polygon with the X an Y values of the textboxes. How esle do you want that to occur? For example, you left click for tracking normally the polygon and you right click to add a vertex with the X an Y values from texboxes? Can you be a little more precise on that? Thank you.


 


 



-Have the manually added vertex snapped to the vertex of another polygon if it is within a certain tolerance.  <— Already accomplished this point 
  
 Yes, that was the idea, to left click to normally track the polygon than at a certain vertex to right click and a panel with two textboxes and an Add Button will appear. After filling the values of the textboxes and pressing the Add Button the vertex will be added to the tracking shape. Than ill start adding vertices normally. Maybe adding other vertices with right click or just with left click.  
  
 Best Regards 
  
 Edi

 


Edi,
 
Thanks for your post and questions.
 
If I understand well, what we are trying to achieve is trying to be capable of adding more than one preset vertices when tracking one polygon, I have modified the code to accomplish this, please take a try against it. In this sample, after you add a preset vertex, you can change the Lat/Long in the text value and then add another preset vertex if we want.
 
Thanks.
 
Yale 

 



PresetVertexToTrackedPolygonUpdate3.zip (263 KB)

Yang,


 I think we are almost there. I would change the sample app you attached with having at right clicking a panel appearing at the mouse position as in the image below. The user can fill the X and Y vaues in the textbox, click the button and then continue tracking polygon with left click again.



 


 Edi,


 This is what you are expecting, right?