using System;
using System.Linq;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
 
namespace CreateFamilyType
{
    [Transaction(TransactionMode.Manual)]
    public class CreateFamilyTypeCommand : IExternalCommand
    {
        private const string NewSymbolName = "1200 x 1830mm";
 
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            var uiapp = commandData.Application;
            var uidoc = uiapp.ActiveUIDocument;
            var doc = uidoc.Document;
 
            var familySymbol = FindWindowFamily(doc);
 
            if (familySymbol == null)
            {
                message = "Искомое семейство отсутствует в проекте";
 
                return Result.Failed;
            }
 
            if (ContainsSymbol(familySymbol.Family))
            {
                message = "Типоразмер уже существует";
 
                return Result.Failed;
            }
 
            using (var transaction = new Transaction(doc, "Новый типоразмер"))
            {
                transaction.Start();
 
                CreateFamilySymbol(familySymbol);
 
                transaction.Commit();
            }
 
            return Result.Succeeded;
        }
 
        private static void CreateFamilySymbol(FamilySymbol existingFamilySymbol)
        {
            var newFamilySymbol = existingFamilySymbol.Duplicate(NewSymbolName);
 
            newFamilySymbol
                .get_Parameter(BuiltInParameter.DOOR_WIDTH)
                ?.Set(UnitUtils.ConvertToInternalUnits(1200, DisplayUnitType.DUT_MILLIMETERS));
 
            newFamilySymbol
                .get_Parameter(BuiltInParameter.GENERIC_HEIGHT)
                ?.Set(UnitUtils.ConvertToInternalUnits(1830, DisplayUnitType.DUT_MILLIMETERS));
        }
 
        private static bool ContainsSymbol(Family family)
        {
            return family
                .GetFamilySymbolIds()
                .Select(family.Document.GetElement)
                .Any(x => x.Name.Equals(NewSymbolName, StringComparison.OrdinalIgnoreCase));
        }
 
        private static FamilySymbol FindWindowFamily(Document document)
        {
            var familyNameRule = ParameterFilterRuleFactory.CreateEqualsRule(new ElementId(BuiltInParameter.ALL_MODEL_FAMILY_NAME), "M_Fixed", false);
 
            var filter = new ElementParameterFilter(familyNameRule);
 
            var collector = new FilteredElementCollector(document);
 
            return (FamilySymbol) collector
                .WhereElementIsElementType()
                .OfCategory(BuiltInCategory.OST_Windows)
                .WherePasses(filter)
                .OfClass(typeof(FamilySymbol))
                .FirstElement();
        }
    }
}