写在前面,要做到如图的样子。因为对Revit软件的使用根本不熟,所以遇到了很多问题,在这里先罗列一下,万一有跟我相同疑问的同学也可以互相交流一下。
首先目的是在轴线的交点处创建柱子
第一步:在Revit里面画上测试代码的图(几条相交的轴线)
由于没画过图,很懵逼,所以百度了怎么画轴线。我参考的是这个网址/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>();//创建轴线ListList<XYZ> intPos = new List<XYZ>();//创建交点Listforeach (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;//你的图上的标高的idFamilyInstance f = revitDoc.GetElement(new ElementId(332661)) as FamilyInstance;//创建一个柱子,其Id为332661FamilySymbol familySymbol = f.Symbol; //判断族类型if (!familySymbol.IsActive){familySymbol.Activate();}foreach (XYZ p in intPos){//创建柱子FamilyInstance familyInstance = revitDoc.Create.NewFamilyInstance(p, familySymbol, level, StructuralType.NonStructural);}mit();}return Result.Succeeded;}}}