Проблема при использование WPF Button в Revit

Автор Тема: Проблема при использование WPF Button в Revit  (Прочитано 3959 раз)

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

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

  • ADN OPEN
  • Сообщений: 23
  • Карма: 1
Здравствуйте, скажите пожалуйста в чем причина проблемы:
1) Создаю WPF Window с двумя кнопками
2) Первой кнопкой создаю цепь по выбору оконечного элемента
3) Второй кнопкой добавляю элемент панели в эту цепь, при добавлении Revit Вылетает

Если обе операции делать одной кнопкой то все работает, при изучении вопроса понял что на второй кнопке перестает много чего работать, например Document.Regenerate().
Вылет происходит только если в первой кнопке создается цепь. Подскажите в чем может быть проблема?

Код - C# [Выбрать]
  1. namespace ChainTest
  2. {
  3.         public partial class MainPanel : Window
  4.         {
  5.                 public UIDocument uidoc;
  6.                 public Document doc;
  7.                 public ExternalCommandData commandData;
  8.                 public ElectricalSystem mySystem = null;
  9.  
  10.                 public MainPanel(ExternalCommandData intCommandData)
  11.                 {
  12.                         InitializeComponent();
  13.                         commandData = intCommandData;
  14.                         uidoc = commandData.Application.ActiveUIDocument;
  15.                         doc = uidoc.Document;
  16.                 }
  17.  
  18.                 private void Button1Click(object sender, RoutedEventArgs e)
  19.                 {
  20.                         Visibility = System.Windows.Visibility.Hidden;
  21.                         FamilyInstance element = ElementDeterminant.getElement(uidoc) as FamilyInstance;
  22.                         Connector c1 = null;
  23.                         ConnectorSet b = element.MEPModel.ConnectorManager.Connectors;
  24.                         foreach (Connector item in b)
  25.                         {
  26.                                 c1 = item;
  27.                         }
  28.                         mySystem = ElectricalSystem.Create(c1, c1.ElectricalSystemType);
  29.                         TextBox1.Text = $"Система создана {mySystem.Name}";
  30.                         Visibility = System.Windows.Visibility.Visible;
  31.                 }
  32.  
  33.                 private void Button2Click(object sender, RoutedEventArgs e)
  34.                 {
  35.                         TextBox2.Text = $"{doc.Title}";
  36.                         doc.Regenerate(); // Внутренняя ошибка Revit при обработке данной строки
  37.                 }
  38.         }
  39. }

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

  • ADN OPEN
  • Сообщений: 23
  • Карма: 1
Выкладываю изначальный код на котором обнаружилась данная проблема, вернее это созданный мною тестовый вариант с целью понятия природы проблемы

Код - C# [Выбрать]
  1. namespace ChainTest
  2. {
  3.         public partial class MainPanel : Window
  4.         {
  5.                 public UIDocument uidoc;
  6.                 public Document doc;
  7.                 public ExternalCommandData commandData;
  8.                 public ElectricalSystem mySystem = null;
  9.  
  10.                 public MainPanel(ExternalCommandData intCommandData)
  11.                 {
  12.                         InitializeComponent();
  13.                         commandData = intCommandData;
  14.                         uidoc = commandData.Application.ActiveUIDocument;
  15.                         doc = uidoc.Document;
  16.                 }
  17.  
  18.                 private void Button1Click(object sender, RoutedEventArgs e)
  19.                 {
  20.                         Visibility = System.Windows.Visibility.Hidden;
  21.                         FamilyInstance element = ElementDeterminant.getElement(uidoc) as FamilyInstance;
  22.                         Connector c1 = null;
  23.                         ConnectorSet b = element.MEPModel.ConnectorManager.Connectors;
  24.                         foreach (Connector item in b)
  25.                         {
  26.                                 c1 = item;
  27.                         }
  28.                         mySystem = ElectricalSystem.Create(c1, c1.ElectricalSystemType);
  29.                         TextBox1.Text = $"Система создана {mySystem.Name}";
  30.                         Visibility = System.Windows.Visibility.Visible;
  31.                 }
  32.  
  33.                 private void Button2Click(object sender, RoutedEventArgs e)
  34.                 {
  35.                         Visibility = System.Windows.Visibility.Hidden;
  36.                         FamilyInstance element = ElementDeterminant.getElement(uidoc) as FamilyInstance;
  37.                         mySystem.SelectPanel(element); // Внутренняя ошибка Revit при обработке данной строки
  38.                         TextBox2.Text = $"панель {element.Name} добавлена";
  39.                         Visibility = System.Windows.Visibility.Visible;
  40.                 }
  41.         }
  42. }

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Окно как открываете - Show() или ShowDialog()?

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

  • ADN OPEN
  • Сообщений: 23
  • Карма: 1
ShowDialog(), но через Show() результат тот же

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Второй кнопкой добавляю элемент панели в эту цепь, при добавлении Revit Вылетает
Так вы вносите правки в документ без транзакции. К тому же еще и не используете try{} catch{}, который помог бы вам понять в чем проблема

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

  • ADN OPEN
  • Сообщений: 23
  • Карма: 1
Транзакция происходит в Main
Код - C# [Выбрать]
  1. namespace ChainTest
  2. {
  3.         [TransactionAttribute(TransactionMode.Manual)]
  4.         [RegenerationAttribute(RegenerationOption.Manual)]
  5.  
  6.         public class Main : IExternalCommand
  7.         {
  8.                 public ExternalCommandData ComDat;
  9.                 public Document doc;
  10.                 public Application app;
  11.                 public UIDocument uidoc;
  12.  
  13.                 public FamilyInstance cabinet;
  14.                 public List<FamilyInstance> panels;
  15.  
  16.                 //MAIN START
  17.                 public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
  18.                 {
  19.                         ComDat = commandData;
  20.                         uidoc = commandData.Application.ActiveUIDocument;
  21.                         doc = uidoc.Document;
  22.  
  23.                         FilteredElementCollector FEC = new FilteredElementCollector(doc);
  24.                         var elCircuit = FEC.OfCategory(BuiltInCategory.OST_ElectricalCircuit).WhereElementIsNotElementType();
  25.                         using (Transaction t = new Transaction(doc, "ElectricalSystem create"))
  26.                         {
  27.                                 t.Start();
  28.                                 MainPanel mainPanel = new MainPanel(ComDat);
  29.                                 mainPanel.Show();
  30.                                 t.Commit();
  31.                         }
  32.                         return Result.Succeeded;
  33.                 }
  34.         }
  35. }

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Транзакция происходит в Main
Ну вот же у вас в коде Show, а не ShowDialog. Ваша транзакция зафиксировалась уже в тот момент, когда вы окно увидели

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

  • ADN OPEN
  • Сообщений: 23
  • Карма: 1
Изначально было ShowDialog(), я и так и так пробовал, осталась последняя версия

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
v13, видимо, слушать намеки вы не очень хотите. Ок, пишу в лоб - оберните содержимое метода Button2Click в try{} catch{} и посмотрите что будет написано в ошибке

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

  • ADN OPEN
  • Сообщений: 23
  • Карма: 1
Да, сейчас делаю, в принципе ошибка мне известна и выглядит вот так



Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Да, сейчас делаю, в принципе ошибка мне известна и выглядит вот так

Так не факт, что это связано с окном. Internal error часто говорит о том, что в метод подано что-то очень некорректное и Ревит не смог это обработать

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

  • ADN OPEN
  • Сообщений: 23
  • Карма: 1
да я понимаю, но вот так с использованием одной кнопки все работает

Код - C# [Выбрать]
  1. namespace ChainTest
  2. {
  3.         public partial class MainPanel : Window
  4.         {
  5.                 public UIDocument uidoc;
  6.                 public Document doc;
  7.                 public ExternalCommandData commandData;
  8.                 public ElectricalSystem mySystem = null;
  9.  
  10.                 public MainPanel(ExternalCommandData intCommandData)
  11.                 {
  12.                         InitializeComponent();
  13.                         commandData = intCommandData;
  14.                         uidoc = commandData.Application.ActiveUIDocument;
  15.                         doc = uidoc.Document;
  16.                 }
  17.  
  18.                 private void Button1Click(object sender, RoutedEventArgs e)
  19.                 {
  20.                         Visibility = System.Windows.Visibility.Hidden;
  21.                         FamilyInstance element = ElementDeterminant.getElement(uidoc) as FamilyInstance;
  22.                         Connector c1 = null;
  23.                         ConnectorSet b = element.MEPModel.ConnectorManager.Connectors;
  24.                         foreach (Connector item in b)
  25.                         {
  26.                                 c1 = item;
  27.                         }
  28.                         mySystem = ElectricalSystem.Create(c1, c1.ElectricalSystemType);
  29.                         TextBox1.Text = $"Система создана {mySystem.Name}";
  30.                         FamilyInstance element1 = ElementDeterminant.getElement(uidoc) as FamilyInstance;
  31.                         mySystem.SelectPanel(element1); // Внутренняя ошибка Revit ранее происходила вот сдесь
  32.                         TextBox2.Text = $"панель {element.Name} добавлена";
  33.                         Visibility = System.Windows.Visibility.Visible;
  34.                 }
  35.         }
  36. }

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

  • ADN OPEN
  • Сообщений: 23
  • Карма: 1
Как я уже писал в начале, в том то и проблема что если одной кнопкой создать элемент а потом второй кнопкой произвести операцию с ним (причем я пробовал даже doc.Regenerate в первом посте) то возникает InternalException.
Если проводить все эти операции в первой кнопке то все происходит нормально. Вот природу этого я понять и не могу.

Exception из try\catch:
 Autodesk.Revit.Exceptions.InternalException: An internal error has occurred.
  в Autodesk.Revit.DB.Electrical.ElectricalSystem.SelectPanel(FamilyInstance panel)
  в ChainTest.MainPanel.Button2Click(Object sender, RoutedEventArgs e) в C:\RevitAPI\C_Sharp\SKS_plugin\SKS_chain_test\ChainTest\MainPanel.xaml.cs:строка 65

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Попробуйте убрать изменение свойства видимости окна Visibility (тем более у вас вроде оно там и не нужно) или заменить их на Hide() и ShowDialog()

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

  • ADN OPEN
  • Сообщений: 23
  • Карма: 1
К сожаление сделать без Visibility.Hidden при ShowDialog() не представляется возможным, т.к. не получается получить доступ к Selection в окне Revit при открытом окне, но получается при Show().
Тем не менее, полностью убранный Visibility не помог, тот же exception продолжает появляться.