コード例 #1
0
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            if (InPreSolve)
            {
                // You must place "RunCount == 1" here,
                // because RunCount is reset when "InPreSolve" becomes "false"
                if (RunCount == 1)
                {
                    source = new CancellationTokenSource();
                }

                GH_SpeckleBase item = null;
                DA.GetData(0, ref item);
                var task = Task.Run(() => DoWork(item, DA), source.Token);
                TaskList.Add(task);
                return;
            }

            if (source.IsCancellationRequested || !GetSolveResults(DA, out var data))
            {
                DA.AbortComponentSolution(); // You must abort the `SolveInstance` iteration
                return;
            }

            DA.SetData(0, data);
        }
コード例 #2
0
        public override void GetData(IGH_DataAccess DA, GH_ComponentParamServer Params)
        {
            var speckleObj = new GH_SpeckleBase();

            DA.GetData(0, ref speckleObj);
            DA.GetData(1, ref key);

            @base = speckleObj?.Value;
        }
コード例 #3
0
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            if (InPreSolve)
            {
                DA.DisableGapLogic();
                var speckleObj = new GH_SpeckleBase();
                var key        = "";
                DA.GetData(0, ref speckleObj);
                DA.GetData(1, ref key);
                if (DA.Iteration == 0)
                {
                    Tracker.TrackPageview("objects", "valueByKey");
                }

                var @base = speckleObj?.Value;
                var task  = Task.Run(() => DoWork(@base, key, CancelToken));
                TaskList.Add(task);
                return;
            }

            if (!GetSolveResults(DA, out object value))
            {
                // No result could be obtained.
                return;
            }

            // Report all conversion errors as warnings
            if (Converter != null)
            {
                foreach (var error in Converter.Report.ConversionErrors)
                {
                    AddRuntimeMessage(GH_RuntimeMessageLevel.Warning,
                                      error.Message + ": " + error.InnerException?.Message);
                }
                Converter.Report.ConversionErrors.Clear();
            }

            switch (value)
            {
            case null:
                AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Key not found in object");
                break;

            case IList <object> list:
            {
                var ghGoos = list.Select(GH_Convert.ToGoo).ToList();
                DA.SetDataList(0, ghGoos);
                break;
            }

            default:
                Params.Output[0].Access = GH_ParamAccess.item;
                DA.SetData(0, GH_Convert.ToGoo(value));
                break;
            }
        }
コード例 #4
0
        public override void GetData(IGH_DataAccess DA, GH_ComponentParamServer Params)
        {
            GH_SpeckleBase ghBase = null;

            DA.GetData(0, ref ghBase);
            DA.GetDataList(1, keys);
            DA.GetDataTree(2, out valueTree);
            iteration = DA.Iteration;
            if (ghBase == null)
            {
                return;
            }

            @base = ghBase.Value.ShallowCopy();
        }
コード例 #5
0
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            // Initialize local variables
            var speckleObj = new GH_SpeckleBase();
            var key        = "";

            // Get data from inputs
            if (!DA.GetData(0, ref speckleObj))
            {
                return;
            }
            if (!DA.GetData(1, ref key))
            {
                return;
            }

            var b = speckleObj.Value;

            if (b == null)
            {
                AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Object is not a Speckle object");
                return;
            }
            // Get the value and output.
            var value = b[key] ?? b["@" + key];

            switch (value)
            {
            case null:
                AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Key not found in object: " + key);
                return;

            case List <object> list:
            {
                var converted = list.Select(
                    item => new GH_ObjectWrapper(Utilities.TryConvertItemToNative(item, Converter)));
                DA.SetDataList(0, converted);
                break;
            }

            default:
                DA.SetData(0, new GH_ObjectWrapper(Utilities.TryConvertItemToNative(value, Converter)));
                break;
            }
        }
コード例 #6
0
        private string DoWork(GH_SpeckleBase item, IGH_DataAccess DA)
        {
            if (item?.Value != null)
            {
                try
                {
                    return(Operations.Serialize(item.Value));
                }
                catch (Exception e)
                {
                    AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, e.Message);
                    return(null);
                }
            }

            AddRuntimeMessage(GH_RuntimeMessageLevel.Warning,
                              $"Item at path {{{DA.ParameterTargetPath(0)}}}[{DA.ParameterTargetIndex(0)}] is not a Base object.");
            return(null);
        }
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            if (InPreSolve)
            {
                GH_SpeckleBase @base     = null;
                var            keys      = new List <string>();
                var            valueTree = new GH_Structure <IGH_Goo>();

                DA.GetData(0, ref @base);
                DA.GetDataList(1, keys);
                DA.GetDataTree(2, out valueTree);

                if (DA.Iteration == 0)
                {
                    Tracker.TrackPageview("objects", "extend", "keyValue");
                }

                TaskList.Add(Task.Run(() => DoWork(@base.Value.ShallowCopy(), keys, valueTree)));
                return;
            }

            if (Converter != null)
            {
                foreach (var error in Converter.Report.ConversionErrors)
                {
                    AddRuntimeMessage(GH_RuntimeMessageLevel.Warning,
                                      error.Message + ": " + error.InnerException?.Message);
                }
                Converter.Report.ConversionErrors.Clear();
            }

            if (!GetSolveResults(DA, out var result))
            {
                // Normal mode not supported
                return;
            }

            if (result != null)
            {
                DA.SetData(0, result);
            }
        }
コード例 #8
0
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            if (InPreSolve)
            {
                GH_SpeckleBase ghSpeckleBase = null;
                var            x             = DA.GetData(0, ref ghSpeckleBase);
                var            @base         = ghSpeckleBase?.Value;
                if (!x || @base == null)
                {
                    AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Some input values are not Speckle objects or are null.");
                    OnDisplayExpired(true);
                    return;
                }

                if (DA.Iteration == 0)
                {
                    Tracker.TrackPageview("objects", "expand");
                }

                var task = Task.Run(() => DoWork(@base));
                TaskList.Add(task);
                return;
            }
            if (Converter != null)
            {
                foreach (var error in Converter.Report.ConversionErrors)
                {
                    AddRuntimeMessage(GH_RuntimeMessageLevel.Warning,
                                      error.Message + ": " + error.InnerException?.Message);
                }
                Converter.Report.ConversionErrors.Clear();
            }

            if (!GetSolveResults(DA, out Dictionary <string, object> result))
            {
                // Normal mode not supported
                return;
            }

            if (result != null)
            {
                foreach (var key in result.Keys)
                {
                    var indexOfOutputParam = Params.IndexOfOutputParam(key);

                    if (indexOfOutputParam != -1)
                    {
                        var obj = result[key];
                        switch (obj)
                        {
                        case IList list:
                            DA.SetDataList(indexOfOutputParam, list);
                            break;

                        default:
                            DA.SetDataList(indexOfOutputParam, new List <object> {
                                obj
                            });
                            break;
                        }
                    }
                }
            }
        }
コード例 #9
0
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            if (InPreSolve)
            {
                GH_SpeckleBase speckleBase = null;
                DA.GetData(0, ref speckleBase);
                var @base     = speckleBase.Value.ShallowCopy();
                var inputData = new Dictionary <string, object>();
                if (Params.Input.Count == 1)
                {
                    inputData = null;
                    return;
                }

                var hasErrors   = false;
                var allOptional = Params.Input.FindAll(p => p.Optional).Count == Params.Input.Count;
                if (Params.Input.Count > 1 && allOptional)
                {
                    AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "You cannot set all parameters as optional");
                    inputData = null;
                    return;
                }

                if (DA.Iteration == 0)
                {
                    Tracker.TrackPageview("objects", "extend", "variableinput");
                }

                inputData = new Dictionary <string, object>();
                for (int i = 1; i < Params.Input.Count; i++)
                {
                    var ighParam   = Params.Input[i];
                    var param      = ighParam as GenericAccessParam;
                    var detachable = param.Detachable;
                    var key        = detachable ? "@" + param.NickName : param.NickName;

                    var willOverwrite = @base.GetMembers().ContainsKey(key);
                    var targetIndex   = DA.ParameterTargetIndex(0);
                    var path          = DA.ParameterTargetPath(0);
                    if (willOverwrite)
                    {
                        AddRuntimeMessage(GH_RuntimeMessageLevel.Remark,
                                          $"Key {key} already exists in object at {path}[{targetIndex}], its value will be overwritten");
                    }

                    switch (param.Access)
                    {
                    case GH_ParamAccess.item:
                        object value = null;
                        DA.GetData(i, ref value);
                        if (!param.Optional && value == null)
                        {
                            AddRuntimeMessage(GH_RuntimeMessageLevel.Warning,
                                              $"Non-optional parameter {param.NickName} cannot be null");
                            hasErrors = true;
                        }

                        inputData[key] = value;
                        break;

                    case GH_ParamAccess.list:
                        var values = new List <object>();
                        DA.GetDataList(i, values);
                        if (!param.Optional)
                        {
                            if (values.Count == 0)
                            {
                                AddRuntimeMessage(GH_RuntimeMessageLevel.Warning,
                                                  $"Non-optional parameter {param.NickName} cannot be null or empty.");
                                hasErrors = true;
                            }
                        }

                        inputData[key] = values;
                        break;

                    case GH_ParamAccess.tree:
                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }
                }

                if (hasErrors)
                {
                    inputData = null;
                }

                var task = Task.Run(() => DoWork(@base, inputData));
                TaskList.Add(task);
                return;
            }

            // Report all conversion errors as warnings
            if (Converter != null)
            {
                foreach (var error in Converter.Report.ConversionErrors)
                {
                    AddRuntimeMessage(GH_RuntimeMessageLevel.Warning,
                                      error.Message + ": " + error.InnerException?.Message);
                }
                Converter.Report.ConversionErrors.Clear();
            }

            if (!GetSolveResults(DA, out Base result))
            {
                // Normal mode not supported
                return;
            }

            if (result != null)
            {
                DA.SetData(0, result);
            }
        }
コード例 #10
0
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            // Init local variables
            GH_SpeckleBase ghBase = null;
            var            keys   = new List <string>();

            // Grab data from input
            if (!DA.GetData(0, ref ghBase))
            {
                return;
            }
            if (!DA.GetDataList(1, keys))
            {
                return;
            }
            if (!DA.GetDataTree(2, out GH_Structure <IGH_Goo> valueTree))
            {
                return;
            }

            // TODO: Handle data validation
            var b = ghBase.Value.ShallowCopy();

            CleanDeletedKeys(b, keys);
            // Search for the path coinciding with the current iteration.
            var path = new GH_Path(DA.Iteration);

            if (valueTree.PathExists(path))
            {
                var values = valueTree.get_Branch(path) as List <IGH_Goo>;
                // Input is a list of values. Assign them directly
                if (keys.Count != values?.Count)
                {
                    AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Key and Value lists are not the same length.");
                    return;
                }
                AssignToObject(b, keys, values);
            }
            else if (valueTree.Branches.Count == 1)
            {
                var values = valueTree.Branches[0];
                if (keys.Count != values.Count)
                {
                    AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Key and Value lists are not the same length.");
                    return;
                }
                // Input is just one list, so use it.
                AssignToObject(b, keys, values);
            }
            else
            {
                // Input is a tree, meaning it's values are either lists or trees.
                var subTree = Utilities.GetSubTree(valueTree, path);
                int index   = 0;
                keys.ForEach(key =>
                {
                    var subPath = new GH_Path(index);
                    if (subTree.PathExists(subPath))
                    {
                        // Value is a list, convert and assign.
                        var list = subTree.get_Branch(subPath) as List <IGH_Goo>;
                        if (list?.Count > 0)
                        {
                            var converted = list.Select(goo => Utilities.TryConvertItemToSpeckle(goo, Converter)).ToList();
                            b[key]        = converted;
                        }
                    }
                    else
                    {
                        AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Cannot handle trees yet");
                    }
                    index++;
                });
            }

            lastSolutionKeys = keys;
            DA.SetData(0, new GH_SpeckleBase {
                Value = b
            });
        }