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