こちらの続きです。
"プロパティをリセット"コマンドをマクロで実行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は
上記の記載したようにフォーカスを移動させているように感じます。
状態を判断する方法は有るのかな?・・・キャプチャ取得して画像処理?