public static SpeckleObject ToSpeckle(this GsaLoadBeam dummyObject) { var newLines = Initialiser.AppResources.Cache.GetGwaToSerialise(dummyObject.Keyword); //This will return ALL load beams, which (in the future) may not be UDLs //Also in the future, the cache will return Gsa schema objects, not just GWA that needs to be converted into Gsa schema objects var allGsaLoadBeams = GwaToGsaLoadBeams(newLines); allGsaLoadBeams = allGsaLoadBeams.Where(l => l.Index.ValidNonZero()).ToList(); var gsaLoadsByType = allGsaLoadBeams.GroupBy(l => l.GetType()).ToDictionary(g => g.Key, g => g.ToList()); var keyword = GsaRecord.GetKeyword <GsaLoadBeamUdl>(); var axisKeyword = GsaRecord.GetKeyword <GsaAxis>(); var loadCaseKeyword = GsaRecord.GetKeyword <GsaLoadCase>(); var entityKeyword = (Initialiser.AppResources.Settings.TargetLayer == SpeckleGSAInterfaces.GSATargetLayer.Design) ? GsaRecord.GetKeyword <GsaMemb>() : GsaRecord.GetKeyword <GsaEl>(); //Just to UDL for now var gsaLoads = gsaLoadsByType[typeof(GsaLoadBeamUdl)].Cast <GsaLoadBeamUdl>().ToList(); var structural1DLoads = new List <Structural1DLoad>(); //The 1D loads are split into two groups: //1. Those which are grouped by Application ID - n:1 ratio (where n <= 6) between GSA objects and Speckle objects //2. Those which are sent out individually - 1:1 ratio between GSA objects and Speckle objects //To avoid complication regarding merging with existing objects: if a 1D load was previously received from Speckle (i.e. it has an application ID) //and it was manually changed from GLOBAL to referencing an axis, then ignore the application ID when sending out (i.e. lump it with group #2) var group1 = gsaLoads.Where(l => !string.IsNullOrEmpty(l.ApplicationId) && l.AxisRefType == LoadBeamAxisRefType.Global); var group2 = gsaLoads.Except(group1); Add1dLoadsWithAppId(entityKeyword, loadCaseKeyword, group1, ref structural1DLoads); Add1dLoadsWithoutAppId(keyword, axisKeyword, entityKeyword, loadCaseKeyword, group2, ref structural1DLoads); var loads = structural1DLoads.Select(sl => new GSA1DLoad() { Value = sl }).Cast <GSA1DLoad>().ToList(); if (loads.Count() > 0) { Initialiser.GsaKit.GSASenderObjects.AddRange(loads); } return((loads.Count() > 0) ? new SpeckleObject() : new SpeckleNull()); }
private static List <GsaLoadBeam> GwaToGsaLoadBeams(Dictionary <int, string> newLines) { var instanceInfo = new Dictionary <GwaKeyword, Type>() { { GwaKeyword.LOAD_BEAM_UDL, typeof(GsaLoadBeamUdl) }, { GwaKeyword.LOAD_BEAM_LINE, typeof(GsaLoadBeamLine) }, { GwaKeyword.LOAD_BEAM_POINT, typeof(GsaLoadBeamPoint) }, { GwaKeyword.LOAD_BEAM_PATCH, typeof(GsaLoadBeamPatch) }, { GwaKeyword.LOAD_BEAM_TRILIN, typeof(GsaLoadBeamPatchTrilin) } }; var schemaObjs = new List <GsaLoadBeam>(); foreach (var index in newLines.Keys) { GsaLoadBeam obj = null; foreach (var kw in instanceInfo.Keys) { if (newLines[index].Contains(kw.ToString())) { obj = (GsaLoadBeam)Activator.CreateInstance(instanceInfo[kw]); break; } } if (obj != null) { obj.Index = index; if (obj.FromGwa(newLines[index])) { schemaObjs.Add(obj); } } } return(schemaObjs); }