|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Передача параметров процедуре на LISP
Регистрация: 10.08.2009
Сообщений: 5
|
||
Просмотров: 10996
|
|
||||
Регистрация: 11.03.2009
Тюмень
Сообщений: 109
![]() |
Не силен в Тройниках и отводах, но если суть проблеммы такова:
есть набор стандартных деталей для каждой из которых существует рряд параметров и Автокад каждый раз запрашивает в коммандной строке все эти параметры по очереди (а их может быть много), то всё решается диалоговым окном "помнящим" пераметры последней или наиболее распостраненной детали каждого типа из набора. Если задача другая, то и решений может быть несколько в зависимости от типа задачи: забирать данные из Exel или Open Office calc, через временные файлы и проч. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
По сути параметры можно задать практически любым мыслимым способом - через файл, через COM (а там и ADO - то есть практически любая БД и мс-офис), виндовый реестр, при желании можно и с устройства снять (возможно придеться какой-нибудь COM драйверок написать). Так-же есть пара способов (стандартный и не очень) создания диалоговых окон - вобщем лисп могуч.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Регистрация: 10.08.2009
Сообщений: 5
|
Capiton
почти правильно - единственное, но, диалоговое окно уже реализовано - это отдельная программа работающая с базой оборудования. Пользователь выбирает в этой проге интересующее его оборудование которое он хочет добавить на чертеж. Моя задача как-то передать параметры для вычерчивания и запустить процедуру на LISP которая, основываясь на переданных параметрах, начертит соотв. деталь. Всем спасибо за ответы ![]() |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Есть три варианта:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 10.08.2009
Сообщений: 5
|
Дима_ проблема была в том, что я не знал можно ли передавать параметры в процедуры LISP извне акада. Сейчас все прояснилось.
Кулик Алексей aka kpblc вот-вот, правда недопонял чем отличаются пункты 2 и 3. Я планирую подключатся через позднее связывание к АвотоКАДу и запускать ЛИСПовскую ф-цию, которая считает переданные параметры из файла/реестра/буфера_обмена и вычертит по ним соотв. деталь. Второй вариант, я из проги запускаю ЛИСПовскую ф-цию и помере её запросов параметров автоматически подкидываю их (из своей программы). Второй вариант гораздо предпочтительнее так как не потребует изменений существующих ф-ций вычерчивания на Лиспе. Возможен ли он в принципе? В случае первого варианта ф-ции на лиспе прийдется переписать, чтоб они брали параметры не от пользователя, а, например, из буфера обмена. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
В п.2 фактически запускается лисп0функция. В п.3 никаких лисп-функций не запускается, и вся работа выполняется через соответствующие методы и свойства примитивов (и не только примитивов
![]() P.S. Цитата:
Цитата:
ИМХО: зачем использовать файловые операции или работу с реестром, когда можно попытаться обойтись без нее?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.03.2009
Тюмень
Сообщений: 109
![]() |
Есть еще способ. Он не совсем честный и возможно использовать его не всегда, но зато не надо лезть в СОМ. Данные, которые использует программа с диалогом часто бывают в файле легко и наглядно открываемом блокнотом. Посмотреть структуру - "нарисовать" своё диалоговое окно - написать простой LISP - всё готово. Не собираетесь распостранять получившуюся программу- Вы кристально чисты.
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Как я понял, диалог как раз реализован на "нормальном" языке типа C++ / C# / Vb.NET / Delphi etc, и посмотреть его структуру уже шансов маловато...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.03.2009
Тюмень
Сообщений: 109
![]() |
Часто программы написаные на C++ / C# / Vb.NET / Delphi и любых других языках хранят данные в отдельном легко просматриваемом файле (группе файлов), к которому и обращаются. Программисты не запихивают его внутрь, по разным причинам(может, чтобы пользователь мог легко редактировать или еще почему-то) Про такой файл я говорил.
|
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
И никто не сказал, что в LISP нет вообще никаких "процедур" - только функции.
![]() В том числе из файла, реестра, через память. С диалоговым окном или без. Вот буфер обмена - пожалуй наихудший вариант. |
|||
![]() |
|
||||
строю, ломаю Регистрация: 03.04.2008
Украина
Сообщений: 5,515
|
Цитата:
И вообще: архив в студию, тогда можно о чем-либо говорить... |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
ну допустим не только - например if, or, and - совсем не являются функциями - названиям им куча и специальные формы, и операторы и процедуры кто как переведет да и в зависимости от диалекта лиспа. Но по сути они никак не функции.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Это в других языках они операторы - в LISP'е только функции. Именно в этом принципиальное отличие этого языка от большинства других. Ну а как их переводят переводчики на суть не влияет.
|
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Оп оп оп? А нука - попробуйте написать (на лиспе разумеется), ну например, подобие функции if, причем даже с возможностью использовать внутри стандартную if - назовем например AR-if (Александр Ривлис) - и выложите код - а там посмотри что такое оригинальная if - функция или нет.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Ну, полностью от if избавиться не удалось, но в качестве "разминки":
Код:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
То vovka вся беда в твоем if что перед тем как дойдет дело до выполнения функции все ТРИ аргумента будут уже вычесленны, как впрочем и у любой функции - вначале вычисляються аргументы. Крыс верно написал - именно так она и реализованна на самом деле, с той лишь разницей что в функцию добален парсинг - что выполнять а что нет - посему это никак не функция. В and и or то же самое - операнды выполняются последавательно (а не вычисленны все до начала функции).
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
|||||||
Регистрация: 10.08.2009
Сообщений: 5
|
Цитата:
Цитата:
![]() И какие это ситуации? Цитата:
Цитата:
Цитата:
Цитата:
Под ф-цией понимаю процедуру которая возвращает значение, процедура соотв не возвращет ничего. ![]() |
||||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Ну я примерный код показал... SendCommand
Ну, например, работа с неактивным документом. По-моему, бывают проблемы, если окно AutoCAD невидимо. Или что-то такого типа (не проверял, точно не скажу). Цитата:
![]() Цитата:
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 21.07.2008
Луцьк
Сообщений: 179
|
Дима_, мой пример написан лишь для частного случая, чтобы продемонстрировать возможность написания функции аналогичной if. Более общий вариант написал Алексей (хотя лямбду можно и убрать).
Я не совсем понимаю причем здесь парсинг и как он влияет на определение функция/не функция. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Если ты уберешь лямбду функция не будет работать (будет но с ошибкой) - то есть если используеться специальная форма if то
Код:
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Где написано, что любая функция обрабатывает все аргументы до вызова функции? Честно говоря спор совершенно бессмысленный. Назвать можно как угодно, например, "функция с особенным поведением". Операторы не возвращают значений в отличие от (if) (or) (and) и т.д.
|
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Я про это и говорю - и штатными средствами автолиспа ее никак не создашь - в отличие от функций.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Штатными средствами Autolisp не только такие функции нельзя создать, но и многие другие - например, никакие функции с переменным числом аргументов (на ObjectARX - можно). Так что можно классифицировать функции на "встроенные" и "не встроенные". "Встроенные" могут иметь (и имеют) иную логику поведения.
|
||||
![]() |
|
||||
Регистрация: 20.05.2010
Сообщений: 26
|
Здравствуйте, уважаемые участники форума.
Вы, Дима_, вероятно, лукавите. Язык LISP (как «родовое» понятие) владеет мощным средством, которое называется МАКРОСЫ (macros). Этот механизм позволяет «на лету» определять новые (или переопределять существующие) конструкции языка - по сути дела, создавать собственные <специализированные> языки. (В языках с "операторами" этого и в помине нет.) Особенность макро (в отличие от функции) в том, что его аргументы при вызове не вычисляются. Вторая важная особенность в том, что вызов макро выполняется в два этапа: макрорасширение, затем вычисление. Так что в «обычном» LISPе определение (if) выглядит <например> так (из книги Хювёнен-Сеппянен "Мир Лиспа" т.1): Код:
Код:
|
|||
![]() |
|
||||
Регистрация: 21.07.2008
Луцьк
Сообщений: 179
|
Цитата:
а теперь о lambd-е и премере Алексея Кулика: Код:
|
|||
![]() |
|
||||
Регистрация: 06.06.2016
Сообщений: 327
|
Есть функция:
Код:
----- добавлено через ~2 мин. ----- Что я должен написать в командной строке, чтобы добавить "My_atribut=100500"? Код:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Кондратий Тихонович, опять двадцать пять... Функция и команда - далеко не одно и то же. Снова: разница между определениями блока и вхождениями блока все еще покрыта завесой страшной тайны?
Из конца в конец, ты же заявлял, что программируешь больше 30 лет - ну так разберись в коде, это же для тебя несложно.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 06.06.2016
Сообщений: 327
|
Цитата:
Я никогда не говорил, что не понимаю разницы между определением блока и его вхождениями на чертеже. Цитата:
Если по теме сказать нечего - лучше промолчите ----- добавлено через 58 сек. ----- Лучше б рассказали, как передавать в команду (или функцию) параметры. А именно, имя атрибута и значения этого атрибута |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Цитата:
будет работать, но если изменить команду на функцию и добавить аргументы. Это первые главы любой книги по лиспу, даже можно сказать - первые страницы, так как относится к основным базовым понятиям лиспа. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Кондратий Тихонович, добро пожаловать в тему "Обучите лиспу на примере" и в публикации.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
"C:add$", объявленная без аргументов и "add$" - совершенно разные вещи? Префикс "C:" означает, что это особый вид функции - команда. Её можно вызвать с клавиатуры, набрав add$. Но ей нельзя передать аргументы - ни с клавиатуры, ни программно. Но может быть функция, объявленная как Код:
Вот тогда можно вызвать (add$ "Кондратий" "Самый гениальный программист") Последний раз редактировалось ShaggyDoc, 28.08.2019 в 10:22. Причина: Убрал теги bold из кода |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
|
|||
![]() |
|
||||
|
||||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Цитата:
и увидите, что ваше команда командой не является: без аргумента ругается - "ошибка: слишком мало аргументов". А если указать с аргументом - "Неизвестная команда.." |
|||
![]() |
|
||||
я же написал технически и потом зачем мне без скобок запускать? я привёл пример команды и пример её нестандартного запуска с аргументом, разве нет? или определённая выше команда уже и не команда?
|
||||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Цитата:
Команда должна запускаться без скобок, внутри себя может запрашивать дополнительные сведения, при этом пробелы эквиваленты вводу. Т.е. любой аргумент в комстроке будет считаться следующей командой, если запущенная команда сама не заберет данные из комстроки. А если она забирает данные - то тогда не аргументы, а локальные/глобальные переменные будут при необходимости. |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
|
|||
![]() |
|
||||
Чтобы это работало и как реальная команда и как функция, её нужно создавать при помощи ObjectARX или AutoCAD .NET API.
__________________
Сообщество программистов Autodesk в СНГ - техническая поддержка |
||||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
|
|||
![]() |
|
||||
Цитата:
Смысл в том что в lisp нельзя сделать функцию с переменным числом аргументов, а в ObjectARX/AutoCAD .NET API можно.
__________________
Сообщество программистов Autodesk в СНГ - техническая поддержка |
||||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Цитата:
|
|||
![]() |
|
||||
Это лишь развлечение. Попробуй создать на lisp функцию C:XXX которую можно было бы использовать и как команду (т.е. с нулевым числом аргументов) и как функцию с числом аргументов > 0.
__________________
Сообщество программистов Autodesk в СНГ - техническая поддержка |
||||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
даже пытаться не буду - хотя бы в силу того, что на .Net пишу - практики на лиспе мало) Да и смысла не вижу - команда и функция - это две разные вещи, каждая под свою область применения. Вызывать из комстроки функцию можно, конечно - но с точки зрения удобства в процессе постоянной работы как то очень сомнительно, имхо.
|
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
SolidWorks : Обновление таблиц параметров виртуальных деталей | MAKSCHUK | SolidWorks | 10 | 15.02.2013 13:53 |
LISP & VBA. Передача данных. | Кулик Алексей aka kpblc | Готовые программы | 8 | 29.06.2009 22:16 |
Запуск Lisp команды в новом документе | BlackHarp | LISP | 1 | 26.03.2009 23:06 |
загрузка DOS прог через LISP | Gaa | LISP | 15 | 12.08.2005 19:19 |