Example #1
0
        /***************************************************/

        private bool CreateLoad(GeometricalLineLoad bhLoad)
        {
            double distanceFromA = 0.0;
            double distanceFromB = 0.0;
            Vector forceA        = Engine.Geometry.Create.Vector(bhLoad.ForceA.X, bhLoad.ForceA.Y, bhLoad.ForceA.Z);
            Vector forceB        = Engine.Geometry.Create.Vector(bhLoad.ForceB.X, bhLoad.ForceB.Y, bhLoad.ForceB.Z);
            Vector momentA       = Engine.Geometry.Create.Vector(bhLoad.MomentA.X, bhLoad.MomentA.Y, bhLoad.MomentA.Z);
            Vector momentB       = Engine.Geometry.Create.Vector(bhLoad.MomentB.X, bhLoad.MomentB.Y, bhLoad.MomentB.Z);

            Node startNode = new Node {
                Position = bhLoad.Location.Start
            };
            Node endNode = new Node {
                Position = bhLoad.Location.End
            };

            CreateObject(startNode);
            CreateObject(endNode);

            Bar nullBar = new Bar {
                StartNode = startNode, EndNode = endNode
            };

            CreateObject(nullBar);

            List <Bar> barsToLoad = new List <Bar>();

            barsToLoad.Add(nullBar);
            BarVaryingDistributedLoad barVaryLoad = Engine.Structure.Create.BarVaryingDistributedLoad(bhLoad.Loadcase, barsToLoad, distanceFromA, forceA, momentA,
                                                                                                      distanceFromB, forceB, momentB, false, bhLoad.Axis, bhLoad.Projected, bhLoad.Name);

            CreateLoad(barVaryLoad);

            SetAdapterId(bhLoad, null);

            return(true);
        }
Example #2
0
        public static List <ICurve> Visualize(this GeometricalLineLoad lineLoad, double scaleFactor = 1.0, bool displayForces = true, bool displayMoments = true, bool asResultants = true)
        {
            if (lineLoad.IsNull())
            {
                return(null);
            }

            List <ICurve> arrows = new List <ICurve>();

            Vector forceA  = lineLoad.ForceA * scaleFactor;
            Vector forceB  = lineLoad.ForceB * scaleFactor;
            Vector momentA = lineLoad.MomentA * scaleFactor;
            Vector momentB = lineLoad.MomentB * scaleFactor;

            int    divisions = 5;
            double sqTol     = Tolerance.Distance * Tolerance.Distance;

            if (lineLoad.Projected || lineLoad.Axis == LoadAxis.Local)
            {
                Engine.Reflection.Compute.RecordWarning("Can not currently visualize GeometricalLineLoads that are projected or in local coordinates.");
                return(arrows);
            }

            List <Point> pts = lineLoad.Location.SamplePoints(divisions);

            Basis orientation = Basis.XY;

            Vector[] forcesA = new Vector[] { forceA, momentA };    //TODO: handle local orientation and projected values
            Vector[] forcesB = new Vector[] { forceB, momentB };    //TODO: handle local orientation and projected values

            if (displayForces && (forcesA[0].SquareLength() > sqTol || forcesB[0].SquareLength() > sqTol))
            {
                Point[] prevPt = null;
                for (int i = 0; i < pts.Count; i++)
                {
                    double  factor = (double)i / (double)divisions;
                    Point[] basePt;
                    Vector  v = (1 - factor) * forcesA[0] + factor * forcesB[0];
                    arrows.AddRange(Arrows(pts[i], v, true, asResultants, out basePt, orientation, 1));

                    if (i > 0)
                    {
                        for (int j = 0; j < basePt.Length; j++)
                        {
                            arrows.Add(new Line {
                                Start = prevPt[j], End = basePt[j]
                            });
                        }
                    }
                    prevPt = basePt;
                }
            }
            if (displayMoments && (forcesA[1].SquareLength() > sqTol || forcesB[1].SquareLength() > sqTol))
            {
                Point[] prevPt = null;
                for (int i = 0; i < pts.Count; i++)
                {
                    double  factor = (double)i / (double)divisions;
                    Point[] basePt;
                    Vector  v = (1 - factor) * forcesA[1] + factor * forcesB[1];
                    arrows.AddRange(Arrows(pts[i], v, false, asResultants, out basePt, orientation, 1));

                    prevPt = basePt;
                }
            }

            return(arrows);
        }