こちらの続きです。
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)を参照渡しで渡していたのに・・・。