以前、ユーザーサイドのCATIA 関連サイトとして紹介した
"CATIA V5 Automation" のこちらの記載ですが、
Executing CATIA scripts in batch mode | CATIA V5 Automation
よく読んでいませんでした。 要は
"CATIAをバッチモードで起動して、マクロの処理をするとビックリする程速いよ"
って書いてあるような気がします。
バッチモードって "ツール" - "ユーティリティ" で行うCATBatchStarterのヤツだけだと
思ってました。
確かにヘルプの "CATIA Infrastructure User Guide" の一番先頭の
"Windows のセッションの開始" の所にサラッと書いて有りましたよ。
本当にサラッと・・・。
バッチモードで起動してコマンドラインで実行させるのも、入力文字数が長くて
バッチファイルを作る事をお勧めするよ みたいな感じで、説明書きと例文
が幾つか記載されています。
"EnvFolderPath" とか "EnvName" は何を調べれば良いのか良く
わからなかったので、素直にデスクトップに有るショートカットを流用しました。
ブログの都合上、横長になりすぎると見難い為、こんな感じの
バッチファイルにしました。
@echo off rem CATVBSButchStart.bat rem *** 設定 *** set CAT="C:\Program Files\Dassault Systemes\B22\win_b64\code\bin\CNEXT.exe" set DIRENV="C:\Users\XXXXX\AppData\Roaming\DassaultSystemes\CATEnv" set ENV="CATIA.V5-6R2012SP4" set MACRONAME="C:\temp\CATVBSButchTest.CATScript" rem *** 設定 *** %CAT% -direnv %DIRENV% -env %ENV% -batch -macro %MACRONAME%
DIRENVの所の "XXXXX" はログイン名になってしまったので伏せさせてください。
実際に呼び出す "CATVBSButchTest.CATScript" は、まだやったことが無い為
単にメッセージボックスを表示させるだけのものにしました。
'catvbs sub catmain msgbox "hoge" end sub
確かに表示されました。
タイミングが良いような悪いようなわかりませんが、もう少しでCATIAのライセンスが
切れるのですが、 "あとXX日でライセンスが切れますよ" のメッセージもちゃんと出ます・・。
やり方がわかったので、いつもの点を作るマクロでテストしてみます。
CATScriptの場合、コレクションが利用できなかったり、あのままでは時間の計測が
出来なかったりした為、少し変更しました。
'catvba catvbs Const filepath = "C:\temp\BatchTestVBA.CATPart" Const PntCount = 500 Sub CATMain() Dim documents1: Set documents1 = CATIA.Documents Dim partDocument1: Set partDocument1 = documents1.Add("Part") Set partDocument1 = CATIA.ActiveDocument partDocument1.SaveAs filepath Dim t1, t2, t t1 = Timer() Call SubCreateDatumPoint partDocument1.Save t2 = Timer() t = TimeDiff(t1, t2) MsgBox CStr(PntCount) + "点" + vbNewLine + CStr(CDbl(t)) + "秒" 'CATIA.Quit End Sub Private Sub SubCreateDatumPoint() Dim oPart Dim oHybShpFact Dim oHybBdy Dim oHybShpPt Dim oHybShpPtExp Dim i Dim oPt Dim colMyObj1(): ReDim colMyObj1(PntCount) Set oPart = CATIA.ActiveDocument.Part Set oHybShpFact = oPart.HybridShapeFactory '------------ Add Body ------------------------------ Set oHybBdy = oPart.HybridBodies.Add() '------------ Create RefPoint ------------------------------ oPt = Array(0, 0, 0) Set oHybShpPt = oHybShpFact.AddNewPointCoord(oPt(0), oPt(1), oPt(2)) Call oHybBdy.AppendHybridShape(oHybShpPt) Call oPart.UpdateObject(oHybShpPt) '------------ Create DetumPoints ------------------------------ For i = 1 To PntCount oPt(0) = oPt(0) + 10 Call oHybShpPt.SetCoordinates(oPt) Call oPart.UpdateObject(oHybShpPt) Set oHybShpPtExp = oHybShpFact.AddNewPointDatum(oHybShpPt) Set colMyObj1(i) = oHybShpPtExp Next '------------ Append DetumPoints ------------------------------ With oHybBdy For i = 1 To PntCount Call .AppendHybridShape(colMyObj1(i)) Next End With Call oHybShpFact.DeleteObjectForDatum(oHybShpPt) Call oPart.Update End Sub Private Function TimeDiff(ByVal a, ByVal b) Dim x If b >= a Then x = b - a Else x = (86400 - a) + b End If TimeDiff = x End Function
TimeDiff関数は拾ってきました(恐らく要らないのですが)
配列なのに名前が "colMyObj1" だったりするのは見逃してください。
filepathで指定した名前のPartファイルを作成し一旦保存。その後
PntCount分の点を作成し、再度保存して終了します。
バッチモードでテストする際は、
'catvbs Const filepath = "C:\temp\BatchTestVBS.CATPart" Const PntCount = 500 Sub CATMain() ・・・ CATIA.Quit End Sub ・・・
と言う感じで、CATIA自体も終了させます。幾つもCATIAが立ち上がった
ままになってしまうので。
VBAでツールバーに登録した状態での結果はこちら
点の数が少ないので何とも言いがたいのですが・・・。
本当はこちらを意識して50000点でも挑戦してみましたが
sirenを利用し、点を作成してみる - C#ATIA
30分以上やっても終了しなかったので諦めました。
CATIAを起動した状態でCATScriptファイルを実行した結果はこちら
若干遅いぐらいで、大差ないのです。
以前、 "CATVBAでは遅いので、何時もCATScriptで作ってます"
のような事を見たことがあるのですが、そんな感じしないんだけどなぁ。
何か方法があるのかな?
明らかなので、50000点は挑戦もしませんでした。
続いて、今回テストしたいバッチモード起動でCATScriptファイルを実行した
結果はこちら
5000点で手ごたえを感じたので、50000点も挑戦しています。
sirenを利用しIgesを作成する方法に比べれば、かなり遅いのですが
素の状態で挑むより、かなり実感できます。
バッチモードで、引数渡しでマクロを実行したいと試しているのですが、
上手く行かない。 多分出来ると思うのですが・・・。