標高解析を作成する

標高解析では、サーフェスの 2 次元投影を作成して、高度の範囲を表す色の帯を追加します。Surface.Analysis.GetElevationData() を呼び出すと、SurfaceAnalysisElevationData オブジェクトの配列、解析によって作成された各標高リージョンの配列、または解析が存在しない場合は空の配列が返されます。各標高リージョンは、サーフェスの合計標高の一部を表します。コレクションを使用すると、各リージョンの色、最小標高、および最大標高を変更できます。

サーフェスの標高解析が GUI で生成されるたびに、 Autodesk Civil 3D はサーフェスのすべての既存標高リージョンを破棄し、新しいリージョンのコレクションを作成することに注意してください。SurfaceAnalysisElevationData オブジェクトの以前のコレクションに対する変更は破棄されます。

.NET API には、COM API の SurfaceAnalysisElevation.CalculateElevationRegions() メソッドと同等のメソッドはありませんが、同じことを実行するメソッドを実装することができます。次の例は、1 つの実装と、コマンドで使用されている実装されたメソッドを示しています。

/// <summary>
/// Calculates elevation regions for a given surface, and returns an array that can be passed 
/// to Surface.Analysis.SetElevationData()
/// </summary>
/// <param name="surface">A Civil 3D Surface object</param>
/// <param name="steps">The number of elevation steps to calculate</param>
/// <param name="startColor">The index of the start color.  Each subsequent color index is incremeted by 2.</param>
/// <returns>An array of SurfaceAnalysisElevationData objects.</returns>
private SurfaceAnalysisElevationData[] CalculateElevationRegions(Autodesk.Civil.Land.DatabaseServices.Surface surface, int steps, short startColor)
{
    // calculate increments based on # of steps:
    double minEle = surface.GetGeneralProperties().MinimumElevation;
    double maxEle = surface.GetGeneralProperties().MaximumElevation;
    double incr = (maxEle - minEle) / steps;

    SurfaceAnalysisElevationData[] newData = new SurfaceAnalysisElevationData[steps];
    for (int i = 0; i < steps; i++)
    {
        Color newColor = Color.FromColorIndex(ColorMethod.ByLayer, (short)(100 + (i * 2)));
        newData[i] = new SurfaceAnalysisElevationData(minEle + (incr * i), minEle + (incr * (i + 1)), newColor);
    }

    return newData;
}

/// <summary>
/// Illustrates performing an elevation analysis
/// </summary>
[CommandMethod("SurfaceAnalysis")]
public void SurfaceAnalysis()
{
    using (Transaction ts = Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
    {
        // Select first TIN Surface              
        ObjectId surfaceId = doc.GetSurfaceIds()[0];
        TinSurface oSurface = surfaceId.GetObject(OpenMode.ForWrite) as TinSurface;

        // get existing analysis, if any:
        SurfaceAnalysisElevationData[] analysisData = oSurface.Analysis.GetElevationData();
        editor.WriteMessage("Existing Analysis length: {0}\n", analysisData.Length);
                
        SurfaceAnalysisElevationData[] newData = CalculateElevationRegions(oSurface, 10, 100);
                
        oSurface.Analysis.SetElevationData(newData);

        // commit the transaction
        ts.Commit();
    }
}

多くの標高解析フィーチャは、サーフェス スタイルで変更できます。たとえば、多くのプリセット色スキーム(ColorSchemeType 列挙型で定義されている)を使用できます。