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

    xiaoxiao2022-07-03  120

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

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

    第一步:在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<Element> grid = coll.WherePasses(gridFilter).ToElements().ToList(); List<Line> gridLines = new List<Line>();//创建轴线List List<XYZ> intPos = new List<XYZ>();//创建交点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; } } }

     

    最新回复(0)