第一步:得到管道的线
/// <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();
}
}
这里的洞口尺寸和管道一样