勾配変移点を編集する

2 つの隣接する接線が交差するポイント(実際に交差しているかどうかは関係ない)を、勾配変移点(PVI)と呼びます。このポイントは、接線とそれらを接続している曲線の両方の勾配を制御するので、縦断のジオメトリを編集するときに役立ちます。縦断のすべての PVI のコレクションは、Profile.PVIs プロパティに含まれています。このコレクションを使用すると、縦断の PVI に対してアクセス、追加、削除が可能になり、縦断を構成する図形の位置と数を変更できます。個々の PVI (ProfilePVI 型)は名前と ID を備えていませんが、特定の測点と標高によって識別されます。コレクションのメソッド ProfilePVICollection.GetPVIAtProfilePVICollection.RemoveAt は、測点および標高パラメータに最も近い PVI にアクセスするか、その PVI を削除します。このため、変更する PVI の正確な位置は必要ありません。

次の例では、指定したポイントに最も近い PVI を識別します。次に、「図形から縦断を作成する」で作成した縦断に新しい PVI を追加して、その標高を変更します。

[CommandMethod("EditPVI")]
public void EditPVI()
{
    doc = CivilApplication.ActiveDocument;
 
    Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
    using (Transaction ts = Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
    {
        // get first profile of first alignment in document
        ObjectId alignID = doc.GetAlignmentIds()[0];
        Alignment oAlignment = ts.GetObject(alignID, OpenMode.ForRead) as Alignment;
        Profile oProfile = ts.GetObject(oAlignment.GetProfileIds()[0], OpenMode.ForRead) as Profile;
 
        // check to make sure we have a profile:
        if (oProfile == null)
        {
            ed.WriteMessage("Must have at least one alignment with one profile");
            return;
        }
        //  Find the PVI close to station 1000 elevation -70.
        ProfilePVI oProfilePVI = oProfile.PVIs.GetPVIAt(1000, -70);
        ed.WriteMessage("PVI closest to station 1000 is at station: {0}", oProfilePVI.Station);
        // Add another PVI and slightly adjust its elevation.
        oProfilePVI = oProfile.PVIs.AddPVI(607.4, -64.3);
        oProfilePVI.Elevation -= 2.0;
 
        ts.Commit();
    }
}