https://v5vb.wordpress.com/2010/09/26/exec-scripts-in-batch-mode/
以自動(dòng)方式從數(shù)千個(gè)工程圖中提取一些信息的最佳方法是什么?在他的場景中,該信息是附加到每個(gè)圖形中的根圖形節(jié)點(diǎn)的少數(shù)參數(shù)的值。我建議以批處理模式執(zhí)行腳本,該腳本將一張一張地打開每個(gè)圖形,然后讀取這些參數(shù)值并將數(shù)據(jù)寫入文本文件。
首先,這是一個(gè)相對常見的場景,因此許多人可以通過共享用于打開圖形并寫出參數(shù)值的代碼來受益。另外,我感覺很多人從未以批處理模式運(yùn)行腳本,因此本文可能會(huì)解鎖一些新功能。因此,在本文中,我將討論運(yùn)行批處理的基礎(chǔ)知識,并分享我們開發(fā)和測試的代碼。
什么是批處理模式?
在通常的一天中啟動(dòng)CATIA進(jìn)行工作時(shí),您正在以交互方式運(yùn)行。交互模式意味著您可以在屏幕上看到CATIA及其用戶界面。您可以單擊命令,選擇內(nèi)容并與其進(jìn)行交互。另一方面,批處理模式是一種無需任何用戶界面即可啟動(dòng)CATIA的方法。顯然,在有限的用例中,這是個(gè)好主意,因?yàn)镃ATIA在“幕后”運(yùn)行,并且您在屏幕上看不到任何東西。通常,使用批處理模式的原因是運(yùn)行CATIA實(shí)用程序(請參閱“工具實(shí)用程序”菜單項(xiàng))或執(zhí)行腳本。
為什么要使用批處理模式?
因此,何時(shí)應(yīng)該考慮以批處理模式運(yùn)行腳本?我認(rèn)為在以下情況下,以交互方式運(yùn)行腳本可能是一個(gè)不錯(cuò)的選擇:
您需要對許多單獨(dú)的CATIA文件進(jìn)行一些操作
您需要生成許多新數(shù)據(jù)(幾何圖形創(chuàng)建,產(chǎn)品結(jié)構(gòu)創(chuàng)建等)
您需要最佳的性能(速度)
腳本無需任何用戶交互即可完成其工作。
上面的關(guān)鍵項(xiàng)之一是,CATIA在批處理模式下的運(yùn)行要比在交互模式下快得多。這是因?yàn)楫?dāng)它在交互模式下運(yùn)行時(shí),它經(jīng)常需要處理對交互式圖形顯示的更新,但是在批處理模式下,這些更新都不會(huì)完成。在本文的結(jié)尾,我將共享圖形示例批處理的性能編號。
最后一項(xiàng)(無需用戶交互)非常重要。您的程序必須能夠在沒有任何用戶交互的情況下做出自己的所有決定,否則該批處理將不會(huì)成功。因此,如果您要批量嘗試使用現(xiàn)有程序,則應(yīng)對此進(jìn)行非常仔細(xì)的檢查并解決所有潛在問題。這可能意味著將值或決策邏輯硬編碼到程序中,或者使程序從文本文件中讀取輸入信息,或者甚至可能在啟動(dòng)批處理時(shí)將參數(shù)傳遞到腳本中。這些情況不會(huì)在本文中介紹,因?yàn)槲覍⒐蚕淼氖纠a不需要任何用戶輸入。
示例場景和腳本
如前所述,我們的方案是打開數(shù)千個(gè)圖形并提取一些參數(shù)值,然后將它們寫入文本文件。由于要處理數(shù)千個(gè)文件,因此我們希望盡可能高效地執(zhí)行此操作。我們需要訪問的參數(shù)存在于每個(gè)圖形的根參數(shù)集合中。所有圖形都將位于本地文件系統(tǒng)上的單個(gè)文件夾中。該程序應(yīng)具有足夠的靈活性,以便我們可以輕松地指定參數(shù)名稱列表,該參數(shù)名稱的值應(yīng)從每個(gè)圖形中檢索,而不必每次使用腳本時(shí)都修改代碼。
我不會(huì)解釋該腳本的工作原理,因?yàn)楸疚牡闹攸c(diǎn)是運(yùn)行批處理而不是此特定腳本。但是,我確實(shí)在整個(gè)代碼中添加了一些簡短的注釋,以幫助理解宏在做什么?;ㄒ稽c(diǎn)時(shí)間閱讀它,因?yàn)槠渲邪恍┯腥さ臇|西。
如果要以交互方式或批量方式嘗試腳本,只需制作一些在其根參數(shù)集中具有一個(gè)或多個(gè)參數(shù)的圖形即可。然后,只需在腳本開始處編輯變量以指定要查找的參數(shù)名稱以及圖形文件所在的文件夾。
代碼
'--------------------------------------------------------------------------------
' Author:
' Mike Berry
' Published on CATIA V5 Automation blog (v5vb.wordpress.com)
' Send comments and feedback to blogv5vb@gmail.com
'
' Purpose:
' This program will open every CATDrawing in the specified folder one by one
' and retrieve the requested parameter values and write them to a text file
' This program should be run as a batch if many drawings are to be processed.
'
' History:
' Version Date Comment
' 1.0 09/26/10 First version
' Notes:
' 1. You must set the two input values below before running the script
' where it says, "Define input values for this batch run"
'
' FOLDER This is the full path of the folder to be processed
' PARAMNAMES This is a comma separated list of parameter names
' whose value should be retrieved
'--------------------------------------------------------------------------------
Option Explicit
Sub CATMain()
Dim objFolder As Object
Dim intIndex As Integer
Dim intIndex2 As Integer
Dim objFile As File
Dim objDwgDoc As Document
Dim objParams As Parameters
Dim strParamName As String
Dim varParamNames As Variant
Dim strOutputValues As String
Dim intArraySize As Integer
Dim strOutputFilePath As String
Dim objTextStream As TextStream
Dim strOutput As String
Dim objFileSystem As Object
Dim strTimeStamp As String
Dim lngNbDwgs As Long
'Define input values for this batch run
Const FOLDER As String = "C:\Temp\BatchTest"
Const PARAMNAMES As String = "TestString,TestLength,TestMass"
'Make sure the requested folder exists
If CATIA.FileSystem.FolderExists(FOLDER) = False Then Exit Sub
'Create a header in the output string
strOutput = "Folder processed: " & FOLDER & Chr(13)
strOutput = strOutput & "Parameter names: " & PARAMNAMES & Chr(13) & Chr(13)
strOutput = strOutput & "File #" & Chr(9) & "Drawing name" & Chr(9) & Replace(PARAMNAMES, ",", Chr(9)) & Chr(13)
'Create an array from the list of parameter names
'If there is only one name, manually create the array
'otherwise split the string into an array based on the commas
If InStr(1, PARAMNAMES, ",") > 0 Then
varParamNames = Split(PARAMNAMES, ",")
Else
ReDim varParamNames(0)
varParamNames(0) = PARAMNAMES
End If
intArraySize = UBound(varParamNames)
'Process each CATDrawing in the specified folder
lngNbDwgs = 0
Set objFolder = CATIA.FileSystem.GetFolder(FOLDER)
If objFolder.Files.Count > 0 Then
For intIndex = 1 To objFolder.Files.Count
Set objFile = objFolder.Files.Item(intIndex)
If UCase(Right(objFile.Name, 11)) = ".CATDRAWING" Then
'Count the number of drawing processed
lngNbDwgs = lngNbDwgs + 1
'Open the drawing and get at the root parameters
Set objDwgDoc = CATIA.Documents.Open(objFile.Path)
Set objParams = objDwgDoc.Parameters.RootParameterSet.AllParameters
'Append the drawing name to the output string
strOutput = strOutput & lngNbDwgs & Chr(9)
strOutput = strOutput & objDwgDoc.Name & Chr(9)
'Get the value of each requested parameter and
'append them to the output string
For intIndex2 = 0 To intArraySize
strParamName = Trim(varParamNames(intIndex2))
strOutput = strOutput & Chr(9) & GetParameterValue(objParams, strParamName)
Next
strOutput = strOutput & Chr(13)
'Close the drawing
objDwgDoc.Close
End If
Next
End If
'If no drawings were processed, make a note in the output string
If lngNbDwgs = 0 Then strOutput = strOutput & "No CATDrawings were found!"
'Create a timestamp for the output text file by removing invalid chars from
'the current date and time string that is returned by the Now() function
'This is an easy way to guarantee a new file each time the batch is executed
strTimeStamp = Replace(Now, "/", "-")
strTimeStamp = Replace(strTimeStamp, ":", "-")
strTimeStamp = Replace(strTimeStamp, " ", "_")
'Create a new output text file and write the output string
strOutputFilePath = objFolder.Path & "\" & "DwgParamBatchResult_" & strTimeStamp & ".txt"
Set objFile = CATIA.FileSystem.CreateFile(strOutputFilePath, True)
Set objTextStream = objFile.OpenAsTextStream("ForWriting")
objTextStream.Write strOutput
objTextStream.Close
End Sub
'--------------------------------------------------------------------------------
Function GetParameterValue(ByRef iParams As Parameters, ByVal iParamName As String) As String
Dim objParam As Parameter
'Try to find the parameter and trap error in case it doesn't exist
On Error Resume Next
Set objParam = iParams.Item(iParamName)
If Err.Number = 0 Then
GetParameterValue = objParam.ValueAsString
Else
GetParameterValue = "Not Found"
End If
End Function
在批處理模式下運(yùn)行宏之前
我想指出的是,在以批處理模式運(yùn)行腳本之前,應(yīng)始終先在交互模式下對其進(jìn)行測試。如前所述,除非代碼將任何錯(cuò)誤信息輸出到文本文件或命令窗口,否則您將看不到消息或不會(huì)從運(yùn)行中收到任何反饋。因此,對于我們的方案,將十幾個(gè)文件放置在一個(gè)文件夾中,并運(yùn)行該腳本以確保在繼續(xù)進(jìn)行批處理之前該腳本可以正常工作。
如何開始批處理
有很多方法可以以批處理方式啟動(dòng)CATIA。CATIA幫助文檔解釋了五種不同的方法,但是我建議在選項(xiàng).4中將選項(xiàng)#4與命令字符串一起使用。我傾向于這樣做有幾個(gè)原因。主要原因是,我不太在意在命令提示符下鍵入一個(gè)大的長字符串。輸入錯(cuò)誤的內(nèi)容太容易了,尤其是在這種情況下,當(dāng)命令字符串變得很長時(shí)。我還想將確切的命令行字符串存儲在下一次,如果您打算這樣做,最好將其保存在擴(kuò)展名為.bat的文本文件中。準(zhǔn)備好.bat文件后,只需雙擊該文件,Windows就會(huì)執(zhí)行該命令,就像您在命令行中鍵入該命令一樣。
讓我們看一下在幾種常見情況下此命令字符串中包含的內(nèi)容。在每種情況下,您都需要首先指定CATIA可執(zhí)行文件的位置(CNext.exe)。之后,您可以通過鍵入破折號(-),選項(xiàng)名稱,空格,選項(xiàng)值來指定選項(xiàng)。
示例1:您要使用默認(rèn)環(huán)境啟動(dòng)CATIA
CNextPath –宏–批處理ScriptPath
示例2:您要使用自定義環(huán)境啟動(dòng)CATIA(更常見)
CNextPath –direnv EnvFolderPath –env EnvName –batch –宏ScriptPath
CNextPath CNext.exe 安裝位置的完整路徑
–direnv(可選)環(huán)境文件所在的文件夾路徑
EnvFolderPath環(huán)境文件所在的文件夾路徑的值
–env(選項(xiàng))要啟動(dòng)的環(huán)境的名稱
EnvName要啟動(dòng)的環(huán)境的名稱
–batch(可選)CATIA將以批處理模式啟動(dòng)。
–macro(選項(xiàng))CATIA將執(zhí)行請求的腳本
ScriptPath您要運(yùn)行的腳本的完整路徑
在大多數(shù)情況下,您可能希望使用公司使用的自定義環(huán)境來啟動(dòng)CATIA,因此您將使用上面的第二個(gè)示例。以下是示例命令行字符串(請注意,您將必須針對自己的公司特定安裝對其進(jìn)行自定義)。將此字符串保存在文本文件中,并以.bat擴(kuò)展名保存。要對其進(jìn)行測試,只需雙擊此.bat文件,CATIA應(yīng)該以指定的選項(xiàng)開頭并運(yùn)行腳本。
“ C:\ Program Files \ Dassault Systemes \ B18 \ intel_a \ code \ bin \ cnext.exe” –direnv E:\ CATEnv –env CATIA.V5R18.B18 -macro -batch“ C:\ Temp \ BatchTest \ DwgParamBatch.CATScript ”
您可以通過直接啟動(dòng)CNEXT.exe來啟動(dòng)CATIA V5批處理,也可以使用CATSTART.exe進(jìn)程。每種方法的命令行語法略有不同,因此下面列出了一些示例。
使用CNEXT.exe
CD / DD:\ Program Files \ Dassault Systemes \ B18 \ intel_a \ code \ bin
CNEXT.exe –direnv E:\ CATEnv –env CATIA.V5R18.B18 -batch -macro C:\ Temp \ BatchTest \ DwgParamBatch.CATScript
在批處理文件的第一行,我使用CD命令將目錄更改為CATIA應(yīng)用程序文件所在的bin文件夾。
/ D選項(xiàng)指定您要更改驅(qū)動(dòng)器以及目錄。如果您的安裝不在C:\上,則應(yīng)添加此選項(xiàng)。
使用CD命令更改目錄時(shí),如果路徑包含空格,則不需要引號。
CD C:\ Program Files \ Dassault Systemes \ B18 \ intel_a \ code \ bin
CNEXT.exe –direnv E:\ CATEnv –env CATIA.V5R18.B18 -batch -macro“ C:\ Temp \ BatchTest \ Dwg Param Batch.CATScript ”
在這種情況下,bin文件夾位于C:\上,因此在CD命令后我省略了/ D選項(xiàng)。
在這種情況下,宏路徑包含空格,因此必須用引號引起來
使用CATSTART.exe
CD C:\ Program Files \ Dassault Systemes \ B18 \ intel_a \ code \ bin
CATSTART.exe –direnv E:\ CATEnv –env CATIA.V5R18.B18 -object“ -batch -macro C:\ Temp \ BatchTest \ DwgParamBatch.CATScript ”
當(dāng)使用CATSTART.exe過程中,你應(yīng)該使用-object選項(xiàng),然后附上-batch -macro選項(xiàng)小號和宏路徑中的所有引號內(nèi)
如果宏路徑中有空格,則可以,因?yàn)樗呀?jīng)用引號引起來。
其他注意事項(xiàng)
如果您的CATIA環(huán)境設(shè)置為可與ENOVIA一起使用,并且當(dāng)CATIA以交互模式啟動(dòng)時(shí),系統(tǒng)提示您登錄,則應(yīng)使用下面列出的選項(xiàng)之一來設(shè)置批處理。
選項(xiàng)1:使用CNEXT.exe進(jìn)程(不是CATSTART.exe)啟動(dòng)批處理
選項(xiàng)2:如果要使用CATSTART.exe,則應(yīng)以交互方式打開CATIA,然后轉(zhuǎn)到“工具-選項(xiàng)”,然后關(guān)閉“啟動(dòng)時(shí)登錄”選項(xiàng)。如果不關(guān)閉此選項(xiàng),即使指定了-batch選項(xiàng),CATIA似乎總是以交互方式啟動(dòng)CATIA。
結(jié)果與性能比較
上面的腳本以批處理模式和交互模式在一組圖形上運(yùn)行,并且針對這兩種方案計(jì)算了每個(gè)圖形的平均時(shí)間。在交互模式下,該腳本平均每個(gè)圖形約2.6分鐘。這主要是由于加載時(shí)間導(dǎo)致打開圖形,然后將其全部加載到內(nèi)存中并使用所有這些信息更新顯示。我們正在自動(dòng)化的實(shí)際任務(wù)(讀取參數(shù)值)可能只花費(fèi)一秒鐘的時(shí)間,但是以交互方式加載數(shù)據(jù)需要花費(fèi)大量時(shí)間。
在批處理模式下,平均時(shí)間據(jù)報(bào)道為3秒多一點(diǎn)。根據(jù)這些數(shù)字,批處理模式大約提高了50倍。這是令人難以置信的性能提升!我很驚訝,因?yàn)槲疫^去運(yùn)行過批處理,但從未回過頭來以交互方式再次運(yùn)行它們以比較時(shí)間。我自己沒有對本文的腳本進(jìn)行任何時(shí)間試用,因?yàn)槲覜]有大量具有必需參數(shù)的真實(shí)世界圖紙樣本。我只是分享報(bào)告給我的數(shù)字。
結(jié)論
在本文中,我的目標(biāo)是使您能夠以批處理模式運(yùn)行腳本。我認(rèn)為我提供的基本信息足以設(shè)置大多數(shù)批處理方案。最后,我希望閱讀一下真實(shí)的示例及其所產(chǎn)生的結(jié)果,也許將來您可以從使用批處理中受益。
*如果您有使用批處理模式運(yùn)行腳本的經(jīng)驗(yàn),甚至可能想分享一些性能比較數(shù)據(jù),請?jiān)谙旅姘l(fā)表評論。我想聽聽使用批處理模式時(shí)看到的實(shí)際性能提升的更多真實(shí)示例。