C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

"プロパティをリセット"コマンドをマクロで実行3

こちらの続きです。
"プロパティをリセット"コマンドをマクロで実行2 - C#ATIA

pythonではイマイチだった為、vbaに戻って再挑戦。
vbaの場合は、UI Automationを使います・・・デバッグしにくい。

こちらを参照しながら、もがき苦しんだ末、出来たものがこちらです。
Graph Tree Reordering in VBA | Scripts4All

'vba
'要参照設定 UIAutomationClient

Option Explicit

Sub CATMain()

    Dim pDoc As PartDocument
    Set pDoc = CATIA.ActiveDocument
    
    Dim pt As part
    Set pt = pDoc.part
    
    Dim sel As Selection
    Set sel = pDoc.Selection
    
    Dim bdy As body
    sel.Clear
    For Each bdy In pt.bodies
        sel.Add bdy
    Next
    
    CATIA.StartCommand "プロパティをリセット"
    CATIA.RefreshDisplay = True
    
    Dim winAutomation As CUIAutomation
    Set winAutomation = New CUIAutomation
    
    Dim desktop As IUIAutomationElement
    Set desktop = winAutomation.GetRootElement
    
    Dim allWindowsCond As IUIAutomationCondition
    Set allWindowsCond = winAutomation.CreateTrueCondition
    
    Dim childs As IUIAutomationElementArray
    Set childs = desktop.FindAll( _
        TreeScope_Children, _
        allWindowsCond _
    )
    
    Dim i As Long, currChild As IUIAutomationElement
    Dim catiaWindow As IUIAutomationElement
    
    For i = 0 To childs.LENGTH - 1
        Set currChild = childs.GetElement(i)
        
        If InStr(currChild.CurrentName, "CATIA V5") Then
            Set catiaWindow = currChild
            Exit For
        End If
    Next

    Dim resetPropWinCondition As IUIAutomationCondition
    Set resetPropWinCondition = winAutomation.CreatePropertyCondition( _
        UIA_NamePropertyId, _
        "プロパティをリセット" _
    )

    Dim resetPropWin As IUIAutomationElement
    Set resetPropWin = catiaWindow.FindFirst( _
        TreeScope_Children, _
        resetPropWinCondition _
    )

    Dim mainFrameWinCondition As IUIAutomationCondition
    Set mainFrameWinCondition = winAutomation.CreatePropertyCondition( _
        UIA_NamePropertyId, _
        "MainFrame" _
    )

    Dim mainFrameWin As IUIAutomationElement
    Set mainFrameWin = resetPropWin.FindFirst( _
        TreeScope_Children, _
        mainFrameWinCondition _
    )

    Dim applyToChildCondition As IUIAutomationCondition
    Set applyToChildCondition = winAutomation.CreatePropertyCondition( _
        UIA_NamePropertyId, _
        "子に適用" _
    )
    
    Dim btnApplyToChild As IUIAutomationElement
    Set btnApplyToChild = mainFrameWin.FindFirst( _
        TreeScope_Children, _
        applyToChildCondition _
    )

    Dim invokeApplyToChild As IUIAutomationInvokePattern
    Set invokeApplyToChild = btnApplyToChild.GetCurrentPattern( _
        UIA_InvokePatternId _
    )

    invokeApplyToChild.Invoke
    invokeApplyToChild.Invoke
    invokeApplyToChild.Invoke
    
    Dim btnOKCondition As IUIAutomationCondition
    Set btnOKCondition = winAutomation.CreatePropertyCondition( _
        UIA_NamePropertyId, _
        "OK" _
    )

    Dim btnOk As IUIAutomationElement
    Set btnOk = resetPropWin.FindFirst( _
        TreeScope_Children, _
        btnOKCondition _
    )
    
    Dim invokeOK As IUIAutomationInvokePattern
    Set invokeOK = btnOk.GetCurrentPattern( _
        UIA_InvokePatternId _
    )

    invokeOK.Invoke
    invokeOK.Invoke
    
    sel.Clear
End Sub

コメント一切なし、リファクタリングもしなかったのは、
結果がイマイチだったためです。

動作は、アクティブなPartの全てのボディのプロパティをリセットです。

実際に試した際の動画です。


一回目は全てのプロパティがリセット出来ていますが、二度目は不完全です。

原因はこちらです。

"子に適応"にチェックが入っているかどうかで、当然結果が変わります。
(個人的にはチェックON希望)
一回目はCATIA.StartCommandで呼び出した際はOFFでダイアログが表示され
マクロでONに切り替えています。
二回目は逆でON->OFFです。

要は"子に適応"にチェックが入っているかどうか?をチェックする方法が
分かりませんでした。
・・・取り組む前から、そうだろうとは思っていましたが。


気になる部分ですが、

    invokeApplyToChild.Invoke
    invokeApplyToChild.Invoke
    invokeApplyToChild.Invoke

は、"子に適応"にチェックを入れています。
最初は1回では無反応で、2回で入るようになる事に気が付きました。
しかし、2回でも無反応になり、3回で入るようになりました。
不安定感抜群です。(3回でもダメになるかも)

IUIAutomationElementオブジェクトには、SetFocusメソッドがありますが、
何となくフォーカスが出来ていない感じがしました。
Invokeメソッドの1回目はコントロールのフォーカスが移動している
だけの反応に感じましたが、何故3回必要なのかがわかりません。
(RefreshDisplay DoEvets等入れましたが、効果なし)

逆に"OK"ボタンに関しては、2回で大丈夫な為、1回目のinvoke
上記の記載したようにフォーカスを移動させているように感じます。

状態を判断する方法は有るのかな?・・・キャプチャ取得して画像処理?