Команда вставки внешней ссылки

Автор Тема: Команда вставки внешней ссылки  (Прочитано 887 раз)

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

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

  • ADN OPEN
  • Сообщений: 2
  • Карма: 0
Доброго времени суток!

Создал команду для вставки внешней ссылки. Все работает отлично, но только из метода Execute (из кнопки на вкладке REVIT). Вот ее код:

Код - C# [Выбрать]
  1. namespace RevitAddin1
  2. {
  3.     [Transaction(TransactionMode.Manual)]
  4.     public sealed partial class LinkAttach : IExternalCommand
  5.     {
  6.         public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
  7.         {
  8.             Result result = Result.Failed;
  9.  
  10.             UIApplication uiApplication = commandData.Application;
  11.             UIDocument uiDocument = uiApplication.ActiveUIDocument;
  12.             Document document = uiDocument.Document;
  13.  
  14.             List<string> links = new List<string>
  15.             {
  16.                 @"D:\1 temp\link1.rvt",
  17.                 @"D:\1 temp\link2.rvt"
  18.             };
  19.  
  20.             List<RevitLinkInstance> revitLinkInstances = new FilteredElementCollector(document)
  21.                 .OfClass(typeof(RevitLinkInstance))
  22.                 .Cast<RevitLinkInstance>()
  23.                 .ToList();
  24.  
  25.             foreach (RevitLinkInstance revitLinkInstance in revitLinkInstances)
  26.             {
  27.                 Document linkDocument = revitLinkInstance.GetLinkDocument();
  28.                 RevitLinkType linkType = document.GetElement(revitLinkInstance.GetTypeId()) as RevitLinkType;
  29.             }
  30.  
  31.             using (Transaction tr = new Transaction(document))
  32.             {
  33.                 tr.Start("Подключение ссылок");
  34.                 try
  35.                 {
  36.                     foreach (string link in links)
  37.                     {
  38.                         ModelPath linkpath = ModelPathUtils.ConvertUserVisiblePathToModelPath(link);
  39.                         RevitLinkOptions options = new RevitLinkOptions(false);
  40.                         LinkLoadResult linkLoadResult = RevitLinkType.Create(document, linkpath, options);
  41.                         RevitLinkInstance.Create(document, linkLoadResult.ElementId);
  42.                     }
  43.                     tr.Commit();
  44.                     return Result.Succeeded;
  45.                 }
  46.                 catch (Exception ex)
  47.                 {
  48.                     tr.RollBack();
  49.                     TaskDialog.Show("Revit", ex.Message);
  50.                 }
  51.             }
  52.             return result;
  53.         }
  54.     }
  55. }
  56.  

Теперь мне нужно перенести этот код в отдельный метод.
После переноса кода в отдельный метод внешние ссылки вставляются на мгновение и тут же исчезают. Вот код:

Код - C# [Выбрать]
  1. namespace RevitAddin1
  2. {
  3.     [Transaction(TransactionMode.Manual)]
  4.     public sealed partial class LinkAttach_2 : IExternalCommand
  5.     {
  6.         public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
  7.         {
  8.            Result result = Result.Failed;
  9.  
  10.             UIApplication uiApplication = commandData.Application;
  11.             UIDocument uiDocument = uiApplication.ActiveUIDocument;
  12.             Document document = uiDocument.Document;
  13.  
  14.             //using (Transaction transaction = new Transaction(document))
  15.             //{
  16.                 ExternalMethodLinkAttach(document);
  17.             //    transaction.Commit();
  18.             //}
  19.             return result;
  20.         }
  21.  
  22.         public Result ExternalMethodLinkAttach(Document document)
  23.         {
  24.             Result result = Result.Failed;
  25.             List<string> links = new List<string>
  26.                 {
  27.                     @"D:\1 temp\link1.rvt",
  28.                     @"D:\1 temp\link2.rvt"
  29.                 };
  30.  
  31.             List<RevitLinkInstance> revitLinkInstances = new FilteredElementCollector(document)
  32.                .OfClass(typeof(RevitLinkInstance))
  33.                .Cast<RevitLinkInstance>()
  34.                .ToList();
  35.  
  36.             foreach (RevitLinkInstance revitLinkInstance in revitLinkInstances)
  37.             {
  38.                 Document linkDocument = revitLinkInstance.GetLinkDocument();
  39.                 RevitLinkType linkType = document.GetElement(revitLinkInstance.GetTypeId()) as RevitLinkType;
  40.             }
  41.  
  42.             using (Transaction tr = new Transaction(document))
  43.             {
  44.                 tr.Start("Подключение связей");
  45.                 try
  46.                 {
  47.                     foreach (string link in links)
  48.                     {
  49.                         ModelPath linkpath = ModelPathUtils.ConvertUserVisiblePathToModelPath(link);
  50.                         RevitLinkOptions options = new RevitLinkOptions(false);
  51.                         LinkLoadResult linkLoadResult = RevitLinkType.Create(document, linkpath, options);
  52.                         RevitLinkInstance.Create(document, linkLoadResult.ElementId);
  53.                     }
  54.                     tr.Commit();
  55.                     return Result.Succeeded;
  56.                 }
  57.                 catch (Exception ex)
  58.                 {
  59.                     tr.RollBack();
  60.                     TaskDialog.Show("Revit", ex.Message);
  61.                 }
  62.                 tr.Commit();
  63.             }
  64.             return result;
  65.         }
  66.     }
  67. }

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

Заранее благодарю.


P.S. REVIT 2020, Windows 10 Pro Версия 20H2

Отмечено как Решение Александр Ривилис 09-06-2021, 15:30:43

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

  • Administrator
  • *****
  • Сообщений: 1074
  • Карма: 316
  • Skype: alexandr.ignatovich.itc
Re: Команда вставки внешней ссылки
« Ответ #1 : 08-06-2021, 17:49:02 »
А ничего, что ты из LinkAttach_2.Execute всегда Result.Failed отдаёшь?

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

  • ADN OPEN
  • Сообщений: 2
  • Карма: 0
Re: Команда вставки внешней ссылки
« Ответ #2 : 09-06-2021, 06:20:41 »
Действительно, причина была в Result.Failed.   Александр, большое спасибо за помощь!