💻

はじめてのiCAD×VBA その3

2025/01/30に公開

はじめに

VBAでiCADを操作する方法を教えてもらったので、その備忘録の第三弾です。
前回は第一弾で作成したマクロから、作成する矩形の寸法をフォームで入力して指定できるようにしましたが、今回は作成した矩形を自動でパーツ化していきたいと思います。

前回作ったVBAコード

処理内容

  1. 入力フォームを表示し
  2. 入力された寸法の矩形を作成し
  3. いい感じの位置に配置する

コード

はじめての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を「コマンドモード」で実行する

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. マクロの記録を開始(partsという名前で保存)
  2. アイコンメニューより「パーツを作成」を選択
  3. 前回のフォームで作成した矩形を選択
  4. パーツの名前、コメントを入力して「OK」を押す
    • パーツ名:BASE
    • コメント:ベースプレート
  5. マクロの記録を終了

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

parts
/* MACREC_COMMENT_BEGIN                                                         
/* MACREC_COMMENT--------------------------------------------------------       
/* MACREC_COMMENT マクロ記録はこの位置にコメントを追加または削除します。        
/* MACREC_COMMENT--------------------------------------------------------       
/* MACREC_COMMENT--------------------------------------------------------       
/* MACREC_COMMENT_END                                                           
@SUPKER 
=0                                                                              
@SUPKER                                                                         
=1                                                                              
;TD4MAK                                                                         
;JKT0                                                                           
@IOFF                                                                           
@IOFF                                                                           
;OPNPD                                                                          
@IOFF                                                                           
@IOFF                                                                           
;OUTCRT                                                                         
@SUPKER                                                                         
=0                                                                              
S        1 X        10.55147824 Y        -2.00218128 Z        -7.1063955        
4 ,                                                                             
@GO                                                                             
.SHORI /1/                                                                      
.PARTSNAME /BASE                                    /                           
.LAYER /  0/                                                                    
.COMMENT1 /ベースプレート                                 /                           
.COMMENT2 /         /                                                           
@SUPKER                                                                         
=1                                                                              

記録したマクロの中身

マクロファイルは「C:\ICADSX\USER\MACRO」に記録した名前(今回でいうと「parts」)で保存されています。

コメント

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

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

parts
@SUPKER 
=0                                                                              
@SUPKER                                                                         
=1 

パーツ作成に関するコマンドその1

parts
;TD4MAK 'パーツ作成
;JKT0 '自動基準点

パーツ作成に関するコマンドその2
[プレビュー開設]ON/OFFの選択
今回は開設していないので「@IOFF」。
「@IOFF」は多分1個でいい

parts
@IOFF                                                                           
@IOFF                                                                           
;OPNPD                                                                          

パーツ作成に関するコマンドその3
[切出し作成]ON/OFFの選択(内部パーツか、外部パーツか?)
今回は内部パーツで作成なので「@IOFF」。
「@IOFF」は多分1個でいい

parts
@IOFF                                                                           
@IOFF                                                                           
;OUTCRT 

マクロ記録時に勝手に追加されるコード
これもいらない

parts
@SUPKER                                                                         
=0 

パーツ作成に関するコマンドその4
どこにある要素をパーツ化するかを指定しています。

  • S:画面の表示角度。VBA移植時には座標だけ指定するので「S  1」はいらない。
  • X:X軸の座標。
  • Y:Y軸の座標。
  • Z:Z軸の座標。
parts
S        1 X        10.55147824 Y        -2.00218128 Z        -7.1063955        
4 ,

右クリック(GO)

parts
@GO

パーツ作成時のウィンドウに入力する内容に関するコードその1
表示されたパーツ名入力ウィンドウで「OK」を押したことを示す?
とりあえずそのまま入れておく。

parts
.SHORI /1/

パーツ作成時のウィンドウに入力する内容に関するコードその2
パーツの名前を設定する。
余計な空白は多分パーツ名に設定できる文字数?
VBAに移植するときは余計な空白はいらない。

parts
.PARTSNAME /BASE                                    /

パーツ作成時のウィンドウに入力する内容に関するコードその3
パーツを配置するレイヤを選択する。
特に指定がなければこのまま。(0=レイヤ引継ぎ)

parts
.LAYER /  0/

パーツ作成時のウィンドウに入力する内容に関するコードその4
パーツのコメントを設定する。
余計な空白は多分パーツコメントに設定できる文字数?
VBAに移植するときは余計な空白はいらない。

parts
.COMMENT1 /ベースプレート                                 /

パーツ作成時のウィンドウに入力する内容に関するコードその5
切り出し(外部パーツ)でパーツ化するときに入力する図面名を設定する。
余計な空白は多分設定できる文字数?
VBAに移植するときは余計な空白はいらない。

parts
.COMMENT2 /         /

マクロ記録時に勝手に追加されるコード
これもいらない

parts
@SUPKER                                                                         
=1 

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

parts
;TD4MAK                                                                         
;JKT0                                                                           
@IOFF                                                                           
;OPNPD                                                                          
@IOFF                                                                           
;OUTCRT                                                                         
X        10.55147824 Y        -2.00218128 Z        -7.10639554 ,                    @GO                                                                             
.SHORI /1/                                                                      
.PARTSNAME /BASE                                    /                           
.LAYER /  0/                                                                    
.COMMENT1 /ベースプレート                                 /                           
.COMMENT2 /         /                                                           

ExcelVBAに必要部分を移植

まずはコマンド格納先の変数をクリアして、座標の指定までの部分をVBAに書き換える。
処理の1行目に「@ZOOMFUL」を入れることで最初に全画面表示を行い、画面が全然違うところを表示していても作成した矩形が見えるようにする。
(勉強会の際の検証で、画面に矩形が表示されていないと座標指定をしてもパーツ化されないことが判明)

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

iCADMac = iCADMac & "@ZOOMFUL" & vbCr '全画面表示
iCADMac = iCADMac & ";TD4MAK;JKT0" & vbCr
iCADMac = iCADMac & "@IOFF;OPNPD" & vbCr
iCADMac = iCADMac & "@IOFF;OUTCRT" & vbCr

続いて、XYZの座標を指定する。
座標は前回の配置の時に0 0 0に矩形の端が来るように配置したので、0 0 0を指定します。
見やすいようにそれぞれ行を分けておく

はじめてのiCAD×VBA.xlsm
iCADMac = iCADMac & "X " & "0" & vbCr
iCADMac = iCADMac & "Y " & "0" & vbCr
iCADMac = iCADMac & "Z " & "0" & " ," & vbCr
iCADMac = iCADMac & "@GO" & vbCr

続いて、残りの処理をVBAに書き換える。
パーツ名やコメントはフォームで入力するようにもできそう。

はじめてのiCAD×VBA.xlsm
iCADMac = iCADMac & ".SHORI " & "/1/" & vbCr
iCADMac = iCADMac & ".PARTSNAME " & "/BASE/" & vbCr
iCADMac = iCADMac & ".LAYER " & "/  0/" & vbCr
iCADMac = iCADMac & ".COMMENT1 " & "/ベースプレート/" & vbCr
iCADMac = iCADMac & ".COMMENT2 " & "//" & vbCr

最後に、「iCADMac」に格納したコードを実行するコマンドを入れる。
最後の実行モードが矩形の配置は「MODE_COMMAND」なのに「MODE_MACRO」になっているが、今回のコードを「MODE_COMMAND」で実行するとエラーを吐いて実行されなかったので、「MODE_MACRO」で実行する。
VB I/Fに関するHelpによると「MODE_COMMAND」は

指定文字列がICAD内のコマンド入力領域に直接指定された時と同等の処理で実行します。

とのことなので、おそらくiCADの画面上でコマンドを選択したり寸法や座標を入力する部分は「MODE_COMMAND」で実行できるが、今回出てきた「パーツ作成時の入力ウィンドウ」のような別画面に何か入力する等のコマンド以外の動作は「MODE_MACRO」で実行する必要があると思われる。

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

前回までのコードとドッキングするとこうなる。

はじめての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

最後に

今回は作成した矩形を、自動的にパーツ化するようにしてみました。
だんだんとiCADで記録したマクロの中身や、VBAへの移植にあたっての注意点が見えてきました。
間違い等あればDM,コメント等でご指摘いただけますと幸いです。
次回はパーツ化したパーツに材質を設定するようにしていきたいと思います。
(そういえばiCADを起動しているかのチェックや三次元かのチェックもしていないのでそのうち入れたい)
続き⇒
https://zenn.dev/nakashun_mf/articles/931bf779439798

Discussion