Set value for BarSeriesValue3D

A forum dedicated to WPF version of LightningChart Ultimate.

Moderator: Queue Moderators

Post Reply
pct
Posts: 24
Joined: Mon Oct 21, 2013 1:44 pm

Set value for BarSeriesValue3D

Post by pct » Thu Nov 14, 2013 10:26 pm

Right now, I'm getting random values between 0 and 100. This is the line of code I have to set the value.

Code: Select all

values[0] = new BarSeriesValue3D(0, 50f + 50f * Math.Sin(m_dX), 0, "");
                 m_dX += 0.025f;
How do I modify this if I get values between -140 and 0?
Thank you.

User avatar
ArctionPasi
Posts: 1367
Joined: Tue Mar 26, 2013 10:57 pm
Location: Finland
Contact:

Re: Set value for BarSeriesValue3D

Post by ArctionPasi » Fri Nov 15, 2013 6:27 am

barSeries3D.BaseLevel controls the minimum.

barSeries.BaseLevel = -140;

Then you need a bar value that is of height 140.
values[0] = new BarSeriesValue3D(0, 140, 0, "");

Then to top of the bar is at 0.
LightningChart Support Team, PT

pct
Posts: 24
Joined: Mon Oct 21, 2013 1:44 pm

Re: Set value for BarSeriesValue3D

Post by pct » Fri Nov 15, 2013 11:47 pm

I tried it and it didn't work.

barSeries.BaseLevel = -140;
The chart still is from 0 to 100.


About this line: values[0] = new BarSeriesValue3D(0, 140, 0, "");
Instead of 140, shouldn't I replace it by my random Y value?

Thanks.

User avatar
ArctionPasi
Posts: 1367
Joined: Tue Mar 26, 2013 10:57 pm
Location: Finland
Contact:

Re: Set value for BarSeriesValue3D

Post by ArctionPasi » Sat Nov 16, 2013 12:08 pm

I understood you want bar going from -140 to 0. That's what my previous example tried to illustrate. Of you course you need to adjust the Y axis range so that it shows -140 ... 0 values.

I've left the bar series' BaseLevel to 0 here (default value). So the bar starts from 0 and goes and goes to random.NextDouble() * -140.

Code: Select all

//Add a bar series with one random value
            BarSeries3D barSeries = new BarSeries3D(chart.View3D, Axis3DBinding.Primary, Axis3DBinding.Primary, Axis3DBinding.Primary);
            barSeries.Material.DiffuseColor = Colors.Lime;
            barSeries.BarWidth = 10; 
            barSeries.Shape = BarShape3D.RoundedCylinder;
            BarSeriesValue3D[] values = new BarSeriesValue3D[1];
            Random rand = new Random();
            values[0] = new BarSeriesValue3D(50, rand.NextDouble() * -140.0, 50, "random value");
            barSeries.Values = values; 
            chart.View3D.BarSeries3D.Add(barSeries);

            //Set proper Y axis range
            chart.View3D.YAxisPrimary3D.SetRange(-140, 0); 
Then it looks like this:
BarSeries3D with one value
BarSeries3D with one value
bar3d.jpg (80.59 KiB) Viewed 28122 times
Is this OK?
LightningChart Support Team, PT

pct
Posts: 24
Joined: Mon Oct 21, 2013 1:44 pm

Re: Set value for BarSeriesValue3D

Post by pct » Tue Nov 19, 2013 4:38 pm

Yes it is great.

Is it possible to have a brush instead of color for the bar?
If the range is from 0 to 100. At 0 it would start with a White color and be darker when it gets closer to 100.

I know I could always change the color of the bar manually, if the value is between [0,10].color = xxx, etc. But I was wondering if there was something already implemented.

Thanks.

User avatar
ArctionPasi
Posts: 1367
Joined: Tue Mar 26, 2013 10:57 pm
Location: Finland
Contact:

Re: Set value for BarSeriesValue3D

Post by ArctionPasi » Tue Nov 19, 2013 7:46 pm

:shock:

SurfaceMeshSeries3D is needed for that kind of coloring. I wrote you some example code. One bar with colors, and other one in grayscale.

Code: Select all

  void AddGradientBarMesh(double xMin, double xMax, double yMin, double yMax, double zMin, double zMax, bool colorful)
        {
            SurfaceMeshSeries3D barMesh = new SurfaceMeshSeries3D(m_chart.View3D, Axis3DBinding.Primary, Axis3DBinding.Primary, Axis3DBinding.Primary);

            SurfacePoint[,] data = new SurfacePoint[4,5];
            Color c = Color.Aqua; //set any color because it's not used 
            

            data[0, 0] = new SurfacePoint(xMax, yMax, zMin, c);
            data[0, 1] = new SurfacePoint(xMin, yMax, zMin, c);
            data[0, 2] = new SurfacePoint(xMin, yMax, zMax, c);
            data[0, 3] = new SurfacePoint(xMin, yMin, zMax, c);
            data[0, 4] = new SurfacePoint(xMin, yMin, zMin, c);

            data[1, 0] = new SurfacePoint(xMin, yMin, zMax, c);
            data[1, 1] = new SurfacePoint(xMin, yMax, zMax, c);
            data[1, 2] = new SurfacePoint(xMin, yMax, zMin, c);
            data[1, 3] = new SurfacePoint(xMin, yMin, zMin, c);
            data[1, 4] = new SurfacePoint(xMin, yMin, zMax, c);

            data[2, 0] = new SurfacePoint(xMax, yMin, zMax, c);
            data[2, 1] = new SurfacePoint(xMax, yMax, zMax, c);
            data[2, 2] = new SurfacePoint(xMax, yMax, zMin, c);
            data[2, 3] = new SurfacePoint(xMax, yMin, zMin, c);
            data[2, 4] = new SurfacePoint(xMax, yMin, zMax, c);

            data[3, 0] = new SurfacePoint(xMin, yMax, zMin, c);
            data[3, 1] = new SurfacePoint(xMax, yMax, zMin, c);
            data[3, 2] = new SurfacePoint(xMax, yMax, zMax, c);
            data[3, 3] = new SurfacePoint(xMax, yMin, zMax, c);
            data[3, 4] = new SurfacePoint(xMax, yMin, zMin, c);

            
            barMesh.Data = data;
            barMesh.WireframeType = SurfaceWireframeType.None;
            barMesh.ContourLineType = ContourLineType.None;
            barMesh.LightedSurface = LightedSurfaceSide.Bottom;
            barMesh.ColorSaturation = 90;
            barMesh.Title.ShowInLegendBox = false; 

            if (colorful)
            {
                barMesh.ContourPalette = CreateColorfulPalette(barMesh, yMin, yMax);
            }
            else
            {
                barMesh.ContourPalette = CreateGrayscalePalette(barMesh, yMin, yMax); 
            }

            m_chart.View3D.SurfaceMeshSeries3D.Add(barMesh); 

        }

        ValueRangePalette CreateColorfulPalette(SeriesBase3D ownerSeries, double yMin, double yMax)
        {
            ValueRangePalette palette = new ValueRangePalette(ownerSeries);

            palette.Steps.Clear();
            palette.MinValue = yMin;
            palette.Type = PaletteType.Gradient; 
            palette.Steps.Add(new PaletteStep(palette, Color.Blue, yMin));
            palette.Steps.Add(new PaletteStep(palette, Color.Lime, yMin + 30.0 * (yMax - yMin) / 100.0));
            palette.Steps.Add(new PaletteStep(palette, Color.Yellow, yMin + 60.0 * (yMax - yMin) / 100.0));
            palette.Steps.Add(new PaletteStep(palette, Color.Red, yMin + 100.0 * (yMax - yMin) / 100.0));
            return palette;
        }

        ValueRangePalette CreateGrayscalePalette(SeriesBase3D ownerSeries, double yMin, double yMax)
        {
            ValueRangePalette palette = new ValueRangePalette(ownerSeries);

            palette.Steps.Clear();
            palette.MinValue = yMin;
            palette.Type = PaletteType.Gradient;
            palette.Steps.Add(new PaletteStep(palette, Color.Black, yMin));
            palette.Steps.Add(new PaletteStep(palette, Color.White, yMin + 100.0 * (yMax - yMin) / 100.0));
            return palette;
        }
Use that by calling

Code: Select all

   AddGradientBarMesh(40, 60, 0, 100, 40, 60, true);
  AddGradientBarMesh(70, 80, 10, 90, 30, 40, false); 
in the chart initialization.

Just switch black and white in CreateGrayscalePalette method, and set your range.

Does it work for you?

:ugeek:
Bar meshes
Bar meshes
BarMeshes.jpg (122.75 KiB) Viewed 28103 times
LightningChart Support Team, PT

pct
Posts: 24
Joined: Mon Oct 21, 2013 1:44 pm

Re: Set value for BarSeriesValue3D

Post by pct » Tue Nov 19, 2013 10:36 pm

It's a step in the right direction, but because the palette is a percentage, if the yMax is smaller, the area of Blue will be smaller.

What I want is to have a fix palette, so between 0 and 30, it would be blue, between 30 and 60 lime, 60 and 90 yellow, 90 and 100 red.

After, I would set the Y of the bar , so if Y is 40, it would be almost completely blue with the top of color Lime.

I try to do that, but I have not been successful yet. :)

PCT

User avatar
ArctionPasi
Posts: 1367
Joined: Tue Mar 26, 2013 10:57 pm
Location: Finland
Contact:

Re: Set value for BarSeriesValue3D

Post by ArctionPasi » Tue Nov 19, 2013 11:41 pm

Modify the palette as you want. Each step is a Y-value and color pair.

During your visualization, keep the bar mesh palettes same. Just assign new values (bar corner coordinates) for the barMesh.Data. Remember to call InvalidateData() method after you have updated the values, and the mesh will be refreshed.

To coloring is made by Y axis values.
LightningChart Support Team, PT

pct
Posts: 24
Joined: Mon Oct 21, 2013 1:44 pm

Re: Set value for BarSeriesValue3D

Post by pct » Wed Nov 20, 2013 2:30 pm

This line seems to cause an internal error.

Code: Select all

barMesh.Data = data;
I have about 5 threads running. After I use this line inn one of the thread, it stops all the threads. It does not go in the catch.

User avatar
ArctionPasi
Posts: 1367
Joined: Tue Mar 26, 2013 10:57 pm
Location: Finland
Contact:

Re: Set value for BarSeriesValue3D

Post by ArctionPasi » Wed Nov 20, 2013 2:49 pm

You can't update any UI stuff from background thread without invoking to main thread. Use Dispatcher.Invoke.
LightningChart Support Team, PT

pct
Posts: 24
Joined: Mon Oct 21, 2013 1:44 pm

Re: Set value for BarSeriesValue3D

Post by pct » Wed Nov 20, 2013 5:36 pm

Great, it worked.

One more thing.

With this line:

Code: Select all

            m_chart.View3D.YAxisPrimary3D.SetRange(-100, 0); -> The bottom of the chart will be -100, top chart will be 0
            m_chart.View3D.YAxisPrimary3D.SetRange(0, -100); -> The bottom of the chart will be -100, top chart will be 0

            m_chart.View3D.YAxisPrimary3D.SetRange(100, 0); -> The bottom of the chart will be 0, top chart will be 100
            m_chart.View3D.YAxisPrimary3D.SetRange(0, 100); -> The bottom of the chart will be 0, top chart will be 100
With a range of 0 to -100, I would like to have the chart starting at the bottom to 0 and going up to -100. It doesn't seem to allow me to do that, the orientation change automaticallt using SetRange.

User avatar
ArctionPasi
Posts: 1367
Joined: Tue Mar 26, 2013 10:57 pm
Location: Finland
Contact:

Re: Set value for BarSeriesValue3D

Post by ArctionPasi » Wed Nov 20, 2013 7:51 pm

SetRange always accepts the smaller value as minimum, and larger as maximum. So (0,-100) will definitely swap the parameters and it results to (-100, 0).

set YAxisPrimary3D.Reversed = true,
and then use SetRange(-100, 0).

Reversed makes the minimum value of the axis to render in top of 3D scene.
LightningChart Support Team, PT

pct
Posts: 24
Joined: Mon Oct 21, 2013 1:44 pm

Re: Set value for BarSeriesValue3D

Post by pct » Mon Dec 02, 2013 10:30 pm

I will add to the BarSerie 2 blue lines that the user can move.

My question is if it is possible to have a different opacity for everything outside the blue lines Everything hashed in the picture below would be of a different opacity.

Is it possible?

Thanks

Image

User avatar
ArctionPasi
Posts: 1367
Joined: Tue Mar 26, 2013 10:57 pm
Location: Finland
Contact:

Re: Set value for BarSeriesValue3D

Post by ArctionPasi » Mon Dec 02, 2013 11:15 pm

Is this bar a single bar, not 3 orange bars?

If it's a single bar, you can set the colors in the ContourPalette steps. Starting from top:
- 20: semi-transparent orange
- 48: semi-transparent red
- 48.1: opaque orange
- 69.9: opaque red
- 70.0: semi-transparent orange
- 90: semi-transparent red

I have to warn you though. Transparency in 3D is far from easy, especially if you have other objects behind the transparent bars. And you notice my bar mesh constructing routine is not optimal, it has edge transitions inside from side to another. I already made a better one and can send it to you, if you need it.
LightningChart Support Team, PT

pct
Posts: 24
Joined: Mon Oct 21, 2013 1:44 pm

Re: Set value for BarSeriesValue3D

Post by pct » Tue Dec 03, 2013 1:55 pm

It is 1 single bar.

Yes, I would like to see what you have done.

Thanks,

pct
Posts: 24
Joined: Mon Oct 21, 2013 1:44 pm

Re: Set value for BarSeriesValue3D

Post by pct » Tue Dec 03, 2013 7:22 pm

In the meanwhile,
I added a LineSeriesCursors to a ViewXY, I can click on the cursor and move it.
I wanted to do the same thing in a PointLineSeries3D , but I cannot click directly on PointLineSeries3D , I just click on the chart, it does not seem possible.

User avatar
ArctionPasi
Posts: 1367
Joined: Tue Mar 26, 2013 10:57 pm
Location: Finland
Contact:

Re: Set value for BarSeriesValue3D

Post by ArctionPasi » Tue Dec 03, 2013 9:34 pm

This is the example code (extracted from future version's Winforms demo app).

see CreateBarMeshData method for better mesh constructing.

Code: Select all



   //Chart
        private LightningChartUltimate m_chart = null;

        //Bar count in X dimension 
        private int m_iColumnCount;

        //Bar count in Z dimension
        private int m_iRowCount;

        
        const double XRangeMin = 0;
        const double XRangeMax = 500;

        const double YRangeMin = 0;
        const double YRangeMax = 1000;

        const double ZRangeMin = 0;
        const double ZRangeMax = 30;

        Random m_rand = new Random();


        //Bars array. One SurfaceMeshSeries3D for each bar. 
        private SurfaceMeshSeries3D[,] m_bars;
        private double[,] m_barYValues; 

 /// <summary>
        /// Create chart.
        /// </summary>
        private void CreateChart()
        {
            //Create new chart 
            m_chart = new LightningChartUltimate(LicenseKeys.LicenseKeyStrings.LightningChartUltimate);

            //Disable rendering, strongly recommended before updating chart properties
            m_chart.BeginUpdate();

            //Set 3D as active view
            m_chart.ActiveView = ActiveView.View3D;

            //Chart parent must be set
            m_chart.Parent = splitContainer1.Panel1;

            //Fill parent area with chart
            m_chart.Dock = DockStyle.Fill;

            //Chart name
            m_chart.Name = "Gradient bars chart";

            m_chart.View3D.XAxisPrimary3D.SetRange(XRangeMin, XRangeMax);
            m_chart.View3D.YAxisPrimary3D.SetRange(YRangeMin, YRangeMax);
            m_chart.View3D.ZAxisPrimary3D.SetRange(ZRangeMin, ZRangeMax);

            m_chart.View3D.Dimensions.X = 150;
            m_chart.View3D.Dimensions.Z = 215;
            m_chart.View3D.Camera.RotationX = 40;
            m_chart.View3D.Camera.ViewDistance = 300;
            m_chart.View3D.Camera.Target.X = -15;
            m_chart.View3D.Camera.Target.Y = -40;

            //Allow chart rendering
            m_chart.EndUpdate();
        }


        /// <summary>
        /// Set column and row count of bars
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonApplyNewSize_Click(object sender, EventArgs e)
        {
            m_iColumnCount = (int)numericUpDownColumns.Value;
            m_iRowCount = (int)numericUpDownRows.Value;

            m_chart.BeginUpdate();

            //Get rid of old bars 
            m_chart.View3D.SurfaceMeshSeries3D.Clear();

            //Create array for bars
            m_bars = new SurfaceMeshSeries3D[m_iColumnCount, m_iRowCount];

            //Create array for Y values 
            m_barYValues = new double[m_iColumnCount, m_iRowCount];

            for (int iCol = 0; iCol < m_iColumnCount; iCol++)
            {
                for (int iRow = 0; iRow < m_iRowCount; iRow++)
                {
                    SurfaceMeshSeries3D bar = new SurfaceMeshSeries3D(m_chart.View3D, Axis3DBinding.Primary, Axis3DBinding.Primary, Axis3DBinding.Primary);
                    bar.ContourLineType = ContourLineType.None;
                    bar.ColorSaturation = 80;
                    bar.WireframeType = SurfaceWireframeType.None;
                    bar.ContourPalette = CreatePalette(bar, YRangeMin, YRangeMax);
                    bar.LightedSurface = LightedSurfaceSide.Bottom;
                    bar.SmoothShading = false; //correct lights
                    m_chart.View3D.SurfaceMeshSeries3D.Add(bar);
                    m_bars[iCol, iRow] = bar;

                    m_barYValues[iCol, iRow] = RandomizeValue();

                    //Only show first bar's palette in the legend box. 
                    if (iCol == 0 && iRow == 0)
                    {
                        bar.Title.ShowInLegendBox = true;
                        bar.Title.Text = "Bar value";
                    }
                    else
                        bar.Title.ShowInLegendBox = false;
                }
            }

            m_chart.EndUpdate();
        }

        /// <summary>
        /// Create surface mesh data from given bar coordinates
        /// </summary>
        /// <param name="xMin">X minimum</param>
        /// <param name="xMax">X maximum</param>
        /// <param name="yMin">Y minimum</param>
        /// <param name="yMax">Y maximum</param>
        /// <param name="zMin">Z minimum</param>
        /// <param name="zMax">Z maximum</param>
        /// <returns>Surface mesh data</returns>
        SurfacePoint[,] CreateBarMeshData(double xMin, double xMax, double yMin, double yMax, double zMin, double zMax)
        {
            SurfacePoint[,] aMeshPoints = new SurfacePoint[4, 5];
            Color c = Color.Aqua; //set any color because it's not used 
           
            aMeshPoints[0, 0] = new SurfacePoint(xMin, yMax, zMin, c);
            aMeshPoints[0, 1] = new SurfacePoint(xMin, yMax, zMax, c);
            aMeshPoints[0, 2] = new SurfacePoint(xMin, yMin, zMax, c);
            aMeshPoints[0, 3] = new SurfacePoint(xMin, yMin, zMin, c);
            aMeshPoints[0, 4] = new SurfacePoint(xMin, yMax, zMax, c);

            aMeshPoints[1, 0] = new SurfacePoint(xMin, yMax, zMax, c);
            aMeshPoints[1, 1] = new SurfacePoint(xMin, yMax, zMin, c);
            aMeshPoints[1, 2] = new SurfacePoint(xMin, yMin, zMin, c);
            aMeshPoints[1, 3] = new SurfacePoint(xMin, yMin, zMax, c);
            aMeshPoints[1, 4] = new SurfacePoint(xMin, yMax, zMax, c);

            aMeshPoints[2, 0] = new SurfacePoint(xMax, yMax, zMax, c);
            aMeshPoints[2, 1] = new SurfacePoint(xMax, yMax, zMin, c);
            aMeshPoints[2, 2] = new SurfacePoint(xMax, yMin, zMin, c);
            aMeshPoints[2, 3] = new SurfacePoint(xMax, yMin, zMax, c);
            aMeshPoints[2, 4] = new SurfacePoint(xMax, yMax, zMax, c);

            
            aMeshPoints[3, 0] = new SurfacePoint(xMax, yMax, zMin, c);
            aMeshPoints[3, 1] = new SurfacePoint(xMax, yMax, zMax, c);
            aMeshPoints[3, 2] = new SurfacePoint(xMax, yMin, zMax, c);
            aMeshPoints[3, 3] = new SurfacePoint(xMax, yMin, zMin, c);
            aMeshPoints[3, 4] = new SurfacePoint(xMax, yMax, zMax, c);
            return aMeshPoints;

        }


        /// <summary>
        /// Create a palette for a bar
        /// </summary>
        /// <param name="ownerSeries">Owner series</param>
        /// <param name="yMin">Y minimum</param>
        /// <param name="yMax">Y maximum</param>
        /// <returns>Palette containing values equivalent colors</returns>
        ValueRangePalette CreatePalette(SeriesBase3D ownerSeries, double yMin, double yMax)
        {
            ValueRangePalette palette = new ValueRangePalette(ownerSeries);

            palette.Steps.Clear();
            palette.MinValue = yMin;
            palette.Type = PaletteType.Gradient;
            palette.Steps.Add(new PaletteStep(palette, Color.Blue, yMin));
            palette.Steps.Add(new PaletteStep(palette, Color.Lime, yMin + 30.0 * (yMax - yMin) / 100.0));
            palette.Steps.Add(new PaletteStep(palette, Color.Yellow, yMin + 60.0 * (yMax - yMin) / 100.0));
            palette.Steps.Add(new PaletteStep(palette, Color.Red, yMin + 100.0 * (yMax - yMin) / 100.0));
            return palette;
        }

        
       
        /// <summary>
        /// Generate new data
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void timerDataUpdater_Tick(object sender, EventArgs e)
        {
            //Generate new data for bars, and update bar meshes

            m_chart.BeginUpdate();
            
            //Move old data one row towards Z max
            for (int iRow = m_iRowCount - 1; iRow > 0; iRow--)
            {
                for (int iCol = 0; iCol < m_iColumnCount; iCol++)
                {
                    m_barYValues[iCol, iRow] = m_barYValues[iCol, iRow-1];
                }
            }

            //Set new random data for last row 
            for (int iCol = 0; iCol < m_iColumnCount; iCol++)
            {
                m_barYValues[iCol, 0] = RandomizeValue(); 
            }

            //Bar spacing and margins 
            double dBarMinY, dBarMaxY, dBarMinX, dBarMaxX, dBarMinZ, dBarMaxZ; 
            double dBarSizeX = (XRangeMax - XRangeMin)/(double)m_iColumnCount;
            double dBarMarginX = dBarSizeX * 0.2; 
            double dBarSizeZ = (ZRangeMax - ZRangeMin)/(double)m_iRowCount;
            double dBarMarginZ = dBarSizeZ * 0.2; 

            for (int iCol = 0; iCol < m_iColumnCount; iCol++)
            {
                dBarMinX = XRangeMin + (double)iCol * dBarSizeX;
                dBarMaxX = dBarMinX + dBarSizeX; 
                
                for (int iRow = 0; iRow < m_iRowCount; iRow++)
                {
                    dBarMinZ = ZRangeMin + (double)iRow * dBarSizeZ;
                    dBarMaxZ = dBarMinZ + dBarSizeZ;

                    dBarMinY = 0;
                    dBarMaxY = m_barYValues[iCol, iRow]; 

                    //Create bar mesh data from given X, Y, Z values
                    m_bars[iCol, iRow].Data = CreateBarMeshData(dBarMinX + dBarMarginX, dBarMaxX - dBarMarginX,
                        dBarMinY, dBarMaxY, dBarMinZ + dBarMarginZ, dBarMaxZ - dBarMarginZ);
                }
            }

            m_chart.EndUpdate();

        }

        /// <summary>
        /// Randomize a value
        /// </summary>
        /// <returns>Random value</returns>
        double RandomizeValue()
        {
            return (YRangeMax - YRangeMin) / 2.0 + m_rand.NextDouble() * (YRangeMax - YRangeMin) / 2.0; 
        } 


It looks like this.
Scrolling 3D gradient bars example
Scrolling 3D gradient bars example
barmesh3d.jpg (153.54 KiB) Viewed 27926 times
LightningChart Support Team, PT

User avatar
ArctionPasi
Posts: 1367
Joined: Tue Mar 26, 2013 10:57 pm
Location: Finland
Contact:

Re: Set value for BarSeriesValue3D

Post by ArctionPasi » Tue Dec 03, 2013 9:42 pm

pct wrote:In the meanwhile,
I added a LineSeriesCursors to a ViewXY, I can click on the cursor and move it.
I wanted to do the same thing in a PointLineSeries3D , but I cannot click directly on PointLineSeries3D , I just click on the chart, it does not seem possible.

3D objects can't be moved around by mouse. So I'd advise using slider control or equivalent to control that.

But are you sure you want 3D bar view after all? You could create similar gradient 2D bars in ViewXY as well, and use for example ConstantLine. Gradient palette-colored bars you can make for example with AreaSeries or HighLowSeries.
LightningChart Support Team, PT

Post Reply