C#ATIA

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

Parasolidのインポートエラーを修復するVBS

こちらの続きです。
Parasolidのエラー2 - C#ATIA

少しづつ時間が確保出来たので、こちらを真剣に調べてみました。
結果的に・・・ どうやらスペース文字だったようです。
(使用したエディタではスペース文字が上手く検索できなかったのかな・・・)

2件続いた事例を考えると、小数点直後のスペース文字が原因だった為
それらを削除する為のVBScriptを作成しました。

Language = "VBSCRIPT"
'*********************************
'RepairX_TFile.vbs ver 0.0.1
'不要なスペース文字によるインポートエラーとなるParasolidファイルを修復
'*********************************

'*** 設定 変更しないで下さい ***
Const BeforeKey = ". "
Const AfterKey = "."
'***

Call Main
wscript.Quit 0

'*********************************
Sub Main()
    'D&D
    Dim DDlist 'As Variant
    DDlist = GetDropList(wscript.Arguments)
    If Not IsArray(DDlist) Then Exit Sub

    '確認
    Dim DDlistStr 'as String

    Dim Msg 'As String
    Msg = "以下のファイルをチェックします。よろしいですか?" + vbNewLine + _
      DDList2String(DDlist)
    If MsgBox(Msg, vbYesNo) = vbNo Then Exit Sub

    '処理
    Msg = ExecReplace(DDlist, BeforeKey, AfterKey)
    If Msg = vbNullString Then
        MsgBox "修正したファイルはありませんでした"
    Else
        MsgBox Msg + "の修正したファイルを作成しました"
    End If
End Sub

Private Function ExecReplace(ByVal Ary, ByVal Before, ByVal After)
    Dim i, Msg
    Msg = vbNullString
    For i = 0 To UBound(Ary)
        If IsCreateNewX_T(Ary(i), Before, After) Then
            Msg = Msg + Ary(i) + vbNewLine
        End If
    Next
    ExecReplace = Msg
End Function

Private Function IsCreateNewX_T(ByVal Path, ByVal Before, ByVal After)
    IsCreateNewX_T = False
    Dim txt
    txt = ReadFile(Path)
    If InStr(1, txt, Before) < 1 Then
        Exit Function
    End If
    
    Dim NewPath
    NewPath = GetNewName(Path)
    txt = Replace(txt, Before, After)
    Call WriteFile(NewPath, txt)
    IsCreateNewX_T = True
End Function

' *** D&D ***
'ドロップ処理
Private Function GetDropList(ByVal Args) 'As Variant
    Dim ArgsCount 'As Long
    ArgsCount = Args.Count
    If ArgsCount < 1 Then
        MsgBox "x_tファイル(パラソリッド)をD&Dして下さい"
        Exit Function
    End If

    Dim i 'As Long
    Dim X_tList() 'As Variant
    ReDim X_tList(ArgsCount)
    Dim X_tCount 'As Long
    X_tCount = -1
    Dim Path 'As Variant
    Dim ArgsPath 'As String
	
    'ContinueかGoto使いたかった・・・
    For i = 1 To ArgsCount
        ArgsPath = Args(i - 1)
        If IsExists(ArgsPath) Then
            Path = SplitPathName(ArgsPath)
            If Isx_tFile(Path(2)) Then
                X_tCount = X_tCount + 1
                X_tList(X_tCount) = JoinPathName(Path)
            End If
        End If
    Next
	
    If X_tCount < 0 Then
        Msg = "チェックするx_tファイル(パラソリッド)がありません!"
        MsgBox Msg, vbOKOnly
        Exit Function
    End If
    ReDim Preserve X_tList(X_tCount)
    GetDropList = X_tList
End Function

'Parasolidチェック 拡張子のみ
Private Function Isx_tFile(ByVal Ext) 'As Boolean
    Isx_tFile = False
    If UCase(Ext) = "X_T" Then Isx_tFile = True
End Function

'リストのファイルメイのみ取得
Private Function DDList2String(ByVal DDlist) 'As Boolean
    Dim Ts, ToStr, i
    ToStr = ""
    For i = 0 To UBound(DDlist)
        Ts = SplitPathName(DDlist(i))
        ToStr = ToStr + Ts(1) + "." + Ts(2) + vbNewLine
    Next
    DDList2String = ToStr
End Function


' *** IO ***
'FileSystemObject
Private Function GetFSO() 'As Object
    Set GetFSO = CreateObject("Scripting.FileSystemObject")
End Function

'パス/ファイル名/拡張子 分割
'Return: 0-Path 1-BaseName 2-Extension
Private Function SplitPathName(ByVal FullPath) 'As Variant
    Dim Path(2) 'As String
    With GetFSO
        Path(0) = .getParentFolderName(FullPath)
        Path(1) = .GetBaseName(FullPath)
        Path(2) = .GetExtensionName(FullPath)
    End With
    SplitPathName = Path
End Function

'パス/ファイル名/拡張子 連結
Private Function JoinPathName(ByVal Path) 'As String
    If Not IsArray(Path) Then Stop '未対応
    If Not UBound(Path) = 2 Then Stop '未対応
    JoinPathName = Path(0) + "\" + Path(1) + "." + Path(2)
End Function

'ファイルの有無
Private Function IsExists(ByVal Path) 'As Boolean
    IsExists = GetFSO.FileExists(Path)
End Function

'ファイル読み込み
Private Function ReadFile(ByVal Path) 'As Variant
    With GetFSO.GetFile(Path).OpenAsTextStream
        ReadFile = .ReadAll
        .Close
    End With
End Function

'ファイル書き込み
Private Sub WriteFile(ByVal Path, ByVal txt)
    With GetFSO.OpenTextFile(Path, 2, True)
        .Write txt
        .Close
    End With
End Sub

'重複しない名前取得
''' @param:Path-ファイルパス
''' @return:新たなファイルパス
Private Function GetNewName(ByVal OldPath)
    Dim Path
    Path = SplitPathName(OldPath)
    Path(2) = "." & Path(2)
    Dim NewPath
    NewPath = Path(0) + "\" + Path(1)
    If Not IsExists(NewPath + Path(2)) Then
        GetNewName = NewPath + Path(2)
        Exit Function
    End If
    Dim TempName, i
    i = 0
    Do
        i = i + 1
        TempName = NewPath + "_" + CStr(i) + Path(2)
        If Not IsExists(TempName) Then
            GetNewName = TempName
            Exit Function
        End If
    Loop
End Function

・複数ファイルをD&Dすることが可能です。
・処理後のファイルはD&Dしたファイルと同一フォルダ内に、
 「元のファイル名」+「_数字」+「.x_t」ファイルが出来上がり、元のファイルを上書きは
 行いません。
・過去の事例から、小数点直後に不要なスペース文字が入っていたため
 そのスペース文字を削除しているだけです。
 インポートエラーの全ての原因を修復する為のものでは有りません。

正直な所、客先のメール環境が原因のような気がするので、他人には全く役立たない
様な気がしてます。


週末この暑さの中、グランドを駆け回って疲労感たっぷりの月曜日に作っている為
不要な関数等が残っているかも・・・・。