protected bool ExtractOutputs(IAction action, IGH_DataAccess DA, ExecutionInfo exInfo)
        {
            IList <PropertyInfo> outputs = ActionBase.ExtractOutputParameters(ActionType);

            foreach (PropertyInfo pInfo in outputs)
            {
                object outputData = pInfo.GetValue(action, null);
                if (PreviewLayer != null)
                {
                    if (outputData is ICollection) //TODO: This would currently catch mesh faces and other similar objects...
                    {
                        PreviewLayer.TryRegisterAll((ICollection)outputData);
                    }
                    else
                    {
                        PreviewLayer.TryRegister(outputData);
                    }
                }
                outputData = FormatForOutput(outputData, exInfo);
                if (outputData is IList)
                {
                    DA.SetDataList(pInfo.Name, (IEnumerable)outputData);
                }
                else
                {
                    DA.SetData(pInfo.Name, outputData);
                }
            }
            return(true);
        }
        /// <summary>
        /// Registers all the output parameters for this component.
        /// </summary>
        protected override void RegisterOutputParams(GH_Component.GH_OutputParamManager pManager)
        {
            NicknameConverter    nC      = new NicknameConverter();
            IList <PropertyInfo> outputs = ActionBase.ExtractOutputParameters(ActionType);

            foreach (PropertyInfo pInfo in outputs)
            {
                Type pType = pInfo.PropertyType;
                ActionOutputAttribute outputAtt = ActionOutputAttribute.ExtractFrom(pInfo);
                if (outputAtt != null)
                {
                    string name        = pInfo.Name;
                    string nickname    = string.IsNullOrEmpty(outputAtt.ShortName) ? nC.Convert(pInfo.Name) : outputAtt.ShortName;
                    string description = outputAtt.CapitalisedDescription;
                    if (pType == typeof(double) || pType == typeof(Angle))
                    {
                        pManager.AddNumberParameter(name, nickname, description, GH_ParamAccess.item);
                    }
                    else if (pType == typeof(int))
                    {
                        pManager.AddIntegerParameter(name, nickname, description, GH_ParamAccess.item);
                    }
                    else if (pType == typeof(string))
                    {
                        pManager.AddTextParameter(name, nickname, description, GH_ParamAccess.item);
                    }
                    else if (pType == typeof(bool))
                    {
                        pManager.AddBooleanParameter(name, nickname, description, GH_ParamAccess.item);
                    }
                    else if (pType == typeof(Vector))
                    {
                        pManager.AddPointParameter(name, nickname, description, GH_ParamAccess.item);
                    }
                    else if (pType.IsAssignableFrom(typeof(Plane)))
                    {
                        pManager.AddPlaneParameter(name, nickname, description, GH_ParamAccess.item);
                    }
                    else if (typeof(Curve).IsAssignableFrom(pType))
                    {
                        pManager.AddCurveParameter(name, nickname, description, GH_ParamAccess.item);
                    }
                    else if (typeof(CurveCollection).IsAssignableFrom(pType))
                    {
                        pManager.AddCurveParameter(name, nickname, description, GH_ParamAccess.list);
                    }
                    else if (pType == typeof(LinearElement))
                    {
                        IGH_Param param = new LinearElementParam();
                        pManager.AddParameter(param, name, nickname, description, GH_ParamAccess.item);
                    }
                    else if (pType == typeof(LinearElementCollection))
                    {
                        IGH_Param param = new LinearElementParam();
                        pManager.AddParameter(param, name, nickname, description, GH_ParamAccess.list);
                    }
                    else if (pType == typeof(Element))
                    {
                        IGH_Param param = new ElementParam();
                        pManager.AddParameter(param, name, nickname, description, GH_ParamAccess.item);
                    }
                    else if (pType == typeof(ElementCollection))
                    {
                        IGH_Param param = new ElementParam();
                        pManager.AddParameter(param, name, nickname, description, GH_ParamAccess.list);
                    }
                    else if (pType == typeof(Node))
                    {
                        IGH_Param param = new NodeParam();
                        pManager.AddParameter(param, name, nickname, description, GH_ParamAccess.item);
                    }
                    else if (pType == typeof(NodeCollection))
                    {
                        IGH_Param param = new NodeParam();
                        pManager.AddParameter(param, name, nickname, description, GH_ParamAccess.list);
                    }
                    else if (typeof(Nucleus.Model.Material).IsAssignableFrom(pType))
                    {
                        IGH_Param param = new MaterialParam();
                        pManager.AddParameter(param, name, nickname, description, GH_ParamAccess.item);
                    }
                    else if (typeof(MaterialCollection).IsAssignableFrom(pType))
                    {
                        IGH_Param param = new MaterialParam();
                        pManager.AddParameter(param, name, nickname, description, GH_ParamAccess.list);
                    }
                    else if (typeof(SectionFamily).IsAssignableFrom(pType))
                    {
                        IGH_Param param = new SectionFamilyParam();
                        pManager.AddParameter(param, name, nickname, description, GH_ParamAccess.item);
                    }
                    else if (pType == typeof(Bool6D))
                    {
                        IGH_Param param = new Bool6DParam();
                        pManager.AddParameter(param, name, nickname, description, GH_ParamAccess.item);
                    }
                    else if (pType == typeof(VertexGeometry))
                    {
                        pManager.AddGeometryParameter(name, nickname, description, GH_ParamAccess.item);
                    }
                    else if (pType == typeof(VertexGeometryCollection))
                    {
                        pManager.AddGeometryParameter(name, nickname, description, GH_ParamAccess.list);
                    }
                    else
                    {
                        pManager.AddGenericParameter(pInfo.Name, nC.Convert(pInfo.Name), outputAtt.CapitalisedDescription, GH_ParamAccess.item);
                    }
                    //TODO
                }
            }
        }