Фатал в FirstEntityIsDrawnBeforeSecond

Автор Тема: Фатал в FirstEntityIsDrawnBeforeSecond  (Прочитано 2448 раз)

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

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

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Фатал в FirstEntityIsDrawnBeforeSecond
« : 13-08-2018, 12:52:54 »
Пытаюсь понять какой объект начерчен "поверх". Вызов DrawOrderTable.FirstEntityIsDrawnBeforeSecond вызывает фатал Автокада при подстановке любых объектов. Никаких Exception. Никто с таким не сталкивался?
Тестирую на AutoCAD 2018 и 2019 x64. Тот же код прекрасно работает в НЕ-Автодесковком API, так что косяк, похоже, не мой. Но как найти верхний объект без этого метода? Можно без фатала получить какие-то GetSortHandle, но как их применить для сравнения - не понятно.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Фатал в FirstEntityIsDrawnBeforeSecond
« Ответ #1 : 13-08-2018, 13:29:08 »
avc
Давай тестовый пример. Посмотрю.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение avc 13-08-2018, 16:01:12

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Фатал в FirstEntityIsDrawnBeforeSecond
« Ответ #2 : 13-08-2018, 14:16:09 »
Решил не ждать примера, а нарисовать свой:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Runtime;
  5.  
  6. // This line is not mandatory, but improves loading performances
  7. [assembly: CommandClass(typeof(GetSortOrder.MyCommands))]
  8.  
  9. namespace GetSortOrder
  10. {
  11.   public class MyCommands
  12.   {
  13.     [CommandMethod("GetSortOrder")]
  14.     public void GetSortOrder()
  15.     {
  16.       Document doc = Application.DocumentManager.MdiActiveDocument;
  17.       if (doc == null) return;
  18.       Editor ed = doc.Editor;
  19.       PromptEntityResult rs1 = ed.GetEntity("\nВыберите первый примитив: ");
  20.       if (rs1.Status != PromptStatus.OK) return;
  21.       PromptEntityResult rs2 = ed.GetEntity("\nВыберите второй примитив: ");
  22.       if (rs2.Status != PromptStatus.OK) return;
  23.       if (rs1.ObjectId == rs2.ObjectId)
  24.       {
  25.         ed.WriteMessage("\nВыбран один и тот же примитив");
  26.         return;
  27.       }
  28.       using (Transaction tr = doc.TransactionManager.StartTransaction())
  29.       {
  30.         BlockTableRecord curSpace =
  31.           tr.GetObject(doc.Database.CurrentSpaceId, OpenMode.ForRead) as BlockTableRecord;
  32.         if (curSpace != null)
  33.         {
  34.           DrawOrderTable sortTab =
  35.             tr.GetObject(curSpace.DrawOrderTableId, OpenMode.ForRead) as DrawOrderTable;
  36.           Handle h1 = sortTab.GetSortHandle(rs1.ObjectId);
  37.           Handle h2 = sortTab.GetSortHandle(rs2.ObjectId);
  38.           if (h1.Value > h2.Value)
  39.             ed.WriteMessage("\nПервый примитив рисуется после второго примитива.");
  40.           else
  41.             ed.WriteMessage("\nВторой примитив рисуется после первого примитива.");
  42.         }
  43.         tr.Commit();
  44.       }
  45.     }
  46.   }
  47. }



Внимание! Учти что h1 и h2 - это не метки примитивов. Это порядковые номера записанные в виде меток.
« Последнее редактирование: 13-08-2018, 14:53:39 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Фатал в FirstEntityIsDrawnBeforeSecond
« Ответ #3 : 13-08-2018, 14:19:22 »
Проверил и FirstEntityIsDrawnBeforeSecond в AutoCAD 2019 x64. С ним у меня тоже нормально работает:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Runtime;
  5.  
  6. // This line is not mandatory, but improves loading performances
  7. [assembly: CommandClass(typeof(GetSortOrder.MyCommands))]
  8.  
  9. namespace GetSortOrder
  10. {
  11.   public class MyCommands
  12.   {
  13.     [CommandMethod("GetSortOrder")]
  14.     public void GetSortOrder()
  15.     {
  16.       Document doc = Application.DocumentManager.MdiActiveDocument;
  17.       if (doc == null) return;
  18.       Editor ed = doc.Editor;
  19.       PromptEntityResult rs1 = ed.GetEntity("\nВыберите первый примитив: ");
  20.       if (rs1.Status != PromptStatus.OK) return;
  21.       PromptEntityResult rs2 = ed.GetEntity("\nВыберите второй примитив: ");
  22.       if (rs2.Status != PromptStatus.OK) return;
  23.       if (rs1.ObjectId == rs2.ObjectId)
  24.       {
  25.         ed.WriteMessage("\nВыбран один и тот же примитив");
  26.         return;
  27.       }
  28.       using (Transaction tr = doc.TransactionManager.StartTransaction())
  29.       {
  30.         BlockTableRecord curSpace =
  31.           tr.GetObject(doc.Database.CurrentSpaceId, OpenMode.ForRead) as BlockTableRecord;
  32.         if (curSpace != null)
  33.         {
  34.           DrawOrderTable sortTab =
  35.             tr.GetObject(curSpace.DrawOrderTableId, OpenMode.ForRead) as DrawOrderTable;
  36.           //Handle h1 = sortTab.GetSortHandle(rs1.ObjectId);
  37.           //Handle h2 = sortTab.GetSortHandle(rs2.ObjectId);
  38.           //if (h1.Value > h2.Value)
  39.           //  ed.WriteMessage("\nПервый примитив рисуется после второго примитива.");
  40.           //else
  41.           //  ed.WriteMessage("\nВторой примитив рисуется после первого примитива.");
  42.           if (!sortTab.FirstEntityIsDrawnBeforeSecond(rs1.ObjectId, rs2.ObjectId))
  43.             ed.WriteMessage("\nПервый примитив рисуется после второго примитива.");
  44.           else
  45.             ed.WriteMessage("\nВторой примитив рисуется после первого примитива.");
  46.         }
  47.         tr.Commit();
  48.       }
  49.     }
  50.   }
  51. }

(видео делать не стал, но работает точно так же, как и первый пример).
« Последнее редактирование: 13-08-2018, 14:54:00 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Re: Фатал в FirstEntityIsDrawnBeforeSecond
« Ответ #4 : 13-08-2018, 16:01:03 »
Спасибо большое! Сам подозревал что эти хенделы и есть порядок прорисовки, но на тестах почему-то они не меняли при перестановке объектов. Показалось наверно. Сейчас все работает.
А ваш код с FirstEntityIsDrawnBeforeSecond стабильно вышибает Автокад. B 2018 и 2019. И под отладчиком и без. Компилирую для .Net 4.0 в конфигурации Debug, т.е. без всякой оптимизации. Чудеса...

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Фатал в FirstEntityIsDrawnBeforeSecond
« Ответ #5 : 13-08-2018, 16:09:44 »
Возможно из-за того, что .NET 4.0. Кстати, а на какие dll-файлы ты ссылаешься?
Посмотри мой проект - исправь путь для ссылок на ObjectARX SDK 2019
В архиве чертеж, на котором я экспериментировал: GetSortOrder\GetSortOrder\bin\Debug\Чертеж1.dwg
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Фатал в FirstEntityIsDrawnBeforeSecond
« Ответ #6 : 13-08-2018, 16:14:34 »
Компилирую для .Net 4.0 в конфигурации Debug, т.е. без всякой оптимизации.
С .NET 4.0 у меня не компилируется вообще (и не должно):
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets(2106,5): warning MSB3274: The primary reference "AcDbMgd" could not be resolved because it was built against the ".NETFramework,Version=v4.7" framework. This is a higher version than the currently targeted framework ".NETFramework,Version=v4.0".
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets(2106,5): warning MSB3275: The primary reference "AcCoreMgd" could not be resolved because it has an indirect dependency on the assembly "Acdbmgd, Version=23.0.0.0, Culture=neutral, PublicKeyToken=null" which was built against the ".NETFramework,Version=v4.7" framework. This is a higher version than the currently targeted framework ".NETFramework,Version=v4.0".
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets(2106,5): warning MSB3275: The primary reference "AcMgd" could not be resolved because it has an indirect dependency on the assembly "Acdbmgd, Version=23.0.0.0, Culture=neutral, PublicKeyToken=null" which was built against the ".NETFramework,Version=v4.7" framework. This is a higher version than the currently targeted framework ".NETFramework,Version=v4.0".
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Re: Фатал в FirstEntityIsDrawnBeforeSecond
« Ответ #7 : 13-08-2018, 16:36:35 »
Разобрался. Ошибка только на одном тестовом файле. И там похоже криво записан порядок прорисовки. Я даже догадываюсь чей это косяк. На всех остальных чертежах фатала нет. Но метод сравнения хенделов показал свою дуракоустойчивость, так что буду пользоваться именно им.
Еще раз спасибо!