💻

はじめてのiCAD×VBA その4

2025/02/04に公開

はじめに

VBAでiCADを操作する方法を教えてもらったので、その備忘録の第四弾です。
前回は第二弾で作成したマクロから、作成した矩形を自動でパーツ化するようにしましたが、今回はパーツに自動で材質を設定するようにしたいと思います。

前回作ったVBAコード

処理内容

  1. 入力フォームを表示し
  2. 入力された寸法の矩形を作成し
  3. いい感じの位置に配置して
  4. パーツ化する
    • パーツ名:BASE
    • コメント:ベースプレート

コード

はじめてのiCAD×VBA.xlsm
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を開き、アイコンメニューの「ツール」タブよりマクロの記録を行います。
行った動作は下記の通り。

  1. マクロの記録を開始(materialという名前で保存)
  2. アイコンメニューより「一覧から選んで材質設定する」を選択
  3. ツリービューの、前回作成したパーツ(BASE)を右クリックし選択(S)をクリック
  4. 右クリックでGO
  5. 設定する材質(今回はA5052P)を選択し、OKを押す
  6. マクロの記録を終了

記録したマクロは下記の通り。

material
/* 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」)で保存されています。

コメント

material
/* MACREC_COMMENT_BEGIN                                                         
/* MACREC_COMMENT--------------------------------------------------------       
/* MACREC_COMMENT マクロ記録はこの位置にコメントを追加または削除します。        
/* MACREC_COMMENT--------------------------------------------------------       
/* MACREC_COMMENT--------------------------------------------------------       
/* MACREC_COMMENT_END   

マクロ記録時に勝手に追加されるコード
キーワードチェックとやらを有効化(0)・無効化(1)しているらしい。
無くても動くためVBA移植時は削除する。

material
@SUPKER 
=0                                                                              
@SUPKER                                                                         
=1 

材質設定に関するコード1
材質を設定するにあたり最低限必要となるコード

material
;VOL3D '体積測定コマンド
;SET0 ' 材質設定
;SET1 '設定

マクロ記録時に勝手に追加されるコード
上述の通りいらない。

material
@SUPKER                                                                         
=0                                                                              

ツリービューでのパーツ選択に関するコード1
こちらの@ENTはV8L3コマンドキーワード一覧(SXPROKEY.chm)で調べたところ、恐らくパーツを右クリックして「確認(U)」を押したときに出てくるっぽいコマンドでした。
今回は「選択(S)」を選んだはずなのに何故出てきたかはわかりませんが、無くても動いたので多分要らない。

material
@ENT                                                                            

ツリービューでのパーツ選択に関するコード2
パーツ選択時にユーザーが行う操作に関するコード

material
@PTPIC 'パーツを右クリックして「選択」を押したことを表す
.SELPZ /0/ 'パニングするかしないか。今回はしないので「0」

ツリービューでのパーツ選択に関するコード3
どのパーツを選択するかを表す。

material
.SELCL /\/ '親パーツの階層。今回は最上位階層
.SELNM /BASE/ '対象のパーツ名
@GO

材質設定に関するコード2
設定する材質を指定するコード。
間の空白行と、材質名・材質記号の入力欄の空白はVBAでは無くても動いたので多分要らない。
各行のコマンドと中身は下記の通り。

コマンド 内容
材質名 .ZAI1 .ZAI2
材料記号 .KIG
比重 .HIJYU
材質色 .DIF
反射色 .SPE
反射の強さ .SHI
透明度 .ALP
material
.ZAI1 /アルミ板                                                        /        
                                                                                
.ZAI2 /                                                                /        
                                                                                
.KIG /A5052P                                  /                                 
.HIJYU /      2.6900/                                                           
.DIF /172,169,177, 67/                                                          
.SPE /214,179, 40, 49/                                                          
.SHI / 14/                                                                      
.ALP /100/                                                                      

マクロ記録時に勝手に追加されるコード
上述の通りいらない。

material
@SUPKER 
=0                                                                              
@SUPKER                                                                         
=1 

いらないコードを省くとこうなる

material
;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に書き換える。

はじめてのiCAD×VBA.xlsm
iCADMac = ""  'コマンド格納先の変数をクリア

iCADMac = iCADMac & ";VOL3D;SET0;SET1" & vbCr 'iCADMacに対して値を追記

続いて、残りのコマンドを1行づつVBA方式に置き換えていく

はじめてのiCAD×VBA.xlsm
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」での実行となる。

はじめてのiCAD×VBA.xlsm
iCADObj.RunCommand iCADMac, MODE_MACRO

今回のコードをまとめるとこうなる。

はじめてのiCAD×VBA.xlsm
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
前回までのコードとドッキング
はじめてのiCAD×VBA.xlsm
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

最後に

今回は、前回作成したパーツに対して、材質を設定するようにしました。
次回は何をしようかなぁ...
続き⇒
https://zenn.dev/nakashun_mf/articles/9acb1bd3be144d

Discussion