【Revit二次开发】在轴网相交处创建柱子

写在前面,要做到如图的样子。因为对Revit软件的使用根本不熟,所以遇到了很多问题,在这里先罗列一下,万一有跟我相同疑问的同学也可以互相交流一下。

【Revit二次开发】在轴网相交处创建柱子_第1张图片

首先目的是在轴线的交点处创建柱子

第一步:在Revit里面画上测试代码的图(几条相交的轴线)

由于没画过图,很懵逼,所以百度了怎么画轴线。我参考的是这个网址https://jingyan.baidu.com/article/3052f5a1e65e5597f31f86eb.html 。大致内容就是先创建一个建筑项目,然后在左边的立面选择东南西北任一一个双击打开,创建标高(标高是代表一个平面,比如你家要是有两层小楼,那么就应该画两个标高,一楼地面一个,二楼地面一个),给两个标高重命名为1F和2F,随便选择一个吧,比如2F,双击打开,此时你看到的就是二楼平面的俯视图了。也就是上面截图的样子。轴网就是在二楼平面上的各种线条。我创建的时候一条轴线的中间没有。。。后来问了同事才知道那是轴线的一种类型,如果要调整成连续虚线的轴线,则选中轴线,编辑类型,选择你要的轴线类型就好。

第二步:写代码

在贴代码之前想先分析一下整个思路,因为我刚学,看视频人家直接就一步一步写下去,没有解释说明,实在费解

思路:

1.获取轴线的交点

       1>.获取轴网(Grid类),然后获得每条轴线。

       2>.遍历获取轴线的交点(注意排除重复的点)。

2.在交点处创建柱子

      1>.开始一个任务(因为创建柱子会修改到视图了,所以要开始一个Transaction)

      2>.得到一个Level(标高的id,就是创建的标高的那条线)和一个FamilySymbol(这里需要自己随便创建一个柱子,然后复制他的id)

      3>.最后调用这个方法NewFamilyInstance()创建柱子

代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB.Structure;

namespace GridPractise
{
    [TransactionAttribute(TransactionMode.Manual)]
    [RegenerationAttribute(RegenerationOption.Manual)]
    public class Class1 : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            UIDocument uidoc = commandData.Application.ActiveUIDocument;
            Document revitDoc = uidoc.Document;
            FilteredElementCollector coll = new FilteredElementCollector(revitDoc); //创建收集器
            ElementClassFilter gridFilter = new ElementClassFilter(typeof(Grid));//创建轴网过滤器

            List grid = coll.WherePasses(gridFilter).ToElements().ToList();
            List gridLines = new List();//创建轴线List
            List intPos = new List();//创建交点List

            foreach (Grid gri in grid)
            {
                gridLines.Add(gri.Curve as Line); //将轴网转换为线
            }

            foreach (Line ln1 in gridLines)//找到第一根线
            {
                foreach (Line ln2 in gridLines)//找到第二根线
                {
                    XYZ normal1 = ln1.Direction;//得到的是直线的方向向量
                    XYZ normal2 = ln2.Direction;

                    //如果两根轴线方向相同,则遍历下一组(目的是排除平行与重合的线)
                    if (normal1.IsAlmostEqualTo(normal2)) continue; 
                    IntersectionResultArray results;
                    SetComparisonResult intRst = ln1.Intersect(ln2, out results);//如果两根轴线相交,则输出交点

                    if (intRst == SetComparisonResult.Overlap && results.Size == 1)//排除轴线是曲线,交点不止一个的情况
                    {
                        XYZ tp = results.get_Item(0).XYZPoint;//上面得到的交点
                        //比较得到的交点和intPos数组里面的元素是否相同,不同才Add到intPos数组中,作用是排除重复的点
                        if (intPos.Where(m => m.IsAlmostEqualTo(tp)).Count() == 0)
                        {
                            intPos.Add(tp); //收集所有的交点
                        }
                    }
                }
            }
            //打印出交点个数
            TaskDialog.Show("交点个数", intPos.Count.ToString());


            using (Transaction trans = new Transaction(revitDoc))
            {
                trans.Start("任务开始");
                Level level = revitDoc.GetElement(new ElementId(694)) as Level;//你的图上的标高的id
                FamilyInstance f = revitDoc.GetElement(new ElementId(332661)) as FamilyInstance;//创建一个柱子,其Id为332661
                FamilySymbol familySymbol = f.Symbol;                                                                             //判断族类型
                if (!familySymbol.IsActive)
                {
                    familySymbol.Activate();
                }
                foreach (XYZ p in intPos)
                {
                    //创建柱子
                    FamilyInstance familyInstance = revitDoc.Create.NewFamilyInstance(p, familySymbol, level, StructuralType.NonStructural);
                }
                trans.Commit();
            }
            return Result.Succeeded;
        }
    }
}

 

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