//Create Sap Points public static void CreateSapPoints() { //Points points = new SapPoint[spanList.Count + 1]; for (int i = 0; i < points.Length; i++) { points[i] = new SapPoint(mySapModel.MySapObjectModel, comSpanValues[i], 0, 0); } }
private void BwGenerateSap2000_DoWork(object sender, DoWorkEventArgs e) { // The first thing is to remove from the table the rows that have PL as the frame section // First of all, manipulates the data so that we can work with it in a better way HashSet <string> uniqueMaterials = new HashSet <string>(); HashSet <(string Section, string Material)> uniqueFrameSections = new HashSet <(string Section, string Material)>(); bwGenerateSap2000.ReportProgress(0, "Getting unique Materials, Profiles and Points from the Tekla Table."); int counter = 0; foreach (DataRow row in beamTable.Rows) { uniqueMaterials.Add(row.Field <string>("Material")); uniqueFrameSections.Add((row.Field <string>("Profile"), row.Field <string>("Material"))); } bwGenerateSap2000.ReportProgress(100, "Got unique Materials and Profiles."); bwGenerateSap2000.ReportProgress(0, "Opening SAP2000 Software."); // Opens a new Sap2000 empty model S2KModel.InitSingleton_NewInstance(UnitsEnum.kip_in_F, false); S2KModel.SM.NewModelBlank(false, UnitsEnum.kip_in_F); bwGenerateSap2000.ReportProgress(0, "SAP2000 Software Open."); // Adds the Materials to Sap2000 bwGenerateSap2000.ReportProgress(counter = 0, "Sending the Material Definitions to SAP2000."); Dictionary <string, string> TeklaToSapMatTranslate = new Dictionary <string, string>(); foreach (string TeklaMatName in uniqueMaterials) { string SapMatName = null; switch (TeklaMatName) { case "A500-GR.B-42": SapMatName = S2KModel.SM.MaterialMan.AddNewMaterial(MatTypeEnum.Steel, "United States", "ASTM A500", "Grade B, Fy 42 (HSS Round)"); break; case "A500-GR.B-46": SapMatName = S2KModel.SM.MaterialMan.AddNewMaterial(MatTypeEnum.Steel, "United States", "ASTM A500", "Grade B, Fy 46 (HSS Rect.)"); break; case "A36": SapMatName = S2KModel.SM.MaterialMan.AddNewMaterial(MatTypeEnum.Steel, "United States", "ASTM A36", "Grade 36"); break; case "A992": SapMatName = S2KModel.SM.MaterialMan.AddNewMaterial(MatTypeEnum.Steel, "United States", "ASTM A992", "Grade 50"); break; case "NOT_DEFINED": SapMatName = S2KModel.SM.MaterialMan.SetMaterial(MatTypeEnum.Steel, TeklaMatName); break; case "5000": SapMatName = S2KModel.SM.MaterialMan.SetMaterial(MatTypeEnum.Steel, TeklaMatName); break; case "A53-B": SapMatName = S2KModel.SM.MaterialMan.AddNewMaterial(MatTypeEnum.Steel, "United States", "ASTM A53", "Grade B"); break; case "F1554-GR.55": SapMatName = S2KModel.SM.MaterialMan.SetMaterial(MatTypeEnum.Steel, TeklaMatName); break; case "A563": SapMatName = S2KModel.SM.MaterialMan.SetMaterial(MatTypeEnum.Steel, TeklaMatName); break; case "A572-Gr 42": SapMatName = S2KModel.SM.MaterialMan.SetMaterial(MatTypeEnum.Steel, TeklaMatName); break; case "57250_CVNB": case "A572-50": case "A572-Gr 50": if (!TeklaToSapMatTranslate.Values.Contains("A572Gr50")) { SapMatName = S2KModel.SM.MaterialMan.AddNewMaterial(MatTypeEnum.Steel, "United States", "ASTM A572", "Grade 50"); } else { SapMatName = "A572Gr50"; } break; default: SapMatName = S2KModel.SM.MaterialMan.SetMaterial(MatTypeEnum.Steel, TeklaMatName); break; } TeklaToSapMatTranslate.Add(TeklaMatName, SapMatName); bwGenerateSap2000.ReportProgress(S2KStaticMethods.ProgressPercent(counter++, uniqueMaterials.Count)); } bwGenerateSap2000.ReportProgress(counter = 100, "Sent the Material Definitions to SAP2000."); // Adds the Profiles to Sap2000 bwGenerateSap2000.ReportProgress(counter = 0, "Sending the Section Definitions to SAP2000."); foreach ((string Section, string Material) in uniqueFrameSections) { bool ret = false; Regex HSSPipeTeklaRegex = new Regex(@"^HSS\d*X\d*\.\d*"); // Is it a custom I section from Tekla? if (Section.StartsWith("HI")) { // It is a custom I beam // HI406.4-25.4-25.4*609.6 string tempSectionName = Section.Replace("HI", ""); string[] chunks = tempSectionName.Split(new char[] { '-', '*' }); ret = S2KModel.SM.FrameSecMan.SetOrAddISection(Section + "_" + TeklaToSapMatTranslate[Material], TeklaToSapMatTranslate[Material], double.Parse(chunks[0]) / 25.4, double.Parse(chunks[3]) / 25.4, double.Parse(chunks[2]) / 25.4, double.Parse(chunks[1]) / 25.4, double.Parse(chunks[3]) / 25.4, double.Parse(chunks[2]) / 25.4); } else if (HSSPipeTeklaRegex.IsMatch(Section)) { ret = S2KModel.SM.FrameSecMan.ImportFrameSection(Section + "_" + TeklaToSapMatTranslate[Material], TeklaToSapMatTranslate[Material], "AISC15.pro", Section.Replace("X0.", "X.")); } else { ret = S2KModel.SM.FrameSecMan.ImportFrameSection(Section + "_" + TeklaToSapMatTranslate[Material], TeklaToSapMatTranslate[Material], "AISC15.pro", Section); } if (!ret) { bwGenerateSap2000.ReportProgress(-1, $"Could not Add Section: {Section}_{TeklaToSapMatTranslate[Material]}{Environment.NewLine}"); } bwGenerateSap2000.ReportProgress(S2KStaticMethods.ProgressPercent(counter++, uniqueFrameSections.Count)); } bwGenerateSap2000.ReportProgress(counter = 100, "Sent the Section Definitions to SAP2000."); S2KModel.SM.WindowVisible = true; // Adds the points and the frames Dictionary <Point3D, SapPoint> uniquePoints = new Dictionary <Point3D, SapPoint>(); bwGenerateSap2000.ReportProgress(counter = 0, "Sending the Points and Frames to SAP2000."); foreach (DataRow row in beamTable.Rows) { // Gets the start point string startPointStr = row.Field <string>("StartPoint"); startPointStr = startPointStr.Trim(new char[] { '(', ')' }); double[] startPointValues = (from a in startPointStr.Split(new char[] { ',' }) select Math.Round(double.Parse(a) / 25.4, 3)).ToArray(); Point3D startPoint = new Point3D(startPointValues[0], startPointValues[1], startPointValues[2]); SapPoint sapStartPoint = null; // Add to the model or get if (uniquePoints.ContainsKey(startPoint)) { sapStartPoint = uniquePoints[startPoint]; } else { sapStartPoint = S2KModel.SM.PointMan.AddByPoint3D_ReturnSapEntity(startPoint); if (sapStartPoint == null) { throw new Exception($"Point located at {startPointStr} could not be added to the Sap2000 model."); } uniquePoints.Add(startPoint, sapStartPoint); } // Gets the end point string endPointStr = row.Field <string>("endPoint"); endPointStr = endPointStr.Trim(new char[] { '(', ')' }); double[] endPointValues = (from a in endPointStr.Split(new char[] { ',' }) select Math.Round(double.Parse(a) / 25.4, 3)).ToArray(); Point3D endPoint = new Point3D(endPointValues[0], endPointValues[1], endPointValues[2]); SapPoint sapEndPoint = null; // Add to the model or get if (uniquePoints.ContainsKey(endPoint)) { sapEndPoint = uniquePoints[endPoint]; } else { sapEndPoint = S2KModel.SM.PointMan.AddByPoint3D_ReturnSapEntity(endPoint); if (sapEndPoint == null) { throw new Exception($"Point located at {endPointStr} could not be added to the Sap2000 model."); } uniquePoints.Add(endPoint, sapEndPoint); } int b = 0; b++; // Adds the frame SapFrame addedFrame = S2KModel.SM.FrameMan.AddByPoint_ReturnSapEntity(sapStartPoint, sapEndPoint, row.Field <string>("Profile") + "_" + TeklaToSapMatTranslate[row.Field <string>("Material")]); List <int> failedFrameRows = new List <int>(); // Keeps track of the failed frames if (addedFrame == null) { bwGenerateSap2000.ReportProgress(-1, $"Could not Add Frame. Table Row {beamTable.Rows.IndexOf(row)} | {row.Field<string>("Profile")} | Start: {row.Field<string>("StartPoint")} | End: {row.Field<string>("EndPoint")}{Environment.NewLine}"); } else { // the frame has been added // Attempts to rotate the frame in accordance to the angle double rotateAngle = GetRotateAngleFromTeklaString(row.Field <string>("Position")); addedFrame.SetLocalAxes(rotateAngle); } bwGenerateSap2000.ReportProgress(S2KStaticMethods.ProgressPercent(counter++, beamTable.Rows.Count)); } bwGenerateSap2000.ReportProgress(counter = 100, "Sent the Frames to SAP2000."); S2KModel.SM.ShowSapAsync(); }
private void analysisBtn_Click(object sender, RoutedEventArgs e) { //file Path and file Name string filePath = "C:\\CSiAPIexample"; string fileName = "Model1"; //Create Sap Model mySapModel = new SapModel(filePath, fileName); //initialize Model units KN, m, C: mySapModel.InitializeUnits(eUnits.kN_m_C); /*----------------------------------------------------------*/ /*-----------------------Create Material-----------------------*/ //Concrete SapMaterial concMat = new SapMaterial(mySapModel.MySapObjectModel, $"Fcu{fcutxtBox.Text}", eMatType.Concrete); concMat.SetNewMaterial($"Fcu{fcutxtBox.Text}", eMatType.Concrete); concMat.SetConcMat($"Fcu{fcutxtBox.Text}", Convert.ToDouble(fcutxtBox.Text)); concMat.SetIsotropicProps($"Fcu{fcutxtBox.Text}", 220000, 0.20, 9.900E-06); concMat.SetWeight($"Fcu{fcutxtBox.Text}", 25); //Steel Rebar Material //SapMaterial rebarMat = new SapMaterial(mySapModel.MySapObjectModel, ) /*----------------------------------------------------------*/ //Creating Sections B = new SapRectSection(mySapModel.MySapObjectModel, $"B{Convert.ToDouble(btxtBox.Text)}X{Convert.ToDouble(ttxtBox.Text)}" , concMat, Convert.ToDouble(btxtBox.Text) , Convert.ToDouble(ttxtBox.Text), -1); B.SetRectSec(); /*----------------------------------------------------------*/ //Points points = new SapPoint[nSpans + 1]; for (int i = 0; i < nSpans + 1; i++) { points[i] = new SapPoint(mySapModel.MySapObjectModel, comSpanValues[i], 0, 0); } /*----------------------------------------------------------*/ //Beams in X-Direction: xbeams = new SapFrameElement[nSpans]; for (int i = 0; i < nSpans; i++) { xbeams[i] = new SapFrameElement(mySapModel.MySapObjectModel, points[i], points[i + 1], B, $"{i + 1}", $"B{i + 1}"); } /*----------------------------------------------------------*/ //Initialize hinged joints for (int i = 0; i < nSpans + 1; i++) { points[i].SetRestraints(Restraints.Hinged); } //xBeamsComboBox.ItemsSource = xbeams; //xBeamsComboBox.SelectedIndex = 0; /*----------------------Load Patterns----------------------*/ for (int i = 0; i < loadPatternName.Count; i++) { SapLoadPattern load = new SapLoadPattern(mySapModel.MySapObjectModel, patternType[i], loadPatternName[i] , SelfWtMultiplier[i], true); loadPatterns.Add(load); load.AddLoadPattern(); } /*----------------------Load Combinations----------------------*/ for (int i = 0; i < Combinations.Count; i++) { mySapModel.MySapObjectModel.RespCombo.Add(Combinations[i], 0); mySapModel.MySapObjectModel.RespCombo.SetCaseList(Combinations[i], ref ec, loadCaseName[i] , loadFactorList[i]); } /*----------------------Adding Distributed Loads----------------------*/ for (int i = 0; i < distLoadVals.Count; i++) { SapFrameElement item = null; SapLoadPattern loadPat = null; for (int j = 0; j < nSpans; j++) { if (DistLoadFrameElement[i] == xbeams[j].Label) { item = xbeams[j]; } } for (int j = 0; j < loadPatterns.Count; j++) { if (distLoadPattern[i] == loadPatterns[j].Name) { loadPat = loadPatterns[j]; } } SapFrameDistLoad distload = new SapFrameDistLoad(loadPat, 1, distLoadDirVal[i], 0, 1, distLoadVals[i], distLoadVals[i], true); distLoads.Add(distload); item.SetDistributedLoad(distload); } /*----------------------Adding Point Loads----------------------*/ for (int i = 0; i < concLoadVals.Count; i++) { SapFrameElement item = null; SapLoadPattern loadPat = null; for (int j = 0; j < nSpans; j++) { if (concLoadFrameElement[i] == xbeams[j].Label) { item = xbeams[j]; } } for (int j = 0; j < loadPatterns.Count; j++) { if (concLoadPattern[i] == loadPatterns[j].Name) { loadPat = loadPatterns[j]; } } SapPointLoad D1 = new SapPointLoad(loadPat, concLoadVals[i], ConsoleApplication1.Type.Force, concLoadDirVal[i]); pointLoads.Add(D1); item.SetFramePointLoad(D1, relDistList[i]); } }