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