0

Revit マクロを実行して、パーツ (床パーツ) の中心点を取得し、部屋またはスペース内にあるかどうかを確認しています。BoundingBoxパーツの外側にポイントを与えるオブジェクトの多くを取得できなかったので、Geometry要素の内部面を使用してメッシュの頂点を取得しようとしましたが、中間点の計算に行き詰まりました。以下のスニペットに示すかなり単純なアルゴリズムを使用していますが、最小/最大変数の初期デフォルトの影響を受けているように見えるため、誤った結果が得られます。助言がありますか?

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();
    }
}
4

2 に答える 2