Page 1 of 1

Creating a Parallel Line

Posted: Fri Jun 12, 2015 7:16 am
by 16071129
Dear Steema,

Currently we are having a requirement wherein we need to do following:
1] Select Already Drawn TrendLine (DrawLine Tool)
2] On right click that line, it should show a Context Menu having menu items like "Line Properties", "Create Parallel Line"
3] On click of "Create Parallel Line" it should create identical line which should be placed at some distance and parallel to original line.

For your reference check following screenshot:
Parallel Line.png
Parallel Line.png (8.41 KiB) Viewed 10451 times
Any help on this would be greately appreciated.

Note: Prior to give help on above topic, please let us know a better approch to show context menu on right click of DrawLine tool ASAP.

Re: Creating a Parallel Line

Posted: Fri Jun 12, 2015 8:50 am
by Christopher
You can try:

Code: Select all

    DrawLine tool;
    private void InitializeChart()
    {
      tChart1.Aspect.View3D = false;
      tChart1.Series.Add(typeof(Points)).FillSampleValues(200);
      tChart1.MouseClick += tChart1_MouseClick;

      tool = new DrawLine(tChart1.Chart);

      DrawLineItem l = new DrawLineItem(tool);

      l.StartPos = new PointDouble(tChart1[0].XValues[50], tChart1[0].YValues[50]);
      l.EndPos = new PointDouble(tChart1[0].XValues[100], tChart1[0].YValues[100]);

      tool.Selected = l;
    }


    DrawLineItem item;
    void tChart1_MouseClick(object sender, MouseEventArgs e)
    {
      if(e.Button == System.Windows.Forms.MouseButtons.Right)
      {
        item = tool.Clicked(e.X, e.Y);
        if (item != null)
        {
          ContextMenu m = new ContextMenu();
          m.MenuItems.Add(new MenuItem("Line Properties"));
          m.MenuItems.Add(new MenuItem("Create Parallel Line"));

          m.MenuItems[1].Click += SurfaceTest_Form_Click;

          m.Show(tChart1, new Point(e.X, e.Y));
        }
      }
    }

    void SurfaceTest_Form_Click(object sender, EventArgs e)
    {
      DrawLineItem l = new DrawLineItem(tool);

      l.StartPos = new PointDouble(item.StartPos.X, item.StartPos.Y + 100);
      l.EndPos = new PointDouble(item.EndPos.X, item.EndPos.Y + 100);

      tool.Invalidate();
    }

Re: Creating a Parallel Line

Posted: Fri Jun 12, 2015 9:08 am
by 16071129
Thanks a lot for your prompt reply.

Re: Creating a Parallel Line

Posted: Wed Sep 09, 2015 7:35 am
by 16071129
we are facing following problems with this work around
1) we cant sync the movement of both lines
2) change of angle in one line cant sync with other

we require some thing similar to HorizParallel and VertParallel but with slope angle change functionality with mouse.

Re: Creating a Parallel Line

Posted: Wed Sep 09, 2015 1:30 pm
by Christopher
Quant wrote:we are facing following problems with this work around
1) we cant sync the movement of both lines
2) change of angle in one line cant sync with other

we require some thing similar to HorizParallel and VertParallel but with slope angle change functionality with mouse.
Maybe something like this:

Code: Select all

    DrawLine tool;
    DrawLineItem item;
    List<Tuple<DrawLineItem, DrawLineItem>> pairs = new List<Tuple<DrawLineItem, DrawLineItem>>();

    private void InitializeChart()
    {
      tChart1.Aspect.View3D = false;
      tChart1.Series.Add(typeof(Points)).FillSampleValues(200);
      tChart1.MouseDown += TChart1_MouseDown;
      tChart1.MouseMove += TChart1_MouseMove;

      tool = new DrawLine(tChart1.Chart);

      DrawLineItem l = new DrawLineItem(tool);

      l.StartPos = new PointDouble(tChart1[0].XValues[50], tChart1[0].YValues[50]);
      l.EndPos = new PointDouble(tChart1[0].XValues[100], tChart1[0].YValues[100]);

      tool.Selected = l;
    }

    private void TChart1_MouseDown(object sender, MouseEventArgs e)
    {
      item = tool.Clicked(e.X, e.Y);

      if (e.Button == System.Windows.Forms.MouseButtons.Right)
      {
        if (item != null)
        {
          ContextMenu m = new ContextMenu();
          m.MenuItems.Add(new MenuItem("Line Properties"));
          m.MenuItems.Add(new MenuItem("Create Parallel Line"));

          m.MenuItems[1].Click += SurfaceTest_Form_Click;

          m.Show(tChart1, new Point(e.X, e.Y));
        }
      }
    }

    private void TChart1_MouseMove(object sender, MouseEventArgs e)
    {
      if(pairs.Count > 0 && item != null && item.Tag != null)
      {
        Tuple<int, int> tag = (Tuple<int, int>)item.Tag;
        Tuple<DrawLineItem, DrawLineItem> pair = pairs[tag.Item1];

        DrawLineItem partner = tag.Item2 == 0 ? pair.Item2 : pair.Item1;

        if(tag.Item2 == 0)
        {
          partner.StartPos = new PointDouble(item.StartPos.X, item.StartPos.Y + 100);
          partner.EndPos = new PointDouble(item.EndPos.X, item.EndPos.Y + 100);
        }
        else
        {
          partner.StartPos = new PointDouble(item.StartPos.X, item.StartPos.Y - 100);
          partner.EndPos = new PointDouble(item.EndPos.X, item.EndPos.Y - 100);
        }

        tool.Invalidate();
      }
    }

    void SurfaceTest_Form_Click(object sender, EventArgs e)
    {
      DrawLineItem l = new DrawLineItem(tool);

      l.StartPos = new PointDouble(item.StartPos.X, item.StartPos.Y + 100);
      l.EndPos = new PointDouble(item.EndPos.X, item.EndPos.Y + 100);

      pairs.Add(new Tuple<DrawLineItem, DrawLineItem>(item, l));
      item.Tag = new Tuple<int, int>(pairs.Count - 1, 0);
      l.Tag = new Tuple<int, int>(pairs.Count - 1, 1);

      tool.Invalidate();
    }