VetCAD

Замена одного блока другим для AutoCAD 2006/2007

    0 оценок

den001

размещено: 12 Февраля 2007
обновлено: 21 Февраля 2007
Программка на VBA взамен экспрессовской команды blockreplace для AutoCAD 2006/2007. Заменяет во всем чертеже один блок на другой. Блоки могут быть динамическими и содержать атрибуты. Такие свойства, как слой, цвет, вес и тип линий, масштаб, OCS, сохраняются. Выбрать нужный блок можно из списка клавишей Enter или двойным кликом, а также указать на экране. Есть возможность сохранения значений атрибутов заменяемого блока, а также удаление его из чертежа после замены.

13.02.07
Добавил команду -BlockReplace, без вызова диалогового окна (процедура BlockReplaceSimple). Предлагает сначала выбрать заменяемый блок, потом заменяющий. Атрибуты сохраняются, блок из чертежа не удаляется.
Также снял по умолчанию флажок "Удалить из чертежа".

P.S. Если все же есть необходимость использовать также и экспрессовские команды blockreplace и -blockreplace, нужно в прилагаемом lisp-файле заменить c:BlockReplace и c:-BlockReplace на любые понравившиеся имена (не трогая c: )
Замена одного блока другим для AutoCAD 2006/20071

Комментарии

Комментарии могут оставлять только зарегистрированные участники
Авторизоваться
Комментарии 1-10 из 39
Askerovich , 13 февраля 2007 в 00:22
#1
Если бы месяц назад мне эта программка попалась!!!
Чигинский Дмитрий Сергеевич , 13 февраля 2007 в 00:31
#2
А можно сделать просто кнопку (инструмент) со следующими двумя последовательностями работы. Предисловие пред пользователем на экране два блока. Блок, на который нужно заменить - А, блок который заменяем - Б.
1. Пользователь выбирает блок А, нажимает на кнопку BlockReplace, выбирает блок Б, блок Б сразу заменяется на блок А.
2. Пользователь нажимает на кнопку BlockReplace, выбирает блок А, выбирает блок Б, блок Б сразу заменяется на блок А.

Вопрос о том удалять или нет блок Б, не спрашивается каждый раз. По умолчанию стоит не удалять. Если нажать на правую кнопку мыши после нажатия кнопки BlockReplace, то в контекстном меню будет строчка «Удалять заменяемый блок?» (Purge… см. blockreplace в Express Tools), с ответом Да или Нет.

Важный момент: Не должно быть диалоговых окон. Здесь полная аналогия с инструментом, например, Trim.
Dr. Dron. , 13 февраля 2007 в 15:35
#3
>Дмитрий Сергеевич
Сделать-то можно, но это будет уже другая программа. Здесь весь смысл в наглядности. Насчет удаления по умолчанию согласен, можно убрать. Исходник дома, так что вечером-ночью поправлю.

А насчет экспрессовской blockreplace - она меня взбесила в 2006-м (с динамическими блоками глючит, с атрибутами глючит), почему и родилась эта вещь. И там, кстати, не удаление блока из чертежа, а запуск команды Purge, все в одну кучу.
Dr. Dron. , 13 февраля 2007 в 23:26
#4
>Дмитрий Сергеевич
Частично выполнил Вашу просьбу (команда -BlockReplace). C предварительным выбором единичного объекта в VBA проблемы, SelectionSet (сиречь набор) можно, но это здесь ни к чему. И порядок выбора заменяемого и заменяющего блоков обратный, относительно предложенного (мне такой порядок кажется более логичным). Впрочем, это можно решить по месту. Для изменения порядка выбора нужно в процедуре BlockReplaceSimple заменить "BlkName1 =" на "BlkName2 =" и наоборот и подкорректировать подсказки. Запрос на удаление блока из чертежа делать не стал, пришлось бы калечить функцию. Для этого можно воспользоваться командой _purge. Вот, вроде, и все.
Чигинский Дмитрий Сергеевич , 14 февраля 2007 в 00:22
#5
den001, спасибо, за старания, но после запроса -BlockReplace выпадает ошибка Compile error: User-defined type not defined, и уже Basic указывает на следующую строку: Public Function NameSelectBlock(Optional Prompt As String = "Выберите блок:").

Что скажите?

По поводу того, какой блок выбирать сначала метафора такая: Я купил новую книгу (кликнул на блок А, и подтвердил выбор, нажав Enter или правую кнопку мыши), но на книжной полке нет места, мне нужно вытащить одну старую книгу (кликнул по блоку Б, и подтвердил выбор). В реальности новую книгу нужно ещё поставить в замен старой, в программе же это происходит мгновенно, после подтверждения выбора блока Б.

Вопрос: Почему не нужно диалоговое окно?
Ответ: Потому что блок А итак передомной (в моих руках - новая книга), и блок Б тоже передомной т.к. в реальности чтобы поставить новую книгу взамен старой нужно подойти к книжной полке (видеть перед собой Б). Следовательно, такой алгоритм действий является, IMHO, интуитивным и понятным, чем диалоговый интерфейс, отрывающий пользователя от объектов которые он видит перед собой, заставляет пользователя помнить названия блоков (в моём случае у блоков и не должно быть понятного названия, т.к. они создаются автоматически инструментом Flatshot).
Dr. Dron. , 14 февраля 2007 в 11:57
#6
>Дмитрий Сергеевич
Странно, -BlockReplace у меня прекрасно работает, ну да ладно, немного по другому переписал, должно получиться.

По поводу, чего выбирать первым.
Я давненько не _держал в руках_ книг :). Мое понимание задачи: 1) Что заменяем? 2) Чем заменяем?. Впрочем, это дело вкуса, Вы можете исправить код под свое мировосприятие, как - в описании про это есть. По поводу диалогового окна - вещь нужная хотя бы уже затем, что бывает необходимость заменить блок, вставленный в чертеж, блоком, который в чертеж не вставлен.
Dr. Dron. , 14 февраля 2007 в 12:01
#7
Пардон, про изменение порядка выбираемых объектов не в описании, а в комментарии от 13-02-2007 23:26
Чигинский Дмитрий Сергеевич , 15 февраля 2007 в 00:40
#8
den001, что то, программа спотыкается об IAcadBlockReference2, при чем даже при работе с диалоговым окном (blockreplace).

Что скажите?
Dr. Dron. , 15 февраля 2007 в 15:13
#9
Скажу, что у Вас, похоже, AutoCAD 2007, а программа для 2006-го. Замените во всем коде IAcadBlockReference2 на AcadBlockReference - все будет работать. Такой вот сюрприз от разработчиков Autodesk :-)
Dr. Dron. , 15 февраля 2007 в 16:43
#10
Исправил. Теперь работает в ACAD 2006 и 2007. Никак я не ожидал такой подлости от 2007-го. :)
zip

0.02 МБ

СКАЧАТЬ