https://v5vb.wordpress.com/2010/09/26/exec-scripts-in-batch-mode/
以自動方式從數(shù)千個工程圖中提取一些信息的最佳方法是什么?在他的場景中府寒,該信息是附加到每個圖形中的根圖形節(jié)點的少數(shù)參數(shù)的值迈窟。我建議以批處理模式執(zhí)行腳本贱田,該腳本將一張一張地打開每個圖形采缚,然后讀取這些參數(shù)值并將數(shù)據(jù)寫入文本文件。
首先督勺,這是一個相對常見的場景渠羞,因此許多人可以通過共享用于打開圖形并寫出參數(shù)值的代碼來受益。另外智哀,我感覺很多人從未以批處理模式運行腳本堵未,因此本文可能會解鎖一些新功能。因此盏触,在本文中渗蟹,我將討論運行批處理的基礎知識块饺,并分享我們開發(fā)和測試的代碼。
什么是批處理模式雌芽?
在通常的一天中啟動CATIA進行工作時授艰,您正在以交互方式運行。交互模式意味著您可以在屏幕上看到CATIA及其用戶界面世落。您可以單擊命令淮腾,選擇內(nèi)容并與其進行交互。另一方面屉佳,批處理模式是一種無需任何用戶界面即可啟動CATIA的方法谷朝。顯然,在有限的用例中武花,這是個好主意圆凰,因為CATIA在“幕后”運行,并且您在屏幕上看不到任何東西体箕。通常专钉,使用批處理模式的原因是運行CATIA實用程序(請參閱“工具實用程序”菜單項)或執(zhí)行腳本。
為什么要使用批處理模式累铅?
因此跃须,何時應該考慮以批處理模式運行腳本?我認為在以下情況下娃兽,以交互方式運行腳本可能是一個不錯的選擇:
您需要對許多單獨的CATIA文件進行一些操作
您需要生成許多新數(shù)據(jù)(幾何圖形創(chuàng)建菇民,產(chǎn)品結(jié)構(gòu)創(chuàng)建等)
您需要最佳的性能(速度)
腳本無需任何用戶交互即可完成其工作。
上面的關鍵項之一是投储,CATIA在批處理模式下的運行要比在交互模式下快得多第练。這是因為當它在交互模式下運行時,它經(jīng)常需要處理對交互式圖形顯示的更新轻要,但是在批處理模式下,這些更新都不會完成垦缅。在本文的結(jié)尾冲泥,我將共享圖形示例批處理的性能編號。
最后一項(無需用戶交互)非常重要壁涎。您的程序必須能夠在沒有任何用戶交互的情況下做出自己的所有決定凡恍,否則該批處理將不會成功。因此怔球,如果您要批量嘗試使用現(xiàn)有程序嚼酝,則應對此進行非常仔細的檢查并解決所有潛在問題。這可能意味著將值或決策邏輯硬編碼到程序中竟坛,或者使程序從文本文件中讀取輸入信息闽巩,或者甚至可能在啟動批處理時將參數(shù)傳遞到腳本中钧舌。這些情況不會在本文中介紹,因為我將共享的示例代碼不需要任何用戶輸入涎跨。
示例場景和腳本
如前所述洼冻,我們的方案是打開數(shù)千個圖形并提取一些參數(shù)值,然后將它們寫入文本文件隅很。由于要處理數(shù)千個文件撞牢,因此我們希望盡可能高效地執(zhí)行此操作。我們需要訪問的參數(shù)存在于每個圖形的根參數(shù)集合中叔营。所有圖形都將位于本地文件系統(tǒng)上的單個文件夾中屋彪。該程序應具有足夠的靈活性,以便我們可以輕松地指定參數(shù)名稱列表绒尊,該參數(shù)名稱的值應從每個圖形中檢索畜挥,而不必每次使用腳本時都修改代碼。
我不會解釋該腳本的工作原理垒酬,因為本文的重點是運行批處理而不是此特定腳本砰嘁。但是,我確實在整個代碼中添加了一些簡短的注釋勘究,以幫助理解宏在做什么矮湘。花一點時間閱讀它口糕,因為其中包含一些有趣的東西缅阳。
如果要以交互方式或批量方式嘗試腳本,只需制作一些在其根參數(shù)集中具有一個或多個參數(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
在批處理模式下運行宏之前
我想指出的是超棺,在以批處理模式運行腳本之前向族,應始終先在交互模式下對其進行測試。如前所述棠绘,除非代碼將任何錯誤信息輸出到文本文件或命令窗口件相,否則您將看不到消息或不會從運行中收到任何反饋。因此氧苍,對于我們的方案夜矗,將十幾個文件放置在一個文件夾中,并運行該腳本以確保在繼續(xù)進行批處理之前該腳本可以正常工作让虐。
如何開始批處理
有很多方法可以以批處理方式啟動CATIA紊撕。CATIA幫助文檔解釋了五種不同的方法,但是我建議在選項.4中將選項#4與命令字符串一起使用赡突。我傾向于這樣做有幾個原因对扶。主要原因是区赵,我不太在意在命令提示符下鍵入一個大的長字符串。輸入錯誤的內(nèi)容太容易了辩稽,尤其是在這種情況下惧笛,當命令字符串變得很長時。我還想將確切的命令行字符串存儲在下一次逞泄,如果您打算這樣做患整,最好將其保存在擴展名為.bat的文本文件中。準備好.bat文件后喷众,只需雙擊該文件各谚,Windows就會執(zhí)行該命令,就像您在命令行中鍵入該命令一樣到千。
讓我們看一下在幾種常見情況下此命令字符串中包含的內(nèi)容昌渤。在每種情況下,您都需要首先指定CATIA可執(zhí)行文件的位置(CNext.exe)憔四。之后膀息,您可以通過鍵入破折號(-),選項名稱了赵,空格潜支,選項值來指定選項。
示例1:您要使用默認環(huán)境啟動CATIA
CNextPath –宏–批處理ScriptPath
示例2:您要使用自定義環(huán)境啟動CATIA(更常見)
CNextPath –direnv EnvFolderPath –env EnvName –batch –宏ScriptPath
CNextPath CNext.exe 安裝位置的完整路徑
–direnv(可選)環(huán)境文件所在的文件夾路徑
EnvFolderPath環(huán)境文件所在的文件夾路徑的值
–env(選項)要啟動的環(huán)境的名稱
EnvName要啟動的環(huán)境的名稱
–batch(可選)CATIA將以批處理模式啟動柿汛。
–macro(選項)CATIA將執(zhí)行請求的腳本
ScriptPath您要運行的腳本的完整路徑
在大多數(shù)情況下冗酿,您可能希望使用公司使用的自定義環(huán)境來啟動CATIA,因此您將使用上面的第二個示例络断。以下是示例命令行字符串(請注意裁替,您將必須針對自己的公司特定安裝對其進行自定義)。將此字符串保存在文本文件中貌笨,并以.bat擴展名保存弱判。要對其進行測試,只需雙擊此.bat文件锥惋,CATIA應該以指定的選項開頭并運行腳本昌腰。
“ 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 ”
您可以通過直接啟動CNEXT.exe來啟動CATIA V5批處理,也可以使用CATSTART.exe進程净刮。每種方法的命令行語法略有不同剥哑,因此下面列出了一些示例硅则。
使用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應用程序文件所在的bin文件夾。
/ D選項指定您要更改驅(qū)動器以及目錄怎虫。如果您的安裝不在C:\上暑认,則應添加此選項困介。
使用CD命令更改目錄時,如果路徑包含空格蘸际,則不需要引號座哩。
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選項根穷。
在這種情況下,宏路徑包含空格导坟,因此必須用引號引起來
使用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 ”
當使用CATSTART.exe過程中屿良,你應該使用-object選項,然后附上-batch -macro選項小號和宏路徑中的所有引號內(nèi)
如果宏路徑中有空格惫周,則可以尘惧,因為它已經(jīng)用引號引起來。
其他注意事項
如果您的CATIA環(huán)境設置為可與ENOVIA一起使用递递,并且當CATIA以交互模式啟動時喷橙,系統(tǒng)提示您登錄,則應使用下面列出的選項之一來設置批處理登舞。
選項1:使用CNEXT.exe進程(不是CATSTART.exe)啟動批處理
選項2:如果要使用CATSTART.exe贰逾,則應以交互方式打開CATIA,然后轉(zhuǎn)到“工具-選項”逊躁,然后關閉“啟動時登錄”選項似踱。如果不關閉此選項,即使指定了-batch選項稽煤,CATIA似乎總是以交互方式啟動CATIA核芽。
結(jié)果與性能比較
上面的腳本以批處理模式和交互模式在一組圖形上運行,并且針對這兩種方案計算了每個圖形的平均時間酵熙。在交互模式下轧简,該腳本平均每個圖形約2.6分鐘。這主要是由于加載時間導致打開圖形匾二,然后將其全部加載到內(nèi)存中并使用所有這些信息更新顯示哮独。我們正在自動化的實際任務(讀取參數(shù)值)可能只花費一秒鐘的時間,但是以交互方式加載數(shù)據(jù)需要花費大量時間察藐。
在批處理模式下皮璧,平均時間據(jù)報道為3秒多一點。根據(jù)這些數(shù)字分飞,批處理模式大約提高了50倍悴务。這是令人難以置信的性能提升!我很驚訝,因為我過去運行過批處理讯檐,但從未回過頭來以交互方式再次運行它們以比較時間羡疗。我自己沒有對本文的腳本進行任何時間試用,因為我沒有大量具有必需參數(shù)的真實世界圖紙樣本别洪。我只是分享報告給我的數(shù)字叨恨。
結(jié)論
在本文中,我的目標是使您能夠以批處理模式運行腳本挖垛。我認為我提供的基本信息足以設置大多數(shù)批處理方案痒钝。最后,我希望閱讀一下真實的示例及其所產(chǎn)生的結(jié)果痢毒,也許將來您可以從使用批處理中受益午乓。
*如果您有使用批處理模式運行腳本的經(jīng)驗,甚至可能想分享一些性能比較數(shù)據(jù)闸准,請在下面發(fā)表評論益愈。我想聽聽使用批處理模式時看到的實際性能提升的更多真實示例。