Сообщество программистов Autodesk в СНГ

ADN Club => Revit API => Тема начата: Unix от 31-07-2018, 10:41:46

Название: Как заполнить данными в "Типоразмеры в семействе" с помощью Revit API?
Отправлено: Unix от 31-07-2018, 10:41:46
Как заполнить данными в "Типоразмеры в семействе" с помощью Revit API (Visual Studio). Нужно сделать выпадающие списки и т. д.. И я так понимаю нужно еще получать доступ к файлу .rfa
Название: Re: Как заполнить данными в "Типоразмеры в семействе" с помощью Revit API?
Отправлено: Александр Игнатович от 31-07-2018, 11:03:24
Вопрос достаточно сильно размыт. Если Вы спрашиваете, как реализовать UI, то Вы спокойно можете использовать технологии WPF или WinForms, доступные из .Net. Для начала нерекомендую использовать немодальные диалоги, это реально, но нужно использовать специальные средства, т.е. ваше окно в коде команды должно вызываться с помощью метода ShowDialog(), а не Show()

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

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

Если в семействе, вызываете метод doc.FamilyManager.NewType(), устанавливаете его текущим doc.FamilyManager.CurrentType = ... и с помощью метода Set для всех нужных Вам параметров задаете значения
Название: Re: Как заполнить данными в "Типоразмеры в семействе" с помощью Revit API?
Отправлено: Unix от 31-07-2018, 11:10:55
Если в проекте, Вам нужно найти любой типоразмер интересующего Вас семейства, на его основе с помощью метода Duplicate() создать новый типоразмер, и назначить ему необходимые параметры
А можно по-подробнее (с примером кода если можно, в этом деле я новичок поэтому с примером кода будет проще разобраться)
Название: Re: Как заполнить данными в "Типоразмеры в семействе" с помощью Revit API?
Отправлено: Александр Игнатович от 31-07-2018, 11:29:13
Ну, например, как-то так:
Код - 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.  
Название: Re: Как заполнить данными в "Типоразмеры в семействе" с помощью Revit API?
Отправлено: Александр Игнатович от 31-07-2018, 11:32:11
Вообще посмотрите
http://thebuildingcoder.typepad.com/blog/about-the-author.html#2