revit二次开发 楼板开洞,根据管道位置给楼板开洞

第一步:得到管道的线

  /// <summary>
        /// 获取管道的线
        /// </summary>
        /// <returns></returns>
        private Curve GetCurve(Pipe pipe)
        {
            Curve curve = null;
            LocationCurve locationCurve = pipe.Location as LocationCurve;
            curve = locationCurve.Curve;
            return curve;
        }

第二部:得到楼板的面

 /// <summary>
        /// 得到楼板的面
        /// </summary>
        private Face GetFace(Floor floor)
        {
            Face normalFace = null;
            List<Reference> references = HostObjectUtils.GetTopFaces(floor).ToList();
            List<Face> faces = new List<Face>();
            references.ForEach(t=> {
                faces.Add(document.GetElement(t).GetGeometryObjectFromReference(t) as Face);
            });
            double AreaMax = faces.Max(t => t.Area);
            normalFace = faces.FirstOrDefault(p => p.Area == AreaMax);
            //Options options = new Options();
            //options.ComputeReferences = true;
            //GeometryElement geometryElement = floor.get_Geometry(options);
            //foreach (GeometryObject item in geometryElement)
            //{
            //    if (item is Solid solid)
            //    {
            //        List<Face> list = new List<Face>();
            //        foreach (Face face in solid.Faces)
            //        {
            //            list.Add(face);
            //        }
            //        double AreaMax = list.Max(t => t.Area);
            //        normalFace = list.FirstOrDefault(p => p.Area == AreaMax);
            //    }
            //}
            return normalFace;
        }

第三步:得到面和线的交点

 /// <summary>
        /// 获取面与线的交点
        /// </summary>
        /// <returns></returns>
        private XYZ GetPoint(Face face, Curve curve)
        {
            XYZ intersection = null;
            IntersectionResultArray resultArray = new IntersectionResultArray();
            SetComparisonResult setComparisionRes = face.Intersect(curve, out resultArray);
            if (SetComparisonResult.Disjoint != setComparisionRes)
            {
                if (!resultArray.IsEmpty)
                {
                    intersection = resultArray.get_Item(0).XYZPoint;
                }
            }
            return intersection;
        }

这里的线与管道只有一个交点,所以get_Item(0),要根据自己的实际情况变化。
第四步:在楼板开洞

 /// <summary>
        /// 楼板开洞
        /// </summary>
        private void OpenHole(Floor floor, Pipe pipe)
        {
            Face face = GetFace(floor);
            Curve curve = GetCurve(pipe);
            XYZ point = GetPoint(face, curve);
            CurveArray curveArray = new CurveArray();


            Arc arc1 = Arc.Create(point, pipe.Diameter / 2, 0, 360.00.AngleToRadian(), XYZ.BasisX, XYZ.BasisY);
            //Arc arc2 = Arc.Create(point, 2, 180.00.AngleToRadian(), 360.00.AngleToRadian(), XYZ.BasisX, XYZ.BasisY);
            curveArray.Append(arc1);
            //curveArray.Append(arc2);
            using (Transaction transaction = new Transaction(document, "楼板开洞"))
            {
                transaction.Start();
                document.Create.NewOpening(floor, curveArray, true);
                transaction.Commit();
            }
        }

这里的洞口尺寸和管道一样

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值