VBA コードを Visual Basic .NET コードに移行する

移行作業を開始します。以下のセクションでは、移行の主な手順について説明します。DaylightBench.vb ストック サブアセンブリからのコードを例として使用します。

手順 1: 必要な名前空間を読み込む

Autodesk.Civil.RoadwayAutodesk.Civil 名前空間のメンバはサブアセンブリで頻繁に使用されます。そのため、これらの名前空間を追加することをお勧めします。サブアセンブリによっては、追加の名前空間が必要な場合があります。(C3DStockSubassemblies.vbproj) から)ストック Civil 3D サブアセンブリに読み込まれた名前空間は、次のとおりです。

手順 2: すべての On Error… 文を削除する

GetLogicalNamesImplement()GetInputParametersImplement()、および GetOutputParametersImplement() メソッドの On Error 文を削除します。コード自体は手順 14 で再使用するため、これらの文を DrawImplement () にコメントとして記述します。

正規表現:

手順 3: Exit Sub Error Handler を削除する

各サブルーチンの最後にある Exit SubError Handler: 文をすべて削除します。VBA で各サブルーチンの最後に次のコードがある場合は、削除するか、手順 14 でエラー処理論理を変換する際に適当な Catch 文に移動します。

Exit Sub
ErrorHandler:
RecordError Err.Number, Err.Description, Err.Source

正規表現:

手順 4: oRwyState 定義を削除する

各サブルーチンの先頭にある次のコードを削除します。

' Get the roadway state object
Dim oRwyState As AeccRoadwayState
Set oRwyState = GetRoadwayState()

corridorState オブジェクトはサブルーチンの引数によって渡されているので、独自に取得する必要はありません。

正規表現:

手順 5: oRwyState corridorState に置き換える

VBA で使用される oRwyState 変数のすべてのインスタンスは、.NET では corridorState に名前を変更します。corridorState 変数が引数によって渡されます。

正規表現:

手順 6: パラメータ値にアクセスする際にエラーをチェックする

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

正規表現:

手順 7: RecordError() を更新する

RecordError() グローバル関数は Utilities.RecordError() によって置き換えられます。

' VBA:
RecordError(aeccRoadwayErrorValueTooLarge, "RoundingTesselation", "DaylightBench")

Change to:

'.NET:
Utilities.RecordError(corridorState, CorridorError.ValueTooLarge, "RoundingTesselation", "DaylightBench")

正規表現:

手順 8: グローバル変数を Utilities 変数に置き換える

VBA サブアセンブリ コードには、g_iRightg_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

手順 9: 列挙の名前を変更する

VBA サブアセンブリ コードでは、aeccParamLogicalNameTypeAlignment のように、ほぼすべての COM 列挙に対して「aecc」という接頭辞が付いています。こうした列挙を対応する .NET 列挙に置き換えます。

原則として、対応する .NET 列挙では、「aecc」接頭辞を削除し、詳細カテゴリを子メンバに変更することで名前を変更します。たとえば aeccParamLogicalNameTypeAlignmentParamLogicalNameType.Alignment に変更します。

次の表では、一般的に使用されるいくつかの COM 列挙とそれらに対応する .NET 列挙の一覧を示します。

[開始] [終了]
aeccParamLogicalNameTypeAlignment ParamLogicalNameType.Alignment
aeccRoadwayModeLayout CorridorMode.Layout
aeccParamAccessOutput ParamAccessType.Output

手順 10: 型の名前を変更する

COM 型を対応する .NET 型に置き換えます。

次の表では、一般的に使用されるいくつかの COM 型とそれらに対応する .NET 型の一覧を示します。

[開始] [終了]
IAeccParamsDouble ParamDoubleCollection
IAeccRoadwayLinks LinkCollection
IAeccParam Param
AeccRoadwayLink Link
AeccParamLong ParamLong

正規表現:

  1. IAeccParamsAlignment AeccParamsAlignment ParamAlignmentCollection に変換

    • 検索: { }I*AeccParams{.+}{ |¥n}
    • 置換: ¥1Param¥2Collection¥3
  2. IAeccRoadwayLinks LinkCollection に変換

    • 検索: { }I*AeccRoadway{.*}s{ |¥n}
    • 置換: ¥1¥2Collection¥3
  3. AeccRoadwayLink Link に変換

    • 検索: { }(I|())AeccRoadway{Link|Shape}{ |¥n}
    • 置換: ¥1¥2¥3
  4. AeccParamLong ParamLong に変換

    • 検索: { }I*AeccParam{Long|Bool|Double|Point|String|()}{ |¥n}
    • 置換: ¥1Param¥2¥3

これら 4 つの正規表現では、必要な変更がすべて行われるわけではないため、手動で追加の変更を行う必要があります。

手順 11: Object を組み込み型に変更する

サブアセンブリによって 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

手順 12: コード変数を更新して、.NET 命名規則を使用する

各変数名から g_Allg_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

正規表現:

手順 13: 配列の定義を更新する

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」から使用される可能性が高いと考えられます。この配列を使用するすべてコードを修正して、インデックス番号付けの変更を考慮に入れる必要があります。

手順 14: エラー処理を修正する

VBA では、エラーを処理するために On Error Resume NextOn 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

手順 15: データベース オブジェクトの新規ルール

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)