💻

メモ帳だけでiCAD×VB

に公開

はじめに

今回は、ExcelVBAではなくVisualBasic(VB)を使用してiCADの操作を自動化していきます。
VBはExcelVBAと違いExcelを起動する必要がなく、exeファイルを実行するだけでいいので
実行側としてはシンプルになります。

ただし、通常はVBアプリを開発しようとすると「Visual Studio」というソフトが必要となり、
会社で使おうとするとなかなかいいお値段がするため、これを使用せずに
メモ帳やcursorなどの無料で使用できる環境のみで開発を進めていきます。

前提環境

  • windows PC
  • 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)

本編

メモ帳でiCAD×VB開発の課題

「Visual Studio」を使用せずにiCAD×VBアプリを開発するにあたり、
下記2点の問題があります。

  • コンパイルをどうするか
  • iCADの操作に必要なInterop.ICADOLEA.dllをどうやって参照するか

1.コンパイルをどうするか

VBはコードを書いたらすぐに使用できるVBAとは違い、「コンパイル」という工程を踏む必要があります。

コンパイルとは?

コンパイルとは、プログラムのコードをコンピュータが理解できる形式に変換するプロセスです。
具体的には、VBで書かれたソースコードを実行可能なファイルに変換します。
これにより、プログラムを実行できるようになります

コンパイルの流れ

  1. ソースコードを書く: まず、VBのコードをテキストエディタや統合開発環境(IDE)で書きます。例えば、Visual Studioがよく使われます。
  2. コンパイルする: 書いたコードをコンパイルします。これにより、コードが実行可能な形式(例えば.exeファイル)に変換されます。
  3. 実行する: コンパイルされたファイルを実行して、プログラムが動作するか確認します。

Visual Studioなどの開発環境で開発する場合は「コンパイル」ボタンを押すだけで出来ますが、
今回はメモ帳などの環境で開発する為そんなボタンはありません。

その為、何らかの方法でコンパイルする必要がありますが、Windowsでは標準で
VBやC言語をコンパイルする為の「コンパイラ」というものが搭載されています。

参考:
https://rimako-secha.com/vscode_vb_build_1/

その為、このコンパイラを使用することでVisual Studioが無くてもターミナルを使用して
コマンドプロンプトでコンパイルをすることが出来ます。

コンパイル時の指定
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\vbc HelloWorld.vb
コンパイル時の指定(コマンドプロンプト非表示版)
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\vbc /target:winexe HelloWorld.vb

2.iCADの操作に必要なInterop.ICADOLEA.dllをどうやって参照するか

VBAでの開発時にも「ICADOLEA.tlb」最初に必ず読み込んでいるように、
VBで開発する際も、iCADを外部から操作するには「Interop.ICADOLEA.dll」という
ファイルを参照し、読み込む必要があります。

こちらもVisual StudioであればExcelVBAと同じく参照設定をして
プログラム内でオブジェクトを呼び出せばいいだけですが、
メモ帳での開発ではそうはいきません。

上述したコマンドプロンプトでのコンパイル時に、参照するDLLファイルも
一緒に記述することで、「Interop.ICADOLEA.dll」を参照するアプリが出来上がります。

コンパイル時の指定(dll参照追加)
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\vbc /target:winexe HelloWorld.vb  /reference:C:\ICADSX\HELP\Interop.ICADOLEA.dll

※必要に応じて「/reference:System.Windows.Forms.dll」や「/reference:System.Drawing.dll 」のように
他の参照先も追加してください。

ただし、毎回上記のような指定をかくのはめんどくさいので、batファイルを作成して
vbファイルのファイル名とコマンドプロンプトの表示/非表示のみ選択することで
簡単にコンパイルを出来るようにしています。

vb_icad_compile.bat
@echo off
setlocal

rem ユーザー入力
set /p FILENAME=コンパイルするファイル名(拡張子不要)を入力してください:
set /p SHOW_CONSOLE=ターミナル表示あり:1 なし:0 を入力してください(0 or 1):

rem 拡張子付ファイル名
set VBFILE="%FILENAME%.vb"

rem コンパイラのパス
set VBC="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\vbc"

rem ICADOLEA DLLのパス
set ICADOLEA_LIB="C:\ICADSX\HELP\Interop.ICADOLEA.dll"

rem コンパイル実行
if "%SHOW_CONSOLE%"=="1" (
    %VBC% %VBFILE% ^
        /reference:%ICADOLEA_LIB%
) else (
    %VBC% /target:winexe %VBFILE% ^
        /reference:%ICADOLEA_LIB%
)

pause
endlocal

サンプルアプリの作成

では、実際にVBを使用してiCADと連携させたアプリを作成していきます。
とりあえず今開いている図面のファイル名とフォルダパスを取得していきます。

コーディング

基本のコード

icad_path.vb
Imports System
Imports System.Runtime.InteropServices

Module Program
    Sub Main()

    End Sub
End Module

【解説】
まずはVBで基本的に必要となるコードを書いていきます。
Imports 〇〇は、プログラム内で使う標準機能やCOMオブジェクト関連の機能を使うために「インポート」しています。
今回はiCADのオブジェクトを呼び出すのに最低限必要なライブラリをインポートしています。

Module Program>End Moduleは、ExcelVBAでいう標準モジュールに相当する部分です。
Sub Main()>End SubはExcelVBAと同じく、機能ごとに作成するプロシージャーです。
今回はMainプロシージャのみ作成し、その中に全ての処理を追記していきます。

変数の宣言

icad_path.vb
' iCADオブジェクトの格納用変数の宣言
Dim iCADObj As Object

'ファイル名とフォルダパスを格納する変数を宣言
Dim filePath As String = ""
Dim fileName As String = ""
Dim folderPath As String = ""

【解説】
続いて、Mainプロシージャの中で各種変数を宣言していきます。

今回は全てMainプロシージャの中で宣言しますが、複数のプロシージャで使用する変数は
プロシージャの外で「モジュール変数」として宣言します。

Try処理

icad_path.vb
Try
    '(中身)
Finally
    '(後片付け)
End Try

【解説】
続いて、Try処理を記述します。
今回は基本的にこの中に処理を記述していきます。

Try~Finallyは、「絶対にやってほしい後片付け」があるときによく使います。
エラー(例外)が起こった場合でも、「Finally」に書かれた後片付けは必ず実行されます。
これにより、「途中で失敗しても、リソースやメモリを確実に解放し安全に終わる」仕組みになっています。

ライブラリの呼び出しと解放

icad_path.vb
Try
+	'ライブラリからiCADの操作を司るオブジェクトを呼び出す
+	iCADObj = CreateObject("ICAD.Application") 
Finally
+	If Not iCADObj Is Nothing Then
+		While System.Runtime.InteropServices.Marshal.ReleaseComObject(iCADObj) > 0 
+		End While
+	End If
End Try

【解説01_呼び出し】
まずはTryのすぐあとで、ExcelVBAと同じくiCADの操作に必須となるライブラリの呼び出しを行っています。

【解説02_解放】
Finallyの後で呼び出したiCADのオブジェクトをメモリから解放する処理をしています。
これを使わないと、「裏でiCADを呼び出したまま」などの問題が起きることがあります。
Whileループで何度も呼んでいるのは、オブジェクトが完全に解放されるまで繰り返し実行するためです。

ファイル・フォルダ名の取得を行う

icad_path.vb
Try
	'ライブラリからiCADの操作を司るオブジェクトを呼び出す
	iCADObj = CreateObject("ICAD.Application") 

+	If iCADObj.ActiveDrawing.Path = "" Then 
+		MsgBox("未保存の図面です。" &  vbCrLf & "保存してから再度実行してください。") 
+	Else
+		fileName = iCADObj.ActiveDrawing.FileName ' ファイル名を取得
+		folderPath = iCADObj.ActiveDrawing.Path ' フォルダパスを取得
+
+		MsgBox("ファイル:" & fileName &  vbCrLf & "フォルダ:" & folderPath) 
+
+	End If
Finally
	If Not iCADObj Is Nothing Then
		While System.Runtime.InteropServices.Marshal.ReleaseComObject(iCADObj) > 0 
		End While
	End If
End Try

【解説】

  1. iCADの現在の図面(ActiveDrawing)が保存されているかどうか判定

    • iCADObj.ActiveDrawing.Path = ""
      → パスが空なら「まだ保存していない新規図面」なので、その旨をメッセージ表示。
  2. 保存済みの場合

    • FileName(ファイル名)と、Path(フォルダ・パス)を取得
    • 「ファイル名」と「フォルダパス」をMsgBoxでユーザーに表示
完成したコード
icad_path.vb
Imports System
Imports System.Runtime.InteropServices

Module Program
    Sub Main()

'==========
' 変数の宣言
'==========

	' iCADオブジェクトの格納用変数の宣言
	Dim iCADObj As Object

	'ファイル名とフォルダパスを格納する変数を宣言
	Dim filePath As String = ""
        Dim fileName As String = ""
        Dim folderPath As String = ""

'====================
' 保存先フォルダの取得
'====================

	Try
		'ライブラリからiCADの操作を司るオブジェクトを呼び出す
		iCADObj = CreateObject("ICAD.Application") 

		If iCADObj.ActiveDrawing.Path = "" Then 
			MsgBox("未保存の図面です。" &  vbCrLf & "保存してから再度実行してください。") 
         	Else
                	fileName = iCADObj.ActiveDrawing.FileName ' ファイル名を取得
                	folderPath = iCADObj.ActiveDrawing.Path ' フォルダパスを取得

			MsgBox("ファイル:" & fileName &  vbCrLf & "フォルダ:" & folderPath) 

            	End If
	Finally
		If Not iCADObj Is Nothing Then
			While System.Runtime.InteropServices.Marshal.ReleaseComObject(iCADObj) > 0 
			End While
		End If
	End Try

    End Sub
End Module

コンパイル

コマンドプロンプトで、下記のコマンドでコンパイルします。

コンパイル時の指定
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\vbc /target:winexe icad_path.vb  /reference:C:\ICADSX\HELP\Interop.ICADOLEA.dll

さいごに

今回は、VBを使用したiCADの操作自動化について解説しました。
この記事が業務効率化の参考になれば幸いです。

Discussion