/***************************************************/ private List <RAMFactoredEndReactions> ReadBeamEndReactions(List <string> ids = null) { List <RAMFactoredEndReactions> barEndReactions = new List <RAMFactoredEndReactions>(); IModel ramModel = m_Application.GetDispInterfacePointerByEnum(EINTERFACES.IModel_INT); List <IBeam> ramBeams = ReadRamBeams(ramModel); foreach (IBeam beam in ramBeams) { IAnalyticalResult result = beam.GetAnalyticalResult(); IMemberForces forces = result.GetMaximumComboReactions(COMBO_MATERIAL_TYPE.GRAV_STEEL); RAMFactoredEndReactions bhomEndReactions = new RAMFactoredEndReactions() { ObjectId = beam.lUID, StartReaction = forces.GetAt(0).ToBHoMObject(), EndReaction = forces.GetAt(1).ToBHoMObject(), }; barEndReactions.Add(bhomEndReactions); } return(barEndReactions); }
/***************************************************/ public static Node ToBHoMObject(this INode ramNode) { // Get the location of the node SCoordinate location = new SCoordinate(); location = ramNode.sLocation; Node node = new Node { Position = location.PointFromRAM() }; IMemberForces IMemberForces = ramNode.GetReactions(); // Collect all member forces at node, tracked by index; should these be combined? for (int i = 0; i < IMemberForces.GetCount(); i++) { RAMNodeForceData ramNodeForceData = new RAMNodeForceData(); IMemberForce IMemberForce = IMemberForces.GetAt(i); double axial = IMemberForce.dAxial; double loc = IMemberForce.dLocation; double momMaj = IMemberForce.dMomentMajor; double momMin = IMemberForce.dMomentMinor; double shearMaj = IMemberForce.dShearMajor; double shearMin = IMemberForce.dShearMinor; double torsion = IMemberForce.dTorsion; string loadcaseID = IMemberForce.lLoadCaseID.ToString(); //Set by member number--is there a way to do this in nested lists instead? ramNodeForceData.Axial = axial; ramNodeForceData.Location = loc; ramNodeForceData.MomMaj = momMaj; ramNodeForceData.MomMin = momMin; ramNodeForceData.ShearMaj = shearMaj; ramNodeForceData.ShearMin = shearMin; ramNodeForceData.Torsion = torsion; ramNodeForceData.LoadcaseID = loadcaseID; node.Fragments.Add(ramNodeForceData); } return(node); }
/***************************************************/ public static Bar ToBHoMObject(this IBeam ramBeam, ILayoutBeam ramLayoutBeam, double dElevation) { // Get coordinates from IBeam SCoordinate startPt = new SCoordinate(); SCoordinate endPt = new SCoordinate(); ramBeam.GetCoordinates(EBeamCoordLoc.eBeamEnds, ref startPt, ref endPt); Node startNode = new Node { Position = startPt.PointFromRAM() }; Node endNode = new Node { Position = endPt.PointFromRAM() }; //Assign section property per bar string sectionName = ramBeam.strSectionLabel; ISectionProperty sectionProperty = ToBHoMSection(ramBeam); // Create bars with section properties Bar bhomBar = new Bar { StartNode = startNode, EndNode = endNode, SectionProperty = sectionProperty, Name = sectionName }; // Set Properties bhomBar.OrientationAngle = 0; // Unique RAM ID RAMId RAMId = new RAMId(); RAMId.Id = ramBeam.lUID; bhomBar.SetAdapterId(RAMId); RAMFrameData ramFrameData = new RAMFrameData(); ramFrameData.FrameNumber = ramBeam.lLabel; ramFrameData.StartCantilever = ramBeam.dStartCantilever.FromInch(); ramFrameData.EndCantilever = ramBeam.dEndCantilever.FromInch(); ramFrameData.IsStubCantilever = (ramLayoutBeam.IsStubCantilever() == 1); ramFrameData.FrameType = ramBeam.eFramingType.ToString(); ramFrameData.Material = ramBeam.eMaterial.ToString(); bhomBar.Tags.Add("Beam"); // Get Steel beam results ISteelBeamDesignResult Result = ramBeam.GetSteelDesignResult(); DAArray ppalNumStuds = Result.GetNumStudsInSegments(); int numStudSegments = new int(); ppalNumStuds.GetSize(ref numStudSegments); double camber = ramBeam.dCamber; int studCount = 0; IAnalyticalResult AnalyticalResult = ramBeam.GetAnalyticalResult(); COMBO_MATERIAL_TYPE Steel_Grav = COMBO_MATERIAL_TYPE.GRAV_STEEL; IMemberForces IMemberForces = AnalyticalResult.GetMaximumComboReactions(Steel_Grav); //Add studs to custom Data by total stud count only for (int i = 0; i < numStudSegments; i++) { var segStudCount = new object(); ppalNumStuds.GetAt(i, ref segStudCount); string segStudStr = segStudCount.ToString(); int segStudNum = System.Convert.ToInt16(segStudStr); studCount += segStudNum; ramFrameData.Studs = studCount; } // Add camber to Custom Data if (camber > Double.MinValue) { ramFrameData.Camber = camber.FromInch(); } // Translate RAM Releases to BHoM Releases (in progress; logic not yet complete since it is difficult map Maj/Min axes to global XYZ axes for every member) // May be better to just do in custom data, although if we can do this mapping it may be useful bhomBar.Release = new BarRelease(); bhomBar.Release.StartRelease = new Constraint6DOF(); bhomBar.Release.EndRelease = new Constraint6DOF(); bhomBar.Release.StartRelease.RotationX = new DOFType(); bhomBar.Release.EndRelease.RotationX = new DOFType(); bhomBar.Release.StartRelease.RotationY = new DOFType(); bhomBar.Release.EndRelease.RotationY = new DOFType(); if (ramBeam.bMajAxisBendFixedStart == 1) { bhomBar.Release.StartRelease.RotationX = DOFType.Fixed; } else { bhomBar.Release.StartRelease.RotationX = DOFType.Free; } if (ramBeam.bMajAxisBendFixedEnd == 1) { bhomBar.Release.EndRelease.RotationX = DOFType.Fixed; } else { bhomBar.Release.EndRelease.RotationX = DOFType.Free; } if (ramBeam.bMinAxisBendFixedStart == 1) { bhomBar.Release.StartRelease.RotationY = DOFType.Fixed; } else { bhomBar.Release.StartRelease.RotationY = DOFType.Free; } if (ramBeam.bMinAxisBendFixedEnd == 1) { bhomBar.Release.EndRelease.RotationY = DOFType.Fixed; } else { bhomBar.Release.EndRelease.RotationY = DOFType.Free; } double DCI = Result.dDesignCapacityInteraction; double CDI = Result.dCriticalDeflectionInteraction; // Add DCI and CDI data ramFrameData.DesignCapacityInteraction = DCI; ramFrameData.CriticalDeflectionInteraction = CDI; bhomBar.Fragments.Add(ramFrameData); return(bhomBar); }