Сообщество программистов Autodesk в СНГ
ADN Club => AutoCAD .NET API => Тема начата: Привалов Дмитрий от 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) создал свой аннотативный блок, назначил масштабы на нем все ОК.
отсюда вопрос, что с этим блоком не так?
-
С данным блоком все странно.(А есть и другие)
Если взять список масштабов из 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 не удаляет масштабы с себя и объектов внутри?
-
почему список анотативных масштабов в правом нижнем углу != ObjectContextCollection
А если вывести названия аннотативных масштабов оттуда и оттуда и попробовать сравнить? Может быть, по названиям будет понятно, откуда лишние.
-
А если вывести названия аннотативных масштабов оттуда и оттуда и попробовать сравнить? Может быть, по названиям будет понятно, откуда лишние.
Названия мало что дают. Например 1:100_17_XREF. Понятно что имена масштабов- результат использования ссылок. А ...XREF_XREF_XREF... многократного использования ссылок. Это когда имена масштабов в чертеже и в ссылке совпадают автокад дописывает XREF.
Да это и не так важно. Важнее понять, почему блок с масштабами ведет себя по другому.
А насчет списков у меня такие мысли:
database.ObjectContextManager
contextManager.GetContextCollection("ACDB_ANNOTATIONSCALES");
содержит все все возможные масштабы чертежа.
"Какой-то объект", возможно пространство модели/листа содержит свой список масштабов, который мы и видим в правом нижнем углу.
В большинстве случаев эти списки равны. Но в случае данного блока масштабы добавляются в ObjectContextManager автоматом, но не добавляются в "Какой-то объект".
Возможно вычислив "Какой-то объект" и причину по которой масштабы блока не попадают в "Какой-то объект" и приведет к разгадке.
-
А насчет списков у меня такие мысли:
database.ObjectContextManager
contextManager.GetContextCollection("ACDB_ANNOTATIONSCALES");
содержит все все возможные масштабы чертежа.
"Какой-то объект", возможно пространство модели/листа содержит свой список масштабов, который мы и видим в правом нижнем углу.
В большинстве случаев эти списки равны. Но в случае данного блока масштабы добавляются в ObjectContextManager автоматом, но не добавляются в "Какой-то объект".
Возможно вычислив "Какой-то объект" и причину по которой масштабы блока не попадают в "Какой-то объект" и приведет к разгадке.
"В правом нижнем углу", когда раскрываете список аннотативных масштабов чертежа, есть галочка: "Скрыть масштабы внешних ссылок". Если ее снять, то список будет полным.
-
"В правом нижнем углу", когда раскрываете список аннотативных масштабов чертежа, есть галочка: "Скрыть масштабы внешних ссылок". Если ее снять, то список будет полным.
точно, спасибо...а вот слона то я и не приметил))))
Значит масштаб помечен как масштаб внешней ссылки, хотя таковым вроде и не является. Блок же.
Буду смотреть свойства масштабов, может что и найду
-
Возможно все проще, и галка реагирует на наличие "_XREF" в названии ссылки.
-
Да, скорее всего, так и есть. Внешних ссылок же нет у чертежа.
-
...нюансы очистки масштабов блоков.
Правило №1
Если в редакторе блоков(или программно) отключить аннотативность у блока. То у всех объектов внутри блока автоматом убираются масштабы с объектов.
Правило №2 :D
Если объекты блока, с которых масштабы должны быть убраны, находятся на заблокированном слое, то блок перестает быть аннотативным, а масштабы с блока и объекта не снимаются. И автокад и API Вас не предупредят!
Правило №3
Снять блокировку слоев, и только затем отключать аннотативность блоков.
Не следование правилу №3 приведет к тому, что масштабы зависнут в чертеже, и scalelistedit и перезапуск не помогут.
Дальнейшее шаманство будет одним из следующих:
1. Разморозить слои.Сделать блок аннотативным. Сделать блок не аннатотивным.
2. Разморозить слои.Пройтись по аннотативным объектам внутри блока, убрать масштабы. С блока тоже снять масштабы.
-
Сдается мне, что не то сообщение помечено как решение...
Значит, дело было в заблокированных слоях?
-
Сдается мне, что не то сообщение помечено как решение...
Значит, дело было в заблокированных слоях?
да. пометил как решение, т.к. позволило отмести неправильное направление поиска ошибки)
И мое мнение лучше бы автокад вел себя так:
При попытке сделать через API выкидывал исключение onLockedLayer
При выключении аннотативности блока через редактор блока, выкидывал сообщение, объекты блока на заблокированных слоях. И не отключал аннотативность.
Это только для того, чтобы не копились не вычищаемые, стандартными средствами, масштабы в чертежах, т.е. подстраховать мою "криворукость" и проектировщиков.