Page Index Toggle Pages: 1 Send TopicPrint
Hot Topic (More than 10 Replies) Adding a new node to ControlPoints collection (Read 3152 times)
corcav
YaBB Newbies
*
Offline


I love YaBB 1G - SP1!

Posts: 17
Joined: Apr 1st, 2009
Adding a new node to ControlPoints collection
Jun 3rd, 2009 at 10:08am
Print Post  
I have a diagram that has LinkStyle=Cascading and LinkSegments=3. I want to add a new controlpoint in a middle of an existing link segment programmatically, so i do:

link.ControlPoints.Insert(new PointF(x,y));
link.UpdateFromPoints(true);
link.UpdateIntersections();

What i get is that point is added but i miss last segment visually (link exists, but it appears unconnected).
If i click link handles i get weird behavior.

Did i miss something?

Thanks
  
Back to top
 
IP Logged
 
Stoyo
God Member
*****
Offline


MindFusion support

Posts: 13230
Joined: Jul 20th, 2005
Re: Adding a new node to ControlPoints collection
Reply #1 - Jun 3rd, 2009 at 10:18am
Print Post  
Hi,

Call the UpdateFromPoints(bool updateGroups, bool updateSegmentCount) overloaded method, with updateSegmentCount set to true. When modifying the points of cascading links, you must ensure that each segment is orthogonal to each neighbors.

I hope that helps,
Stoyan
  
Back to top
 
IP Logged
 
corcav
YaBB Newbies
*
Offline


I love YaBB 1G - SP1!

Posts: 17
Joined: Apr 1st, 2009
Re: Adding a new node to ControlPoints collection
Reply #2 - Jun 3rd, 2009 at 10:28am
Print Post  
Hi Stoyo,
I don't have such overload (using v5.1.1.23993) do i need to upgrade or do you have a (temporary) workaround?

Thanks
  
Back to top
 
IP Logged
 
Stoyo
God Member
*****
Offline


MindFusion support

Posts: 13230
Joined: Jul 20th, 2005
Re: Adding a new node to ControlPoints collection
Reply #3 - Jun 3rd, 2009 at 11:00am
Print Post  
  
Back to top
 
IP Logged
 
corcav
YaBB Newbies
*
Offline


I love YaBB 1G - SP1!

Posts: 17
Joined: Apr 1st, 2009
Re: Adding a new node to ControlPoints collection
Reply #4 - Jun 3rd, 2009 at 11:22am
Print Post  
Hi Stoyo,
Tried this but problem is the same...

    public void AddLinkSegment(DiagramLink link, PointF splitPoint)
    {
     PointCollection savedPoints = link.ControlPoints.Clone();
     link.SegmentCount++;
     //Find segment
     for (int i = 1; i < savedPoints.Count; i++)
     {
       PointF linkPoint = link.ControlPoints[i];
       bool isSameY = splitPoint.Y > linkPoint.Y - 2 && splitPoint.Y < linkPoint.Y + 2;
       bool isSameX = splitPoint.X > linkPoint.X - 2 && splitPoint.X < linkPoint.X + 2;
       if (isSameY && linkPoint.X > splitPoint.X)
       {
         //Inject splitpoint
         savedPoints.Insert(i, new PointF(splitPoint.X, linkPoint.Y));
         break;
       }

       if (isSameX && linkPoint.Y > splitPoint.Y)
       {
         //Inject splitpoint
         savedPoints.Insert(i, new PointF(linkPoint.X, splitPoint.Y));
         break;
       }
     }
     for (int i = 0; i < savedPoints.Count; i++)
     {
       if (i < link.ControlPoints.Count)
         link.ControlPoints[i] = savedPoints[i];
       else
         link.ControlPoints.Add(savedPoints[i]);
     }
     link.UpdateFromPoints(true);
     link.UpdateIntersections();
    }

Method just adds a new point to provided link.
Thanks
  
Back to top
 
IP Logged
 
Stoyo
God Member
*****
Offline


MindFusion support

Posts: 13230
Joined: Jul 20th, 2005
Re: Adding a new node to ControlPoints collection
Reply #5 - Jun 3rd, 2009 at 11:39am
Print Post  
Hi,

You should actually insert two points to preserve the othogonality of segments. Also you should remember the index where the points were added and change the second loop to

Code
Select All
for (int i = 0; i < savedPoints.Count; i++)
{
	if (i < insertIndex)
		link.ControlPoints[i] = savedPoints[i];
	else
		link.ControlPoints[i + 2] = savedPoints[i];
}
 



I hope that helps,
Stoyan
  
Back to top
 
IP Logged
 
corcav
YaBB Newbies
*
Offline


I love YaBB 1G - SP1!

Posts: 17
Joined: Apr 1st, 2009
Re: Adding a new node to ControlPoints collection
Reply #6 - Jun 3rd, 2009 at 12:01pm
Print Post  
Sorry but I'm getting lost... Undecided
You mean that i have to add the same point twice? (method adds just a single point) i did that (see code below) but i don't understand how to modify second loop.

   public void AddLinkSegment(DiagramLink link, PointF splitPoint)
    {
     int insertionPoint=0;
     PointCollection savedPoints = link.ControlPoints.Clone();
     link.SegmentCount++;
     //Find segment
     for (int i = 1; i < savedPoints.Count; i++)
     {
       PointF linkPoint = link.ControlPoints[i];
       bool isSameY = splitPoint.Y > linkPoint.Y - 2 && splitPoint.Y < linkPoint.Y + 2;
       bool isSameX = splitPoint.X > linkPoint.X - 2 && splitPoint.X < linkPoint.X + 2;
       if (isSameY && linkPoint.X > splitPoint.X)
       {
         //Inject splitpoint
         savedPoints.Insert(i, new PointF(splitPoint.X, linkPoint.Y));
         savedPoints.Insert(i, new PointF(splitPoint.X, linkPoint.Y));
         insertionPoint = i;
         break;
       }

       if (isSameX && linkPoint.Y > splitPoint.Y)
       {
         //Inject splitpoint
         savedPoints.Insert(i, new PointF(linkPoint.X, splitPoint.Y));
         savedPoints.Insert(i, new PointF(linkPoint.X, splitPoint.Y));
         insertionPoint = i;
         break;
       }
     }
     for (int i = 0; i < savedPoints.Count; i++)
     {
       if (i < link.ControlPoints.Count)
         if (i < insertionPoint)
           link.ControlPoints[i] = savedPoints[i];
         else
           link.ControlPoints.Add(savedPoints[i]);
     }

     link.UpdateFromPoints(true);
     link.UpdateIntersections();
    }

Thanks for your patience...
  
Back to top
 
IP Logged
 
Stoyo
God Member
*****
Offline


MindFusion support

Posts: 13230
Joined: Jul 20th, 2005
Re: Adding a new node to ControlPoints collection
Reply #7 - Jun 3rd, 2009 at 1:02pm
Print Post  
Try this

Code
Select All
public void AddLinkSegment(DiagramLink link, PointF splitPoint)
{
	int insertionPoint = 0;
	PointCollection savedPoints = link.ControlPoints.Clone();

	//Find segment
	for (int i = 1; i < savedPoints.Count; i++)
	{
		PointF linkPoint = link.ControlPoints[i];
		bool isSameY = splitPoint.Y > linkPoint.Y - 2 && splitPoint.Y < linkPoint.Y + 2;
		bool isSameX = splitPoint.X > linkPoint.X - 2 && splitPoint.X < linkPoint.X + 2;
		if (isSameY && linkPoint.X > splitPoint.X)
		{
			//Inject splitpoint
			savedPoints.Insert(i, new PointF(splitPoint.X, linkPoint.Y));
			savedPoints.Insert(i, new PointF(splitPoint.X, linkPoint.Y));
			insertionPoint = i;
			break;
		}

		if (isSameX && linkPoint.Y > splitPoint.Y)
		{
			//Inject splitpoint
			savedPoints.Insert(i, new PointF(linkPoint.X, splitPoint.Y));
			savedPoints.Insert(i, new PointF(linkPoint.X, splitPoint.Y));
			insertionPoint = i;
			break;
		}
	}
	link.SegmentCount += 2;
	for (int i = 0; i < savedPoints.Count; i++)
		link.ControlPoints[i] = savedPoints[i];

	link.UpdateFromPoints(true);
	link.UpdateIntersections();
}
 



There is a built-in feature that lets you insert news segments interactively; enable the AllowSplitLinks property and drag any point from a link segment to insert additional points there.

I hope that helps,
Stoyan
  
Back to top
 
IP Logged
 
corcav
YaBB Newbies
*
Offline


I love YaBB 1G - SP1!

Posts: 17
Joined: Apr 1st, 2009
Re: Adding a new node to ControlPoints collection
Reply #8 - Jun 3rd, 2009 at 2:35pm
Print Post  
Hi Stoyo,
Copied you code "as-is" but unfortunately it generates a "Index of of range exception" inside the loop:

link.SegmentCount += 2;

for (int i = 0; i < savedPoints.Count; i++)

{

link.ControlPoints[i] = savedPoints[i];

}
That's because savedpoints.count=6 while link.ControlPoints.Count=4.
Looks like SegmentCount is ignored, code is exactly what you've posted before.

Thanks
  
Back to top
 
IP Logged
 
Stoyo
God Member
*****
Offline


MindFusion support

Posts: 13230
Joined: Jul 20th, 2005
Re: Adding a new node to ControlPoints collection
Reply #9 - Jun 3rd, 2009 at 2:37pm
Print Post  
If you are using AutoRoute, disable it before setting SegmentCount.
  
Back to top
 
IP Logged
 
corcav
YaBB Newbies
*
Offline


I love YaBB 1G - SP1!

Posts: 17
Joined: Apr 1st, 2009
Re: Adding a new node to ControlPoints collection
Reply #10 - Jun 3rd, 2009 at 2:47pm
Print Post  
Looks like your code works when Link.AutoRoute=false...  Smiley

Thanks
  
Back to top
 
IP Logged
 
Page Index Toggle Pages: 1
Send TopicPrint