C# 如何在Revit中获取面或平面面图元的中心点

C# 如何在Revit中获取面或平面面图元的中心点,c#,revit-api,C#,Revit Api,我正在执行Revit宏以获取零件楼板零件的中心点,以检查其是否位于房间或空间内。 我无法获得BoundingBox对象的大部分,该对象为我提供了零件外部的一个点,因此我尝试使用几何元素内部面来获取网格顶点,但我无法计算中点。 我正在使用下面的代码片段中显示的一个相当幼稚的算法,但它给了我错误的结果,因为它似乎受到初始默认值min/max变量的影响。 有什么建议吗 PS:DebugTools是我自己的自定义助手类 public void ZoneDetect() { Document do

我正在执行Revit宏以获取零件楼板零件的中心点,以检查其是否位于房间或空间内。 我无法获得BoundingBox对象的大部分,该对象为我提供了零件外部的一个点,因此我尝试使用几何元素内部面来获取网格顶点,但我无法计算中点。 我正在使用下面的代码片段中显示的一个相当幼稚的算法,但它给了我错误的结果,因为它似乎受到初始默认值min/max变量的影响。 有什么建议吗

PS:DebugTools是我自己的自定义助手类

public void ZoneDetect()
{
    Document doc = this.ActiveUIDocument.Document;

    using (Transaction t = new Transaction(doc,"Set Rooms By Region"))
    {
        t.Start();

        FilteredElementCollector fec = 
            new FilteredElementCollector(doc)
                .OfClass(typeof(Part))
                .OfCategory(BuiltInCategory.OST_Parts)
                .Cast<Part>();

        foreach (Part p in fec)
        {


            Options op = new Options();
            op.View=doc.ActiveView;
            op.ComputeReferences=true;

            GeometryElement gm=p.get_Geometry(op);
            Solid so = gm.First() as Solid;
            PlanarFace fc=so.Faces.get_Item(0) as PlanarFace;

            foreach (PlanarFace f in so.Faces)
            {
                if (f.Normal == new XYZ(0,0,-1))  fc=f;
            }
            XYZ max = new XYZ();
            XYZ min = new XYZ();

            int no = 0;
            foreach (XYZ vx in fc.Triangulate().Vertices) 
            {
                // Just for debugging
                DebugTools.DrawModelTick(vx,doc,"Max");
                doc.Regenerate();
                TaskDialog.Show("Point:"+no.ToString(),vx.ToString());
                no++;

                //Comparing points
                if (vx.X>max.X) max=new XYZ (vx.X,max.Y,0);
                if (vx.Y>max.Y) max=new XYZ (max.X,vx.Y,0);
                if (vx.X<min.X) min=new XYZ (vx.X,min.Y,0);
                if (vx.Y<min.Y) min=new XYZ (min.X,vx.Y,0);
            }

            XYZ mid = new XYZ(max.X-min.X,max.Y-min.Y,0);

            DebugTools.DrawModelTick(mid,doc,"Mid");
            DebugTools.DrawModelTick(max,doc,"Max");
            DebugTools.DrawModelTick(min,doc,"Min");
        }

        t.Commit();
    }
}

看起来你在寻找一个多边形的重心。可在以下位置找到该算法:


拥有面对象后,可以枚举其边以接收顶点列表。使用脸上最长的边孔。收集所有点并确保它们的顺序正确边缘的起点和终点可能需要交换。

Daren&Matt非常感谢您的回答, 由于我处理的是相当简单的形状,主要是矩形,我只需要在中心附近取一个点来测试它是否在房间内,我的问题是我使用的幼稚算法,结果证明是错误的。 我更正如下:

XYZ midSum = Max + Min;
XYZ mid = new XYZ(midSum.X/2 , midSum.Y/2,0);
我将考虑使用您提供的链接来改进它,但现在我将着手完成手头的任务


非常感谢

尽管如此,仍然存在重心不在地板上的假设情况。在某些情况下,最好使用点栅格并确定点是否在面内。