C# 如何在Revit中获取面或平面面图元的中心点
我正在执行Revit宏以获取零件楼板零件的中心点,以检查其是否位于房间或空间内。 我无法获得BoundingBox对象的大部分,该对象为我提供了零件外部的一个点,因此我尝试使用几何元素内部面来获取网格顶点,但我无法计算中点。 我正在使用下面的代码片段中显示的一个相当幼稚的算法,但它给了我错误的结果,因为它似乎受到初始默认值min/max变量的影响。 有什么建议吗 PS:DebugTools是我自己的自定义助手类C# 如何在Revit中获取面或平面面图元的中心点,c#,revit-api,C#,Revit Api,我正在执行Revit宏以获取零件楼板零件的中心点,以检查其是否位于房间或空间内。 我无法获得BoundingBox对象的大部分,该对象为我提供了零件外部的一个点,因此我尝试使用几何元素内部面来获取网格顶点,但我无法计算中点。 我正在使用下面的代码片段中显示的一个相当幼稚的算法,但它给了我错误的结果,因为它似乎受到初始默认值min/max变量的影响。 有什么建议吗 PS:DebugTools是我自己的自定义助手类 public void ZoneDetect() { Document do
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);
我将考虑使用您提供的链接来改进它,但现在我将着手完成手头的任务
非常感谢尽管如此,仍然存在重心不在地板上的假设情况。在某些情况下,最好使用点栅格并确定点是否在面内。