ArcGIS Pro 3.2 API Reference Guide
ArcGIS.Desktop.Mapping.Voxel Namespace / VoxelVolume Class / GetVolumeSize Method
Example

In This Topic
    GetVolumeSize Method
    In This Topic
    Gets the volume size in voxel coordinates. This method must be called on the MCT. Use QueuedTask.Run.
    Syntax

    Return Value

    The X, Y, and Z volume sizes.
    Exceptions
    ExceptionDescription
    This method or property must be called within the lambda passed to QueuedTask.Run
    Example
    Get the Voxel Volume Dimensions
    //At 2.x - var volume = voxelLayer.GetVolumeSize();
    //var x_max = volume.Item1;
    //var y_max = volume.Item2;
    //var z_max = volume.Item3;
    
    var x_max = voxelLayer.GetVolumes().Max(v => v.GetVolumeSize().X);
    var y_max = voxelLayer.GetVolumes().Max(v => v.GetVolumeSize().Y);
    var z_max = voxelLayer.GetVolumes().Max(v => v.GetVolumeSize().Z);
    
    //Get the dimensions of just one volume
    var dimensions = voxelLayer.GetVolumes().FirstOrDefault();
    //Get the dimensions of the volume associated with the selected variable
    var dimensions2 = voxelLayer.SelectedVariableProfile.Volume.GetVolumeSize();
    
    Create a Slice
    //var voxelLayer = ... ;
    //Must be on the QueuedTask.Run()
    
    if (voxelLayer.Visualization != VoxelVisualization.Volume)
        voxelLayer.SetVisualization(VoxelVisualization.Volume);
    voxelLayer.SetSliceContainerExpanded(true);
    voxelLayer.SetSliceContainerVisibility(true);
    
    //To stop the Voxel Exploration Dockpane activating use:
    voxelLayer.AutoShowExploreDockPane = false;
    //This is useful if u have your own dockpane currently activated...
    
    //At 2.x - var volumeSize = voxelLayer.GetVolumeSize();
    
    //Use the SelectedVariableProfile to get the slices currently in the TOC
    //via its associated volume
    var volume = voxelLayer.SelectedVariableProfile.Volume;
    var volumeSize = volume.GetVolumeSize();
    
    //Orientation 90 degrees (West), Tilt 0.0 (vertical)
    //Convert to a normal
    var normal = voxelLayer.GetNormal(90, 0.0);
    
    //Create the slice at the voxel mid-point. VoxelPosition
    //is specified in voxel-space coordinates
    
    //At 2.x - 
    //voxelLayer.CreateSlice(new SliceDefinition()
    //{
    //    Name = "Middle Slice",
    //    VoxelPosition = new Coordinate3D(volume.Item1 / 2, volume.Item2 / 2, volume.Item3 / 2),
    //    Normal = normal,
    //    IsVisible = true
    //});
    
    //Create the slice on the respective volume
    volume.CreateSlice(new SliceDefinition()
    {
        Name = "Middle Slice",
        VoxelPosition = new Coordinate3D(volumeSize.X / 2, volumeSize.Y / 2, volumeSize.Z / 2),
        Normal = normal,
        IsVisible = true
    });
    
    //reset if needed...
    voxelLayer.AutoShowExploreDockPane = true;
    
    Create a Section at the Voxel MidPoint
    //var voxelLayer = ... ;
    //Must be on the QueuedTask.Run()
    
    if (voxelLayer.Visualization != VoxelVisualization.Surface)
        voxelLayer.SetVisualization(VoxelVisualization.Surface);
    voxelLayer.SetSectionContainerExpanded(true);
    voxelLayer.SetSectionContainerVisibility(true);
    
    //To stop the Voxel Exploration Dockpane activating use:
    voxelLayer.AutoShowExploreDockPane = false;
    //This is useful if u have your own dockpane currently activated...
    //Normally, it would be set in your dockpane
    
    //Create a section that cuts the volume in two on the vertical plane
    
    //At 2.x - var volume = voxelLayer.GetVolumeSize();
    
    //Use the SelectedVariableProfile to get the sections
    //via its associated volume
    var volume = voxelLayer.SelectedVariableProfile.Volume;
    var volumeSize = volume.GetVolumeSize();
    
    //Orientation 90 degrees (due West), Tilt 0 degrees
    var normal = voxelLayer.GetNormal(90, 0.0);
    
    //Position must be specified in voxel space
    
    //At 2.x -
    //voxelLayer.CreateSection(new SectionDefinition()
    //{
    //    Name = "Middle Section",
    //    VoxelPosition = new Coordinate3D(volume.Item1 / 2, volume.Item2 / 2, volume.Item3 / 2),
    //    Normal = normal,
    //    IsVisible = true
    //});
    volume.CreateSection(new SectionDefinition()
    {
        Name = "Middle Section",
        VoxelPosition = new Coordinate3D(volumeSize.X / 2, volumeSize.Y / 2, volumeSize.Z / 2),
        Normal = normal,
        IsVisible = true
    });
    
    //reset if needed...Normally this might be when your dockpane
    //was de-activated (ie "closed")
    voxelLayer.AutoShowExploreDockPane = true;
    
    Create a Horizontal Section
    //var voxelLayer = ... ;
    //Must be on the QueuedTask.Run()
    
    if (voxelLayer.Visualization != VoxelVisualization.Surface)
        voxelLayer.SetVisualization(VoxelVisualization.Surface);
    voxelLayer.SetSectionContainerExpanded(true);
    voxelLayer.SetSectionContainerVisibility(true);
    
    //Create a section that cuts the volume in two on the horizontal plane
                
    //At 2.x - var volumeSize = voxelLayer.GetVolumeSize();
    
    //Use the SelectedVariableProfile to get the sections
    //via its associated volume
    var volume = voxelLayer.SelectedVariableProfile.Volume;
    var volumeSize = volume.GetVolumeSize();
    
    //Or use normal (0, 0, 1) or (0, 0, -1)...
    var horz_section = SectionDefinition.CreateHorizontalSectionDefinition();
    
    horz_section.Name = "Horizontal Section";
    horz_section.IsVisible = true;
    horz_section.VoxelPosition = new Coordinate3D(volumeSize.X / 2, volumeSize.Y / 2, volumeSize.Z / 2);
    
    //At 2.x - voxelLayer.CreateSection(horz_section);
    volume.CreateSection(horz_section);
    
    Create Sections in a Circle Pattern
    //var voxelLayer = ... ;
    //Must be on the QueuedTask.Run()
    
    if (voxelLayer.Visualization != VoxelVisualization.Surface)
        voxelLayer.SetVisualization(VoxelVisualization.Surface);
    voxelLayer.SetSectionContainerExpanded(true);
    voxelLayer.SetSectionContainerVisibility(true);
    
    //At 2.x - var volumeSize = voxelLayer.GetVolumeSize();
    
    //Use the SelectedVariableProfile to get the sections
    //via its associated volume
    var volume = voxelLayer.SelectedVariableProfile.Volume;
    var volumeSize = volume.GetVolumeSize();
    
    //180 degrees orientation is due South. 90 degrees orientation is due west.
    var south = 180.0;
    var num_sections = 12;
    var spacing = 1 / (double)num_sections;
    
    //Create a section every nth degree of orientation. Each section
    //bisects the middle of the voxel
    for (int s = 0; s < num_sections; s++)
    {
        var orientation = south * (s * spacing);
        //At 2.x -
        //voxelLayer.CreateSection(new SectionDefinition()
        //{
        //    Name = $"Circle {s + 1}",
        //    VoxelPosition = new Coordinate3D(volumeSize.Item1 / 2, volumeSize.Item2 / 2, volumeSize.Item3 / 2),
        //    Normal = voxelLayer.GetNormal(orientation, 0.0),
        //    IsVisible = true
        //});
    
        volume.CreateSection(new SectionDefinition()
        {
            Name = $"Circle {s + 1}",
            VoxelPosition = new Coordinate3D(volumeSize.X / 2, volumeSize.Y / 2, volumeSize.Z / 2),
            Normal = voxelLayer.GetNormal(orientation, 0.0),
            IsVisible = true
        });
    }
    
    Create Sections that Bisect the Voxel
    //var voxelLayer = ... ;
    //Must be on the QueuedTask.Run()
    
    if (voxelLayer.Visualization != VoxelVisualization.Surface)
        voxelLayer.SetVisualization(VoxelVisualization.Surface);
    voxelLayer.SetSectionContainerExpanded(true);
    voxelLayer.SetSectionContainerVisibility(true);
    
    //At 2.x - var volumeSize = voxelLayer.GetVolumeSize();
    
    //Use the SelectedVariableProfile to get the sections
    //via its associated volume
    var volume = voxelLayer.SelectedVariableProfile.Volume;
    var volumeSize = volume.GetVolumeSize();
    
    //Make three Normals - each is a Unit Vector (x, y, z)
    var north_south = new Coordinate3D(1, 0, 0);
    var east_west = new Coordinate3D(0, 1, 0);
    var horizontal = new Coordinate3D(0, 0, 1);
    
    int n = 0;
    //The two verticals bisect the x,y plane. The horizontal normal bisects
    //the Z plane.
    foreach (var normal in new List<Coordinate3D> { north_south, east_west, horizontal })
    {
        //At 2.x -
        //voxelLayer.CreateSection(new SectionDefinition()
        //{
        //    Name = $"Cross {++n}",
        //    VoxelPosition = new Coordinate3D(volumeSize.Item1 / 2, volumeSize.Item2 / 2, volumeSize.Item3 / 2),
        //    Normal = normal,
        //    IsVisible = true
        //});
    
        volume.CreateSection(new SectionDefinition()
        {
            Name = $"Cross {++n}",
            VoxelPosition = new Coordinate3D(volumeSize.X / 2, volumeSize.Y / 2, volumeSize.Z / 2),
            Normal = normal,
            IsVisible = true
        });
    }
    
    Create Sections Diagonally across the Voxel
    //var voxelLayer = ... ;
    //Must be on the QueuedTask.Run()
    
    if (voxelLayer.Visualization != VoxelVisualization.Surface)
        voxelLayer.SetVisualization(VoxelVisualization.Surface);
    voxelLayer.SetSectionContainerExpanded(true);
    voxelLayer.SetSectionContainerVisibility(true);
    
    //At 2.x - var volumeSize = voxelLayer.GetVolumeSize();
    
    //Use the SelectedVariableProfile to get the sections
    //via its associated volume
    var volume = voxelLayer.SelectedVariableProfile.Volume;
    var volumeSize = volume.GetVolumeSize();
    
    //make a diagonal across the voxel
    var voxel_pos = new Coordinate3D(0, 0, volumeSize.Z);
    var voxel_pos_ur = new Coordinate3D(volumeSize.X, volumeSize.Y, volumeSize.Z);
    
    var lineBuilder = new LineBuilderEx(voxel_pos, voxel_pos_ur, null);
    var diagonal = PolylineBuilderEx.CreatePolyline(lineBuilder.ToSegment());
    
    var num_sections = 12;
    var spacing = 1 / (double)num_sections;
    
    //change as needed
    var orientation = 20.0; //(approx NNW)
    var tilt = -15.0;
    
    var normal = voxelLayer.GetNormal(orientation, tilt);
    
    for (int s = 0; s < num_sections; s++)
    {
        Coordinate2D end_pt = new Coordinate2D(0, 0);
        if (s > 0)
        {
            //position each section evenly spaced along the diagonal
            var segments = new List<Segment>() as ICollection<Segment>;
            var part = GeometryEngine.Instance.GetSubCurve3D(
                    diagonal, 0.0, s * spacing, AsRatioOrLength.AsRatio);
            part.GetAllSegments(ref segments);
            end_pt = segments.First().EndCoordinate;
        }
    
        //At 2.x -
        //voxelLayer.CreateSection(new SectionDefinition()
        //{
        //    Name = $"Diagonal {s + 1}",
        //    VoxelPosition = new Coordinate3D(end_pt.X, end_pt.Y, volumeSize.Item3),
        //    Normal = normal,
        //    IsVisible = true
        //});
    
        volume.CreateSection(new SectionDefinition()
        {
            Name = $"Diagonal {s + 1}",
            VoxelPosition = new Coordinate3D(end_pt.X, end_pt.Y, volumeSize.Z),
            Normal = normal,
            IsVisible = true
        });
    }
    
    Requirements

    Target Platforms: Windows 11, Windows 10

    ArcGIS Pro version: 3 or higher.
    See Also