|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
LISP. Отрисовывание полилинии по щелчкам мыши с сохранением координат в список.
инженер
Санкт-Петербург
Регистрация: 02.03.2010
Сообщений: 69
|
||
Просмотров: 4462
|
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Посмотри системную переменную ERRNO.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
gomer, нажмешь Esc и программа вылетит
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Do$, пользователи не всегда смотрят в ком.строку, я уж не говорю о прочтении и осмыслении написанного там
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
Очевидно же, что код, который по щелчкам мыши должен сформировать список точек, должен быть функцией, а не "высокоуровневой программой". Его можно использовать многократно. Такая функция должна или вернуть список при штатном завершении или вернуть NIL при отказе. Штатное завершение ввода должно быть штатным для AutoCAD способом - пустой ввод. Отказ - нажатие ESC. Но при этом не должна вылететь основная программа - функция может быть только её маленьким кусочком. Функция *error* срабатывает, когда "поздно пить боржоми" - вся программа уже вылетела, хотя ESC нажата только в каком-то внутреннем кусочке. Предотвращение вылета всей программы при нажатии ESC (но с разрешением его безопасного использования) надо выполнять с помощью ловушки ошибок. В основе ловушки - функции vl-catch-all-apply, vl-catch-all-error-p и vl-catch-all-error-message. Для их более удобного использования целесообразно написать функцию-аналог конструкции try... except ... end в других языках программирования. Такую функцию (ru-error-catch protected_expression on_error_expression) я уже несколько раз приводил на форуме. Однако и этого "маловато будет". Чтобы прикладному программисту не мучиться каждый раз, надо сделать и заменитель для функции getpoint - в частном случае, а в общем виде -для всех detxxx. Такая универсальная низкоуровневая функция может иметь описание (_ru-get-with-default message default_str quoted_get_func initget_param keywords base_point esc_enabled) В ней предусмотрено всё - текст сообщения, значение по умолчанию, имя штатной функции ввода в "квотированном" виде (например 'getpoint), параметры initget, ключевые слова, базовая точка, допустимость прерывания по ESC. Функцию _ru-get-with-default для подавляющего большинства случаев применения можно еще обернуть. Например, для ввода точек: (ru-get-point-reguired message base_point) - запрос точки с обязательным указанием и опциональной базовой точкой (ru-get-point-or-exit message keywords) - запрос точки с возможностью выхода и так далее. У меня используется около 10 вариантов ввода точек. А есть еще вводы чисел, ключевых слов и прочего. Вот теперь можно написать фукцию получения списка точек указанием: Код:
Command: (get_list_points) Первая точка для списка <Выход>: nil - вышли сразу штатно Command: (get_list_points) Первая точка для списка <Выход>:*Cancel* nil - вышли сразу по ESC, но функция не вылетела, а завершилась Command: (get_list_points) Первая точка для списка <Выход>: Следующая точка <Выход>: ((-11508.8 12019.4 0.0)) - вышли штатно при запросе второй точки, получили только одну Command: (get_list_points) Первая точка для списка <Выход>: Следующая точка <Выход>: Следующая точка <Выход>: Следующая точка <Выход>: Следующая точка <Выход>: ((-11508.8 12019.4 0.0) (-9015.81 13132.5 0.0) (-8732.91 11719.0 0.0) (-10359.6 9687.06 0.0)) - ввели четыре точки Command: (get_list_points) Первая точка для списка <Выход>: nil - прервались сразу штатным пустым вводом и получили NIL Command: (get_list_points) Первая точка для списка <Выход>: Следующая точка <Выход>: Следующая точка <Выход>:*Cancel* ((-11650.3 13450.6 0.0) (-8450.01 13980.7 0.0)) Прервали по ESC на вводе третьей точки, она не добавилась в список, но вылета программы не произошло. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Offtop: Ух щас пройдусь То ShaggyDoc - с каждой буквой Вашего тескста согласен на 100%, но что у Вас за пример?? Ну Вы же здесь без преувеличения самый опытный в лиспе - но в примере у Вас нет ну не одной строки написаной на нем - что это за "поскалевщина" (setq result (cons next_point result) first_point next_point) и соответствующая обвязка, нету у меня Вашей ru-get-point-or-exit, но пример с ней должен выглядеть как-то так (может чего упустил из-за незнания ее функционала - но по аналогии работы с Вашей)
Код:
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
Цитата:
Вот в этой открытой библиотеке можно было бы хоть бесконечно всё совершенствовать. Видит, например Дима_, что какая-то функция написана "по-бейсиковски" - берет её и переписывает "как надо". При условии, конечно, сохранения аргументов, результатов и принципов работы. А "обычные" пользователи-программисты могли бы такую библиотеку практически использовать, даже не копаясь в "кишочках". Или изучая их в порядке обучения. Но нет такой идеи, которую не могут угробить энтузиасты... |
|||
![]() |
|
||||
строю, ломаю Регистрация: 03.04.2008
Украина
Сообщений: 5,515
|
Да нет, в смысле нет, не все так просто. Пользователю нужно дать как минимум два варианта: выход из программы или указание первой (второй, третьей) точки и как минимум три варианта: выход из программы, указание следующей точки и завершение выбора точек. К тому же пользователь скорей всего возжелает видеть, куда он тычет и к чему это в итоге приведет. В случае преждевременного аборта всю эту лабуду нужно удалять, так что библиотекой тут вряд ли обойдешься.
|
|||
![]() |
|
||||
Цитата:
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: |
||||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
Лично я считаю их самым ценным, что появилось в Visual Lisp за последнее десятилетие. Практически все остальные vl- можно перекрыть собственными Lisp-функциями, а ловушку на Lisp не сделаешь. |
|||
![]() |
|
||||
инженер Регистрация: 02.03.2010
Санкт-Петербург
Сообщений: 69
![]() |
Цитата:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Помимо стандартной литературы и "САПР на базе AutoCAD", можно глянуть и на http://autolisp.ru/2009/09/13/error-catch/ - я там поразвлекался немного на эту тему
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
инженер Регистрация: 02.03.2010
Санкт-Петербург
Сообщений: 69
![]() |
Да уж..Столько всего написали тут..спасибо я почитаю...не знаю что сначала и читать, какой код разбирать. Наверно буду пытаться преобразовать функцию eea-vec, чтоб можно было точно указать точку (с привязкой например).
|
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Линии электрических соединений | Shoorup | Программирование | 23 | 07.02.2015 15:13 |
Помощь по Лире | Серега М | Лира / Лира-САПР | 52 | 28.05.2007 02:47 |