Revit二次开发 自适应族添加放样融合

大多数博客给出的方案都是如何在有自适应族的情况下进行修改定位点或是将数据传入自适应族,如何直接在族文件中创建自适应模型并将点转换为自适应点,连接自适应点成为自适应路径这种方式没有文章介绍.
在这里插入图片描述

下面的代码中给出了如何在自适应族文件中创建参照点并转换为自适应点连接成为路径,最终创建放样融合的办
法.

        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            var uiDoc = commandData.Application.ActiveUIDocument; // UIDocument 


            var doc = uiDoc.Document;

            // 定义路径的起点和终点
            var pathStart = new XYZ(0, 0, 0);
            var pathEnd = new XYZ(0, 0, 10);

            // 定义第一个轮廓的点(底部轮廓)
            var bottomProfilePoints = new List<XYZ>
			{
			    new XYZ(-2, -2, 0),  // 左下
			    new XYZ(2, -2, 0),   // 右下
			    new XYZ(2, 2, 0),    // 右上
			    new XYZ(-2, 2, 0)    // 左上
			};

            // 定义第二个轮廓的点(顶部轮廓)
            var topProfilePoints = new List<XYZ>
			{
			    new XYZ(-3, -3, 10),  // 左中
			    new XYZ(3, -3, 10),  // 右下
			    new XYZ(3, 3, 10),   // 上中
			    new XYZ(-3, 3, 10)   // 左上
			};

            // 创建轮廓线
            var bottomProfile = CreateClosedCurveLoop(bottomProfilePoints);
            var topProfile = CreateClosedCurveLoop(topProfilePoints);

            // 创建路径
            var path = Line.CreateBound(pathStart, pathEnd);

            // 执行事务
            using (Transaction transaction = new Transaction(doc, "Create Sweep Form"))
            {
                transaction.Start();

                // 创建自适应点
                var refStart = doc.FamilyCreate.NewReferencePoint(pathStart);
                AdaptiveComponentFamilyUtils.MakeAdaptivePoint(doc, refStart.Id, AdaptivePointType.PlacementPoint);
                var refEnd = doc.FamilyCreate.NewReferencePoint(pathEnd);
                AdaptiveComponentFamilyUtils.MakeAdaptivePoint(doc, refEnd.Id, AdaptivePointType.PlacementPoint);

                // 设置自适应点编号
                AdaptiveComponentFamilyUtils.SetPlacementNumber(doc, refStart.Id, 1);
                AdaptiveComponentFamilyUtils.SetPlacementNumber(doc, refEnd.Id, 2);

                // 创建自适应路径
                var refPoints = new ReferencePointArray();
                refPoints.Append(refStart);
                refPoints.Append(refEnd);
                var refCurve = doc.FamilyCreate.NewCurveByPoints(refPoints);

                // 创建草图平面
                var bottomSketchPlane = SketchPlane.Create(doc, Plane.CreateByNormalAndOrigin(XYZ.BasisZ, pathStart));
                var topSketchPlane = SketchPlane.Create(doc, Plane.CreateByNormalAndOrigin(XYZ.BasisZ, pathEnd));
                var pathSketchPlane = SketchPlane.Create(doc, Plane.CreateByThreePoints(pathStart, pathEnd, pathStart + new XYZ(-1, 0, 0)));

                // 创建轮廓的参考数组
                var refArrArray = new ReferenceArrayArray();
                refArrArray.Append(CreateReferenceArrayFromCurveLoop(doc, bottomProfile, bottomSketchPlane));
                refArrArray.Append(CreateReferenceArrayFromCurveLoop(doc, topProfile, topSketchPlane));

                // 创建路径的参考数组
                var pathRefArray = new ReferenceArray();
                var pathModelCurve = doc.FamilyCreate.NewModelCurve(path, pathSketchPlane);
                pathRefArray.Append(refCurve.GeometryCurve.Reference);

                // 创建放样融合形状
                var form = doc.FamilyCreate.NewSweptBlendForm(true, pathRefArray, refArrArray);

                transaction.Commit();
            }

           //var collector = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Rooms).WhereElementIsNotElementType();

            //foreach (Element ele in collector)
            //{
            //    var comment = ele.get_Parameter(BuiltInParameter.ALL_MODEL_INSTANCE_COMMENTS);

            //    TaskDialog.Show("Revit", comment.AsString());
            //    break;
            //}


            //var selection = uiDoc.Selection.PickObject(ObjectType.Element);
            //var ele = doc.GetElement(selection) as Wall;
            //var locationCurve = ele.Location as LocationCurve;
            var point0 = (locationCurve.Curve as Edge).GetEndPoint(0);
            //var point1 = (locationCurve.Curve).GetEndPoint(1);
            TaskDialog.Show("Revit", $"S: {point0.X} , {point0.Y} , E: {point1.X} , {point1.Y}");
            //TaskDialog.Show("Revit", $"S: {double.MinValue}");
            //var tess = (locationCurve.Curve).Tessellate();
            //TaskDialog.Show("Revit", $"S: {tess[0].X} , {tess[0].Y} , E: {tess[1].X} , {tess[1].Y} , count : {tess.Count}");
            //using (Transaction trans = new Transaction(doc,"create"))
            //{
            //    trans.Start();


            //    var pipe5 = Pipe.Create(doc, new ElementId(621821), new ElementId(6323162), new ElementId(7984255), new XYZ(10, 10, 15), new XYZ(17, 10, 15));
            //    //var pipe5 = doc.GetElement(new ElementId(8028066)) as Pipe;
            //    var pipe5 = doc.GetElement(new ElementId(8028405)) as Duct;
            //    var pipe8 = Pipe.Create(doc, new ElementId(621821), new ElementId(6323162), new ElementId(7984255), new XYZ(18, 0, 15), new XYZ(18, 20, 15));
            //    //var pipe8 = doc.GetElement(new ElementId(8028069)) as Pipe;
            //    var pipe8 = doc.GetElement(new ElementId(8028423)) as Duct;


            //    //ConnectWithTakeoff(doc, pipe8, pipe5);

            //    Wall.Create(doc,CreateWallBoundaryList(),new ElementId(7301614),new ElementId(7984255),false);

            //    trans.Commit();
            //}




            return Result.Succeeded;
        }


        /// <summary>
        /// 根据点列表创建闭合的曲线环
        /// </summary>
        /// <param name="points">点列表</param>
        /// <returns>闭合的曲线环</returns>
        CurveArray CreateClosedCurveLoop(List<XYZ> points)
        {
            var curveArray = new CurveArray();
            for (int i = 0; i < points.Count; i++)
            {
                var startPoint = points[i];
                var endPoint = points[(i + 1) % points.Count]; // 闭合环
                curveArray.Append(Line.CreateBound(startPoint, endPoint));
            }
            return curveArray;
        }

        /// <summary>
        /// 从曲线环创建参考数组
        /// </summary>
        /// <param name="doc">当前文档</param>
        /// <param name="curveLoop">曲线环</param>
        /// <param name="sketchPlane">草图平面</param>
        /// <returns>参考数组</returns>
        ReferenceArray CreateReferenceArrayFromCurveLoop(Document doc, CurveArray curveLoop, SketchPlane sketchPlane)
        {
            var refArray = new ReferenceArray();
            foreach (Curve curve in curveLoop)
            {
                var modelCurve = doc.FamilyCreate.NewModelCurve(curve, sketchPlane);
                refArray.Append(modelCurve.GeometryCurve.Reference);
            }
            return refArray;
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值