| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
Поиск в этой теме |
04.10.2007, 15:10 | #1 | |
Изменить точку вставки блока
Проектировщик ВК. LISP-любитель.
Москва
Регистрация: 15.12.2003
Сообщений: 1,192
|
||
Просмотров: 37459
|
|
||||
Регистрация: 25.12.2005
Москва
Сообщений: 13,627
|
Вот тут
http://www.autocad.ru/cgi-bin/f1/board.cgi?t=38163rN я глупо бился над этой проблемой. Пришел к выводу, что без программирования не обойтись. |
|||
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,840
|
А какая цель преследуется? Если надо существующий блок "вставлять за другое место" - (без приколов пожалуста) - то можно просто добавить параметр выравнивания, а если для чего-то другого :?: то напиши для чего.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
|
||||
преподавание Регистрация: 28.09.2005
Москваград
Сообщений: 131
|
А в редакторе блоков поменять местоположение параметра "базовая точка" не то, что требуется?
Упс, виноват, не дочитал...
__________________
Добрым словом и пистолетом можно добиться гораздо большего, чем одним добрым словом. |
|||
|
||||
Проектировщик ВК. LISP-любитель. Регистрация: 15.12.2003
Москва
Сообщений: 1,192
|
Цитата:
__________________
apel.fas |
|||
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,840
|
С такими образцами надо бороться решительно и навсегда - переделывать их нафиг целиком - ибо если их за основу брать наверняка еще куча неизвестно-чего вылезет, ищи потом какую он там переменную настроил - лучше день помучаться, а потом за 5 минут долететь.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
|
||||
Цитата:
__________________
«Артиллерия не токмо грохот, но и наука!» Пётр I |
||||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,856
|
Если бы была гарантия того, что все блоки вставлены в мировой системе координат, что текущая система координат мировая, не изменена base, insbase, что блоки имеют масштабы по осям, равные 1, еще можно было бы попытаться что-то изобразить. А так... Голову сломаешь.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Инженер Регистрация: 22.01.2006
Краснодар
Сообщений: 16
|
Я сумел только тупо сделать это
Цитата:
Но результат иногда(правда редко), в зависимости от единиц вставки блока, сиситемы координат вставки и т.п., не радует. Ну и динамические блоки, мультивставки - не воспринимает вообще. Если еще нужно, могу выложить лиспик "как есть"(типа работает и ладно)
__________________
То, чего нельзя сделать в Acade, не существует. |
|||
|
||||
Армспорт Регистрация: 18.07.2006
Ейск
Сообщений: 355
|
Когда-то подобное делал для 3D моделей - пробовал через матрицы трансформации, через синусы-косинусы - чуть не свихнулся! и всё равно не всегда правильно получалось с углами поворота!!!
А потом плюнул на всё и сделал "по тупому" - работает идеално в моих условиях. Код примерно такой: Код:
|
|||
|
||||
Условия: Куча копий блока в разных местах и с разными углами поворота. Точки вставки светятся как звезды на небе, но не на самих блоках.
Надо: Чтобы точки вставки были на графике, но чтобы графика осталась на месте. Решения: Их два. Первое попроще, но ручное, второе посложнее и для макроса. Первое решение: 1. Переименовываем блок. Делаем ему имя "Технический" (к примеру). Все блоки теперь - "Технический". И обязательно purge - удаляем из таблицы блок с первоначальным именем. (хотя там их не должно быть) 2. Копируем в буфер любую из копий и открываем второй чистый файл (теперь открыто два файла первый - с моделью и второй чистый) 3. Вставляем из буфера в чистый файл блок. 4. Возвращаем ему его первоначальное имя. 5. Открываем его редактором и наводим порядок с положением точки вставки 6. Выходим из редактора и копируем отремонтированный блок в буфер 7. Возвращаемся в файл с моделью. 8. Открываем редактором блок "Технический" 9. Вставляем из буфера на место графики блок с первоначальным именем и правильной точкой вставки. Я с начала линию подвожу к месту куда точка вставки должна стать, затем убиваю графику и вставляю из буфера блок. Он сволочь, вставляется не туда, куда я показываю, а в 0,0 и приходится его перетаскивать к линии. После чего сношу линию. Если рядом с графикой атрибуты есть - снести. 10. Выходим из редактора, включаем ручки у всех копий блока "Технический" (ну макросом естественно) и взрываем. После взрыва блока, его начинка остается на своем месте а она является блоком с первоначальным именем. Если сравнить порядок расположения вхождений блока "Технический" и порядок вновь появившегося блока, то они по идее совпадут. не проверял. А это значит, что перед всеми этими манипуляциями можно сохранить значения динамических свойств, а потом эти значения прописать новичкам. Второй вариант: 1. Создаем блок "Точка" с точкой внутри на месте точки вставки. Короче все в одной точке. 2. Заходим в редактор блока и ставим эту точку на графику в то место, куда потом станет точка вставки. 3. Выходим из редактора и программно делаем следующее: 3.1. Создаем набор из всех вхождений этого блока 3.2. К каждому элементу набора применяем следующую последовательность действий 3.2.1. Записать метку блока (любые ориентиры на вхождение) 3.2.2. Взорвать блок 3.2.3. Включить через моделспейс ручку у блока "Точка" 3.2.4. Записать ее координаты в моделе и привязать к метке блока 3.2.5. Вернуть Undo-й блок в целостное состояние 4. Открываем редактором блока наш блок и ставим графику на место. В модели все блоки разлетаются кто куда. 5. Программно переносим каждое вхождение блока по координатам привязанным к его метке. Все. Пригодно даже для динамических блоков, даже если при перемещении графики внутри блока заново переопределяешь привяку к элементам. |
||||
|
||||
Отлично!
Как побочный эффект - восстановилась видимость выключенных деталей. Надо набирать лисп выражение - грусть. А так - супер. Надо запускать редактор через commands просить указать точку и сваливать. Загруженный и запущенный лисп продолжает работать пока не закончится. Смело можно ползать по файлам и пространствам. Да, к сожалению, динамические блоки разваливаются. У динамических блоков перенос графики может разрушить динамические свойства. Но я двигал по Z и все остается работоспособным. А X и Y можно просто точку вставки с 0,0,0 перенести. Открываем прямо из под лиспа редактор блоков, просим указать новую точку вставки, запоминаем X, Y, Z двигаем графику только по Z, а потом (Command "_BParameter" "B" "872.2095,997.3218") и вываливаемся. Последний раз редактировалось Supermax, 20.10.2007 в 17:15. |
||||
|
||||
Армспорт Регистрация: 18.07.2006
Ейск
Сообщений: 355
|
Попробуй мой готовый вариант (он работает немного по другому), правда попробовал динамические блоки - результат странный: вставки и грипса (якобы базовая точка!) остаются на прежнем месте, а у новых блоков грипса базы уже там где надо.
Программа лежит здесь http://ad-cad.narod.ru/Help-Paper.htm команда "AD" (недокументированная) в списке выбираешь "изменить базовые точки у блоков" - будет цикл по всем блокам модели, надо будет указывать новую базу или "esc", чтобы пропустить. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,856
|
Исходников, я так понимаю, не будет?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,856
|
вариант, на котором код не срабатывает ожидаемым образом - во вложении (форматы файлов 2007 и 2004). Ошибка при выполнении последней строки; перемещение примитивов блока выполняется неверно; вхождения блока теряют собственные настройки. Код слеганца переделал:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Армспорт Регистрация: 18.07.2006
Ейск
Сообщений: 355
|
"вхождения блока теряют собственные настройки" - с этим согласен (у себя исправил + добавил проверку слоёв), а в остальном - ты не прав по условию (читай пост №10 - там я говорил про масштабы и про vla-explode, и там же читай вторую строку листинга про xyz - это далеко не (getpoint "\nНовая базовая точка ")
Я делал это под себя для работы с твёрдотельной моделью, когда все масштабы по осям равны 1 (!!!), зато есть повороты,координаты вставок и главное - глубокая вложенность блоков. Остальные варианты мне не очень интересны, хотя и их сделать не трудно... Последний раз редактировалось Евгений А., 21.10.2007 в 02:09. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,856
|
Я проводил тестирование, указав левый верхний блок в качестве основного. А там и масштабы, и угол поворота - все "по правилам".
Читаю то, что сказано в Код:
В остальном я подошел с точки зрения юзера, которому надо "ткнуть и указать". Потому что выполнить "передвижку" примитивов внутри блока можно и без подобных операций "разбить-собрать": vla-move и вперед. Примерно так (сейчас acad на переустановке, пишу "по памяти" и для версий от 2006 и выше: Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Армспорт Регистрация: 18.07.2006
Ейск
Сообщений: 355
|
Вообще-то я показал только функцию , а не готовую программу, только чтобы подкинуть идею. Адрес на программу я указывал...
Цитирую из №10: xyz - координата новой базы в системе координат блока... , а не в модели - это важно! Про ошибку: База смещается в описании блока, в этот момент ВСЕ вхождения на этот блок смещаются тоже, в зависимости от нормали, угла поворота и масштабов (будь они не ладны), и чтобы всё поставить на место, надо что-то делать (сместить куда надо очку вставки) со ВСЕМИ вхождениями на этот блок (а не только то, которое выбрано через (entsel)), поэтому программа всё равно пытается расчленить вхождения с разными масштабами - вот тут и ошибка, а потом ест-но ошибка при удалении временного блока. |
|||