//NOTE: *unlike* most other ToSpeckle methods, this one does not find, and then convert, all instances of a GSA entity type; //this method does convert the exact object passed into a corresponding Speckle object public static SpeckleObject ToSpeckle(this GsaAxis gsaAxis) { return(Helper.ToSpeckleTryCatch(gsaAxis.Keyword, gsaAxis.Index ?? 0, () => { var vX = new Vector3D(gsaAxis.XDirX.Value, gsaAxis.XDirY.Value, gsaAxis.XDirZ.Value); var vXY = new Vector3D(gsaAxis.XYDirX.Value, gsaAxis.XYDirY.Value, gsaAxis.XYDirZ.Value); var normal = vX.CrossProduct(vXY); var vY = normal.CrossProduct(vX); var axisX = new StructuralVectorThree(vX.X, vX.Y, vX.Z); var axisY = new StructuralVectorThree(vY.X, vY.Y, vY.Z); var axisNormal = new StructuralVectorThree(normal.X, normal.Y, normal.Z); //The x axis is assumed to be the , but the XY vector is not necessarily var speckleAxis = new StructuralAxis(axisX, axisY, axisNormal, gsaAxis.ApplicationId) { Name = gsaAxis.Name }; if (gsaAxis.OriginX > 0 || gsaAxis.OriginY > 0 || gsaAxis.OriginZ > 0) { speckleAxis.Origin = new SpecklePoint(gsaAxis.OriginX, gsaAxis.OriginY, gsaAxis.OriginZ); } return speckleAxis; })); }
public static SpeckleObject ToSpeckle(this GsaPropSpr dummy) { var kw = GsaRecord.GetKeyword<GsaPropSpr>(); var newLines = Initialiser.AppResources.Cache.GetGwaToSerialise(kw); int numAdded = 0; var structuralSpringProperties = new List<StructuralSpringProperty>(); #if DEBUG foreach (var i in newLines.Keys) #else Parallel.ForEach(newLines.Keys, i => #endif { var obj = Helper.ToSpeckleTryCatch(kw, i, () => { var gsaPropSpr = new GsaPropSpr(); if (gsaPropSpr.FromGwa(newLines[i])) { var structuralProp = new StructuralSpringProperty() { Name = gsaPropSpr.Name, ApplicationId = SpeckleStructuralGSA.Helper.GetApplicationId(kw, i), DampingRatio = gsaPropSpr.DampingRatio, SpringType = gsaPropSpr.PropertyType, Stiffness = Helper.AxisDirDictToStructuralVectorSix(gsaPropSpr.Stiffnesses) }; ((Dictionary<string, object>)structuralProp.Properties["structural"]).Add("NativeId", i.ToString()); return structuralProp; } return new SpeckleNull(); }); if (!(obj is SpeckleNull)) { Initialiser.GsaKit.GSASenderObjects.Add(new GSASpringProperty() { Value = (StructuralSpringProperty)obj, GSAId = i } ); numAdded++; } } #if !DEBUG ); #endif return (numAdded > 0) ? new SpeckleObject() : new SpeckleNull(); }
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(); }
public static SpeckleObject ToSpeckle(this GsaSection dummyObject) { var settings = Initialiser.AppResources.Settings; var element1dResults = settings.ResultTypes != null && settings.ResultTypes.Any(rt => rt.ToString().ToLower().Contains("1d")); if (settings.TargetLayer == GSATargetLayer.Analysis && settings.StreamSendConfig == StreamContentConfig.TabularResultsOnly && !element1dResults) { return(new SpeckleNull()); } var kw = GsaRecord.GetKeyword <GsaSection>(); var newLines = Initialiser.AppResources.Cache.GetGwaToSerialise(kw); int numAdded = 0; var structural1DPropertyExplicits = new List <Structural1DPropertyExplicit>(); var concreteMaterials = Initialiser.GsaKit.GSASenderObjects.Get <GSAMaterialConcrete>().ToDictionary(o => o.GSAId, o => ((StructuralMaterialConcrete)o.SpeckleObject).ApplicationId); var steelMaterials = Initialiser.GsaKit.GSASenderObjects.Get <GSAMaterialSteel>().ToDictionary(o => o.GSAId, o => ((StructuralMaterialSteel)o.SpeckleObject).ApplicationId); //Currently only handles explicit 1D properties //Filtering out all but explicit properties: //1. First exclude any GWA lines with the exact string "EXP" - make first pass at filtering them out //2. Call FromGwa for all and perform logic check of values of GsaSection (and subclass) instances var indicesContainingEXP = newLines.Keys.Where(k => newLines[k].Contains("EXP")).ToList(); var gsaSectionsExp = new List <GsaSection>(); foreach (var i in indicesContainingEXP) { var obj = Helper.ToSpeckleTryCatch(dummyObject.Keyword, i, () => { var gsaSection = new GsaSection(); if (gsaSection.FromGwa(newLines[i]) && FindExpDetails(gsaSection, out var comp, out var pde)) { if (string.IsNullOrEmpty(gsaSection.ApplicationId)) { gsaSection.ApplicationId = SpeckleStructuralGSA.Helper.FormatApplicationId(kw, i); } var structuralProp = new Structural1DPropertyExplicit() { Name = gsaSection.Name, ApplicationId = gsaSection.ApplicationId, Area = pde.Area, Iyy = pde.Iyy, Izz = pde.Izz, J = pde.J, Ky = pde.Ky, Kz = pde.Kz }; //No support for any other material type at this stage if (comp.MaterialType == Section1dMaterialType.CONCRETE || comp.MaterialType == Section1dMaterialType.STEEL) { var materialIndex = comp.MaterialIndex ?? 0; var materialDict = (comp.MaterialType == Section1dMaterialType.CONCRETE) ? concreteMaterials : steelMaterials; structuralProp.MaterialRef = (materialIndex > 0 && materialDict.ContainsKey(materialIndex)) ? materialDict[materialIndex] : null; } return(structuralProp); } return(new SpeckleNull()); });