読者です 読者をやめる 読者になる 読者になる

C#ATIA

↑タイトル詐欺 主にCATIA V5 の VBA

Drawingの直線を移動する2

こちらの続きです。
Drawingの直線を移動する1 - C#ATIA

先週上手く行かないと思っていたのですが、上手く行ってました。
個人的にはかなりイマイチなのですが、ソースコードです。

'vba
Sub CATMain()
    Dim oDoc As DrawingDocument
    Dim oSel 'As selection
    Dim Msg As String
    
    Set oDoc = CATIA.ActiveDocument
    Set oSel = oDoc.Selection
    
    'ライン選択
    Dim InputObjectType(0) 'As String
    Dim Line 'As Line2D
    InputObjectType(0) = "Line2D"
    Msg = "ライン選択 // [Esc]=キャンセル"
    With oSel
        .Clear
        Result = .SelectElement2(InputObjectType, Msg, False)
        If Result = "Cancel" Then Exit Sub
        Set Line = .Item(1).Value
        .Clear
    End With
    
    '移動量入力
    Dim OffsetStr As String
    Msg = "移動量を入力してください // 空白=キャンセル" + vbCrLf
    Msg = Msg + "X移動量,Y移動量 // 例)10,10"
    OffsetStr = InputBox(Msg)
    
    'キャンセルチェック
    If Len(OffsetStr) < 1 Then MsgBox "キャンセル": End
    
    '入力値チェック
    Dim ArrOffStr As Variant 'ArrayString
    ArrOffStr = Split(OffsetStr, ",")
    If Not UBound(ArrOffStr) = 1 Then
        Msg = "入力形式が不正です。" + vbCrLf
        Msg = Msg + "X移動量,Y移動量を入力してください。"
        MsgBox Msg, vbOKOnly + vbInformation
        End
    End If
    
    Dim ArrOffVal(1) As Double
    Dim I As Integer
    For I = 0 To UBound(ArrOffStr)
        If Not IsNumeric(ArrOffStr(I)) Then
            Msg = "移動量は数字で入力してください。"
            MsgBox Msg, vbOKOnly + vbInformation
            End
        Else
            ArrOffVal(I) = CDbl(ArrOffStr(I))
        End If
    Next
    
    '端点オブジェクトから座標取得
    Dim ArrPnts(1) 'As Point2D 0-StartPoint 1-EndPoint
    Set ArrPnts(0) = Line.StartPoint
    Set ArrPnts(1) = Line.EndPoint
    
    '端点に対し移動量反映
    Dim ArrPos(1) As Variant 'As Double
    For I = 0 To UBound(ArrPnts)
        With ArrPnts(I)
            Call .GetCoordinates(ArrPos)
            Call .SetData(ArrPos(0) + ArrOffVal(0), _
                          ArrPos(1) + ArrOffVal(1))
        End With
    Next
    
    '直線に対して移動量反映
    Dim OriginPos(1) As Variant
    Dim DirectionVec(1) As Variant
    Call Line.GetOrigin(OriginPos)
    Call Line.GetDirection(DirectionVec)
    Call Line.SetData(OriginPos(0) + ArrOffVal(0), _
                      OriginPos(1) + ArrOffVal(1), _
                      DirectionVec(0), _
                      DirectionVec(1))
    
    '更新
    oDoc.Update
End Sub

マクロ実行後、直線(非リンク)を選択し、移動量を入力です。

やはり、端点オブジェクトと直線の端点座標両方を変更しなければ、
思うような結果になりませんでした。

上手く行かなかった原因は、直線の端点座標変更をメソッド化して
いた事でした。 直線(Line2D)を参照渡しで渡していたのに・・・。