|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Изменение работы комманды SELECT FENCE
Штаб
Регистрация: 21.08.2003
Сообщений: 943
|
||
Просмотров: 15402
|
|
||||
Engineer Регистрация: 05.09.2003
New-York
Сообщений: 10,288
|
Похоже, что Torino пишет макрос, это видно по знаку (точка с запятой). Очень часто на время действия какой-либо программы надо отключать режимы привязки. Режим, имевший место до начала команды, можно запомнить функцией LISP: (Setq os (getvar "osmode")). С нее и надо начинать макрос. Здесь "os" это свое (придуманное) имя текущего режима. Далее Osmode;0; В конце макроса надо восстановить режим: (setvar "osmode" os)
|
|||
![]() |
|
||||
Регистрация: 21.08.2003
Штаб
Сообщений: 943
![]() |
2Vova:
да, спасибо, именно так, но вопрос немного в другом: куда вставить данные строки (имеется ввиду модифицирование кода встроенных команд акада. Конкретно SELECT). 2Perezz!!: все мы стремимся к совершенству :wink: 2Fantomas: нажать 2 раза ф3 - это сложнее, чем не нажимать ни разу, так? ![]() |
|||
![]() |
|
||||
Engineer Регистрация: 05.09.2003
New-York
Сообщений: 10,288
|
Модификация родных команд Автокада вряд ли возможна, да и зачем? Создание своих собственных кодов для решения конкретных задач (на LISP, DIESEL VBA и т д, я вот предлагаю макросы)-наиболее правильный путь.
Сообщи конкретно, какую команду ты хочешь создать. |
|||
![]() |
|
||||
Инженер по системам безопасности Регистрация: 23.11.2003
Рига
Сообщений: 1,099
|
Ну вот примерно так.
Код:
Сие сохранить в текстовом файле с расширением LSP. Поставить в автозагрузку Tools>AutoLisp>Load (а там Startup Suite). C клавы запускаеться FSE. Для кнопочки соответственно ^C^Cfse. |
|||
![]() |
|
||||
Регистрация: 21.08.2003
Штаб
Сообщений: 943
![]() |
Fantomas, спасибо за код, но это не то. Проще два раза нажать ф3, чем тянуться мышкой до кнопки :)
Для Вовы: я не хочу создавать команду, я хочу дополнить переключатель FENCE команды SELECT следующими строчками: (setq temp_osm (getvar "osmode")) (setvar "osmode" 0) .............. (setvar "osmode" temp_osm) //на выходе (строчки взяты из программы Фантомаса :) ) Т.е. найти код, на который передается управление после ввода FENCE. Если он в ехе-шнике или арксе, то вопрос снимается, а если в лиспах, то тут можно покумекать. |
|||
![]() |
|
||||
Инженер по системам безопасности Регистрация: 23.11.2003
Рига
Сообщений: 1,099
|
>Torino
Зачем ломать АКАД? Зачем тянуться до кнопки? Ну обзовите функцию не FSE а двумя буквами (надо конечно проверить чтобы не совпадали со стандартной командой) и набирайте в командной строке. Вы объясните подробно свою задачу. |
|||
![]() |
|
||||
Регистрация: 21.08.2003
Штаб
Сообщений: 943
![]() |
Объясняю с картинками: пример:
на представленном фрагменте мне необходимо наклонной линией обрезать короткие вертикальные линии. Для этого логично выделять их с помощью fence. Но т.к. apperture box больше расстояния между линиями, то происходит привязка в ненужные мне точки. Я хочу сделать так, чтобы после набора на клавиатуре буквы "f" (в режиме выделения) объектная привязка автоматически отключалась. [ATTACH]1070732395.gif[/ATTACH] |
|||
![]() |
|
||||
Engineer Регистрация: 05.09.2003
New-York
Сообщений: 10,288
|
Sorry. невнимательно прочитал, что надо выборочно обрезать. Но все равно можно что-то придумать но в любом случае не ломать автокад.
Кстати, пришла в голову идея-конкурс на самую короткую программу решения этого вопроса. Чтобы за наименьшее количество щелчков все что нужно, обрезалось. Привязки бы не отключались (или возвращались) и мерилом результата было бы наименьшее количество знаков в программе. Torino поставит виртуальное пиво, а Perezz что-нибудь придумает по организации. |
|||
![]() |
|
||||
сисадмин Регистрация: 26.08.2003
Самара
Сообщений: 1,022
![]() |
Почему сразу "ломать автокад"?
Для этого есть вполне определенные и документированные средства: раздел "Redefining AutoCAD Commands" в хелпе предлагает соответствующие механизмы - (command "undefine" "line") например, позволит "забыть" родную команду LINE. Определяйте ее заново, как надо и используйте, вызывая без точки перед именем команды. А когда надо вернуть "как было", то достаточно (defun C:LINE () (command "_.LINE") (princ)) и все вернется на круги своя. Загляните еще в раздел "S::STARTUP Function—Post-Initialization Execution" - там рабочие примеры. Еще есть в запасе (vl-acad-undefun 'symbol), на крайний случай. Вся сложность здесь заключается в том, как стопроцентно сэмулировать родную команду (отслеживать эту самую f) и вовремя отключить-включить привязку. На Лиспе это сделать (в первом приближении) возможно. Если нужна "прозрачная" команда, то такие обещает VLX с собственным именным пространством. А вот как отследить эту f Дизелем.... |
|||
![]() |
|
||||
Регистрация: 21.08.2003
Штаб
Сообщений: 943
![]() |
>> Torino поставит виртуальное пиво, а Perezz что-нибудь придумает по организации.
Ставлю не виртуальное, а реальное булькающее и пенящееся. Для тех, кто ЕГО не любит, ставлю прозрачную и холодненькую... Для Фантомаса повторяю картинку [ATTACH]1070872143.gif[/ATTACH] |
|||
![]() |
|
||||
Engineer Регистрация: 05.09.2003
New-York
Сообщений: 10,288
|
Сегогня тоже не смогу: хозяева ведут сотрудников в ресторан по случаю пождества. Пусть пока Админ, Perezz и кто-нибудь из желающих станет станут жюри, назначат срок присылки программы. Поскольку я теоретически могу победить, так как умею похожие штуки делать только на макросе, я он короче по определению, то: либо мой знак считать за 3, либо отдельный конкурс среди макроведов. Но таких еще, наверное, нет, ведь книжку еще не прочли. А может, вне конкурса?
|
|||
![]() |
|
||||
Инженер по системам безопасности Регистрация: 23.11.2003
Рига
Сообщений: 1,099
|
>Torino
Ну вот, пока там все о выборах... Нашел пол часа и выдаю первый вариант. Вызываеться эта бяка из командной строки "ff", после чего отключает все привязки и просит указать границу "подрезки" (Select boundary), после чего просит провести линию через "подрезаемые" объекты (Draw fence line), после чего подрезает и включает привязки. Написан обработчик выхода по Esc, т. е. можно прерывать в любом месте смело, привязки не слетят. Эта гадость и составляет основную массу кода. Все это необходимо в скопировать в чистый файл в Notepad и обозвать файл с расширением LSP. После чего открыть Tools>AutoLISP>Load..., найти файл и загрузить Load. Для постоянного использования надо найти там же группу Startup Suit и внести файл в форму открывающуюся клавишей Contents... Код:
>Vova На виртуальное пиво пока не претендую. Но есть сомнения, можно ли с помощью макросов вернуть системные переменные, если нажали Esc? Несилен в макросах. В прочем, я тут нашел, что вы книги по АКАД пишите. Обязательно почитаю, то что на ссылке, тем более что народ хвалит. |
|||
![]() |
|
||||
Инженер по системам безопасности Регистрация: 23.11.2003
Рига
Сообщений: 1,099
|
> Torino
Извините одну бяку нашел, которую не поймет русский АКАД. Впрочем у вас кажеться английский, но все равно, чтобы работало и там и там: (command "trim" bound_obj "") заменить на (command "_.trim" bound_obj "") то есть _. добавить а (command "f" pause pause "" "") на (command "_f" pause pause "" "") соответственно _ добавить. Когда "под себя" пишешь, не всегда задумываешся, что есть он где то русский АКАД. |
|||
![]() |
|
||||
Регистрация: 21.08.2003
Штаб
Сообщений: 943
![]() |
2Fantomas:
Прога работает отлично! (интересно в Ригу и Нью-Йорк пиво наложенным платежом можно отправить?) НО: это программа, т.е. ее нужно специально вызывать, а жюри (в моем лице) задачу ставит несколько иначе: перехват, переопределение (простите дилетанта в этом вопросе) встроенной команды SELECT. Давайте поработаем в этом направлении. [ATTACH]1070960292.gif[/ATTACH] |
|||
![]() |
|
||||
Инженер по системам безопасности Регистрация: 23.11.2003
Рига
Сообщений: 1,099
|
>Torino
Хорошо, подумаем. Для чего торчу на форуме? Да потому что другие ставят такие задачи, до которых сам бы никогда не додумался. Их решение сильно развивает. Основная проблемма вот в чем. Опять про Esc. Выключить привязки, насколько мне известно можно только сбросом переменной OSMODE в 0. Далее следует команда FENCE которую можно прервать в любой момент известным способом. Как восстановить старые привязки? Возможно способ есть. Но с ходу, ничего сказать не могу. Ну допустим переопределили мы "f" и выключили привязки и нормально закончили команду, а если нет? Интересно послушать остальных участников форума. У меня другая идеология. 1) АКАД сильно не ломать 2) для решения задач писать функции на ЛИСПЕ или на VBA который начал изучать. Пока уйду на паузу и откажусь от пива. Единственное на днях прогу досовершенствую в следующих направлениях 1) возможность выбирать несколько границ подрезки 2) возможность делать ломаную линию FENCE и как идеал 3) возможность разрывать FENCE линию, тогда можно будет подрезать все за 1 раз, ну или за 2. Возможно "овчинка не стоит выделки", но столкнулся с некоторыми проблеммами, которые могу решить, но большим количеством кода, а хочу маленьким. Так что в общем то из собственного интереса. Как что нибудь накарябаю, выйду на связь. >Vova Наверное вы правы, не стоит устраивать соревнование, тем более на краткость кода. Если бы ЛИСП-ЛИСП или МАКРОС-МАКРОС тогда другое дело. А в ЛИСПЕ не имеет практического смысла сокращать понятный код, можно написать программу из одного выражения и практически (за редким случаем) без переменных. Только потом сам программист, уже не поймет что написал пару месяцев назад. Другое дело реализовать другой алгоритм. А сокращения ни к чему, чем понятнее тем лучше. |
|||
![]() |
|
||||
сисадмин Регистрация: 26.08.2003
Самара
Сообщений: 1,022
![]() |
Посмотрел еще раз на картинку... набросал отрезков.... и возникла мысль (если конечно я правильно понял, каким должен быть конечный результат). Способ простейший, не имеющий никакого отношения к программированию, потому на участие в конкурсе не претендую. Значит, нужно обрезать только короткие линии. Для этого длинные перенесем в другой слой, который заблокируем (заморозим, отключим - дело вкуса). После этого можно вызывать TRIM c опцией F, и выбирать сразу ВСЕ отрезки, указывая точки на достаточном удалении от них. Те, что на заблокированном слое, останутся целыми. Потом вернуть длинные отрезки куда надо (если надо), например, объединив слои. Впрочем, отключение привязки здесь совсем ни при чем.
Имхо, это проще, чем писать макрос. Во всяком случае, результат несколько более близок. |
|||
![]() |
|
||||
Регистрация: 21.08.2003
Штаб
Сообщений: 943
![]() |
Действительно, это метод, который приведет к нужному результату (а в случае большого количества отрезков быстрее любых других методов), но если мы сейчас поймем, как можно решить, поставленную мной проблему, то откроется такое поле деятельности, даже подумать страшно. (прям как в великом эксперименте
![]() |
|||
![]() |
|
||||
сисадмин Регистрация: 26.08.2003
Самара
Сообщений: 1,022
![]() |
>Fantomas
Написать такую прораммульку не сложно. Но! Она будет привязана к конкретному заданию или работе. Если такие действия нужно выполнять по многу раз в день с однотипными наборами объектов, то конечно. А вот универсальности здесь скорее всего не получится. >Torino Не так уж страшно ![]() |
|||
![]() |
|
||||
Регистрация: 21.08.2003
Штаб
Сообщений: 943
![]() |
Здесь уже придется выбирать: либо чертить, получая удовольствие (не подумайте ничего плохого - я про удобство работы), а при переходе на новую машину потратить день на настройку Акада, либо пользоваться стандартными средствами, предоставляемыми Акадом, но переезд при этом будет быстрый.
|
|||
![]() |
|
||||
Engineer Регистрация: 05.09.2003
New-York
Сообщений: 10,288
|
Torino> Сделай кнопку с этим макросом:
^C^C_-G;E;ZZ;^C_-G;;ZZ;;F;\\;;_M;_G;ZZ;;0,0;10000,0;_L;\\;_EXTRIM;_L;\E;_L;;_M;_G;ZZ;;10000,0;0,0;_-G;_E;ZZ На запрос First fence point выделяешь 2-мя щелчками все длинные, причем не обязательно их касаться. Длинные исчезнут. Затем на запрос Line проводишь секущий отрезок для коротких и щелкаешь в сторону обрезки в любом месте. При этом короткие обрежутся, режущая кромка исчезнет а длинные вернуться. Итого 5 щелчков. Можно, наверное и за 4. Не работает, если нет Express В этом макросе я убираю длинные, но не в другой слой, а в ... Кто догадается, куда они делись? я этот прием использую в практическом ручном (не программном) черчении. Fantomas> От слетания привязок я использую другое лекарство, имею кнопку osmode;695 Об этом я здесь говорил. Расскажи в двух словах (в разделе Разное) как живут русские и коренные в Латвии, отказались ли от затеи отобрать у Пскова Абрене, работает ли промышленность, куда ходят в сложные водные и лыжные походы (раньше неплохо ходили, мастера спорта были) и т д. Paldies |
|||
![]() |
|
||||
Регистрация: 21.08.2003
Штаб
Сообщений: 943
![]() |
Хитро и кратко!
Небольшя доработка: если длина чертежа превышает 10000 по оси Х, то передвинутые отрезки могут мешать работе (особенно если работа ведется 1:1 и на линейных сооружениях), поэтому двигать их надо не на 10000, а на величину, превышающую пределы чертежа. Я не знаю какая для этого служит переменная, но, думаю, такая есть. В макросе извлекать ее значение и подставлять в команду MOVE. Не сочти меня занудой, но это опять не переопределение команды SELECT (т.е. применение этого макроса возможно конкретно в этой ситуации) :wink: |
|||
![]() |
|
||||
Engineer Регистрация: 05.09.2003
New-York
Сообщений: 10,288
|
Как переопределить
существующую команду, я не знаю и такая нужда не возникала. Возмoжно, ближе всех к этому подошел VK, через Undefine. Поэтому вопрос к VK: знаешь ли для чего этим пользуются? Можешь ли рассказать технику этого процесса? Мой макрос демонстрирует здесь следующее: Представьте, вы идете по дороге, а на пути телеграфный столб. Что делать? Макросоведам приходится изворачиваться там, где Лисповик еще может перелезть через такой столб. Вот, здесь удалось этот столб обойти. Средства Menu macros безусловно бедней, чем стредства ЛИСПа, но понять, принципы его работы и научится составлять макросы, безусловно легче, чем ЛИСПы. Лисповики, конечно, тоже изворачиваются, это ведь программирование. А создание макросов заставит читателей моей книги, если они не находят в себе силы изучить ЛИСП, жить этим процессом (изворачиванием) и облегчать свое черчение. |
|||
![]() |
|
||||
Инженер по системам безопасности Регистрация: 23.11.2003
Рига
Сообщений: 1,099
|
>Vova Про жизнь в Латвии обязательно напишу. Насчет выбора ЛИСП-МАКРОС, безусловно макросы штука хорошая, но когда ставишь перед собой определенные задачи, то в них становиться тесновато, вот я уже и до VBA добрался. В АКАДе не одна системная переменная, и делать на каждую кнопку... Короче, книжку вашу обязательно куплю, хотя бы из уважения. Но чувствовать себя комфортно буду только в ЛИСПЕ, люблю я его и даже VBA по нужде, нужен многодокументный режим, красивые диалоговые окна и связь с базами данных. Я в КАДе работаю то всего годик, а на ЛИСП пишу пол года, развиваться еще долго надо.
> Torino Ну короче, написал я как хотел. Сначала можно выбрать любое количество границ, потом правым кликом переключиться на fence и рисовать их сколько угодно, причем разрывая (т. е. обходить столбы). Единственное появился небольшой глюк с обработчиком ошибок, исправлю выставлю. Сейчас код что-то не идет, с женой поругался и работы привалило... Одно успокаивает, работу свою я могу выполнить, несколько быстрее других, особо это не офишируя. Инструмент кстати получился хороший (еще не получился), пользуюсь сам. |
|||
![]() |
|
||||
сисадмин Регистрация: 26.08.2003
Самара
Сообщений: 1,022
![]() |
>Vova
Сам такими вещами натурально не пользовался, нужды не возникало. Только лишь в свое время, при изучении, набросал несколько примерчиков, убедился, что работает. Принял к сведению, как говорится. По данной задаче. Чтоб сделать таким образом то, что хочет Torino, придется переопределить не только команду TRIM, но также скорее всего сделать аналог SELECT, причем, без использования функции (ssget). Дело в том, что команды АКАДа пользуются естествено своими родными функциями и командами, которые вызываются как бы "с точкой". Поэтому, переопределив только SELECT, мы не получим новый вид TRIM. К сожалению. Есть у кого желание переписать команды АКАДа заново? ![]() |
|||
![]() |
|
||||
Инженер по системам безопасности Регистрация: 23.11.2003
Рига
Сообщений: 1,099
|
>Torino
Ну вот и обещаная функция подоспела. Что то пару дней код в голову не лез... Теперь можно выбирать сколько угодно границ "подрезки" и переключаясь правым кликом, рисовать сколько угодно секущих линий "обходя столбы". Я так понял что вы преследовали более "глобальные" цели и возможно функция не сильно нужна. Ну уж обещал, так обещал... Вообще, рекомендую обратить внимание. Неплохая штучка получилась, я ей провода режу. Возможно и что-то другое можно резать. Вжик и пол дома нету или парахода ![]() Код:
|
|||
![]() |
|
||||
Инженер по системам безопасности Регистрация: 23.11.2003
Рига
Сообщений: 1,099
|
Согласен, теперь самому смешно
![]() (setq stop nil) (setq fpt1 '(0.0 0.0 0.0) ftp2 '(0.0 0.0 0.0));end setq (while (/= stop T) (terpri) (princ "Draw Fence Line or Right Click to Exit: ") (command "_.trim" bound_set "") (command "_f" (if (/= nil (setq fpt1(getpoint))) fpt1 (progn (setq stop T) (setq ftp1 ftp1) (print fpt1) );end progn );end if (if (/= nil (setq fpt2(getpoint))) fpt2 (progn (setq stop T) (setq ftp2 ftp1) (print fpt2) );end progn );end if "" "") );End while ;end while Но в этом случае "в динамике" не видна секущая линия. Не комфортно это. Сделал выход через *error*, хотя самому не очень нравиться, зато все видно. Пытался также отрисовывать "фальшивую" секущую функцией "_.line" и считывать начало и конец через ASSOC, но в этом случае в каждом цикле в каждом цикле "мерцают" границы подрезки (command "_.trim" bound_set ""). Можно даже вставить отрисовку линии, между (command "_.trim" bound_set "") и (command "_f"....). На удивление работает, только при Esc: ; error: An error has occurred inside the *error* function Function cancelled. Короче, надо еще подумать. Писать "под себя" и "под пользователя" разные вещи, ему в общем то пофигу какой там код, главное чтобы работало красиво. Спасибо, собственная невнимательнсть часто создает мне проблеммы. >Torino Оно работет. Просто с точки зрения программера, я написал 3 строчки, которые никогда_нибудут_работать. Бог видит, я старался... |
|||
![]() |
|
||||
Регистрация: 21.08.2003
Штаб
Сообщений: 943
![]() |
Цитата:
Ну что ж... Всем большое спасибо за подробное обсуждение моего вопроса. Если что - заходите в гости ![]() |
|||
![]() |
|
||||
сисадмин Регистрация: 26.08.2003
Самара
Сообщений: 1,022
![]() |
Полностью согласен с Torino! Код программы должен быть красивым. Кстати, функция IF будет выполнять первое выражение, если условие не равно nil, поэтому (if (/= nil (setq fpt1.... абсолютно без какого либо ущерба плющится до (if (setq fpt1.... А (setq ftp1 ftp1) до ftp1.
Ничего плохого в выходе через *error* не вижу, если сделать все корректно. Некоторые команды АКАДа позволяют завершение только через Esc, да и для стандартного оператора зацикливания "кнопочных" макросов * (звездочка) это единственный выход. А вобще (имхо), главными в любой проге должны быть две вещи: 1. чтоб работать было _удобно_ !!! 2. чтоб программа _всегда_ работала правильно, независимо от наиглупейших действий пользователя (в последнем случае корректно завершиться и вернуться к исходному состоянию, как будто команда и не вызывалась) |
|||
![]() |
|
||||
Подниму старую тему.
Возможно проблема уже обсуждалась и в других темах, но я нашел только эту. Задача такая: нужно отследить кнопку привязки, и всё это отобразить в макросе Код:
Код:
Отвечу и на возможный вопрос: почему не блоком? Вот хочу чтоб было так! ![]() Есть ли возможность решить все макросом или дизелем. Или только Lisp?
__________________
Поезд который устал от ржавого здравомыслия рельсов... |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
osmode играйся
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Ну и как отследить то?
Допустим отключил, выполнил отрисовку элемента, а потом пытаюсь включить - а какое было предыдущее до 0 состояние???
__________________
Поезд который устал от ржавого здравомыслия рельсов... |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Сравни значение OSMODE при включенной и отключенной привязке
Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
|
||||
![]() |
|
||||
Инженер-программист Регистрация: 17.02.2009
Сообщений: 86
|
{Smirnoff}, спасибо за алгоритм построения обработчика выхода по ESC и правой кнопки мыши. Понадобился - здесь нашел.
----- добавлено через ~1 ч. ----- Цитата:
![]() Последний раз редактировалось Александр К., 21.04.2014 в 09:50. |
|||
![]() |
|
||||
Инженер-программист Регистрация: 17.02.2009
Сообщений: 86
|
Цитата:
![]() А вот от Александра Ривилиса хотел бы услышать ответ. |
|||
![]() |
|
||||
Из опыта работы с AutoCAD (а точнее программирования для него). В это году как раз 25 лет будет...
__________________
Сообщество программистов Autodesk в СНГ - техническая поддержка |
||||
![]() |