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); }
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; }
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; } }
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(); }
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; } }
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); } }
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; } } } } }
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); } }
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 }); }