Странное поведение кода на разных машинах

Автор Тема: Странное поведение кода на разных машинах  (Прочитано 4998 раз)

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

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

  • ADN OPEN
  • **
  • Сообщений: 87
  • Карма: 0
Здравствуйте! Возникла следующая ситуация, может кто сталкивался.
Сделал кнопку в плагине, которая получает определенные аттрибуты из выделенных элементов.
Элемент модели может содержать вкладку "Process" и аттрибут "OID"
Элемент модели может содержать вкладку "AECOSim" и аттрибут "uid"
Элемент не содержит ни одной из этих вкладок.
Пользователь выделяет элементы, нажимает кнопку и если в элементах есть каой нибудь из этих аттрибутов записывает их значения в комментарий.
Тестировал на нескольких машинах, все работает.
Отдаю заказчику, он тестирует у себя и говорит, что если он выделяет элементы, которые содержат вкладку "process". все работае и заполняется нормально, но при попытке взять аттрибут со вкладки "AECOSim", Navis крашится с ошибкой об отправке отчета и закрывается. Я не могу понять в чем причина, я обернул все в блок try-catch, по идее он должен ловить исключения и не крашится...
Может ли это быть связано с тем, что заказчик венгерский и винда и все языковые настройки у него на венгерском? Или же в коде что делаю не так?

Вот метод, который  вызывается при нажатии на кнопку:
Код - C# [Выбрать]
  1. private void OID_Click(object sender, RoutedEventArgs e)
  2. {
  3.         try
  4.         {
  5.                 DocumentParts.DocumentCurrentSelection curSel = Application.ActiveDocument.CurrentSelection;
  6.                 if (curSel.SelectedItems.Count > 0)
  7.                 {
  8.                         ModelItemCollection selectedItems = curSel.SelectedItems;
  9.                         string val = String.Empty;
  10.                         int i = 1;
  11.                         foreach (ModelItem modelItem in selectedItems)
  12.                         {
  13.                                 if (modelItem == null) continue;
  14.                                 if (GetValueFromModelItem(modelItem, "General", "OID") != null)
  15.                                         val += $"\nItem {i}: {GetValueFromModelItem(modelItem, "General", "OID")}";
  16.  
  17.                                 if (GetValueFromModelItem(modelItem, "AECOsimID", "uid") != null)
  18.                                         val += $"\nItem {i}: {GetValueFromModelItem(modelItem, "AECOsimID", "uid")}";
  19.  
  20.                                 i++;
  21.                         }
  22.                         NoteText.AppendText(val);
  23.                 }
  24.         }
  25.         catch (Exception exception)
  26.         {
  27.                 //ignore
  28.         }
  29.  
  30. }
  31.  
  32. private string GetValueFromModelItem(ModelItem modelItem, string categoryName, string propertyName)
  33. {
  34.         if (modelItem.PropertyCategories.FindCategoryByDisplayName(categoryName) == null)
  35.         {
  36.                 if (modelItem.Parent != null)
  37.                 {
  38.                         var parent = modelItem.Parent;
  39.                         if (parent.PropertyCategories.FindCategoryByDisplayName(categoryName) == null)
  40.                         else
  41.                         {
  42.                                 DataProperty getValParent = parent.PropertyCategories.FindPropertyByDisplayName(categoryName, propertyName);
  43.                                 if (getValParent != null)
  44.                                 {
  45.                                         return getValParent.Value.ToDisplayString();
  46.                                 }
  47.                         }
  48.                 }
  49.         }
  50.         else
  51.         {
  52.                 DataProperty getVal = modelItem.PropertyCategories.FindPropertyByDisplayName(categoryName, propertyName);
  53.                 if (getVal == null)
  54.                         MessageBox.Show($"Элемент {modelItem.DisplayName}. {categoryName} Найдена, но нет параметра {propertyName}.Запись не произведена")
  55.                 else
  56.                 {
  57.                         return getVal.Value.ToDisplayString();
  58.                 }
  59.         }
  60.         return null;
  61.  
  62. }
  63.  

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Рекомендую вставить отладочную печать в файл, для того чтобы локализовать проблемное место.
Что касается кода, то явных ошибок я не увидел, но очень мне не нравятся две вещи:
1. Повторный вызов GetValueFromModelItem, который происходит в строках типа $"GetValueFromModelItem(...)"
2. Странный условный оператор:
Код - C# [Выбрать]
  1. if (parent.PropertyCategories.FindCategoryByDisplayName(categoryName) == null)
  2.                         else
  3. { ... }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 87
  • Карма: 0
Отладочная печать, это вы имеете ввиду system.diagnostics.debug.print?
Да, теперь эти вещи мне тоже не нравятся) Исправлю, спасибо)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Отладочная печать, это вы имеете ввиду system.diagnostics.debug.print?
Да как угодно. Например, открыть файл на запись и в каждом ключевом месте в него записывать отладочную информацию, чтобы было понятно где происходит аварийное завершение.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 87
  • Карма: 0
Понял, спасибо!