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

ADN Club => Revit API => Тема начата: v13 от 29-04-2022, 12:49:26

Название: Проблема при использование WPF Button в Revit
Отправлено: v13 от 29-04-2022, 12:49:26
Здравствуйте, скажите пожалуйста в чем причина проблемы:
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. }
Название: Re: Проблема при использование WPF Button в Revit
Отправлено: v13 от 29-04-2022, 12:52:36
Выкладываю изначальный код на котором обнаружилась данная проблема, вернее это созданный мною тестовый вариант с целью понятия природы проблемы

Код - 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. }
Название: Re: Проблема при использование WPF Button в Revit
Отправлено: Александр Пекшев aka Modis от 29-04-2022, 13:06:17
Окно как открываете - Show() или ShowDialog()?
Название: Re: Проблема при использование WPF Button в Revit
Отправлено: v13 от 29-04-2022, 13:55:00
ShowDialog(), но через Show() результат тот же
Название: Re: Проблема при использование WPF Button в Revit
Отправлено: Александр Пекшев aka Modis от 29-04-2022, 14:07:17
Второй кнопкой добавляю элемент панели в эту цепь, при добавлении Revit Вылетает
Так вы вносите правки в документ без транзакции. К тому же еще и не используете try{} catch{}, который помог бы вам понять в чем проблема
Название: Re: Проблема при использование WPF Button в Revit
Отправлено: v13 от 29-04-2022, 14:10:30
Транзакция происходит в 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. }
Название: Re: Проблема при использование WPF Button в Revit
Отправлено: Александр Пекшев aka Modis от 29-04-2022, 14:12:54
Транзакция происходит в Main
Ну вот же у вас в коде Show, а не ShowDialog. Ваша транзакция зафиксировалась уже в тот момент, когда вы окно увидели
Название: Re: Проблема при использование WPF Button в Revit
Отправлено: v13 от 29-04-2022, 14:15:07
Изначально было ShowDialog(), я и так и так пробовал, осталась последняя версия
Название: Re: Проблема при использование WPF Button в Revit
Отправлено: Александр Пекшев aka Modis от 29-04-2022, 14:19:09
v13, видимо, слушать намеки вы не очень хотите. Ок, пишу в лоб - оберните содержимое метода Button2Click в try{} catch{} и посмотрите что будет написано в ошибке
Название: Re: Проблема при использование WPF Button в Revit
Отправлено: v13 от 29-04-2022, 14:24:08
Да, сейчас делаю, в принципе ошибка мне известна и выглядит вот так

(https://i.postimg.cc/Lg23W6zh/photo-2022-04-28-20-38-01.jpg) (https://postimg.cc/Lg23W6zh)
Название: Re: Проблема при использование WPF Button в Revit
Отправлено: Александр Пекшев aka Modis от 29-04-2022, 14:30:35
Да, сейчас делаю, в принципе ошибка мне известна и выглядит вот так

Так не факт, что это связано с окном. Internal error часто говорит о том, что в метод подано что-то очень некорректное и Ревит не смог это обработать
Название: Re: Проблема при использование WPF Button в Revit
Отправлено: v13 от 29-04-2022, 14:35:39
да я понимаю, но вот так с использованием одной кнопки все работает

Код - 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. }
Название: Re: Проблема при использование WPF Button в Revit
Отправлено: v13 от 29-04-2022, 14:44:18
Как я уже писал в начале, в том то и проблема что если одной кнопкой создать элемент а потом второй кнопкой произвести операцию с ним (причем я пробовал даже 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
Название: Re: Проблема при использование WPF Button в Revit
Отправлено: Александр Пекшев aka Modis от 29-04-2022, 15:11:28
Попробуйте убрать изменение свойства видимости окна Visibility (тем более у вас вроде оно там и не нужно) или заменить их на Hide() и ShowDialog()
Название: Re: Проблема при использование WPF Button в Revit
Отправлено: v13 от 29-04-2022, 15:41:06
К сожаление сделать без Visibility.Hidden при ShowDialog() не представляется возможным, т.к. не получается получить доступ к Selection в окне Revit при открытом окне, но получается при Show().
Тем не менее, полностью убранный Visibility не помог, тот же exception продолжает появляться.
Название: Re: Проблема при использование WPF Button в Revit
Отправлено: Александр Пекшев aka Modis от 29-04-2022, 15:45:20
К сожаление сделать без Visibility.Hidden при ShowDialog() не представляется возможным
С чего это вдруг? Вместо Visibility.Hidden нужно использовать метод Hide(), а вместо Visibility.Visible метод ShowDialog()
Название: Re: Проблема при использование WPF Button в Revit
Отправлено: v13 от 29-04-2022, 15:57:35
Да так и сделал, сначала недопонял просто, к сожалению то же исключение((

Код - 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.                         Hide();
  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.                         ShowDialog();
  31.                 }
  32.  
  33.                 private void Button2Click(object sender, RoutedEventArgs e)
  34.                 {
  35.                         Hide();
  36.                         FamilyInstance element = ElementDeterminant.getElement(uidoc) as FamilyInstance;
  37.                         try
  38.                         {
  39.                                 mySystem.SelectPanel(element); // Внутренняя ошибка Revit при обработке данной строки
  40.                                 TextBox2.Text = $"панель {element.Name} добавлена";
  41.                         }
  42.                         catch (Exception InternalException)
  43.                         {
  44.                                 TextBox2.Text = "Ошибка InternalException";
  45.                         }
  46.                         ShowDialog();
  47.                 }
  48.         }
  49. }