以批處理模式執(zhí)行CATIA腳本

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ā)表評論益愈。我想聽聽使用批處理模式時看到的實際性能提升的更多真實示例。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末夷家,一起剝皮案震驚了整個濱河市蒸其,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌库快,老刑警劉巖摸袁,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異义屏,居然都是意外死亡靠汁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門闽铐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蝶怔,“玉大人,你說我怎么就攤上這事兄墅√咝牵” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵隙咸,是天一觀的道長沐悦。 經(jīng)常有香客問我,道長五督,這世上最難降的妖魔是什么藏否? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮充包,結(jié)果婚禮上副签,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好继薛,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著愈捅,像睡著了一般遏考。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蓝谨,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天灌具,我揣著相機與錄音,去河邊找鬼譬巫。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的育叁。 我是一名探鬼主播蛛砰,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼咕缎!你這毒婦竟也來了珠十?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤凭豪,失蹤者是張志新(化名)和其女友劉穎焙蹭,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嫂伞,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡孔厉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了帖努。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撰豺。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖拼余,靈堂內(nèi)的尸體忽然破棺而出郑趁,到底是詐尸還是另有隱情,我是刑警寧澤姿搜,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布寡润,位于F島的核電站,受9級特大地震影響舅柜,放射性物質(zhì)發(fā)生泄漏梭纹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一致份、第九天 我趴在偏房一處隱蔽的房頂上張望变抽。 院中可真熱鬧,春花似錦、人聲如沸绍载。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽击儡。三九已至塔沃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間阳谍,已是汗流浹背蛀柴。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留矫夯,地道東北人鸽疾。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像训貌,于是被迫代替她去往敵國和親制肮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350