|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
Поиск в этой теме |
12.09.2011, 16:22 | #1 | |
Autolisp. Автоматическая перерисовка выносок
Регистрация: 01.07.2010
Сообщений: 521
|
||
Просмотров: 12572
|
|
||||
Регистрация: 01.07.2010
Сообщений: 521
|
Смотри. Круглая труба (2 линии по краям и ось). Диаметр 100. Ставлю выноску на одну из линий, не в середину. Выноска готова. Далее меняю диаметр блока на 250 - ось осталась на месте крайние линии убежали что бы был диаметр 250, соответственно выноска осталась на старом месте. Теперь мне нужно что бы выноска сместилась на эту линию а не болталась указываю в пустоту. Для этого сравниваю 2 диаметра, определяю смещение и точку выноски переношу на линию, где она и была и соответственно обновляю блок выноски на новые значения. Тут все просто т.к. зная угол и 2 диаметра можно определить куда идти. А для других блоков этот метод не прокатывает...
|
|||
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,840
|
1. Вариант для равномерно меняющих рахмер блоков - сравнивать точку вставки и getboundingbox.
2. Для "непредсказуемо" изменяемых задать "жесткие" точки вставки для каждой видимости в зависимости от параметров (но по моему овчичнка выделки не стоит). 3. Сразу вставить эту "выноску" в блок (с аттрибутом) - а его уже менять.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
|
||||
Регистрация: 01.07.2010
Сообщений: 521
|
Вот я уже думал про вариант 3, но опять же внутри блока атрибут будет жестко задан в конкретной точке, а это не всегда есть хорошо...
А вот про getboundingbox не в курсе...что за зверь? Ага, примерно понял...попробовал на блоке... блок ДК выдал одну вершину прямоуголника... связь не могу понять |
|||
|
||||
Если "штукенцию" запрограммируешь, то будет работать и с блоком.
__________________
Как использовать код на Лиспе читаем здесь |
||||
|
||||
Это в помощь
__________________
Как использовать код на Лиспе читаем здесь |
||||
|
||||
Регистрация: 01.07.2010
Сообщений: 521
|
В принципе последовательность кода примерно понял, ссылаясь на Полещука... Вначале выбираем 2 блока, преобразовываем их в VLA-объекты, затем создаем 2 реактора с modify. А вот все тоже "при изменении одного, двигать другой" пока не понял как обработать...разбираюсь дальше...если в начале не прав - поправьте.
Изучил материал. В общем-то весь процесс, который можно отследить при помощи реакторов, я реализовал по-другому. Сделал в блоке выноски атрибут, в который записывал старое состояние блока (имя, координаты, размер и тип). При запуске проги проверял изменился блок или нет...ну а дальше то уже как раз сам процесс перерисовки, а тут засада. Все равно же нужно вычислить точку, на которую нужно сместить атрибут, а здесь засада.... Последний раз редактировалось Zaghim, 13.09.2011 в 10:56. |
|||
|
||||
Дальше все зависит от блока. Если меняется динамический параметр, то можешь запросить его значение. Функции для работы с динамическими блоками: Dynamic Block Functions и Effective Block Name. Про атрибут с параметрами блока: я тебе отвечал уже здесь: Вопрос о имени примитива
В общем алгоритм может быть такой: 1. При простановке выноски для блока создаем реактор modify 2. В Расширенные Данные (далее РД) блока записывам метку (handent) выноски. 3. В ф-ции callback (отклика) реактора считывам РД блока, из них считываем метку выноски. С помощью ф-ции handent находим ename и , при необходимости, vla-object выноски 4. Нужно узнать на сколько изменился блок и вычисляем точку для смещения атрибута Вот еще пример реактора на изменение размера. Учти, что тебе нужно разделять в modify 2 события: a. Перемещение блока - нужно переместить выноску b. Изменение размеров блока - нужно сместить атрибут
__________________
Как использовать код на Лиспе читаем здесь |
||||
|
||||
Регистрация: 01.07.2010
Сообщений: 521
|
VVA, все это я уже сделал))) (читай выше). Проблема в пункте 4. Вот с трубой нет проблем, там все понятно, знаем угол и знаем старый диаметр и новый - смещение определено. А вот например квадрат с точкой вставки по середине одной из сторой - соответственно он оттуда и увеличивается - уже сложнее. Далее - прямоугольник, опять метод определения смещения другой...а если многоугольник?) Вся соль вопроса в том, что бы единым методом определять смещение...вот это в корне не понимаю как сделать(((
Да, и выноска может быть хоть в точке вставке, хоть по середине, хоть в любом месте на сторонах блока.... вот засада А в последнем примере с кругами все ясно и очевидно, есть радиус, есть центральная точка... зная это можно легко увеличить длину осей или переместить их вместе с кругом... Последний раз редактировалось Zaghim, 13.09.2011 в 11:48. |
|||
|
||||
Выложи примеры твоих блоков. Общее решение озвучено в #6 п.1
__________________
Как использовать код на Лиспе читаем здесь |
||||
|
||||
Zaghim, сложности на пустом месте! Дима_ правильно посоветовал - добавь ты выноску прям в блок, добавь ее к динамике, и будет она ездить вслед за блоком твоим и за трубой
Если к тому же (скорее всего) параметры блока меняются в строго определенных пределах (ну типо по ГОСТу там), то пользуйся в самих блоках Lookup-ом, о чем вообще тут реакторы) При нормальном количестве блоков в чертеже твой комп вскроется ИМХО конечно. Но реакторы тут точно не нужны. |
||||
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Autolisp Отрисовка и перерисовка объектов как в MagiCad | Zaghim | LISP | 10 | 01.12.2010 14:54 |
Как отладить нейтив и менеджед код в COM объекте который используется из AutoLISP? | lexluther | LISP | 1 | 12.08.2009 08:37 |
Разрыв в месте пересечения линий выносок | Zorroko | Конструкции зданий и сооружений | 7 | 20.02.2009 18:42 |
Копирование данных для спецификаций из выносок СПДС в таблицу из мтекстов | Red Nova | Программирование | 177 | 08.12.2008 11:35 |