#region Namespaces
using System;
using System.Collections.Generic;
using System.Diagnostics;
using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;

#endregion

namespace RevitAddinWall2
{
    [Transaction(TransactionMode.Manual)]
    public class Command : IExternalCommand
    {
        public Result Execute(
          ExternalCommandData commandData,
          ref string message,
          ElementSet elements)
        {
            UIApplication uiapp = commandData.Application;
            UIDocument uidoc = uiapp.ActiveUIDocument;
            Application app = uiapp.Application;
            Document doc = uidoc.Document;

            //カテゴリ名、選択された要素の変数宣言
            string categeryName = "";
            Element selectElement = null;

            try
            {
                while (true)
                {
                    // ユーザーに壁インスタンスを選択してもらう
                    Reference myRef = uidoc.Selection.PickObject(ObjectType.Element, "壁を選択してください。キャンセルするにはESCを押します");

                    // 選択された要素を取得
                    selectElement = doc.GetElement(myRef);

                    //elementsに選択要素を追加しておく
                    elements.Insert(selectElement);

                    // カテゴリを取得
                    categeryName = selectElement.Category.Name;

                    // 要素が壁であることを確認
                    if (selectElement is Wall)
                    {
                        break;
                    }
                    else
                    {
                        // 選択された要素が壁でない場合、再度選択を促す
                        TaskDialog.Show("選択エラー", categeryName+"を選択しました。壁を選択しなおしてください。");
                        throw new Exception();
                    }
                }
                // ファミリ名、タイプ名、カテゴリを取得
                Wall wall = selectElement as Wall;
                string familyName = wall.WallType.FamilyName;
                string typeName = wall.WallType.Name;

                // 結果を表示
                TaskDialog.Show("選択された要素",
                    $"要素カテゴリ: {categeryName}\n" +
                    $"ファミリ名: {familyName}\n" +
                    $"タイプ名: {typeName}");

                return Result.Succeeded;

            }
            catch (Autodesk.Revit.Exceptions.OperationCanceledException)
            {
                // ユーザーがキャンセルした場合
                return Result.Cancelled;
            }
            catch (Exception ex)
            {
                // その他のエラーが発生した場合
                message = $"エラーが発生しました: {ex.Message}";
                return Result.Failed;
            }
        }
    }
}
