예제 #1
0
        public void rebarStirrupLayout_Form(UIDocument uiDoc)
        {
            Document doc = uiDoc.Document;

            double factor  = 4;
            double delta_1 = 50 / 304.8;
            double pitch_1 = 150 / 304.8;
            double pitch_2 = 300 / 304.8;

            double delta_3 = 50 / 304.8;
            double pitch_3 = 100 / 304.8;
            int    N3      = 5;

            double myConvertFactor = 304.8;


            bool inputSuccess = false;

            while (!inputSuccess)
            {
                using (var myInputFormSetting = new SettingDialog())
                {
                    myInputFormSetting.ShowDialog();

                    factor  = Convert.ToDouble(myInputFormSetting.factorTb.Text);
                    delta_1 = Convert.ToDouble(myInputFormSetting.delta_1Tb.Text) / myConvertFactor;
                    pitch_1 = Convert.ToDouble(myInputFormSetting.pitch_1Tb.Text) / myConvertFactor;
                    pitch_2 = Convert.ToDouble(myInputFormSetting.pitch_2Tb.Text) / myConvertFactor;

                    delta_3 = Convert.ToDouble(myInputFormSetting.delta_3Tb.Text) / myConvertFactor;
                    pitch_3 = Convert.ToDouble(myInputFormSetting.pitch_3Tb.Text) / myConvertFactor;
                    N3      = Convert.ToInt32(myInputFormSetting.n3Tb.Text);


                    //if the user hits cancel just drop out of macro
                    if (myInputFormSetting.DialogResult == System.Windows.Forms.DialogResult.Cancel)
                    {
                        return;
                    }
                    {
                        //else do all this :)
                        myInputFormSetting.Close();
                    }

                    if (myInputFormSetting.DialogResult == System.Windows.Forms.DialogResult.OK)
                    {
                        //else do all this :)
                        inputSuccess = true;
                        myInputFormSetting.Close();
                    }
                }
            }


            // Pick Rebar
            List <int> myListIdCategoryRebar = new List <int>();

            myListIdCategoryRebar.Add((int)BuiltInCategory.OST_Rebar);

            // Select first Element (ex beam)
            Reference myRefRebar = uiDoc.Selection.PickObject(ObjectType.Element,
                                                              new FilterByIdCategory(myListIdCategoryRebar),
                                                              "Pick a Rebar...");
            //Get rebar from ref
            Rebar myRebar = doc.GetElement(myRefRebar) as Rebar;

            //Set rebar single

            using (Transaction myTrans = new Transaction(doc, "SET FIRST REBAR AS SINGLE"))

            {
                myTrans.Start();
                myRebar.GetShapeDrivenAccessor().SetLayoutAsSingle();
                myTrans.Commit();
            }


            Element myBeam = doc.GetElement(myRebar.GetHostId());

            //Set current Beam be Joined

            setBeJoined(doc, myBeam);

            while (true)
            {
                List <int> myListBeamCol = new List <int>();
                myListBeamCol.Add((int)BuiltInCategory.OST_StructuralFraming);
                myListBeamCol.Add((int)BuiltInCategory.OST_StructuralColumns);
                // Select first Element (ex beam)
                List <Reference> myListInterRef = uiDoc.Selection.PickObjects(ObjectType.Element,
                                                                              new FilterByIdCategory(myListBeamCol),
                                                                              "Pick a Beam and Col...") as List <Reference>;

                List <Element> myInterSec = new List <Element>();


                foreach (Reference myRef in myListInterRef)
                {
                    myInterSec.Add(doc.GetElement(myRef));
                }

                // Kiem tra co 2 cot ko?
                int numCol = 0;

                foreach (Element myE in myInterSec)
                {
                    if (myE.Category.Name == "Structural Columns")
                    {
                        numCol += 1;
                    }
                }

                if (numCol != 2 || myInterSec.Count > 3)
                {
                    TaskDialog.Show("Erorr!!!", "Các đối tượng được chọn phải có đủ 2 cột và tối đa 1 dầm");
                    //return;
                }

                // Kiem tra truong hop tinh
                if (myInterSec.Count() == 2)
                {
                    rebarBeam2Col(doc, factor, delta_1, pitch_1, pitch_2, myRebar, myInterSec);
                }

                else
                {
                    List <double> myListEndPointDis = getEndsSegBeam2(doc, myBeam.Id, myInterSec);
                    myListEndPointDis.Sort();


                    Dictionary <double, int> myDicDisNumDetail = detailListDistance2(myListEndPointDis,
                                                                                     factor,
                                                                                     delta_1, pitch_1,
                                                                                     pitch_2,
                                                                                     delta_3, pitch_3, N3);


                    List <double> myListSpace = new List <double>()
                    {
                        pitch_1, pitch_2, pitch_3, pitch_3, pitch_2, pitch_1
                    };

                    List <ElementId> myListRebarCopyId = copyRebarByDistance2(doc, myRebar, myDicDisNumDetail);


                    List <double> myDistances = myDicDisNumDetail.Keys.ToList();
                    myDistances.Sort();



                    List <int> myListNum = new List <int>();

                    foreach (double key in myDistances)
                    {
                        myListNum.Add(myDicDisNumDetail[key]);
                    }

                    //Layout

                    // using transcation (edit DB)
                    for (int i = 0; i < myListRebarCopyId.Count(); i++)
                    {
                        using (Transaction myTrans = new Transaction(doc, "CopyElementByCoordinate"))

                        {
                            myTrans.Start();
                            ElementId rebarId  = myListRebarCopyId[i];
                            Rebar     myRebarI = doc.GetElement(rebarId) as Rebar;

                            if (myListNum[i] < -1)
                            {
                                myRebarI.GetShapeDrivenAccessor().SetLayoutAsNumberWithSpacing((myListNum[i]) * -1, myListSpace[i], true, true, true);
                            }

                            if (myListNum[i] == -1)
                            {
                                myRebarI.GetShapeDrivenAccessor().SetLayoutAsSingle();
                            }

                            if (myListNum[i] == 0)
                            {
                                myRebarI.GetShapeDrivenAccessor().SetLayoutAsSingle();
                            }

                            if (myListNum[i] == 1)
                            {
                                myRebarI.GetShapeDrivenAccessor().SetLayoutAsSingle();
                            }

                            if (myListNum[i] > 1)
                            {
                                myRebarI.GetShapeDrivenAccessor().SetLayoutAsNumberWithSpacing(myListNum[i], myListSpace[i], false, true, true);
                            }
                            myTrans.Commit();
                        }
                    }

                    //delete element
                    using (Transaction myTrans = new Transaction(doc, "Delete First ReBar"))

                    {
                        myTrans.Start();
                        //doc.Delete(myRebar.Id);
                        myTrans.Commit();
                    }
                }
            }
        }
예제 #2
0
        public void rebarStirrupLayout_Form(UIDocument uiDoc)
        {
            Document doc = uiDoc.Document;


            double factor  = 4;
            double delta_1 = 50 / 304.8;
            double pitch_1 = 150 / 304.8;
            double pitch_2 = 300 / 304.8;

            double delta_3 = 50 / 304.8;
            double pitch_3 = 100 / 304.8;
            int    N3      = 5;

            double myConvertFactor = 304.8;


            bool inputSuccess = false;

            while (!inputSuccess)
            {
                using (var myInputFormSetting = new SettingDialog())
                {
                    myInputFormSetting.ShowDialog();

                    factor  = Convert.ToDouble(myInputFormSetting.factorTb.Text);
                    delta_1 = Convert.ToDouble(myInputFormSetting.delta_1Tb.Text) / myConvertFactor;
                    pitch_1 = Convert.ToDouble(myInputFormSetting.pitch_1Tb.Text) / myConvertFactor;
                    pitch_2 = Convert.ToDouble(myInputFormSetting.pitch_2Tb.Text) / myConvertFactor;

                    delta_3 = Convert.ToDouble(myInputFormSetting.delta_3Tb.Text) / myConvertFactor;
                    pitch_3 = Convert.ToDouble(myInputFormSetting.pitch_3Tb.Text) / myConvertFactor;
                    N3      = Convert.ToInt32(myInputFormSetting.n3Tb.Text);


                    //if the user hits cancel just drop out of macro
                    if (myInputFormSetting.DialogResult == System.Windows.Forms.DialogResult.Cancel)
                    {
                        return;
                    }
                    {
                        //else do all this :)
                        myInputFormSetting.Close();
                    }

                    if (myInputFormSetting.DialogResult == System.Windows.Forms.DialogResult.OK)
                    {
                        //else do all this :)
                        inputSuccess = true;
                        myInputFormSetting.Close();
                    }
                }
            }


            // Pick Rebar
            List <int> myListIdCategoryRebar = new List <int>();

            myListIdCategoryRebar.Add((int)BuiltInCategory.OST_Rebar);

            // Select first Element (ex beam)
            Reference myRefRebar = uiDoc.Selection.PickObject(ObjectType.Element,
                                                              new FilterByIdCategory(myListIdCategoryRebar),
                                                              "Pick a Rebar...");
            //Get rebar from ref
            Rebar myRebar = doc.GetElement(myRefRebar) as Rebar;

            //Set rebar single
            //			using (Transaction myTrans = new Transaction(doc,"SET FIRST REBAR AS SINGLE"))
            //
            //			{
            //				myTrans.Start();
            //				myRebar.GetShapeDrivenAccessor().SetLayoutAsSingle();
            //				myTrans.Commit();
            //			}


            Element myBeam = doc.GetElement(myRebar.GetHostId());

            //Get location curve of beam
            LocationCurve lc   = myBeam.Location as LocationCurve;
            Line          line = lc.Curve as Line;

            //Get vector of location cuver beam
            XYZ p1 = line.GetEndPoint(0);
            XYZ q  = line.GetEndPoint(1);
            XYZ v  = q - p1; // Vector equation of line

            XYZ p = p1 - 0.1 * v;

            //Set current Beam be Joined

            setBeJoined(doc, myBeam);

            while (true)
            {
                //Pick Face end

                List <Reference> myListRef = uiDoc.Selection.PickObjects(ObjectType.Face) as List <Reference>;

                List <Face> myListFacePicked = new List <Face>();

                foreach (Reference myRef in myListRef)
                {
                    Element E = doc.GetElement(myRef);

                    GeometryObject myGeoObj = E.GetGeometryObjectFromReference(myRef);

                    Face myPickedFace = myGeoObj as Face;

                    myListFacePicked.Add(myPickedFace);
                }

                if (myListFacePicked.Count != 2 && myListFacePicked.Count != 4)
                {
                    TaskDialog.Show("Error!", "Chua ho tro lua chon: " + myListFacePicked.Count() + " mat, Chon 2 hoac 4 mat");
                    continue;
                }

                else
                {
                    string caseDistributionRebar = "TH2: Co dam o giua";

                    List <double> myListSpace = new List <double>()
                    {
                        pitch_1, pitch_2, pitch_3, pitch_3, pitch_2, pitch_1
                    };
                    if (myListFacePicked.Count == 2)
                    {
                        myListSpace = new List <double>()
                        {
                            pitch_1, pitch_2, pitch_1, pitch_2, pitch_2, pitch_1
                        };
                        caseDistributionRebar = "TH1: Khong co dam o giua";
                    }
                    TaskDialog.Show("Info", caseDistributionRebar);

                    // List of boundaries faces
                    List <double> myListEndPointDis = getAndSortDisOfEndFaces(myListFacePicked, p);
                    myListEndPointDis.Sort();



                    Dictionary <double, int> myDicDisNumDetail = detailListDistance_Update(myListEndPointDis,
                                                                                           factor,
                                                                                           delta_1, pitch_1,
                                                                                           pitch_2,
                                                                                           delta_3, pitch_3, N3);


                    List <ElementId> myListRebarCopyId = copyRebarByDistance2_Update(doc, myRebar, myDicDisNumDetail);


                    List <double> myDistances = myDicDisNumDetail.Keys.ToList();
                    myDistances.Sort();



                    List <int> myListNum = new List <int>();

                    foreach (double key in myDistances)
                    {
                        myListNum.Add(myDicDisNumDetail[key]);
                    }

                    //Layout

                    // using transcation (edit DB)
                    for (int i = 0; i < myListRebarCopyId.Count(); i++)
                    {
                        using (Transaction myTrans = new Transaction(doc, "CopyElementByCoordinate"))

                        {
                            myTrans.Start();
                            ElementId rebarId  = myListRebarCopyId[i];
                            Rebar     myRebarI = doc.GetElement(rebarId) as Rebar;

                            if (myListNum[i] < -1)
                            {
                                myRebarI.GetShapeDrivenAccessor().SetLayoutAsNumberWithSpacing((myListNum[i]) * -1, myListSpace[i], true, true, true);
                            }

                            if (myListNum[i] == -1)
                            {
                                myRebarI.GetShapeDrivenAccessor().SetLayoutAsSingle();
                            }

                            if (myListNum[i] == 0)
                            {
                                myRebarI.GetShapeDrivenAccessor().SetLayoutAsSingle();
                            }

                            if (myListNum[i] == 1)
                            {
                                myRebarI.GetShapeDrivenAccessor().SetLayoutAsSingle();
                            }

                            if (myListNum[i] > 1)
                            {
                                myRebarI.GetShapeDrivenAccessor().SetLayoutAsNumberWithSpacing(myListNum[i], myListSpace[i], false, true, true);
                            }
                            myTrans.Commit();
                        }
                    }

                    //delete element
                    using (Transaction myTrans = new Transaction(doc, "Delete First ReBar"))

                    {
                        myTrans.Start();
                        //doc.Delete(myRebar.Id);
                        myTrans.Commit();
                    }
                }
            }
        }
        public void rebarStirrupLayout_Form(UIDocument uiDoc)
        {
            Document doc = uiDoc.Document;

            //Stirrup
            bool isSt1Yes   = true;
            bool isOpposite = false;

            double factor  = 4;
            double delta_1 = 50 / 304.8;
            double pitch_1 = 150 / 304.8;
            double pitch_2 = 300 / 304.8;

            double delta_3 = 50 / 304.8;
            double pitch_3 = 100 / 304.8;
            int    N3      = 4;


            //Stirrup
            bool isYes_C1      = true;
            bool isOpposite_C1 = false;

            double factor_C1  = 4;
            double delta_1_C1 = 50 / 304.8;
            double pitch_1_C1 = 150 / 304.8;
            double pitch_2_C1 = 300 / 304.8;

            double delta_3_C1 = 50 / 304.8;
            double pitch_3_C1 = 100 / 304.8;
            int    N3_C1      = 4;

            double myConvertFactor = 304.8;


            //Load rebarShape
            // RebarShape
            FilteredElementCollector fecRebarShap = new FilteredElementCollector(doc)
                                                    .OfClass(typeof(RebarShape));

            IEnumerable <RebarShape> iterRebarBarShapes = fecRebarShap.Cast <RebarShape>();


            // Load Rebar Type
            // Rebartype
            FilteredElementCollector fecBarType = new FilteredElementCollector(doc)
                                                  .OfClass(typeof(RebarBarType));

            IEnumerable <RebarBarType> iterRebarBarTypes = fecBarType.Cast <RebarBarType>();


            // Bottom Layer
            // Layer1
            bool   isLB1Yes         = true;
            double FB1              = 6;
            double CB1              = 80;
            string rebaNameShape_L1 = string.Empty;
            string rebaNameType_L1  = string.Empty;


            // Bottom Layer
            // Layer2
            bool   isLB2Yes = true;
            double FB2      = 3;
            double CB2      = 150;

            string rebaNameShape_L2 = string.Empty;
            string rebaNameType_L2  = string.Empty;

            bool inputSuccess = false;

            while (!inputSuccess)
            {
                using (var myInputFormSetting = new SettingDialog())
                {
                    //add rebar Shape list
                    foreach (RebarShape myRebarShape in iterRebarBarShapes)
                    {
                        myInputFormSetting.RebarShap1_Cb.Items.Add(myRebarShape.Name);
                        myInputFormSetting.RebarShap2_Cb.Items.Add(myRebarShape.Name);
                    }

                    //					myInputFormSetting.RebarShap1_Cb.SelectedIndex = 0;
                    //					myInputFormSetting.RebarShap2_Cb.SelectedIndex = 0;

                    //add rebar type list
                    foreach (RebarBarType myRebarType in iterRebarBarTypes)
                    {
                        myInputFormSetting.RebarType1_Cb.Items.Add(myRebarType.Name);
                        myInputFormSetting.RebarType2_Cb.Items.Add(myRebarType.Name);
                    }

                    //					myInputFormSetting.RebarType1_Cb.SelectedIndex = 1;
                    //					myInputFormSetting.RebarType2_Cb.SelectedIndex = 1;


                    myInputFormSetting.ShowDialog();

                    //stirrup
                    factor  = Convert.ToDouble(myInputFormSetting.factorTb.Text);
                    delta_1 = Convert.ToDouble(myInputFormSetting.delta_1Tb.Text) / myConvertFactor;
                    pitch_1 = Convert.ToDouble(myInputFormSetting.pitch_1Tb.Text) / myConvertFactor;
                    pitch_2 = Convert.ToDouble(myInputFormSetting.pitch_2Tb.Text) / myConvertFactor;

                    delta_3    = Convert.ToDouble(myInputFormSetting.delta_3Tb.Text) / myConvertFactor;
                    pitch_3    = Convert.ToDouble(myInputFormSetting.pitch_3Tb.Text) / myConvertFactor;
                    N3         = Convert.ToInt32(myInputFormSetting.n3Tb.Text);
                    isOpposite = myInputFormSetting.oppDirChecked;
                    isSt1Yes   = myInputFormSetting.yesST_Chb.Checked;


                    //C1
                    factor_C1  = Convert.ToDouble(myInputFormSetting.factor_C1Tb.Text);
                    delta_1_C1 = Convert.ToDouble(myInputFormSetting.delta_1_C1Tb.Text) / myConvertFactor;
                    pitch_1_C1 = Convert.ToDouble(myInputFormSetting.pitch_1_C1Tb.Text) / myConvertFactor;
                    pitch_2_C1 = Convert.ToDouble(myInputFormSetting.pitch_2_C1Tb.Text) / myConvertFactor;

                    delta_3_C1    = Convert.ToDouble(myInputFormSetting.delta_3_C1Tb.Text) / myConvertFactor;
                    pitch_3_C1    = Convert.ToDouble(myInputFormSetting.pitch_3_C1Tb.Text) / myConvertFactor;
                    N3_C1         = Convert.ToInt32(myInputFormSetting.n3_C1Tb.Text);
                    isOpposite_C1 = myInputFormSetting.oppDirChecked;
                    isYes_C1      = myInputFormSetting.yesC1_Chb.Checked;


                    //Shape
                    rebaNameShape_L1 = myInputFormSetting.RebarShap1_Cb.Text;
                    rebaNameShape_L2 = myInputFormSetting.RebarShap2_Cb.Text;

                    //type
                    rebaNameType_L1 = myInputFormSetting.RebarType1_Cb.Text;
                    rebaNameType_L2 = myInputFormSetting.RebarType2_Cb.Text;


                    //Yes/ No bottom rebar
                    if (!myInputFormSetting.yes1_Chb.Checked)
                    {
                        isLB1Yes = false;
                    }
                    if (!myInputFormSetting.yes2_Chb.Checked)
                    {
                        isLB2Yes = false;
                    }

                    // Layer1

                    FB1 = Convert.ToDouble(myInputFormSetting.FB1_Tb.Text);
                    CB1 = Convert.ToDouble(myInputFormSetting.CB1_Tb.Text) / myConvertFactor;


                    // Bottom Layer
                    // Layer2

                    FB2 = Convert.ToDouble(myInputFormSetting.FB2_Tb.Text);
                    CB2 = Convert.ToDouble(myInputFormSetting.CB2_Tb.Text) / myConvertFactor;



                    //if the user hits cancel just drop out of macro
                    if (myInputFormSetting.DialogResult == System.Windows.Forms.DialogResult.Cancel)
                    {
                        return;
                    }
                    {
                        //else do all this :)
                        myInputFormSetting.Close();
                    }

                    if (myInputFormSetting.DialogResult == System.Windows.Forms.DialogResult.OK)
                    {
                        //else do all this :)
                        inputSuccess = true;
                        myInputFormSetting.Close();
                    }
                }
            }

            //Check mode
            //			TaskDialog.Show("opposite", isOpposite.ToString());
            //			TaskDialog.Show("draw stirrup", isSt1Yes.ToString());
            //
            //			TaskDialog.Show("isL1", isLB1Yes.ToString());
            //			TaskDialog.Show("IsL2", isLB1Yes.ToString());
            //
            //
            //
            //			TaskDialog.Show("Rebar Shape1", rebaNameShape_L1);
            //			TaskDialog.Show("Rebar Shape2", rebaNameShape_L2);
            //
            //
            //			TaskDialog.Show("Rebar Shape1", rebaNameType_L1);
            //			TaskDialog.Show("Rebar Shape2", rebaNameType_L2);


            //Set mybeam
            Element myBeam = null;

            // Kiem tra ve stirrup

            List <Rebar> myListRebar    = new List <Rebar>();
            List <Rebar> myListRebar_C1 = new List <Rebar>();

            if (isSt1Yes)
            {
                // Pick Rebar
                List <int> myListIdCategoryRebar = new List <int>();
                myListIdCategoryRebar.Add((int)BuiltInCategory.OST_Rebar);

                // Select first Element (ex beam)
                List <Reference> myListRefRebar = uiDoc.Selection.PickObjects(ObjectType.Element,
                                                                              new FilterByIdCategory(myListIdCategoryRebar),
                                                                              "Pick a stirrup Rebar...") as List <Reference>;


                foreach (Reference myRefRebar in myListRefRebar)
                {
                    Rebar myRebarpicked = doc.GetElement(myRefRebar) as Rebar;
                    myListRebar.Add(myRebarpicked);
                }
                myBeam = doc.GetElement(myListRebar[0].GetHostId());
            }

            if (isYes_C1)
            {
                // Pick Rebar
                List <int> myListIdCategoryRebar_C1 = new List <int>();
                myListIdCategoryRebar_C1.Add((int)BuiltInCategory.OST_Rebar);

                // Select first Element (ex beam)
                List <Reference> myListRefRebar_C1 = uiDoc.Selection.PickObjects(ObjectType.Element,
                                                                                 new FilterByIdCategory(myListIdCategoryRebar_C1),
                                                                                 "Pick a C Rebar ...") as List <Reference>;


                foreach (Reference myRefRebar_C1 in myListRefRebar_C1)
                {
                    Rebar myRebarpicked_C1 = doc.GetElement(myRefRebar_C1) as Rebar;
                    myListRebar_C1.Add(myRebarpicked_C1);
                }
                myBeam = doc.GetElement(myListRebar_C1[0].GetHostId());
            }

            else
            {
                List <int> myListIdCategoryRebar = new List <int>();
                myListIdCategoryRebar.Add((int)BuiltInCategory.OST_StructuralFraming);
                Reference myRefmyBeam = uiDoc.Selection.PickObject(ObjectType.Element,
                                                                   new FilterByIdCategory(myListIdCategoryRebar),
                                                                   "Pick a Beam...");

                myBeam = doc.GetElement(myRefmyBeam);
            }


            //Get location curve of beam
            LocationCurve lc   = myBeam.Location as LocationCurve;
            Line          line = lc.Curve as Line;

            //Get vector of location cuver beam
            XYZ p = line.GetEndPoint(0);
            XYZ q = line.GetEndPoint(1);
            XYZ v = q - p; // Vector equation of line

            XYZ pE = p - 0.5 * v;
            XYZ vE = q - p;

            //Set current Beam be Joined

            //setBeJoined(myBeam);

            while (true)
            {
                #region Pick faces
                //Pick Face end

                List <Reference> myListRef = uiDoc.Selection.PickObjects(ObjectType.Face) as List <Reference>;

                List <Face> myListFacePicked = new List <Face>();

                foreach (Reference myRef in myListRef)
                {
                    Element E = doc.GetElement(myRef);

                    GeometryObject myGeoObj = E.GetGeometryObjectFromReference(myRef);

                    Face myPickedFace = myGeoObj as Face;

                    myListFacePicked.Add(myPickedFace);
                }
                #endregion


                #region Error picked faces
                if (myListFacePicked.Count != 2 && myListFacePicked.Count != 4)
                {
                    TaskDialog.Show("Error!", "Chua ho tro lua chon: " + myListFacePicked.Count() + " mat, Chon 2 hoac 4 mat");
                    continue;
                }

                #endregion

                else
                {
                    string caseDistributionRebar = "Case 2: 4 Faces";

                    List <double> myListSpace = new List <double>()
                    {
                        pitch_1, pitch_2, pitch_3, pitch_3, pitch_2, pitch_1
                    };
                    List <double> myListSpace_C1 = new List <double>()
                    {
                        pitch_1_C1, pitch_2_C1, pitch_3_C1, pitch_3_C1, pitch_2_C1, pitch_1_C1
                    };
                    if (myListFacePicked.Count == 2)
                    {
                        myListSpace = new List <double>()
                        {
                            pitch_1, pitch_2, pitch_1, pitch_2, pitch_2, pitch_1
                        };
                        myListSpace_C1 = new List <double>()
                        {
                            pitch_1_C1, pitch_2_C1, pitch_1_C1, pitch_2_C1, pitch_2_C1, pitch_1_C1
                        };
                        caseDistributionRebar = "Case 1: 2 Faces";
                    }
                    TaskDialog.Show("Info", caseDistributionRebar);

                    if (isSt1Yes)
                    {
                        #region Rebar stirrup

                        // List of boundaries faces
                        List <double> myListEndPointDis = getAndSortDisOfEndFaces(myListFacePicked, pE);
                        myListEndPointDis.Sort();

                        Dictionary <double, double> myDicDisNumDetail = detailListDistance_Update_MaxSpace(myListEndPointDis,
                                                                                                           factor,
                                                                                                           delta_1, pitch_1,
                                                                                                           pitch_2,
                                                                                                           delta_3, pitch_3, N3);

                        foreach (Rebar myRebar in myListRebar)
                        {
                            List <ElementId> myListRebarCopyId = copyRebarByDistance_Update_MaxSpace(doc, myRebar, myDicDisNumDetail);


                            List <double> myDistances = myDicDisNumDetail.Keys.ToList();
                            myDistances.Sort();

                            List <double> myListNum = new List <double>();

                            foreach (double key in myDistances)
                            {
                                myListNum.Add(myDicDisNumDetail[key]);
                            }


                            // using transcation (edit DB)
                            for (int i = 0; i < myListRebarCopyId.Count(); i++)
                            {
                                using (Transaction myTrans = new Transaction(doc, "CopyElementByCoordinate"))

                                {
                                    myTrans.Start();
                                    ElementId rebarId  = myListRebarCopyId[i];
                                    Rebar     myRebarI = doc.GetElement(rebarId) as Rebar;

                                    if (i == 1 || i == 4)
                                    {
                                        if (myListNum[i] / myListSpace[i] < 1)
                                        {
                                            myRebarI.GetShapeDrivenAccessor().SetLayoutAsSingle();
                                        }

                                        else
                                        {
                                            myRebarI.GetShapeDrivenAccessor().SetLayoutAsMaximumSpacing(myListSpace[i], (myListNum[i]), isOpposite, false, false);
                                        }
                                    }

                                    else
                                    {
                                        if (myListNum[i] / myListSpace[i] < 1)
                                        {
                                            myRebarI.GetShapeDrivenAccessor().SetLayoutAsSingle();
                                        }

                                        else
                                        {
                                            myRebarI.GetShapeDrivenAccessor().SetLayoutAsMaximumSpacing(myListSpace[i], (myListNum[i]), isOpposite, true, true);
                                        }
                                    }

                                    myTrans.Commit();
                                }
                            }
                        }
                        #endregion
                    }


                    if (isYes_C1)
                    {
                        #region Rebar C stirrup

                        // List of boundaries faces
                        List <double> myListEndPointDis_C1 = getAndSortDisOfEndFaces(myListFacePicked, pE);
                        myListEndPointDis_C1.Sort();

                        Dictionary <double, double> myDicDisNumDetail_C1 = detailListDistance_Update_MaxSpace(myListEndPointDis_C1,
                                                                                                              factor_C1,
                                                                                                              delta_1_C1, pitch_1_C1,
                                                                                                              pitch_2_C1,
                                                                                                              delta_3_C1, pitch_3_C1, N3_C1);

                        foreach (Rebar myRebar in myListRebar_C1)
                        {
                            List <ElementId> myListRebarCopyId_C1 = copyRebarByDistance_Update_MaxSpace(doc, myRebar, myDicDisNumDetail_C1);


                            List <double> myDistances_C1 = myDicDisNumDetail_C1.Keys.ToList();
                            myDistances_C1.Sort();

                            List <double> myListNum_C1 = new List <double>();

                            foreach (double key in myDistances_C1)
                            {
                                myListNum_C1.Add(myDicDisNumDetail_C1[key]);
                            }


                            // using transcation (edit DB)
                            for (int i = 0; i < myListRebarCopyId_C1.Count(); i++)
                            {
                                using (Transaction myTrans = new Transaction(doc, "CopyElementByCoordinate"))

                                {
                                    myTrans.Start();
                                    ElementId rebarId  = myListRebarCopyId_C1[i];
                                    Rebar     myRebarI = doc.GetElement(rebarId) as Rebar;

                                    if (i == 1 || i == 4)
                                    {
                                        if (myListNum_C1[i] / myListSpace_C1[i] < 1)
                                        {
                                            myRebarI.GetShapeDrivenAccessor().SetLayoutAsSingle();
                                        }

                                        else
                                        {
                                            myRebarI.GetShapeDrivenAccessor().SetLayoutAsMaximumSpacing(myListSpace_C1[i], (myListNum_C1[i]), isOpposite, false, false);
                                        }
                                    }

                                    else
                                    {
                                        if (myListNum_C1[i] / myListSpace_C1[i] < 1)
                                        {
                                            myRebarI.GetShapeDrivenAccessor().SetLayoutAsSingle();
                                        }

                                        else
                                        {
                                            myRebarI.GetShapeDrivenAccessor().SetLayoutAsMaximumSpacing(myListSpace_C1[i], (myListNum_C1[i]), isOpposite, true, true);
                                        }
                                    }

                                    myTrans.Commit();
                                }
                            }
                        }
                        #endregion
                    }


                    if (isLB1Yes)
                    {
                        testRebar_FromCurve_Bot_Func(doc, myBeam, myListFacePicked, FB1, CB1,
                                                     rebaNameShape_L1, rebaNameType_L1);
                    }
                    if (isLB2Yes)
                    {
                        testRebar_FromCurve_Bot_Func(doc, myBeam, myListFacePicked, FB2, CB2,
                                                     rebaNameShape_L2, rebaNameType_L2);
                    }
                }
            }
        }
예제 #4
0
        public void rebarBeamTop_Form(UIDocument uiDoc)
        {
            Document doc = uiDoc.Document;

            double myConvertFactor = 304.8;


            //Load rebarShape
            // RebarShape
            FilteredElementCollector fecRebarShap = new FilteredElementCollector(doc)
                                                    .OfClass(typeof(RebarShape));

            IEnumerable <RebarShape> iterRebarBarShapes = fecRebarShap.Cast <RebarShape>();



            // Load Rebar Type
            // Rebartype
            FilteredElementCollector fecBarType = new FilteredElementCollector(doc)
                                                  .OfClass(typeof(RebarBarType));

            IEnumerable <RebarBarType> iterRebarBarTypes = fecBarType.Cast <RebarBarType>();


            // Top Layer
            // Layer1
            bool   isLB1Yes         = true;
            double FB1              = 6;
            double CB1              = 80;
            string rebaNameShape_L1 = string.Empty;
            string rebaNameType_L1  = string.Empty;


            // Bottom Layer
            // Layer2
            bool   isLB2Yes = true;
            double FB2      = 3;
            double CB2      = 150;

            string rebaNameShape_L2 = string.Empty;
            string rebaNameType_L2  = string.Empty;

            bool inputSuccess = false;

            while (!inputSuccess)
            {
                using (var myInputFormSetting = new SettingDialog())
                {
                    //add rebar Shape list
                    foreach (RebarShape myRebarShape in iterRebarBarShapes)
                    {
                        myInputFormSetting.RebarShap1Top_Cb.Items.Add(myRebarShape.Name);
                        myInputFormSetting.RebarShap2Top_Cb.Items.Add(myRebarShape.Name);
                    }


                    //add rebar type list
                    foreach (RebarBarType myRebarType in iterRebarBarTypes)
                    {
                        myInputFormSetting.RebarType1Top_Cb.Items.Add(myRebarType.Name);
                        myInputFormSetting.RebarType2Top_Cb.Items.Add(myRebarType.Name);
                    }


                    myInputFormSetting.ShowDialog();


                    //Shape
                    rebaNameShape_L1 = myInputFormSetting.RebarShap1Top_Cb.Text;
                    rebaNameShape_L2 = myInputFormSetting.RebarShap2Top_Cb.Text;

                    //type
                    rebaNameType_L1 = myInputFormSetting.RebarType1Top_Cb.Text;
                    rebaNameType_L2 = myInputFormSetting.RebarType2Top_Cb.Text;


                    //Yes/ No bottom rebar
                    if (!myInputFormSetting.yes1Top_Chb.Checked)
                    {
                        isLB1Yes = false;
                    }
                    if (!myInputFormSetting.yes2Top_Chb.Checked)
                    {
                        isLB2Yes = false;
                    }

                    // Layer1

                    FB1 = Convert.ToDouble(myInputFormSetting.FT1_Tb.Text);
                    CB1 = Convert.ToDouble(myInputFormSetting.CT1_Tb.Text) / myConvertFactor;


                    // Bottom Layer
                    // Layer2

                    FB2 = Convert.ToDouble(myInputFormSetting.FT2_Tb.Text);
                    CB2 = Convert.ToDouble(myInputFormSetting.CT2_Tb.Text) / myConvertFactor;


                    if (myInputFormSetting.yes1Top_Chb.Checked == false && myInputFormSetting.yes2Top_Chb.Checked == false)
                    {
                        TaskDialog.Show("Warning!", "Tich vao Yes/No de bo tri it nhat 1 lop");
                    }
                    else
                    {
                        //if the user hits cancel just drop out of macro
                        if (myInputFormSetting.DialogResult == System.Windows.Forms.DialogResult.Cancel)
                        {
                            return;
                        }
                        {
                            //else do all this :)
                            myInputFormSetting.Close();
                        }

                        if (myInputFormSetting.DialogResult == System.Windows.Forms.DialogResult.OK)
                        {
                            //else do all this :)
                            inputSuccess = true;
                            myInputFormSetting.Close();
                        }
                    }
                }
            }

            //Check mode

            //			TaskDialog.Show("isL1", isLB1Yes.ToString());
            //			TaskDialog.Show("IsL2", isLB1Yes.ToString());
            //
            //
            //
            //			TaskDialog.Show("Rebar Shape1", rebaNameShape_L1);
            //			TaskDialog.Show("Rebar Shape2", rebaNameShape_L2);
            //
            //
            //			TaskDialog.Show("Rebar Shape1", rebaNameType_L1);
            //			TaskDialog.Show("Rebar Shape2", rebaNameType_L2);



            List <int> myListIdCategoryRebar = new List <int>();

            myListIdCategoryRebar.Add((int)BuiltInCategory.OST_StructuralFraming);
            Reference myRefmyBeam = uiDoc.Selection.PickObject(ObjectType.Element,
                                                               new FilterByIdCategory(myListIdCategoryRebar),
                                                               "Pick a Beam...");

            Element myBeam = doc.GetElement(myRefmyBeam);



            //Get location curve of beam
            LocationCurve lc   = myBeam.Location as LocationCurve;
            Line          line = lc.Curve as Line;

            //Get vector of location cuver beam
            XYZ p = line.GetEndPoint(0);
            XYZ q = line.GetEndPoint(1);
            XYZ v = q - p; // Vector equation of line

            XYZ pE = p - 0.5 * v;
            XYZ vE = q - p;

            //Set current Beam be Joined

            setBeJoined(doc, myBeam);

            while (true)
            {
                #region Pick faces
                //Pick Face end

                List <Reference> myListRef = uiDoc.Selection.PickObjects(ObjectType.Face) as List <Reference>;

                List <Face> myListFacePicked = new List <Face>();

                foreach (Reference myRef in myListRef)
                {
                    Element E = doc.GetElement(myRef);

                    GeometryObject myGeoObj = E.GetGeometryObjectFromReference(myRef);

                    Face myPickedFace = myGeoObj as Face;

                    myListFacePicked.Add(myPickedFace);
                }
                #endregion


                #region Error picked faces
                if (myListFacePicked.Count != 4)
                {
                    TaskDialog.Show("Error!", "Chua ho tro lua chon: " + myListFacePicked.Count() + " mat, Chon 4 mat");
                    continue;
                }

                #endregion

                else
                {
                    string caseDistributionRebar = "Case 2: 4 Faces";

                    if (myListFacePicked.Count == 2)
                    {
                        caseDistributionRebar = "Case 1: 2 Faces";
                    }
                    TaskDialog.Show("Info", caseDistributionRebar);



                    if (isLB1Yes)
                    {
                        Rebar_FromCurve_Top_Func(doc, myBeam, myListFacePicked, FB1, CB1,
                                                 rebaNameShape_L1, rebaNameType_L1);
                    }
                    if (isLB2Yes)
                    {
                        Rebar_FromCurve_Top_Func(doc, myBeam, myListFacePicked, FB2, CB2,
                                                 rebaNameShape_L2, rebaNameType_L2);
                    }
                }
            }
        }