AeccPoint и классификатор Map 3D. AccessViolationException

Автор Тема: AeccPoint и классификатор Map 3D. AccessViolationException  (Прочитано 11414 раз)

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

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

Оффлайн Разживин АлексейАвтор темы

  • ADN Club
  • Сообщений: 12
  • Карма: 0
  • До-диез
  • Skype: tapraa
Всем привет. Поставлена задача проклассифицировать коготочку с помощью кода. Я пытаюсь это сделать так:
Код - C# [Выбрать]
  1. public void Method()
  2. {
  3.         IAcadApplication acadApp = (IAcadApplication)Application.AcadApplication;
  4.         Editor acadEditor = Application.DocumentManager.MdiActiveDocument.Editor;
  5.  
  6.         IAeccApplication civilApp = (IAeccApplication)acadApp.GetInterfaceObject("AeccXUiLand.AeccApplication.9.0");
  7.         IAeccDocument civilDoc = (IAeccDocument)civilApp.ActiveDocument;
  8.  
  9.         AeccPoints points = civilDoc.Points;
  10.  
  11.         PromptPointOptions opt = new PromptPointOptions("\nPosition: ") { AllowNone = true };
  12.         PromptPointResult pos = acadEditor.GetPoint(opt);
  13.         if (pos.Status != PromptStatus.OK)
  14.         {
  15.                 return;
  16.         }
  17.  
  18.         AeccPoint newPoint = points.Add(pos.Value.ToArray());
  19.         ObjectId objId = new ObjectId(new IntPtr(newPoint.ObjectID));
  20.  
  21.         HostMapApplicationServices.Application.ActiveProject.ClassificationManager.Classify(objId, "Отметка высот", true, true);
  22. }

Если метод выполняется в первый раз, то все нормально. При повторном вызове выполнение доходит до строки
Код - C# [Выбрать]
  1. AeccPoint newPoint = points.Add(pos.Value.ToArray());
и кидается AccessViolationException c последующим крашем автокада.

Если же убрать классификацию, то метод можно смело вызывать много раз подряд не боясь уронить автокад.

Подскажите, в чем может быть проблема. Это или я как-то не так это делаю? Может быть это баг автокада, и если да, то как его можно обойти?

.NET 4.0, C#, Autodesk Civil 3D 2012
« Последнее редактирование: 08-06-2015, 16:05:49 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
TAPRAA
Приветствую на форуме!
1. Обрати внимание на то, как нужно форматировать код на этом форуме. Смотри у меня в подписи.
2. Судя по всему это действительно баг Civil 3D 2012. Так как эта версия уже не поддерживается (поддерживаются только последние три версии), то врядли кто-то сможет помочь.
Надеюсь, что у тебя установлен последний Service Pack на Civil 3D 2012. Если я правильно помню, то это последний: AutoCAD Civil 3D 2012 Service Pack 4 (Update 4)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
На уровне предположения:
Классификатор блокирует доступ к точкам. Поэтому, при повторной попытке обратиться к ним через COM, вызывается исключение.
Код - C# [Выбрать]
  1. HostMapApplicationServices.Application.ActiveProject.ClassificationManager.Classify
Это что-то гисовское. Какую DLL подключали, чтобы был доступен этот метод?

Оффлайн Разживин АлексейАвтор темы

  • ADN Club
  • Сообщений: 12
  • Карма: 0
  • До-диез
  • Skype: tapraa
TAPRAA
Приветствую на форуме!
1. Обрати внимание на то, как нужно форматировать код на этом форуме. Смотри у меня в подписи.
Благодарю за приветствие и за помощь в форматировании кода :) Обязательно приму к сведению.

2. Судя по всему это действительно баг Civil 3D 2012. Так как эта версия уже не поддерживается (поддерживаются только последние три версии), то врядли кто-то сможет помочь.
Надеюсь, что у тебя установлен последний Service Pack на Civil 3D 2012. Если я правильно помню, то это последний: AutoCAD Civil 3D 2012 Service Pack 4 (Update 4)
На момент поднятия темы у меня стоял SP2, после накатывания SP4 поведение в отношении кода выше ну никак не изменилось. Если баг цивила никак не исправить, то может быть есть какие-нибудь способы его обойти? Иначе придется писать огромную портянку-обоснование заказчику, почему мы не можем реализовать данный функционал. :-\

Код - C# [Выбрать]
  1. HostMapApplicationServices.Application.ActiveProject.ClassificationManager.Classify
Это что-то гисовское. Какую DLL подключали, чтобы был доступен этот метод?
Используется либа ManagedMapApi.dll, которая находится в корневой либе цивила. Судя по неймспейсам, это гисы :)
Использующиеся классы:
Код - C# [Выбрать]
  1. Autodesk.Gis.Map.HostMapApplicationServices;
  2. Autodesk.Gis.Map.MapApplication;
  3. Autodesk.Gis.Map.Project.ProjectModel;
  4. Autodesk.Gis.Map.Classification.ClassificationManager;

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Какие настройки должны быть в чертеже, чтобы этот код работал? Я попробовал запустить, у меня сразу выдало исключение в методе классификации. Подозреваю, что "Отметка высот" - это какая-то настройка в чертеже, которая у меня отсутствует, из-за этого и исключение.
Или, еще лучше будет, если поделитесь чертежом для опытов.

Оффлайн Разживин АлексейАвтор темы

  • ADN Club
  • Сообщений: 12
  • Карма: 0
  • До-диез
  • Skype: tapraa
Какие настройки должны быть в чертеже, чтобы этот код работал? Я попробовал запустить, у меня сразу выдало исключение в методе классификации. Подозреваю, что "Отметка высот" - это какая-то настройка в чертеже, которая у меня отсутствует, из-за этого и исключение.
Или, еще лучше будет, если поделитесь чертежом для опытов.

Для того, чтобы код работал, необходимо к чертежу подключить файл описания классов. Картинка-инструкция и обновленный файл классификатора во вложении к этому сообщению.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Хм... в 2014 версии код работает без ошибок. Либо в версии 2012 баг, либо какие-то другие действия влияют на ее появление. Я пробовал вот такой код:
Код - C# [Выбрать]
  1. using System;
  2.  
  3. using Autodesk.AECC.Interop.Land;
  4. using Autodesk.AECC.Interop.UiLand;
  5. using Autodesk.AutoCAD.ApplicationServices;
  6. using Autodesk.AutoCAD.DatabaseServices;
  7. using Autodesk.AutoCAD.EditorInput;
  8. using Autodesk.AutoCAD.Interop;
  9. using Autodesk.AutoCAD.Runtime;
  10. using Autodesk.Gis.Map;
  11.  
  12. namespace CivilTest
  13. {
  14.     public class PointsTest
  15.     {
  16.         [CommandMethod("TestPoints")]
  17.         public void Method()
  18.         {
  19.             IAcadApplication acadApp = (IAcadApplication)Application.AcadApplication;
  20.             Editor acadEditor = Application.DocumentManager.MdiActiveDocument.Editor;
  21.  
  22.             IAeccApplication civilApp = (IAeccApplication)acadApp.GetInterfaceObject("AeccXUiLand.AeccApplication.10.3");
  23.             IAeccDocument civilDoc = (IAeccDocument)civilApp.ActiveDocument;
  24.  
  25.             AeccPoints points = civilDoc.Points;
  26.  
  27.             Database db = Application.DocumentManager.MdiActiveDocument.Database;
  28.  
  29.             PromptPointOptions opt = new PromptPointOptions("\nPosition: ")
  30.             {
  31.                 AllowNone = true
  32.             };
  33.  
  34.             PromptPointResult pos = acadEditor.GetPoint(opt);
  35.             if (pos.Status != PromptStatus.OK)
  36.             {
  37.                 return;
  38.             }
  39.  
  40.             AeccPoint newPoint = points.Add(pos.Value.ToArray());
  41.  
  42.             long idNumb = newPoint.ObjectID;
  43.  
  44.             IntPtr intPtr = new IntPtr(idNumb);
  45.  
  46.             ObjectId objId = new ObjectId(intPtr);
  47.  
  48.             HostMapApplicationServices.Application.ActiveProject.ClassificationManager.Classify(objId, "Отметка высот", true, true);          
  49.         }
  50.     }
  51. }
  52.  
Если именно в таком виде 2012 будет вылетать с ошибкой - значит, с большой вероятностью, это баг версии. Лучше попробовать на абсолютно пустом чертеже, для чистоты эксперимента.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Хм... в 2014 версии код работает без ошибок.
При многократном выполнении?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Да, я вставлял точки, пока не надоело.

P.S. правда, при попытке сохранить чертеж, вылезает сообщение об ошибке. Audit ошибок не находит, но после него сохраняет нормально.

Оффлайн Разживин АлексейАвтор темы

  • ADN Club
  • Сообщений: 12
  • Карма: 0
  • До-диез
  • Skype: tapraa
Если делать создание коготочек через .NET API с последующей классификацией, то не только фатала не будет, но и проблем с сохранением. Через .NET API вообще все просто, понятно и гладко  Но проблема в том, что это доступно только с 2013 цивила.

Код под 2013 цивил:

Код - C# [Выбрать]
  1. [assembly: Autodesk.AutoCAD.Runtime.CommandClass(typeof(Project1.Class1))]
  2.  
  3. namespace Project1
  4. {
  5.         using Autodesk.AutoCAD.EditorInput;
  6.         using Autodesk.AutoCAD.Runtime;
  7.         using Autodesk.Civil.ApplicationServices;
  8.         using Autodesk.Gis.Map;
  9.  
  10.         using Application = Autodesk.AutoCAD.ApplicationServices.Core.Application;
  11.  
  12.         public class Class1
  13.         {
  14.                 [CommandMethod("METH")]
  15.                 public void Method()
  16.                 {
  17.                         var acadDoc = Application.DocumentManager.MdiActiveDocument;
  18.                         var acadEditor = acadDoc.Editor;
  19.                        
  20.                         var opt = new PromptPointOptions("\nPosition: ") { AllowNone = true };
  21.                         var pos = acadEditor.GetPoint(opt);
  22.                         if (pos.Status != PromptStatus.OK)
  23.                         {
  24.                                 return;
  25.                         }
  26.  
  27.                         using (var trans = acadDoc.Database.TransactionManager.StartTransaction())
  28.                         {
  29.                                 var cogoPoints = CivilApplication.ActiveDocument.CogoPoints;
  30.                                 var pointId = cogoPoints.Add(pos.Value, "Новая точка");
  31.                                 HostMapApplicationServices.Application.ActiveProject.ClassificationManager.Classify(pointId, "Отметка высот", true, true);
  32.                                 trans.Commit();
  33.                         }
  34.                 }
  35.         }
  36. }
  37.  

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Забудьте вы про эту 2012 версию, пора уже переходить на более новые :)

Отмечено как Решение Разживин Алексей 09-06-2015, 12:21:19

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Но проблема в том, что это доступно только с 2013 цивила.
Вопрос не имеет решения, о чем я уже выше писал. Обратиться в Autodesk (ADN DevHelp) с этом вопросом нельзя, т.к. версия не поддерживается, а в более новых всё работает.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Разживин АлексейАвтор темы

  • ADN Club
  • Сообщений: 12
  • Карма: 0
  • До-диез
  • Skype: tapraa
Эх, придется строчить портянку заказчику. Всем спасибо, что откликнулись по теме.

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

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