|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Помогите продумать поворот части выноски!
Воронеж
Регистрация: 26.06.2007
Сообщений: 151
|
||
Просмотров: 11901
|
|
||||
инженер (КМ) Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837
|
У меня есть подобная выноска, сделана при помощи leader и динамического блока. Используя leader мы решаем проблемы со стрелкой. У динамического блока есть возможность комфортно крутить полку куда угодно. Лидер и блок объеденены в безымяную группу. Точка вставки блока совпадает с последней точкой лидера. Здесь приследуется цель последующего редактирования, уже после отрисовки, а рисуя это все отрезками будут проблемы.
Но это для AutoCAD... Вы-то в чем работаете если не в AutoCAD? На рисунке ADT, а там VisualLISP вроде есть. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
Сильно подозреваю, что задача стоит для BricsCAD'a или чего-то наподобие.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
ЯТД, надо создавать анонимный блок, в который засовывать тексты и отрезки. Этот блок использовать в качестве аннотации к лидеру. Потом поменять поворот блока. Не проверял и не тестировал.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
Значит делать атрибуты и работать с ними отдельно
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
инженер (КМ) Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837
|
Попробуй так:
Код:
Со слоями и цветом пока сам разбирайся (кстати, в вышеуказанном коде (первый пост) нет проверки на наличие слоя "6"). |
|||
![]() |
|
||||
Регистрация: 26.06.2007
Воронеж
Сообщений: 151
|
Вот это да! Спасибо большое за ответы, код и готовность помочь! Я ещё многого не знаю (те же атрибуты, проверку на наличие слоя и т.д.), только начинаю разбираться, поэтому благодарен вам за помощь, советы, подсказки.
Код сейчас буду пробовать, разбираться. |
|||
![]() |
|
||||
Регистрация: 26.06.2007
Воронеж
Сообщений: 151
|
Программа у меня выдала ошибку в Автокаде. Но, судя по тексту, это не совсем то. Надо вот что: пользователь нажимает кнопку на панели, после чего указывает на выноску, нажимает Enter, и она поворачивается на угол, указанный на этой кнопке (один из трёх). Плюс к тому кнопка с масштабированием (0.75) - как указано на рисунке.
Проблема такая: если объединять это всё в блок, а потом поворачивать, текст тоже перевернётся, а в случае со 180 градусами это плохо. Ситуация осложняется ещё тем, что я пока ограничен в фантазиях и способах их реализации из-за недостатка опыта =) |
|||
![]() |
|
||||
инженер (КМ) Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837
|
Говори какую ошибку выдал AutoCAD. Кстати, у меня твоя прога не работает.
Насчет твоих кнопок... На самом деле код для этого очень даже пододит, т.к. в нем используется блок с которым программно обращаться легче (ЯТД). По сути для этого даже дополнительных кнопок не надо, зажимаем грипс блока, два раза жмем пробел и крутим его как угодно. Что касается углов 180 и -90, то тоже решается простым изменением выравнивания атрибутов с левого на правый, у меня в проге для этого работает обычное зеркало (mirror), тогда атрибуты зеркалятся достаточно корректно, но, к сажалению, с переносом базовой точки. Масштабирование? Для блока - это ни есть проблема. А экранным меню я никогда не пользовался. Как оно работает? |
|||
![]() |
|
||||
Регистрация: 26.06.2007
Воронеж
Сообщений: 151
|
Ошибка в том, что сначала построилась выноска, потом исчезла, потом предложила выбрать кучу всего (<>), и в итоге я даже не понял, что там надо выбрать из списка в 10 значений. Но у пользователя не надо спрашивать, что и куда вращать.
Странно, что и моя прога не заработала - у меня в AutoCAD 2005 работает. Чертит только выноски. Экранное меню и я не пробовал - этот рисунок делал не я. Напишите, пожалуйста, подробней, об атрибутах (для чего, как с ними работать) и о комманде масштабирования! [/quote] |
|||
![]() |
|
||||
инженер (КМ) Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837
|
Какая версия (русская/английская)?
Покажи лог, я не телепат. Должно быть так: Код:
Цитата:
Цитата:
![]() Только у блока масштабом является его свойство, которое и редатируется по необходимости. |
|||
![]() |
|
||||
Регистрация: 26.06.2007
Воронеж
Сообщений: 151
|
Так-с... спасибо, буду думать.
Пока мучаюсь с ещё одной проблемой: рисование гребенчатой выноски средствами автолиспа. Это когда нужно указать начало выноски, начало полочки, а затем, пока не надоест, тыкать точки, указывая начало следующих выносок. Потом это должно соединиться в гребёнку, причём линии-выноски из всех указанных точек должны быть под таким же углом к горизонтальной полочке, под каким к ней находится первая выноска. Вот как! Основная проблема - как определить координаты точки полочки, в которой под нужным углом должна заканчиваться каждая последующая линия-выноска. Сижу 3-й час... Может, есть простое решение? [ATTACH]1183060939.jpg[/ATTACH] Есть функция, которая могла бы помочь - vla-intersectWith, но, к сожалению, я ограничен рамками autolisp'а. |
|||
![]() |
|
||||
инженер (КМ) Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837
|
Чего думать? Ты на вопросы ответь.
Если кад русский поставь подчеркивание в коде перед bl и tl, может с этим проблемы: Код:
Цитата:
Цитата:
Я так смотрю диалога у нас с тобой не получется. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
> Krieger : Тут дело такое... В BricsCAD'e (под который и пишется прога) как такового отладчика AutoLISP нет. Можно, конечно, попробовать сторонние приложения использовать, но это не всегда катит
![]() fas и vlx это чудо не поддерживает (по крайней мере 7-ка). > Tonic : еще раз проверь команды и их опции! Возможно, собака порылась именно тут.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
и entmake, и entmakex.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 26.06.2007
Воронеж
Сообщений: 151
|
Krieger, у меня стоит русский Автокад (там я, в основном, тестирую свои lsp), изменил то, что Вы сказали - проблема была в этом. Работает, но это не совсем то, что требуется. Программа, строящая выноски, у меня есть (я приводил примерный текст), а надо, чтобы пользователь, нажавший на кнопку на панели "+180" и указавший на уже построенную ранее выноску, получил её переворот на этот угол, причём текст не должен перевернуться.
Цитата:
Цитата:
Я думаю, может, сделать бесконечные линии, потом определить их точки пересечения, построить обычные линии до точек пересечения, а потом удалить бесконечные линии. Начал так делать, и возникла проблема: 1. Черчю первую линию выноски; 2. Определяю угол между ней и осью Х (angle p1 p2) 3. Строю бесконечную _xline линию по горизонтали (будущая полочка) 4. Пользователь указывает следующую точку начала след. выноски 5. ДОЛЖНА строиться бесконечная линия от новой точки (в цикле) под тем же (определённым ранее) углом, а строится чуть ли не горизонтальная. В чём тут может быть проблема? 6. В дальнейшем собираюсь вычислить точки пересечения, построить _line до них, а все _xline удалить, затем дорисовать горизонтальную линию (от начала полочки). Может, есть хотя бы алгоритмы попроще? |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
Во-первых, СПДС - это arx-приложение, там все достаточно сильно друг на друга завязано, и выдрать оттуда кусок ИМХО нереально.
Во-вторых. В BricsCAD'e лично у меня не распозналась в свое время стандартная штукенция - function. Так что я бы не говорил даже о полной совместимости на этом уровне. Попробуй в бриксе запустить: Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 26.06.2007
Воронеж
Сообщений: 151
|
Кулик Алексей aka kpblc, хех... приложение делаю для BricsCAD, а запускаю в Автокад. Попробовал эту прогу оттуда - столкнулся с тем, что не знаю, как её запустить. Приложение-то загрузил, а вот как вызвать его? В Автокаде надо просто написать в командной строке имя после defun, а тут выдаёт ошибку.
Цитата:
ShaggyDoc, что это за язык? ru-app-begin, ru-conv-millimeter-in-paper-to-unit - первый раз вижу (и мой Автокад тоже) =) |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
Запускай как (test) - в скобках.
Цитата:
![]() _audit иногда подобную ситуацию лечит, но именно иногда. Соответственно приходится использовать _wblock, который в Brics'e (по крайней мере у меня так получилось) не всегда корректно срабатывает, особенно на расширенных данных, сохраненных на примитиве (у меня из 200 примитивов с пользовательскими РД 3 штуки их потеряли после _wblock, также был потерян пользовательский словарь файла; а подробно в причинах я копаться не стал).
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
инженер (КМ) Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837
|
Цитата:
Яж тебе и не давал готового решения... Ну вот сделаешь ты свою выноску из отрезков и текста и что ты с ним дальше будешь делать? Дальше это не выноска, а набор отрезков и текста. И чтоб тебе отредактировать свою выноску тебе надо будет всякие stretсh, move испоользовать, полка сама за текстом не побежит, а значит надо будет её отдельно удлинять. Я тебе предложил leader с любыми стрелками и ассоциированный с ним блок, т.е. двигаешь блок - за ним сам бежит кончик leader-а. Можно без ассоциаций загнать это все в группу и будут всего две ручки для редактирования. Дальше. Надо тебе дополнительную кнопку для поворота. Как ты собираешся свои разобщенные отрезки с текстом крутить вокруг неизвестной точки? А у блока все вместе и базовую точку искать не надо - это точка вставки. Как я уже сказал в случае с блоком и без кнопок здесь все решается просто, но можно и доп. кнопки сделать. Запросто взять entmod и поменять угол??? Да и выравнивание атрибутов туда же??? Хотя, наверное ты прикрепишь расширенные данные и запустишь реакторы - флаг в руки. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
> Krieger : В бриксе нет реакторов. Только если писать на VC++ dll-ки, которые и подгружать. Но это, как заявлено было, требует нехилого знания С++, MFC и ObjectARX для AutoCAD'a
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
Есть. Только не error, a *error*
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 26.06.2007
Воронеж
Сообщений: 151
|
вот, представляю вашему вниманию свой окончательный вариант программы построения гребенчатой выноски, выполненный, возможно, не на высоком уровне, но вполне рабочий:
Цитата:
|
|||
![]() |
|
||||
инженер (КМ) Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837
|
>Tonic
По твоему коду: Если нет слоя "6" - выдаст ошибку, значит надо проверить его наличие и если его нет создать. Например так: Код:
При использовании функции command следует отключать привязки (setvar "OSMODE" 0), а после выполнения их возвращать. Вообще все настройки надо бы вернуть т.е. и текущий цвет, и слой. setq можно каждый раз не писать и такой текст: Код:
Код:
Строчку Код:
Код:
Код:
При нажатий кнопки "esc" все полетит в тар-тарары (тем более если еще привязки отключить), для этого случая можно создать функцию *error*, которая и восстановит все значения. |
|||
![]() |
|
||||
Регистрация: 26.06.2007
Воронеж
Сообщений: 151
|
Спасибо! Буду учиться грамотности на автолиспе!
Отлично, в этом коде нет проблем, таких как нелепая временная прямая. Класс! Только я не весь код понимаю. Не могли бы вы дать комментарии? Особенно сложные конструкции с and, if, да и всё остальное =) |
|||
![]() |
|
||||
Регистрация: 26.06.2007
Воронеж
Сообщений: 151
|
Krieger, разобрался в коде, за исключением строк:
dist (/ (- (cadr pt2) (cadr pt3)) (sin (angle pt1 pt2)));вычисляем длину будующего отрезка - каким образом? я что-то смутно представляю, что получится, если координату новой точки разделить на синус угла pt5 (setq pt4 (polar pt3 (angle pt1 pt2) dist)) - pt4 так и не пригодилась, поэтому я её викинул (наверно, ваша описка) (cons 10 (trans pt3 1 0)) - зачем переводить в другую систему координат? ;этот отрезок не является примитивом и исчезнет при первой же перерисовке рисунка - когда программа завершена, и я удаляю полученную выноску, линия остаётся на экране, пока не двинешь линию прокрутки. Поставил в конце (command "_REDRAW") - помогло (cons 50 (angle (trans pt_first 1 0) (trans pt_second 1 0)));угол наклона - зависит от точек? почему? (cons 1 TexP);собсно текст (cons 7... - нет разницы, что список будет склеен не по порядку? '(71 . 0) - не вверх ногами - это, наверно, и так по умолчанию? (cons 11 (trans (polar (polar pt_first (angle pt_first pt_second) (/ (distance pt_first pt_second) 2)) (+ (angle pt_first pt_second) (* 0.5 pi)) 1.5) 1 0));точка вставки (вторая точка привязки) - самая непонятная строка! '(73 . 0) - выравнивание по базовой линии - это как? И ещё: сколько времени было потрачено на написание этого кода? На мой взгляд, очень профессионально, всё продумано до мелочей! |
|||
![]() |
|
|||||||||||||
инженер (КМ) Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837
|
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
![]() Цитата:
Цитата:
Цитата:
Цитата:
![]() Цитата:
Цитата:
Цитата:
![]() |
||||||||||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
> Krieger : Ты что, решил ликбезом по DXF заняться?
> Tonic : учитывая, что в BricsCAD'e достаточно жиденькая справка (по моим общим ощущениям), а также то, что ты работаешь в AutoCAD'e, отлаживая проги, тебе мой совет - находясь в VLIDE, нажми F1 и перейди на DXF Reference - там написано все, что тебе Krieger рассказал и еще немеряно другого ![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 26.06.2007
Воронеж
Сообщений: 151
|
Цитата:
Кулик Алексей aka kpblc, и в Help'е, и в книге Полещука (AutoLISP&VisualLISP) про DXF написано суховато. Вот стандартный список для LINE: Цитата:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
Пока дите дало посидеть за железкой, попробую ответить
![]() Суховато... Программирование само по себе суше воблы ![]() ![]() Суть прикола через DXF-программирование в том, что есть несколько групп, которые задавать бесполезно. Это -1, 5, и, как правило, 330 и 340 группы. Все остальное задавать, как правило, обязательно. Для создания текстов и легких полилиний, насколько я помню, например, обязательно задавать 100-е группы; для отрезков достаточно создать только 0, 10 и 11 группы ![]() Для создания отрезка с текущими настройками слоя, цвета, веса и типа линии достаточно вызвать Код:
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |