以批处理模式执行CATIA脚本
https://v5vb.wordpress.com/2010/09/26/exec-scripts-in-batch-mode/
以自动方式从数千个工程图中提取一些信息的最佳方法是什么?在他的场景中,该信息是附加到每个图形中的根图形节点的少数参数的值。我建议以批处理模式执行脚本,该脚本将一张一张地打开每个图形,然后读取这些参数值并将数据写入文本文件。
首先,这是一个相对常见的场景,因此许多人可以通过共享用于打开图形并写出参数值的代码来受益。另外,我感觉很多人从未以批处理模式运行脚本,因此本文可能会解锁一些新功能。因此,在本文中,我将讨论运行批处理的基础知识,并分享我们开发和测试的代码。
什么是批处理模式?
在通常的一天中启动CATIA进行工作时,您正在以交互方式运行。交互模式意味着您可以在屏幕上看到CATIA及其用户界面。您可以单击命令,选择内容并与其进行交互。另一方面,批处理模式是一种无需任何用户界面即可启动CATIA的方法。显然,在有限的用例中,这是个好主意,因为CATIA在“幕后”运行,并且您在屏幕上看不到任何东西。通常,使用批处理模式的原因是运行CATIA实用程序(请参阅“工具实用程序”菜单项)或执行脚本。
为什么要使用批处理模式?
因此,何时应该考虑以批处理模式运行脚本?我认为在以下情况下,以交互方式运行脚本可能是一个不错的选择:
您需要对许多单独的CATIA文件进行一些操作
您需要生成许多新数据(几何图形创建,产品结构创建等)
您需要最佳的性能(速度)
脚本无需任何用户交互即可完成其工作。
上面的关键项之一是,CATIA在批处理模式下的运行要比在交互模式下快得多。这是因为当它在交互模式下运行时,它经常需要处理对交互式图形显示的更新,但是在批处理模式下,这些更新都不会完成。在本文的结尾,我将共享图形示例批处理的性能编号。
最后一项(无需用户交互)非常重要。您的程序必须能够在没有任何用户交互的情况下做出自己的所有决定,否则该批处理将不会成功。因此,如果您要批量尝试使用现有程序,则应对此进行非常仔细的检查并解决所有潜在问题。这可能意味着将值或决策逻辑硬编码到程序中,或者使程序从文本文件中读取输入信息,或者甚至可能在启动批处理时将参数传递到脚本中。这些情况不会在本文中介绍,因为我将共享的示例代码不需要任何用户输入。
示例场景和脚本
如前所述,我们的方案是打开数千个图形并提取一些参数值,然后将它们写入文本文件。由于要处理数千个文件,因此我们希望尽可能高效地执行此操作。我们需要访问的参数存在于每个图形的根参数集合中。所有图形都将位于本地文件系统上的单个文件夹中。该程序应具有足够的灵活性,以便我们可以轻松地指定参数名称列表,该参数名称的值应从每个图形中检索,而不必每次使用脚本时都修改代码。
我不会解释该脚本的工作原理,因为本文的重点是运行批处理而不是此特定脚本。但是,我确实在整个代码中添加了一些简短的注释,以帮助理解宏在做什么。花一点时间阅读它,因为其中包含一些有趣的东西。
如果要以交互方式或批量方式尝试脚本,只需制作一些在其根参数集中具有一个或多个参数的图形即可。然后,只需在脚本开始处编辑变量以指定要查找的参数名称以及图形文件所在的文件夹。
代码
'--------------------------------------------------------------------------------
' 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
在批处理模式下运行宏之前
我想指出的是,在以批处理模式运行脚本之前,应始终先在交互模式下对其进行测试。如前所述,除非代码将任何错误信息输出到文本文件或命令窗口,否则您将看不到消息或不会从运行中收到任何反馈。因此,对于我们的方案,将十几个文件放置在一个文件夹中,并运行该脚本以确保在继续进行批处理之前该脚本可以正常工作。
如何开始批处理
有很多方法可以以批处理方式启动CATIA。CATIA帮助文档解释了五种不同的方法,但是我建议在选项.4中将选项#4与命令字符串一起使用。我倾向于这样做有几个原因。主要原因是,我不太在意在命令提示符下键入一个大的长字符串。输入错误的内容太容易了,尤其是在这种情况下,当命令字符串变得很长时。我还想将确切的命令行字符串存储在下一次,如果您打算这样做,最好将其保存在扩展名为.bat的文本文件中。准备好.bat文件后,只需双击该文件,Windows就会执行该命令,就像您在命令行中键入该命令一样。
让我们看一下在几种常见情况下此命令字符串中包含的内容。在每种情况下,您都需要首先指定CATIA可执行文件的位置(CNext.exe)。之后,您可以通过键入破折号(-),选项名称,空格,选项值来指定选项。
示例1:您要使用默认环境启动CATIA
CNextPath –宏–批处理ScriptPath
示例2:您要使用自定义环境启动CATIA(更常见)
CNextPath –direnv EnvFolderPath –env EnvName –batch –宏ScriptPath
CNextPath CNext.exe 安装位置的完整路径
–direnv(可选)环境文件所在的文件夹路径
EnvFolderPath环境文件所在的文件夹路径的值
–env(选项)要启动的环境的名称
EnvName要启动的环境的名称
–batch(可选)CATIA将以批处理模式启动。
–macro(选项)CATIA将执行请求的脚本
ScriptPath您要运行的脚本的完整路径
在大多数情况下,您可能希望使用公司使用的自定义环境来启动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选项指定您要更改驱动器以及目录。如果您的安装不在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选项小号和宏路径中的所有引号内
如果宏路径中有空格,则可以,因为它已经用引号引起来。
其他注意事项
如果您的CATIA环境设置为可与ENOVIA一起使用,并且当CATIA以交互模式启动时,系统提示您登录,则应使用下面列出的选项之一来设置批处理。
选项1:使用CNEXT.exe进程(不是CATSTART.exe)启动批处理
选项2:如果要使用CATSTART.exe,则应以交互方式打开CATIA,然后转到“工具-选项”,然后关闭“启动时登录”选项。如果不关闭此选项,即使指定了-batch选项,CATIA似乎总是以交互方式启动CATIA。
结果与性能比较
上面的脚本以批处理模式和交互模式在一组图形上运行,并且针对这两种方案计算了每个图形的平均时间。在交互模式下,该脚本平均每个图形约2.6分钟。这主要是由于加载时间导致打开图形,然后将其全部加载到内存中并使用所有这些信息更新显示。我们正在自动化的实际任务(读取参数值)可能只花费一秒钟的时间,但是以交互方式加载数据需要花费大量时间。
在批处理模式下,平均时间据报道为3秒多一点。根据这些数字,批处理模式大约提高了50倍。这是令人难以置信的性能提升!我很惊讶,因为我过去运行过批处理,但从未回过头来以交互方式再次运行它们以比较时间。我自己没有对本文的脚本进行任何时间试用,因为我没有大量具有必需参数的真实世界图纸样本。我只是分享报告给我的数字。
结论
在本文中,我的目标是使您能够以批处理模式运行脚本。我认为我提供的基本信息足以设置大多数批处理方案。最后,我希望阅读一下真实的示例及其所产生的结果,也许将来您可以从使用批处理中受益。
*如果您有使用批处理模式运行脚本的经验,甚至可能想分享一些性能比较数据,请在下面发表评论。我想听听使用批处理模式时看到的实际性能提升的更多真实示例。