Сообщество программистов Autodesk в СНГ

Статьи => Опубликованные статьи => Тема начата: ADSK от 19-05-2015, 19:30:09

Название: Как найти все поля (Field) в чертеже?
Отправлено: ADSK от 19-05-2015, 19:30:09
Как найти все поля (Field) в чертеже? (http://adn-cis.org/kak-najti-vse-polya-(field)-v-chertezhe.html)
Название: Re: Как найти все поля (Field) в чертеже?
Отправлено: Владимир Шу от 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 ?
Название: Re: Как найти все поля (Field) в чертеже?
Отправлено: Александр Ривилис от 02-08-2019, 07:48:26
Собственно вопрос: что это за второй указатель в ads_name.b ? и есть ли возможность его получить не импортируя платформозависимую acdbGetAdsNameXX ?
Вообще-то и a и b - это не указатели, а длинные целые числа. Насколько я помню, обычно b == 0. Но в общем случае без acdbGetAdsName тебе не обойтись.
Название: Re: Как найти все поля (Field) в чертеже?
Отправлено: Владимир Шу от 02-08-2019, 08:30:56
Несколько дней ковыряюсь и b ни разу не было равно 0, а вот a всегда равно ObjectId.

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

Но в общем случае без acdbGetAdsName тебе не обойтись.
А хотелось бы...
Название: Re: Как найти все поля (Field) в чертеже?
Отправлено: Александр Ривилис от 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.  
Название: Re: Как найти все поля (Field) в чертеже?
Отправлено: Владимир Шу от 05-08-2019, 22:05:38
Ладно... на время оставлю поиск ссылок. Перейду к следующему действию...

Как найти все поля стало понятно, как пересчитать все поля и найти битые так же стало понятно (Autodesk.AutoCAD.DatabaseServices.FieldEvaluationStatusResult и Autodesk.AutoCAD.DatabaseServices.FieldState).
Следующее логичное действие - показать/подсветить пользователю "сломанные" поля и вот тут смотрю по F12, смотрю в отладчике, но не могу найти методы или ссылки на места вставки этих полей, есть только владелец, но это ссылка на NOD, эти данные у объекта Поле есть или надо тупо перебирать все объекты по всем блокам в BlockTable в поисках?
Последнего, конечно, хочется меньше всего...
Название: Re: Как найти все поля (Field) в чертеже?
Отправлено: Александр Ривилис от 05-08-2019, 22:24:39
но не могу найти методы или ссылки на места вставки этих полей
Насколько я помню такого и нет.
Название: Re: Как найти все поля (Field) в чертеже?
Отправлено: Владимир Шу от 05-08-2019, 22:28:12
Вроде бы можно найти, через пару владельцев вверх, но я не уверен, что там нет подводных камней... Потому и спрашиваю
Название: Re: Как найти все поля (Field) в чертеже?
Отправлено: Александр Ривилис от 05-08-2019, 22:46:49
Вроде бы можно найти, через пару владельцев вверх, но я не уверен, что там нет подводных камней... Потому и спрашиваю
Может быть и не пару. Там могут быть и вложенные поля. Так что как минимум нужно проверять класс владельца. Поэтому все Field и DBDictionary в иерархии владельцев пропускаем.
Название: Re: Как найти все поля (Field) в чертеже?
Отправлено: Владимир Шу от 06-08-2019, 18:35:28
Так, еще пару особенностей и непоняток...
При наличии полей в атрибутах, будет найдено два поля: для вставки атрибута и для определения атрибута, это я понять могу.

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

Разобрался.