C#ATIA

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

お手軽に言語判定を行いたい

先日、サンプルをUpした物の様に "CATIA.StartCommand" を
利用した場合、コマンド名を言語毎に変更する必要があります。
"Unofficial CATIA User Forum" では、ここなさんが
"CatSettingsファイルから判断できる" と記載していましたが、
結構手間のかかる処理が必要になると思いますし、今、起動
されているCATIAのCatSettingsファイルが、何処にあるのか
判断する方法が僕にはわかりません。
(CatSettingsファイル ←→ XMLファイル の変換方法はHelpに
されていたはずです)


その後何方かが "XY平面の名前で判断すれば良い" と書いて
おりました。 この方法は僕も気が付いていたのですが、
名称を変更されている可能性が0ではない上、Drawでは
利用できません。


そこでもっとお手軽に判断する方法を考えてみました。

まず、点を作成しCATIAが自動的に付ける名称から判断しよう
と思ったのですが、英語とフランス語で記述が同じに・・・。
この方法だと、不要なデータを作成する事になる事もあり、ボツ。
(削除しても名称が連番に、ならない事を嫌う人もいるでしょう)

何か良いものが方法が無いものか、ローカルウィンドウとにらめっこ
した末、良い方法を見つけました。

CATIA V5を起動した際の左下には、こんな感じの
メッセージが出ています。お気付きでしょうか?
f:id:kandennti:20151130141704p:plain
この部分は、ApplicationクラスのStatusBarプロパティとして
提供されており、表示されている文字を取得する事が
出来ます。(プロパティなので文字も表示させる事が可能です)
当然、この部分も言語毎に表示される文字が異なる為、
この部分から言語判断が可能ではないかな? と思い
このようなものを作成しました。

'vba
'言語取得
'return-ISO 639-1 code
'https://ja.wikipedia.org/wiki/ISO_639-1%E3%82%B3%E3%83%BC%E3%83%89%E4%B8%80%E8%A6%A7
Public Function GetLanguage() As String
    GetLanguage = "non"
    If CATIA.Windows.count < 1 Then Exit Function
    GetLanguage = "other"
    CATIA.ActiveDocument.Selection.Clear
    Dim st As String: st = CATIA.StatusBar
    Select Case True
        Case ExistsKey(st, "object")
            '英語-Select an object or a command
            GetLanguage = "en"
        Case ExistsKey(st, "objet")
            'フランス語-Selectionnez un objet ou une commande
            GetLanguage = "fr"
        Case ExistsKey(st, "Objekt")
            'ドイツ語-Ein Objekt oder einen Befehl auswahlen
            GetLanguage = "de"
        Case ExistsKey(st, "oggetto")
            'イタリア語-Selezionare un oggetto o un comando
            GetLanguage = "it"
        Case ExistsKey(st, "オブジェクト")
            '日本語-オブジェクトまたはコマンドを選択してください
            GetLanguage = "ja"
        Case ExistsKey(st, "объект")
            'ロシア語-Выберите объект или команду
            GetLanguage = "ru"
        Case ExistsKey(st, "象或")
            '中国語-???象或?羅
            GetLanguage = "zh"
        Case Else
            Select Case Len(st)
                Case 13
                    '韓国語-???? ?? ?? ?? unicode未対応の為
                    GetLanguage = "ko"
                Case 23
                    '日本語-日本語版以外のため
                    GetLanguage = "ja"
                Case Else
                    'それ以外
            End Select
    End Select
End Function

'文字列内に指定文字が存在するか?
'大文字小文字は無視
Private Function ExistsKey(ByVal txt As String, ByVal key As String) As Boolean
    ExistsKey = IIf(InStr(LCase(txt), LCase(key)) > 0, True, False)
End Function

何も選択されていない状態でのメッセージで、判断しています。
その為、選択状態が外れますので、注意が必要です。
(通常、事前に一度判断させるだけで良いはずです)
この方法であれば、開いているファイルの種類 "CATProduct"
"CATPart" "CATDrawing" を気にすることなく処理できます。

・動作確認はR2012で行っています。(恐らく他のリリースでもOKなはず)
・英語・フランス語・ドイツ語・イタリア語・日本語・
 韓国語・ロシア語・中国語については、"CATProduct"
 "CATPart" "CATDrawing" の判断を確認済みです。
・日本語のみ "CATMaterial" "catalog" "model"を開いた
 状態でも確認済みです。(面倒なだけで他の言語もOKなはずです)


ところで上記のコードで、奇妙な部分があることにお気付きで
しょうか?

'vba
    ・・・
    Select Case True
        Case ExistsKey(st, "object")
  ・・・
End Function

SelectCaseステートメントが入れ子になっているのですが、外側のSelectCase
の後に通常、式や変数になるべきなのですが "True" になっています。
t-hom'sさんのブログを参考にさせてもらいました。
VBA Select文の比較テクニック - t-hom’s diary
こんな書き方があるなんて、びっくりしました。
これ以外の方法だと、ElseIfを連発させるしか無いような・・。
明らかに綺麗ですよ、この書き方の方が。