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