はじめてのiCAD×VBA その6
はじめに
VBAでiCADを操作する方法を教えてもらったので、その備忘録の第六弾です。
前回はものづくりのススメさんの記事を参考に自分でプログラムを触ってみましたが、今回は講習会で行った”面取りの作成”について書いていきます。
前回作ったVBAコード
処理内容
- iCADが開いているか確認して
- 三次元が開いているか確認して
- 入力フォームを表示して
- 入力された寸法の矩形を作成し
- いい感じの位置に配置して
- パーツ化する
- パーツ名:BASE
- コメント:ベースプレート
- 作成したパーツへ材質を設定する(A5052P)
コード
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はオブジェクトを格納するときに使用する
'★★★iCADの起動確認★★★
'ものづくりのススメさんのライブラリ(ICAD_Contorol.bas)を使用。
'https://rivi-manufacturing.com/homebrew-tools/icad-sx/14164/
If IsICADActive(iCADObj) = False Then
Exit Sub
End If
'★★★3次元へ移動★★★
'ものづくりのススメさんのライブラリ(ICAD_Contorol.bas)を使用。
'https://rivi-manufacturing.com/homebrew-tools/icad-sx/14164/
If ActivateICAD3DView(iCADObj) = False Then
Exit Sub
End If
'★★★矩形の配置★★★
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
前提環境
- 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を開き、アイコンメニューの「ツール」タブよりマクロの記録を行います。
行った動作は下記の通り。
- マクロの記録を開始(blendという名前で保存)
- 視点を「ユーザービュー1」に切り替える
- 「全体表示」する
- 表示を「WIRE表示」にする
- アイコンメニューより「面取りを作成する」を選択
- 四つ角のうち、見えている辺を3点選択
- 右クリックでGO
- 表示を「CG縁あり」に戻す
- マクロの記録を終了
記録したマクロは下記の通り。
/* MACREC_COMMENT_BEGIN
/* MACREC_COMMENT--------------------------------------------------------
/* MACREC_COMMENT マクロ記録はこの位置にコメントを追加または削除します。
/* MACREC_COMMENT--------------------------------------------------------
/* MACREC_COMMENT--------------------------------------------------------
/* MACREC_COMMENT_END
@SUPKER
=0
@USRVW1
=0
@ZOOMFUL
@WFET2
=0
@GO
@SUPKER
=1
;BLEND
;CNR
;SNG
@SUPKER
=0
.RADIUS 10
S 1 X -1.83200439 Y 3.02721404 Z -1.1952108
0 ,
S 1 X -35.52106705 Y -30.01524922 Z 65.5363277
3 ,
S 1 X 71.12567819 Y -82.46555335 Z 11.3399066
6 ,
S 1 X 104.81915051 Y -50.28293114 Z -54.5362001
6 ,
@GO
@WFONCG
/ON/
@CGET2
=0
@GO
@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
視点を「ユーザービュー1」に切り替える。
V8L3コマンドキーワード一覧(SXPROKEY.chm)によると視点の「ユーザービュー1」への切り替えは@USRVW1 0
とのことなのでイコールはいらないっぽい
@USRVW1
=0
事前準備その2
「全体表示」する
@ZOOMFUL
事前準備その3
表示を「WIRE表示」にする
こうすることでCG表示だと隠れて見えない部分も視点移動なして選択できるようになる。
(座標指定する際に、指定した稜線が画面から見えている必要がある)
こちらもV8L3コマンドキーワード一覧(SXPROKEY.chm)によると表示の「WIRE表示」への切り替え@WFET2 0
とのことなのでイコールはいらないっぽい
@WFET2
=0
面取りに関する処理1
1か所づつ稜線を指定して面取りをします という意味の命令
;BLEND '角編集
;CNR '[面取り]
;SNG '[単一処理]
マクロ記録時に勝手に追加されるコード
いらない
@SUPKER
=0
面取りに関する処理2
面取り長を指定
.RADIUS 10
面取りに関する処理3
どこの座標ある稜線(辺)を面取りするかを指定しています。
- S:マクロ記録時に表示されている”画面上”の座標。(画面角度・拡大縮小状態)
VBA移植時には座標だけ指定するので「S 1」はいらない。 - X:X軸の座標。
- Y:Y軸の座標。
- Z:Z軸の座標。
S 1 X -1.83200439 Y 3.02721404 Z -1.1952108
0 ,
S 1 X -35.52106705 Y -30.01524922 Z 65.5363277
3 ,
S 1 X 71.12567819 Y -82.46555335 Z 11.3399066
6 ,
S 1 X 104.81915051 Y -50.28293114 Z -54.5362001
6 ,
面取りに関する処理4
右クリック(GO)
@GO
表示に関する処理
WIRE表示にしていたのを[CG表示 縁あり]に変更する。
対象は選択せずにGOすることで全て[CG表示 縁あり]に変更する。
こちらもV8L3コマンドキーワード一覧(SXPROKEY.chm)によると表示の「CG表示 縁あり」への切り替え@WFONCG ON @CGET2 0
とのことなのでイコールはいらないっぽい
@WFONCG
/ON/
@CGET2
=0
@GO
マクロ記録時に勝手に追加されるコード
いらない
@SUPKER
=1
いらないコードを省くとこうなる
@USRVW1 0
@ZOOMFUL
@WFET2 0
;BLEND
;CNR
;SNG
.RADIUS 10
X -1.83200439 Y 3.02721404 Z -1.19521080 ,
X -35.52106705 Y -30.01524922 Z 65.53632773 ,
X 71.12567819 Y -82.46555335 Z 11.33990666 ,
X 104.81915051 Y -50.28293114 Z -54.53620016 ,
@WFONCG ON @CGET2 0
@GO
ExcelVBAに必要部分を移植
まずはコマンド格納先の変数をクリアして
iCADMac = "" 'コマンド格納先の変数をクリア
とりあえず「MODE_command」で実行できる「@」で始まるコマンドの部分だけ格納して
iCADMac = iCADMac & "@USRVW1 0 @ZOOMFUL @WFET2 0 @GO" & vbCr 'iCADMacに対して値を追記
MODE_commandで実行する。
iCADObj.RunCommand iCADMac, MODE_COMMAND
もう一度変数をクリアして
iCADMac = "" 'コマンド格納先の変数をクリア
面取りに関する部分と面取り長を指定する部分を移植。
iCADMac = iCADMac & ";BLEND;CNR;SNG" & vbCr
iCADMac = iCADMac & ".Radius " & "10" & vbCr
面取り対象の稜線の座標を4箇所入れる。
XとZはそれぞれフォームに入力した値をそのまま指定し、
Yは端を選ぶと、角に接している稜線3個のどれを選ぶかわからないので
半分にして対象の稜線の真ん中を指定するようにする。
'面取り対象指定その1
iCADMac = iCADMac & "X " & Width & vbCr
iCADMac = iCADMac & "Y " & Height / 2 & vbCr
iCADMac = iCADMac & "Z " & Depth & " ," & vbCr
'面取り対象指定その2
iCADMac = iCADMac & "X " & Width & vbCr
iCADMac = iCADMac & "Y " & Height / 2 & vbCr
iCADMac = iCADMac & "Z " & "0" & " ," & vbCr
'面取り対象指定その3
iCADMac = iCADMac & " X " & "0" & vbCr
iCADMac = iCADMac & " Y " & Height / 2 & vbCr
iCADMac = iCADMac & " Z " & Depth & " ," & vbCr
'面取り対象指定その4
iCADMac = iCADMac & " X " & "0" & vbCr
iCADMac = iCADMac & " Y " & Height / 2 & vbCr
iCADMac = iCADMac & " Z " & "0" & " ," & vbCr
最後に@GO
と表示をCG表示 縁ありに戻して
iCADMac = iCADMac & "@GO" & vbCr
iCADMac = iCADMac & "@WFONCG ON @CGET2 0 @GO" & vbCr
今度は「.」から始まる命令文を含むためMODE_MACROで実行する。
iCADObj.RunCommand iCADMac, MODE_MACRO
今回のコードをまとめるとこうなる。
'★★★面取り★★★
iCADMac = "" 'コマンド格納先の変数をクリア
iCADMac = iCADMac & "@USRVW1 0 @ZOOMFUL @WFET2 0 @GO" & vbCr 'iCADMacに対して値を追記
iCADObj.RunCommand iCADMac, MODE_COMMAND
iCADMac = "" 'コマンド格納先の変数をクリア
iCADMac = iCADMac & ";BLEND;CNR;SNG" & vbCr
iCADMac = iCADMac & ".Radius " & "10" & vbCr
'面取り対象指定その1
iCADMac = iCADMac & "X " & Width & vbCr
iCADMac = iCADMac & "Y " & Height / 2 & vbCr
iCADMac = iCADMac & "Z " & Depth & " ," & vbCr
'面取り対象指定その2
iCADMac = iCADMac & "X " & Width & vbCr
iCADMac = iCADMac & "Y " & Height / 2 & vbCr
iCADMac = iCADMac & "Z " & "0" & " ," & vbCr
'面取り対象指定その3
iCADMac = iCADMac & " X " & "0" & vbCr
iCADMac = iCADMac & " Y " & Height / 2 & vbCr
iCADMac = iCADMac & " Z " & Depth & " ," & vbCr
'面取り対象指定その4
iCADMac = iCADMac & " X " & "0" & vbCr
iCADMac = iCADMac & " Y " & Height / 2 & vbCr
iCADMac = iCADMac & " Z " & "0" & " ," & vbCr
iCADMac = iCADMac & "@GO" & vbCr
iCADMac = iCADMac & "@WFONCG ON @CGET2 0 @GO" & vbCr
iCADObj.RunCommand iCADMac, MODE_MACRO
'iCADObj.RunCommand=VBAからiCADへ「iCADMac」に格納されたコマンドを受け渡す
'MODE_COMMAND=受け渡したコマンドをiCADを「マクロモード」で実行する
'".SHORI "以降の処理がコマンドモードでは存在しない為、マクロモードで実行
'参考:今回の処理をコマンドBOXで取り出すと→;@SUPKER 1;BLEND;CNR;SNG;@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はオブジェクトを格納するときに使用する
'★★★iCADの起動確認★★★
'ものづくりのススメさんのライブラリ(ICAD_Contorol.bas)を使用。
'https://rivi-manufacturing.com/homebrew-tools/icad-sx/14164/
If IsICADActive(iCADObj) = False Then
Exit Sub
End If
'★★★3次元へ移動★★★
'ものづくりのススメさんのライブラリ(ICAD_Contorol.bas)を使用。
'https://rivi-manufacturing.com/homebrew-tools/icad-sx/14164/
If ActivateICAD3DView(iCADObj) = False Then
Exit Sub
End If
'★★★矩形の配置★★★
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
'★★★面取り★★★
iCADMac = "" 'コマンド格納先の変数をクリア
iCADMac = iCADMac & "@USRVW1 0 @ZOOMFUL @WFET2 0 @GO" & vbCr 'iCADMacに対して値を追記
iCADObj.RunCommand iCADMac, MODE_COMMAND
iCADMac = "" 'コマンド格納先の変数をクリア
iCADMac = iCADMac & ";BLEND;CNR;SNG" & vbCr
iCADMac = iCADMac & ".Radius " & "10" & vbCr
'面取り対象指定その1
iCADMac = iCADMac & "X " & Width & vbCr
iCADMac = iCADMac & "Y " & Height / 2 & vbCr
iCADMac = iCADMac & "Z " & Depth & " ," & vbCr
'面取り対象指定その2
iCADMac = iCADMac & "X " & Width & vbCr
iCADMac = iCADMac & "Y " & Height / 2 & vbCr
iCADMac = iCADMac & "Z " & "0" & " ," & vbCr
'面取り対象指定その3
iCADMac = iCADMac & " X " & "0" & vbCr
iCADMac = iCADMac & " Y " & Height / 2 & vbCr
iCADMac = iCADMac & " Z " & Depth & " ," & vbCr
'面取り対象指定その4
iCADMac = iCADMac & " X " & "0" & vbCr
iCADMac = iCADMac & " Y " & Height / 2 & vbCr
iCADMac = iCADMac & " Z " & "0" & " ," & vbCr
iCADMac = iCADMac & "@GO" & vbCr
iCADMac = iCADMac & "@WFONCG ON @CGET2 0 @GO" & vbCr
iCADObj.RunCommand iCADMac, MODE_MACRO
'iCADObj.RunCommand=VBAからiCADへ「iCADMac」に格納されたコマンドを受け渡す
'MODE_COMMAND=受け渡したコマンドをiCADを「マクロモード」で実行する
'".SHORI "以降の処理がコマンドモードでは存在しない為、マクロモードで実行
'参考:今回の処理をコマンドBOXで取り出すと→;@SUPKER 1;BLEND;CNR;SNG;@SUPKER 0
Unload Me
'テキストボックスの値を削除する(MsgBOXを前にするとMsgBOXも消えるので、先に処理する)
MsgBox ("実行完了しました")
End Sub
最後に
今回は4隅に面取りを入れました。
最初講習会で作ったときは視点を2回切り替えて稜線を指定していたのですが、iCAD社様にいい方法はないか相談したところ「ワイヤ表示に切り替えると視点の切り替えがいらないのではないか」と助言を頂き目から鱗でした...
次回は作成したパーツに必要な情報を設定していきます。
Discussion