Map 3D. Ошибка при переклассификации COGO-точек. Civil 3D 2015, .NET 4.5

Автор Тема: Map 3D. Ошибка при переклассификации COGO-точек. Civil 3D 2015, .NET 4.5  (Прочитано 16697 раз)

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

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

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

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

Код - C# [Выбрать]
  1. private static void Classify(ObjectId objectId, string className, params string[] properties)
  2. {
  3.         var manager = HostMapApplicationServices.Application.ActiveProject.ClassificationManager;
  4.  
  5.         // здесь классифицируем
  6.         using (var ids = new ObjectIdCollection { objectId })
  7.         using (var failIds = new ObjectIdCollection())
  8.         {
  9.                 var errorCodes = new FeatureClassErrorCodeCollection();
  10.                 // manager.Unclassify(objectId); <-- Не помогает
  11.                 manager.Classify(failIds, errorCodes, ids, className, true, true);
  12.         }
  13.  
  14.         // ниже выставляем значения свойств
  15.         using (var featureClassDefinition = manager[className])
  16.         {
  17.                 var collection = new StringCollection { "Пользовательский" };
  18.  
  19.                 foreach (var propertyName in properties)
  20.                 {
  21.                         using (var property = featureClassDefinition.GetProperty(collection, propertyName))
  22.                         {
  23.                                 var value = property.FromString(DateTime.Now.Millisecond.ToString());
  24.                                 try
  25.                                 {
  26.                                         property.SetValue(objectId, value, true);
  27.                                 }
  28.                                 catch (MapFeatureClassException mfce)
  29.                                 {
  30.                                         Trace.WriteLine((FeatureClassErrorCode)mfce.ErrorCode);
  31.                                         throw;
  32.                                 }
  33.                         }
  34.                 }
  35.         }
  36. }
  37.  

Пусть у нас в файле описаний будет 2 класса: Класс 1 со свойствами Свойство 1 и Свойство 2 и Класс 2 (Свойство 3 и Свойство 4).
При классификации точки в первый раз, мы можем увидеть что для объекта успешно задан класс и заполнены свойства:



При переклассификации на выставлении значений свойств вылетает MapFeatureClassException с (FeatureClassErrorCode)mfce.ErrorCode == FeatureClassErrorCode.PropertyNotFound.
И правда, если мы взглянем в свойства объекта, то увидим что одного из свойств Класса 2 нет:



Собственно, вопрос: как это можно обойти?

Тестовый проект, чертеж с коготочкой, файл описаний и картинка-инструкция по его присоединению в аттаче.

Для того, чтобы воспроизвести ошибку, надо:
  1. Открыть приложенный чертеж с коготочкой (или вообще любой чертеж с коготочками),
  2. Присоединить файл описаний (приложена картинка из моей предыдущей темы, для 15 цивила шаги аналогичны),
  3. Вызвать последовательно команды CLASSIFY1 и CLASSIFY2 из приложенного проекта.

P.S. Совсем вылетело из головы. Цивил для приложенного тестового проекта должен быть русским, так как в других локализациях категория Пользовательский имеет другое название.
« Последнее редактирование: 09-09-2015, 05:59:50 от TAPRAA »

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

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

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

  • ADN Club
  • Сообщений: 12
  • Карма: 0
  • До-диез
  • Skype: tapraa
Надеюсь, что это версия Civil 3D со всеми обновлениями?
На момент написания первого сообщения в теме стоял SP1, после накатывания SP2 поведение не изменилось.

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

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

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

  • ADN Club
  • Сообщений: 12
  • Карма: 0
  • До-диез
  • Skype: tapraa
А если накатить ещё и ServicePack 3: http://knowledge.autodesk.com/support/autocad-civil-3d/downloads/caas/downloads/content/autodesk-C2-AE-autocad-C2-AE-civil-3d-C2-AE-2015-service-pack-3.html
Видимо, третий пак прошел мимо меня. Спасибо за ссылку :), но это не помогло :(.

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

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Поведение подтверждаю, AutoCAD Civil 3D 2016 SP1 Rus.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Мне вот интересно можно ли один примитив классифицировать двумя разными классами? По логике такое должно быть невозможным. Соответственно manager.Unclassify(objectId) должно бы убирать старый класс и позволить классифицировать новым классом. Но и это тоже не работает.
Проверил на таком коде:
Код - C# [Выбрать]
  1. using (var ids = new ObjectIdCollection { objectId })
  2. using (var failIds = new ObjectIdCollection())
  3. using (var clsdIds = manager.GetClassifiedEntities())
  4. {
  5.   if (clsdIds.Contains(objectId))
  6.   {
  7.     manager.Unclassify(objectId);
  8.   }
  9.   manager.Classify(objectId, className, true, true);
  10. }
Исключение возникает на строке 3. Так что похоже это вообще всё не работает.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737

И еще наблюдения. Когда классификация с объекта снимается, у объекта остаются значения свойств для класса. Вот если бы понять, где они сохраняются... Может быть, тогда удалось бы их "подчищать" перед новой классификацией.

И напоследок. Если у классов одинаковые свойства - переклассификация проходит без ошибок (см. вложенный XML файл).
« Последнее редактирование: 09-09-2015, 00:45:36 от Дмитрий Загорулькин »

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

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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
В составе ObjectARX for AutoCAD Map 3D есть куча примеров, в том числе и на C#.
Решил проверить пример ClassificationCS оттуда. Результат такой же самый:

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • Сообщений: 12
  • Карма: 0
  • До-диез
  • Skype: tapraa
Ждем ответа от ADN DevHelp, чтобы документально подтвердился баг (опционально с путями его обхода).

Извините, вам запрещён просмотр содержимого спойлеров.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
У меня есть предположение, что это некоторая особенность. При переназначении класса, мы ожидаем, что свойства 1 и 2 будут удалены - ведь их нет в классе 2. Но в них могут содержаться важные данные и Map не дает этого сделать. В результате возникает внутренняя ошибка.

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

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

И это предположение не выдержало проверку тестом, в котором свойства предыдущего класса перед классификацией выставлялись в null.


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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
но против него говорит тот факт, что при назначении второго класса не появляется свойство 4.
Мы не знаем внутренних механизмов этих методов. Я заглянул внутрь этой dll - она просто является оберткой для ARX объектов. Так что, остается только гадать, как там и что. Поэтому, я пока что не вижу противоречий между моим предположением и фактом, что 4-е свойство не появляется.
И это предположение не выдержало проверку тестом, в котором свойства предыдущего класса перед классификацией выставлялись в null.
А я и не говорил, что проверяется значение свойства.
Но:
Если у классов одинаковые свойства - переклассификация проходит без ошибок
Это меня наводит на такие мысли.
Но это все гадание на кофейной гуще... посмотрим, что ответят в ADN.