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

ADN Club => Revit API => Тема начата: Anatoly от 18-08-2017, 15:55:19

Название: Как вставить семейство с нужным типоразмером?
Отправлено: Anatoly от 18-08-2017, 15:55:19
Код
Код - vb.net [Выбрать]
  1. Dim familyType As FamilySymbol = TryCast(doc.GetElement(elementSet.First()), FamilySymbol)
вставляет первый типоразмер, а если у меня есть семейство с типоразмерами "a", "b", "c", "d", то как вставить, например с типоразмером "с"?
Название: Re: Как вставить семейство с нужным типоразмером?
Отправлено: Александр Пекшев aka Modis от 18-08-2017, 15:58:23
Код - C# [Выбрать]
  1.  /// <summary>Вставка семейства</summary>
  2.         /// <param name="uiApplication"></param>
  3.         private void InsertFamily(UIApplication uiApplication)
  4.         {
  5.             try
  6.             {
  7.                 var insertionPoint = XYZ.Zero;
  8.                 var doc = uiApplication.ActiveUIDocument.Document;
  9.                 FamilyInstance familyInstance = null;
  10.                 using (Transaction tr = new Transaction(doc, "PIK_ShowZero"))
  11.                 {
  12.                     tr.Start();
  13.                     Family family = (Family)doc.GetElement(_familyElementId);
  14.                     FamilySymbol familySymbol = (FamilySymbol)doc.GetElement(family.GetFamilySymbolIds().First());
  15.                     if (!familySymbol.IsActive)
  16.                         familySymbol.Activate();
  17.  
  18.                     familyInstance = doc.Create.NewFamilyInstance(insertionPoint, familySymbol, StructuralType.NonStructural);
  19.                     tr.Commit();
  20.                 }
  21.                 if (familyInstance != null)
  22.                 {
  23.                     var dialog = new TaskDialog("Системный ноль")
  24.                     {
  25.                         MainContent = "Семейство, обозначающее системный ноль, удачно вставлено"
  26.                     };
  27.                     dialog.AddCommandLink(TaskDialogCommandLinkId.CommandLink1, "Показать вставленное семейство");
  28.                     var dialogResult = dialog.Show();
  29.                     if (dialogResult == TaskDialogResult.CommandLink1)
  30.                     {
  31.                         uiApplication.ActiveUIDocument.ShowElements(familyInstance.Id);
  32.                     }
  33.                 }
  34.                 else TaskDialog.Show("Системный ноль", "Не получилось вставить семейство");
  35.             }
  36.             catch (Exception exception)
  37.             {
  38.                 Log.Error("ShowZero.InsertFamily", exception);
  39.                 TaskDialog.Show("Блииииин :(",
  40.                     "Что-то пошло не так:" + Environment.NewLine + exception.Message + Environment.NewLine +
  41.                     exception.StackTrace);
  42.             }
  43.         }
Название: Re: Как вставить семейство с нужным типоразмером?
Отправлено: Александр Пекшев aka Modis от 18-08-2017, 16:00:12
Т.е. Вам нужно family.GetFamilySymbolIds() - уже среди полученного списка искать нужный тип и вставлять его. Не забывайте активировать
Название: Re: Как вставить семейство с нужным типоразмером?
Отправлено: Anatoly от 19-08-2017, 13:29:50
Спасибо.
Так и сделал-в списке ищу нужный тип.
Код - vb.net [Выбрать]
  1.  If family IsNot Nothing Then
  2.    Dim elementSet As ISet(Of ElementId) = family.GetFamilySymbolIds()
  3.    For Each symbId In elementSet ' As ElementId  
  4.     Dim cursymb As FamilySymbol = doc.GetElement(symbId)
  5.     If cursymb.Name = "L35" Then
  6.      uidoc.PromptForFamilyInstancePlacement(cursymb)
  7.      isload = True
  8.      Exit For
  9.     End If
  10.    Next
Я вставляю семейство через указание пользователем на экране.

Кстати (прошу прощения, это уже другая тема) у меня после вставки ревит продолжает дальше просить следующие точки вставки.
Приходится два раза жать Esc.
Как бы осуществить одноразовую вставку?
Название: Re: Как вставить семейство с нужным типоразмером?
Отправлено: Александр Пекшев aka Modis от 20-08-2017, 12:46:04
Спасибо.
Так и сделал
Если ответ вам подошёл, то отметите его как решение
Кстати (прошу прощения, это уже другая тема) у меня после вставки ревит продолжает дальше просить следующие точки вставки.
Приходится два раза жать Esc.
Как бы осуществить одноразовую вставку?
Запустите отладку и посмотрите, что у вас происходит. Если не получится - создавайте новую тему с примером кода
Название: Re: Как вставить семейство с нужным типоразмером?
Отправлено: Александр Пекшев aka Modis от 20-08-2017, 12:49:13
у меня после вставки ревит продолжает дальше просить следующие точки вставки
А лучше почитайте справку к методу ;)
Цитировать
This method opens its own transaction, so it's not permitted to be invoked in an active transaction. In a single invocation, the user can place multiple instances of the input family type until they finish the placement (with Cancel or ESC or a click elsewhere in the UI). The user will not be permitted to change the type to be placed. Users are not permitted to change the active view during this placement operation (the operation will be completed).