タイガーラック クリエイティブブログ
2025
June
23

Autodesk Inventorでの図面作成をAPIで完全自動化、VBAとC#での実装方法も紹介

はじめに

こんにちは。今回はAutodesk InventorをAPIで制御して図面作成を自動化する方法についてご紹介します。Autodesk Inventorは、製品や機械設備の設計者向けに提供されている3D CADモデリングソフトウェアです。おそらく同じAutodesk社の「Autodesk AutoCAD」の方が知名度が高いと思いますが、AutoCADが2D図面作成に特化しているのに対し、Inventorは3D設計に特化しています。

さて、今回このテーマを扱うことになったのは、毎回の業務で行っている作図作業が「面倒だな」と感じたからです。私は普段システム開発の業務に携わっているのですが、それと並行して自社製品(ラック)の図面を作成する作業も担当しています。通常はInventorで3Dモデルを作成し、そこから手動で2D図面に変換しています。

ただ、作図依頼が集中する日もあり、その作業にかなりの時間を取られることもしばしばあります。今のところは開発業務との両立ができていますが、今後さらに依頼が増えてしまうと、システム開発に影響が出てしまうかもしれません。そこで、「この作業を自動化できないか」と考え、Inventor APIについて調査を始めたという経緯です。

この記事では、私が調べたことや実際に試してみたことを、同じように業務の効率化を目指している方に向けてわかりやすく共有していきたいと思います。よろしくお願いいたします。

図面作成の基本手順

この章では、早速ですがAutodesk InventorをAPIで制御する方法を解説します。なお、Autodesk Inventorが必ずインストールされていて、正常に動作する環境であることが前提です。事前にご準備をお願いいたします。

弊社での図面作成の流れ

弊社では、普段はAutodesk InventoriLogicを使って以下の手順で図面を作成しています。iLogicはAutodesk Inventorに組み込まれた自動化ツールで、部品のサイズや構成を「ルール」として登録し、フォームから値を入力するだけで3Dモデルや図面を自動的に変更・生成できる機能です。プログラミングの専門知識がなくても使えるように設計されており、設計の効率化・標準化・ミスの削減などに役立ちます。

 


  • プロジェクトの作成
    Inventor上で、作業用のディレクトリを指定して新しいプロジェクトを作成
  • 作業グループの検索パス設定
    作成したプロジェクトに対して、必要な検索パス(作業グループ)を設定
  • Inventorファイル(.iam)の配置
    iLogicのコードや3Dモデルの構成が含まれている .iam ファイルを、先ほど指定した作業用ディレクトリに配置
  • Inventorファイルを開く
    Inventor上で .iam ファイルを開く
  • 3D図面の作成
    iLogicフォームにて、高さ・幅などの寸法を入力し、「ルールの実行」ボタンを押して3Dモデルを生成
  • 2D図面への変換
    iLogicフォーム上の「図面を開く」ボタンを押して、3Dモデルから2D図面(.idw ファイル)を自動生成
  • スケール・寸法の自動設定
    2D図面のiLogicフォーム上の「ルールの実行」ボタンを押すことで、2D図面にスケールを設定し、必要な寸法線を自動で追加
  • 2D図面の出力
    完成した2D図面を、PDFやDWG形式で出力

 

上記のように進めることで、効率的に図面を作成しています。ただし、この方法は弊社の運用に基づくものであり、環境や運用に応じて適宜調整してください。なお、今回の解説ではInventorの基本操作やiLogicの使い方の詳細には触れません。今回は、InventorをVBAなどのAPIを通じて自動制御し、図面作成を効率化する方法をお伝えします。次の章では、ソースコードを紹介します。

ソースコード

VBAでの実装

この章ではVBAでの実装方法を紹介します。まずは実装前に「参照設定」から「Autodesk Inventor Object Library」を選択してください。

ソースコードは下記の通りです。注意点などはコメントを参照してください。

Option Compare Database
Option Explicit

Private Sub 図面出力_Click()

    Dim destProject As String
    destProject = "C:\InventorProjects"
        
    ' 代わりに、指定したプロジェクトを名前で検索してアクティブ化
    Dim targetProjectName As String
    targetProjectName = "プロジェクト名"
       
    Dim wgName As String
    Dim wgPath As String
    
    ' 新しい検索パスを追加
    wgName = "作業グループ" ' 作業グループ名(任意)
    wgPath = "C:\作業グループパス\" ' 作業グループのパス
        
    ' コピー元ファイルのパス
    Dim sourceFile As String
    sourceFile = "C:\コピー元パス\product.iam"
    
    ' コピー先フォルダ(既にある想定)
    Dim destFolder As String
    destFolder = "C:\InventorProjects"
    
    ' コピー先ファイルのパス(同じファイル名でコピー)
    Dim destFile As String
    destFile = destFolder & "\product.iam"
    
    
    ' -------------------------------------
    ' ▼ 注意 ▼
    ' プロジェクトを新規作成してすぐにiLogicルールを実行すると、内部的にプロジェクト情報がまだ完全に反映されておらず、
    ' iLogic実行時にエラーが発生することがあります。
    ' そのため、最初に「SetupInventorProject」だけを実行して、プロジェクトの作成と初期設定を行います。
    ' その後、もう一度「SetupInventorProject」+「SetUserParamAndRunRule」を実行すると、iLogicルールも問題なく動作します。
    '
    ' このように、プロジェクトの初回セットアップとルール実行は「2段階」に分けることで安定した動作が得られます。
    ' -------------------------------------
    Dim blnCreateProject As Boolean
    blnCreateProject = False
    
    'Inventorのプロジェクトを作成
    blnCreateProject = SetupInventorProject( _
        targetProjectName, _
        destProject, _
        wgName, _
        wgPath, _
        sourceFile _
    )
    
    If blnCreateProject = False Then
        Exit Sub
    End If
    
    'Inventorのプロジェクトを作成
    blnCreateProject = SetupInventorProject( _
        targetProjectName, _
        destProject, _
        wgName, _
        wgPath, _
        sourceFile _
    )
    
    If blnCreateProject = False Then
        Exit Sub
    End If
   ' -------------------------------------


    
    Dim blnRunRule As Boolean
    blnRunRule = False
    
    Dim paramNames As Variant
    Dim paramValues As Variant
    
    ' ユーザーパラメータを設定する
    paramNames = Array("Height", "rack1Width", "Depth", "rack1Count", "isMultiRack")
    paramValues = Array(90, 90, 45, 4, False)

    blnRunRule = SetUserParamAndRunRule(destFile, paramNames, paramValues)
    
 ''   参考文献
''    https://help.autodesk.com/view/INVNTOR/2025/ENU/?guid=DesignProjects_Add
''    https://forums.autodesk.com/t5/inventor-programming-ilogic/change-active-project-file-via-net/td-p/7382988
''    https://help.autodesk.com/view/INVNTOR/2023/ENU/?guid=GUID-B093BC0E-5C79-4A26-A227-83D68D72F341
End Sub

Function SetupInventorProject(projectName As String, projectFolder As String, workgroupName As String, workgroupPath As String, sourceFilePath As String)
'------------------------------------------------------------------------------
' 関数名:SetupInventorProject
' 概要  :指定された名前とパスでInventorのプロジェクトを作成し、
'         それをアクティブ化する。さらに、指定された作業グループ
'         検索パスをプロジェクトに追加し、指定されたファイルを
'         プロジェクトフォルダにコピーする。
'
' 引数  :
'   projectName (String)      - 作成またはアクティブ化するプロジェクトの名前
'   projectFolder (String)    - プロジェクトの保存先フォルダのフルパス
'   workgroupName (String)    - 作業グループの表示名
'   workgroupPath (String)    - 作業グループ検索パスの実際のフォルダパス
'   sourceFilePath (String)   - プロジェクト内にコピーしたい元ファイルのフルパス
'
' 戻り値:あり
'
' 備考  :
'   - Inventorが起動していない場合は処理を中断する。
'   - すでにプロジェクトが存在する場合は再作成せず、アクティブ化のみを行う。
'   - 作業グループパスは重複追加を避けるため、既存のものと照合してから追加。
'   - sourceFilePath のファイルが存在しない場合、コピーは実行されない。
'------------------------------------------------------------------------------
    
' 定数の手動定義(Single User プロジェクト = 12290)
    Const kSingleUserProject As Long = 12290
    Const kSingleUserMode As Long = 36353
    
    SetupInventorProject = False

    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")

    ' Inventorアプリケーションに接続
    Dim invApp As Object
    On Error Resume Next
    Set invApp = GetObject(, "Inventor.Application")
    
    
    ' Inventorが起動していなければ起動する
    If invApp Is Nothing Then
        Set invApp = CreateObject("Inventor.Application") ' ←ここで起動
        If invApp Is Nothing Then
            MsgBox "Inventorの起動に失敗しました。", vbCritical
            SetupInventorProject = False
        Else
            invApp.Visible = True ' Inventorのウィンドウを表示
            DoEvents ' 起動処理を待つ場合
        End If
    End If
    On Error GoTo 0

    ' プロジェクトマネージャーの取得
    Dim projectManager As Object
    Set projectManager = invApp.DesignProjectManager   
    
    If Not fso.FolderExists(projectFolder) Then
        fso.CreateFolder projectFolder
        
        ' 新しいプロジェクトの作成
        Dim newProject As Object
        Set newProject = projectManager.DesignProjects.Add(kSingleUserMode, "プロジェクト名", projectFolder)
    End If
    
    ' 代わりに、指定したプロジェクトを名前で検索してアクティブ化
    Dim targetProject As Object
    Set targetProject = Nothing

    Dim proj As Object
    For Each proj In projectManager.DesignProjects
        If proj.name = projectName Then
            Set targetProject = proj
            Exit For
        End If
    Next
    
    If Not targetProject Is Nothing Then
        targetProject.Activate
    End If

    Dim activeProject As Object
    Set activeProject = projectManager.ActiveDesignProject

    
    ' ======= 作業グループ検索パスがすでに登録済みかチェック =======
    Dim existingPath As Variant
    Dim alreadyExists As Boolean
    alreadyExists = False

    For Each existingPath In activeProject.WorkgroupPaths
        If StrComp(existingPath.path, workgroupPath, vbTextCompare) = 0 Then
            alreadyExists = True
            Exit For
        End If
    Next

    ' ======= 未登録のときだけ追加 =======
    If Not alreadyExists Then
        activeProject.WorkgroupPaths.Add workgroupName, workgroupPath
    End If
    
    ' コピー先ファイルのパス(同じファイル名でコピー)
    Dim destFile As String
    destFile = projectFolder & "\product.iam"
    
    ' ファイルシステムオブジェクトを使ってコピー
    If fso.FileExists(sourceFilePath) Then
        ' ファイルコピー(上書き)
        fso.CopyFile sourceFilePath, destFile, True
    End If

    SetupInventorProject = True

End Function


'------------------------------------------------------------------------------
' 関数名:SetUserParamAndRunRule
' 概要  :指定したInventorアセンブリファイルを開き、
'          引数で与えられた複数のユーザーパラメータに値を設定し、
'          iLogicルール "ルールの実行" を実行。
'          処理後、ドキュメントを保存して閉じる。
'
' 引数  :
'   docPath (String) - 対象のInventorドキュメントファイルのフルパス
'   paramNames (Variant) - 設定対象のパラメータ名の配列
'   paramValues (Variant) - 設定値の配列(paramNamesと同じ順番・数)
'
' 戻り値:Boolean - 成功時はTrue、失敗時はFalse
'------------------------------------------------------------------------------
Public Function SetUserParamAndRunRule(docPath As String, paramNames As Variant, paramValues As Variant) As Boolean
    On Error GoTo ErrorHandler

    Dim invApp As Object
    Set invApp = GetObject(, "Inventor.Application")

    Dim doc As Object
    Set doc = invApp.Documents.Open(docPath)

    Dim userParams As Object
    Set userParams = doc.ComponentDefinition.Parameters.UserParameters

    Dim i As Long
    Dim param As Object
    For i = LBound(paramNames) To UBound(paramNames)
        On Error Resume Next
        Set param = userParams.item(paramNames(i))
        On Error GoTo ErrorHandler

        If param Is Nothing Then
            MsgBox "パラメータ '" & paramNames(i) & "' が見つかりません。", vbCritical
            GoTo Cleanup
        End If

        param.value = paramValues(i)
    Next i

    ' iLogicAutomation オブジェクトをアプリケーションから取得
    Dim iLogicAuto As Object
    Set iLogicAuto = invApp.ApplicationAddIns.ItemById("{3bdd8d79-2179-4b11-8a5a-257b1c0263ac}") _
                     .Automation
    
    ' モデルの更新(ローカル更新)
    doc.Update

    ' ルールを実行(ルール名は固定)
    iLogicAuto.RunRule doc, "ルールの実行"

    ' モデルの更新(ローカル更新)
    doc.Update
    
    ' ルールを実行(ルール名は固定)
    iLogicAuto.RunRule doc, "図面を開く"
    
    ' もし上のルールを実行して別のファイルを開いた直後に、最後に開かれたドキュメントを取得(=新しいファイルと仮定)
    Dim drawingDoc As Object
    Set drawingDoc = invApp.Documents(invApp.Documents.count)
    iLogicAuto.RunRule drawingDoc, "ルールの実行"
   
    '=====================
    ' DWGとしてエクスポート
    '=====================
    ' 図面ファイルと同じフォルダに "export.dwg" を出力
    Dim dwgFolder As String
    Dim dwgFilePath As String
    
    dwgFolder = Left(drawingDoc.fullFileName, InStrRev(drawingDoc.fullFileName, "\"))
    dwgFilePath = dwgFolder & "export" & ".dwg"

    ' SaveAs メソッドを使用してエクスポート
    drawingDoc.SaveAs dwgFilePath, True
    
    
    '=====================
    ' PDFとしてエクスポート(警告非表示)
    '=====================
    Dim pdfFilePath As String
    pdfFilePath = dwgFolder & "export" & ".pdf"

    ' SaveAs メソッドを使用して PDF をエクスポート(警告表示なし)
    drawingDoc.SaveAs pdfFilePath, True

   ' ダイアログを抑制して保存(Save2 を使って強制保存)
    drawingDoc.Save2 True
    drawingDoc.Close
    
    doc.Save2 True
    doc.Close
    
    SetUserParamAndRunRule = True
    Exit Function

Cleanup:
    doc.Close
    SetUserParamAndRunRule = False
    Exit Function

ErrorHandler:
    MsgBox "エラーが発生しました: " & Err.Description, vbCritical
    SetUserParamAndRunRule = False
    
'    参考文献
'https://www.autodesk.com/jp/support/technical/article/caas/tsarticles/ts/13hZJX2ac2AMMaPc1aKDuP.html
End Function

C#での実装

この章ではC#での実装方法を紹介します。まずは実装前にプロジェクトにカーソルを当てて、右クリックで「追加」から「参照」をクリックしてください。そのあとは「Autodesk Inventor Object Library」を選択してください。

ソースコードは下記の通りです。注意点などはコメントを参照してください。

using Inventor;
using System;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace InventorAutomation
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string destProject = @"C:\InventorProjects";
            string targetProjectName = "プロジェクト名";
            string wgName = "作業グループ";
            string wgPath = @"C:\作業グループパス";
            string sourceFile = @"C:\コピー元パス\product.iam";
            string destFile = System.IO.Path.Combine(destProject, "product.iam");

            // -------------------------------------
            // ▼ 注意 ▼
            // プロジェクトを新規作成してすぐにiLogicルールを実行すると、内部的にプロジェクト情報がまだ完全に反映されておらず、
            // iLogic実行時にエラーが発生することがあります。
            // そのため、最初に「SetupInventorProject」だけを実行して、プロジェクトの作成と初期設定を行います。
            // その後、もう一度「SetupInventorProject」+「SetUserParamAndRunRule」を実行すると、iLogicルールも問題なく動作します。
            //
            // このように、プロジェクトの初回セットアップとルール実行は「2段階」に分けることで安定した動作が得られます。
            // -------------------------------------
            bool blnCreateProject = SetupInventorProject(
                targetProjectName,
                destProject,
                wgName,
                wgPath,
                sourceFile
            );

            if (!blnCreateProject) return;

            // 再度呼び出し(VBAと同じ動作)
            blnCreateProject = SetupInventorProject(
                targetProjectName,
                destProject,
                wgName,
                wgPath,
                sourceFile
            );

            if (!blnCreateProject) return;
            // -------------------------------------

            // ユーザーパラメータを設定する
            string[] paramNames = { "Height", "rack1Width", "Depth", "rack1Count", "isMultiRack" };
            object[] paramValues = { 90, 90, 45, 4, false };

            bool blnRunRule = SetUserParamAndRunRule(destFile, paramNames, paramValues);

            // 参考文献
            //  https://help.autodesk.com/view/INVNTOR/2025/ENU/?guid=DesignProjects_Add
            // https://forums.autodesk.com/t5/inventor-programming-ilogic/change-active-project-file-via-net/td-p/7382988
            // https://help.autodesk.com/view/INVNTOR/2023/ENU/?guid=GUID-B093BC0E-5C79-4A26-A227-83D68D72F341
        }

        /// <summary>
        /// 指定された名前とパスでInventorのプロジェクトを作成し、
        /// それをアクティブ化する。さらに、指定された作業グループ
        /// 検索パスをプロジェクトに追加し、指定されたファイルを
        /// プロジェクトフォルダにコピーする。
        /// </summary>
        /// <param name="projectName">作成またはアクティブ化するプロジェクトの名前</param>
        /// <param name="projectFolder">プロジェクトの保存先フォルダのフルパス</param>
        /// <param name="workgroupName">作業グループの表示名</param>
        /// <param name="workgroupPath"> 作業グループ検索パスの実際のフォルダパス</param>
        /// <param name="sourceFilePath">プロジェクト内にコピーしたい元ファイルのフルパス</param>
        /// <returns>あり</returns>
        /// 備考  :
        ///   - Inventorが起動していない場合は処理を中断する。
        ///   - すでにプロジェクトが存在する場合は再作成せず、アクティブ化のみを行う。
        ///   - 作業グループパスは重複追加を避けるため、既存のものと照合してから追加。
        ///   - sourceFilePath のファイルが存在しない場合、コピーは実行されない。
        private bool SetupInventorProject(string projectName, string projectFolder, string workgroupName, string workgroupPath, string sourceFilePath)
        {

            try
            {
                const MultiUserModeEnum kSingleUserMode = MultiUserModeEnum.kSingleUserMode;

                // Inventorアプリケーションに接続
                Inventor.Application invApp;

                // Inventorが起動していなければ起動する
                SetupInventorProject(out invApp);

                // プロジェクトマネージャーの取得
                DesignProjectManager projectManager = invApp.DesignProjectManager;

                if (!Directory.Exists(projectFolder))
                {
                    // 新しいプロジェクトの作成
                    Directory.CreateDirectory(projectFolder);
                    DesignProject newProject = projectManager.DesignProjects.Add(
                        kSingleUserMode, projectName, projectFolder
                    );
                }

                // 代わりに、指定したプロジェクトを名前で検索してアクティブ化
                DesignProject targetProject = null;
                foreach (DesignProject proj in projectManager.DesignProjects)
                {
                    if (proj.Name == projectName)
                    {
                        targetProject = proj;
                        break;
                    }
                }

                if (targetProject != null)
                {
                    targetProject.Activate();
                }

                DesignProject activeProject = projectManager.ActiveDesignProject;

                // ======= 作業グループ検索パスがすでに登録済みかチェック =======
                bool alreadyExists = false;
                foreach (dynamic existingPath in activeProject.WorkgroupPaths)
                {
                    string path = existingPath.Path;
                    if (string.Equals(path, workgroupPath, StringComparison.OrdinalIgnoreCase))
                    {
                        alreadyExists = true;
                        break;
                    }
                }

                // ======= 未登録のときだけ追加 =======
                if (!alreadyExists)
                {
                    activeProject.WorkgroupPaths.Add(workgroupName, workgroupPath);
                }

                // コピー先ファイルのパス(同じファイル名でコピー)
                string destFile = System.IO.Path.Combine(projectFolder, "product.iam");

                // ファイルシステムオブジェクトを使ってコピー
                if (System.IO.File.Exists(sourceFilePath))
                {
                    System.IO.File.Copy(sourceFilePath, destFile, true);
                }

                return true;
            }
            catch (Exception ex)
            {
                MessageBox.Show("エラー: " + ex.Message);
                return false;
            }
        }

        /// <summary>
        /// 指定したInventorアセンブリファイルを開き、
        /// 引数で与えられた複数のユーザーパラメータに値を設定し、
        /// iLogicルール "ルールの実行" を実行。
        /// 処理後、ドキュメントを保存して閉じる。
        /// </summary>
        /// <param name="docPath">対象のInventorドキュメントファイルのフルパス</param>
        /// <param name="paramNames">設定対象のパラメータ名の配列</param>
        /// <param name="paramValues">設定値の配列(paramNamesと同じ順番・数)</param>
        /// <returns></returns>
        private bool SetUserParamAndRunRule(string docPath, string[] paramNames, object[] paramValues)
        {
            try
            {
                Inventor.Application invApp = (Inventor.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Inventor.Application");

                Document doc = invApp.Documents.Open(docPath);
                UserParameters userParams = ((AssemblyDocument)doc).ComponentDefinition.Parameters.UserParameters;

                for (int i = 0; i < paramNames.Length; i++)
                {
                    try
                    {
                        UserParameter param = userParams[paramNames[i]];
                        param.Value = paramValues[i];
                    }
                    catch
                    {
                        MessageBox.Show($"パラメータ '{paramNames[i]}' が見つかりません。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        doc.Close(true);
                        return false;
                    }
                }
                
                // モデルの更新(ローカル更新)
                doc.Update();

                // iLogicAutomation オブジェクトを取得
                ApplicationAddIn iLogicAddin = invApp.ApplicationAddIns.ItemById["{3bdd8d79-2179-4b11-8a5a-257b1c0263ac}"];

                if (!iLogicAddin.Activated)
                {
                    iLogicAddin.Activate();
                }

                object iLogicAuto = iLogicAddin.Automation;

                // InvokeMember を使ってルールを実行
                iLogicAuto.GetType().InvokeMember(
                    "RunRule",
                    BindingFlags.InvokeMethod | BindingFlags.Public,
                    null,
                    iLogicAuto,
                    new object[] { doc, "ルールの実行" }
                );

                // モデルの更新(ローカル更新)
                doc.Update();

                // ルールを実行(ルール名は固定)
                iLogicAuto.GetType().InvokeMember(
                    "RunRule",
                    BindingFlags.InvokeMethod | BindingFlags.Public,
                    null,
                    iLogicAuto,
                    new object[] { doc, "図面を開く" }
                );

                // 最後に開いたドキュメントを取得(新しく開いたと仮定)
                DrawingDocument drawingDoc = null;
                int docCount = invApp.Documents.Count;
                Document latestDoc = invApp.Documents[docCount]; // 1-based index
                drawingDoc = latestDoc as DrawingDocument;

                if (drawingDoc == null)
                {
                    Console.WriteLine("DrawingDocument ではありません。");
                    return false;
                }

                // iLogicルール実行
                iLogicAuto.GetType().InvokeMember(
                    "RunRule",
                    BindingFlags.InvokeMethod | BindingFlags.Public,
                    null,
                    iLogicAuto,
                    new object[] { drawingDoc, "ルールの実行" }
                );

                // ファイルパス設定
                string fullPath = drawingDoc.FullFileName;
                string folderPath = System.IO.Path.GetDirectoryName(fullPath);
                string dwgFilePath = System.IO.Path.Combine(folderPath, "export.dwg");
                string pdfFilePath = System.IO.Path.Combine(folderPath, "export.pdf");

                // DWGエクスポート
                drawingDoc.SaveAs(dwgFilePath, true);

                // PDFエクスポート
                drawingDoc.SaveAs(pdfFilePath, true);

                // 保存してクローズ
                drawingDoc.Save2(true);
                drawingDoc.Close(true);
                doc.Save2(true);
                doc.Close(true);

                return true;
            }
            catch (Exception ex)
            {
                MessageBox.Show("ルール実行エラー: " + ex.Message);
                return false;
            }

            // 参考文献
            // https://forums.autodesk.com/t5/autodesk-community-tips-adnopun/inventor-2025de-net-frameworkwotagettonishitebirudoshitac/ta-p/13032752
        }

        /// <summary>
        /// Inventor アプリケーションオブジェクトを取得または起動するメソッド。
        /// 起動済みであれば既存のインスタンスに接続し、未起動であれば新しく起動する
        /// </summary>
        /// <param name="invApp">取得または起動した Inventor アプリケーションインスタンス</param>
        private void SetupInventorProject(out Inventor.Application invApp)
        {
            invApp = null;

            try
            {
                // 既に起動しているInventorに接続
                invApp = (Inventor.Application)Marshal.GetActiveObject("Inventor.Application");
            }
            catch (COMException)
            {
                // 起動していなければ新しく起動する
                try
                {
                    Type inventorAppType = Type.GetTypeFromProgID("Inventor.Application");
                    invApp = (Inventor.Application)Activator.CreateInstance(inventorAppType);

                    if (invApp != null)
                    {
                        invApp.Visible = true;
                    }
                }
                catch (Exception)
                {
                    MessageBox.Show("Inventorの起動に失敗しました。");
                }
            }

        }

    }
}

最後に

今回は、VBAとC#を使ってAutodesk InventorをAPIで制御する方法をご紹介しました。図面作成の流れについても、弊社で実際に運用している方法を中心に解説しましたが、図面のルールなどは会社ごとに異なるケースも多いため、実際の現場では各社の運用に合わせて調整していただければと思います。

VBA・C#でのAPI制御も一定の難易度はありましたが、個人的にもっとも苦労したのは、iLogicを用いた3Dモデルおよび2D図面の自動化です。特に2D図面については、これまで長年、手動で調整してきた背景があり、下記のような課題に直面しました。

  • 寸法が正常に表示されないことがある
  • アイソメ図(等角投影図)が三面図の配置が重なってしまう
  • スケールが適切でなく、モデルが枠からはみ出る
  • 手作業でAutoCAD上で修正していたため、自動化しにくい構造だった

こうした課題に対応するため、iLogicのロジックを見直し、図面自体を自動化に対応できるように再設計する必要がありました。もし図面の自動化を検討している場合は、iLogic側の作り込みも合わせて見直すことをおすすめします。

また、実際に取り組んでいて感じたことですが、Autodesk Inventorは比較的高価な商用ソフトウェアです。現在以下の料金プランがあります。

  • 年間プラン:¥402,600(税込)
  • 月間プラン:¥50,600(税込)

さらに、1ライセンスにつき1台のPCでしか使えないため、複数人での活用にはそれなりのコストがかかります。

このような背景から、今後は FreeCADBlender といった、オープンソースソフトウェア(OSS)にも注目していきたいと考えています。OSSの魅力は、誰でも無料、または低価格で使えることに加えて、ソースコードの改変や再配布が可能な点です(※商用利用時はライセンス確認が必要です)。これらのソフトもAPIによる制御が可能なものが多く、機能的にも年々進化しています。

今後のブログでは、そういったOSSを使った自動化の方法なども、機会があれば紹介できたらと考えています。最後までお読みいただき、ありがとうございました。それでは、また次回のブログでお会いしましょう!

参考文献

Autodesk Inventor ソフトウェア | Inventor 2026 の価格と購入(公式ストア)

オープンソース(OSS)とは?知っておくべきポイント・注意点・リスク – カゴヤのサーバー研究室

Change active Project file via .net – Autodesk Community

Inventor 2025 Help | DesignProjects.Add Method | Autodesk

Inventor 2023 Help | DesignProjectManager.ActiveDesignProject Property | Autodesk

Inventor APIでiLogicを実行する方法 | Autodesk

Inventor 2025 ヘルプ | iLogic の機能の概要 | Autodesk

アイソメ図(等角投影図)とは?基本から描き方まで完全解説

無料で使用できるCAD5選。2D・3Dで使い分けよう – BuildApp News【住宅DX】

Inventor 2025で、.NET FrameworkをターゲットにしてビルドしたC#アプリケーションからiLogicを実行するとタイプ ライブラリが登録されていません エラーとなる – Autodesk Community

このカテゴリの最新記事

関連記事

SHOP LIST

タイガーラック株式会社

〒577-0056
大阪府東大阪市長堂1-3-14 TOKUYASU Bld.