GeometryInstances

GeometryInstances

GeometryInstance は、既定の設定に Revit が格納し、その後要素のプロパティの結果として適正な位置に変換される一連のジオメトリを表します。GeometryInstances が最も一般的に使用されるのがファミリ インスタンスです。Revit は GeometryInstances を使用することで、特定のファミリのジオメトリの単一のコピーを格納し、複数のインスタンスで再利用することができます。

すべてのファミリ インスタンスに GeometryInstances が含まれるわけではない点に注意してください。(ローカルの結合、交点、インスタンスの配置に関連するその他の要因の影響により) Revit で特定のインスタンスのファミリ ジオメトリの一意のコピーの作成が必要になった場合、GeometryInstance は使用されず、階層の上位レベルにソリッド ジオメトリが表示されます。

GeometryInstance には、GetSymbolGeometry()メソッドと GetInstanceGeometry()メソッドを通じてそのジオメトリを読み取る機能が備わっています。これらのメソッドは、最初のレベルの戻り値と同様の解析が可能な、別の Autodesk.Revit.DB.GeometryElement を返します。

GetSymbolGeometry()は、ファミリの座標系に表されるジオメトリを返します。たとえば、方向や配置場所を気にせずにプロジェクト内に「一般的な」テーブルを配置したイメージが必要な場合に、これを使用します。これも、コピーではなく、実際の Revit ジオメトリ オブジェクトを返すオーバーロードです。このジオメトリを他の要素の作成のための入力として使用する操作(面ベースのファミリの寸法記入や配置など)には元のジオメトリへの参照が必要なため、これは重要です。

GetInstanceGeometry()は、インスタンスを配置するプロジェクトの座標系に表されるジオメトリを返します。たとえば、プロジェクトにインスタンスの特定のジオメトリを配置したイメージが必要な場合(たとえば、テーブルが部屋の壁に並行に配置されていることを確認する場合)に、これを使用します。これは常に要素ジオメトリのコピーを返します。そのため、書き出しやジオメトリ解析ツールの実装には適していますが、このジオメトリを参照するその他の Revit 要素の作成には適していません。

また、任意の座標系でジオメトリを変換する GetInstanceGeometry()メソッドと GetSymbolGeometry()メソッドの両方のオーバーロードがあります。これらのメソッドは常に GetInstanceGeometry()に似たコピーを返します。

GeometryInstance には、記号座標空間からインスタンス座標への変換も格納されます。この変換には変換プロパティからアクセスできます。さらに、GetInstanceGeometry()を介してジオメトリのコピーを抽出する際にも、変換を使用します。詳細は、「Geometry.Transform」を参照してください。

別の変換で配置した 2 つのファミリ インスタンス。ともに同一のジオメトリを取得します

一部のファミリでは、複数のレベルの深さでインスタンスがネストされることがあります。ネストされたインスタンスがある場合、これらのインスタンスは最初のレベルのインスタンスと同じ方法で解析されます。

次の 2 つの例では、インスタンスのジオメトリの解析方法を説明します。

この例では、GeometryInstance のメソッド GetInstanceGeometry()から曲線が抽出されます。

コード領域: インスタンスから曲線を取得

public void GetAndTransformCurve(Autodesk.Revit.ApplicationServices.Application app,
            Autodesk.Revit.DB.Element element, Options geoOptions)
{
   // Get geometry element of the selected element
   Autodesk.Revit.DB.GeometryElement geoElement = element.get_Geometry(geoOptions);

   // Get geometry object
   foreach (GeometryObject geoObject in geoElement)
   {
      // Get the geometry instance which contains the geometry information
      Autodesk.Revit.DB.GeometryInstance instance =
             geoObject as Autodesk.Revit.DB.GeometryInstance;
      if (null != instance)
      {
         GeometryElement instanceGeometryElement = instance.GetInstanceGeometry();
         foreach (GeometryObject o in instanceGeometryElement)
         {
            // Try to find curves
            Curve curve = o as Curve;
            if (curve != null)
            {
               // The curve is already transformed into the project coordinate system
            }
         }
      }
   }
}

この例では、GetSymbolGeometry()を使用して、インスタンスからソリッドを取得します。その後、GeometryInstance.Transform を使用して、構成点がプロジェクト座標系に変換されます。

コード領域: インスタンスからソリッド情報を取得

private void GetAndTransformSolidInfo(Application application, Element element, Options geoOptions)
{
        // Get geometry element of the selected element
        Autodesk.Revit.DB.GeometryElement geoElement = element.get_Geometry(geoOptions);
        
        // Get geometry object
        foreach (GeometryObject geoObject in geoElement)
        {
                // Get the geometry instance which contains the geometry information
                Autodesk.Revit.DB.GeometryInstance instance =
      geoObject as Autodesk.Revit.DB.GeometryInstance;
                if (null != instance)
                {
                    GeometryElement instanceGeometryElement = instance.GetSymbolGeometry();
                    foreach (GeometryObject instObj in instanceGeometryElement)
                        {
                                Solid solid = instObj as Solid;
                                if (null == solid || 0 == solid.Faces.Size || 0 == solid.Edges.Size)
                                {
                                        continue;
                                }
        
                                Transform instTransform = instance.Transform;
                                // Get the faces and edges from solid, and transform the formed points
                                foreach (Face face in solid.Faces)
                                {
                                        Mesh mesh = face.Triangulate();
                                        foreach (XYZ ii in mesh.Vertices)
                                        {
                                                XYZ point = ii;
                                                XYZ transformedPoint = instTransform.OfPoint(point);
                                        }
                                }
                                foreach (Edge edge in solid.Edges)
                                {
                                        foreach (XYZ ii in edge.Tessellate())
                                        {
                                                XYZ point = ii;
                                                XYZ transformedPoint = instTransform.OfPoint(point);
                                        }
                                }
                        }
                }
        }
}
注: ファミリ インスタンスの取得されたジオメトリの詳細については、「例: 梁からジオメトリ データを取得」を参照してください。