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();
}
}
}