Пример #1
0
        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());
        }
Пример #2
0
 /// <summary>
 /// Calculates rotation angle of 1D entity to align with axis.
 /// </summary>
 /// <param name="coor">Entity coordinates</param>
 /// <param name="zAxis">Z axis of entity</param>
 /// <returns>Rotation angle</returns>
 public static double Get1DAngle(double[] coor, StructuralVectorThree zAxis)
 {
     return(Get1DAngle(LocalAxisEntity1D(coor, zAxis)));
 }