|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Неприятные особенности использования запуска команд макросами кнопок
Регистрация: 22.01.2010
Сообщений: 311
|
||
Просмотров: 7992
|
|
||||
Регистрация: 22.01.2010
Сообщений: 311
|
Не думаю, что это хорошая идея.
Описанный случай из практики. Заказчик попросил некоторую функцию. Я ему её предоставил. Примерно через месяц потребовалась ещё одна, похожая на первую, но несколько видоизменённая. Проще было её реализовать на базе первой. Разумеется, все имена внутренних функций остались прежними, только с другим наполнением. А если прошел год, два, а не месяц ? Всё ведь не упомнишь... У любого программиста есть сотни функций, кочующих из программы в программу иногда без изменений, иногда с незначительными правками. Предлагаете всем им давать уникальные имена ? |
|||
![]() |
|
||||
строю, ломаю Регистрация: 03.04.2008
Украина
Сообщений: 5,515
|
Цитата:
вот поэтому |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Регистрация: 22.01.2010
Сообщений: 311
|
VVA и Li6-D,
Локальные функции это, конечно, хорошо. Но как быть с уже написанной уймой программ без этих самых локальных функций ? Повторю вопрос: есть ли подводные камни у способа вызова команды без проверки её предварительной загрузки, т.е. ^C^C(load "C:\\test1.lsp");test1; ? |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Теоретически есть - через atom-family (кажется, так) проверяешь существующие имена функций и переменных. Но намного проще и быстрее писать нормальный код, с использованием нормальных локальных переменных и функций.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 22.01.2010
Сообщений: 311
|
Конечно так лучше, но ведь на момент написания твой собственный код кажется тебе самым лучшим, а то, что он не такой уж и нормальный, выясняется уже потом)))
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Цитата:
![]() ![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 22.01.2010
Сообщений: 311
|
Цитата:
обычный продвинутый инженер-проектировщик обращается к кому-нибудь с просьбой написать программу, получает её, самостоятельно вешает её на кнопку и наслаждается жизнью. Через некоторое время обращается к другому программисту с очередным заданием, проделывает то же самое и наслаждается до тех пор, пока не нарвётся на описанную выше хрень. А вероятность того, что в двух программах разных авторов окажутся НЕ локальные функции с одинаковыми именами, довольно высока. Например, вывод в Excel (toexcel), создания диалога "на лету" (make-dialog), перевода углов в радианы (dtor) и т.п. и т.п. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Цитата:
_kpblc-datas-export-to-excel fun_make-dlg, и ее в локальные _kpblc-conv-degrees-to-radians или _kpblc-angle-convert. Попробуй найти еще подобные имена. Еще раз говорю - внешняя команда, которую и вызывает пользователь, может иметь любое имя. Все остальное - потроха, про само существование которых пользователь зать не должен.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 22.01.2010
Сообщений: 311
|
Алексей,
а причем тут твои функции ? Не все же ими пользуются. Рискну даже предположить, что не все заглядывают на этот форум, хотя это и трудно себе представить)))). Я говорю про двух разных программистов, программы которых окажутся у одного пользователя, который действительно не должен ничего знать про внутренности. И вот в этих двух программах вполне могут оказаться одноименные функции. И для этого самого пользователя вызов команды ^C^C(load "C:\\test1.lsp");test1; - единственный надежный выход из положения. |
|||
![]() |
|
||||
Регистрация: 03.05.2009
Сообщений: 112
|
Если после (load "C:\\test1.lsp") ввести (load "C:\\test2.lsp"), то все глобальные переменные (включая функции), определенные в файле C:\test1.lsp будут заменены новыми из C:\test2.lsp при совпадении имен.
Тут ничего не поделаешь. Культурный программист постарается не использовать глобальные переменные-функции или даст им уникальные имена Например, Алексей добавляет префикс _kpblc. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
swkx, а я говорил про принципы именования функций и ни про что иное. Формируешь свой принцип и строго ему следуешь. Вот и все...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.10.2010
Сообщений: 979
|
А кто-то мешает прямо сейчас переделать пару кодов?
![]()
__________________
(/= RegDate StartReadDate) |
|||
![]() |
|
||||
Помогаю, кому делать нечего. Регистрация: 27.03.2009
Русская деревня
Сообщений: 394
|
swhx, Загружаю Lisp-ы именно так, как ты предлагаешь (без IF) начиная где-то с 1997года. Никаких проблем не возникало, хотя теоретически их можно придумать. До 1997 года работал на машине АТ286 с "куриными мозгами" (хотя тогда это было круто). Там даже приходилось делать оверлеи и подгружать их. А современная машина несколько десятков килобайт lisp-a проглатывает не жуя. При этом не чихает и не кашляет. ИМХО.
PS: С точки зрения профессионала это конечно тупо, но я Lisp-любитель, кустарь-одиночка, и все себе заранее прощаю. Последний раз редактировалось E-degtyarev, 06.06.2011 в 09:05. |
|||
![]() |
|
||||
Регистрация: 22.01.2010
Сообщений: 311
|
Сейчас уже никто и ничто не мешает. А описание проблемы я увидел в почте на мобильном, причины и способ решения стали понятны сразу, но Автокада под руками не было, вот и пришлось посоветовать самый простой выход.
E-degtyarev, я это и хотел услышать )) Кстати, мне тоже приходилось использовать собственные лиспы на 286-м компе и 9-м автокаде. Выручала только функция (gc). |
|||
![]() |
|
||||
строю, ломаю Регистрация: 03.04.2008
Украина
Сообщений: 5,515
|
swkx, у вас все лиспы находятся в корне диска с:? а если я захочу установить на другой диск? На каком-нибудь 10 уровне вглубь... как будет меню выглядеть?
как-то сделал функцию загрузки и запуска команды: Код:
такой метод просто делает код меню вдвое меньше... (хм... еще кнопки можно по диску разбросать и совсем полный абзац будет...) Для себя уяснил две вещи... в меню только команды и опции (это позволит набирать с команду клавиатуры сразу после загрузки меню), все иконки в библиотеке (так их не надо искать)... |
|||
![]() |
|
||||
Цитата:
![]()
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: |
||||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Более 20 лет использую загрузку безо всяких if. Это гарантирует, что всегда выполняется именно нужная программа. Никаких торомозов тут нет, даже ещё в AutoCAD R10 (не 2010) даже загрузка очень большой библиотеки происходила очень быстро. Это дает и дополнительное преимущество. Файл всегда можно безболезненно заменить, всегда будет действующая версия.
Более того, много лет использовал для всех программ одно имя команды. В последние годы использую такую методику: 1. Конечным функциям ("командам") присваиваю "цифровые" имена. Команд тысячи, напридумывать для них человечьи имена невозможно, да их и не запомнишь. А цифры человек запоминает очень легко. 2. В CUI команда записана примерно так: Код:
3. Определение команды записано в MNL: Код:
Там, где требуется загрузка кода из файла команда имеет вид наподобие: Код:
|
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Откровенно говоря спорный метод - а тогда как у Вас происходит загрузка програмных подфункций (общие-то наверняка есть), они либо в каждом файле продублированны должны быть (уверен на 100% - у Вас не так), либо загружаться при каждом вызове из внешнего файла (а в автолиспе с этим проблеммы - так как пути надо "жестко" прописывать - то есть инсталятору добавляется "ненужной" работы - изменить пути в каждом файле - ну либо инициализировать некую переменную где эти пути прописанны (способ проще но с надежностью потенциальные проблемы), или заставлять грузить "жестко" из какого-нибудь %appdata%\myprogram - тоже не есть гуд т.к. если придеться .net подмешивать (у меня к "сожалению" его все больше и больше) - проблемы с разными версиями (на одном компьютере) возникнут), либо сразу "при старте" должны быть уже загруженны - тогда вобще смысла никакого нет - проще сразу и все c:xxx тоже загрузить.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
конструктор машиностроитель Регистрация: 14.05.2007
Новосибирск
Сообщений: 893
|
Не рискнул создавать тему, может здесь разъясните?
Встречаю различные способы авто-загрузки lisp файлов - ^C^C(if (null C:<команда>)(load "<файл>"));<команда>; ^C^C:P(if (eq C:<команда>)(load "<файл>"));<команда>; ^C^C(if (not C:<команда>)(load "<файл>"));<команда>; ^C^C(load "<файл>"));<команда>; В чем разница? |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
Никакие пути не надо жестко прописывать - все вычисляется на лету, относительно папки с установленной системой. Инсталлятор, разумеется, необходим - чтобы не делать никаких ручных настроек. Часть файлов устанавливается в %Program Files%, осовная - в %Local Application Data%. Все настройки хранятся в INI-файле, расположение которого системе известно. Там может быть записано что угодно, в том числе пути к различным компонентам системы. Могут использоваться и разные версии AutoCAD попеременно. Для каждой версии часть файлов является специфичными, загружаются из своих папок. В настройки самого AutoCAD никаких изменений не вносится, никакие его файлы не затрагиваются. Только добавляется свой профиль - ради включения дополнительных папок в %ACAD%. Файл acaddoc.lsp генерируется на лету из специального шаблона. В шаблоне имеется масса "плейсхолдеров", в которые подставляются значения различных переменных. В результате во время работы будут записаны абсолютные пути. После завершения работы acaddoc.lsp уничтожается и никому не мешает. Цитата:
Цитата:
Хотя уверен, что вопрос и с версиями библиотек .NET можно решить. Если подходить с правильной стороны. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
15000 команд c:xxx? - тут что-то не так с организацией команд - подумайте сами - слов в русском языке меньше, команды типа c:xxx предназначенны для непосредсвенного исполнения пользователем, столько нету нигде ни в автокаде, ни в операционных системах, ни в msoffice со всеми возможными надстройками.
p.s. из кода: Код:
p.p.s - откровенно говоря мне с большим трудом верится, что у Вас все 15000 функций абсолютно "разношерстные" - сильно-ли отличается из Вашего примера "ru_pro_arrange_block" от какого-нибудь "ru_pro_XXX_block"? не повторяется-ли там 90% кода - если так то может логичнее заменить на функцию с аргуметном, а не плодить "клонов" - хотя это только мои предположения.
__________________
Когда в руках молоток все вокруг кажется гвоздями. Последний раз редактировалось Дима_, 16.06.2011 в 16:09. |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
1. Да они появились исторически, когда AutoCAD обладал минимальным интерфейсом и даже не всегда мышка была. Тогда чаще всего команды вводили с клавиатуры. Времена были такие, мерзопакостные. Вот и сделали возможность программистам создавать "команды". Иногда действительно проще команду ввести с клавиатуры, чем лазить по многочисленным элементам интерфейса. Но имя должно быть простым и запоминающимся. Не "КРАНШАРОВЫЙБАБОЧКАШТУЦЕР-РЕЗЬБА_20" или наподобие. Вот и ввел цифровые имена. Легко запоминаются (те, которые надо), труднее ошибиться. И то только для тех, кому удобнее запомнить номер и вводить с клавиатуры. В общем-то удобно. 2. Последнюю выполненную "команду" можно повторить нажатием Enter. Тоже надо. Раньше все команды имели одно и то же имя - ради повтора. Оно было и невидимым (все равно не набирать), и в виде RU. Потом, как написал выше, сделал цифровые имена. 15000 - это не имен команд, и не пунктов в меню. Это полезных конечных действий. Да и то это я когда-то насчитал, сбился и плюнул. Теперь намного больше. Разумеется, нет никаких 15000 файлов. На сей момент их ровно 299. Это таких, в которых что-то индивидуальное. А большинство действий реализуется вызовом библиотечных функций с аргументами. Самые ходовые и оформлены в виде C:XXX. Я приводил пример: Код:
А вот уже в этом меню, в конечных листочках дерева, и сидят выховы функций с аргументами. Пункт такого меню выглядит наподобие Код:
Код:
Например функция ru-3d-pipe-draw-any рисует "что угодно", имеющее начало и конец. В данном случае ей, с помощью функции quote передается имя функции ru-3d-pipe-2-flange-draw-revolved, рисующей в 3D фланцы приварные встык. А если вызвать Код:
Впрочем, мы отвлеклись от темы ветки про "макросами кнопок" ![]() |
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
В русской версии AutoCAD 2010 SP1 32-bit файл Acad.PGP содержит ошибки. | hwd | Баги и пожелания в Autodesk | 21 | 21.04.2010 20:27 |
Программное управление макросами кнопок | Supermax | Программирование | 2 | 24.12.2007 14:07 |