Управление обновлением вложенных семейств при загрузке семейства в проект

Автор Тема: Управление обновлением вложенных семейств при загрузке семейства в проект  (Прочитано 2125 раз)

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

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Привет,
Есть проект с семействами "Родительское семейство 1" и "Родительское семейство 2", в которых есть вложенное семейство "Вложенное семейство":

и файл семейства "Родительское семейство 2" с измененным вложенным семейством.
При загрузке этого семейства в проект руками ревит спрашивает обновлять ли само родительское семейство:

потом справшивает обновлять ли вложенное семейство:


Как при программной загрузке семейства получить имя обновляемого общего семейства? (как на скрине выше)

Тестовый пример:
Код - C# [Выбрать]
  1. namespace TestRevitSubFamilyLoad
  2. {
  3.     using System.IO;
  4.     using System.Windows;
  5.     using Autodesk.Revit.Attributes;
  6.     using Autodesk.Revit.DB;
  7.     using Autodesk.Revit.UI;
  8.  
  9.     [Transaction(TransactionMode.Manual)]
  10.     [Regeneration(RegenerationOption.Manual)]
  11.     public class Command : IExternalCommand
  12.     {        
  13.         public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
  14.         {
  15.             var doc = commandData.Application.ActiveUIDocument.Document;
  16.  
  17.             var familyFile = Path.Combine(
  18.                 Path.GetDirectoryName(typeof(Command).Assembly.Location),
  19.                 "Родительское семейство 1.rfa");
  20.  
  21.             using var t = new Transaction(doc, nameof(TestRevitSubFamilyLoad));
  22.             t.Start();
  23.             doc.LoadFamily(familyFile, new FamilyLoadOptions(), out var family);
  24.             t.Commit();
  25.             return Result.Succeeded;
  26.         }
  27.     }
  28.  
  29.     public class FamilyLoadOptions : IFamilyLoadOptions
  30.     {        
  31.         public bool OnFamilyFound(bool familyInUse, out bool overwriteParameterValues)
  32.         {
  33.             overwriteParameterValues = true;
  34.             return true;
  35.         }
  36.        
  37.         public bool OnSharedFamilyFound(
  38.             Family sharedFamily,
  39.             bool familyInUse,
  40.             out FamilySource source,
  41.             out bool overwriteParameterValues)
  42.         {
  43.             MessageBox.Show($"sharedFamily = {sharedFamily?.Name}");
  44.             source = FamilySource.Family;
  45.             overwriteParameterValues = true;
  46.             return true;
  47.         }
  48.     }
  49. }

Как я думал, в метод OnSharedFamilyFound будут попадать вложенные семейства, но прилетает только родительское семейство:



Тестовый проект с файлами ревита в архиве.

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Причем, если использовать UIDocument.GetRevitUIFamilyLoadOptions(), то выскакивает это штатное окно обновления общего вложенного семейства. 
Как он это делает?  ???

Отмечено как Решение Вильдар 10-06-2022, 12:09:17

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Можно попробовать отлавливать событие открытия штатного диалога обновления общего семейства и отвечать на него за пользователя (uiApplication.DialogBoxShowing). только как-то имя общего семейства опять же получать (парсить из свойства Message в TaskDialogShowingEventArgs).
https://www.revitapidocs.com/2022/cb46ea4c-2b80-0ec2-063f-dda6f662948a.htm
« Последнее редактирование: 10-06-2022, 12:17:15 от Вильдар »