public static string ToNative(this Structural1DElementPolyline poly) { return(new GSA1DElementPolyline() { Value = poly }.SetGWACommand()); }
public static string ToNative(this SpecklePolyline inputObject) { var convertedObject = new Structural1DElementPolyline(); foreach (var p in convertedObject.GetType().GetProperties().Where(p => p.CanWrite)) { var inputProperty = inputObject.GetType().GetProperty(p.Name); if (inputProperty != null) p.SetValue(convertedObject, inputProperty.GetValue(inputObject)); } return convertedObject.ToNative(); }
public static string ToNative(this Structural1DElementPolyline poly) { return SchemaConversion.Helper.ToNativeTryCatch(poly, () => new GSA1DElementPolyline() { Value = poly }.SetGWACommand()); }
public static List <SpeckleObject> ToSpeckle(this AnalyticalModelStick myStick) { var returnObjects = new List <SpeckleObject>(); if (!myStick.IsEnabled()) { return(new List <SpeckleObject>()); } // Get the family var myFamily = (FamilyInstance)Doc.GetElement(myStick.GetElementId()); var myElement = new Structural1DElementPolyline { Value = new List <double>() }; var curves = myStick.GetCurves(AnalyticalCurveType.RigidLinkHead).ToList(); curves.AddRange(myStick.GetCurves(AnalyticalCurveType.ActiveCurves)); curves.AddRange(myStick.GetCurves(AnalyticalCurveType.RigidLinkTail)); foreach (var curve in curves) { var points = curve.Tessellate(); if (points.Count == 0) { continue; } if (myElement.Value.Count == 0) { myElement.Value.Add(points[0].X / Scale); myElement.Value.Add(points[0].Y / Scale); myElement.Value.Add(points[0].Z / Scale); } foreach (var p in points.Skip(1)) { myElement.Value.Add(p.X / Scale); myElement.Value.Add(p.Y / Scale); myElement.Value.Add(p.Z / Scale); } } myElement.ResultVertices = new List <double>(myElement.Value); var vertexCount = myElement.Value.Count / 3; var coordinateSystem = myStick.GetLocalCoordinateSystem(); if (coordinateSystem != null) { myElement.ZAxis = Enumerable.Repeat(new StructuralVectorThree(new double[] { coordinateSystem.BasisZ.X, coordinateSystem.BasisZ.Y, coordinateSystem.BasisZ.Z }), (vertexCount - 1)).ToList(); } try { var offset1 = myStick.GetOffset(AnalyticalElementSelector.StartOrBase); var offset2 = myStick.GetOffset(AnalyticalElementSelector.EndOrTop); // TODO: This should be linear interpolation? var fillerList = Enumerable.Repeat(new StructuralVectorThree(new double[] { 0, 0, 0 }), (vertexCount - 1) * 2 - 2).ToList(); myElement.Offset = new List <StructuralVectorThree>() { new StructuralVectorThree(new double[] { offset1.X / Scale, offset1.Y / Scale, offset1.Z / Scale }) } .Concat(fillerList) .Concat(new List <StructuralVectorThree>() { new StructuralVectorThree(new double[] { offset2.X / Scale, offset2.Y / Scale, offset2.Z / Scale }) }).ToList(); } catch { try { var offset = myStick.GetOffset(AnalyticalElementSelector.Whole); myElement.Offset = Enumerable.Repeat(new StructuralVectorThree(new double[] { offset.X / Scale, offset.Y / Scale, offset.Z / Scale }), (vertexCount - 1) * 2).ToList(); } catch { } } if (myStick is AnalyticalModelColumn) { StructuralVectorBoolSix endRelease1 = null, endRelease2 = null; switch (myStick.get_Parameter(BuiltInParameter.STRUCTURAL_BOTTOM_RELEASE_TYPE).AsInteger()) { case 0: endRelease1 = new StructuralVectorBoolSix(new bool[] { false, false, false, false, false, false }); break; case 1: endRelease1 = new StructuralVectorBoolSix(new bool[] { false, false, false, true, true, true }); break; case 2: endRelease1 = new StructuralVectorBoolSix(new bool[] { false, false, false, false, true, true }); break; case 3: endRelease1 = new StructuralVectorBoolSix(new bool[] { myStick.get_Parameter(BuiltInParameter.STRUCTURAL_BOTTOM_RELEASE_FX).AsInteger() == 1, myStick.get_Parameter(BuiltInParameter.STRUCTURAL_BOTTOM_RELEASE_FY).AsInteger() == 1, myStick.get_Parameter(BuiltInParameter.STRUCTURAL_BOTTOM_RELEASE_FZ).AsInteger() == 1, myStick.get_Parameter(BuiltInParameter.STRUCTURAL_BOTTOM_RELEASE_MX).AsInteger() == 1, myStick.get_Parameter(BuiltInParameter.STRUCTURAL_BOTTOM_RELEASE_MY).AsInteger() == 1, myStick.get_Parameter(BuiltInParameter.STRUCTURAL_BOTTOM_RELEASE_MZ).AsInteger() == 1, }); break; } switch (myStick.get_Parameter(BuiltInParameter.STRUCTURAL_TOP_RELEASE_TYPE).AsInteger()) { case 0: endRelease2 = new StructuralVectorBoolSix(new bool[] { false, false, false, false, false, false }); break; case 1: endRelease2 = new StructuralVectorBoolSix(new bool[] { false, false, false, true, true, true }); break; case 2: endRelease2 = new StructuralVectorBoolSix(new bool[] { false, false, false, false, true, true }); break; case 3: endRelease2 = new StructuralVectorBoolSix(new bool[] { myStick.get_Parameter(BuiltInParameter.STRUCTURAL_TOP_RELEASE_FX).AsInteger() == 1, myStick.get_Parameter(BuiltInParameter.STRUCTURAL_TOP_RELEASE_FY).AsInteger() == 1, myStick.get_Parameter(BuiltInParameter.STRUCTURAL_TOP_RELEASE_FZ).AsInteger() == 1, myStick.get_Parameter(BuiltInParameter.STRUCTURAL_TOP_RELEASE_MX).AsInteger() == 1, myStick.get_Parameter(BuiltInParameter.STRUCTURAL_TOP_RELEASE_MY).AsInteger() == 1, myStick.get_Parameter(BuiltInParameter.STRUCTURAL_TOP_RELEASE_MZ).AsInteger() == 1, }); break; } var fillerList = Enumerable.Repeat(new StructuralVectorBoolSix(new bool[] { false, false, false, false, false, false }), (vertexCount - 1) * 2 - 2).ToList(); myElement.EndRelease = new List <StructuralVectorBoolSix>() { endRelease1 }.Concat(fillerList).Concat(new List <StructuralVectorBoolSix>() { endRelease2 }).ToList(); } else { StructuralVectorBoolSix endRelease1 = null, endRelease2 = null; switch (myStick.get_Parameter(BuiltInParameter.STRUCTURAL_START_RELEASE_TYPE).AsInteger()) { case 0: endRelease1 = new StructuralVectorBoolSix(new bool[] { false, false, false, false, false, false }); break; case 1: endRelease1 = new StructuralVectorBoolSix(new bool[] { false, false, false, true, true, true }); break; case 2: endRelease1 = new StructuralVectorBoolSix(new bool[] { false, false, false, false, true, true }); break; case 3: endRelease1 = new StructuralVectorBoolSix(new bool[] { myStick.get_Parameter(BuiltInParameter.STRUCTURAL_START_RELEASE_FX).AsInteger() == 1, myStick.get_Parameter(BuiltInParameter.STRUCTURAL_START_RELEASE_FY).AsInteger() == 1, myStick.get_Parameter(BuiltInParameter.STRUCTURAL_START_RELEASE_FZ).AsInteger() == 1, myStick.get_Parameter(BuiltInParameter.STRUCTURAL_START_RELEASE_MX).AsInteger() == 1, myStick.get_Parameter(BuiltInParameter.STRUCTURAL_START_RELEASE_MY).AsInteger() == 1, myStick.get_Parameter(BuiltInParameter.STRUCTURAL_START_RELEASE_MZ).AsInteger() == 1, }); break; } switch (myStick.get_Parameter(BuiltInParameter.STRUCTURAL_END_RELEASE_TYPE).AsInteger()) { case 0: endRelease2 = new StructuralVectorBoolSix(new bool[] { false, false, false, false, false, false }); break; case 1: endRelease2 = new StructuralVectorBoolSix(new bool[] { false, false, false, true, true, true }); break; case 2: endRelease2 = new StructuralVectorBoolSix(new bool[] { false, false, false, false, true, true }); break; case 3: endRelease2 = new StructuralVectorBoolSix(new bool[] { myStick.get_Parameter(BuiltInParameter.STRUCTURAL_END_RELEASE_FX).AsInteger() == 1, myStick.get_Parameter(BuiltInParameter.STRUCTURAL_END_RELEASE_FY).AsInteger() == 1, myStick.get_Parameter(BuiltInParameter.STRUCTURAL_END_RELEASE_FZ).AsInteger() == 1, myStick.get_Parameter(BuiltInParameter.STRUCTURAL_END_RELEASE_MX).AsInteger() == 1, myStick.get_Parameter(BuiltInParameter.STRUCTURAL_END_RELEASE_MY).AsInteger() == 1, myStick.get_Parameter(BuiltInParameter.STRUCTURAL_END_RELEASE_MZ).AsInteger() == 1, }); break; } var fillerList = Enumerable.Repeat(new StructuralVectorBoolSix(new bool[] { false, false, false, false, false, false }), (vertexCount - 1) * 2 - 2).ToList(); myElement.EndRelease = new List <StructuralVectorBoolSix>() { endRelease1 }.Concat(fillerList).Concat(new List <StructuralVectorBoolSix>() { endRelease2 }).ToList(); } // Property try { var mySection = new Structural1DProperty { Name = Doc.GetElement(myStick.GetElementId()).Name, ApplicationId = myFamily.Symbol.UniqueId }; switch (myFamily.Symbol.GetStructuralSection().StructuralSectionGeneralShape) { case Autodesk.Revit.DB.Structure.StructuralSections.StructuralSectionGeneralShape.GeneralI: mySection.Shape = Structural1DPropertyShape.I; mySection.Hollow = false; break; case Autodesk.Revit.DB.Structure.StructuralSections.StructuralSectionGeneralShape.GeneralT: mySection.Shape = Structural1DPropertyShape.T; mySection.Hollow = false; break; case Autodesk.Revit.DB.Structure.StructuralSections.StructuralSectionGeneralShape.GeneralH: mySection.Shape = Structural1DPropertyShape.Rectangular; mySection.Hollow = true; mySection.Thickness = (double)typeof(Autodesk.Revit.DB.Structure.StructuralSections.StructuralSectionGeneralH).GetProperty("WallNominalThickness").GetValue(myFamily.Symbol.GetStructuralSection()) / Scale; break; case Autodesk.Revit.DB.Structure.StructuralSections.StructuralSectionGeneralShape.GeneralR: mySection.Shape = Structural1DPropertyShape.Circular; mySection.Hollow = true; mySection.Thickness = (double)typeof(Autodesk.Revit.DB.Structure.StructuralSections.StructuralSectionGeneralR).GetProperty("WallNominalThickness").GetValue(myFamily.Symbol.GetStructuralSection()) / Scale; mySection.Profile = new SpeckleCircle( new SpecklePlane(new SpecklePoint(0, 0, 0), new SpeckleVector(0, 0, 1), new SpeckleVector(1, 0, 0), new SpeckleVector(0, 1, 0)), (double)typeof(Autodesk.Revit.DB.Structure.StructuralSections.StructuralSectionGeneralR).GetProperty("Diameter").GetValue(myFamily.Symbol.GetStructuralSection()) / 2 / Scale); break; case Autodesk.Revit.DB.Structure.StructuralSections.StructuralSectionGeneralShape.GeneralF: mySection.Shape = Structural1DPropertyShape.Rectangular; mySection.Hollow = false; break; case Autodesk.Revit.DB.Structure.StructuralSections.StructuralSectionGeneralShape.GeneralS: mySection.Shape = Structural1DPropertyShape.Circular; mySection.Profile = new SpeckleCircle( new SpecklePlane(new SpecklePoint(0, 0, 0), new SpeckleVector(0, 0, 1), new SpeckleVector(1, 0, 0), new SpeckleVector(0, 1, 0)), (double)typeof(Autodesk.Revit.DB.Structure.StructuralSections.StructuralSectionGeneralR).GetProperty("Diameter").GetValue(myFamily.Symbol.GetStructuralSection()) / 2 / Scale); mySection.Hollow = false; break; default: mySection.Shape = Structural1DPropertyShape.Generic; mySection.Hollow = false; break; } // Generate section profile var profile = myFamily.GetSweptProfile().GetSweptProfile(); if (mySection.Shape != Structural1DPropertyShape.Circular) { var myProfile = new SpecklePolyline { Value = new List <double>() }; for (var i = 0; i < profile.Curves.Size; i++) { var sectionCurves = SpeckleCore.Converter.Serialise(profile.Curves.get_Item(i)); var sectionCoordinates = new List <double>(); var nextCoordinates = new List <double>(); if (sectionCurves is SpeckleLine) { sectionCoordinates = (sectionCurves as SpeckleLine).Value.Select(x => Math.Round(x, 10)).ToList(); if (myProfile.Value.Count == 0) { myProfile.Value = sectionCoordinates; continue; } if (myProfile.Value.Skip(myProfile.Value.Count - 3).SequenceEqual(sectionCoordinates.Take(3))) { nextCoordinates = sectionCoordinates.Skip(3).ToList(); } else { break; } } else if (sectionCurves is SpeckleArc) { if (myProfile.Value.Count == 0) { myProfile.Value = (sectionCurves as SpeckleArc).StartPoint.Value.Select(x => Math.Round(x, 10)) .Concat((sectionCurves as SpeckleArc).MidPoint.Value.Select(x => Math.Round(x, 10))) .Concat((sectionCurves as SpeckleArc).EndPoint.Value.Select(x => Math.Round(x, 10))) .ToList(); continue; } if (myProfile.Value.Skip(myProfile.Value.Count - 3).SequenceEqual((sectionCurves as SpeckleArc).StartPoint.Value.Select(x => Math.Round(x, 10)))) { nextCoordinates = (sectionCurves as SpeckleArc).EndPoint.Value.Select(x => Math.Round(x, 10)).ToList(); } else if (myProfile.Value.Skip(myProfile.Value.Count - 3).SequenceEqual((sectionCurves as SpeckleArc).EndPoint.Value.Select(x => Math.Round(x, 10)))) { nextCoordinates = (sectionCurves as SpeckleArc).StartPoint.Value.Select(x => Math.Round(x, 10)).ToList(); } else { break; } } if (nextCoordinates.SequenceEqual(myProfile.Value.Take(3))) { myProfile.Closed = true; break; } else { myProfile.Value.AddRange(nextCoordinates); } } myProfile.GenerateHash(); mySection.Profile = myProfile; } // Material try { var matType = myFamily.StructuralMaterialType; var structMat = (Material)Doc.GetElement(myFamily.StructuralMaterialId); if (structMat == null) { structMat = (Material)Doc.GetElement(myFamily.Symbol.get_Parameter(BuiltInParameter.STRUCTURAL_MATERIAL_PARAM).AsElementId()); } var matAsset = ((PropertySetElement)Doc.GetElement(structMat.StructuralAssetId)).GetStructuralAsset(); SpeckleObject myMaterial = null; switch (matType) { case Autodesk.Revit.DB.Structure.StructuralMaterialType.Concrete: var concMat = new StructuralMaterialConcrete { ApplicationId = Doc.GetElement(myFamily.StructuralMaterialId).UniqueId, Name = Doc.GetElement(myFamily.StructuralMaterialId).Name, YoungsModulus = matAsset.YoungModulus.X, ShearModulus = matAsset.ShearModulus.X, PoissonsRatio = matAsset.PoissonRatio.X, Density = matAsset.Density, CoeffThermalExpansion = matAsset.ThermalExpansionCoefficient.X, CompressiveStrength = matAsset.ConcreteCompression, MaxStrain = 0, AggragateSize = 0 }; myMaterial = concMat; break; case Autodesk.Revit.DB.Structure.StructuralMaterialType.Steel: var steelMat = new StructuralMaterialSteel { ApplicationId = Doc.GetElement(myFamily.StructuralMaterialId).UniqueId, Name = Doc.GetElement(myFamily.StructuralMaterialId).Name, YoungsModulus = matAsset.YoungModulus.X, ShearModulus = matAsset.ShearModulus.X, PoissonsRatio = matAsset.PoissonRatio.X, Density = matAsset.Density, CoeffThermalExpansion = matAsset.ThermalExpansionCoefficient.X, YieldStrength = matAsset.MinimumYieldStress, UltimateStrength = matAsset.MinimumTensileStrength, MaxStrain = 0 }; myMaterial = steelMat; break; default: var defMat = new StructuralMaterialSteel { ApplicationId = Doc.GetElement(myFamily.StructuralMaterialId).UniqueId, Name = Doc.GetElement(myFamily.StructuralMaterialId).Name }; myMaterial = defMat; break; } myMaterial.GenerateHash(); mySection.MaterialRef = (myMaterial as SpeckleObject).ApplicationId; returnObjects.Add(myMaterial); } catch { } mySection.GenerateHash(); myElement.PropertyRef = mySection.ApplicationId; returnObjects.Add(mySection); } catch { } myElement.GenerateHash(); myElement.ApplicationId = myStick.UniqueId; returnObjects.Add(myElement); return(returnObjects); }
public void ParseGWACommand(List<GSA1DElement> elements) { if (elements.Count() < 1) return; var elementsListCopy = new List<GSA1DElement>(elements); var obj = new Structural1DElementPolyline { ApplicationId = HelperClass.GetApplicationId(typeof(GSA1DElementPolyline).GetGSAKeyword(), GSAId), Value = new List<double>(), ElementApplicationId = new List<string>(), ElementType = elementsListCopy.First().Value.ElementType, PropertyRef = elementsListCopy.First().Value.PropertyRef, ZAxis = new List<StructuralVectorThree>(), EndRelease = new List<StructuralVectorBoolSix>(), Offset = new List<StructuralVectorThree>(), ResultVertices = new List<double>() }; if (Initialiser.Settings.Element1DResults.Count > 0 && Initialiser.Settings.EmbedResults) obj.Result = new Dictionary<string, object>(); // Match up coordinates var coordinates = new List<Tuple<string, string>>(); foreach (var e in elementsListCopy) coordinates.Add( new Tuple<string, string>( string.Join(",", (e.Value.Value as List<double>).Take(3).Select(x => Math.Round(x, 4).ToString())), string.Join(",", (e.Value.Value as List<double>).Skip(3).Take(3).Select(x => Math.Round(x, 4).ToString())) )); // Find start coordinate var flatCoordinates = coordinates.SelectMany(x => new List<string>() { x.Item1, x.Item2 }).ToList(); var uniqueCoordinates = flatCoordinates.Where(x => flatCoordinates.Count(y => y == x) == 1).ToList(); var current = uniqueCoordinates[0]; while(coordinates.Count > 0) { var matchIndex = 0; var reverseCoordinates = false; matchIndex = coordinates.FindIndex(x => x.Item1 == current); reverseCoordinates = false; if (matchIndex == -1) { matchIndex = coordinates.FindIndex(x => x.Item2 == current); reverseCoordinates = true; } var element = elementsListCopy[matchIndex]; obj.ElementApplicationId.Add(element.Value.ApplicationId); obj.ZAxis.Add(element.Value.ZAxis); if (obj.Value.Count == 0) { if (!reverseCoordinates) { obj.Value.AddRange((element.Value.Value as List<double>).Take(3)); } else { obj.Value.AddRange((element.Value.Value as List<double>).Skip(3).Take(3)); } } if (!reverseCoordinates) { current = string.Join(",", (element.Value.Value as List<double>).Skip(3).Take(3).Select(x => Math.Round(x, 4).ToString())); obj.Value.AddRange((element.Value.Value as List<double>).Skip(3).Take(3)); obj.EndRelease.AddRange(element.Value.EndRelease); obj.Offset.AddRange(element.Value.Offset); if (Initialiser.Settings.Element1DResults.Count > 0 && Initialiser.Settings.EmbedResults) obj.ResultVertices.AddRange(element.Value.ResultVertices); else obj.ResultVertices.AddRange((element.Value.Value as List<double>)); } else { current = string.Join(",", (element.Value.Value as List<double>).Take(3).Select(x => Math.Round(x, 4).ToString())); obj.Value.AddRange((element.Value.Value as List<double>).Take(3)); obj.EndRelease.Add((element.Value.EndRelease as List<StructuralVectorBoolSix>).Last()); obj.EndRelease.Add((element.Value.EndRelease as List<StructuralVectorBoolSix>).First()); obj.Offset.Add((element.Value.Offset as List<StructuralVectorThree>).Last()); obj.Offset.Add((element.Value.Offset as List<StructuralVectorThree>).First()); if (Initialiser.Settings.Element1DResults.Count > 0 && Initialiser.Settings.EmbedResults) for (int i = element.Value.ResultVertices.Count - 3; i >= 0; i -= 3) obj.ResultVertices.AddRange((element.Value.ResultVertices as List<double>).Skip(i).Take(3)); else { obj.ResultVertices.AddRange((element.Value.Value as List<double>).Skip(3).Take(3)); obj.ResultVertices.AddRange((element.Value.Value as List<double>).Take(3)); } } // Result merging if (obj.Result != null) { try { foreach (string loadCase in element.Value.Result.Keys) { if (!obj.Result.ContainsKey(loadCase)) obj.Result[loadCase] = new Structural1DElementResult() { Value = new Dictionary<string, object>(), IsGlobal = !Initialiser.Settings.ResultInLocalAxis, }; var resultExport = element.Value.Result[loadCase] as Structural1DElementResult; if (resultExport != null) { foreach (var key in resultExport.Value.Keys) { if (!(obj.Result[loadCase] as Structural1DElementResult).Value.ContainsKey(key)) (obj.Result[loadCase] as Structural1DElementResult).Value[key] = new Dictionary<string, object>(resultExport.Value[key] as Dictionary<string, object>); else foreach (var resultKey in ((obj.Result[loadCase] as Structural1DElementResult).Value[key] as Dictionary<string, object>).Keys) { var res = (resultExport.Value[key] as Dictionary<string, object>)[resultKey] as List<double>; if (reverseCoordinates) res.Reverse(); (((obj.Result[loadCase] as Structural1DElementResult).Value[key] as Dictionary<string, object>)[resultKey] as List<double>) .AddRange(res); } } } else { // UNABLE TO MERGE RESULTS obj.Result = null; break; } } } catch { // UNABLE TO MERGE RESULTS obj.Result = null; } } coordinates.RemoveAt(matchIndex); elementsListCopy.RemoveAt(matchIndex); this.SubGWACommand.Add(element.GWACommand); this.SubGWACommand.AddRange(element.SubGWACommand); } this.Value = obj; }
public void ParseGWACommand(List <GSA1DElement> elements) { if (elements.Count() < 1) { return; } var elementsListCopy = new List <GSA1DElement>(elements); var obj = new Structural1DElementPolyline { ApplicationId = Helper.GetApplicationId(typeof(GSA1DElementPolyline).GetGSAKeyword(), GSAId), Value = new List <double>(), ElementApplicationId = new List <string>(), ElementType = elementsListCopy.First().Value.ElementType, PropertyRef = elementsListCopy.First().Value.PropertyRef, ZAxis = new List <StructuralVectorThree>(), EndRelease = new List <StructuralVectorBoolSix>(), Offset = new List <StructuralVectorThree>(), ResultVertices = new List <double>() }; if (Initialiser.Settings.Element1DResults.Count > 0 && Initialiser.Settings.EmbedResults) { obj.Result = new Dictionary <string, object>(); } // Match up coordinates var coordinates = new List <Tuple <string, string> >(); foreach (var e in elementsListCopy) { coordinates.Add(new Tuple <string, string>( string.Join(",", (e.Value.Value as List <double>).Take(3).Select(x => Math.Round(x, 4).ToString())), string.Join(",", (e.Value.Value as List <double>).Skip(3).Take(3).Select(x => Math.Round(x, 4).ToString())) )); } // Find start coordinate var flatCoordinates = coordinates.SelectMany(x => new List <string>() { x.Item1, x.Item2 }).ToList(); var uniqueCoordinates = flatCoordinates.Where(x => flatCoordinates.Count(y => y == x) == 1).ToList(); var current = uniqueCoordinates[0]; //Because these properties could, depending on how they've been added to the StructuralProperties dictionary, //return another instance of the lists instead of a pointer to the lists themselves, temporary variables are used //to build up new lists which are assigned as replacements to the property values further down var elementAppIds = obj.ElementApplicationId; var zAxes = obj.ZAxis; var endReleases = obj.EndRelease; var offsets = obj.Offset; var resultVertices = obj.ResultVertices; while (coordinates.Count > 0) { var matchIndex = 0; var reverseCoordinates = false; matchIndex = coordinates.FindIndex(x => x.Item1 == current); reverseCoordinates = false; if (matchIndex == -1) { matchIndex = coordinates.FindIndex(x => x.Item2 == current); reverseCoordinates = true; } var element = elementsListCopy[matchIndex]; elementAppIds.Add(element.Value.ApplicationId); zAxes.Add(element.Value.ZAxis); if (obj.Value.Count == 0) { if (!reverseCoordinates) { obj.Value.AddRange((element.Value.Value as List <double>).Take(3)); } else { obj.Value.AddRange((element.Value.Value as List <double>).Skip(3).Take(3)); } } if (!reverseCoordinates) { current = string.Join(",", (element.Value.Value as List <double>).Skip(3).Take(3).Select(x => Math.Round(x, 4).ToString())); obj.Value.AddRange((element.Value.Value as List <double>).Skip(3).Take(3)); endReleases.AddRange(element.Value.EndRelease); offsets.AddRange(element.Value.Offset); if (Initialiser.Settings.Element1DResults.Count > 0 && Initialiser.Settings.EmbedResults) { resultVertices.AddRange(element.Value.ResultVertices); } else { resultVertices.AddRange((element.Value.Value as List <double>)); } } else { current = string.Join(",", (element.Value.Value as List <double>).Take(3).Select(x => Math.Round(x, 4).ToString())); obj.Value.AddRange((element.Value.Value as List <double>).Take(3)); endReleases.Add((element.Value.EndRelease as List <StructuralVectorBoolSix>).Last()); endReleases.Add((element.Value.EndRelease as List <StructuralVectorBoolSix>).First()); offsets.Add((element.Value.Offset as List <StructuralVectorThree>).Last()); offsets.Add((element.Value.Offset as List <StructuralVectorThree>).First()); if (Initialiser.Settings.Element1DResults.Count > 0 && Initialiser.Settings.EmbedResults) { for (int i = element.Value.ResultVertices.Count - 3; i >= 0; i -= 3) { resultVertices.AddRange((element.Value.ResultVertices as List <double>).Skip(i).Take(3)); } } else { resultVertices.AddRange((element.Value.Value as List <double>).Skip(3).Take(3)); resultVertices.AddRange((element.Value.Value as List <double>).Take(3)); } } // Result merging if (obj.Result != null && ((Structural1DElement)element.Value).Result != null) { try { foreach (string loadCase in element.Value.Result.Keys) { if (!obj.Result.ContainsKey(loadCase)) { obj.Result[loadCase] = new Structural1DElementResult() { Value = new Dictionary <string, object>(), IsGlobal = !Initialiser.Settings.ResultInLocalAxis, } } ; var resultExport = element.Value.Result[loadCase] as Structural1DElementResult; if (resultExport != null) { foreach (var key in resultExport.Value.Keys) { if (!(obj.Result[loadCase] as Structural1DElementResult).Value.ContainsKey(key)) { (obj.Result[loadCase] as Structural1DElementResult).Value[key] = new Dictionary <string, object>(resultExport.Value[key] as Dictionary <string, object>); } else { foreach (var resultKey in ((obj.Result[loadCase] as Structural1DElementResult).Value[key] as Dictionary <string, object>).Keys) { var res = (resultExport.Value[key] as Dictionary <string, object>)[resultKey] as List <double>; if (reverseCoordinates) { res.Reverse(); } (((obj.Result[loadCase] as Structural1DElementResult).Value[key] as Dictionary <string, object>)[resultKey] as List <double>) .AddRange(res); } } } } else { // UNABLE TO MERGE RESULTS obj.Result = null; break; } } } catch { // UNABLE TO MERGE RESULTS obj.Result = null; } } coordinates.RemoveAt(matchIndex); elementsListCopy.RemoveAt(matchIndex); this.SubGWACommand.Add(element.GWACommand); this.SubGWACommand.AddRange(element.SubGWACommand); } obj.ElementApplicationId = elementAppIds; obj.ZAxis = zAxes; obj.EndRelease = endReleases; obj.Offset = offsets; obj.ResultVertices = resultVertices; this.Value = obj; }