轴网立柱

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

namespace 交点立柱
{
    [Transaction(TransactionMode.Manual)]
    public class Class1 : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            UIDocument uiDoc = commandData.Application.ActiveUIDocument;
            Document doc = uiDoc.Document;
            FilteredElementCollector collector = new FilteredElementCollector(doc);
            IList<Element> grids = collector.OfClass(typeof(Grid)).ToElements().ToList();
            List<Line> gridLines = new List<Line>();
            List<XYZ> intpos = new List<XYZ>();
            //找到轴网的交点
            foreach (Grid gri in grids)
            {
                gridLines.Add(gri.Curve as Line);
            }
            foreach (Line ln1 in gridLines)
            {
                foreach (Line ln2 in gridLines)
                {
                    XYZ normal = ln1.Direction;
                    XYZ normal2 = ln2.Direction;
                    if (normal.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 = uiDoc.ActiveView.GenLevel;//当前视图标高
            FamilySymbol familysymbol =FindSymbol(doc, "矩形柱", "457 x 475mm");

            using (Transaction trans = new Transaction(doc))
            {
                trans.Start("dfs");
                if (!familysymbol.IsActive)
                    familysymbol.Activate();//设为Activate状态

                foreach (XYZ p in intpos)
                {
                    //创建柱子
                    FamilyInstance familyInstance = doc.Create.NewFamilyInstance(p, familysymbol, level, StructuralType.Column);
                }
                trans.Commit();
            }
            return Result.Succeeded;
        }

        public FamilySymbol FindSymbol(Document doc, string familyName, string symbolName)
        {
            //声明变量
            Family family = null;
            FamilySymbol familySymbol = null;
            //用类型过滤器查找所有族
            FilteredElementCollector familycol = new FilteredElementCollector(doc);
            familycol.OfClass(typeof(Family));
            //按族名称查找族
            foreach (Family f in familycol)
            {
                if (f.Name == familyName)
                {
                    family = f;
                    break;
                }
            }
            //如果没有该族,直接返回
            if (family == null)
                return null;
            //用family.GetFamilySymbolids()取得该类型所有类型的id,在遍历
            foreach (ElementId fsid in family.GetFamilySymbolIds())
            {
                //将id转换回familysymbols,再按照名称查找
                FamilySymbol fs = doc.GetElement(fsid) as FamilySymbol;
                if (fs.Name == symbolName)
                {
                    familySymbol = fs;
                    break;
                }
            }
            return familySymbol;
        }


    }
}

猜你喜欢

转载自blog.csdn.net/waiting233/article/details/116664518