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

#endregion

namespace RevitAddinCreateLevels
{
    [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;
            // レベル名とレベルの高さのデータを用意する
            Dictionary<string, double> levelData = new Dictionary<string, double>();
            levelData.Add("レベル 3", UnitUtils.ConvertToInternalUnits(8.0, UnitTypeId.Meters));
            levelData.Add("レベル 4", UnitUtils.ConvertToInternalUnits(12.0, UnitTypeId.Meters));
            levelData.Add("レベル 5", UnitUtils.ConvertToInternalUnits(16.0, UnitTypeId.Meters));

            //フロアープランのViewFamilyTypeを取得する
            ViewFamilyType floorPlanType = new FilteredElementCollector(doc)
                .OfClass(typeof(ViewFamilyType))
                .Cast<ViewFamilyType>()
                .FirstOrDefault(x => x.ViewFamily == ViewFamily.FloorPlan);
            //天井伏のViewFamilyTypeを取得する
            ViewFamilyType ceilingPlanType = new FilteredElementCollector(doc)
                .OfClass(typeof(ViewFamilyType))
                .Cast<ViewFamilyType>()
                .FirstOrDefault(x => x.ViewFamily == ViewFamily.CeilingPlan);

            using (Transaction tx = new Transaction(doc))
            {
                tx.Start("Transaction Create Levels");
                // 全てのレベルを作成する
                foreach (KeyValuePair<string,double> levelElevation in levelData)
                {
                    // レベルを作成する
                    Level level = Level.Create(doc, levelElevation.Value);
                    // レベル名を設定する
                    if(level != null)
                    {
                        level.Name = levelElevation.Key;
                    }
                    // 平面ビューを作成する
                    //平面ビュープランを作成
                    if(floorPlanType != null && level != null)
                    {
                        ViewPlan floorViewPlan = ViewPlan.Create(doc, floorPlanType.Id, level.Id);
                        //ビューの名前を設定
                        floorViewPlan.Name = levelElevation.Key;
                        //ビューのスケールを設定
                        floorViewPlan.Scale = 100;
                        // ビューテンプレートを適用
                        /*
                        string floorViewTemplateName = "ABCDEFG";
                        View floorViewTemplate = new FilteredElementCollector(doc)
                            .OfClass(typeof(View))
                            .Cast<View>()
                            .FirstOrDefault(v => v.Name.Equals(floorViewTemplateName) && v.IsTemplate);
                        if(floorViewTemplate != null)
                        {
                            floorViewPlan.ViewTemplateId = floorViewTemplate.Id;
                        }
                        */
                    }
                    //天井伏ビュープランを作成
                    if (ceilingPlanType != null && level != null)
                    {
                        ViewPlan ceilingViewPlan = ViewPlan.Create(doc, ceilingPlanType.Id, level.Id);
                        //ビューの名前を設定
                        ceilingViewPlan.Name = levelElevation.Key;
                        //ビューのスケールを設定
                        ceilingViewPlan.Scale = 100;
                        // ビューテンプレートを適用
                        /*
                        string ceilingViewTemplateName = "ABCDEFG";
                        View ceilingViewTemplate = new FilteredElementCollector(doc)
                            .OfClass(typeof(View))
                            .Cast<View>()
                            .FirstOrDefault(v => v.Name.Equals(ceilingViewTemplateName) && v.IsTemplate);
                        if(ceilingViewTemplate != null)
                        {
                            ceilingViewPlan.ViewTemplateId = ceilingViewTemplate.Id;
                        }
                        */
                    }
                }
                tx.Commit();
            }
            return Result.Succeeded;
        }
    }
}
