RevitとExcel積算ソフト連携アドインのサンプルコード

# RevitとExcel積算ソフト連携アドインのサンプルコード

 以下は、RevitとExcelを連携させるためのアドインの基本的なサンプルコードです。

この例では、Revitから電気設備要素を抽出し、Excelに出力する機能を実装しています。 
 ## 必要な環境
 - Revit API
 - .NET Framework 4.8 
 - Microsoft Office Interop Excel 
 - Visual Studio 

 ## C#サンプルコード



using System;

using System.Collections.Generic;

using System.Linq;

using Autodesk.Revit.DB;

using Autodesk.Revit.DB.Electrical;

using Autodesk.Revit.UI;

using Autodesk.Revit.Attributes;

using Microsoft.Office.Interop.Excel;

namespace RevitExcelIntegration

{

    [Transaction(TransactionMode.Manual)]

    public class ExportToExcel : IExternalCommand

    {

        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)

        {

            // Revitドキュメントを取得

            UIDocument uiDoc = commandData.Application.ActiveUIDocument;

            Document doc = uiDoc.Document;

            try

            {

                // 電気設備要素を収集

                var electricalElements = new FilteredElementCollector(doc)

                    .OfCategory(BuiltInCategory.OST_ElectricalFixtures)

                    .WhereElementIsNotElementType()

                    .ToList();

                // Excelアプリケーションを起動

                Application excelApp = new Application();

                Workbook workbook = excelApp.Workbooks.Add();

                Worksheet worksheet = (Worksheet)workbook.Worksheets[1];

                // Excelにヘッダーを書き込み

                worksheet.Cells[1, 1] = "要素ID";

                worksheet.Cells[1, 2] = "名称";

                worksheet.Cells[1, 3] = "タイプ";

                worksheet.Cells[1, 4] = "数量";

                worksheet.Cells[1, 5] = "備考";

                // Revit要素をExcelに書き込み

                int row = 2;

                foreach (Element element in electricalElements)

                {

                    worksheet.Cells[row, 1] = element.Id.IntegerValue;

                    worksheet.Cells[row, 2] = element.Name;

                    worksheet.Cells[row, 3] = doc.GetElement(element.GetTypeId()).Name;

                    worksheet.Cells[row, 4] = 1; // 数量(簡易的に1を設定)

                    worksheet.Cells[row, 5] = GetParametersAsString(element);

                    row++;

                }

                // 列の自動調整

                worksheet.Columns.AutoFit();

                // Excelを表示

                excelApp.Visible = true;

                // ユーザーに通知

                TaskDialog.Show("成功", $"{electricalElements.Count} 個の電気設備要素をExcelにエクスポートしました。");

                return Result.Succeeded;

            }

            catch (Exception ex)

            {

                message = ex.Message;

                return Result.Failed;

            }

        }

        // 要素のパラメータを文字列として取得

        private string GetParametersAsString(Element element)

        {

            var parameters = new List();

            foreach (Parameter param in element.Parameters)

            {

                if (param.HasValue && param.StorageType == StorageType.String)

                {

                    parameters.Add($"{param.Definition.Name}: {param.AsString()}");

                }

            }

            return string.Join(", ", parameters);

        }

    }

    // アドイン登録用クラス

    public class App : IExternalApplication

    {

        public Result OnStartup(UIControlledApplication application)

        {

            // リボンタブを作成

            string tabName = "電気工事";

            application.CreateRibbonTab(tabName);

            // パネルを作成

            RibbonPanel panel = application.CreateRibbonPanel(tabName, "積算");

            // ボタンを作成

            PushButtonData buttonData = new PushButtonData(

                "ExportToExcel",

                "Excelに出力",

                System.Reflection.Assembly.GetExecutingAssembly().Location,

                typeof(ExportToExcel).FullName);

            PushButton button = panel.AddItem(buttonData) as PushButton;

            button.ToolTip = "Revitの電気設備要素をExcelにエクスポートします";

            return Result.Succeeded;

        }

        public Result OnShutdown(UIControlledApplication application)

        {

            return Result.Succeeded;

        }

    }

}

## 機能拡張のアイデア
 1. **双方向連携**:
 - ExcelからRevitにデータをインポートする機能 - Excelで編集した数量や仕様をRevitに反映

 2. **積算機能強化**:
 - 単価データとの連携 - 自動計算機能 - 見積書テンプレートへの出力 

 3. **フィルタリング機能**: 
 - 特定の系統や階の要素のみを抽出 - 条件に基づいたフィルタリング 

 4. **レポート生成**:
 - 材料リスト自動生成 - 施工図面への注記追加

 ## 注意点 
 1. Revit APIとExcel Interopの両方のライセンスが必要です 
 2. エラーハンドリングを強化する必要があります
 3. 大規模なプロジェクトではパフォーマンスに注意が必要
 4. ユーザーインターフェースを工夫すると使いやすくなります 

 このコードは基本的なフレームワークとして使用し、実際の業務要件に合わせて拡張してください。

コメント

このブログの人気の投稿

Pydroid用ピアノアプリ+ラフマニノフピアノ協奏曲第2番1楽章デモ音源付き

訴えの変更(追加的変更)申立

Gmailの本文にマークダウン記法でソースコードが書けるアドオンをいれたい。