大多数博客给出的方案都是如何在有自适应族的情况下进行修改定位点或是将数据传入自适应族,如何直接在族文件中创建自适应模型并将点转换为自适应点,连接自适应点成为自适应路径这种方式没有文章介绍.
下面的代码中给出了如何在自适应族文件中创建参照点并转换为自适应点连接成为路径,最终创建放样融合的办
法.
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;}