PaletteSet фатальная ошибка Autocad

Автор Тема: PaletteSet фатальная ошибка Autocad  (Прочитано 3797 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN OPEN
  • Сообщений: 46
  • Карма: 1
Добрый день всем!
В примере Дмитрия Загорулькина по палитре, после ее запуска командой, если закрыть только чертеж, возникает фатальная ошибка. Если закрыть автокад (автокад 2020), то ошибка не возникает. Что может вызывать эту фатальную ошибку. В интернете по коду ошибки ничего нет. Картинку с ошибкой приложил.
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Runtime;
  5. using Autodesk.AutoCAD.Windows;
  6. using System;
  7. using System.Linq;
  8.  
  9. namespace AcObjPropPaletteSample
  10. {
  11.     public class CirclesPaletteCmd
  12.     {
  13.         static string _paletteGUID = "0E225673-BD26-4ED9-8E75-44E9EE19EEE5";
  14.  
  15.         /// <summary>
  16.         /// Поле для хранения ссылки на палитру
  17.         /// </summary>
  18.         static PaletteSet _paletteSet;
  19.  
  20.         static CirclesEditor _editorControl;
  21.  
  22.         [CommandMethod("DZagCirclesPalette")]
  23.         public static void PaletteOnOff()
  24.         {
  25.             if (_paletteSet == null)
  26.             {
  27.                 _paletteSet = new PaletteSet
  28.                     // Название палитры
  29.                     ("Свойства окружностей",
  30.                     // Команда открытия палитры
  31.                     "DZagCirclesPalette",
  32.                     // GUID палитры
  33.                     new Guid(_paletteGUID));
  34.  
  35.                 _editorControl = new CirclesEditor();
  36.                 _paletteSet.AddVisual("Свойства окружностей", _editorControl);
  37.  
  38.                 _paletteSet.Style =
  39.                     PaletteSetStyles.ShowPropertiesMenu
  40.                     | PaletteSetStyles.ShowAutoHideButton
  41.                     | PaletteSetStyles.ShowCloseButton
  42.                     | PaletteSetStyles.Snappable;
  43.  
  44.                 _paletteSet.DockEnabled =
  45.                     DockSides.None | DockSides.Left | DockSides.Right;
  46.  
  47.                 _paletteSet.MinimumSize = new System.Drawing.Size(300, 500);
  48.  
  49.                 foreach (Document doc in Application.DocumentManager)
  50.                 {
  51.                     doc.ImpliedSelectionChanged -= doc_ImpliedSelectionChanged;
  52.                     doc.ImpliedSelectionChanged += doc_ImpliedSelectionChanged;
  53.                 }
  54.  
  55.                 Application.DocumentManager.DocumentCreated += DocumentManager_DocumentCreated;
  56.                 Application.DocumentManager.DocumentActivated += DocumentManager_DocumentActivated;
  57.  
  58.                 _paletteSet.Visible = true;
  59.             }
  60.             else
  61.             {
  62.                 _paletteSet.Visible = !_paletteSet.Visible;
  63.             }
  64.  
  65.             Document adoc = Application.DocumentManager.MdiActiveDocument;
  66.             if (adoc != null)
  67.                 ShowPropsSelImpliedParts(adoc);
  68.         }
  69.  
  70.         ///*
  71.         /// <summary>
  72.         /// Обработка реакции на выбор объектов - отобразить данные в палитре
  73.         /// </summary>
  74.         /// <param name="sender"></param>
  75.         /// <param name="e"></param>
  76.         static void doc_ImpliedSelectionChanged(object sender, EventArgs e)
  77.         {
  78.             ShowPropsSelImpliedParts(sender as Document);
  79.         }
  80.  
  81.         ///*
  82.         /// <summary>
  83.         ///
  84.         /// </summary>
  85.         /// <param name="sender"></param>
  86.         /// <param name="e"></param>
  87.         static void DocumentManager_DocumentActivated
  88.             (object sender, DocumentCollectionEventArgs e)
  89.         {
  90.             ShowPropsSelImpliedParts(e.Document);
  91.         }
  92.  
  93.         ///*
  94.         /// <summary>
  95.         ///
  96.         /// </summary>
  97.         /// <param name="sender"></param>
  98.         /// <param name="e"></param>
  99.         static void DocumentManager_DocumentCreated
  100.             (object sender, DocumentCollectionEventArgs e)
  101.         {
  102.             if (e.Document != null)
  103.             {
  104.                 e.Document.ImpliedSelectionChanged -= doc_ImpliedSelectionChanged;
  105.                 e.Document.ImpliedSelectionChanged += doc_ImpliedSelectionChanged;
  106.             }
  107.         }
  108.  
  109.         static void ShowPropsSelImpliedParts(Document adoc)
  110.         {
  111.             if (_paletteSet != null && _paletteSet.Visible)
  112.             {
  113.                 _editorControl.Visibility = System.Windows.Visibility.Collapsed;
  114.  
  115.                 Editor ed = adoc.Editor;                
  116.  
  117.                 // Получаем предварительно выбранные объекты
  118.                 PromptSelectionResult impSelRes = ed.SelectImplied();
  119.  
  120.                 if (impSelRes.Status != PromptStatus.OK) return;
  121.  
  122.                 ObjectId[] objIds = impSelRes.Value.GetObjectIds();
  123.  
  124.                 // Если хотя бы один объект коллекции
  125.                 if (!objIds.All(item =>                
  126.                     // Не является окружностью
  127.                     item.ObjectClass.DxfName.Equals
  128.                         ("CIRCLE", StringComparison.InvariantCultureIgnoreCase)))
  129.                 {
  130.                     return;
  131.                 }
  132.  
  133.                 _editorControl.Visibility = System.Windows.Visibility.Visible;  
  134.                 _editorControl.SetData(new CirclesSummaryProps(objIds));                            
  135.             }
  136.         }
  137.     }
  138. }
  139.  
  140.  

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: PaletteSet фатальная ошибка Autocad
« Ответ #1 : 19-01-2023, 09:56:54 »
Да нашли у кого примеры смотреть! Загорулькин тот ещё косячник...
В событиях doc_ImpliedSelectionChanged и DocumentManager_DocumentActivated нет проверки, что документ может быть null, потому и фаталит. Это легко отладкой поймать можно.

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

  • ADN OPEN
  • Сообщений: 46
  • Карма: 1
Re: PaletteSet фатальная ошибка Autocad
« Ответ #2 : 19-01-2023, 10:08:02 »
Так?:
Код - C# [Выбрать]
  1. static void doc_ImpliedSelectionChanged(object sender, EventArgs e)
  2.         {
  3.             Document adoc = Application.DocumentManager.MdiActiveDocument;
  4.             if (adoc != null)
  5.                 ShowPropsSelImpliedParts(sender as Document);
  6.         }
  7.  
  8.         ///*
  9.         /// <summary>
  10.         ///
  11.         /// </summary>
  12.         /// <param name="sender"></param>
  13.         /// <param name="e"></param>
  14.         static void DocumentManager_DocumentActivated(object sender, DocumentCollectionEventArgs e)
  15.         {
  16.             Document adoc = Application.DocumentManager.MdiActiveDocument;
  17.             if (adoc != null)
  18.                 ShowPropsSelImpliedParts(e.Document);
  19.         }
  20.  

Отмечено как Решение zr74 19-01-2023, 10:16:30

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: PaletteSet фатальная ошибка Autocad
« Ответ #3 : 19-01-2023, 10:12:11 »
Лучше так:
Код - C# [Выбрать]
  1. static void doc_ImpliedSelectionChanged(object sender, EventArgs e)
  2. {
  3.     var doc = sender as Document;
  4.     if (doc != null)
  5.         ShowPropsSelImpliedParts(doc);
  6. }
  7.  
  8. ///*
  9. /// <summary>
  10. ///
  11. /// </summary>
  12. /// <param name="sender"></param>
  13. /// <param name="e"></param>
  14. static void DocumentManager_DocumentActivated(object sender, DocumentCollectionEventArgs e)
  15. {
  16.     var doc = e.Document;
  17.     if (doc != null)
  18.         ShowPropsSelImpliedParts(doc);
  19. }

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

  • ADN OPEN
  • Сообщений: 46
  • Карма: 1
Re: PaletteSet фатальная ошибка Autocad
« Ответ #4 : 19-01-2023, 10:16:54 »
Спасибо!