|
||
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
По-моему, такого не существует. Только если постоянно эксперименты ставить. И то не факт, что удастся все варианты предусмотреть.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
|
||||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
|
|||
![]() |
|
||||
Количество столбцов, расстояние между столбцами. Можно заменить на "" яд.
|
||||
![]() |
|
||||
Регистрация: 17.01.2014
Сообщений: 97
|
Приветствую. Споткнулся о простой, казалось бы, вопрос. Как можно зациклить вставку блока с последующим безболезненным выходом из цикла? Пробовал:
Код:
|
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
|
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Требуется помощь. Функции по отдельности работают, а вот в "кучу" собрать не могу. Причиной остановки указывает последнюю строчку (выделил красным) . Полагаю, что-то не так с переменными. Честно признаюсь, эта тема (аргументы, переменные, что где прописывать) мне непонятна, если кто может, - объясните, пожалуйста.
Код:
Код:
Последний раз редактировалось Alxndr1697, 31.03.2022 в 08:02. |
|||
![]() |
|
||||
Регистрация: 17.01.2014
Сообщений: 97
|
Цитата:
Выглядит он так: (defun foo ( a b / c d ) < тело функции > ) Разберем по порядку каждый элемент: defun – начало определения функции. Любая функция или команда, определяемая пользователем, обязательно начинается со слова defun. foo – имя функции. Обрати внимание, что если имя функции начинается на c:, тогда AutoCAD определяет эту функцию как команду. Таким образом, если имя функции будет foo она будет определена непосредственно как функция, но, если имя будет c:foo, она будет определена как команда, это важно! Теперь разберемся со скобками, идущими после имени функции. Элементы внутри скобок могут содержать параметры функции и локальные переменные. Все зависит от варианта написания того, что содержится в скобках. Рассмотрим каждый из них: Вариант 1. (defun foo ( a b / c d ) < тело функции > ) В данном случае, функция содержит как параметры функции, так и локальные переменные. Элементы, которые идут до слеша – a b, это параметры функции. Элементы, расположенные после слеша – c d, это локальные переменные. Вариант 2. (defun foo ( a b ) < тело функции > ) или то же самое (defun foo ( a b / ) < тело функции > ) Функция содержит только параметры функции. Вариант 3. (defun foo ( / c d ) < тело функции > ) Функция содержит только локальные переменные. Вариант 4. (defun foo () < тело функции > ) или то же самое (defun foo nil < тело функции > ) Функция не имеет ни параметров функции, ни локальных переменных. И теперь важный момент – если ты определяешь функцию как команду, то бишь вместо foo пишешь c:foo, то такая функция не должна содержать параметров функции, это будет являться ошибкой. Параметры функции нужны, чтобы функция могла принимать входящие значения. Например, определим простейшую функцию создания круга: Код:
Вызов функции с параметром, осуществляется следующим образом: (имя_функции параметр_функции) Подобным образом, попробуем вызвать нашу функцию с применением разных значений в качестве параметра функции color: (MakeCircle 1) - создан круг красного цвета (MakeCircle 3) - создан круг зеленого цвета (MakeCircle 5) - создан круг синего цвета и т.д. Входящие параметры функции могут быть совершенно любого характера: начиная со свойств объекта (цвет, толщина линий, слой и т.д.) заканчивая списками координат и значениями системных переменных. Функции с параметрами нужны, если часто используются повторяющиеся элементы кода, в которых меняется лишь одно или несколько значений. Составив такую функцию, можно впоследствии запускать ее определив только нужное значение, а не дублировать одни и те же строки кода. Теперь разберем, что из себя представляют локальные переменные. Начать нужно с того, что сами переменные могут быть двух типов: локальные и глобальные. Локальные переменные могут быть активны только в функции, в которой они были определены, и после завершения этой функции вычищаются из памяти компьютера. Глобальные же переменные всегда находятся в памяти. В AutoLISP переменные могут быть установлены с помощью двух функций setq и set. Таким образом, все значения, заданные с помощью этих функций, будут являться переменными. Проведем небольшой эксперимент и создадим команду, где определим переменную. Команда будет в двух вариантах. В первом варианте команды мы зададим переменную var как локальную. Введем в командную строку: Код:
Теперь определим ту же команду, но переменную var оставим глобальной: Код:
При определении в функции переменных должно выполняться обязательное правило: переменные должны всегда задаваться как локальные, за исключением тех редких случаев, когда переменные могут потребоваться как глобальные. Но ты должен четко понимать, когда, где и зачем переменная может потребоваться как глобальная, и если этого понимания нет – тогда локализуй переменные. Возвращаясь к вышесказанному – если в функции присутствуют слова setq или set, значит в функции есть переменные, и они, за исключением редких случаев должны быть локализованы. Добавлю также, что локализовываться могут не только переменные, но и функции которые вложены в другие функции, – они так и называются – локальные функции. Думаю, синтаксис функций в общих словах я объяснил. И теперь исходя из изложенного проверь свой код: То, что ты выделил красным, это вызов некой функции Fasad_sup с кучей аргументов (параметров функции), и эта функция ранее не была определена! В начале ты определяешь команду c:Fasad_sup, а не функцию. И, забегая вперед, скажу: функция запускаемая внутри функции, которая носит с ней одно и то же имя, называется рекурсивной, и применяется в специфических случаях. Это явно не тот случай. Последний раз редактировалось Browning Zed, 31.03.2022 в 20:37. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
терминологическое уточнение
не активные - а у переменных есть области видимости. И для лиспа всего два варианта - локальная видимость в пределах функции или глобальная для всего кода лиспа. Причем чтобы создать переменную с глобальной видимостью - в лиспе достаточно просто забыть указать переменную в теле функции или ошибиться с написанием идентификатора переменной в коде. |
|||
![]() |
|
||||
Регистрация: 17.01.2014
Сообщений: 97
|
Цитата:
От себя также добавлю, что по теме "область видимости в AutoLISP" есть замечательная статья на сайте Алексея Кулика. |
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Browning Zed, спасибо, очень доходчиво.
----- добавлено через ~6 мин. ----- Цитата:
Насчет имен, у меня, вроде, разные везде. Или, это просто предупреждение Последний раз редактировалось Alxndr1697, 01.04.2022 в 07:48. |
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Переделал программу. Теперь причиной остановки указывает выражение (выделил красным), которое в программах, по отдельности работало нормально.
Да что в нем не так??? ![]() ![]() ![]() Код:
Последний раз редактировалось Alxndr1697, 03.04.2022 в 19:09. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Какое сообщение об ошибке?
Offtop: Сугубо ИМХО: код следует переработать полностью. Начиная с переименования функций и их локализации и документирования, заканчивая общим принципом. Могу, если хочется, снять видосик, почему этот код не подлежит отладке.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Текстового сообщения нет, просто выделение.
Цитата:
Вот, его-то, я никак не поймаю, видимо. Последний раз редактировалось Alxndr1697, 03.04.2022 в 20:23. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Alxndr1697, видосик записать не удалось - что-то не то у меня с виртуалкой. Так что текстом
![]() Прежде чем читать - все это личное мнение, никого ни к чему не обязывающее. Дисклеймер: будет много ссылок на мой сайтик. Представленный код невозможно протестировать. В принципе невозможно. Причина номер раз - это использование диалога (которого, естественно, у меня нет). Я понимаю, что можно покопаться по форуму и найти тот самый dcl. Но как-то подобное не комильфо - не проще ли создавать диалог "на лету"? Причина номер два - именования функций и переменных. Функция re_name (к примеру), судя по названию, должна там что-то переименовывать. А делает она совсем другое. Причина номер три - это видимость функций и переменных. Все внутренние функции объявлены как глобальные. Отличный шанс выстрелить себе в ногу ![]() Далее. Мое искреннее убеждение состоит в том, что любая (подчеркиваю - любая!), даже локальная, функция должна работать только с теми данными, которые в нее прилетели и не лезть во внешние переменные. Та же raz_fasad (кстати, по имени можно решить заранее - что оно делает?) у меня была бы переписана примерно так: Код:
Код:
Код:
Дальше - я бы постарался максимально отказаться от использования командных методов. Так, например Код:
Код:
Код:
Код:
На предмет переопределения глобального обработчика *error* я уже когда-то высказывался. Кстати, у тебя там не возвращаются обратно системные переменные. И метка окончания отмены не ставится, что может привести к неприятным последствиям. Ну и по поводу запроса точек и прочего ![]() Сорян, накидали работы. Пока заканчиваю.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
По поводу наименования функций - чтобы не запутаться, можно придерживаться псевдоиерархии:
Fasad_%Тип фасада%_Create - создание фасада Fasad_%Тип фасада%_Create_%Fun01% Fasad_%Тип фасада%_Create_%Fun02% - это подфункции создания отдельных частей фасада данного типа Fasad_%Тип фасада%_Create_%Fun03% и не надо их куда-то прятать, уже по идентификатору функции видно - где она должна вызываться. И что функция Fasad_%Тип фасада%_Create не может (не должна, точнее) вызываться внутри Fasad_%Тип фасада%_Create_%Fun01%. И данные передаются в эти подфункции через аргументы. И если под рукой тот же эксель - не ленитесь делать простейшие таблички копипастом: название функции, назначение аргументов, возвращаемое значение, примечание. В табличном виде гораздо проще воспринимать информацию, чем в простынях кода. |
|||
![]() |
![]() |
|
Опции темы | Поиск в этой теме |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
LISP. Вставка в таблицу поля, соотвествующего площади примитива | Profan | Готовые программы | 272 | 06.06.2021 23:12 |
Сейсмозащита и сейсмоизоляция существующих, построенных зд. | IANationalInformAgentstvo | Прочее. Архитектура и строительство | 216 | 20.01.2015 16:51 |
Мониторы LCD CRT | Разное | 94 | 17.06.2008 10:51 | |
ЮМОР 2006 =) | Perezz!! | Разное | 1122 | 04.01.2007 00:46 |