Revit二次开发之CAD线的翻模--梁的翻模

最近开始翻模旅程,根据跟群友讨论和网上的搜寻。初步方法为先拾取CAD梁的线段,根据线段所在图层,取得所有梁的最长的那2段线。这样情况下,一条梁仅有2段相等的且平行的直线(不在是一个矩形),具体如图1-1所示!。Revit二次开发之CAD线的翻模--梁的翻模_第1张图片

                                                             图 1- 1  测试模型中对于梁的整图

这里要感谢一下CSDN niuge8905版主 https://blog.csdn.net/niuge8905/article/details/77160646  和 JohnnyWu0918 https://me.csdn.net/mye918 从他们的文章中找到了读取CAD线段的一些方法。

接下来上代码。

 

using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using Autodesk.Revit.DB.Structure;

 

[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
    class ReadCadCommand : IExternalCommand
    {
        Application app;
        Document doc;
        UIDocument uidoc;
        ///


        /// 正常梁宽度
        ///

       const double NormBeamWidth = 1000;//1000mm


        ///


        /// 所有正常梁宽度集合
        ///

        List WidthList = new List();

        

        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            uidoc = commandData.Application.ActiveUIDocument;
            app = commandData.Application.Application;
            doc = uidoc.Document;


            Reference r;
            try
            {
                 r = uidoc.Selection.PickObject(ObjectType.PointOnElement,“选择梁的一边”);//选择一个元素
            }
            catch(Exception ex)
            {
                message = "您取消了本次操作!";
                return Result.Failed;
            }
            
            //Reference r = uidoc.Selection.PickObject(ObjectType.PointOnElement);//选择一个元素
            string ss = r.ConvertToStableRepresentation(doc);

            Element elem = doc.GetElement(r);
            GeometryElement geoElem = elem.get_Geometry(new Options());
            GeometryObject geoObj = elem.GetGeometryObjectFromReference(r);


            //获取选中的cad图层
            Category targetCategory = null;
            ElementId graphicsStyleId = null;


            if (geoObj.GraphicsStyleId != ElementId.InvalidElementId)
            {
                graphicsStyleId = geoObj.GraphicsStyleId;
                GraphicsStyle gs = doc.GetElement(geoObj.GraphicsStyleId) as GraphicsStyle;
                if (gs != null)
                {
                    targetCategory = gs.GraphicsStyleCategory;
                    var name = gs.GraphicsStyleCategory.Name;
                }
            }
            //隐藏选中的cad图层
            Transaction trans = new Transaction(doc, "隐藏图层");
            trans.Start();
            if (targetCategory != null)
                doc.ActiveView.SetCategoryHidden(targetCategory.Id, false);


            trans.Commit();

            if (geoElem == null || graphicsStyleId == null)
            {
                message = "几何元素或ID不存在!";
                return Result.Failed;
            }
            
            List curveArray_List = getCurveArray( doc,geoElem,graphicsStyleId);
            List curveArray_List_copy = new List();//复制得到的模型
            foreach (var OrginCADModle in curveArray_List)
            {
                curveArray_List_copy.Add(OrginCADModle);
            }


            //取得的模型的线的总数量
            int LineNumber = curveArray_List.Count();

           
          

            //存放不匹配的梁的相关线
            List NotMatchCadModel = new List();
            //存放模型数组的数组
            List> CADModelList_List = new List>();
            //int i = 0;

            //筛选模型
            while (curveArray_List.Count() > 0)
            {      

               //存放距离
                List distanceList = new List();
                //存放对应距离的CADModel
                List cADModel_B_List = new List();

                var CadModel_A = curveArray_List[0];
                curveArray_List.Remove(CadModel_A);//去除取出的梁的二段线段之一

                if (curveArray_List.Count() >= 1)
                {
                    foreach (var CadModel_B in curveArray_List)
                    {
                        //梁的2个段线非同一长度最大误差为50mm,方向为绝对值(然而sin120°=sin60°)
                        if ((float)Math.Abs(CadModel_A.rotation) == (float)Math.Abs(CadModel_B.rotation) && Math.Abs(CadModel_A.length - CadModel_B.length)<0.164)
                        {
                            double distance = CadModel_A.location.DistanceTo(CadModel_B.location);
                            distanceList.Add(distance);
                            cADModel_B_List.Add(CadModel_B);
                        }
                    }


                    if (distanceList.Count() != 0 && cADModel_B_List.Count != 0)
                    {
                        double distanceTwoLine = distanceList.Min();
                        //筛选不正常的宽度,如发现不正常,将CadModel_B继续放入数组
                        if (distanceTwoLine * 304.8 < NormBeamWidth && distanceTwoLine>0)
                        {
                            //TaskDialog.Show("1", (distanceTwoLine * 304.8).ToString());

                            var CadModel_shortDistance = cADModel_B_List[distanceList.IndexOf(distanceTwoLine)];
                            curveArray_List.Remove(CadModel_shortDistance);
                            //1对梁的模型装入数组
                            List cADModels = new List();
                            cADModels.Add(CadModel_A);
                            cADModels.Add(CadModel_shortDistance);
                            CADModelList_List.Add(cADModels);
                            //TaskDialog.Show("1", CadModel_A.location.ToString() + "\n" + CadModel_shortDistance.location.ToString());

                        }
                    }
                    else
                    {
                        NotMatchCadModel.Add(CadModel_A);
                    }
                   
                }          
                else
                {
                    NotMatchCadModel.Add(CadModel_A);
                }
                
            }

            TaskDialog.Show("1","未匹配的线有:"+ NotMatchCadModel.Count().ToString()+" 条!\n"+"匹配上的有:"+ CADModelList_List.Count().ToString()+" 对!\n"+"丢失:"+ (LineNumber- NotMatchCadModel.Count()- CADModelList_List.Count()*2).ToString()+" 条!\n");
            //梁类别
            FamilySymbol BeamTypeName = doc.GetElement(new ElementId(342873)) as FamilySymbol;
            //默认标高2
            Level level = LevelFilter(doc);
            int tranNumber = 0;//用于改变事务的ID
            //生成梁
            foreach (var cadModelList in CADModelList_List)
            {
                    CADModel cADModel_A = cadModelList[0];
                    CADModel cADModel_B = cadModelList[1];

                    //TaskDialog.Show("1", cADModel_A.location.ToString() + "\n" + cADModel_B.location.ToString());

                    var cADModel_A_StratPoint = cADModel_A.curveArray.get_Item(0).GetEndPoint(0);
                    var cADModel_A_EndPoint = cADModel_A.curveArray.get_Item(0).GetEndPoint(1);
                    var cADModel_B_StratPoint = cADModel_B.curveArray.get_Item(0).GetEndPoint(0);
                    var cADModel_B_EndPoint = cADModel_B.curveArray.get_Item(0).GetEndPoint(1);

                XYZ ChangeXYZ = new XYZ();
                
                var LineLength = (GetMiddlePoint(cADModel_A_StratPoint, cADModel_B_StratPoint)).DistanceTo(GetMiddlePoint(cADModel_A_EndPoint, cADModel_B_EndPoint));
                if (LineLength <0.00328)//梁的2段线起点非同一端。2段线非同一长度,又非同一端的,中间点的误差选择为1mm
                {
                    ChangeXYZ = cADModel_B_StratPoint;
                    cADModel_B_StratPoint = cADModel_B_EndPoint;
                    cADModel_B_EndPoint = ChangeXYZ;
                }
                Curve curve = Line.CreateBound((GetMiddlePoint(cADModel_A_StratPoint, cADModel_B_StratPoint)), GetMiddlePoint(cADModel_A_EndPoint, cADModel_B_EndPoint));

                    double distance = cADModel_A.location.DistanceTo(cADModel_B.location);
                    
                    distance = Math.Round(distance * 304.8, 1);//作为梁_b的参数
                     WidthList.Add(distance);//梁宽度集合

                string beamName = "ZBIM矩形梁 " + (float)(distance) + "*" + (float)(600) + "mm";//类型名 宽度*高度
                    if (!familSymbol_exists(beamName, "ZBIM - 矩形梁", doc))
                    {
                        MakeBeamType(beamName, "ZBIM - 矩形梁");
                        EditBeamType(beamName, (float)(distance), (float)(600));
                    }

                //用于数据显示和选择,已注释
                #region
                //List columnTypes = new List();
                //columnTypes = getBeamTypes(doc);
                //bool repeat = false;
                //foreach (string context in columnTypes)
                //{
                //    if (context == beamName)
                //    {
                //        repeat = true;
                //        break;
                //    }
                //}
                //if (!repeat)
                //{
                //    columnTypes.Add(beamName);
                //}
                #endregion

                using (Transaction transaction = new Transaction(doc))
                {
                    transaction.Start("Beadm Strart Bulid" + tranNumber.ToString());
                    FilteredElementCollector collector = new FilteredElementCollector(doc);
                    collector.OfClass(typeof(FamilySymbol)).OfCategory(BuiltInCategory.OST_StructuralFraming);


                    foreach (FamilySymbol beamType in collector)
                    {
                        if (beamType.Name == beamName)
                        {
                            if (!beamType.IsActive)
                            {
                                beamType.Activate();
                            }
                            FamilyInstance beamInstance = doc.Create.NewFamilyInstance(curve, beamType, level, StructuralType.Beam);
                            var Elevation = beamInstance.get_Parameter(BuiltInParameter.INSTANCE_REFERENCE_LEVEL_PARAM);

                            break;
                        }
                    }

 

                    transaction.Commit();
                }
 

            }


            

            //取得未匹配的和丢失的CADModel
            foreach (var cadModelList in CADModelList_List)
            {
                CADModel cADModel_A = cadModelList[0];
                CADModel cADModel_B = cadModelList[1];
                curveArray_List_copy.Remove(cADModel_A);
                curveArray_List_copy.Remove(cADModel_B);
            }
            //一个方向的梁
            List UpBeamCAdModel = new List();
            //一个方向的梁
            List CrossBeamCAdModel = new List();

            //最大梁宽度
            double MaxBeamWidth;
            if (WidthList.Count() == 0)
            {
                MaxBeamWidth = 1000;//1000mm
            }
            else
            {
                MaxBeamWidth = WidthList.Max();
            }
            //判断是否位空
            if (curveArray_List_copy.Count() > 1)
            {
                var OrginRotation = Math.Abs(curveArray_List_copy[0].rotation);
                //分流,横在一起,竖在一起
                foreach (var cadModle in curveArray_List_copy)
                {
                    if (Math.Abs(cadModle.rotation) == OrginRotation)
                    {
                        CrossBeamCAdModel.Add(cadModle);
                    }
                    else
                    {
                        UpBeamCAdModel.Add(cadModle);
                    }
                }
            }
           
            //判单方向的数量
            if (CrossBeamCAdModel.Count() > 2)
            {
                var CrossMinLength = CrossBeamCAdModel.Select(c => c.length).ToList().Min();//取出最小的线段长度
                                                                                            //将大约2倍最小长度的CAd模型编组
                var LongCrossLenth = from n in CrossBeamCAdModel
                                     where n.length > CrossMinLength * 2
                                     select n;
                //降序
                var newA = from n in LongCrossLenth
                           orderby n.length descending
                           select n;
                List LongCrossLenth_list = newA.ToList();

                //存放模型数组的数组A组-第二次
                List> CADModelList_Second = new List>();
                查询失败
                List> FailCadModel = new List>();
                while (LongCrossLenth_list.Count() > 0)
                {
                    //存放距离
                    // List distanceList = new List();
                    //存放对应距离的CADModel
                    List cADModel_B_List = new List();

                    var CadModel_Main = LongCrossLenth_list[0];//取出主模型
                    XYZ StartPoint_Main = CadModel_Main.curveArray.get_Item(0).GetEndPoint(0);//取出线段2点
                    XYZ EndPoint_Main = CadModel_Main.curveArray.get_Item(0).GetEndPoint(1);
                    LongCrossLenth_list.Remove(CadModel_Main);
                    CrossBeamCAdModel.Remove(CadModel_Main);
                    foreach (var cadModelFirst in CrossBeamCAdModel)
                    {
                        Line line = CadModel_Main.curveArray.get_Item(0) as Line;//取出主模型的线

                        if (cadModelFirst.length >= CadModel_Main.length)
                        {
                            continue;
                        }
                        double PointLineDistance = line.Distance(cadModelFirst.location);
                        PointLineDistance = Math.Round(PointLineDistance * 304.8, 1);
                        if (PointLineDistance > MaxBeamWidth || PointLineDistance == 0)
                        {
                            continue;
                        }
                        XYZ StartPoint_First = cadModelFirst.curveArray.get_Item(0).GetEndPoint(0);//子线段2点
                        XYZ EndPoint_First = cadModelFirst.curveArray.get_Item(0).GetEndPoint(1);
                        double A1 = StartPoint_First.DistanceTo(StartPoint_Main);
                        double A2 = StartPoint_First.DistanceTo(EndPoint_Main);
                        double B1 = EndPoint_First.DistanceTo(StartPoint_Main);
                        double B2 = EndPoint_First.DistanceTo(EndPoint_Main);
                        if (Math.Abs(PointLineDistance - A1 * 304.8) < 1 || Math.Abs(PointLineDistance - A2 * 304.8) < 1 || Math.Abs(PointLineDistance - B1 * 304.8) < 1 || Math.Abs(PointLineDistance - B2 * 304.8) < 1)
                        {

                            cADModel_B_List.Add(cadModelFirst);
                        }


                    }
                    List FailedCadmodel = new List();
                    if (cADModel_B_List.Count() == 1)
                    {

                        FailedCadmodel.Add(cADModel_B_List[0]);
                        FailedCadmodel.Add(CadModel_Main);
                        FailCadModel.Add(FailedCadmodel);
                    }
                    if (cADModel_B_List.Count() == 2)
                    {

                        cADModel_B_List.Add(CadModel_Main);
                        CADModelList_Second.Add(cADModel_B_List);
                    }
                    else
                    {
                        CrossBeamCAdModel.Add(CadModel_Main);
                    }

                    //FailCadModel.Add(FailedCadmodel);
                }
                第二组A成功部分生成
                foreach (var CAdMidelList in CADModelList_Second)
                {
                    CADModel cADModel_A = CAdMidelList[0];
                    CADModel cADModel_B = CAdMidelList[1];
                    CADModel cADModel_Main = CAdMidelList[2];

                    Line line = cADModel_Main.curveArray.get_Item(0) as Line;

                    List MinDistance = new List();//最短距离
                    List MinDistanceB = new List();//最短距离B
                    XYZ OnePoint = new XYZ();
                    XYZ TwoPont = new XYZ();
                    var cADModel_A_StratPoint = cADModel_A.curveArray.get_Item(0).GetEndPoint(0);
                    var cADModel_A_EndPoint = cADModel_A.curveArray.get_Item(0).GetEndPoint(1);
                    double distanceA = line.Distance(cADModel_A.location);

                    var cADModel_B_StratPoint = cADModel_B.curveArray.get_Item(0).GetEndPoint(0);
                    var cADModel_B_EndPoint = cADModel_B.curveArray.get_Item(0).GetEndPoint(1);
                    double distanceB = line.Distance(cADModel_B.location);

                    var cADModel_Main_StratPoint = cADModel_Main.curveArray.get_Item(0).GetEndPoint(0);
                    var cADModel_Main_EndPoint = cADModel_Main.curveArray.get_Item(0).GetEndPoint(1);


                    double A1 = cADModel_A_StratPoint.DistanceTo(cADModel_Main_StratPoint);
                    MinDistance.Add(A1);
                    double A2 = cADModel_A_StratPoint.DistanceTo(cADModel_Main_EndPoint);
                    MinDistance.Add(A2);
                    double A3 = cADModel_A_EndPoint.DistanceTo(cADModel_Main_StratPoint);
                    MinDistance.Add(A3);
                    double A4 = cADModel_A_EndPoint.DistanceTo(cADModel_Main_EndPoint);
                    MinDistance.Add(A4);
                    double MainDistance_A = MinDistance.Min();
                    int index_A = MinDistance.IndexOf(MainDistance_A);
                    switch (index_A)
                    {
                        case 0:
                            OnePoint = cADModel_A_StratPoint;
                            break;
                        case 1:
                            OnePoint = cADModel_A_StratPoint;
                            break;
                        case 2:
                            OnePoint = cADModel_A_EndPoint;
                            break;
                        case 3:
                            OnePoint = cADModel_A_EndPoint;
                            break;
                    }

                    double B1 = cADModel_B_StratPoint.DistanceTo(cADModel_Main_StratPoint);
                    MinDistanceB.Add(B1);
                    double B2 = cADModel_B_StratPoint.DistanceTo(cADModel_Main_EndPoint);
                    MinDistanceB.Add(B2);
                    double B3 = cADModel_B_EndPoint.DistanceTo(cADModel_Main_StratPoint);
                    MinDistanceB.Add(B3);
                    double B4 = cADModel_B_EndPoint.DistanceTo(cADModel_Main_EndPoint);
                    MinDistanceB.Add(B4);
                    double MainDistance_b = MinDistanceB.Min();
                    int index_B = MinDistanceB.IndexOf(MainDistance_b);
                    switch (index_B)
                    {
                        case 0:
                            TwoPont = cADModel_B_StratPoint;
                            break;
                        case 1:
                            TwoPont = cADModel_B_StratPoint;
                            break;
                        case 2:
                            TwoPont = cADModel_B_EndPoint;
                            break;
                        case 3:
                            TwoPont = cADModel_B_EndPoint;
                            break;
                    }

                    MinDistance.Clear();
                    MinDistanceB.Clear();

                    XYZ ChangeXYZ = new XYZ();

                    var LineLength = (GetMiddlePoint(OnePoint, cADModel_Main_StratPoint)).DistanceTo(GetMiddlePoint(TwoPont, cADModel_Main_EndPoint));
                    if (LineLength < 0.00328)//梁的2段线起点非同一端。2段线非同一长度,又非同一端的,中间点的误差选择为1mm
                    {
                        ChangeXYZ = TwoPont;
                        TwoPont = OnePoint;
                        OnePoint = ChangeXYZ;
                    }
                    Curve curve = Line.CreateBound((GetMiddlePoint(OnePoint, cADModel_Main_StratPoint)), GetMiddlePoint(TwoPont, cADModel_Main_EndPoint));


                    double distance = MainDistance_A;//cADModel_A.location.DistanceTo(cADModel_Main.location);

                    distance = Math.Round(distance * 304.8, 1);//作为梁_b的参数


                    string beamName = "ZBIM矩形梁 " + (float)(distance) + "*" + (float)(600) + "mm";//类型名 宽度*高度
                    if (!familSymbol_exists(beamName, "ZBIM - 矩形梁", doc))
                    {
                        MakeBeamType(beamName, "ZBIM - 矩形梁");
                        EditBeamType(beamName, (float)(distance), (float)(600));
                    }

                    using (Transaction transaction = new Transaction(doc))
                    {
                        transaction.Start("Beadm Strart Bulid" + tranNumber.ToString());
                        FilteredElementCollector collector = new FilteredElementCollector(doc);
                        collector.OfClass(typeof(FamilySymbol)).OfCategory(BuiltInCategory.OST_StructuralFraming);


                        foreach (FamilySymbol beamType in collector)
                        {
                            if (beamType.Name == beamName)
                            {
                                if (!beamType.IsActive)
                                {
                                    beamType.Activate();
                                }
                                FamilyInstance beamInstance = doc.Create.NewFamilyInstance(curve, beamType, level, StructuralType.Beam);
                                var Elevation = beamInstance.get_Parameter(BuiltInParameter.INSTANCE_REFERENCE_LEVEL_PARAM);
                               
                                break;
                            }
                        }

                        //foreach()

                        transaction.Commit();
                    }

                }
                //第二组A的失败部分生成
                foreach (var CAdMidelList in FailCadModel)
                {
                    CADModel cADModel_A = CAdMidelList[0];
                    CADModel cADModel_Main = CAdMidelList[1];

                    Line line = cADModel_Main.curveArray.get_Item(0) as Line;

                    List MinDistance = new List();

                    XYZ OnePoint = new XYZ();
                    XYZ TwoPoint;//用于编造第二点
                    var cADModel_A_StratPoint = cADModel_A.curveArray.get_Item(0).GetEndPoint(0);
                    var cADModel_A_EndPoint = cADModel_A.curveArray.get_Item(0).GetEndPoint(1);

                    var cADModel_Main_StratPoint = cADModel_Main.curveArray.get_Item(0).GetEndPoint(0);
                    var cADModel_Main_EndPoint = cADModel_Main.curveArray.get_Item(0).GetEndPoint(1);

                    double A1 = cADModel_A_StratPoint.DistanceTo(cADModel_Main_StratPoint);
                    MinDistance.Add(A1);
                    double A2 = cADModel_A_StratPoint.DistanceTo(cADModel_Main_EndPoint);
                    MinDistance.Add(A2);
                    double A3 = cADModel_A_EndPoint.DistanceTo(cADModel_Main_StratPoint);
                    MinDistance.Add(A3);
                    double A4 = cADModel_A_EndPoint.DistanceTo(cADModel_Main_EndPoint);
                    MinDistance.Add(A4);
                    double MainDistance_A = MinDistance.Min();
                    int index_A = MinDistance.IndexOf(MainDistance_A);
                    switch (index_A)
                    {
                        case 0:
                            OnePoint = cADModel_A_StratPoint;
                            break;
                        case 1:
                            OnePoint = cADModel_A_StratPoint;
                            break;
                        case 2:
                            OnePoint = cADModel_A_EndPoint;
                            break;
                        case 3:
                            OnePoint = cADModel_A_EndPoint;
                            break;
                    }


                    if ((OnePoint.X - cADModel_Main_StratPoint.X) < 0.001)
                    {
                        TwoPoint = new XYZ(cADModel_Main_EndPoint.X, OnePoint.Y, OnePoint.Z);

                    }
                    else if ((OnePoint.X - cADModel_Main_EndPoint.X) < 0.001)
                    {
                        TwoPoint = new XYZ(cADModel_Main_StratPoint.X, OnePoint.Y, OnePoint.Z);
                    }
                    else
                    {
                        continue;
                    }


                    XYZ ChangeXYZ = new XYZ();

                    var LineLength = (GetMiddlePoint(OnePoint, cADModel_Main_StratPoint)).DistanceTo(GetMiddlePoint(TwoPoint, cADModel_Main_EndPoint));
                    if (LineLength < 0.00328)//梁的2段线起点非同一端。2段线非同一长度,又非同一端的,中间点的误差选择为1mm
                    {
                        ChangeXYZ = TwoPoint;
                        TwoPoint = OnePoint;
                        OnePoint = ChangeXYZ;
                    }
                    Curve curve = Line.CreateBound((GetMiddlePoint(OnePoint, cADModel_Main_StratPoint)), GetMiddlePoint(TwoPoint, cADModel_Main_EndPoint));


                    double distance = MainDistance_A;//cADModel_A.location.DistanceTo(cADModel_Main.location);

                    distance = Math.Round(distance * 304.8, 1);//作为梁_b的参数


                    string beamName = "ZBIM矩形梁 " + (float)(distance) + "*" + (float)(600) + "mm";//类型名 宽度*高度
                    if (!familSymbol_exists(beamName, "ZBIM - 矩形梁", doc))
                    {
                        MakeBeamType(beamName, "ZBIM - 矩形梁");
                        EditBeamType(beamName, (float)(distance), (float)(600));
                    }

                    using (Transaction transaction = new Transaction(doc))
                    {
                        transaction.Start("Beadm Strart Bulid" + tranNumber.ToString());
                        FilteredElementCollector collector = new FilteredElementCollector(doc);
                        collector.OfClass(typeof(FamilySymbol)).OfCategory(BuiltInCategory.OST_StructuralFraming);


                        foreach (FamilySymbol beamType in collector)
                        {
                            if (beamType.Name == beamName)
                            {
                                if (!beamType.IsActive)
                                {
                                    beamType.Activate();
                                }
                                FamilyInstance beamInstance = doc.Create.NewFamilyInstance(curve, beamType, level, StructuralType.Beam);
                                var Elevation = beamInstance.get_Parameter(BuiltInParameter.INSTANCE_REFERENCE_LEVEL_PARAM);

                                break;
                            }
                        }

                        //foreach()

                        transaction.Commit();
                    }


                }
            }

            //判断单方向数量
            if (UpBeamCAdModel.Count() > 2)
            {
                var UpMinLength = UpBeamCAdModel.Select(c => c.length).ToList().Min();
                var LongUpLength = from n in UpBeamCAdModel
                                   where n.length > UpMinLength * 2
                                   select n;
                //降序
                var newB = from n in LongUpLength
                           orderby n.length descending
                           select n;
                List LongUPLenth_list_B = newB.ToList();

                //存放模型数组的数组B组-第二次(竖着)
                List> CADModelList_Second_B = new List>();
                //查询失败B组
                List> FailCadModel_B = new List>();
                while (LongUPLenth_list_B.Count() > 0)
                {
                    //存放距离
                    // List distanceList = new List();
                    //存放对应距离的CADModel
                    List cADModel_B_List = new List();

                    var CadModel_Main = LongUPLenth_list_B[0];//取出主模型
                    XYZ StartPoint_Main = CadModel_Main.curveArray.get_Item(0).GetEndPoint(0);//取出线段2点
                    XYZ EndPoint_Main = CadModel_Main.curveArray.get_Item(0).GetEndPoint(1);
                    LongUPLenth_list_B.Remove(CadModel_Main);
                    UpBeamCAdModel.Remove(CadModel_Main);
                    foreach (var cadModelFirst in UpBeamCAdModel)
                    {
                        Line line = CadModel_Main.curveArray.get_Item(0) as Line;//取出主模型的线

                        if (cadModelFirst.length >= CadModel_Main.length)
                        {
                            continue;
                        }
                        double PointLineDistance = line.Distance(cadModelFirst.location);
                        PointLineDistance = Math.Round(PointLineDistance * 304.8, 1);
                        if (PointLineDistance > MaxBeamWidth || PointLineDistance == 0)
                        {
                            continue;
                        }
                        XYZ StartPoint_First = cadModelFirst.curveArray.get_Item(0).GetEndPoint(0);//子线段2点
                        XYZ EndPoint_First = cadModelFirst.curveArray.get_Item(0).GetEndPoint(1);
                        double A1 = StartPoint_First.DistanceTo(StartPoint_Main);
                        double A2 = StartPoint_First.DistanceTo(EndPoint_Main);
                        double B1 = EndPoint_First.DistanceTo(StartPoint_Main);
                        double B2 = EndPoint_First.DistanceTo(EndPoint_Main);
                        if (Math.Abs(PointLineDistance - A1 * 304.8) < 1 || Math.Abs(PointLineDistance - A2 * 304.8) < 1 || Math.Abs(PointLineDistance - B1 * 304.8) < 1 || Math.Abs(PointLineDistance - B2 * 304.8) < 1)
                        {

                            cADModel_B_List.Add(cadModelFirst);
                        }


                    }
                    List FailedCadmodel = new List();
                    if (cADModel_B_List.Count() == 1)
                    {

                        FailedCadmodel.Add(cADModel_B_List[0]);
                        FailedCadmodel.Add(CadModel_Main);
                        FailCadModel_B.Add(FailedCadmodel);
                    }
                    if (cADModel_B_List.Count() == 2)
                    {

                        cADModel_B_List.Add(CadModel_Main);
                        CADModelList_Second_B.Add(cADModel_B_List);
                    }
                    else
                    {
                        UpBeamCAdModel.Add(CadModel_Main);
                    }


                }
                TaskDialog.Show("1", FailCadModel_B.Count().ToString());
                //第二组B成功部分生成
                foreach (var CAdMidelList in CADModelList_Second_B)
                {
                    CADModel cADModel_A = CAdMidelList[0];
                    CADModel cADModel_B = CAdMidelList[1];
                    CADModel cADModel_Main = CAdMidelList[2];
                    Line line = cADModel_Main.curveArray.get_Item(0) as Line;

                    List MinDistance = new List();//最短距离
                    List MinDistanceB = new List();//最短距离B
                    XYZ OnePoint = new XYZ();
                    XYZ TwoPont = new XYZ();
                    var cADModel_A_StratPoint = cADModel_A.curveArray.get_Item(0).GetEndPoint(0);
                    var cADModel_A_EndPoint = cADModel_A.curveArray.get_Item(0).GetEndPoint(1);
                    double distanceA = line.Distance(cADModel_A.location);

                    var cADModel_B_StratPoint = cADModel_B.curveArray.get_Item(0).GetEndPoint(0);
                    var cADModel_B_EndPoint = cADModel_B.curveArray.get_Item(0).GetEndPoint(1);
                    double distanceB = line.Distance(cADModel_B.location);

                    var cADModel_Main_StratPoint = cADModel_Main.curveArray.get_Item(0).GetEndPoint(0);
                    var cADModel_Main_EndPoint = cADModel_Main.curveArray.get_Item(0).GetEndPoint(1);


                    double A1 = cADModel_A_StratPoint.DistanceTo(cADModel_Main_StratPoint);
                    MinDistance.Add(A1);
                    double A2 = cADModel_A_StratPoint.DistanceTo(cADModel_Main_EndPoint);
                    MinDistance.Add(A2);
                    double A3 = cADModel_A_EndPoint.DistanceTo(cADModel_Main_StratPoint);
                    MinDistance.Add(A3);
                    double A4 = cADModel_A_EndPoint.DistanceTo(cADModel_Main_EndPoint);
                    MinDistance.Add(A4);
                    double MainDistance_A = MinDistance.Min();
                    int index_A = MinDistance.IndexOf(MainDistance_A);
                    switch (index_A)
                    {
                        case 0:
                            OnePoint = cADModel_A_StratPoint;
                            break;
                        case 1:
                            OnePoint = cADModel_A_StratPoint;
                            break;
                        case 2:
                            OnePoint = cADModel_A_EndPoint;
                            break;
                        case 3:
                            OnePoint = cADModel_A_EndPoint;
                            break;
                    }

                    double B1 = cADModel_B_StratPoint.DistanceTo(cADModel_Main_StratPoint);
                    MinDistanceB.Add(B1);
                    double B2 = cADModel_B_StratPoint.DistanceTo(cADModel_Main_EndPoint);
                    MinDistanceB.Add(B2);
                    double B3 = cADModel_B_EndPoint.DistanceTo(cADModel_Main_StratPoint);
                    MinDistanceB.Add(B3);
                    double B4 = cADModel_B_EndPoint.DistanceTo(cADModel_Main_EndPoint);
                    MinDistanceB.Add(B4);
                    double MainDistance_b = MinDistanceB.Min();
                    int index_B = MinDistanceB.IndexOf(MainDistance_b);
                    switch (index_B)
                    {
                        case 0:
                            TwoPont = cADModel_B_StratPoint;
                            break;
                        case 1:
                            TwoPont = cADModel_B_StratPoint;
                            break;
                        case 2:
                            TwoPont = cADModel_B_EndPoint;
                            break;
                        case 3:
                            TwoPont = cADModel_B_EndPoint;
                            break;
                    }

                    MinDistance.Clear();
                    MinDistanceB.Clear();

                    XYZ ChangeXYZ = new XYZ();

                    var LineLength = (GetMiddlePoint(OnePoint, cADModel_Main_StratPoint)).DistanceTo(GetMiddlePoint(TwoPont, cADModel_Main_EndPoint));
                    if (LineLength < 0.00328)//梁的2段线起点非同一端。2段线非同一长度,又非同一端的,中间点的误差选择为1mm
                    {
                        ChangeXYZ = TwoPont;
                        TwoPont = OnePoint;
                        OnePoint = ChangeXYZ;
                    }
                    Curve curve = Line.CreateBound((GetMiddlePoint(OnePoint, cADModel_Main_StratPoint)), GetMiddlePoint(TwoPont, cADModel_Main_EndPoint));

                    //TaskDialog.Show("1", OnePoint.ToString() + "\n" + TwoPont.ToString());
                    //TaskDialog.Show("1", curve.GetEndPoint(0).ToString() + "\n" + curve.GetEndPoint(1).ToString());


                    double distance = MainDistance_A;//cADModel_A.location.DistanceTo(cADModel_Main.location);

                    distance = Math.Round(distance * 304.8, 1);//作为梁_b的参数


                    string beamName = "ZBIM矩形梁 " + (float)(distance) + "*" + (float)(600) + "mm";//类型名 宽度*高度
                    if (!familSymbol_exists(beamName, "ZBIM - 矩形梁", doc))
                    {
                        MakeBeamType(beamName, "ZBIM - 矩形梁");
                        EditBeamType(beamName, (float)(distance), (float)(600));
                    }

                    using (Transaction transaction = new Transaction(doc))
                    {
                        transaction.Start("Beadm Strart Bulid" + tranNumber.ToString());
                        FilteredElementCollector collector = new FilteredElementCollector(doc);
                        collector.OfClass(typeof(FamilySymbol)).OfCategory(BuiltInCategory.OST_StructuralFraming);


                        foreach (FamilySymbol beamType in collector)
                        {
                            if (beamType.Name == beamName)
                            {
                                if (!beamType.IsActive)
                                {
                                    beamType.Activate();
                                }
                                FamilyInstance beamInstance = doc.Create.NewFamilyInstance(curve, beamType, level, StructuralType.Beam);
                                var Elevation = beamInstance.get_Parameter(BuiltInParameter.INSTANCE_REFERENCE_LEVEL_PARAM);
                                //Elevation.Set(LevelFilter(doc,"标高 1").Id);
                                //Parameter bottom = column.LookupParameter("底部偏移");
                                //bottom.Set(UnitUtils.ConvertToInternalUnits(offsetElev, DisplayUnitType.DUT_MILLIMETERS));
                                //Parameter top = column.LookupParameter("顶部偏移");
                                //top.Set(UnitUtils.ConvertToInternalUnits(high, DisplayUnitType.DUT_MILLIMETERS));
                                break;
                            }
                        }

                        //foreach()

                        transaction.Commit();
                    }
                    //i++;
                }
                //第二组B的失败部分生成
                foreach (var CAdMidelList in FailCadModel_B)
                {
                    CADModel cADModel_A = CAdMidelList[0];
                    CADModel cADModel_Main = CAdMidelList[1];

                    Line line = cADModel_Main.curveArray.get_Item(0) as Line;

                    List MinDistance = new List();

                    XYZ OnePoint = new XYZ();
                    XYZ TwoPoint;//用于编造第二点
                    var cADModel_A_StratPoint = cADModel_A.curveArray.get_Item(0).GetEndPoint(0);
                    var cADModel_A_EndPoint = cADModel_A.curveArray.get_Item(0).GetEndPoint(1);

                    var cADModel_Main_StratPoint = cADModel_Main.curveArray.get_Item(0).GetEndPoint(0);
                    var cADModel_Main_EndPoint = cADModel_Main.curveArray.get_Item(0).GetEndPoint(1);

                    double A1 = cADModel_A_StratPoint.DistanceTo(cADModel_Main_StratPoint);
                    MinDistance.Add(A1);
                    double A2 = cADModel_A_StratPoint.DistanceTo(cADModel_Main_EndPoint);
                    MinDistance.Add(A2);
                    double A3 = cADModel_A_EndPoint.DistanceTo(cADModel_Main_StratPoint);
                    MinDistance.Add(A3);
                    double A4 = cADModel_A_EndPoint.DistanceTo(cADModel_Main_EndPoint);
                    MinDistance.Add(A4);
                    double MainDistance_A = MinDistance.Min();
                    int index_A = MinDistance.IndexOf(MainDistance_A);
                    switch (index_A)
                    {
                        case 0:
                            OnePoint = cADModel_A_StratPoint;
                            break;
                        case 1:
                            OnePoint = cADModel_A_StratPoint;
                            break;
                        case 2:
                            OnePoint = cADModel_A_EndPoint;
                            break;
                        case 3:
                            OnePoint = cADModel_A_EndPoint;
                            break;
                    }


                    if ((OnePoint.Y - cADModel_Main_StratPoint.Y) < 0.001)
                    {
                        TwoPoint = new XYZ(OnePoint.X, cADModel_Main_EndPoint.Y, OnePoint.Z);

                    }
                    else if ((OnePoint.Y - cADModel_Main_EndPoint.Y) < 0.001)
                    {
                        TwoPoint = new XYZ(OnePoint.X, cADModel_Main_StratPoint.Y, OnePoint.Z);
                    }
                    else
                    {
                        continue;
                    }


                    XYZ ChangeXYZ = new XYZ();

                    var LineLength = (GetMiddlePoint(OnePoint, cADModel_Main_StratPoint)).DistanceTo(GetMiddlePoint(TwoPoint, cADModel_Main_EndPoint));
                    if (LineLength < 0.00328)//梁的2段线起点非同一端。2段线非同一长度,又非同一端的,中间点的误差选择为1mm
                    {
                        ChangeXYZ = TwoPoint;
                        TwoPoint = OnePoint;
                        OnePoint = ChangeXYZ;
                    }
                    Curve curve = Line.CreateBound((GetMiddlePoint(OnePoint, cADModel_Main_StratPoint)), GetMiddlePoint(TwoPoint, cADModel_Main_EndPoint));


                    double distance = MainDistance_A;//cADModel_A.location.DistanceTo(cADModel_Main.location);

                    distance = Math.Round(distance * 304.8, 1);//作为梁_b的参数


                    string beamName = "ZBIM矩形梁 " + (float)(distance) + "*" + (float)(600) + "mm";//类型名 宽度*高度
                    if (!familSymbol_exists(beamName, "ZBIM - 矩形梁", doc))
                    {
                        MakeBeamType(beamName, "ZBIM - 矩形梁");
                        EditBeamType(beamName, (float)(distance), (float)(600));
                    }

                    using (Transaction transaction = new Transaction(doc))
                    {
                        transaction.Start("Beadm Strart Bulid" + tranNumber.ToString());
                        FilteredElementCollector collector = new FilteredElementCollector(doc);
                        collector.OfClass(typeof(FamilySymbol)).OfCategory(BuiltInCategory.OST_StructuralFraming);


                        foreach (FamilySymbol beamType in collector)
                        {
                            if (beamType.Name == beamName)
                            {
                                if (!beamType.IsActive)
                                {
                                    beamType.Activate();
                                }
                                FamilyInstance beamInstance = doc.Create.NewFamilyInstance(curve, beamType, level, StructuralType.Beam);
                                var Elevation = beamInstance.get_Parameter(BuiltInParameter.INSTANCE_REFERENCE_LEVEL_PARAM);

                                break;
                            }
                        }

                        transaction.Commit();
                    }


                }
            }
                    

            return Result.Succeeded;
         }

        ///


        /// 取得所有同一图层的所有线
        ///

        /// revit系统文档
        /// 几何元素
        /// 几何元素ID
        ///
        private List getCurveArray(Document doc, GeometryElement geoElem, ElementId graphicsStyleId)
        {
            List curveArray_List = new List();
            TransactionGroup transGroup = new TransactionGroup(doc, "绘制模型线");
            transGroup.Start();
            


            //判断元素类型
            foreach (var gObj in geoElem)
            {
                GeometryInstance geomInstance = gObj as GeometryInstance;
                //坐标转换。如果选择的是“自动-中心到中心”,或者移动了importInstance,需要进行坐标转换
                Transform transform = geomInstance.Transform;


                if (null != geomInstance)
                {
                    foreach (var insObj in geomInstance.SymbolGeometry)//取几何得类别
                    {
                        if (insObj.GraphicsStyleId.IntegerValue != graphicsStyleId.IntegerValue)
                            continue;


                        if (insObj.GetType().ToString() == "Autodesk.Revit.DB.NurbSpline")
                        {
                            //不需要
                        }
                        if (insObj.GetType().ToString() == "Autodesk.Revit.DB.Line")
                        {
                            Line line = insObj as Line;
                            XYZ normal = XYZ.BasisZ;
                            XYZ point = line.GetEndPoint(0);
                            point = transform.OfPoint(point);

                            Line newLine = TransformLine(transform, line);

                            CurveArray curveArray = new CurveArray();
                            curveArray.Append(TransformLine(transform, line));

                            XYZ startPoint = newLine.GetEndPoint(0);
                            XYZ endPoint = newLine.GetEndPoint(1);
                            XYZ MiddlePoint = GetMiddlePoint(startPoint, endPoint);
                            double angle = (startPoint.Y - endPoint.Y) / startPoint.DistanceTo(endPoint);
                            double rotation = Math.Asin(angle);

                            CADModel cADModel = new CADModel();
                            cADModel.curveArray = curveArray;
                            cADModel.length = newLine.Length;
                            cADModel.shape = "矩形梁";
                            cADModel.width = 300/304.8;
                            cADModel.location = MiddlePoint;
                            cADModel.rotation = rotation;

                            curveArray_List.Add(cADModel);
                        }
                        if (insObj.GetType().ToString() == "Autodesk.Revit.DB.Arc")
                        {
                            //不需要
                        }
                        //对于连续的折线
                        if (insObj.GetType().ToString() == "Autodesk.Revit.DB.PolyLine")
                        {
                           
                            PolyLine polyLine = insObj as PolyLine;
                            IList points = polyLine.GetCoordinates();


                            for (int i = 0; i < points.Count - 1; i++)
                            {
                                Line line = Line.CreateBound(points[i], points[i + 1]);
                                line = TransformLine(transform, line);
                                Line newLine = line;
                                CurveArray curveArray = new CurveArray();
                                curveArray.Append(newLine);

                                XYZ startPoint = newLine.GetEndPoint(0);
                                XYZ endPoint = newLine.GetEndPoint(1);
                                XYZ MiddlePoint = GetMiddlePoint(startPoint, endPoint);
                                double angle = (startPoint.Y - endPoint.Y) / startPoint.DistanceTo(endPoint);
                                double rotation = Math.Asin(angle);

                                CADModel cADModel = new CADModel();
                                cADModel.curveArray = curveArray;
                                cADModel.length = newLine.Length;
                                cADModel.shape = "矩形梁";
                                cADModel.width = 300 / 304.8;
                                cADModel.location = MiddlePoint;
                                cADModel.rotation = rotation;

                                curveArray_List.Add(cADModel);

                                //curveArray.Append(line);
                            }


                            //XYZ normal = XYZ.BasisZ;
                            //XYZ point = points.First();
                            //point = transform.OfPoint(point);


                            //CreateModelCurveArray(curveArray, normal, point);
                        }

                    }
                }
            }

            transGroup.Assimilate();
            return curveArray_List;
        }

        ///


        /// 创建模型线组
        ///

        /// 曲线组
        /// 法线
        ///
        private void CreateModelCurveArray(CurveArray curveArray, XYZ normal, XYZ point)
        {
            if (curveArray.Size > 0)
            {
                Transaction transaction2 = new Transaction(doc);
                transaction2.Start("绘制模型线");
                try
                {
                    SketchPlane modelSketch = SketchPlane.Create(doc, Plane.CreateByNormalAndOrigin(normal, point));
                    ModelCurveArray modelLine = doc.Create.NewModelCurveArray(curveArray, modelSketch);
                }
                catch
                {


                }
                transaction2.Commit();
                //curveArray.Clear();暂时不清除
            }
        }

        ///


        /// 翻转指定线
        ///

        /// 矩阵
        /// 被翻转的线
        ///
        private Line TransformLine(Transform transform, Line line)
        {
            XYZ startPoint = transform.OfPoint(line.GetEndPoint(0));
            XYZ endPoint = transform.OfPoint(line.GetEndPoint(1));
            Line newLine = Line.CreateBound(startPoint, endPoint);
            return newLine;
        }

        ///


        /// 查询指定族二级名称是否存在
        ///

        /// 族类型二级名称
        /// 族类型一级名称
        /// revit文档
        ///
        private bool familSymbol_exists(string name, string familyName,Document doc)
        {
            bool exists = false;

            FilteredElementCollector collector = new FilteredElementCollector(doc);
            collector.OfClass(typeof(FamilySymbol)).OfCategory(BuiltInCategory.OST_StructuralFraming);
            foreach (FamilySymbol beamType in collector)
            {
                if (beamType.FamilyName == familyName)
                {
                    if (beamType.Name == name)
                    {
                        exists = true;
                        break;
                    }
                }
            }
            return exists;
        }

        ///


        /// 创建新的梁类型
        ///

        /// 族类型二级
        /// 族类型名称
        private void MakeBeamType(string name, string familyname)
        {
            //载入新的类型
            ChangeFamily(doc);

            FilteredElementCollector collector = new FilteredElementCollector(doc);
            collector.OfClass(typeof(FamilySymbol)).OfCategory(BuiltInCategory.OST_StructuralFraming);
            Document familyDoc = null;
            foreach (FamilySymbol beamType in collector)
            {
                if (beamType.FamilyName == familyname)
                {
                    familyDoc = doc.EditFamily(beamType.Family);
                    break;
                }
            }

            FamilyManager familyManager = familyDoc.FamilyManager;
            Transaction trans = new Transaction(familyDoc, "UserMakeBeamType");
            trans.Start();
            FamilyType newFamilyType = familyManager.NewType(name);
            familyDoc.LoadFamily(doc, new MyFamilyLoadOptions());
            trans.Commit();
            familyDoc.Close(false);
            familyDoc.Dispose();
        }

        ///


        /// 编辑梁族类型,修改族类型二级名称的参数
        ///

        /// 族类型名字
        /// 宽度
        /// 高度
        private void EditBeamType(string name, float b, float h)
        {
            FilteredElementCollector collector = new FilteredElementCollector(doc);
            collector.OfClass(typeof(FamilySymbol)).OfCategory(BuiltInCategory.OST_StructuralFraming);
            Transaction trans = new Transaction(doc, "UserEditBeamType");
            trans.Start();
            foreach (FamilySymbol beamType in collector)
            {
                if (beamType.Name == name)
                {
                    Parameter parab = beamType.LookupParameter("b");
                    if (null != parab)
                    {
                        parab.Set(UnitUtils.ConvertToInternalUnits(b, DisplayUnitType.DUT_MILLIMETERS));
                    }
                    Parameter parah = beamType.LookupParameter("h");
                    if (null != parah)
                    {
                        parah.Set(UnitUtils.ConvertToInternalUnits(h, DisplayUnitType.DUT_MILLIMETERS));
                    }
                }
            }
            trans.Commit();
        }

        ///


        /// 取2点中间值
        ///

        /// 开始点
        /// 结束点
        ///
        private XYZ GetMiddlePoint(XYZ startPoint, XYZ endPoint)
        {
            XYZ MiddlePoint = new XYZ((startPoint.X + endPoint.X) / 2, (startPoint.Y + endPoint.Y) / 2, (startPoint.Z + endPoint.Z) / 2);
            return MiddlePoint;
        }

        ///


        /// 获取指定标高
        ///

        /// 系统文档
        /// 标高名
        ///
        private Level LevelFilter(Document doc, string name="标高 2")
        {
            FilteredElementCollector collector = new FilteredElementCollector(doc);
            ICollection collection = collector.OfClass(typeof(Level)).ToElements();
            Level level = null;
            foreach (Element element in collection)
            {
                Level level1 = element as Level;
                if (level1 != null && level1.Name == name)
                {
                    level = level1;
                }
            }

            return level;
        }

        ///


        /// 获取梁类型的名称集合
        ///

        ///
        ///
        private List getBeamTypes(Document doc)
        {
            List beamTypes = new List();
            FilteredElementCollector collector = new FilteredElementCollector(doc);
            collector.OfClass(typeof(FamilySymbol)).OfCategory(BuiltInCategory.OST_StructuralFraming);
            foreach (FamilySymbol beamType in collector)
            {
                beamTypes.Add(beamType.Name.ToString());
            }
            return beamTypes;
        }

        ///


        /// 重命名族名称(一级),包括遇到没有情况下的新的载入
        ///

        /// revit文档
        private void ChangeFamily(Document doc)
        {
            Transaction changeFamily = new Transaction(doc, "ChangeFamily");
            bool type1 = false;//判断是否存在族类型“ZBIM - 矩形梁”
            bool type2 = false;//判断是否存在族类型“混凝土 - 矩形梁”
            //bool type3 = false;
            changeFamily.Start();
            FilteredElementCollector collection_Origin = new FilteredElementCollector(doc);
            collection_Origin.OfClass(typeof(FamilySymbol)).OfCategory(BuiltInCategory.OST_StructuralFraming);
            foreach (FamilySymbol familySymbol_beam in collection_Origin)//判断是否存在“ZBIM - 矩形梁”
            {
                if (familySymbol_beam.Family.Name == "ZBIM - 矩形梁")
                    type1 = true;

            }
            if (!type1)//如果不存在“ZBIM - 矩形梁”,判断是否存在"混凝土 - 矩形梁",存在就将它的名称改为“ZBIM - 矩形梁”
            {
                foreach (FamilySymbol familySymbol_beam in collection_Origin)
                {
                    if (familySymbol_beam.Family.Name == "混凝土 - 矩形梁")
                    {
                        familySymbol_beam.Family.Name = "ZBIM - 矩形梁";
                        type1 = true;
                        type2 = true;
                    }
                }
            }

            
            changeFamily.Commit();
            //因为原来有“混凝土 - 矩形梁”,你需要补上去。
            if (type2)
            {
                Transaction trans = new Transaction(doc, "loadfamily");
                trans.Start();
                doc.LoadFamily(@"C:\ProgramData\Autodesk\RVT 2018\Libraries\China\结构\框架\混凝土\混凝土 - 矩形梁.rfa");              
                trans.Commit();
            }
            if(!type1&& !type2)//如果即不存在“ZBIM - 矩形梁”,也不存在“混凝土 - 矩形梁”,直接载入并改名
            {
                Transaction trans = new Transaction(doc, "loadfamilyBeam");
                trans.Start();
                doc.LoadFamily(@"C:\ProgramData\Autodesk\RVT 2018\Libraries\China\结构\框架\混凝土\混凝土 - 矩形梁.rfa");
                trans.Commit();
               

                FilteredElementCollector collector = new FilteredElementCollector(doc);
                collector.OfClass(typeof(FamilySymbol)).OfCategory(BuiltInCategory.OST_StructuralFraming);


                Transaction tran = new Transaction(doc, "changedfamilyBeam");
                tran.Start();
                if (!type1)
                {
                    foreach (FamilySymbol familySymbol_column in collector)
                    {
                        if (familySymbol_column.Family.Name == "混凝土 - 矩形梁")
                            familySymbol_column.Family.Name = "ZBIM - 矩形梁";
                    }
                   
                }
                tran.Commit();
                
            }
            //doc.Regenerate();
        }

        ///


        /// 判断2点是否重合
        ///

        /// A点
        /// B点
        /// 结果
        private bool IsCoincide(XYZ A, XYZ B)
        {
            if (A.X == B.X && A.Y == B.Y && A.Z == B.Z)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }

 

 

上边为主程序,配套的其他类为

using Autodesk.Revit.DB;

public class CADModel
   {
        public CADModel()
            {
                curveArray = null;
                shape = "";
                length = 0;
                width = 0;
                familySymbol = "";
                location = new XYZ(0, 0, 0);
                rotation = 0;
            }
        ///


        /// 曲线阵列
        ///

        public CurveArray curveArray { get; set; }
        ///
        /// 形状、模型
        ///

        public string shape { get; set; }
        ///
        /// 长度
        ///

        public double length { get; set; }
        ///
        /// 宽度
        ///

        public double width { get; set; }
        ///
        /// 族类型
        ///

        public string familySymbol { get; set; }
        ///
        /// 三维地址,直线取中点
        ///

        public XYZ location { get; set; }
        ///
        /// 水平角度,会出现负值,建议|X|
        ///

        public double rotation { get; set; }

        public static explicit operator CADModel(CurveArray v)
            {
                throw new NotImplementedException();
            }
           
   }

 

还有

using Autodesk.Revit.DB;

 

public class MyFamilyLoadOptions : IFamilyLoadOptions
    {
        public bool OnFamilyFound(bool familyInUse, out bool overwriteParameterValues)
        {
            overwriteParameterValues = false;
            return true;
        }

        public bool OnSharedFamilyFound(Family sharedFamily, bool familyInUse, out FamilySource source, out bool overwriteParameterValues)
        {
            source = FamilySource.Project;
            overwriteParameterValues = true;
            return true;
        }
    }

你可能感兴趣的:(revit二次开发)