Das Makro ermittelt aus den ausgewähltern Modellen die 'MinimalVersionToRead' und gibt sie in einer Liste aus.
Um das Makro zu starten entweder Dateien/Verzeichnisse aus dem Explorer auf das Icon ziehen
oder, bei geöffneter Liste, auf die Liste droppen. :-)
Starten von der Commando-Zeile bzw. im Batch funktioniert's auch, ist aber nicht dafür ausgelegt.
Das Programm wertet sowohl die per 'Command$' übergebenen Parameter als auch die per Drag&Drop auf die Fensteroberfläche gezogenen Dateinamen aus.
Alle Dateien mit der Endung '.CAT*' werden berücksichtigt. Die Routine erwartet bei den als 'Command$' auf dem Ikon abgelegten Dateinamen zur Trennung ein Leerzeichen zwischen den Dateinamen. Leerzeichen innerhalb der Dateinamen/der Pfade führen deshalb dazu , dass die Dateinamen nicht richtig interpretiert werden. Bei den auf das geöffnete Fenster gezogenen Dateien haben Leerzeichen im Pfad keine Auswirkung auf die Programmfunktion.
Einzelheiten zu Release 1.5:
Gestört hat mich, dass die Liste nicht sortiert werden konnte.
Ausserdem ist die Routine bei vor 2002 erzeugten Catia-Dateien auf einen Fehler gelaufen.
Grund: Offenbar wurde beim Wechsel von V5R7/8 auf V5R8/9 (2002) gleichzeitig eine Änderung des Dateiformates vorgenommen. In den Catia-Docs vor 2002 stehen die Angaben zu 'MinVersionToRead' schlicht nicht in den Daten und können somit auch nicht gefunden werden. Beide Probleme sind bei R1.5 gelöst.
Anstelle der ListBox wird jetzt eine sortierbare ListView verwendet.
Einzelheiten zu Release 1.6:
Die Rubrik 'Last Version Saved' ist dazu gekommen.
Grund: Ein CAT-Dokument mit ausgewiesener Minimalversion zB V5R14 kann mit V5R15SP20 bearbeitet worden sein.
Version V5R14SP0 reicht dann nicht zum einlesen.
Das Catia - Dateiformat
Das Format der Catia-Dateien ist, soweit feststellbar, nicht bekannt. Zwar lässt sich ein Header erkennen('V5_CFV2'); auch, dass offenbar eine Unterteilung in mit 'FINJPL ' begrenzte Sektionen existiert. Ein EOF-Signatur ist gleichfalls vorhanden(CB__END).
Aber wie die Dateien gegliedert sind, wo ein Offset steht und was er bedeutet, ist unbekannt.
Bekannt und aus den Catia-Dateien auslesbar ist eine Sektion die mit 'CATSummaryInformation' beginnt.
Version vor 12.2001:
CATSummaryInformation
CATPDMPersistence
File
CATBuildLevel 04-11-2001.20.00
oder
CATBuildLevel 04-04-2002.20.00
Author
lch
CATPreviewN
DASSAULT-SYSTEMES
CATIA
041803P
FINJPL
Bei Shapes hingegen steht die MinVersion drin:
CATSummaryInformation
CATPDMPersistence
File
CATBuildLevel 08-29-2002.20.00
MinimalVersionToRead
CATIAV5R9
CATPreview
JFIF
Version nach 2002:
CATSummaryInformation
FirstStreamed
<Version>5/<Version>
<Release>19/<Release>
<ServicePack>0/<ServicePack>
<BuildDate>06-11-2008.20.00/<BuildDate>
<HotFix>0/<HotFix>
LastSaveVersion
<Version>5/<Version>
<Release>19/<Release>
<ServicePack>0/<ServicePack>
<BuildDate>06-11-2008.20.00/<BuildDate>
<HotFix>0/<HotFix>
MinimalVersionToRead
CATIAV5R19
CATBuildLevel
06-11-2008.20.00
Ablauf:
Das Makro liest also einen Textblock ein und sucht darin nach 'CATSummaryInformation', anschliessend nach 'MinimalVersionToRead'.
Die Grösse des einzulesenden Textblocks wird, falls beim ersten Versuch die 'Summary' nicht gefunden wird, erhöht. Nötigenfalls wird die Datei komplett durchsucht.
Der Code zum Auffinden von 'MinimalVersionToRead':
'---------------------------------------------------------------------------------------
' Procedure : GetCatiaRelease
' Author : jherzog
' Date : 10.08.2015
' Time : 20:00
' Languages : VB6 Pro SP6
' V5-Release: V5R19/21
' Purpose : Find 'MinimalVersionToRead' - entry
' Parms : strFileFullPath: fully qualified filename (= path + file)
' Ret. Value: - Found entries are added to list1 listbox
'
' Syntax : GetCatiaRelease strFN
'
' Prereqs : the name of a Catia-file
' Remarks : If 'lChunkSize' is too small on the first pass, it is increased.
' : If EOF is reached and Version/Release is still not found
' : 'VERSION NOT FOUND' is added to list
'---------------------------------------------------------------------------------------
' V1.6:
' - Spalte 'Last Version Saved' hinzu;
' - CATVERSION_Type, lsv, fsv hinzu;
' - Auswertung von SP, HotFix, CATBuildLevel hinzu;
' - Sprungmarke auf 'CATSummaryInformation' oder 'MinimalVersionToRead' erweitert
'
'
'---------------------------------------------------------------------------------------
Sub GetCatiaRelease(strFileFullPath As String)
Dim lFSize As Long 'file size
Dim lStart As Long 'start position of data
Dim lPos As Long
Dim lFilePointer As Long 'starting pos for setfilepointer
Dim strTmp As String 'string read from file holding file's data
Dim strMinVersionRead As String
Dim strLastVersion As String 'includes version, release, servicepack, hotfix
Dim strBuildLevel As String 'date and time
Dim strFileName As String 'file name
Dim strHeader As String 'first 16 bytes of files
Dim strMsg As String
Const lChunkMid As Long = &H100000 '1Mb
Const lChunkSmall As Long = &H4000 '16k
Const lChunkBig As Long = &H1000000 '16Mb
Dim lChunkSize As Long 'chunk size
Dim bEOF As Boolean 'eof-flag
Dim iDelta As Integer 'lfilepointer displacement
Dim lsv As CATVERSION_Type 'last saved version
Dim fsv As CATVERSION_Type 'first streamed
On Error GoTo GetCatiaRelease_Error
strFileName = Right$(strFileFullPath, _
Len(strFileFullPath) - InStrRev(strFileFullPath, "\")) 'strip path
lFSize = FileLen(strFileFullPath) 'get file size
'read header; read last chunk and search for MinimalVersionToRead
strHeader = ReadChunkToString(strFileFullPath, 16, 0&, bEOF) 'read header
If Left$(strHeader, 7) <> "V5_CFV2" Then 'check for catia file sig
If strHeader = "ERROR" Then 'eg. open file error
strMsg = "FILE READ ERROR"
Else
strMsg = "NOT A CATIA DOC" 'ending begins with 'CAT', but no sig found
End If
AddLVEntry strFileName, strMsg, "N/A" 'add to list
Exit Sub 'if not catia file, skip read
End If
lChunkSize = lChunkMid
lFilePointer = lFSize - lChunkSize 'set file pointer to last chunk
If lFilePointer < 0 Then lFilePointer = 0 'no negative pointers
Do 'read file til release or eof found
strTmp = ReadChunkToString(strFileFullPath, lChunkSize, lFilePointer, bEOF)
If InStr(strTmp, "CATSummaryInformation") Then
lStart = InStr(strTmp, "CATSummaryInformation") 'find summary info
Else
If InStr(strTmp, "MinimalVersionToRead") Then
lStart = InStr(strTmp, "MinimalVersionToRead") 'find min version2read
iDelta = 300
End If
End If
If lStart > 0 Then 'string found
strTmp = ReadChunkToString(strFileFullPath, lChunkSmall, lFilePointer + lStart - iDelta, bEOF)
lPos = InStr(strTmp, "LastSaveVersion") 'find entry
If lPos > 0 Then 'found
lPos = InStr(lPos, strTmp, "<Version>") 'find version
If lPos > 0 Then 'r10 uses different format; skip
lsv.Version = Mid$(strTmp, lPos + Len("<Version>"), 1) 'works until version 10
lPos = InStr(lPos, strTmp, "<Release>") 'find release
lsv.Release = Mid$(strTmp, lPos + Len("<Release>"), _
InStr(lPos, strTmp, "/<Release>") - Len("<Release>") - lPos)
lPos = InStr(lPos, strTmp, "<ServicePack>") 'find ServicePack
lsv.Servicepack = Mid$(strTmp, lPos + Len("<ServicePack>"), _
InStr(lPos, strTmp, "/<ServicePack>") - Len("<ServicePack>") - lPos)
lPos = InStr(lPos, strTmp, "<BuildDate>") 'find BuildDate
lsv.BuildDate = Mid$(strTmp, lPos + Len("<BuildDate>"), _
InStr(lPos, strTmp, "/<BuildDate>") - Len("<BuildDate>") - lPos)
lPos = InStr(lPos, strTmp, "<HotFix>") 'find HotFix
If lPos > 0 Then
lsv.Hotfix = Mid$(strTmp, lPos + Len("<HotFix>"), _
InStr(lPos, strTmp, "/<HotFix>") - Len("<HotFix>") - lPos)
Else
lsv.Hotfix = " n/a"
End If
strLastVersion = "V" & lsv.Version & " R" & lsv.Release & " SP" & lsv.Servicepack & " HF" & lsv.Hotfix
Else
strLastVersion = "N/A"
End If
Else
strLastVersion = "N/A"
End If
If InStr(strTmp, "MinimalVersionToRead") Then 'find min version2read
lPos = InStr(strTmp, "CATIA") 'find entry
strMinVersionRead = Mid$(strTmp, lPos, 10) 'read entry
'if release is pre R10(one digit; insert '0' for sorting
If Asc(Right$(strMinVersionRead, 1)) < &H30 Or _
Asc(Right$(strMinVersionRead, 1)) > &H39 Then 'not a number; shorten entry
strMinVersionRead = Left$(strMinVersionRead, 8) _
& "0" & Mid$(strMinVersionRead, 9, 1) 'CATIAV5R9 zB
End If
Else 'is the build level there?
If InStr(strTmp, "CATBuildLevel") Then
lPos = InStr(strTmp, "CATBuildLevel") 'find build level
strBuildLevel = "B/L: " & Mid$(strTmp, lPos + Len("CATBuildLevel") + 8, 10) _
& " " & Mid$(strTmp, lPos + Len("CATBuildLevel") + 19, 2) _
& ":" & Mid$(strTmp, lPos + Len("CATBuildLevel") + 22, 2)
strMinVersionRead = strBuildLevel 'show build level instead of min version
Else
strMinVersionRead = "VERSION NOT FOUND"
End If
End If
AddLVEntry strFileName, strMinVersionRead, strLastVersion 'add to list
Exit Do 'quit
Else 'else increase chunk size
lChunkSize = lChunkBig
End If
If bEOF = True Then 'if eof then
AddLVEntry strFileName, "VERSION NOT FOUND", "N/A" 'add message to list
Exit Do 'quit
End If
strTmp = "" 'free memory
lFilePointer = lFilePointer - lChunkSize + Len("MinimalVersionToRead")
If lFilePointer < 0 Then lFilePointer = 0 'no negative pointers allowed
Loop
strTmp = "" 'free memory
Exit Sub
'---------------------------------------------------------------------------------------
GetCatiaRelease_Error:
Dim errMsg As String
Dim errRet As VbMsgBoxResult
Select Case Err.Number
Case 6 'überlauf/overflow;
' errMsg = Err.Number & ": " & Err.Description & " in procedure GetCatiaRelease" _
' & vbCr & strFileFullPath
' errRet = MsgBox(errMsg, vbOKOnly, "GetCatiaRelease")
AddLVEntry strFileFullPath, "OVERFLOW", "N/A"
' Case -2147467259
Case Else
errMsg = Err.Number & ": " & Err.Description & " in procedure GetCatiaRelease"
errRet = MsgBox(errMsg, vbOKOnly, "GetCatiaRelease")
End Select
'Resume Next 'fall thru to quit sub
'---------------------------------------------------------------------------------------
End Sub
'---------------------------------------------------------------------------------------
' Procedure : ReadChunkToString
' Author : jherzog
' Date : 10.08.2015
' Time : 20:00
' Languages : VB6 Pro SP6
' V5-Release: V5R19/21
' Purpose : Read chunk of a file and assign to a string
' Parms : strFN: Full path + name of file to read
' : lChunk: chunk size
' : lFPtr: file read pointer offset
' Ret. Value: the string holding the file's contents or "" or "ERROR"(file open error)
'
' Syntax : strTmp = ReadChunkToString(strFileFullPath, lChunkSize, lFilePointer, bEOF)
'
' Prereqs : an existing file
' Remarks :
'---------------------------------------------------------------------------------------
'
Private Function ReadChunkToString(strFN As String, lChunk As Long, lFPtr As Long, bEOF As Boolean) As String
Dim lBytesRead As Long 'number of bytes read
Dim ret As Long 'return value from ReadFile; 0 or 1
Dim hwndTextFile As Long 'handle to opened file
Dim lFSize As Long 'file size
Dim TempStr As String 'string to hold data
On Error GoTo ReadChunkToString_Error
'open the file
hwndTextFile = CreateFile(strFN, GENERIC_READ, 0, 0, _
OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS Or FILE_ATTRIBUTE_NORMAL, 0)
If hwndTextFile <> INVALID_HANDLE_VALUE Then 'if we have a valid handle
ret = SetFilePointer(hwndTextFile, lFPtr, 0&, FILE_BEGIN)
TempStr = String$(lChunk, Chr$(0)) 'init placeholder for data string
ret = ReadFileByNum(hwndTextFile, TempStr, _
lChunk, lBytesRead, 0) 'read file into string
If ret <> 0 Then 'read was successful
ReadChunkToString = TempStr
TempStr = ""
End If
If lChunk <> lBytesRead And ret <> 0 Then
bEOF = True
End If
CloseHandle hwndTextFile 'close handle
Exit Function 'and quit
End If
'---------------------------------------------------------------------------------------
'fall through to error message
ReadChunkToString = "ERROR" 'tempstr is empty; fileopen error?
Exit Function
'---------------------------------------------------------------------------------------
ReadChunkToString_Error:
Dim errMsg As String
Dim errRet As VbMsgBoxResult
Select Case Err.Number
' Case 438
' Case -2147467259
Case Else
errMsg = Err.Number & ": " & Err.Description & " in procedure ReadChunkToString"
errRet = MsgBox(errMsg, vbOKOnly, "ReadChunkToString")
End Select
ReadChunkToString = "ERROR"
'Resume Next 'fall thru to quit sub
'---------------------------------------------------------------------------------------
End Function
Sonstiges:
Noch ein Wort zu den MinimalVersionToRead-Angaben:
Eintrag: | Bedeutung |
CATIAV5R17 |
Catia-Dokumente, also CATDrawing, CATPart, CATProduct, aber auch CATShape, Catalog, CATMaterial, CATSystem, ... |
Version Not Found | Catia - Doc mit 'V5_CFV2' - Kennung, aber ohne 'MinVersionToRead' - Eintrag (vor 2002) |
Not a Catia Document | Alle anderen 'CAT's, aber ohne die 'V5_CFV2' - Kennung, zB. '.catscript' |
Not a Catia File | Dateiendung <> 'CAT*' |
Error | Datei konnte nicht geöffnet werden; Lesefehler. Datei eventuell bereits geöffnet. |
Overflow | Dieser Fehler sollte nicht mehr vorkommen. Trat bei vor 2002-Dateien auf. |