Текстовая строка, назначенная атрибуту вхождения дин. аннотативного блока

Автор Тема: Текстовая строка, назначенная атрибуту вхождения дин. аннотативного блока  (Прочитано 3795 раз)

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

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Доброго времени суток.

+ AutoCAD 2009 SP3 x64 Enu
+ .NET Framework 3.5 SP1

Исходные данные:

1. Имеется определение динамического, аннотативного блока отметки, в составе которого определён атрибут, отображающий нужное числовое значение (вычисленное посредством формулы и полей). Атрибуту назначено значение по умолчанию в виде текста "Якорь не указан".
2. Имеется определение не динамического, аннотативного блока якоря.

В атрибутах вхождений блока отметки прописывается формула, в которой из координаты Y точки вставки отметки вычитается координата Y точки вставки нужного якоря и результат делится на 1000.

В контекстное меню отметок добавлены два пункта:
- Назначить якорь
- Показать якорь

В контекстное меню якоря добавлен пункт:
- Показать зависимые отметки

Значение формулы, присваиваемой атрибуту вхождения отметки назначается программно.

Описание проблемы:

Небольшой "затык" возник при нахождении всех отметок, связанных с указанным якорем...

В коде я извлекаю из атрибута исходный текст (не путать с отображаемым значением) так:
Код - C# [Выбрать]
  1. // Получаем исходный текст, назначенный атрибуту
  2. // (может содержать поля и формулы)
  3. String attValue = attRef.getTextWithFieldCodes();
  4.  
Полученное значение анализируется при помощи регулярного выражения и возвращает (посредством именованного сохранения) идентификатор блока отметки (если он присутствует).

Новый текст атрибуту (может содержать формулы и поля) назначаю так (когда присваиваю отметке нужный якорь):
Код - C# [Выбрать]
  1. // Назначаем нужную формулу, вычисляющую значение отметки
  2. // (формула указана в конфигурационном файле)
  3. attRef.TextString = attNewValue;
В результате отметкам успешно назначаются формулы и числовые значения корректно отображаются. 

Теперь, если не закрывая документ, повторно выполнить getTextWithFieldCodes для атрибутов тех же самых вхождений блока отметки, то получаю не новую, назначенную мною формулу, но старое текстовое значение: "Якорь не указан".

Если же документ закрыть и снова открыть, то в этом случае getTextWithFieldCodes вернёт обновлённую строку, назначенную атрибуту.

Может я не оттуда, откуда надо считываю строку, присваиваемую атрибуту вхождения? Либо назначаю не туда, куда следовало бы?

Спасибо.

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Выкладывай код и файл в котором выскакивает ошибка - "хелловорд" из 2 вышеуказанных функций ведет себя корректно (сразу отображает и и при повторном запуске выдает новую строку).

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Нашёл ошибку. Когда я в цикле обрабатывал вхождения блока, то в выборку попадали ненужные. Изначально я фильтровал так:
Код - C# [Выбрать]
  1. foreach (Db.ObjectId id in ids.Where(n => n.IsValid &&
  2.         !n.IsNull && !n.IsErased)) {
  3. ...
А нужно было так:
Код - C# [Выбрать]
  1. foreach (Db.ObjectId id in ids.Where(n => n.IsValid &&
  2.         !n.IsNull && !n.IsErased && !n.IsEffectivelyErased)) {
  3. ...
Недоставало проверки IsEffectivelyErased в виду чего в выборку попадали лишние объекты. В хело ворде присутствовала эта же ошибка, но он отработал нормально в виду того, что я там не производил дополнительных манипуляций в виде добавления новых и удаления существующих вхождений.