はじめてのiCAD×VBA その4
はじめに
VBAでiCADを操作する方法を教えてもらったので、その備忘録の第四弾です。
前回は第二弾で作成したマクロから、作成した矩形を自動でパーツ化するようにしましたが、今回はパーツに自動で材質を設定するようにしたいと思います。
前回作ったVBAコード
処理内容
- 入力フォームを表示し
- 入力された寸法の矩形を作成し
- いい感じの位置に配置して
- パーツ化する
- パーツ名:BASE
- コメント:ベースプレート
コード
Private Sub CommandButton1_Click()
Dim iCADObj As Object 'iCADオブジェクト
Dim iCADMac As String 'コマンド格納先
Dim Depth As Long '奥行き格納先
Dim Width As Long '幅格納先
Dim Height As Long '高さ格納先
iCADMac = "" 'コマンド格納先の変数をクリア
Depth = 0 '寸法格納先の変数をクリア
Width = 0 '寸法格納先の変数をクリア
Height = 0 '寸法格納先の変数をクリア
Set iCADObj = CreateObject("ICAD.Application")
'ライブラリからiCADの操作を司るオブジェクトを呼び出す
'Setはオブジェクトを格納するときに使用する
'★★★矩形の配置★★★
Depth = Me.DEPTH_X '変数にテキストボックス(DEPTH_X)の値を挿入
Width = Me.WIDTH_Z '変数にテキストボックス(WIDTH_Z)の値を挿入
Height = Me.HIGHT_Y '変数にテキストボックス(HIGHT_Y)の値を挿入
iCADMac = iCADMac & ";PLAY;BOX" & vbCr 'iCADMacに対して値を追記
iCADMac = iCADMac & ".Depth " & Depth & vbCr
iCADMac = iCADMac & ".Width " & Width & vbCr
iCADMac = iCADMac & ".Height " & Height & vbCr
iCADMac = iCADMac & "0 0 " & Depth & " ,"
iCADObj.RunCommand iCADMac, MODE_COMMAND
'iCADObj.RunCommand=VBAからiCADへ「iCADMac」に格納されたコマンドを受け渡す
'MODE_COMMAND=受け渡したコマンドをiCADを「コマンドモード」で実行する
'★★★パーツ化★★★
iCADMac = "" 'コマンド格納先の変数をクリア
iCADMac = iCADMac & "@ZOOMFUL" & vbCr '全画面表示
iCADMac = iCADMac & ";TD4MAK;JKT0" & vbCr
iCADMac = iCADMac & "@IOFF;OPNPD" & vbCr
iCADMac = iCADMac & "@IOFF;OUTCRT" & vbCr
iCADMac = iCADMac & "X " & "0" & vbCr
iCADMac = iCADMac & "Y " & "0" & vbCr
iCADMac = iCADMac & "Z " & "0" & " ," & vbCr
iCADMac = iCADMac & "@GO" & vbCr
iCADMac = iCADMac & ".SHORI " & "/1/" & vbCr
iCADMac = iCADMac & ".PARTSNAME " & "/BASE/" & vbCr
iCADMac = iCADMac & ".LAYER " & "/ 0/" & vbCr
iCADMac = iCADMac & ".COMMENT1 " & "/ベースプレート/" & vbCr
iCADMac = iCADMac & ".COMMENT2 " & "//" & vbCr
iCADObj.RunCommand iCADMac, MODE_MACRO
'iCADObj.RunCommand=VBAからiCADへ「iCADMac」に格納されたコマンドを受け渡す
'MODE_COMMAND=受け渡したコマンドをiCADを「マクロモード」で実行する
'".SHORI "以降の処理がコマンドモードでは存在しない為、マクロモードで実行
'参考:今回の処理をコマンドBOXで取り出すと→;@SUPKER 1;TD4MAK;JKT0;@IOFF;OPNPD;@IOFF;OUTCRT;@SUPKER 0
Unload Me
'テキストボックスの値を削除する(MsgBOXを前にするとMsgBOXも消えるので、先に処理する)
MsgBox ("実行完了しました")
End Sub
前提環境
- Excelで開発タブの表示
- iCAD SXのダウンロード
参考
「C:\ICADSX\HELP」内にiCADのHelpが格納されています。
- VB I/Fに関するHelp:ICADOLEA.chm
- V8L3コマンドキーワード一覧:SXPROKEY.chm
また、PDFで「コマンド簡易開発ガイド」も用意されており、VBAでの開発とVBでの開発のマニュアルになっています。
(C:/ICADSX/man/development_guide.pdf)
VBAの作成
まずはマクロの記録
iCAD SXを開き、アイコンメニューの「ツール」タブよりマクロの記録を行います。
行った動作は下記の通り。
- マクロの記録を開始(materialという名前で保存)
- アイコンメニューより「一覧から選んで材質設定する」を選択
- ツリービューの、前回作成したパーツ(BASE)を右クリックし選択(S)をクリック
- 右クリックでGO
- 設定する材質(今回はA5052P)を選択し、OKを押す
- マクロの記録を終了
記録したマクロは下記の通り。
/* MACREC_COMMENT_BEGIN
/* MACREC_COMMENT--------------------------------------------------------
/* MACREC_COMMENT マクロ記録はこの位置にコメントを追加または削除します。
/* MACREC_COMMENT--------------------------------------------------------
/* MACREC_COMMENT--------------------------------------------------------
/* MACREC_COMMENT_END
@SUPKER
=0
@SUPKER
=1
;VOL3D
;SET0
;SET1
@SUPKER
=0
@ENT
@PTPIC
.SELPZ /0/
.SELCL /\/
.SELNM /BASE/
@GO
.ZAI1 /アルミ板 /
.ZAI2 / /
.KIG /A5052P /
.HIJYU / 2.6900/
.DIF /172,169,177, 67/
.SPE /214,179, 40, 49/
.SHI / 14/
.ALP /100/
@SUPKER
=1
記録したマクロの中身
マクロファイルは「C:\ICADSX\USER\MACRO」に記録した名前(今回でいうと「parts」)で保存されています。
コメント
/* MACREC_COMMENT_BEGIN
/* MACREC_COMMENT--------------------------------------------------------
/* MACREC_COMMENT マクロ記録はこの位置にコメントを追加または削除します。
/* MACREC_COMMENT--------------------------------------------------------
/* MACREC_COMMENT--------------------------------------------------------
/* MACREC_COMMENT_END
マクロ記録時に勝手に追加されるコード
キーワードチェックとやらを有効化(0)・無効化(1)しているらしい。
無くても動くためVBA移植時は削除する。
@SUPKER
=0
@SUPKER
=1
材質設定に関するコード1
材質を設定するにあたり最低限必要となるコード
;VOL3D '体積測定コマンド
;SET0 ' 材質設定
;SET1 '設定
マクロ記録時に勝手に追加されるコード
上述の通りいらない。
@SUPKER
=0
ツリービューでのパーツ選択に関するコード1
こちらの@ENT
はV8L3コマンドキーワード一覧(SXPROKEY.chm)で調べたところ、恐らくパーツを右クリックして「確認(U)」を押したときに出てくるっぽいコマンドでした。
今回は「選択(S)」を選んだはずなのに何故出てきたかはわかりませんが、無くても動いたので多分要らない。
@ENT
ツリービューでのパーツ選択に関するコード2
パーツ選択時にユーザーが行う操作に関するコード
@PTPIC 'パーツを右クリックして「選択」を押したことを表す
.SELPZ /0/ 'パニングするかしないか。今回はしないので「0」
ツリービューでのパーツ選択に関するコード3
どのパーツを選択するかを表す。
.SELCL /\/ '親パーツの階層。今回は最上位階層
.SELNM /BASE/ '対象のパーツ名
@GO
材質設定に関するコード2
設定する材質を指定するコード。
間の空白行と、材質名・材質記号の入力欄の空白はVBAでは無くても動いたので多分要らない。
各行のコマンドと中身は下記の通り。
コマンド | 内容 |
---|---|
材質名 | .ZAI1 .ZAI2 |
材料記号 | .KIG |
比重 | .HIJYU |
材質色 | .DIF |
反射色 | .SPE |
反射の強さ | .SHI |
透明度 | .ALP |
.ZAI1 /アルミ板 /
.ZAI2 / /
.KIG /A5052P /
.HIJYU / 2.6900/
.DIF /172,169,177, 67/
.SPE /214,179, 40, 49/
.SHI / 14/
.ALP /100/
マクロ記録時に勝手に追加されるコード
上述の通りいらない。
@SUPKER
=0
@SUPKER
=1
いらないコードを省くとこうなる
;VOL3D
;SET0
;SET1
@PTPIC
.SELPZ /0/
.SELCL /\/
.SELNM /BASE/
@GO
.ZAI1 /アルミ板 /
.ZAI2 / /
.KIG /A5052P /
.HIJYU / 2.6900/
.DIF /172,169,177, 67/
.SPE /214,179, 40, 49/
.SHI / 14/
.ALP /100/
ExcelVBAに必要部分を移植
まずはコマンド格納先の変数をクリアして「材質設定に関するコード1」をVBAに書き換える。
iCADMac = "" 'コマンド格納先の変数をクリア
iCADMac = iCADMac & ";VOL3D;SET0;SET1" & vbCr 'iCADMacに対して値を追記
続いて、残りのコマンドを1行づつVBA方式に置き換えていく
iCADMac = iCADMac & "@PTPIC" & vbCr
iCADMac = iCADMac & ".SELPZ " & "/0/" & vbCr
iCADMac = iCADMac & ".SELCL " & "/\/" & vbCr
iCADMac = iCADMac & ".SELNM " & "/BASE/" & vbCr
iCADMac = iCADMac & "@GO" & vbCr
iCADMac = iCADMac & ".ZAI1 " & "/アルミ板/" & vbCr '材質情報を設定
iCADMac = iCADMac & ".ZAI2 " & "//" & vbCr
iCADMac = iCADMac & ".KIG " & "/A5052P/" & vbCr '材質の記号を設定
iCADMac = iCADMac & ".HIJYU " & "/2.6900/" & vbCr
iCADMac = iCADMac & ".DIF " & "/172,169,177, 67/" & vbCr '色情報を設定
iCADMac = iCADMac & ".SPE " & "/214,179, 40, 49/" & vbCr '色情報を設定
iCADMac = iCADMac & ".SHI " & "/14/" & vbCr
iCADMac = iCADMac & ".ALP " & "/100/" & vbCr
最後に、「iCADMac」に格納したコードを実行するコマンドを入れる。
こちらは前回同様に別画面(材質選択画面)での操作を含むため「MODE_MACRO」での実行となる。
iCADObj.RunCommand iCADMac, MODE_MACRO
今回のコードをまとめるとこうなる。
iCADMac = "" 'コマンド格納先の変数をクリア
iCADMac = iCADMac & ";VOL3D;SET0;SET1" & vbCr 'iCADMacに対して値を追記
iCADMac = iCADMac & "@PTPIC" & vbCr
iCADMac = iCADMac & ".SELPZ " & "/0/" & vbCr
iCADMac = iCADMac & ".SELCL " & "/\/" & vbCr
iCADMac = iCADMac & ".SELNM " & "/BASE/" & vbCr
iCADMac = iCADMac & "@GO" & vbCr
iCADMac = iCADMac & ".ZAI1 " & "/アルミ板/" & vbCr '材質情報を設定
iCADMac = iCADMac & ".ZAI2 " & "//" & vbCr
iCADMac = iCADMac & ".KIG " & "/A5052P/" & vbCr '材質の記号を設定
iCADMac = iCADMac & ".HIJYU " & "/2.6900/" & vbCr
iCADMac = iCADMac & ".DIF " & "/172,169,177, 67/" & vbCr '色情報を設定
iCADMac = iCADMac & ".SPE " & "/214,179, 40, 49/" & vbCr '色情報を設定
iCADMac = iCADMac & ".SHI " & "/14/" & vbCr
iCADMac = iCADMac & ".ALP " & "/100/" & vbCr
iCADObj.RunCommand iCADMac, MODE_MACRO
'iCADObj.RunCommand=VBAからiCADへ「iCADMac」に格納されたコマンドを受け渡す
'MODE_COMMAND=受け渡したコマンドをiCADを「マクロモード」で実行する
'".SHORI "以降の処理がコマンドモードでは存在しない為、マクロモードで実行
'参考:今回の処理をコマンドBOXで取り出すと→;@SUPKER 1;VOL3D;SET0;SET1;@SUPKER 0
前回までのコードとドッキング
Private Sub CommandButton1_Click()
Dim iCADObj As Object 'iCADオブジェクト
Dim iCADMac As String 'コマンド格納先
Dim Depth As Long '奥行き格納先
Dim Width As Long '幅格納先
Dim Height As Long '高さ格納先
iCADMac = "" 'コマンド格納先の変数をクリア
Depth = 0 '寸法格納先の変数をクリア
Width = 0 '寸法格納先の変数をクリア
Height = 0 '寸法格納先の変数をクリア
Set iCADObj = CreateObject("ICAD.Application")
'ライブラリからiCADの操作を司るオブジェクトを呼び出す
'Setはオブジェクトを格納するときに使用する
'★★★矩形の配置★★★
Depth = Me.DEPTH_X '変数にテキストボックス(DEPTH_X)の値を挿入
Width = Me.WIDTH_Z '変数にテキストボックス(WIDTH_Z)の値を挿入
Height = Me.HIGHT_Y '変数にテキストボックス(HIGHT_Y)の値を挿入
iCADMac = iCADMac & ";PLAY;BOX" & vbCr 'iCADMacに対して値を追記
iCADMac = iCADMac & ".Depth " & Depth & vbCr
iCADMac = iCADMac & ".Width " & Width & vbCr
iCADMac = iCADMac & ".Height " & Height & vbCr
iCADMac = iCADMac & "0 0 " & Depth & " ,"
iCADObj.RunCommand iCADMac, MODE_COMMAND
'iCADObj.RunCommand=VBAからiCADへ「iCADMac」に格納されたコマンドを受け渡す
'MODE_COMMAND=受け渡したコマンドをiCADを「コマンドモード」で実行する
'★★★パーツ化★★★
iCADMac = "" 'コマンド格納先の変数をクリア
iCADMac = iCADMac & "@ZOOMFUL" & vbCr 'iCADMacに対して値を追記
iCADMac = iCADMac & ";TD4MAK;JKT0" & vbCr
iCADMac = iCADMac & "@IOFF;OPNPD" & vbCr
iCADMac = iCADMac & "@IOFF;OUTCRT" & vbCr
iCADMac = iCADMac & "X " & "0" & vbCr
iCADMac = iCADMac & "Y " & "0" & vbCr
iCADMac = iCADMac & "Z " & "0" & " ," & vbCr
iCADMac = iCADMac & "@GO" & vbCr
iCADMac = iCADMac & ".SHORI " & "/1/" & vbCr
iCADMac = iCADMac & ".PARTSNAME " & "/BASE/" & vbCr
iCADMac = iCADMac & ".LAYER " & "/ 0/" & vbCr
iCADMac = iCADMac & ".COMMENT1 " & "/ベースプレート/" & vbCr
iCADMac = iCADMac & ".COMMENT2 " & "//" & vbCr
iCADObj.RunCommand iCADMac, MODE_MACRO
'iCADObj.RunCommand=VBAからiCADへ「iCADMac」に格納されたコマンドを受け渡す
'MODE_COMMAND=受け渡したコマンドをiCADを「マクロモード」で実行する
'".SHORI "以降の処理がコマンドモードでは存在しない為、マクロモードで実行
'参考:今回の処理をコマンドBOXで取り出すと→;@SUPKER 1;TD4MAK;JKT0;@IOFF;OPNPD;@IOFF;OUTCRT;@SUPKER 0
'★★★材質設定★★★
iCADMac = "" 'コマンド格納先の変数をクリア
iCADMac = iCADMac & ";VOL3D;SET0;SET1" & vbCr 'iCADMacに対して値を追記
iCADMac = iCADMac & "@PTPIC" & vbCr
iCADMac = iCADMac & ".SELPZ " & "/0/" & vbCr
iCADMac = iCADMac & ".SELCL " & "/\/" & vbCr
iCADMac = iCADMac & ".SELNM " & "/BASE/" & vbCr
iCADMac = iCADMac & "@GO" & vbCr
iCADMac = iCADMac & ".ZAI1 " & "/アルミ板/" & vbCr '材質情報を設定
iCADMac = iCADMac & ".ZAI2 " & "//" & vbCr
iCADMac = iCADMac & ".KIG " & "/A5052P/" & vbCr '材質の記号を設定
iCADMac = iCADMac & ".HIJYU " & "/2.6900/" & vbCr
iCADMac = iCADMac & ".DIF " & "/172,169,177, 67/" & vbCr '色情報を設定
iCADMac = iCADMac & ".SPE " & "/214,179, 40, 49/" & vbCr '色情報を設定
iCADMac = iCADMac & ".SHI " & "/14/" & vbCr
iCADMac = iCADMac & ".ALP " & "/100/" & vbCr
iCADObj.RunCommand iCADMac, MODE_MACRO
'iCADObj.RunCommand=VBAからiCADへ「iCADMac」に格納されたコマンドを受け渡す
'MODE_COMMAND=受け渡したコマンドをiCADを「マクロモード」で実行する
'".SHORI "以降の処理がコマンドモードでは存在しない為、マクロモードで実行
'参考:今回の処理をコマンドBOXで取り出すと→;@SUPKER 1;VOL3D;SET0;SET1;@SUPKER 0
Unload Me
'テキストボックスの値を削除する(MsgBOXを前にするとMsgBOXも消えるので、先に処理する)
MsgBox ("実行完了しました")
End Sub
最後に
今回は、前回作成したパーツに対して、材質を設定するようにしました。
次回は何をしようかなぁ...
続き⇒
Discussion