项目完整代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit.UI;//IExternalCommand用
using Autodesk.Revit.DB;//Document用
using Autodesk.Revit.Attributes; //TransactionAttribute和RegenerationAttribute
using Autodesk.Revit.DB.Structure;//StructuralType.NonStructural用
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; //将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<XYZ> intPos = new List<XYZ>();//创建交点
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;//获取不重复的点
if(intPos.Where(m=>m.IsAlmostEqualTo(tp)).Count() == 0)
{
intPos.Add(tp); //收集所有的交点
}
}
}
}
//在交点处创建柱子
Level level = revitDoc.GetElement(new ElementId(510300)) as Level;//定义轴网,其Id为510300(以自己创建的轴网Id为准)
FamilySymbol familysymbol = revitDoc.GetElement(new ElementId(510872)) as FamilySymbol;//定义柱子,其Id为52557
using (Transaction trans = new Transaction(revitDoc))
{
trans.Start("dfs");
if (!familysymbol.IsActive)
familysymbol.Activate();//设为Activate状态
foreach (XYZ p in intPos)
{
//创建柱子
FamilyInstance familyInstance = revitDoc.Create.NewFamilyInstance(p, familysymbol, level, StructuralType.NonStructural);
}
trans.Commit();
}
return Result.Succeeded;
}
}
}
效果:
参考资料:
周婧祎 《Autodesk Revit 2016二次开发入门教程》