Как найти все поля (Field) в чертеже?

Автор Тема: Как найти все поля (Field) в чертеже?  (Прочитано 1775 раз)

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

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

  • Administrator
  • Сообщений: 0
  • Карма: 2

Оффлайн Владимир Шу

  • ADN Club
  • ****
  • Сообщений: 488
  • Карма: 112
    • ПГСу Бложик
Re: Как найти все поля (Field) в чертеже?
« Ответ #1 : 02-08-2019, 06:25:29 »
Попробую спросить тут...
Строка:
Код - C# [Выбрать]
  1. int res = acdbGetAdsName64(ref name, id);
тут name это структура
Код - C# [Выбрать]
  1.     public struct ads_name
  2.     {
  3.         public IntPtr a;
  4.         public IntPtr b;
  5.     };
id - Autodesk.AutoCAD.DatabaseServices.ObjectId объекта
если посмотреть внимательно в отладчике, то  ads_name.a == id

Собственно вопрос: что это за второй указатель в ads_name.b ? и есть ли возможность его получить не импортируя платформозависимую acdbGetAdsNameXX ?

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

  • Administrator
  • *****
  • Сообщений: 9911
  • Карма: 1271
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как найти все поля (Field) в чертеже?
« Ответ #2 : 02-08-2019, 07:48:26 »
Собственно вопрос: что это за второй указатель в ads_name.b ? и есть ли возможность его получить не импортируя платформозависимую acdbGetAdsNameXX ?
Вообще-то и a и b - это не указатели, а длинные целые числа. Насколько я помню, обычно b == 0. Но в общем случае без acdbGetAdsName тебе не обойтись.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Владимир Шу

  • ADN Club
  • ****
  • Сообщений: 488
  • Карма: 112
    • ПГСу Бложик
Re: Как найти все поля (Field) в чертеже?
« Ответ #3 : 02-08-2019, 08:30:56 »
Несколько дней ковыряюсь и b ни разу не было равно 0, а вот a всегда равно ObjectId.

В cтруктуре ads_name, а и b имеют тип struct System.IntPtr, а справка говорит что это:
"Определяемый платформой тип, который используется для представления указателя или дескриптора."

Но в общем случае без acdbGetAdsName тебе не обойтись.
А хотелось бы...

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

  • Administrator
  • *****
  • Сообщений: 9911
  • Карма: 1271
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как найти все поля (Field) в чертеже?
« Ответ #4 : 02-08-2019, 08:43:24 »
В cтруктуре ads_name, а и b имеют тип struct System.IntPtr, а справка говорит что это:
"Определяемый платформой тип, который используется для представления указателя или дескриптора."
Только для того, чтобы иметь два 4(или 8)-байтовых поля выровненных на границу 4(или 8)-байт.
В C++:
Код - C++ [Выбрать]
  1. #if (defined(_MSC_VER) && defined(_WIN64)) || (defined(__clang__) && defined(__LP64__))
  2. typedef int64_t ads_name[2];
  3. #else
  4. typedef int32_t ads_name[2];
  5. #endif
  6.  
« Последнее редактирование: 02-08-2019, 14:36:36 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Владимир Шу

  • ADN Club
  • ****
  • Сообщений: 488
  • Карма: 112
    • ПГСу Бложик
Re: Как найти все поля (Field) в чертеже?
« Ответ #5 : 05-08-2019, 22:05:38 »
Ладно... на время оставлю поиск ссылок. Перейду к следующему действию...

Как найти все поля стало понятно, как пересчитать все поля и найти битые так же стало понятно (Autodesk.AutoCAD.DatabaseServices.FieldEvaluationStatusResult и Autodesk.AutoCAD.DatabaseServices.FieldState).
Следующее логичное действие - показать/подсветить пользователю "сломанные" поля и вот тут смотрю по F12, смотрю в отладчике, но не могу найти методы или ссылки на места вставки этих полей, есть только владелец, но это ссылка на NOD, эти данные у объекта Поле есть или надо тупо перебирать все объекты по всем блокам в BlockTable в поисках?
Последнего, конечно, хочется меньше всего...

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

  • Administrator
  • *****
  • Сообщений: 9911
  • Карма: 1271
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как найти все поля (Field) в чертеже?
« Ответ #6 : 05-08-2019, 22:24:39 »
но не могу найти методы или ссылки на места вставки этих полей
Насколько я помню такого и нет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Владимир Шу

  • ADN Club
  • ****
  • Сообщений: 488
  • Карма: 112
    • ПГСу Бложик
Re: Как найти все поля (Field) в чертеже?
« Ответ #7 : 05-08-2019, 22:28:12 »
Вроде бы можно найти, через пару владельцев вверх, но я не уверен, что там нет подводных камней... Потому и спрашиваю

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

  • Administrator
  • *****
  • Сообщений: 9911
  • Карма: 1271
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как найти все поля (Field) в чертеже?
« Ответ #8 : 05-08-2019, 22:46:49 »
Вроде бы можно найти, через пару владельцев вверх, но я не уверен, что там нет подводных камней... Потому и спрашиваю
Может быть и не пару. Там могут быть и вложенные поля. Так что как минимум нужно проверять класс владельца. Поэтому все Field и DBDictionary в иерархии владельцев пропускаем.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Владимир Шу

  • ADN Club
  • ****
  • Сообщений: 488
  • Карма: 112
    • ПГСу Бложик
Re: Как найти все поля (Field) в чертеже?
« Ответ #9 : 06-08-2019, 18:35:28 »
Так, еще пару особенностей и непоняток...
При наличии полей в атрибутах, будет найдено два поля: для вставки атрибута и для определения атрибута, это я понять могу.

Я не до конца понимаю вот какую механику:
В чистом файле (шаблон acadiso.dwt)
создаю MText и в нем поле, то получаю два поля! Одно поле содержит значение всего МТекста, а второе только то, что в поле добавил пользователь.

Разобрался.
« Последнее редактирование: 06-08-2019, 22:03:17 от Владимир Шу »