|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
функции выбора. Вспомогательная информация
Инженер ЭОМ
Москва
Регистрация: 05.03.2009
Сообщений: 215
|
||
Просмотров: 10125
|
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Средствами lisp'а такое не сделать. Единственный вариант - попробовать через prompt показать свое сообщение и запросить выбор, "погасив" вывод в ком.строку (cmdecho = 0, menuecho = 0). Кажется, так.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Код:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Спасибо. Наверное я плохо изложил свою мысль. Я хотел чтобы при включенном динамическом вводе высвечивалась эта надпись "Выберите коммутационное оборудование"
Код:
Код:
|
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
lisp'ом такое не сделать (хотя через ObjectARX вроде бы есть возможность изменить приглашение).
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
|
||||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
Нельзя подменять выбор объектов (одного или нескольких) указаниями точек ради "красивого" приглашения. Вреда от этого будет больше. Программист обязан предоставить пользователю возможность использовать все штатные средства выбора, имеющиеся в AutoCAD. Если необходим выбор множества объектов, то специфичное приглашение достаточно вывести один раз, как показано в #4. И пусть потом повторяется штатное "Выберите объекты" - это нормальный режим работы. Как вариант, возможен цикл с entsel, т.е. с выбором объектов по одному. Иногда это даже бывает предпочтительней, так как можно сразу отбрасывать объекты недопустимых типов. Конечно, хотелось бы иметь дополнительный аргумент приглашения в ssget... Но имеем то, что имеем... |
|||
![]() |
|
||||
Моя идея вот в чем: сделать выбор объектов по аналогии с выбором объектов к примеру в команде matchprop. То есть, если пользователь щелкает на примитиве - тот добавляется в набор (в цикле работает функция entsel и функция ssadd), если на пустом месте - то щелчек воспринимается как первая точка рамки (весто entsel запускается функция getcorner) и предлагается указать вторую точку. Ну и дальше - если вторая точка левее первой - рамка секущая, правее - охватывающая... Все примитивы, выбранные рамками также добавляются в набор. Заканчиваетсяя выбор нажатием Enter. При этом, можно при помощи initget задавать дополнительные опции. Все, что я описал - легко реализуемо, даже представляю, как это можно сделать. Но вот как пропускать выбираемые объекты через фильтр ssget, для меня пока задача не решенная...
|
||||
![]() |
|
||||
|
||||
![]() |
|
||||
С рамкой-то понятно... Вот как отдельный примитив, выбранный с помощью entsel, внести в набор с учетом фильтра? Впрочем, есть пара задумок, надо садиться писать код
![]() Стоп, а "_B" - это как? Что это за опция? я знаю только "_W" - выбор рамкой и "_C" - секущей рамкой. |
||||
![]() |
|
||||
"_B" - от BOX (проверил в AutoCAD 2008 - работает некорректно). Так что или "_W" или "_C".
|
||||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
1. Нажата ESC - значит все дальнейшие действия надо безопасно прекращать. 2. Пользователь просто "промазал" мимо примитива. Здесь ты предполагаешь ввод точки. Может быть. А может и начать ssget. Для анализа причин завершения entsel используй errno. Вот примеры: 1. Низкоуровневая функция: Код:
Код:
Код:
Код:
Код:
|
|||
![]() |
|
||||
Регистрация: 21.07.2008
Луцьк
Сообщений: 179
|
sdv79,
http://www.theswamp.org/index.php?to...6261#msg246261 убрать из функции SelAtts привязку к атрибутам, плюс добавить обработку нажатости shift функцией (acet-sys-shift-down), плюс фильтры и будет что-то похожее на ssget |
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
Здесь и сейчас предлагаю продолжить викторину, которую начал Дима_ в этой теме (начало в посте #10), поскольку предлагаемая мной задачка попадает в рамки данной темы.
Похожие темы (это если вдруг вы решите "погрузиться", выдержка из них будет чуть ниже): Как заменить текст запроса в стандартной команде? Lisp. Квинтэссенция ssget/entsel/vla-selectOnScreen для динамического ввода. Пустой ввод при выполнении entsel. Итак, Внимание, викторина! Я утверждаю, что на лиспе можно создать функцию, которая будет вести себя в точности как стандартная функция ssget или как стандартный запрос на множественный выбор объектов большинства штатных команд, но при этом вместо неинформативного "Выберите объекты: " можно будет увидеть возле курсора любое приглашение, если включен динамический ввод. На выходе функция вернет созданный интерактивно набор. Понимаю, что само понятие викторины не подразумевает столь глобальных изысканий и столь глобальных кусков кода, чтобы полностью повторить все поведение ssget, поэтому сразу приведу соль указанных тем и нужные куски кода, а вопросом викторины станет одна хитрая функция, которую первым опубликует победитель. Наградой будет второй тур викторины, в котором я выложу код, практически полностью повторяющий поведение ssget и даже больше, но в нем есть несколько отклонений от поведения стандартной функции выбора, которые участникам второго тура предстоит определить, просто жутко любопытно, насколько глубоко пользователи используют опции при выборе объектов. И потом совместными усилиями найти хитрые способы их устранения (это по ходу будет третий тур). Идею очень хорошо описал Do$ чуть выше, в #12: Цитата:
Код:
Код:
![]() ВНИМАНИЕ, вопрос викторины Написать "хитрую" функцию на AutoLISP, которая заменит в коде функцию (get_ss_by_win) и в результате выдаст "правильную" рамку выбора объектов: залитую синим при выборе слева направо, и зеленым - справа налево. |
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
Спасибо за проявленный огромный интерес (
![]() В том виде, как она есть сейчас, pseudo-ssget принимает больше аргументов: - prompt_string - строка-приглашение; - what_if_empty_enter - строка, которая вернется при нажатии Enter (пустой ввод); - keyword_list - список ключевых слов либо T, во втором случае выпадающее меню повторит стандартные опции - ssget; - filter - фильтр, такой же, как у ssget. Возвращает либо набор, если он был создан, либо строку - ключевое слово, если оно было выбрано, либо nil, если ни того ни другого не произошло. Помимо этого допускается выбор рамкой таким образом, что первый угол рамки может оказаться за пределами видимой области экрана, но все примитивы, не попавшие в экран, выберутся. Правда, и шухера там гораздо больше, нежели я разместил в рамках получившейся горе-викторины. Не стану объяснять, какие это открывает возможности - адепты лиспа (если таковые еще не все вымерли) смогут подключить фантазию и воображение, покажу лишь один из примеров использования, имеющий отношение к стандартным действиям в Автокаде, не углубляясь в специфику проектирования. |
|||
![]() |
|
||||
Цитата:
В .NET API такой проблемы нет. Там можно задать собственное сообщение при выборе объектов, и даже ключевые слова использовать. Так что, "хитрую функцию" проще всего сделать как расширение для LISP, написанное на .NET. Цитата:
P.S. А, нет, можно. http://adndevblog.typepad.com/autoca...selection.html. Но это просто чудесно - выход из метода генерацией исключения! ![]()
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic) Последний раз редактировалось Do$, 03.08.2016 в 17:06. |
||||
![]() |
|
||||
Регистрация: 23.04.2015
Сообщений: 163
|
Тут призы ещё раздают, я не опоздал?
![]() Цитата:
![]() Код:
А вот подсветку я бы делал sssetfirst-ом, люблю, когда ручки видно. И предварительный выбор неплохо бы обрабатывать. Последний раз редактировалось frostmourn, 05.08.2016 в 09:20. |
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
Цитата:
Получилось интересно, не знал, что такое можно на лиспе исполнить. Мне понравилось. Правда, не понял, а зачем привязки обрабатывать? Их же нет при стандартном выборе рамкой. А вообще, конечно, направление движения не то, что я имел в виду. Все было куда проще в коде, но, возможно, куда дольше в моих экспериментах и "тыков" в свое время. Вот код, который визуально повторит полностью действия стандартного выбора: Код:
Код:
Таким образом, если заменим в коде викторины функцию get_ss_by_win на приведенную в этом посте, а также подгрузим функции от VVA, то будем иметь выбор объектов со штатным поведением, но своим приглашением. Поскольку победителей в викторине (читай - заинтересованных в подобном функционале) нет, то и конечный код выкладывать смысла не вижу. |
|||
![]() |
|
||||
Желание освоить .NET или ObjectARX зрело давно и долго, но мотивации не хватало. Но тут понадобилось писать приложения под Civil 3D. Материалы были только для .NET API, поэтому, пришлось осваивать.
У лиспа то там то тут постоянно всплывали какие-то ограничения - то с диалогами, то вот с таким выводом сообщений при множественном выборе объектов, то с динамической отрисовкой, то с производительностью...
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic) |
||||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Предложение: Готовые функции | Apelsinov | Библиотека функций | 170 | 27.06.2010 23:51 |
Функции AutoLISP из ... DLL! | Supermax | LISP | 21 | 27.06.2010 14:18 |
FILTER / фильтр | BM60 | Справочник команд | 0 | 08.07.2008 15:35 |
Информация по работе EPC/EPCM подрядчика | Кочетков Андрей | Поиск литературы, чертежей, моделей и прочих материалов | 0 | 14.03.2008 11:22 |
Выбор примитивов в функции (command) | mmax | Программирование | 12 | 19.05.2006 20:02 |