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

ADN Club => AutoCAD .NET API => Тема начата: Привалов Дмитрий от 15-07-2015, 20:47:23

Название: Помогите разобраться со странным анотативным блоком
Отправлено: Привалов Дмитрий от 15-07-2015, 20:47:23
Есть чертеж, в нем много аннотативных блоков, размеров и т.д. тормозил ужастно, пришлось чистить.
Проблема возникла с аннотативными блоками, пока не разобъешь, масштабы аннотаций не почистить

вот пример блока из чертежа
https://yadi.sk/d/gCBW3GNzhtUuD (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 (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) создал свой аннотативный блок, назначил масштабы на нем все ОК.

отсюда вопрос, что с этим блоком не так?
Название: Re: Помогите разобраться со странным анотативным блоком
Отправлено: Привалов Дмитрий от 17-07-2015, 13:17:20
С данным блоком все странно.(А есть и другие)

Если взять список масштабов из 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  не удаляет масштабы с себя и объектов внутри?
Название: Re: Помогите разобраться со странным анотативным блоком
Отправлено: Дмитрий Загорулькин от 20-07-2015, 11:50:23
почему список анотативных масштабов в правом нижнем углу != ObjectContextCollection
А если вывести названия аннотативных масштабов оттуда и оттуда и попробовать сравнить? Может быть, по названиям будет понятно, откуда лишние.
Название: Re: Помогите разобраться со странным анотативным блоком
Отправлено: Привалов Дмитрий от 20-07-2015, 14:58:09
А если вывести названия аннотативных масштабов оттуда и оттуда и попробовать сравнить? Может быть, по названиям будет понятно, откуда лишние.
Названия мало что дают. Например 1:100_17_XREF. Понятно что имена масштабов- результат использования ссылок. А ...XREF_XREF_XREF... многократного использования ссылок. Это когда имена масштабов в чертеже и в ссылке совпадают автокад дописывает XREF.
Да это и не так важно. Важнее понять, почему блок с масштабами ведет себя по другому.

А насчет списков у меня такие мысли:
database.ObjectContextManager
contextManager.GetContextCollection("ACDB_ANNOTATIONSCALES");
 содержит все все возможные масштабы чертежа.
"Какой-то объект", возможно пространство модели/листа содержит свой список масштабов, который мы и видим в правом нижнем углу.
В большинстве случаев эти списки равны. Но в случае данного блока масштабы добавляются в ObjectContextManager автоматом, но не добавляются в "Какой-то объект".
Возможно вычислив "Какой-то объект" и причину по которой масштабы блока не попадают в "Какой-то объект" и приведет к разгадке.
Название: Re: Помогите разобраться со странным анотативным блоком
Отправлено: Дмитрий Загорулькин от 20-07-2015, 15:06:54
А насчет списков у меня такие мысли:
database.ObjectContextManager
contextManager.GetContextCollection("ACDB_ANNOTATIONSCALES");
 содержит все все возможные масштабы чертежа.
"Какой-то объект", возможно пространство модели/листа содержит свой список масштабов, который мы и видим в правом нижнем углу.
В большинстве случаев эти списки равны. Но в случае данного блока масштабы добавляются в ObjectContextManager автоматом, но не добавляются в "Какой-то объект".
Возможно вычислив "Какой-то объект" и причину по которой масштабы блока не попадают в "Какой-то объект" и приведет к разгадке.
"В правом нижнем углу", когда раскрываете список аннотативных масштабов чертежа, есть галочка: "Скрыть масштабы внешних ссылок". Если ее снять, то список будет полным.
Название: Re: Помогите разобраться со странным анотативным блоком
Отправлено: Привалов Дмитрий от 20-07-2015, 15:15:06
"В правом нижнем углу", когда раскрываете список аннотативных масштабов чертежа, есть галочка: "Скрыть масштабы внешних ссылок". Если ее снять, то список будет полным.
точно, спасибо...а вот слона то я и не приметил))))
Значит масштаб помечен как масштаб внешней ссылки, хотя таковым вроде и не является. Блок же.
Буду смотреть свойства масштабов, может что и найду
Название: Re: Помогите разобраться со странным анотативным блоком
Отправлено: Привалов Дмитрий от 20-07-2015, 15:17:58
Возможно все проще, и галка реагирует на наличие "_XREF" в названии ссылки.
Название: Re: Помогите разобраться со странным анотативным блоком
Отправлено: Дмитрий Загорулькин от 20-07-2015, 15:26:04
Да, скорее всего, так и есть. Внешних ссылок же нет у чертежа.
Название: Re: Помогите разобраться со странным анотативным блоком
Отправлено: Привалов Дмитрий от 20-07-2015, 15:44:59
...нюансы очистки масштабов блоков.

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

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

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


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

Название: Re: Помогите разобраться со странным анотативным блоком
Отправлено: Дмитрий Загорулькин от 20-07-2015, 16:06:29
Сдается мне, что не то сообщение помечено как решение...
Значит, дело было в заблокированных слоях?
Название: Re: Помогите разобраться со странным анотативным блоком
Отправлено: Привалов Дмитрий от 20-07-2015, 16:15:44
Сдается мне, что не то сообщение помечено как решение...
Значит, дело было в заблокированных слоях?
да. пометил как решение, т.к. позволило отмести неправильное направление поиска ошибки)

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

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