Как заполнить данными в "Типоразмеры в семействе" с помощью Revit API?

Автор Тема: Как заполнить данными в "Типоразмеры в семействе" с помощью Revit API?  (Прочитано 2584 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн UnixАвтор темы

  • ADN OPEN
  • Сообщений: 2
  • Карма: 0
Как заполнить данными в "Типоразмеры в семействе" с помощью Revit API (Visual Studio). Нужно сделать выпадающие списки и т. д.. И я так понимаю нужно еще получать доступ к файлу .rfa
« Последнее редактирование: 31-07-2018, 16:12:37 от Unix »

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Вопрос достаточно сильно размыт. Если Вы спрашиваете, как реализовать UI, то Вы спокойно можете использовать технологии WPF или WinForms, доступные из .Net. Для начала нерекомендую использовать немодальные диалоги, это реально, но нужно использовать специальные средства, т.е. ваше окно в коде команды должно вызываться с помощью метода ShowDialog(), а не Show()

Дальше, Вам нужно решить, где команда будет вызываться, в редакторе семейств или в самом проекте, от этого будет зависеть реализация.

Если в проекте, Вам нужно найти любой типоразмер интересующего Вас семейства, на его основе с помощью метода Duplicate() создать новый типоразмер, и назначить ему необходимые параметры

Если в семействе, вызываете метод doc.FamilyManager.NewType(), устанавливаете его текущим doc.FamilyManager.CurrentType = ... и с помощью метода Set для всех нужных Вам параметров задаете значения

Оффлайн UnixАвтор темы

  • ADN OPEN
  • Сообщений: 2
  • Карма: 0
Если в проекте, Вам нужно найти любой типоразмер интересующего Вас семейства, на его основе с помощью метода Duplicate() создать новый типоразмер, и назначить ему необходимые параметры
А можно по-подробнее (с примером кода если можно, в этом деле я новичок поэтому с примером кода будет проще разобраться)

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Ну, например, как-то так:
Код - C# [Выбрать]
  1. using System;
  2. using System.Linq;
  3. using Autodesk.Revit.Attributes;
  4. using Autodesk.Revit.DB;
  5. using Autodesk.Revit.UI;
  6.  
  7. namespace CreateFamilyType
  8. {
  9.     [Transaction(TransactionMode.Manual)]
  10.     public class CreateFamilyTypeCommand : IExternalCommand
  11.     {
  12.         private const string NewSymbolName = "1200 x 1830mm";
  13.  
  14.         public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
  15.         {
  16.             var uiapp = commandData.Application;
  17.             var uidoc = uiapp.ActiveUIDocument;
  18.             var doc = uidoc.Document;
  19.  
  20.             var familySymbol = FindWindowFamily(doc);
  21.  
  22.             if (familySymbol == null)
  23.             {
  24.                 message = "Искомое семейство отсутствует в проекте";
  25.  
  26.                 return Result.Failed;
  27.             }
  28.  
  29.             if (ContainsSymbol(familySymbol.Family))
  30.             {
  31.                 message = "Типоразмер уже существует";
  32.  
  33.                 return Result.Failed;
  34.             }
  35.  
  36.             using (var transaction = new Transaction(doc, "Новый типоразмер"))
  37.             {
  38.                 transaction.Start();
  39.  
  40.                 CreateFamilySymbol(familySymbol);
  41.  
  42.                 transaction.Commit();
  43.             }
  44.  
  45.             return Result.Succeeded;
  46.         }
  47.  
  48.         private static void CreateFamilySymbol(FamilySymbol existingFamilySymbol)
  49.         {
  50.             var newFamilySymbol = existingFamilySymbol.Duplicate(NewSymbolName);
  51.  
  52.             newFamilySymbol
  53.                 .get_Parameter(BuiltInParameter.DOOR_WIDTH)
  54.                 ?.Set(UnitUtils.ConvertToInternalUnits(1200, DisplayUnitType.DUT_MILLIMETERS));
  55.  
  56.             newFamilySymbol
  57.                 .get_Parameter(BuiltInParameter.GENERIC_HEIGHT)
  58.                 ?.Set(UnitUtils.ConvertToInternalUnits(1830, DisplayUnitType.DUT_MILLIMETERS));
  59.         }
  60.  
  61.         private static bool ContainsSymbol(Family family)
  62.         {
  63.             return family
  64.                 .GetFamilySymbolIds()
  65.                 .Select(family.Document.GetElement)
  66.                 .Any(x => x.Name.Equals(NewSymbolName, StringComparison.OrdinalIgnoreCase));
  67.         }
  68.  
  69.         private static FamilySymbol FindWindowFamily(Document document)
  70.         {
  71.             var familyNameRule = ParameterFilterRuleFactory.CreateEqualsRule(new ElementId(BuiltInParameter.ALL_MODEL_FAMILY_NAME), "M_Fixed", false);
  72.  
  73.             var filter = new ElementParameterFilter(familyNameRule);
  74.  
  75.             var collector = new FilteredElementCollector(document);
  76.  
  77.             return (FamilySymbol) collector
  78.                 .WhereElementIsElementType()
  79.                 .OfCategory(BuiltInCategory.OST_Windows)
  80.                 .WherePasses(filter)
  81.                 .OfClass(typeof(FamilySymbol))
  82.                 .FirstElement();
  83.         }
  84.     }
  85. }
  86.  

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc