public static void SetGradientBackground(this UIView view, GradientOptions gradientOptions)
        {
            var gradientLayer = new CAGradientLayer
            {
                Frame  = view.Bounds,
                Colors = new CGColor[] { gradientOptions.Colors[0].ToNativeColor().CGColor
                                         , gradientOptions.Colors[1].ToNativeColor().CGColor },
                Locations    = new NSNumber[] { gradientOptions.Positions[0], gradientOptions.Positions[1] },
                StartPoint   = new CGPoint(gradientOptions.StartPoint.X, gradientOptions.StartPoint.Y),
                EndPoint     = new CGPoint(gradientOptions.EndPoint.X, gradientOptions.EndPoint.Y),
                CornerRadius = view.Layer.CornerRadius,
            };

            foreach (var subView in view.Subviews)
            {
                if (subView.Tag == 100)
                {
                    subView.RemoveFromSuperview();
                }
            }

            var gradientView = new UIView {
                Frame = view.Bounds, Tag = 100
            };

            gradientView.Layer.InsertSublayer(gradientLayer, 0);
            var i = view.Subviews.Length;

            view.InsertSubview(gradientView, 0);
        }
Example #2
0
        public static GradientOptions ApplyGradientOptions(this GradientOptions gradientOptions, IEnumerable <double> allValues = null, string defaultGradient = "BlueToRed")
        {
            if (gradientOptions == null)
            {
                BH.Engine.Reflection.Compute.RecordError("Cannot apply gradientOptions because gradientOptions is null or invalid.");
                return(null);
            }

            GradientOptions result = gradientOptions.ShallowClone();

            // Checks if bounds exist or can be automatically set
            if ((double.IsNaN(result.UpperBound) || double.IsNaN(result.LowerBound)) && (allValues == null || allValues.Count() < 1))
            {
                BH.Engine.Reflection.Compute.RecordError("No bounds have been manually set for Gradient, and no values are provided by which to set them.");
                return(result);
            }

            // Optional auto-domain
            if (double.IsNaN(result.LowerBound))
            {
                result.LowerBound = allValues.Min();
            }
            if (double.IsNaN(result.UpperBound))
            {
                result.UpperBound = allValues.Max();
            }

            // Sets a default gradient if none is already set
            if (result.Gradient == null)
            {
                result.Gradient = Library.Query.Match("Gradients", defaultGradient) as Gradient;
                if (result.Gradient == null)
                {
                    Engine.Reflection.Compute.RecordError("Could not find gradient " + defaultGradient + " in the Library, make sure you have BHoM Datasets or create a custom gradient");
                    return(null);
                }
            }

            // Centering Options
            switch (result.GradientCenteringOptions)
            {
            case GradientCenteringOptions.Symmetric:
                result.UpperBound = Math.Max(Math.Abs(result.UpperBound), Math.Abs(result.LowerBound));
                result.LowerBound = -result.UpperBound;
                break;

            case GradientCenteringOptions.Asymmetric:
                result.Gradient = result.Gradient.CenterGradientAsymmetric(result.LowerBound, result.UpperBound);
                break;

            case GradientCenteringOptions.None:
            default:
                break;
            }

            return(result);
        }
Example #3
0
        public static Output <List <List <RenderMesh> >, GradientOptions> DisplayMeshResults <TNode, TFace, TMeshElementResult>(this IEnumerable <IMesh <TNode, TFace> > meshes, IEnumerable <IMeshResult <TMeshElementResult> > meshResults,
                                                                                                                                Type identifier = null, List <string> caseFilter = null, string meshResultDisplay = "", GradientOptions gradientOptions = null)
            where TNode : INode
            where TFace : IFace
            where TMeshElementResult : IMeshElementResult
        {
            if (meshes == null || meshes.Count() < 1)
            {
                Engine.Reflection.Compute.RecordError("No meshes found. Make sure that your meshes are input correctly.");
                return(new Output <List <List <RenderMesh> >, GradientOptions>
                {
                    Item1 = new List <List <RenderMesh> >(),
                    Item2 = gradientOptions
                });
            }
            if (meshResults == null || meshResults.Count() < 1)
            {
                Engine.Reflection.Compute.RecordError("No results found. Make sure that your results are input correctly.");
                return(new Output <List <List <RenderMesh> >, GradientOptions>
                {
                    Item1 = new List <List <RenderMesh> >(),
                    Item2 = gradientOptions
                });
            }

            if (gradientOptions == null)
            {
                gradientOptions = new GradientOptions();
            }

            //Check if no identifier has been provided. If this is the case, identifiers are searched for in the objects
            identifier = meshes.First().FindIdentifier(identifier);

            List <IMesh <TNode, TFace> > meshList = meshes.ToList();

            // Map the MeshResults to Meshes
            List <List <IMeshResult <TMeshElementResult> > > mappedResults = meshList.MapResults(meshResults, "ObjectId", identifier, caseFilter);

            gradientOptions = gradientOptions.ApplyGradientOptions(mappedResults.SelectMany(x => x.SelectMany(y => y.Results.Select(z => z.ResultToValue(meshResultDisplay)))));

            List <List <RenderMesh> > result = new List <List <RenderMesh> >();

            for (int i = 0; i < meshList.Count; i++)
            {
                result.Add(new List <RenderMesh>());
                for (int j = 0; j < mappedResults[i].Count; j++)
                {
                    result[i].Add(meshList[i].DisplayMeshResults(mappedResults[i][j], identifier, meshResultDisplay, gradientOptions.Gradient, gradientOptions.LowerBound, gradientOptions.UpperBound));
                }
            }

            return(new Output <List <List <RenderMesh> >, GradientOptions>
            {
                Item1 = result,
                Item2 = gradientOptions
            });
        }