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();
    }
示例#3
0
 public static string ToNative(this Structural1DElementPolyline poly)
 {
   return SchemaConversion.Helper.ToNativeTryCatch(poly, () => new GSA1DElementPolyline() { Value = poly }.SetGWACommand());
 }
示例#4
0
        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;
    }
示例#6
0
        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;
        }