revit二次开发——自动生成模板(结构柱)

将结构柱的模板自动生成自动切掉结构梁和结构板的部分。不多说了直接上代码。

   private double GetColumnTemplateArea(Element element)
        {
            Solid solidElem = GetElementSolid(element);//获取构件的Solid
            List<Face> faceList = GetFacesFromSolid(solidElem);//获取Solid的所有的面
            double TemplateArea = 0;//柱子模板的面积
            using (var ts = new Transaction(doc, "创建模板"))
            {
                ts.Start();
                //循环四个面对每个面都进行操作
                foreach (var face in faceList)
                {
                    var planarFace = face as PlanarFace;
                    //忽略掉顶面和底面
                    if (planarFace.FaceNormal.IsAlmostEqualTo(new XYZ(0, 0, 1))
                        || planarFace.FaceNormal.IsAlmostEqualTo(new XYZ(0, 0, -1)))
                    {
                        continue;
                    }

                    //由face转变为拉伸所需要的截面profile
                    var profiles = planarFace.GetEdgesAsCurveLoops();

                    //生成拉伸体solid
                    var solid = GeometryCreationUtilities
                    .CreateExtrusionGeometry(profiles, planarFace.FaceNormal, 10 / 304.8);
                    //创建拉伸构件的类型
                    var ds = DirectShape.CreateElement(doc, new ElementId(-2000011));


                    //收集族和楼板和创建模板是否有接触
                    var collector = new FilteredElementCollector(doc).OfClass(typeof(FamilyInstance));
                    var collector2 = new FilteredElementCollector(doc).OfClass(typeof(Floor));
                    var solidFilter = new ElementIntersectsSolidFilter(solid);
                    collector.WherePasses(solidFilter);
                    collector2.WherePasses(solidFilter).ToElements().ToList();

                    //创建几个Soild周转和剪切出最后的Soild
                    Solid solid2 = null;
                    Solid solid3 = null;
                    if (collector.Count() > 0)
                    {
                        Solid solid1 = GetElementSolid((collector.First() as FamilyInstance));

                        solid2 = BooleanOperationsUtils.ExecuteBooleanOperation(solid, solid1, BooleanOperationsType.Difference);

                    }
                    if (collector2.Count() > 0)
                    {
                        List<Floor> floorList = collector2.OfClass(typeof(Floor)).Cast<Floor>().ToList();
                        foreach (var item in floorList)
                        {
                            Solid solid1 = GetElementSolid((item as Floor));
                            var ids = collector2.ToElementIds();
                            solid3 = BooleanOperationsUtils.ExecuteBooleanOperation(solid2, solid1, BooleanOperationsType.Difference);
                            solid2 = solid3;
                        }
                    }

                    //创建出模板,如果不创建屏蔽掉这一行或者不提交事件即可
                    ds.AppendShape(new List<GeometryObject> { solid2 });

                    //获取新的Solid的所有面
                    List<Face> solid2FaceList = GetFacesFromSolid(solid2);

                    //选出和柱子循环中同样向量的面把面积记录下来
                    foreach (PlanarFace S2face in solid2FaceList)
                    {
                        if (S2face.FaceNormal.IsAlmostEqualTo(planarFace.FaceNormal))
                        {
                            TemplateArea += S2face.Area;
                            break;
                        }
                        else
                        {
                            continue;
                        }
                    }


                }
                ts.Commit();
            }



            return TemplateArea;
        }

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值