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

C#ATIA

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

"エリア フィルを修正" コマンドに挑戦

CATIA_V5 VBA KCL

「マクロで "エリア フィルを修正" コマンドを」と御相談を頂いたのですが、難しいです。

よくわかっていない物をマクロ化する際に最初に利用するのが、個人的なライブラリ "KCL"
のCATMainにしているマクロです。
選択されたものをローカルウィンドウでみて見ると、

f:id:kandennti:20161202182055p:plain

エリアフィルではなく、DrawingViewを取得してしまうんです。
3Dとリンクしている線等と同じで、目的のもの自体が取得できないんです。



海外サイトで検索してみても、まともな情報が無かったのですが
"検索でHitするよ"
みたいな記述はあったので、マクロの記録をとりちょこっと修正

Sub CATMain()
    Dim drawingDocument1 As DrawingDocument
    Set drawingDocument1 = CATIA.ActiveDocument
    
    Dim selection1 As Selection
    Set selection1 = drawingDocument1.Selection
    
    selection1.Search "CATDrwSearch.DrwAreaFill,all"
    
    MsgBox TypeName(selection1.Item2(1).Value)
End Sub

検索でHitした一番最初のオブジェクトのタイプを表示させるだけです。
実行してみると、

f:id:kandennti:20161202182109p:plain

やっぱりダメじゃない・・・。


マクロでユーザーと対話出来る唯一の方法が "Selection" だと思うのですが
これで全く接触出来ないのでは、まともな他の方法は恐らく無いだろう
と判断しました。



そこで残された唯一の方法がWinAPIです。

'vba  using-'KCL0.08'
'"エリア フィルを修正" コマンドに挑戦

'スリープAPI
#If VBA7 Then
    Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr)
#Else
    Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
#End If

'マウスボタン関係のAPI
Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, _
                                      ByVal dx As Long, ByVal dy As Long, _
                                      ByVal cButtons As Long, ByVal dwExtraInfo As Long)

Private Const MOUSEEVENTF_LEFTUP As Integer = &H4      '左ボタンUP
Private Const MOUSEEVENTF_LEFTDOWN As Integer = &H2    '左ボタンDown

'左クリック
Private Sub MouseLEFT()
    Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
    Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
End Sub

Sub CATMain()
    Dim t&: t = 100 'スリープ時間
    Dim Sel As Selection: Set Sel = CATIA.ActiveDocument.Selection
    
    Dim Dmy As DrawingView 'ダミー
    Set Dmy = KCL.SelectItem("エリアフィルの辺りをクリックして!", "DrawingView")
    If KCL.IsNothing(Dmy) Then Exit Sub
    
    Sel.Clear
    'Sleep t
    MouseLEFT
    Sleep t
    CATIA.StartCommand "エリア フィルを修正"
    'Sleep t
    MouseLEFT
    Sel.Clear
End Sub

StartCommand と WinAPIのマウスクリックの組み合わせです。


非常に限定的な利用方法なので、説明を。
まず、こんな感じでエリアフィルと割り当てたい領域まで移動させておきます。
この状態からマクロを実行します。
f:id:kandennti:20161202182127p:plain

実行後は、エリアフィルと割り当てたい領域がラップしている部分をクリックします。
赤印辺りです。
f:id:kandennti:20161202182132p:plain

そうすると、エリアフィルが修正されます・・・・それだけです。
f:id:kandennti:20161202182140p:plain


しかも、悪い事にこのマクロは マクロのメニューやツールバー登録からの実行では
"エリア フィルを修正" を呼び出した所で止まってしまいます。
(VBAエディターからの実行等、アウトプロセスな状態でしか機能しません)

正直な所、手動で通常通り作業を行った方が効率が良いです。
もう少し改良すれば使い道があるかもしれませんが。