C#ATIA

↑タイトル詐欺 主にCATIA V5 の VBA(最近はPMillマクロとFusion360APIが多い)

CommandDefinitionsオブジェクト3

こちらの続きです。
CommandDefinitionsオブジェクト2 - C#ATIA

実はスプリクトでのコマンドの呼び出しの他に、長い間悩んでいた事が
ありました。エンコードです。

こちらのコードは、最初に示したコードとほぼ同じなのですが、
コマンド名(日本語)をファイルに書き出す際にエラーとなります。

#fusion360 python
#これはエラーになります。
import adsk.core, adsk.fusion, traceback

def run(context):
    try:
        app = adsk.core.Application.get()
        ui = app.userInterface
        
        path = r'C:\temp\fusion360_test.csv'
        cmds = []
        for cmd in ui.commandDefinitions:
            cmds.append('{},{}'.format(
                cmd.id,cmd.name))
        cmds.sort()
        output = open(path, 'w')
        output.writelines('\n'.join(cmds))
        output.close()         
        
    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

こんな感じのエラーです。
f:id:kandennti:20190610105307p:plain
エンコード辺りのエラーだとはわかるのですが、対処方法が判りませんでした。
(自宅PCで出るエラーともちょっと違う・・・)

自宅でのエラーの原因は、エンコードCP932(≒Shift_JIS)では変換出来ない
文字が含まれていた事によるものでした。その対処方法が

cmd.name.encode("CP932", "ignore").decode("CP932")

のようです。今までファイルに書き出せなかったものも、書き出せるようになりそうです。