C#ATIA

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

読み取り専用でファイルを開く2

昨日、imihitoさんからのアドバイスを利用するために書き換えてみました。
読み取り専用でファイルを開く1 - C#ATIA

VBA.FileSystem.SetAttr/GetAttr関数を利用して進めていたのですが、
ファイルの存在をチェックや拡張子を取得する関数類がVBA.FileSystemには
存在していないようなので、結局FileSystemObjectを利用し、
(文句を書いた)VBA.VbFileAttribute列挙型のみを利用しました。

'vba sample_FileOpen_ReadOnly_ver0.0.2
'読み取り専用でCATIAなファイルを読み込む

Option Explicit

Sub CATMain()
    'ファイル選択
    Dim OpenFilePath As String
    Dim Msg As String: Msg = "読み取り専用で開くファイルを選択してください"
    OpenFilePath = CATIA.FileSelectionBox(Msg, "*.CAT*", CatFileSelectionModeOpen)
    If OpenFilePath = vbNullString Then Exit Sub
    
    'ファイルを開く
    Call CatOpen_ReadOnly(OpenFilePath)
End Sub

'読み取り専用で開く
''' @param:Path(string) ファイルパス
''' @return:Boolean True-成功 False-失敗
Private Function CatOpen_ReadOnly(ByVal Path As String) As Boolean
    CatOpen_ReadOnly = False
    
    'FileSystemObject
    Dim Fso As Object
    Set Fso = CreateObject("Scripting.FileSystemObject")
    
    '許可する拡張子リスト
    Dim ExtensionAry As Variant
    ExtensionAry = Array("CATProduct", "CATPart", "CATDrawing")
    
    '拡張子チェック
    If UBound(Filter(ExtensionAry, Fso.GetExtensionName(Path))) < 0 Then
        MsgBox Path & vbNewLine & "は、該当しない拡張子です"
        Exit Function
    End If
    
    'ファイル有無
    If Not Fso.FileExists(Path) Then
        MsgBox Path & vbNewLine & "が見つかりませんでした。"
        Exit Function
    End If
    
    'ファイル属性取得
    Dim Original As VbFileAttribute
    Original = Fso.GetFile(Path).Attributes
    
    '属性チェックし読み込み
    If Original And vbReadOnly = vbReadOnly Then
        Call CATIA.Documents.Open(Path)
    Else
        Fso.GetFile(Path).Attributes = vbReadOnly
        Call CATIA.Documents.Open(Path)
        Fso.GetFile(Path).Attributes = Original
    End If
    CatOpen_ReadOnly = True
End Function

利用しやすいように、CatOpen_ReadOnly関数一本のみとしてます。

FileSelectionBoxを利用せずに、直接ファイルパス指定する場合は

Sub CATMain()
    'ファイルを開く
    If CatOpen_ReadOnly("C:\temp\CubeInCube.CATPart") Then
        MsgBox "開けました"
    Else
        MsgBox "開けませんでした"
    End If
End Sub

こんな感じで大丈夫です。
(厳密な成功失敗の判断は、ウィンドウ数をチェックした方が正しいかも)


実は、ファイル属性に読み込み専用が含まれているかどうかを判断する関数を
こんな感じで作ってみたのですが

Private Function IsReadOnly(ByVal AttrType As VbFileAttribute) As Boolean
    IsReadOnly = AttrType And vbReadOnly = vbReadOnly
End Function

一行に二つの "=" が・・・。 左は代入のイコールで、右が比較のイコールです。
VBAの悪魔仕様が出てきて気持ち悪かったので、却下しました。