|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Autolisp. Автоматическая перерисовка выносок
Регистрация: 01.07.2010
Сообщений: 521
|
||
Просмотров: 12943
|
|
||||
Регистрация: 01.07.2010
Сообщений: 521
|
Смотри. Круглая труба (2 линии по краям и ось). Диаметр 100. Ставлю выноску на одну из линий, не в середину. Выноска готова. Далее меняю диаметр блока на 250 - ось осталась на месте крайние линии убежали что бы был диаметр 250, соответственно выноска осталась на старом месте. Теперь мне нужно что бы выноска сместилась на эту линию а не болталась указываю в пустоту. Для этого сравниваю 2 диаметра, определяю смещение и точку выноски переношу на линию, где она и была и соответственно обновляю блок выноски на новые значения. Тут все просто т.к. зная угол и 2 диаметра можно определить куда идти. А для других блоков этот метод не прокатывает...
|
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
1. Вариант для равномерно меняющих рахмер блоков - сравнивать точку вставки и getboundingbox.
2. Для "непредсказуемо" изменяемых задать "жесткие" точки вставки для каждой видимости в зависимости от параметров (но по моему овчичнка выделки не стоит). 3. Сразу вставить эту "выноску" в блок (с аттрибутом) - а его уже менять.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Регистрация: 01.07.2010
Сообщений: 521
|
Вот я уже думал про вариант 3, но опять же внутри блока атрибут будет жестко задан в конкретной точке, а это не всегда есть хорошо...
А вот про getboundingbox не в курсе...что за зверь? Ага, примерно понял...попробовал на блоке... блок ДК выдал одну вершину прямоуголника... связь не могу понять |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Если "штукенцию" запрограммируешь, то будет работать и с блоком.
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Это в помощь
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Регистрация: 01.07.2010
Сообщений: 521
|
В принципе последовательность кода примерно понял, ссылаясь на Полещука... Вначале выбираем 2 блока, преобразовываем их в VLA-объекты, затем создаем 2 реактора с modify. А вот все тоже "при изменении одного, двигать другой" пока не понял как обработать...разбираюсь дальше...если в начале не прав - поправьте.
Изучил материал. В общем-то весь процесс, который можно отследить при помощи реакторов, я реализовал по-другому. Сделал в блоке выноски атрибут, в который записывал старое состояние блока (имя, координаты, размер и тип). При запуске проги проверял изменился блок или нет...ну а дальше то уже как раз сам процесс перерисовки, а тут засада. Все равно же нужно вычислить точку, на которую нужно сместить атрибут, а здесь засада.... Последний раз редактировалось Zaghim, 13.09.2011 в 10:56. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Дальше все зависит от блока. Если меняется динамический параметр, то можешь запросить его значение. Функции для работы с динамическими блоками: 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. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Выложи примеры твоих блоков. Общее решение озвучено в #6 п.1
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Zaghim, сложности на пустом месте!
![]() ![]() Если к тому же (скорее всего) параметры блока меняются в строго определенных пределах (ну типо по ГОСТу там), то пользуйся в самих блоках Lookup-ом, о чем вообще тут реакторы) При нормальном количестве блоков в чертеже твой комп вскроется ![]() ИМХО конечно. Но реакторы тут точно не нужны. |
||||
![]() |
|
||||
Регистрация: 01.07.2010
Сообщений: 521
|
Ну сразу. Во-первых - выноска нужна не всегда... значит нужно делать дополнительные визибл сеты в блоке! Во-вторых - поверни блок на 90 градусов и посмотри, что получится)))) ну думаю это можно исправить, хотя хз) И в-третьих - выноска не должна быть жестко привязана к одному месту... на огромных планах - это неправильно, чертеж может быть загорожен и выноску нужно двигать!!!
|
|||
![]() |
|
||||
Zaghim, полегче, я на тебя еще слава богу не работаю. Тебе дали пищу для размышлений, как ты понимаешь лиспа тут вообще не нужно а нужно уметь работать с тем что в АКАДе есть.
Насчет движения выносок см. №21. Так вот теперь сам и решай свои проблемы ![]() |
||||
![]() |
|
||||
Zaghim, я поглядел, реально выноску в блоке не получилось сделать всегда горизонтальнонаправленной. Тогда если делать уж программно, то так:
1. У блоков д.б. полярный точечный параметр, который однозначно указывает на место выноски для данного блока. За него надо тягать чтобы изменить место выноски. 2. У выносок в расширенных данных хранится блок к которому каждая из них клеится. Почему не у блоков в расширенных? А прикинь выноску удалил? ![]() 3. Нажимая кнопку "Обновить выноски", прога проходит по выноскам, справляется о положении точки вставки выноски для каждого блока, с которым выноска связана, и в соответствии с углом поворота этого блока и др. параметрами, заполняет выноску и сует куда надо. О как ![]() Последний раз редактировалось 5hev, 14.09.2011 в 15:57. |
||||
![]() |
|
||||
Регистрация: 01.07.2010
Сообщений: 521
|
Что-то не понял ничего))))) Выноска все таки в блоке будет или нет? Сейчас у меня в боке выноски есть атрибут, куда я пихаю имя блока, к которому она принадлежит. С параметром Point внутри блока уже сталкивался... это не простой зверь, он показывает координаты внутри блока, а не координаты в чертеже.
|
|||
![]() |
|
||||
Zaghim, выноска будет вне блока, отдельно в чертеже. Если ты не работал с Extended Data, можешь работать и дальше
Цитата:
Верно, тебе это и надо. Будешь от точки вставки блока, трубы к примеру, находить место вставки выноски этого блока полярным смещением. |
||||
![]() |
|
||||
Регистрация: 01.07.2010
Сообщений: 521
|
Neo_ - это все понятно, а представь блок диффузора. Его увеличили, а ты линию пустил и она уперлась во что-нибудь внутри блока)) не вариант...
5hev[ru], ну а смысл тогда делать такую точку? Я могу это все и формулами рассчитать. Я знаю прошлое его состояние и нынешнее и точку вставки...Что мне считать от точки вставки, что от другой точки... выноска то где угодно может быть |
|||
![]() |
|
||||
Регистрация: 01.07.2010
Сообщений: 521
|
5hev[ru], блоки разные и смещения относительно параметра точка нужно будет рассчитывать разными формулами... по-моему так.
Попутный вопрос немного не в тему. Бывает точка в нуле отображается 0.0 и еще бывает 3.1555е-14, что по сути тоже 0... при сравнении они получаются не равны... как сделать что бы такие мелкие числа лисп определял как 0? |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Zaghim, блоки разные, и если в них будет этот параметр который будет олицетворять собой смещение относительно точки вставки блока, то никаких расчетов тебе вообще не понадобится.
Ну попробуй условие задать если меньше 0,01 то 0 ![]() VVA, как молния! ![]() |
||||
![]() |
|
||||
Регистрация: 01.07.2010
Сообщений: 521
|
5hev[ru], хм....только наверно ты забыл сделать так, что бы при увеличении блока эта точка двигалась с ним.
Получается, что когда я вставил выноску, мне нужно вначале перенести эту точку к выноске, потом при изменении так же высчитывать куда она убежала... блин, не знаю, не знаю... попробую пошаманить |
|||
![]() |
|
||||
Регистрация: 26.12.2011
Сообщений: 322
|
Цитата:
|
|||
![]() |
|
||||
Регистрация: 26.12.2011
Сообщений: 322
|
Я имел ввиду прогу для простановки выноски. Я это сделал на мой взгляд дубово, динблоком выноски и полями, неудобство в том что их нужно обновлять, хотя и это не проблема впринципе, но все таки хотелось бы посмотреть что у вас за такая интересная штуковина. Приложил файл!
Супермегахит.dwg |
|||
![]() |
|
||||
Регистрация: 01.07.2010
Сообщений: 521
|
Извиняюсь, давно не просматривал ветку, сейчас отрою код и постараюсь выложить.
А вообще от этой штуки отошли. Просто в нашем случае при перерисовке тех же труб, некоторые из них удалялись и вставлялись новые и вся инфа в выноске была неактуальна. ДК- Дроссель Клапан, ОЗК - Огне Запорный Клапан |
|||
![]() |
|
||||
Регистрация: 01.07.2010
Сообщений: 521
|
Код:
Выбираю все, что есть на чертеже, оттуда фильтрую выноски. В блоке выноски у меня несколько атрибутов - верхняя строка - это строка Типа ДК 100х100, еще нужен атрибут, назвал его А. В нем хранится вся необходимая инфа по блоку - его имя, точка вставки, ну и там размеры из верхней строки и угол поворота и еще признак (1 или 2) - это если блок круглый или прямоугольный. Всю эту шляпу я достаю в цикле ну а дальше проверки при различных ситуациях изменения блока... Например был круглый стал прямоугольный или что намного чаще изменился его диаметр или ширина и обновляю выноску... Как то так) Будут вопросы - обращайся. Последний раз редактировалось Zaghim, 29.12.2011 в 11:12. |
|||
![]() |
|
||||
Регистрация: 26.12.2011
Сообщений: 322
|
А я думал что умею загружать лисповские программы(((. Все ли я правильно делаю??? напишу пошагово : я беру копирую этот текст в блокнот, сохраняю с расширением lsp. загружаю в автокад, и потом пишу в командной строке имя команды vinper - так или не так???, вобщем ничего не получилось, вобщем стыдно мне, стыдно
![]() |
|||
![]() |
|
||||
строю, ломаю Регистрация: 03.04.2008
Украина
Сообщений: 5,515
|
фырр-фырр, ага, ага...
в конце файла нет определения с:функции, чтоб избежать брожения по лиспу, локальные переменные и функции должны быть локальными, имя блока лучше хранить на видном месте с подробным комментарием, (gc) можно опустить, выбирать надо не все, а только блоки с нужным именем чем (* .5 pi) хуже 1.57079632679489655800 |
|||
![]() |
|
||||
Регистрация: 31.01.2014
Сообщений: 2
|
Есть 3д динамические блоки с разными названиям и атрибутами. Можно ли сделать выноску которая при указанию на блок будет считывать нужный атрибут? Чаще всего нужно чтоб считывался атрибут "ПОЗ", которой есть во всех блоках.
Выноска с полем не решает проблему, так как мало чем отличается от забивания вручную. Делают еще через СПДС, только вот СПДСа у нас нет(. Но раз в СПДС можно, то наверно и в лиспе можно? Сам в нем ничего не понимаю поэтому прошу подсказать здесь. |
|||
![]() |
|
||||
Можно, но довольно сложно.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic) |
||||
![]() |
|
||||
Регистрация: 31.01.2014
Сообщений: 2
|
|
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
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 |