iCAD ✕ VBAライブラリ活用事例解説【正多角柱の自動生成ツール】

iCAD SX 更新:

この記事はこのような人に向けて書いています。

  • VBAでiCAD用ツールを作れるようになりたい人
  • 自作ツールを作って職場で自慢したい人

こんにちは。ゆー です。

今回はこちらの記事で配布したサンプルの解説記事です。

配布したサンプルの中でも正多角柱の自動生成ツールは実用性よりVBAの入門として作成しています。

サンプルツールの内容を詳しく知って、自分独自のツールを作れるようになりましょう!

エクセルシートの作成

ライブラリファイルのインポート

事前の準備として下記記事を参考に、私が配布しているライブラリファイルをインポートしておいてください。

インポートしたエクセルファイルはxlsm形式で保存しておきましょう。

パラメータの入力画面

まずはエクセルのシートに多角柱のパラメータ(寸法など)を入力する画面を作ります。

フォントや色などはあくまで例ですので、ご自身で使いやすいように作成しましょう。

例えばパラメータを入力するセル以外は変更してほしくないので「セルのロック」「シートの保護」機能などを活用するのも有りですね。

Sub プロシージャの作成

VBエディターを起動し、パラメータ入力画面を作成したシートモジュールをダブルクリックしてプログラムを書き込む画面に移動します。

プロシージャ名は「GenerateNgonalCylinder」としています(自由に決めてOKです)。

Sub GenerateNgonalCylinder()

End Sub

Sub ◯◯()を入力すると自動でEnd Subが入力されます。

この「Sub ◯◯() ~ End Sub」 が一つのSubプロシージャです。

今回の正多角柱の自動生成ツールでは一つのSubプロシージャしか使用していませんが、プログラムが複雑になるにつれて、複数のプロシージャを呼び出して使ったりします。

使用したVBAコード要素

  • Sub: Subプロシージャの宣言を行うためのステートメント。最後にEnd Subが必要。

ボタンの追加

プログラムを実行するためにVBエディターをいちいち起動していられないので、自動化ツールには実行ボタンを配置しましょう。

ボタンは開発タブ→挿入→ボタンを選択で作成します。

そして実行したいSubプロシージャを割り当てておきます。

これでボタンをクリックするとプログラムが動くようになります。

コード解説:全体の流れ

この多角形ツールのコード全体は以下の内容です。

先ほど作成したGenerateNgonalCylinderプロシージャに以下の内容を記入するとツールが出来上がります。

Sub GenerateNgonalCylinder()
' ------------------------------------------------------------------------------------------
' 正多角柱の生成
' ------------------------------------------------------------------------------------------

    'iCADオブジェクトの設定
    Dim myObject As Object
    Set myObject = CreateObject("ICAD.Application")
    
    '使用する変数の宣言
    Dim polyNum As Long     'N数を格納する変数
    Dim circR As Double     '外接円の半径を格納する変数
    Dim cylLen As Double    '柱長さを格納する変数
    Dim polyAng As Double   '正N角形の中心角を格納する変数
    Dim i As Long           '繰り返し(For文)のカウントを格納する変数
    Dim dx1 As Double       '直線や矩形作成時に指定する一点目X座標を格納する変数
    Dim dy1 As Double       '直線や矩形作成時に指定する一点目Y座標を格納する変数
    Dim dx2 As Double       '直線や矩形作成時に指定する二点目X座標を格納する変数
    Dim dy2 As Double       '直線や矩形作成時に指定する二点目Y座標を格納する変数
    
    '変数にセルの値を代入
    polyNum = Range("C4").value     'セルの値をそのまま代入
    circR = Range("C5").value / 2   'セルの値は直径なので2で割って代入
    cylLen = Range("C6").value      'セルの値をそのまま代入
    polyAng = 8 * Atn(1) / polyNum  'VBAの計算は度ではなくラジアンになるよう入力する Atn(1)はアークタンジェント1=45度だが、ラジアンではπ/4ラジアン。8倍すれば2π。
    
    '各種寸法が不適切でないか確認する
    'もしもN数が3より小さい場合、メッセージ表示&プログラム終了
    If polyNum < 3 Then
        MsgBox "N数が小さすぎます"
        Exit Sub
    End If
    
    'もしも外接円半径が0以下の場合、メッセージ表示&プログラム終了
    If circR <= 0 Then
        MsgBox "外接円径が不適切です"
        Exit Sub
    End If
    
    'もしも柱長さが0以下の場合、メッセージ表示&プログラム終了
    If cylLen <= 0 Then
        MsgBox "柱長さが不適切です"
        Exit Sub
    End If
    
    'iCADの起動確認
    If IsICADActive(myObject) = False Then
        Exit Sub
    End If
    
    'iCADの新規ウィンドウ作成
    If CreateICADWindow(myObject) = False Then
        Exit Sub
    End If
    
    '2D画面表示
    If ActivateICAD2DView(myObject) = False Then
        Exit Sub
    End If
    
    '多角形を作図する
    '多角形の辺の数だけ、直線の作図を繰り返す
    For i = 1 To polyNum
        dx1 = circR * Sin(polyAng * (i - 1))
        dy1 = circR * Cos(polyAng * (i - 1))
        dx2 = circR * Sin(polyAng * i)
        dy2 = circR * Cos(polyAng * i)
        If DrawLine_Between(myObject, dx1, dy1, dx2, dy2) = False Then
            Exit Sub
        End If
    Next
    
    '2D→3Dコマンドを使う準備として三次元ウィンドウを作成する
    '作成した多角形の右隣りに矩形を作成する
    dx1 = circR * 2
    dy1 = -circR * 2
    dx2 = circR * 8
    dy2 = circR * 2
    If DrawRectangle(myObject, dx1, dy1, dx2, dy2) = False Then
        Exit Sub
    End If
    
    '全体表示する
    If SetICADEntireView(myObject) = False Then
        Exit Sub
    End If
    
    '三次元ウィンドウを作成する
    If CreateDimensionWindow(myObject, dx1, dy1, dx2, dy2) = False Then
        Exit Sub
    End If
    
    '垂直投影実行
    dx1 = -circR * 1.1
    dy1 = circR * 1.1
    dx2 = circR * 1.1
    dy2 = -circR * 1.1
    If Create2D3DVertical(myObject, dx1, dy1, dx2, dy2, cylLen) = False Then
        Exit Sub
    End If
    
End Sub

コード内にコメントとして記載されていますが、このプログラムの流れは以下の通りです。

プログラムの主な流れ

  1. iCADオブジェクトを設定する
  2. 各種変数を設定する
  3. セルに入力されている値に不都合がないか確認する
  4. iCADが起動しているかを確認する
  5. iCADの画面を2Dにする
  6. 正N角形を作図する
  7. 三次元ウィンドウを作成する
  8. 垂直投影を実行して正N角柱を作成する

それではコードの内容を一つ一つ説明していきます。

コード解説:iCADオブジェクトの設定

VBAからiCADを操作するためには必ずiCADオブジェクトを使います。

下記のコードでiCADオブジェクトを設定します。

    'iCADオブジェクトの設定
    Dim myObject As Object
    Set myObject = CreateObject("ICAD.Application")

「Dim myObject As Object」 で “myObject”がオブジェクト型の変数であることを宣言しています(変数の宣言は次の段落で詳しく説明)。

「Set myObject = CreateObject(“ICAD.Application”)」 で宣言した”myObject”という変数にiCADオブジェクトを設定しています。

使用したVBAコード要素

  • Set: オブジェクト変数を設定するためのステートメント。

コード解説:変数の設定

変数の設定

外接円径や長さなどのパラメーターは変数に格納します。

そのため、最初に「Dim 〇〇 As ✕✕」 で変数を宣言します。

◯◯は変数の名前、✕✕は変数の型です。

たとえばN数(正N角形のNの数)は整数ですのでLong型(整数型)を指定します。

一方で、外接円の半径や柱長さは小数もあり得るのでDouble型(小数型)を指定します。

    '使用する変数の宣言
    Dim polyNum As Long     'N数を格納する変数
    Dim circR As Double     '外接円の半径を格納する変数
    Dim cylLen As Double    '柱長さを格納する変数
    Dim polyAng As Double   '正N角形の中心角を格納する変数
    Dim i As Long           '繰り返し(For文)のカウントを格納する変数
    Dim dx1 As Double       '直線や矩形作成時に指定する一点目X座標を格納する変数
    Dim dy1 As Double       '直線や矩形作成時に指定する一点目Y座標を格納する変数
    Dim dx2 As Double       '直線や矩形作成時に指定する二点目X座標を格納する変数
    Dim dy2 As Double       '直線や矩形作成時に指定する二点目Y座標を格納する変数

変数の型はたくさんありますが、まずは以下の型があることを認識しておけば十分でしょう。

型名 データ型 値値
Integer 整数 -32,768 ~ 32,767 の整数
Long 長整数 -2,147,483,648 ~ 2,147,483,647 の整数
Double 小数 負:-1.79769313486231E308 ~ -4.94065645841247E-324
正:4.94065645841247E-324 ~ 1.79769313486232E308
String 文字列 “文字列”
可変長:最大で約 20 億 (2^31) 文字
固定長:1 ~ 約 64 K (2^16) の文字
Date 日付 西暦100年1月1日 ~ 西暦9999年12月31日 の日付と時刻
Boolean ブール True または False
Object オブジェクト 他のアプリケーションから提供されるデータや機能など
Variant バリアント すべて

詳しく知りたい方はMicrosoftのVBAリファレンス等をご確認ください。

変数に代入

プログラムでは「変数 = 値」と書くと変数に値が代入されます。

イコール記号(=)ですが左辺と右辺が等しいという数学的な使い方ではないことに注意してください。

以下のコードでエクセルのセルに入力された値を代入しています。

    '変数にセルの値を代入
    polyNum = Range("C4").value     'セルの値をそのまま代入
    circR = Range("C5").value / 2   'セルの値は直径なので2で割って代入
    cylLen = Range("C6").value      'セルの値をそのまま代入
    polyAng = 8 * Atn(1) / polyNum  'VBAの計算は度ではなくラジアンになるよう入力する Atn(1)はアークタンジェント1=45度だが、ラジアンではπ/4ラジアン。8倍すれば2π。

パラメーターチェック(If文の活用)

たとえば正N角形のNの数は3以上でなければ作図できません。

また、外接円径や柱の長さが0以下になることはありえません。

このようにありえない数値が入力されていた場合には、その旨のメッセージを表示してプログラムを終了するようにしましょう。

そんなとき活躍するのがIf文です。

If文ではもしも〇〇の場合✕✕するという処理を行うことができます。

以下のようにコードを追加します。

    '各種寸法が不適切でないか確認する
    'もしもN数が3より小さい場合、メッセージ表示&プログラム終了
    If polyNum < 3 Then
        MsgBox "N数が小さすぎます"
        Exit Sub
    End If
    
    'もしも外接円半径が0以下の場合、メッセージ表示&プログラム終了
    If circR <= 0 Then
        MsgBox "外接円径が不適切です"
        Exit Sub
    End If
    
    'もしも柱長さが0以下の場合、メッセージ表示&プログラム終了
    If cylLen <= 0 Then
        MsgBox "柱長さが不適切です"
        Exit Sub
    End If

ここまでコードを作成したプログラムを実行すると、下記のように動作します。

わざとN数に2を入れたり、柱長さにマイナスの値を入れて、メッセージが表示されれば正しく動作しています。

使用したVBAコード要素

  • Dim: 変数の宣言を行うためのステートメント。変数に値を代入するには”=”を使う。
  • Range: ワークシート上のセルやセル範囲にアクセスするためのプロパティ。
  • Atn: アークタンジェント(逆正接)を計算する VBA の組み込み関数。
  • If: 条件分岐(もしも〇〇の場合✕✕する)を行うためのステートメント。
  • MsgBox: メッセージボックスを表示するためのステートメント。
  • Exit Sub: Subプロシージャから抜けるためのステートメント。

コード解説:多角形の作図

ここまではiCADを操作する前の準備でした。

つづいて実際にiCADを操作するコードを作成していきましょう。

作図前の準備

最初の多角形の作図は2D画面で実施します。

そのため、「iCADが起動しているか確認」して「新規のウィンドウを作成」し「2D画面に切替」を行います。

ライブラリから関数を呼び出しますので、呼び出し方法などは下記記事を参照してください。

呼びだす関数

  1. 【iCAD_Contorol】から IsICADActive:iCADが起動中かチェックする
  2. 【iCAD_Contorol】から CreateICADWindow:iCAD内の新規ウィンドウを作成して作業をする準備を行う
  3. 【iCAD_Contorol】から ActivateICAD2DView:アクティブウィンドウを2D画面に切り替える
    'iCADの起動確認
    If IsICADActive(myObject) = False Then
        Exit Sub
    End If
    
    'iCADの新規ウィンドウ作成
    If CreateICADWindow(myObject) = False Then
        Exit Sub
    End If
    
    '2D画面表示
    If ActivateICAD2DView(myObject) = False Then
        Exit Sub
    End If

ここまでのコードを作成したプログラムを実行すると、下記のように動作します。

自動でiCADの新規図面が立ち上がり、2D画面になれば正常な動作です。

多角形の作図(For文の活用)

つづいて多角形の作図です。

以下の関数を呼び出せば直線を作成できます。

呼びだす関数

  1. 【iCAD_Drawing】から DrawLine_Between:2点間を結ぶ直線(有限)を作成する

しかし作成したい直線は1本ではありません。

例えば五角形なら5回、八角形なら8回直線を引く動作を行う必要が出ます。

このような繰り返し作業を行うのに活躍するのがFor文です。

For文は以下のように使います。

For 変数 = 初期値 To 終了値
    ' 繰り返し実行したいコード
Next

今回の多角形作図では以下のように使います。

    '多角形を作図する
    '多角形の辺の数だけ、直線の作図を繰り返す
    For i = 1 To polyNum
        dx1 = circR * Sin(polyAng * (i - 1))
        dy1 = circR * Cos(polyAng * (i - 1))
        dx2 = circR * Sin(polyAng * i)
        dy2 = circR * Cos(polyAng * i)
        If DrawLine_Between(myObject, dx1, dy1, dx2, dy2) = False Then
            Exit Sub
        End If
    Next

多角形の作図なので辺の数だけ処理を繰り返します。

また頂点の座標は下図に示すように三角関数で求めています。

For文では繰り返す毎に変数iの値が1ずつ増えているので、計算の中に変数iを組み込んでおくことで、作図される座標がずれていき、多角形を作図できます。

また、4つの変数(dx1, dy1, dx2, dy2)には直線を引くための座標を代入しています。

下記のように書いても同じなのですが、コードが解読しにくくなるのであえて変数に格納しています。

    For i = 1 To polyNum
        If DrawLine_Between(myObject, circR * Sin(polyAng * (i - 1)), circR * Cos(polyAng * (i - 1)), circR * Sin(polyAng * i), circR * Cos(polyAng * i)) = False Then
            Exit Sub
        End If
    Next

ここまでコードを作成したプログラムを実行すると、下記のように動作します。

指定した正N角形が作図されれば正常に動作しています。

使用したVBAコード要素

  • For…Next: ループ(繰り返し作業)を行うためのステートメント。
  • Sin: 正弦を計算する VBA の組み込み関数。
  • Cos: 余弦を計算する VBA の組み込み関数。

コード解説:垂直投影して立体化

2D→3Dコマンドの前の準備

2D→3Dコマンドを実行する前には、あらかじめ三次元ウィンドウを作成する必要があります。

「(ウィンドウを作成するための)矩形を作図」して「全体表示」して「三次元ウィンドウを作成する」を行います。

呼びだすコード

  1. 【iCAD_Drawing】から DrawRectangle:水平垂直の矩形を作図する
  2. 【iCAD_Contorol】から SetICADEntireView:全体表示する
  3. 【iCAD_2Dto3D_Creation】から CreateDimensionWindow:2D→3Dコマンド前の三次元ウィンドウを作成する

いきなり三次元ウィンドウを作成しようとして、画面表示外の座標を指定してしまうとエラーになるため、このようなステップが必要になります。

    '2D→3Dコマンドを使う準備として三次元ウィンドウを作成する
    '作成した多角形の右隣りに矩形を作成する
    dx1 = circR * 2
    dy1 = -circR * 2
    dx2 = circR * 8
    dy2 = circR * 2
    If DrawRectangle(myObject, dx1, dy1, dx2, dy2) = False Then
        Exit Sub
    End If
    
    '全体表示する
    If SetICADEntireView(myObject) = False Then
        Exit Sub
    End If
    
    '三次元ウィンドウを作成する
    If CreateDimensionWindow(myObject, dx1, dy1, dx2, dy2) = False Then
        Exit Sub
    End If

もしも矩形を作図せずに三次元ウィンドウを作成しようとすると以下のようになってしまうことがあります。

iCAD上でマクロ文法エラーというメッセージが出ました。

この場合、iCADの動作が終わっていない状態なのでキー入力領域に「N」または「NO」と入力してエンターキーを押し、iCADの動作を終了させることでVBAの動作に戻しましょう。

マクロ文法エラーはVBAでは自動的に認識できないエラーですので、いかにエラーが生じないようにプログラムを作成するかが重要です。

垂直投影の実施

最後に垂直投影を実施します。

呼びだすコード

  1. 【iCAD_2Dto3D_Creation】から Create2D3DVertical:[2D→3Dコマンド]垂直投影を作成する
    '垂直投影実行
    dx1 = -circR * 1.1
    dy1 = circR * 1.1
    dx2 = circR * 1.1
    dy2 = -circR * 1.1
    If Create2D3DVertical(myObject, dx1, dy1, dx2, dy2, cylLen) = False Then
        Exit Sub
    End If

ここまでコードを作成することで多角柱の自動生成ツールが完成です!

むずかしく感じたでしょうか?

しかし実態はやりたいことを一つ一つ順番に実行しているだけですので、あせらずに一歩ずつ覚えていけば誰でもVBAツールを作成できるようになりますよ!

本記事で掲載している画像の特記事項

本ブログ記事に掲載しているiCADの画像についての注意事項です。

  • iCADは、富士通株式会社の登録商標です
  • iCAD SXの著作権は、iCAD株式会社が保有します
  • 当ブログでは、iCAD株式会社の許諾を得て画面等を表示しています
  • 当ブログの内容について、無断で使用、複製することを禁じます
ゆー

この記事を書いた人

ゆー

自動化ツールがサクサク作れる!iCAD ✕ VBAライブラリ活用方法

サンプルコードで試してみよう!iCAD用エクセルVBAツール

console.log("postID: 14194");console.log("カウント: 662");