revit二次开发轴网交点创建柱子

这篇博客介绍了如何使用Revit API在Revit中通过轴网交点自动创建柱子。首先,通过过滤轴网元素获取线,然后找出所有线的交点,接着在指定标高创建柱子。最后,利用事务管理确保操作的原子性,成功创建柱子后显示提示信息。
摘要由CSDN通过智能技术生成

通过轴网交点创建柱

代码如下:

using Autodesk.Revit.ApplicationServices;
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 CreatePost
{
    #region 
    
    [TransactionAttribute(TransactionMode.Manual)]
    public class Class1 : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            UIApplication uiApp = commandData.Application;
            UIDocument uIDocument = uiApp.ActiveUIDocument;
            Application application = uiApp.Application;

            Document document = uIDocument.Document;
            //过滤轴网
            FilteredElementCollector collector = new FilteredElementCollector(document);
            ElementClassFilter filter = new ElementClassFilter(typeof(Grid));
            List<Element> grids = collector.WherePasses(filter).ToElements().ToList();
            //创建相交线
            List<Line> gridLines = new List<Line>();
            //创建点
            List<XYZ> point = new List<XYZ>();

            //遍历轴网转线
            foreach (Grid item in grids)
            {
                Line line = item.Curve as Line;
                gridLines.Add(line);
            }
            //获得线
            foreach (Line item1 in gridLines)
            {
                foreach (Line item2 in gridLines)
                {
                    XYZ vec1 = item1.Direction;
                    XYZ vec2 = item2.Direction;
                    //如果线方向相同则遍历下一组

                    if (vec1.IsAlmostEqualTo(vec2))
                        continue;
                    IntersectionResultArray results;
                    SetComparisonResult rst = item1.Intersect(item2,out results);//输出相交的
                    //判断点是否重复
                    if (rst == SetComparisonResult.Overlap && results.Size == 1)
                    {
                        IntersectionResult rst2 = results.get_Item(0);
                        XYZ xyz = rst2.XYZPoint;
                        //获取不重复点.
                        if (point.Where(m => m.IsAlmostEqualTo(xyz)).Count() == 0)
                        {
                            point.Add(xyz);
                        }
                        
                    }

                }
            }
            //通过当前活跃视图获得一个标高
            View view = uIDocument.ActiveView;
            Level level = view.GenLevel;
            TaskDialog.Show("level", level.Name);
            //得到一个柱的族类型
            ElementId id = new ElementId(52557);   //注意是FamilySymbol的Id
            FamilySymbol familySymbol = document.GetElement(id) as FamilySymbol;

            using (Transaction transaction = new Transaction(document, "创建柱子"))
            {
                transaction.Start();


                foreach (XYZ item3 in point)
                {
                    FamilyInstance familyInstance = document.Create.NewFamilyInstance(item3, familySymbol, level, StructuralType.NonStructural);
                }
                
                transaction.Commit();
                TransactionStatus status = transaction.GetStatus();
                if (status==TransactionStatus.Committed)
                {
                    TaskDialog.Show("提示", "创建成功!");
                }
            }

            return Result.Succeeded;
        }
   
    }

    #endregion
}







  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周杰伦fans

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值