private void Stream( ArrayList data, AreaLoad areaload )
        {
            data.Add( new Snoop.Data.ClassSeparator( typeof( AreaLoad ) ) );

              data.Add( new Snoop.Data.Xyz( "Force 1", areaload.ForceVector1 ) );
              data.Add( new Snoop.Data.Xyz( "Force 2", areaload.ForceVector2 ) );
              data.Add( new Snoop.Data.Xyz( "Force 3", areaload.ForceVector3 ) );

              data.Add( new Snoop.Data.CategorySeparator( "Loops" ) );
              data.Add( new Snoop.Data.Int( "Number of loops", areaload.GetLoops().Count ) );
              int i = 0, j = 0;
              foreach( var loop in areaload.GetLoops() )
              {
            foreach( var curve in loop )
            {
              data.Add( new Snoop.Data.Object( string.Format( "Loop [{0:d}], Curve [{1:d}]", i, j ), curve ) );
              j++;
            }
            i++;
              }

              data.Add( new Snoop.Data.CategorySeparator( "Reference Points" ) );
              data.Add( new Snoop.Data.Int( "Number of reference points", areaload.NumRefPoints ) );
              for( i = 0; i < areaload.NumRefPoints; i++ )
              {
            data.Add( new Snoop.Data.Xyz( string.Format( "Reference PT [{0:d}]", i ), areaload.GetRefPoint( i ) ) );
              }
        }
        private void Stream( ArrayList data, AreaLoad areaload )
        {
            data.Add( new Snoop.Data.ClassSeparator( typeof( AreaLoad ) ) );

              data.Add( new Snoop.Data.Xyz( "Force 1", areaload.ForceVector1 ) );
              data.Add( new Snoop.Data.Xyz( "Force 2", areaload.ForceVector2 ) );
              data.Add( new Snoop.Data.Xyz( "Force 3", areaload.ForceVector3 ) );

              data.Add( new Snoop.Data.CategorySeparator( "Loops" ) );
              data.Add( new Snoop.Data.Int( "Number of loops", areaload.GetLoops().Count ) );
              for( int i = 0; i < areaload.GetLoops().Count; i++ )
              {
            CurveLoop curveloop = areaload.GetLoops()[i] as CurveLoop;
            CurveLoopIterator iter = curveloop.GetCurveLoopIterator();
            iter.Reset();
            int j = 0;
            while( iter.MoveNext() )
            {
              data.Add( new Snoop.Data.Object( string.Format( "Loop [{0:d}], Curve [{1:d}]", i, j ), ( iter.Current as Curve ) ) );
              j++;
            }
              }

              data.Add( new Snoop.Data.CategorySeparator( "Reference Points" ) );
              data.Add( new Snoop.Data.Int( "Number of reference points", areaload.NumRefPoints ) );
              for( int i = 0; i < areaload.NumRefPoints; i++ )
              {
            data.Add( new Snoop.Data.Xyz( string.Format( "Reference PT [{0:d}]", i ), areaload.GetRefPoint( i ) ) );
              }
        }
        public static List <SpeckleObject> ToSpeckle(this AreaLoad myAreaLoad)
        {
            var polylines = new List <double[]>();

            var loops = myAreaLoad.GetLoops();

            foreach (var loop in loops)
            {
                var coor = new List <double>();
                foreach (var curve in loop)
                {
                    var points = curve.Tessellate();

                    foreach (var p in points.Skip(1))
                    {
                        coor.Add(p.X / Scale);
                        coor.Add(p.Y / Scale);
                        coor.Add(p.Z / Scale);
                    }
                }

                polylines.Add(coor.ToArray());

                // Only get outer loop
                break;
            }

            var forces = new StructuralVectorThree(new double[3]);

            forces.Value[0] = myAreaLoad.ForceVector1.X;
            forces.Value[1] = myAreaLoad.ForceVector1.Y;
            forces.Value[2] = myAreaLoad.ForceVector1.Z;

            if (myAreaLoad.OrientTo == LoadOrientTo.HostLocalCoordinateSystem)
            {
                var hostTransform = myAreaLoad.HostElement.GetLocalCoordinateSystem();

                var b0 = hostTransform.get_Basis(0);
                var b1 = hostTransform.get_Basis(1);
                var b2 = hostTransform.get_Basis(2);

                var fx = forces.Value[0] * b0.X + forces.Value[1] * b1.X + forces.Value[2] * b2.X;
                var fy = forces.Value[0] * b0.Y + forces.Value[1] * b1.Y + forces.Value[2] * b2.Y;
                var fz = forces.Value[0] * b0.Z + forces.Value[1] * b1.Z + forces.Value[2] * b2.Z;

                forces = new StructuralVectorThree(new double[] { fx, fy, fz });
            }
            else if (myAreaLoad.OrientTo == LoadOrientTo.WorkPlane)
            {
                var workPlane = ((SketchPlane)Doc.GetElement(myAreaLoad.WorkPlaneId)).GetPlane();

                var b0 = workPlane.XVec;
                var b1 = workPlane.YVec;
                var b2 = workPlane.Normal;

                var fx = forces.Value[0] * b0.X + forces.Value[1] * b1.X + forces.Value[2] * b2.X;
                var fy = forces.Value[0] * b0.Y + forces.Value[1] * b1.Y + forces.Value[2] * b2.Y;
                var fz = forces.Value[0] * b0.Z + forces.Value[1] * b1.Z + forces.Value[2] * b2.Z;

                forces = new StructuralVectorThree(new double[] { fx, fy, fz });
            }

            var myLoadCase = new StructuralLoadCase();

            myLoadCase.Name          = myAreaLoad.LoadCaseName;
            myLoadCase.ApplicationId = myAreaLoad.LoadCase.UniqueId;
            switch (myAreaLoad.LoadCategoryName)
            {
            case "Dead Loads":
                myLoadCase.CaseType = StructuralLoadCaseType.Dead;
                break;

            case "Live Loads":
                myLoadCase.CaseType = StructuralLoadCaseType.Live;
                break;

            case "Seismic Loads":
                myLoadCase.CaseType = StructuralLoadCaseType.Earthquake;
                break;

            case "Snow Loads":
                myLoadCase.CaseType = StructuralLoadCaseType.Snow;
                break;

            case "Wind Loads":
                myLoadCase.CaseType = StructuralLoadCaseType.Wind;
                break;

            default:
                myLoadCase.CaseType = StructuralLoadCaseType.Generic;
                break;
            }

            var myLoads = new List <SpeckleObject>();

            var counter = 0;

            foreach (var vals in polylines)
            {
                var myLoad = new Structural2DLoadPanel();
                myLoad.Name        = myAreaLoad.Name;
                myLoad.Value       = vals.ToList();
                myLoad.Loading     = forces;
                myLoad.LoadCaseRef = myLoadCase.ApplicationId;
                myLoad.Closed      = true;

                myLoad.ApplicationId = myAreaLoad.UniqueId + "_" + (counter++).ToString();

                myLoads.Add(myLoad);
            }

            return(myLoads.Concat(new List <SpeckleObject>()
            {
                myLoadCase
            }).ToList());
        }