public override void Initialize()
        {
            base.Initialize();

            // Enable GPU acceleration
            nChartControl1.Settings.RenderSurface = RenderSurface.Window;

            nChartControl1.Panels.Clear();

            // set a chart title
            NLabel title = new NLabel("Grid Surface Cross Section");

            title.TextStyle.FontStyle = new NFontStyle("Times New Roman", 18, FontStyle.Italic);
            title.TextStyle.FillStyle = new NColorFillStyle(GreyBlue);
            title.DockMode            = PanelDockMode.Top;
            title.Margins             = new NMarginsL(10);
            nChartControl1.Panels.Add(title);

            NDockPanel containerPanel = new NDockPanel();

            containerPanel.PositionChildPanelsInContentBounds = true;
            containerPanel.Margins  = new NMarginsL(10, 0, 10, 10);
            containerPanel.DockMode = PanelDockMode.Fill;
            nChartControl1.Panels.Add(containerPanel);

            // configure the chart
            NCartesianChart surfaceChart = new NCartesianChart();

            containerPanel.ChildPanels.Add(surfaceChart);
            surfaceChart.DockMode   = PanelDockMode.Top;
            surfaceChart.Size       = new NSizeL(new NLength(0.0f), new NLength(70.0f, NRelativeUnit.ParentPercentage));
            surfaceChart.Enable3D   = true;
            surfaceChart.Width      = 60.0f;
            surfaceChart.Depth      = 60.0f;
            surfaceChart.Height     = 15.0f;
            surfaceChart.BoundsMode = BoundsMode.Fit;
            surfaceChart.Projection.SetPredefinedProjection(PredefinedProjection.PerspectiveTilted);
            surfaceChart.Projection.Elevation = 22;
            surfaceChart.Projection.Rotation  = -68;
            surfaceChart.LightModel.SetPredefinedLightModel(PredefinedLightModel.ShinyTopLeft);

            // setup axes
            NOrdinalScaleConfigurator ordinalScale = (NOrdinalScaleConfigurator)surfaceChart.Axis(StandardAxis.PrimaryX).ScaleConfigurator;

            ordinalScale.MajorGridStyle.SetShowAtWall(ChartWallType.Floor, true);
            ordinalScale.MajorGridStyle.SetShowAtWall(ChartWallType.Back, true);
            ordinalScale.DisplayDataPointsBetweenTicks = false;

            ordinalScale = (NOrdinalScaleConfigurator)surfaceChart.Axis(StandardAxis.Depth).ScaleConfigurator;
            ordinalScale.MajorGridStyle.SetShowAtWall(ChartWallType.Floor, true);
            ordinalScale.MajorGridStyle.SetShowAtWall(ChartWallType.Left, true);
            ordinalScale.DisplayDataPointsBetweenTicks = false;

            // add the surface series
            m_SurfaceSeries = new NGridSurfaceSeries();
            surfaceChart.Series.Add(m_SurfaceSeries);
            m_SurfaceSeries.Name          = "Surface";
            m_SurfaceSeries.Legend.Mode   = SeriesLegendMode.SeriesLogic;
            m_SurfaceSeries.PositionValue = 10.0;
            m_SurfaceSeries.Data.SetGridSize(1000, 1000);
            m_SurfaceSeries.SyncPaletteWithAxisScale       = false;
            m_SurfaceSeries.PaletteSteps                   = 8;
            m_SurfaceSeries.ValueFormatter.FormatSpecifier = "0.00";
            m_SurfaceSeries.FillStyle   = new NColorFillStyle(Color.YellowGreen);
            m_SurfaceSeries.ShadingMode = ShadingMode.Smooth;
            m_SurfaceSeries.FrameMode   = SurfaceFrameMode.None;
            m_SurfaceSeries.FillMode    = SurfaceFillMode.ZoneTexture;

            // add the cross section line series
            m_CrossSection3DSeries = new NPointSeries();
            surfaceChart.Series.Add(m_CrossSection3DSeries);
            m_CrossSection3DSeries.Size                   = new NLength(10);
            m_CrossSection3DSeries.PointShape             = PointShape.Sphere;
            m_CrossSection3DSeries.FillStyle              = new NColorFillStyle(Color.Red);
            m_CrossSection3DSeries.DataLabelStyle.Visible = false;
            m_CrossSection3DSeries.UseXValues             = true;
            m_CrossSection3DSeries.UseZValues             = true;

            FillData(m_SurfaceSeries);

            NCartesianChart crossSectionChart = new NCartesianChart();

            crossSectionChart.BoundsMode = BoundsMode.Stretch;
            crossSectionChart.DockMode   = PanelDockMode.Fill;
            crossSectionChart.Margins    = new NMarginsL(0, 10, 0, 0);

            crossSectionChart.Axis(StandardAxis.PrimaryX).ScaleConfigurator            = new NLinearScaleConfigurator();
            crossSectionChart.Axis(StandardAxis.PrimaryX).ScaleConfigurator.Title.Text = "Distance";
            crossSectionChart.Axis(StandardAxis.PrimaryY).ScaleConfigurator.Title.Text = "Value";

            m_CrossSection2DSeries = new NLineSeries();
            m_CrossSection2DSeries.DataLabelStyle.Visible = false;
            m_CrossSection2DSeries.UseXValues             = true;
            crossSectionChart.Series.Add(m_CrossSection2DSeries);

            containerPanel.ChildPanels.Add(crossSectionChart);

            nChartControl1.View.RecalcLayout();

            NRange1DD xAxisRange = surfaceChart.Axis(StandardAxis.PrimaryX).Scale.RulerRange;
            NRange1DD yAxisRange = surfaceChart.Axis(StandardAxis.PrimaryY).Scale.RulerRange;
            NRange1DD zAxisRange = surfaceChart.Axis(StandardAxis.Depth).Scale.RulerRange;

            m_DragPlane = new NDragPlane(
                new NVector3DD(0, yAxisRange.End, 0),
                new NVector3DD(xAxisRange.End, yAxisRange.End, zAxisRange.End),
                new NVector3DD(xAxisRange.End, 0, zAxisRange.End),
                new NVector3DD(0, 0, 0)
                );

            m_DragPlane.DragPlaneChanged += new EventHandler(OnDragPlaneChanged);
            m_DragPlaneTool = new NDragPlaneTool(m_DragPlane);
            m_DragPlane.AddToChart(surfaceChart);

            nChartControl1.Controller.Tools.Add(new NPanelSelectorTool());
            nChartControl1.Controller.Tools.Add(m_DragPlaneTool);
            nChartControl1.Controller.Tools.Add(new NTrackballTool());

            // enable fixed axis ranges
            surfaceChart.Axis(StandardAxis.PrimaryX).View = new NRangeAxisView(xAxisRange, true, true);
            surfaceChart.Axis(StandardAxis.PrimaryY).View = new NRangeAxisView(yAxisRange, true, true);
            surfaceChart.Axis(StandardAxis.Depth).View    = new NRangeAxisView(zAxisRange, true, true);

            // turn off plot box clipping
            surfaceChart.Axis(StandardAxis.PrimaryX).ClipMode = AxisClipMode.Never;
            surfaceChart.Axis(StandardAxis.PrimaryY).ClipMode = AxisClipMode.Never;
            surfaceChart.Axis(StandardAxis.Depth).ClipMode    = AxisClipMode.Never;

            DragPlaneComboBox.Items.Add("XY");
            DragPlaneComboBox.Items.Add("XZ");
            DragPlaneComboBox.Items.Add("ZY");
            DragPlaneComboBox.SelectedIndex = 1;

            // update the cross section
            OnDragPlaneChanged(null, null);
        }
 /// <summary>
 /// Initializer constructor
 /// </summary>
 /// <param name="dragPlane"></param>
 public NDragPlaneTool(NDragPlane dragPlane)
 {
     m_DragPlane        = dragPlane;
     m_OriginalPosition = new NVector3DD();
 }