線形の特定の測点に適用できるもう 1 つの設定は、横断勾配摺り付けです。これは、線形に基づいてコリドーの道路横断コンポーネントの角度を調整するために使用します。道路の右側と左側の両方について、内側および外側路肩と道路サーフェスを調整できます。
AutoCAD Civil 3D 2011 では、横断勾配摺り付けフィーチャに大きな変更が加えられました。API も変更されました。Alignment::SuperelevationData プロパティおよび Alignment::SuperElevationAtStation() メソッドが削除されました。新しい API を使用するには、既存のコードを更新する必要があります。横断勾配摺り付けには Alignment::SuperelevationCurves, Alignment::SuperelevationCriticalStations, and SuperelevationCriticalStationCollection::GetCriticalStationAt() を使用してアクセスします。
線形の横断勾配摺り付けデータは、横断勾配摺り付け曲線と呼ばれる個別の曲線として分割され、それぞれの横断勾配摺り付け曲線には、摺り付け区間が含まれます。この区間では、標準道路から完全な横断勾配摺り付けに摺り付けされ、(内摺り付けおよび外摺り付けの個別の摺り付け区間を持つ)標準道路に戻されます。これらの区間は、「限界測点」、または道路横断に摺り付けがある測点によって定義されます。線形の横断勾配摺り付け曲線のコレクションには Alignment::SuperelevationCurves プロパティを使用してアクセスします。すべての曲線のすべての限界測点には、Alignment::SuperelevationCriticalStations プロパティを使用してアクセスします。線形に横断勾配摺り付けが(手動、またはユーザ インタフェースの[横断勾配摺り付けウィザード]による計算によって)追加されていない場合、SuperelevationCurves コレクションは空になります。曲線に対して横断勾配摺り付けデータがまったく計算されていない場合、SuperelevationCriticalStations には、線形の開始および終了測点の既定のエントリが含まれます。
個々の SuperelevationCriticalStation は、Alignment::SuperelevationCriticalStations::GetCriticalStationAt() メソッドを使用してアクセスできます。
このコードの断片では、線形の横断勾配摺り付け曲線のコレクションが反復され、各曲線のそれぞれの限界測点についての情報が印刷されます。勾配またはスムージング長さのいずれかを取得するために横断セグメントを指定する必要がありますが、どのセグメント タイプが限界測点に対して有効であるかは不明であることに留意してください。この断片では、コードによってすべてのセグメント タイプの取得が試みられ、無効タイプの InvalidOperationException 例外がキャッチされます。
[CommandMethod("GetSECurves")] public void GetSECurves() { doc = CivilApplication.ActiveDocument; Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; using (Transaction ts = Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction()) { // get first alignment: ObjectId alignID = doc.GetAlignmentIds()[0]; Alignment myAlignment = ts.GetObject(alignID, OpenMode.ForRead) as Alignment; if (myAlignment.SuperelevationCurves.Count < 1) { ed.WriteMessage("You must calculate superelevation data.\n"); return; } foreach (SuperelevationCurve sec in myAlignment.SuperelevationCurves) { ed.WriteMessage("Name: {0}\n", sec.Name); ed.WriteMessage(" Start: {0} End: {1}\n", sec.StartStation, sec.EndStation); foreach (SuperelevationCriticalStation sest in sec.CriticalStations) { ed.WriteMessage(" Critical station: {0} {1} {2}\n", sest.TransitionRegionType, sest.Station, sest.StationType); // try to get the slope: foreach (int i in Enum.GetValues(typeof(SuperelevationCrossSegmentType))) { try { // if this succeeds, we know the segment type: double slope = sest.GetSlope((SuperelevationCrossSegmentType)i, false); ed.WriteMessage(" Slope: {0} Segment type: {1}\n",slope,Enum.GetName(typeof(SuperelevationCrossSegmentType),i)); } // silently fail: catch (InvalidOperationException e) { } } } } } }
SuperelevationCurveCollection::AddUserDefinedCurve メソッドを使用して、ユーザ定義の横断勾配摺り付け曲線を作成することができます。曲線を定義するには、曲線の始点および終点の線形サブ図形を指定します。ユーザ定義曲線には、線形ラインを含めることができます。指定した始点のサブ図形および終点のサブ図形間に既存の横断勾配摺り付け曲線が存在してはいけません。
次のサンプルコードは、線形ラインと線形緩和曲線、およびそれらの間の図形で構成されるユーザ定義の横断勾配摺り付け曲線を作成します。
[CommandMethod("AddUserDefinedCurve")] public void AddUserDefinedCurve () { doc = CivilApplication.ActiveDocument; Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; using (Transaction ts = Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction()) { // get first alignment: ObjectId alignID = doc.GetAlignmentIds()[0]; Alignment myAlignment = ts.GetObject(alignID, OpenMode.ForWrite) as Alignment; SuperelevationCurveCollection superelevationCurves = myAlignment.SuperelevationCurves; AlignmentEntityCollection alignmentEntities = myAlignment.Entities; AlignmentLine startEntity = alignmentEntities.EntityAtStation(100.00) as AlignmentLine; // get the alignment line as the start of user defined curve AlignmentSubEntityLine startSubEntity = startEntity[0] as AlignmentSubEntityLine; AlignmentSCS endEntity = alignmentEntities.EntityAtStation(670.00) as AlignmentSCS; // get the first sub-entity spiral as the end of user defined curve AlignmentSubEntitySpiral endSubEntity = endEntity[0] as AlignmentSubEntitySpiral; SuperelevationCurve superelevationCurve = superelevationCurves.AddUserDefinedCurve(startSubEntity, endSubEntity); ed.WriteMessage("Name: {0}\n", superelevationCurve.Name); ed.WriteMessage(" Start: {0} End: {1}\n", superelevationCurve.StartStation, superelevationCurve.EndStation); } }