(изменено: Вильдар, 16 октября 2011г. 13:24:32)

Тема: Обновить вхождение блока

Всем привет.
Подскажите как можно обновить вхождение блока? Блок динамический с атрибутами.
Описание блока переопределяю из внешнего файла, с помощью WblockCloneObjects.

Что нужно обновить:
1.Геометрию вхождений анонимных блоков. Она не обновляется автоматически после переопределения блока (с помощью WblockCloneObjects).
2.Атрибуты всех вхождений блока (вхождения основного описания дин.блока и анонимных блоков).

Autocad 2008, NET2.

(изменено: Вильдар, 16 октября 2011г. 12:52:31)

Re: Обновить вхождение блока

Хочу попробовать решить задачу с помощью BlockReference.ResetBlock().
ResetBlock это, я так думаю, аналогично команде сброса блока (_resetblock). Блок приводится в соответствие с описанием блока. При этом дин.параметры сбрасываются в начальное положение (заданное в описании блока). Атрибутов это функция не затрагивает.

Позже потестирую применимость ResetBlock...

(изменено: Вильдар, 16 октября 2011г. 12:53:30)

Re: Обновить вхождение блока

Другой способ, это заменять вхождения блоков на новые.
Небольшой минус в том, что хэндлы вхождений блоков будут новые.(а я их использую).

Вообще не вариант...

Re: Обновить вхождение блока

Возможно это будет интересно.

(изменено: Вильдар, 13 октября 2011г. 11:07:07)

Re: Обновить вхождение блока

Hwd пишет:

Возможно это будет интересно.

Да, интересно. Попробовал. Есть несколько моментов:
1.Словил исключение в методе AttSync, на строке 234 и 279, ad.AdjustAlignment(db) - eInvalidContext. Причину не знаю. Закоментировал.
Выполнял MultipleAttSync с обновлением одного имени блока, в одном target файле.
2.Не обновляется геометрия вхождений блока. Это получается при таких условиях. В target файле есть вхождения блока. Отредактировать этот блок в редакторе блока и удалить часть геометрии. Вот, именно у этих вхождений блока, которые были вставлены до редактирования блока, не обновляется геометрия при выполнении MultipleAttSync.
upd 2 пункт, только для дин.блоков.

(изменено: Hwd, 13 октября 2011г. 12:11:03)

Re: Обновить вхождение блока

Вильдар пишет:
Hwd пишет:

Возможно это будет интересно.

Да, интересно. Попробовал. Есть несколько моментов:

1.Словил исключение в методе AttSync, на строке 234 и 279, ad.AdjustAlignment(db) - eInvalidContext. Причину не знаю. Закоментировал.

Выполнял MultipleAttSync с обновлением одного имени блока, в одном target файле.

2.Не обновляется геометрия вхождений блока. Это получается при таких условиях. В target файле есть вхождения блока. Отредактировать этот блок в редакторе блока и удалить часть геометрии. Вот, именно у этих вхождений блока, которые были вставлены до редактирования блока, не обновляется геометрия при выполнении MultipleAttSync.

upd  2 пункт, только для дин.блоков.

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

Re: Обновить вхождение блока

Архивчик тут http://www.avral.ru/68e8d2a84729e0f9c5763794a87ca020
Хранение 30 дней.
Там три файла, sourceFile - с "эталоном" блока; targetFile - в котором нужно обновить блок; запускной - из которого запускаю команду с выполнением MultipleAttSync.
Блок один - Формат.

Re: Обновить вхождение блока

Вильдар пишет:

Архивчик тут http://www.avral.ru/68e8d2a84729e0f9c5763794a87ca020

Хранение 30 дней.

Там три файла, sourceFile - с "эталоном" блока; targetFile - в котором нужно обновить блок; запускной - из которого запускаю команду с выполнением MultipleAttSync.

Блок один - Формат.

Ок, скачаю сегодня. Давно тебя в Skype не видно. Я сюда не часто заглядываю - лучше через Skype общаться.

Re: Обновить вхождение блока

Буду почаще в скайп заходить.

Решил забить на случай из 2 пункта. Я из-за него делаю не обновление существующих вхождений, а их замену новыми.

Re: Обновить вхождение блока

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

(изменено: Hwd, 14 октября 2011г. 16:03:59)

Re: Обновить вхождение блока

2 Вильдар
Проблема с eInvalidContext решена. Обновил код. Смотри строки 34, 37 и 291 (Спасибо Александру Ривилису). Постараюсь разобраться с геометрией.

Re: Обновить вхождение блока

Спасибо, посмотрел. Не думал, что так можно делать.

Re: Обновить вхождение блока

Приветствую, Андрей.
Получается, что база полученная стандартным образом

Document dwg = acad.DocumentManager.MdiActiveDocument;
Database db = dwg.Database;

по каким-то причинам не подходит. Т.е. приходится её делать рабочей:

HostApplicationServices.WorkingDatabase = db;

Где тут собака порылась. А самое главное, как догадаться, что надо делать именно так.
Т.е хотелось бы подробнее знать, в чем состояла проблема, вызывавшая eInvalidContext.

Re: Обновить вхождение блока

В 99% случаев acad.DocumentManager.MdiActiveDocument.Database == HostApplicationServices.WorkingDatabase в командах контекста документа. Но не при обработке не открытых в редакторе AutoCAD чертежей, как сделано в https://sites.google.com/site/bushmansn … pleattsync

Пастух пишет:

А самое главное, как догадаться, что надо делать именно так.

Ну это интуиция и опыт.

Re: Обновить вхождение блока

2 Вильдар

Если будет время/возможность, потестируй софтинку (компилировал под AutoCAD 2009 x86; .Net Framework 3.5 SP1). В программке две локализации: русская/английская. Это собственно та программулина, с которой должны работать рядовые юзеры.

Пастух пишет:

Приветствую, Андрей.

Получается, что база полученная стандартным образом

Document dwg = acad.DocumentManager.MdiActiveDocument;

Database db = dwg.Database;

по каким-то причинам не подходит. Т.е. приходится её делать рабочей:

HostApplicationServices.WorkingDatabase = db;

Где тут собака порылась. А самое главное, как догадаться, что надо делать именно так.

Т.е хотелось бы подробнее знать, в чем состояла проблема, вызывавшая  eInvalidContext .

Для того, чтобы разобраться в этой проблеме, не делая скорополительных выводов, нужно прошерстить мой код в отладчике, отлавливая события установления другой базы данных в качестве текущей. На этих выходных я не смогу этим заняться. Возможно я где-то накосячил в коде, возможно это баг .Net API, возможно что-то ещё. Я правда не пойму, почему влияние оказывает рабочая база данных, когда в качестве параметра я указываю вполне конкретную, нужную базу данных. Разбираться буду позже (наверное с понедельника). Сейчас я очень устал...

Re: Обновить вхождение блока

Hwd пишет:

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

Андрей. А я ведь это объяснял. Это не баг .NET API. Точно так же и в ObjectARX. В ряде случаев требуется, чтобы WorkingDatabase указывал на базу, из которой берётся дополнительная информация (например, параметры текстового стиля, реакторы и т.д.). Где-то тут был (в разделе ObjectARX) пример копирования размера между разными чертежами. Так вот пока база-приёмник не была указана как WorkingDatabase, копирование не срабатывало и более того приводило к Fatal Error при дальнейшей работе.

(изменено: Hwd, 14 октября 2011г. 21:55:58)

Re: Обновить вхождение блока

2 Александр Ривилис
Ясно, постараюсь запомнить.

2 All
Кстати, Александр Ривилис предложил мне сегодня одно очень хорошее решение подобного рода проблем - написать специальный класс, берущий на себя контроль над тем, какая база данных рабочая.

Я решил добавить этот класс в свою библиотеку и сразу же воспользоваться им в методе AttSync. Только что опубликовал этот класс и новую версию метода AttSync на той же странице сайта.

(изменено: Пастух, 14 октября 2011г. 23:11:56)

Re: Обновить вхождение блока

To Александр:

В ряде случаев требуется, чтобы WorkingDatabase указывал на базу, из которой берётся дополнительная информация (например, параметры текстового стиля, реакторы и т.д.). Где-то тут был (в разделе ObjectARX) пример копирования размера между разными чертежами. Так вот пока база-приёмник не была указана как WorkingDatabase, копирование не срабатывало

Так я и не понял, база-источник или база-приемник должна быть указана, как WorkingDatabase?

Имеет ли смысл всегда при работе с базами, не открытыми в редакторе, делать их рабочими (чтобы слишком долго не задумываться :))?

To Андрей:
Я бы назвал класс WorkingDatabaseSwitcher, по-моему так точнее отражается его смысл.

(изменено: Александр Ривилис, 14 октября 2011г. 23:13:44)

Re: Обновить вхождение блока

Пастух пишет:

Так я и не понял, база-источник или база-приемник должна быть указана, как WorkingDatabase?

Та, откуда должна браться информация. Нашёл тот пример, о котором говорил.

Пастух пишет:

Может стоит всегда при работе с базами, не открытыми в редакторе, делать их рабочими (чтобы слишком долго не задумываться smile:))

Сложный вопрос. Не уверен, что это всегда допустимо. А если открыты (не в редакторе) сразу несколько баз, какую из них делать рабочей?

(изменено: Hwd, 14 октября 2011г. 23:16:38)

Re: Обновить вхождение блока

Александр Ривилис пишет:


Та, [COLOR=#FF0033]откуда должна браться информация[/COLOR]. Нашёл [URL=https://www.caduser.ru/forum/post155848.html#p155848]тот пример[/URL], о котором говорил.


[quote=
Александр Ривилис]
Проблема в том, что когда создается AcDbRotatedDimension одновременно создается и реактор, и для того чтобы он создался правильно необходимо переключить рабочую базу [COLOR=#FF0033]на базу в которую он будет добавлен[/COLOR]


Так та откуда должна браться информация, или та, в которую информация должна добавляться?