C#ATIA

↑タイトル詐欺 主にCATIA V5 の VBA

バッチモードでCATScriptを実行する

以前、ユーザーサイドのCATIA 関連サイトとして紹介した
"CATIA V5 Automation" のこちらの記載ですが、
Executing CATIA scripts in batch mode | CATIA V5 Automation

よく読んでいませんでした。 要は
"CATIAをバッチモードで起動して、マクロの処理をするとビックリする程速いよ"
って書いてあるような気がします。
バッチモードって "ツール" - "ユーティリティ" で行うCATBatchStarterのヤツだけだと
思ってました。

確かにヘルプの "CATIA Infrastructure User Guide" の一番先頭の
"Windows のセッションの開始" の所にサラッと書いて有りましたよ。
本当にサラッと・・・。

バッチモードで起動してコマンドラインで実行させるのも、入力文字数が長くて
バッチファイルを作る事をお勧めするよ みたいな感じで、説明書きと例文
が幾つか記載されています。
"EnvFolderPath" とか "EnvName" は何を調べれば良いのか良く
わからなかったので、素直にデスクトップに有るショートカットを流用しました。
f:id:kandennti:20160408185329p:plain
ブログの都合上、横長になりすぎると見難い為、こんな感じの
バッチファイルにしました。

@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

確かに表示されました。
f:id:kandennti:20160408185339p:plain
タイミングが良いような悪いようなわかりませんが、もう少しで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でツールバーに登録した状態での結果はこちら
f:id:kandennti:20160408185352p:plain
点の数が少ないので何とも言いがたいのですが・・・。
本当はこちらを意識して50000点でも挑戦してみましたが
sirenを利用し、点を作成してみる - C#ATIA
30分以上やっても終了しなかったので諦めました。


CATIAを起動した状態でCATScriptファイルを実行した結果はこちら
f:id:kandennti:20160408185358p:plain
若干遅いぐらいで、大差ないのです。
以前、 "CATVBAでは遅いので、何時もCATScriptで作ってます"
のような事を見たことがあるのですが、そんな感じしないんだけどなぁ。
何か方法があるのかな?
明らかなので、50000点は挑戦もしませんでした。


続いて、今回テストしたいバッチモード起動でCATScriptファイルを実行した
結果はこちら
f:id:kandennti:20160408185405p:plain
5000点で手ごたえを感じたので、50000点も挑戦しています。
sirenを利用しIgesを作成する方法に比べれば、かなり遅いのですが
素の状態で挑むより、かなり実感できます。


バッチモードで、引数渡しでマクロを実行したいと試しているのですが、
上手く行かない。 多分出来ると思うのですが・・・。