C#二开,在已知的轴网交点上生成柱

学了一阵二开的课程,有一点点心得,把课程作业大概做出个样板出来:

使用结构样板,先创建好相交的轴网,然后执行,可生成结构柱里面的第一个混凝土矩形柱.并把轴网的相交的名称附值进"注释"内.

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

namespace ElementCUD
{
    [Transaction(TransactionMode.Manual)]
    class CreateColumn : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            var doc = commandData.Application.ActiveUIDocument.Document;
            var uidoc = commandData.Application.ActiveUIDocument;
            try
            {
                var tran = new Transaction(doc, "创建柱");
                tran.Start();

                #region 找出交点
                var gridList = (from element in new FilteredElementCollector(doc).OfClass(typeof(Grid)) select element as Grid).ToList();
                List<Line> gridCurveList = new List<Line>();
                foreach (Grid item in gridList)
                {
                    var gridCurve = item.Curve as Line;
                    gridCurveList.Add(gridCurve);
                }

                List<XYZ> intersetionPointsList = new List<XYZ>();
                List<string> intersetionName = new List<string>();
                string numName;
                string codeName;
                for (int i = 0; i < gridCurveList.Count; i++)
                {
                    numName = gridList[i].Name.ToString();
                    for (int j = i + 1; j < gridCurveList.Count; j++)
                    {
                        if (!(gridCurveList[i].Direction.CrossProduct(gridCurveList[j].Direction)).IsAlmostEqualTo(XYZ.Zero))
                        {
                            IntersectionResultArray intersectionPoint = new IntersectionResultArray();
                            var result = gridCurveList[i].Intersect(gridCurveList[j], out intersectionPoint);
                            if (result == SetComparisonResult.Overlap)
                            {
                                var point = intersectionPoint.get_Item(0).XYZPoint;
                                intersetionPointsList.Add(point);
                                codeName = numName + gridList[j].Name.ToString();
                                intersetionName.Add(codeName);
                            }
                        }
                    }
                }
                #endregion


                #region 生成柱
                var symbolList = (from ele in new FilteredElementCollector(doc).OfClass(typeof(FamilySymbol))
                                  let symb = ele as FamilySymbol
                                  where symb.Category.Name == "结构柱" && symb.FamilyName.Contains("矩形")
                                  select symb).ToList();


                FamilySymbol symbol = symbolList?.FirstOrDefault();
                if (!symbol.IsActive) symbol.Activate();

                var levelList = (from ele in new FilteredElementCollector(doc).OfClass(typeof(Level))
                             let le = ele as Level
                             where le.Name == "标高 1"
                             select le).ToList();
                var level = levelList?.FirstOrDefault();

                for (int i = 0; i < intersetionPointsList.Count; i++)
                {
                    XYZ location = intersetionPointsList[i];

                    var column = doc.Create.NewFamilyInstance(location, symbol, level, StructuralType.Beam);
                    column.LookupParameter("注释").Set(intersetionName[i]);
                }
                

                tran.Commit();

                #endregion



                // TaskDialog.Show("revit", intersetionPointsList.Count().ToString());测试下有多少个交点
            }
            catch (Exception E)
            {
                TaskDialog.Show("revit", E.ToString());
            }

            

            return Result.Succeeded;


        }
    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值