/// <summary>
        /// This is the method that actually does the work.
        /// </summary>
        /// <param name="DA">The DA object can be used to retrieve data from input parameters and
        /// to store data in output parameters.</param>
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            Mesh   M = new Mesh();
            double S = 0.0;
            int    G = 2;

            // Load input values of a mesh and size
            if (!DA.GetData(0, ref M))
            {
                return;
            }
            DA.GetData(1, ref S);
            DA.GetData(2, ref G);

            if (!(M is Mesh))
            {
                AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "M must be Mesh.");
            }
            ;

            Voxels voxels = Voxelizer.Run(M, S);

            // ocree
            Octree tree = new Octree(voxels.min_x, voxels.max_x, voxels.min_y, voxels.max_y, voxels.min_z, voxels.max_z, G);

            foreach (Point3d p in voxels.points)
            {
                tree.Add(p);
            }

            voxels.voxels.Clear();
            voxels.points.Clear();

            foreach (OctreeNode node in tree.getChildren())
            {
                Point3d center = node.getCenter();

                double size = node.getWidth();

                Plane grid_plane = new Plane(center, Plane.WorldXY.ZAxis);

                Interval interval = new Interval(-size, size);

                Box voxel = new Box(grid_plane, interval, interval, interval);

                voxels.voxels.Add(voxel);
                voxels.points.Add(center);
            }

            // assign the output values
            DA.SetDataList(0, voxels.voxels);
            DA.SetDataList(1, voxels.points);
        }
        /// <summary>
        /// This is the method that actually does the work.
        /// </summary>
        /// <param name="DA">The DA object can be used to retrieve data from input parameters and
        /// to store data in output parameters.</param>
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            Mesh   M = new Mesh();
            double S = 0.0;

            // Load input values of a mesh and size
            if (!DA.GetData(0, ref M))
            {
                return;
            }
            DA.GetData(1, ref S);

            if (!(M is Mesh))
            {
                AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "M must be Mesh.");
            }
            ;

            Voxels voxels = Voxelizer.Run(M, S);

            // assign the output values
            DA.SetDataList(0, voxels.voxels);
            DA.SetDataList(1, voxels.points);
        }