public static string ToNative(this Structural0DSpring spring) { var group = Initialiser.Cache.ResolveIndex(typeof(GSA0DSpring).GetGSAKeyword(), spring.ApplicationId); return(new GSA0DSpring() { Value = spring }.SetGWACommand(Initialiser.Interface, group)); }
public static string ToNative(this Structural0DSpring spring) { if (string.IsNullOrEmpty(spring.ApplicationId) || spring.Value == null || string.IsNullOrEmpty(spring.PropertyRef)) { return(""); } return(Helper.ToNativeTryCatch(spring, () => { var propIndex = Initialiser.AppResources.Cache.LookupIndex(GsaRecord.GetKeyword <GsaPropSpr>(), spring.PropertyRef); if (propIndex == null) { //TO DO : add error message return ""; } var keyword = GsaRecord.GetKeyword <GsaNode>(); var streamId = Initialiser.AppResources.Cache.LookupStream(spring.ApplicationId); var index = Initialiser.AppResources.Proxy.NodeAt(spring.Value[0], spring.Value[1], spring.Value[2], Initialiser.AppResources.Settings.CoincidentNodeAllowance); var existingGwa = Initialiser.AppResources.Cache.GetGwa(keyword, index); GsaNode gsaNode; if (existingGwa == null || existingGwa.Count() == 0 || string.IsNullOrEmpty(existingGwa.First())) { gsaNode = new GsaNode() { Index = index, ApplicationId = spring.ApplicationId, Name = spring.Name, StreamId = streamId, X = spring.Value[0], Y = spring.Value[1], Z = spring.Value[2], SpringPropertyIndex = propIndex }; } else { gsaNode = new GsaNode(); if (!gsaNode.FromGwa(existingGwa.First())) { //TO DO: add error mesage return ""; } gsaNode.SpringPropertyIndex = propIndex; } //Yes, the Axis member of the Speckle StructuralSpringProperty object is not used if (gsaNode.Gwa(out var gwaLines, false)) { Initialiser.AppResources.Cache.Upsert(keyword, gsaNode.Index.Value, gwaLines.First(), streamId, gsaNode.ApplicationId, GsaRecord.GetGwaSetCommandType <GsaNode>()); } return ""; }
//Sending public void ParseGWACommand(List <GSANode> nodes) { if (this.GWACommand == null) { return; } var obj = new Structural0DSpring(); var pieces = this.GWACommand.ListSplit("\t"); var counter = 1; // Skip identifier this.GSAId = Convert.ToInt32(pieces[counter++]); obj.ApplicationId = HelperClass.GetApplicationId(this.GetGSAKeyword(), this.GSAId); obj.Name = pieces[counter++].Trim(new char[] { '"' }); counter++; // Colour counter++; // Type obj.PropertyRef = HelperClass.GetApplicationId(typeof(GSASpringProperty).GetGSAKeyword(), Convert.ToInt32(pieces[counter++])); counter++; // Group obj.Value = new List <double>(); var key = pieces[counter++]; if (int.TryParse(key, out int nodeIndex)) { if (nodeIndex > 0) { var node = nodes.Where(n => n.GSAId == Convert.ToInt32(key)).FirstOrDefault(); obj.Value.AddRange(node.Value.Value); this.SubGWACommand.Add(node.GWACommand); } } var orientationNodeRef = pieces[counter++]; var rotationAngle = Convert.ToDouble(pieces[counter++]); //counter++; // Action // TODO: EL.4 SUPPORT counter++; // Dummy if (counter < pieces.Length) { Member = pieces[counter++]; } this.Value = obj; }
public static SpeckleObject ToSpeckle(this GsaNode dummyObject) { var nodeKw = GsaRecord.GetKeyword<GsaNode>(); var springKw = GsaRecord.GetKeyword<GsaPropSpr>(); var massKw = GsaRecord.GetKeyword<GsaPropMass>(); var loadTaskKw = GsaRecord.GetKeyword<GsaLoadCase>(); var comboKw = GsaRecord.GetKeyword<GsaCombination>(); var newNodeLines = Initialiser.AppResources.Cache.GetGwaToSerialise(nodeKw); var sendResults = GetNodeResultSettings(out var embedResults, out var resultTypes, out var resultCases); if (sendResults) { Initialiser.AppResources.Proxy.LoadResults(ResultGroup.Node, out int numErrorRows, resultCases, newNodeLines.Keys.ToList()); if (numErrorRows > 0) { Initialiser.AppResources.Messenger.Message(MessageIntent.Display, MessageLevel.Error, "Unable to process " + numErrorRows + " rows of node results"); Initialiser.AppResources.Messenger.Message(MessageIntent.TechnicalLog, MessageLevel.Error, "Unable to process " + numErrorRows + " rows of node results"); } } //This method produces two types of SpeckleStructural objects var structuralNodes = new List<StructuralNode>(); var structural0dSprings = new List<Structural0DSpring>(); int numToBeSent = 0; #if DEBUG foreach (var i in newNodeLines.Keys) #else Parallel.ForEach(newNodeLines.Keys, i => #endif { GsaNode gsaNode = null; var objNode = Helper.ToSpeckleTryCatch(nodeKw, i, () => { gsaNode = new GsaNode(); if (gsaNode.FromGwa(newNodeLines[i])) { var structuralNode = new StructuralNode() { Name = gsaNode.Name, ApplicationId = SpeckleStructuralGSA.Helper.GetApplicationId(nodeKw, i), Value = new List<double>() { gsaNode.X, gsaNode.Y, gsaNode.Z }, Restraint = GetRestraint(gsaNode) }; if (gsaNode.MeshSize.HasValue && gsaNode.MeshSize.Value > 0) { structuralNode.GSALocalMeshSize = gsaNode.MeshSize.Value; } if (gsaNode.MassPropertyIndex.HasValue && gsaNode.MassPropertyIndex.Value > 0) { var massGwas = Initialiser.AppResources.Cache.GetGwa(massKw, gsaNode.MassPropertyIndex.Value); if (massGwas != null && massGwas.Count() > 0 && !string.IsNullOrEmpty(massGwas.First())) { var gsaPropMass = new GsaPropMass(); if (gsaPropMass.FromGwa(massGwas.First()) && gsaPropMass.Mass > 0) { structuralNode.Mass = gsaPropMass.Mass; } } } return structuralNode; } return new SpeckleNull(); }); if (objNode !=null && !(objNode is SpeckleNull)) { var structuralNode = (StructuralNode)objNode; GSANodeResult gsaNodeResult = null; //Embed results if appropriate as the last thing to do to the new Speckle object before being added to the collection of objects to be sent if (sendResults) { if (Initialiser.AppResources.Proxy.GetResultHierarchy(ResultGroup.Node, i, out var results) && results != null) { var orderedLoadCases = results.Keys.OrderBy(k => k).ToList(); if (embedResults) { foreach (var loadCase in orderedLoadCases) { if (!Helper.FilterResults(results[loadCase], out Dictionary<string, object> sendableResults)) { continue; } var nodeResult = new StructuralNodeResult() { IsGlobal = !Initialiser.AppResources.Settings.ResultInLocalAxis, TargetRef = structuralNode.ApplicationId, Value = sendableResults }; var loadCaseRef = Helper.GsaCaseToRef(loadCase, loadTaskKw, comboKw); if (!string.IsNullOrEmpty(loadCaseRef)) { //nodeResult.LoadCaseRef = loadCaseRef; nodeResult.LoadCaseRef = loadCase; } if (structuralNode.Result == null) { //Can't just allocate an empty dictionary as the Result set property won't allow it structuralNode.Result = new Dictionary<string, object>() { { loadCase, nodeResult } }; } else { structuralNode.Result.Add(loadCase, nodeResult); } } } else { foreach (var loadCase in orderedLoadCases) { if (!Helper.FilterResults(results[loadCase], out Dictionary<string, object> sendableResults)) { continue; } var nodeResult = new StructuralNodeResult() { IsGlobal = !Initialiser.AppResources.Settings.ResultInLocalAxis, TargetRef = structuralNode.ApplicationId, Value = sendableResults }; var loadCaseRef = Helper.GsaCaseToRef(loadCase, loadTaskKw, comboKw); if (!string.IsNullOrEmpty(loadCaseRef)) { //nodeResult.LoadCaseRef = loadCaseRef; nodeResult.LoadCaseRef = loadCase; } gsaNodeResult = new GSANodeResult { Value = nodeResult, GSAId = i }; Initialiser.GsaKit.GSASenderObjects.Add(gsaNodeResult); } } } } var senderObjectGsaNode = new GSANode() { Value = structuralNode, GSAId = i }; if (gsaNodeResult != null) { senderObjectGsaNode.ForceSend = true; } Initialiser.GsaKit.GSASenderObjects.Add(senderObjectGsaNode); numToBeSent++; //Add spring object if appropriate if (gsaNode.SpringPropertyIndex.HasValue && gsaNode.SpringPropertyIndex.Value > 0) { var objSpring = Helper.ToSpeckleTryCatch(nodeKw, i, () => { var springPropRef = SpeckleStructuralGSA.Helper.GetApplicationId(springKw, gsaNode.SpringPropertyIndex.Value); if (!string.IsNullOrEmpty(springPropRef)) { var structural0dSpring = new Structural0DSpring() { //The application ID might need a better mechanism to allow a StructuralNode and Structural0DSpring previously received //that originally created the one node to be separated out again to produce the Application ID to use here for this spring //TO DO - review, for now just append a string to ensure the same Application ID value isn't used twice ApplicationId = gsaNode.ApplicationId + "_spring", Name = gsaNode.Name, Value = new List<double>() { gsaNode.X, gsaNode.Y, gsaNode.Z }, PropertyRef = springPropRef, Dummy = false }; return structural0dSpring; } return new SpeckleNull(); }); if (!(objSpring is SpeckleNull)) { Initialiser.GsaKit.GSASenderObjects.Add(new GSA0DSpring() { Value = (Structural0DSpring)objSpring, GSAId = i }); numToBeSent++; } } //if spring object needs to be added } //if node object was successfully created } #if !DEBUG ); #endif if (sendResults) { Initialiser.AppResources.Proxy.ClearResults(ResultGroup.Node); } return (numToBeSent > 0) ? new SpeckleObject() : new SpeckleNull(); }