public static SpeckleObject ToSpeckle(this GSA2DLoad dummyObject)
        {
            var newLines = ToSpeckleBase <GSA2DLoad>();
            var typeName = dummyObject.GetType().Name;
            var loads    = new List <GSA2DLoad>();
            var elements = Initialiser.GsaKit.GSASenderObjects.Get <GSA2DElement>();
            var members  = Initialiser.GsaKit.GSASenderObjects.Get <GSA2DMember>();
            var loadLock = new object();
            var keyword  = dummyObject.GetGSAKeyword();

            foreach (var k in newLines.Keys)
            {
                var p           = newLines[k];
                var loadSubList = new List <GSA2DLoad>();

                // Placeholder load object to get list of elements and load values
                // Need to transform to axis so one load definition may be transformed to many
                var initLoad = new GSA2DLoad()
                {
                    GWACommand = p, GSAId = k
                };
                try
                {
                    initLoad.ParseGWACommand(elements, members);
                }
                catch (Exception ex)
                {
                    Initialiser.AppResources.Messenger.Message(MessageIntent.TechnicalLog, MessageLevel.Error, ex, "Keyword=" + keyword, "Index=" + k);
                }

                lock (loadLock)
                {
                    loads.Add(initLoad);
                }
            }

            if (loads.Count() > 0)
            {
                Initialiser.GsaKit.GSASenderObjects.AddRange(loads);
            }

            return((loads.Count() > 0) ? new SpeckleObject() : new SpeckleNull());
        }
        public static SpeckleObject ToSpeckle(this GSA2DLoad dummyObject)
        {
            var newLines = ToSpeckleBase <GSA2DLoad>();

            var loads    = new List <GSA2DLoad>();
            var elements = (Initialiser.Settings.TargetLayer == GSATargetLayer.Analysis) ? Initialiser.GSASenderObjects[typeof(GSA2DElement)].Cast <GSA2DElement>().ToList() : new List <GSA2DElement>();
            var members  = (Initialiser.Settings.TargetLayer == GSATargetLayer.Design) ? Initialiser.GSASenderObjects[typeof(GSA2DMember)].Cast <GSA2DMember>().ToList() : new List <GSA2DMember>();

            foreach (var p in newLines.Values)
            {
                var loadSubList = new List <GSA2DLoad>();

                // Placeholder load object to get list of elements and load values
                // Need to transform to axis so one load definition may be transformed to many
                var initLoad = new GSA2DLoad()
                {
                    GWACommand = p
                };
                initLoad.ParseGWACommand(elements, members);

                if (Initialiser.Settings.TargetLayer == GSATargetLayer.Analysis)
                {
                    // Create load for each element applied
                    foreach (string nRef in initLoad.Value.ElementRefs)
                    {
                        var load = new GSA2DLoad
                        {
                            GWACommand    = initLoad.GWACommand,
                            SubGWACommand = new List <string>(initLoad.SubGWACommand)
                        };
                        load.Value.Name        = initLoad.Value.Name;
                        load.Value.LoadCaseRef = initLoad.Value.LoadCaseRef;

                        // Transform load to defined axis
                        var            elem     = elements.Where(e => e.Value.ApplicationId == nRef).First();
                        StructuralAxis loadAxis = HelperClass.Parse2DAxis(elem.Value.Vertices.ToArray(), 0, load.Axis != 0); // Assumes if not global, local
                        load.Value.Loading = initLoad.Value.Loading;

                        // Perform projection
                        if (load.Projected)
                        {
                            load.Value.Loading.Value[0] = 0;
                            load.Value.Loading.Value[1] = 0;
                        }
                        load.Value.Loading.TransformOntoAxis(loadAxis);

                        // If the loading already exists, add element ref to list
                        var match = loadSubList.Count() > 0 ? loadSubList.Where(l => l.Value.Loading.Equals(load.Value.Loading)).First() : null;
                        if (match != null)
                        {
                            match.Value.ElementRefs.Add(nRef);
                        }
                        else
                        {
                            load.Value.ElementRefs = new List <string>()
                            {
                                nRef
                            };
                            loadSubList.Add(load);
                        }
                    }
                }
                else if (Initialiser.Settings.TargetLayer == GSATargetLayer.Design)
                {
                    // Create load for each element applied
                    foreach (string nRef in initLoad.Value.ElementRefs)
                    {
                        var load = new GSA2DLoad
                        {
                            GWACommand    = initLoad.GWACommand,
                            SubGWACommand = new List <string>(initLoad.SubGWACommand),
                        };
                        load.Value.Name        = initLoad.Value.Name;
                        load.Value.LoadCaseRef = initLoad.Value.LoadCaseRef;

                        // Transform load to defined axis
                        var            memb     = members.Where(e => e.Value.ApplicationId == nRef).First();
                        StructuralAxis loadAxis = HelperClass.Parse2DAxis(memb.Value.Vertices.ToArray(), 0, load.Axis != 0); // Assumes if not global, local
                        load.Value.Loading = initLoad.Value.Loading;
                        load.Value.Loading.TransformOntoAxis(loadAxis);

                        // Perform projection
                        if (load.Projected)
                        {
                            load.Value.Loading.Value[0] = 0;
                            load.Value.Loading.Value[1] = 0;
                        }
                        load.Value.Loading.TransformOntoAxis(loadAxis);

                        // If the loading already exists, add element ref to list
                        var match = loadSubList.Count() > 0 ? loadSubList.Where(l => (l.Value.Loading.Value as List <double>).SequenceEqual(load.Value.Loading.Value as List <double>)).First() : null;
                        if (match != null)
                        {
                            match.Value.ElementRefs.Add(nRef);
                        }
                        else
                        {
                            load.Value.ElementRefs = new List <string>()
                            {
                                nRef
                            };
                            loadSubList.Add(load);
                        }
                    }
                }

                loads.AddRange(loadSubList);
            }

            Initialiser.GSASenderObjects[typeof(GSA2DLoad)].AddRange(loads);

            return((loads.Count() > 0) ? new SpeckleObject() : new SpeckleNull());
        }