移行作業を開始します。以下のセクションでは、移行の主な手順について説明します。DaylightBench.vb ストック サブアセンブリからのコードを例として使用します。
Autodesk.Civil.Roadway と Autodesk.Civil 名前空間のメンバはサブアセンブリで頻繁に使用されます。そのため、これらの名前空間を追加することをお勧めします。サブアセンブリによっては、追加の名前空間が必要な場合があります。(C3DStockSubassemblies.vbproj) から)ストック Civil 3D サブアセンブリに読み込まれた名前空間は、次のとおりです。
GetLogicalNamesImplement()、GetInputParametersImplement()、および GetOutputParametersImplement() メソッドの On Error 文を削除します。コード自体は手順 14 で再使用するため、これらの文を DrawImplement () にコメントとして記述します。
正規表現:
各サブルーチンの最後にある Exit Sub と Error Handler: 文をすべて削除します。VBA で各サブルーチンの最後に次のコードがある場合は、削除するか、手順 14 でエラー処理論理を変換する際に適当な Catch 文に移動します。
Exit Sub ErrorHandler: RecordError Err.Number, Err.Description, Err.Source
正規表現:
各サブルーチンの先頭にある次のコードを削除します。
' Get the roadway state object Dim oRwyState As AeccRoadwayState Set oRwyState = GetRoadwayState()
corridorState オブジェクトはサブルーチンの引数によって渡されているので、独自に取得する必要はありません。
正規表現:
VBA で使用される oRwyState 変数のすべてのインスタンスは、.NET では corridorState に名前を変更します。corridorState 変数が引数によって渡されます。
正規表現:
VBA では、キーが存在しない場合、パラメータ Value() メソッドによって null が返されます。.NET API では、同じコードによって例外がスローされます。パラメータにアクセスする箇所では、Try / Catch ブロックを使用して、このケースをキャッチする必要があります。
' VBA: vCutSlope = oParamsDouble.Value("CutSlope") If IsEmpty(vCutSlope) Then vCutSlope = c_dCutSlopeDefault
このコードは次のように変更できます。
' .NET: Try vCutSlope = oParamsDouble.Value("CutSlope ") Catch vCutSlope = c_ dCutSlopeDefault End Try
正規表現:
RecordError() グローバル関数は Utilities.RecordError() によって置き換えられます。
' VBA: RecordError(aeccRoadwayErrorValueTooLarge, "RoundingTesselation", "DaylightBench")
Change to:
'.NET: Utilities.RecordError(corridorState, CorridorError.ValueTooLarge, "RoundingTesselation", "DaylightBench")
正規表現:
VBA サブアセンブリ コードには、g_iRight や g_sSide など「g_」の接頭辞を持つグローバル変数があります。こうしたグローバル変数のほとんどは Utilities クラスに移動され、その名前が変更されています。
次の表では、一般的に使用されるいくつかのグローバル変数と Utilities クラスでそれらに対応する変数の一覧を示します。詳細については、Utilities クラスの定義を参照してください。
[開始] | [終了] |
---|---|
g_sSide | Utilities.Side |
g_iLeft | Utilities.Left |
g_iRight | Utilities.Right |
g_iTrue | Utilities.ITrue |
Rounding_Option.NoneType | Utilities.RoundingOption.NoneType |
CutSituation | Utilities.FillOrCut.FillSituation |
SubbaseType | Utilities.ShoulderSubbaseType.Subbase |
VBA サブアセンブリ コードでは、aeccParamLogicalNameTypeAlignment のように、ほぼすべての COM 列挙に対して「aecc」という接頭辞が付いています。こうした列挙を対応する .NET 列挙に置き換えます。
原則として、対応する .NET 列挙では、「aecc」接頭辞を削除し、詳細カテゴリを子メンバに変更することで名前を変更します。たとえば aeccParamLogicalNameTypeAlignment を ParamLogicalNameType.Alignment に変更します。
次の表では、一般的に使用されるいくつかの COM 列挙とそれらに対応する .NET 列挙の一覧を示します。
[開始] | [終了] |
---|---|
aeccParamLogicalNameTypeAlignment | ParamLogicalNameType.Alignment |
aeccRoadwayModeLayout | CorridorMode.Layout |
aeccParamAccessOutput | ParamAccessType.Output |
COM 型を対応する .NET 型に置き換えます。
次の表では、一般的に使用されるいくつかの COM 型とそれらに対応する .NET 型の一覧を示します。
[開始] | [終了] |
---|---|
IAeccParamsDouble | ParamDoubleCollection |
IAeccRoadwayLinks | LinkCollection |
IAeccParam | Param |
AeccRoadwayLink | Link |
AeccParamLong | ParamLong |
正規表現:
IAeccParamsAlignment と AeccParamsAlignment を ParamAlignmentCollection に変換
IAeccRoadwayLinks を LinkCollection に変換
AeccRoadwayLink を Link に変換
AeccParamLong を ParamLong に変換
これら 4 つの正規表現では、必要な変更がすべて行われるわけではないため、手動で追加の変更を行う必要があります。
サブアセンブリによって Object が使用される箇所では Object はタイプセーフでないため、ビルドイン型に変更する必要があります。
' .NET Before: Dim vSide As Object Try vSide = oParamsLong.Value(Utilities.Side) Catch vSide = SideDefault End Try
' .NET After: Dim vSide As Long Try vSide = oParamsLong.Value(Utilities.Side) Catch vSide = SideDefault End Try
各変数名から g_All、g_s、および s の接頭辞を削除して、コード名の新しい命名規則に準拠させます。
[開始] | [終了] |
---|---|
g_AllCodes.g_sHinge_Cut.sCode | Codes.HingeCut.Code |
g_AllCodes.g_sDaylight.sCode | Codes.Daylight.Code |
g_AllCodes.g_sDaylight_Cut.sCode | Codes.DaylightCut.Code |
正規表現:
VBA では、多くの配列は、インデックス「1」における低いバウンドによって定義されます。これは .NET では許可されていないため、配列の定義を修正する必要があります。
ほとんどの場合、配列の定義を修正するだけで、他の変更を行う必要はありません。配列要素 0 は定義されていますが、未使用のままです。
' .NET Before: Dim sPointCodeArray(1 To 9, 0 To 1) As String
' .NET After: Dim sPointCodeArray(0 To 9, 0 To 1) As String
この配列が引数としてメソッドに渡される場合は、さらなる修正が必要になりますこの場合、配列はインデックス「0」から使用される可能性が高いと考えられます。この配列を使用するすべてコードを修正して、インデックス番号付けの変更を考慮に入れる必要があります。
VBA では、エラーを処理するために On Error Resume Next と On Error GoTo ErrorHandler 文が使用されます。しかし .NET では、例外が代わりに使用されます。エラーが検出されたすべてのケースを修正して、Try…Catch ブロックを使用します。
' VBA: On Error Resume Next Dim oTargetDTM As IAeccSurface Set oTargetDTM = oParamsSurface.Value("TargetDTM") If oTargetDTM Is Nothing Then ' Error handling code goes here Exit Sub End If On Error GoTo ErrorHandler
エラー処理を次のように変更します。
' .NET: Dim oTargetDTMId As ObjectId Try oTargetDTMId = oParamsSurface.Value("TargetDTM") Catch ' Error handling code goes here Exit Sub End Try
COM API では、引数および戻り値はすべてデータベース オブジェクト インスタンスを参照します。しかし、.NET API では、引数および戻り値はデータベース オブジェクトの ObjectId であり、それら自体がオブジェクトではありません。
' VBA: Dim oTargetDTM As IAeccSurface Set oTargetDTM = oParamsSurface.Value("TargetDTM")
.NET では次のようになります。
' .NET: Dim oTargetDTMId As ObjectId Try oTargetDTMId = oParamsSurface.Value("TargetDTM") Catch End Try
データベース オブジェクトのインスタンスを使用するには、TransactionManager.GetObject() を使用して、データベース オブジェクトを開く必要があります。
' VBA: Dim oCurrentAlignment As AeccAlignment GetAlignmentAndOrigin(oRwyState, oCurrentAlignment, oOrigin)
.NET:
' .NET: Dim currentAlignmentId As ObjectId Dim currentAlignment As Alignment Utilities.GetAlignmentAndOrigin(corridorState, currentAlignmentId, origin) ' ... Dim db As Database = Autodesk.AutoCAD.DatabaseServices.HostApplicationServices.WorkingDatabase Dim tm As Autodesk.AutoCAD.DatabaseServices.TransactionManager = db.TransactionManager currentAlignment = tm.GetObject(currentAlignmentId, OpenMode.ForRead, false, false)