//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);
            }
        }
예제 #2
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]);
            }
        }