/***************************************************/ 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); }
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); }