C#ATIA

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

アクティブCATPartを、Igesファイルにバッチ変換

ちょっと業務上欲しくなったので、CATPartファイルをIgesに変換する為の
マクロを作成しました。" マクロにする必要ある? " と思った方、正解です。

単に変換するだけであれば、必要性を感じないのですが、オプションの
こちらの部分を変更しソリッドとサーフェスで二回変換してます。
f:id:kandennti:20170620123934p:plain
オプションを表示させる際、CATIA起動後の一回目は少し間が空くんですよね。
二回目以降はストレス無く表示されるのですが。

又、変換処理時間が結構かかる場合もあるので、バッチモードを利用し
オペレーションを奪われないようにしました。

'vba sample_ExpIges_Surf_Solid_ver0.0.1  using-'ver0.0.10'
'アクティブなPartファイルをIges(Surface/Solid)でエクスポート

Option Explicit

Sub CATMain()
    'ドキュメントのチェック
    If Not KCL.CanExecute("PartDocument") Then Exit Sub
    
    'ドキュメント取得/チェック
    Dim PDoc As PartDocument: Set PDoc = CATIA.ActiveDocument
    If PDoc.Saved = False Then
        If MsgBox("変更されています。上書き保存し作業を続けますか?", vbYesNo) = vbNo Then Exit Sub
        PDoc.Save
    End If
    
    'アクティブパス
    Dim FullPath As String: FullPath = PDoc.FullName
    If FullPath = vbNullString Then
        MsgBox "新規ファイルです。一度保存を行ってから再実行してください!"
        Exit Sub
    End If
    Dim Path As Variant: Path = KCL.SplitPathName(FullPath)
    
    'エクスポート用パス
    Dim SurfPath As String
    SurfPath = KCL.GetNewName(Path(0) & "\" & Path(1) & "_Surface.igs")
    
    Dim SolidPath As String
    SolidPath = KCL.GetNewName(Path(0) & "\" & Path(1) & "_Solid.igs")
    
    'Iges設定取得 0-Surface 1-Solid
    Dim IgsMSBO As Long
    IgsMSBO = CATIA.SettingControllers.Item("CATIdeIgesSettingCtrl").ExportMSBO
    
    'catiaの実行ファイルパス取得
    Dim CatPath  As String
    CatPath = CATIA.SystemService.Environ("CATDLLPath")
    
    '環境ファイルパス取得
    Dim EnvironmentPath  As Variant
    EnvironmentPath = KCL.SplitPathName(CATIA.SystemService.Environ("CATEnvName"))
    
    '確認
    Dim Msg As String
    Msg = "[ " & Path(1) & " ]をIges(サーフェス/ソリッド)に変換します。" & vbNewLine & _
            "宜しいですか?"
    If MsgBox(Msg, vbYesNo) = vbNo Then Exit Sub
    
    'バッチ用マクロファイル作成
    Dim MacroPath  As String
    MacroPath = KCL.GetNewName(Path(0) & "\" & Path(1) & ".catvbs")
    Call KCL.WriteFile(MacroPath, CreateCatvbsSource(FullPath, SurfPath, SolidPath, MacroPath, IgsMSBO))
    
    'バッチモード起動
    Call ExecuteButchMode(CatPath & "\CNEXT.exe", EnvironmentPath(0), EnvironmentPath(1), MacroPath)
    
    MsgBox "変換処理を始めました!"
End Sub

'バッチモード起動
Private Sub ExecuteButchMode( _
                ByVal CatExePath As String, _
                ByVal EnvDirPath As String, _
                ByVal EnvPath As String, _
                ByVal MacroPath As String)
    Dim Cmd As String
    Cmd = CatExePath & " -direnv " & EnvDirPath & _
            " -env " & EnvPath & " -batch  -macro " & _
            Chr(34) & MacroPath & Chr(34)
    Call CreateObject("Wscript.Shell").Exec(Cmd)
End Sub

'CatVbsソース
Private Function CreateCatvbsSource( _
                ByVal ReadPath As String, _
                ByVal SurfPath As String, _
                ByVal SolidPath As String, _
                ByVal MacroPath As String, _
                ByVal MSBO As Long) As String
    Dim ArySurf As Variant: ArySurf = KCL.SplitPathName(SurfPath)
    Dim ArySolid As Variant: ArySolid = KCL.SplitPathName(SolidPath)
    Dim Msg As String
    Msg = "[" & ArySurf(0) & "] に" & _
        "[" & ArySurf(1) & "." & ArySurf(2) & "] と" & _
        "[" & ArySolid(1) & "." & ArySolid(2) & "] を作成しました"

    CreateCatvbsSource = _
    "Sub CATMain()" & vbNewLine & _
    "    FullPath = " & Chr(34) & ReadPath & Chr(34) & vbNewLine & _
    "    SurfPath = " & Chr(34) & SurfPath & Chr(34) & vbNewLine & _
    "    SolidPath = " & Chr(34) & SolidPath & Chr(34) & vbNewLine & _
    "    IgsMSBO = " & CStr(MSBO) & vbNewLine & _
    "    Call ExpIges(FullPath, SurfPath, SolidPath, IgsMSBO)" & vbNewLine & _
    "    Call CATIA.Quit" & vbNewLine & _
    "    Set Fso = CreateObject(" & Chr(34) & "Scripting.FileSystemObject" & Chr(34) & ")" & vbNewLine & _
    "    Call Fso.DeleteFile(" & Chr(34) & MacroPath & Chr(34) & ", True)" & vbNewLine & _
    "    Msgbox " & Chr(34) & Msg & Chr(34) & vbNewLine & _
    "End Sub" & vbNewLine & _
    "Private Sub ExpIges(ByVal ReadPath, ByVal SurfPath, ByVal SolidPath, ByVal MSBO)" & vbNewLine & _
    "    Set PDoc = CATIA.Documents.Open(CStr(ReadPath))" & vbNewLine & _
    "    Set IgsSetAtt = CATIA.SettingControllers.Item(" & Chr(34) & "CATIdeIgesSettingCtrl" & Chr(34) & ")" & vbNewLine & _
    "    IgsSetAtt.ExportMSBO = 0" & vbNewLine & _
    "    Call PDoc.ExportData(SurfPath, " & Chr(34) & "igs" & Chr(34) & ")" & vbNewLine & _
    "    IgsSetAtt.ExportMSBO = 1" & vbNewLine & _
    "    Call PDoc.ExportData(SolidPath, " & Chr(34) & "igs" & Chr(34) & ")" & vbNewLine & _
    "    IgsSetAtt.ExportMSBO = MSBO" & vbNewLine & _
    "End Sub"
End Function

・バッチモードのCATIAを起動し、アクティブなCATPartをそちらでも開く為
 保存しておく必要が有ります。
 (マクロ実行中に確認・上書き保存は可能です)

・処理後は、アクティブなCATPartファイルと同一フォルダ内に
 [アクティブなCATPartファイル] + [_Surface.igs]
 [アクティブなCATPartファイル] + [_Solid.igs]
 の二つのファイルが出来上がります。

・変換後のファイル名が重複するものになる場合は、
 ファイル名の最後に [_(数字)] が付いたファイルとなります。
 (上書きしません)

・一時的にcatvbsファイルが作成されますが、処理後は削除します。

・バッチモード起動を利用している為、小さなファイルは逆に遅いです・・・。

GUI起動の場合、CATIAは二個までの制限(同一リリースの場合)があると
思うのですが、バッチモード起動の場合はメモリの許す限り起動出来そうな
雰囲気があります。二つ起動した方が早いかも。

又、こちらの記載もバッチモード起動で解決出来るかな?
DrawをPDFでエクスポート (未解決) - C#ATIA