Помогите разобраться со странным анотативным блоком

Автор Тема: Помогите разобраться со странным анотативным блоком  (Прочитано 13383 раз)

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

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

Оффлайн Привалов ДмитрийАвтор темы

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Есть чертеж, в нем много аннотативных блоков, размеров и т.д. тормозил ужастно, пришлось чистить.
Проблема возникла с аннотативными блоками, пока не разобъешь, масштабы аннотаций не почистить

вот пример блока из чертежа
https://yadi.sk/d/gCBW3GNzhtUuD

Но если посмотреть список масштабов чертежа, то список короткий.
Если добавлять свой масштаб или посмотреть список масштабов блока в свойствах, то уже список другой.
Это уже странно.

ок. пробуем удалить программно:

изменить свойства не помогает:
Annotative = AnnotativeStates.False;

Ищем как удалить список масштабов с блока, ага вот код
http://through-the-interface.typepad.com/through_the_interface/2011/10/delete-all-but-current-annotation-scales-on-autocad-objects-using-net.html

Пытаемся получить список:
ObjectContextManager ocm = db.ObjectContextManager;
ObjectContextCollection occ = ocm.GetContextCollection("ACDB_ANNOTATIONSCALES");
все "лишние" масштабы видно.

Дальше по коду пишет что масштабы удалены, т.е. obj.HasContext(oc) на объекте сработал и увидел масштабы.
а вот obj.RemoveContext(oc); не удалил ничего.

чтоб проверить obj.RemoveContext(oc) создал свой аннотативный блок, назначил масштабы на нем все ОК.

отсюда вопрос, что с этим блоком не так?

Оффлайн Привалов ДмитрийАвтор темы

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
С данным блоком все странно.(А есть и другие)

Если взять список масштабов из ObjectContextManager
ObjectContextManager contextManager = database.ObjectContextManager;
ObjectContextCollection annotationScaleContexts = contextManager.GetContextCollection("ACDB_ANNOTATIONSCALES");

то мы получим весь список масштабов аннотаций в чертеже. 16 штук.

Если раскроем список "масштаб аннотаций" в правом нижнем углу. То получим более короткий список 6 штук.
Также в панели свойств, когда ничего не выбрано тот-же список 6 штук.

Отсюда делаю предположение, что список масштабов в правом нижнем углу и тот, что возвращает contextManager, возможно разные списки.

Далее попробовал следующее:
Создал блок с атрибутом, назначил масштабы.
Если в редакторе блока и убрать у блока аннотативность, то с блока и атрибута внутри снимаются все ObjectContext

Если тоже проделать со "странным блоком", то AnnotativeStates блока измениться, однако масштабы с блока и атрибута не снимуться, их можно спокойно прочитать через HasContext()
foreach (ObjectContext oc in annotationScaleContexts )
{
   if (obj.HasContext(oc) )
   {

   }
}

Есть ли идеи, почему список анотативных масштабов в правом нижнем углу != ObjectContextCollection
И почему "странный блок" при изменении AnnotativeStates  не удаляет масштабы с себя и объектов внутри?

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
почему список анотативных масштабов в правом нижнем углу != ObjectContextCollection
А если вывести названия аннотативных масштабов оттуда и оттуда и попробовать сравнить? Может быть, по названиям будет понятно, откуда лишние.

Оффлайн Привалов ДмитрийАвтор темы

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
А если вывести названия аннотативных масштабов оттуда и оттуда и попробовать сравнить? Может быть, по названиям будет понятно, откуда лишние.
Названия мало что дают. Например 1:100_17_XREF. Понятно что имена масштабов- результат использования ссылок. А ...XREF_XREF_XREF... многократного использования ссылок. Это когда имена масштабов в чертеже и в ссылке совпадают автокад дописывает XREF.
Да это и не так важно. Важнее понять, почему блок с масштабами ведет себя по другому.

А насчет списков у меня такие мысли:
database.ObjectContextManager
contextManager.GetContextCollection("ACDB_ANNOTATIONSCALES");
 содержит все все возможные масштабы чертежа.
"Какой-то объект", возможно пространство модели/листа содержит свой список масштабов, который мы и видим в правом нижнем углу.
В большинстве случаев эти списки равны. Но в случае данного блока масштабы добавляются в ObjectContextManager автоматом, но не добавляются в "Какой-то объект".
Возможно вычислив "Какой-то объект" и причину по которой масштабы блока не попадают в "Какой-то объект" и приведет к разгадке.

Отмечено как Решение Привалов Дмитрий 20-07-2015, 15:29:27

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
А насчет списков у меня такие мысли:
database.ObjectContextManager
contextManager.GetContextCollection("ACDB_ANNOTATIONSCALES");
 содержит все все возможные масштабы чертежа.
"Какой-то объект", возможно пространство модели/листа содержит свой список масштабов, который мы и видим в правом нижнем углу.
В большинстве случаев эти списки равны. Но в случае данного блока масштабы добавляются в ObjectContextManager автоматом, но не добавляются в "Какой-то объект".
Возможно вычислив "Какой-то объект" и причину по которой масштабы блока не попадают в "Какой-то объект" и приведет к разгадке.
"В правом нижнем углу", когда раскрываете список аннотативных масштабов чертежа, есть галочка: "Скрыть масштабы внешних ссылок". Если ее снять, то список будет полным.

Оффлайн Привалов ДмитрийАвтор темы

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
"В правом нижнем углу", когда раскрываете список аннотативных масштабов чертежа, есть галочка: "Скрыть масштабы внешних ссылок". Если ее снять, то список будет полным.
точно, спасибо...а вот слона то я и не приметил))))
Значит масштаб помечен как масштаб внешней ссылки, хотя таковым вроде и не является. Блок же.
Буду смотреть свойства масштабов, может что и найду

Оффлайн Привалов ДмитрийАвтор темы

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Возможно все проще, и галка реагирует на наличие "_XREF" в названии ссылки.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Да, скорее всего, так и есть. Внешних ссылок же нет у чертежа.

Оффлайн Привалов ДмитрийАвтор темы

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
...нюансы очистки масштабов блоков.

Правило №1
Если в редакторе блоков(или программно) отключить аннотативность у блока. То у всех объектов внутри блока автоматом убираются масштабы с объектов.

Правило №2  :D
Если объекты блока, с которых масштабы должны быть убраны, находятся на заблокированном слое, то блок перестает быть аннотативным, а масштабы с блока и объекта не снимаются. И автокад и API Вас не предупредят!

Правило №3
Снять блокировку слоев,  и только затем отключать аннотативность блоков.


Не следование правилу №3 приведет к тому, что масштабы зависнут в чертеже, и scalelistedit и перезапуск не помогут.
Дальнейшее шаманство будет одним из следующих:
1. Разморозить слои.Сделать блок аннотативным. Сделать блок не аннатотивным.
2. Разморозить слои.Пройтись по аннотативным объектам внутри блока, убрать масштабы. С блока тоже снять масштабы.


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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Сдается мне, что не то сообщение помечено как решение...
Значит, дело было в заблокированных слоях?

Оффлайн Привалов ДмитрийАвтор темы

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Сдается мне, что не то сообщение помечено как решение...
Значит, дело было в заблокированных слоях?
да. пометил как решение, т.к. позволило отмести неправильное направление поиска ошибки)

И мое мнение лучше бы автокад вел себя так:
При попытке сделать через API выкидывал исключение onLockedLayer
При выключении аннотативности блока через редактор блока, выкидывал сообщение, объекты блока на заблокированных слоях. И не отключал аннотативность.

Это только для того, чтобы не копились не вычищаемые, стандартными средствами, масштабы в чертежах, т.е. подстраховать мою "криворукость" и проектировщиков.