Неприятные особенности использования запуска команд макросами кнопок
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Неприятные особенности использования запуска команд макросами кнопок

Неприятные особенности использования запуска команд макросами кнопок

Ответ
Поиск в этой теме
Непрочитано 05.06.2011, 20:08 #1
Неприятные особенности использования запуска команд макросами кнопок
swkx
 
Регистрация: 22.01.2010
Сообщений: 311

Общепринятый способ запуска команд кнопкой меню ^C^C(if (null C:<команда>)(load "<файл>"));<команда>;
в том числе и упомянутый VVA в статье "Как использовать лисп, опубликованный на форуме", иногда не совсем корректен. Ошибка возникает в случае, когда в тексте файлов двух вызываемых программ есть функции, имеющие одинаковое название, но выполняющие различные действия.

Пример. Имеем два файла test1.lsp и test2.lsp

Код:
[Выделить все]
 (defun c:test1 ()
	(func-alert)
)

(defun func-alert ()
	(alert "Test 1")
)

Код:
[Выделить все]
 (defun c:test2 ()
	(func-alert)
)

(defun func-alert ()
	(alert "Test 2")
)
Порядок действий в ком. строке Автокаде:
1. (load "C:\\test1.lsp")
2. test1 - работает правильно
3. (load "C:\\test2.lsp")
4. test2 - работает правильно
А дальше нюансики. Т.к. test1 уже загружена, просто выполняем её:
5. test1 - Ошибка ! Видим на экране окшко "Test 2", т.е. отработала (func-alert) из test2.

Вывод: создав две кнопки с макросами
^C^C(if (null C:test1)(load "C:\\test1.lsp"));test1;
и
^C^C(if (null C:test2)(load "C:\\test2.lsp"));test2;
и во всех похожих случаях имеем шанс нарваться на неприятности, которые усугубляются тем, что проявляются не всегда, а только при частом поочередном использовании кнопок в одном сеансе работы.

Вопрос: не лучше ли при современных объемах ОЗУ всегда использовать в качестве кода макроса конструкцию типа ^C^C(load "C:\\test1.lsp");test1; ?
Есть ли противопоказания у такого подхода ?
Просмотров: 7992
 
Непрочитано 05.06.2011, 20:30
#2
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


просто не используйте одинаковые имена функций...
при современных объемах ОЗУ лучше подгружать все скопом в файле mnl так ваше меню станет намного легче...
gomer вне форума  
 
Автор темы   Непрочитано 05.06.2011, 20:41
#3
swkx


 
Регистрация: 22.01.2010
Сообщений: 311


Цитата:
Сообщение от gomer Посмотреть сообщение
просто не используйте одинаковые имена функций...
Не думаю, что это хорошая идея.
Описанный случай из практики. Заказчик попросил некоторую функцию. Я ему её предоставил. Примерно через месяц потребовалась ещё одна, похожая на первую, но несколько видоизменённая. Проще было её реализовать на базе первой. Разумеется, все имена внутренних функций остались прежними, только с другим наполнением.

А если прошел год, два, а не месяц ? Всё ведь не упомнишь...

У любого программиста есть сотни функций, кочующих из программы в программу иногда без изменений, иногда с незначительными правками.
Предлагаете всем им давать уникальные имена ?
swkx вне форума  
 
Непрочитано 05.06.2011, 21:02
#4
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от swkx Посмотреть сообщение
Разумеется, все имена внутренних функций остались прежними, только с другим наполнением.
ключевое слово внутренний (локальный) по коду это не видно... при разработке функции необходимо по мере возможности учитывать возможность апдейта, универсальность...

Цитата:
Сообщение от swkx Посмотреть сообщение
А если прошел год, два, а не месяц ? Всё ведь не упомнишь...
вот поэтому

Цитата:
Сообщение от gomer Посмотреть сообщение
просто не используйте одинаковые имена функций...
gomer вне форума  
 
Непрочитано 05.06.2011, 21:04
#5
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от swkx Посмотреть сообщение
У любого программиста есть сотни функций, кочующих из программы в программу иногда без изменений, иногда с незначительными правками
Это называется библиотека функций и имена у низкоуровненных функций не меняются. Объемы современны ОЗУ позволяют сильно не задумываться об оптимизации кода. Если не имеешь своей библиотеки, то можно функции объявлять локальными (т.е внутри функций). В таком случае время их жизни - время работы самой верхней ф-ции.
Код:
[Выделить все]
 
(defun c:test1 ()
    (defun func-alert ()
	    (alert "Test 1")
		  )
(func-alert)
 )

(defun c:test2 ()
    (defun func-alert ()
	    (alert "Test 2")
		  )
(func-alert)
 )
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 05.06.2011, 21:18
#6
Li6-D


 
Регистрация: 03.05.2009
Сообщений: 112


И не забудь имена низкоуровневых функций указать в списке локальных переменных функции высокого уровня, иначе они станут глобальными
Li6-D вне форума  
 
Автор темы   Непрочитано 05.06.2011, 21:30
#7
swkx


 
Регистрация: 22.01.2010
Сообщений: 311


VVA и Li6-D,

Локальные функции это, конечно, хорошо. Но как быть с уже написанной уймой программ без этих самых локальных функций ?

Повторю вопрос: есть ли подводные камни у способа вызова команды без проверки её предварительной загрузки, т.е.
^C^C(load "C:\\test1.lsp");test1; ?
swkx вне форума  
 
Непрочитано 05.06.2011, 21:35
#8
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


Теоретически есть - через atom-family (кажется, так) проверяешь существующие имена функций и переменных. Но намного проще и быстрее писать нормальный код, с использованием нормальных локальных переменных и функций.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 05.06.2011, 21:48
#9
swkx


 
Регистрация: 22.01.2010
Сообщений: 311


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Но намного проще и быстрее писать нормальный код, с использованием нормальных локальных переменных и функций.
Конечно так лучше, но ведь на момент написания твой собственный код кажется тебе самым лучшим, а то, что он не такой уж и нормальный, выясняется уже потом)))
swkx вне форума  
 
Непрочитано 05.06.2011, 22:14
#10
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


Цитата:
Сообщение от swkx Посмотреть сообщение
Конечно так лучше, но ведь на момент написания твой собственный код кажется тебе самым лучшим, а то, что он не такой уж и нормальный, выясняется уже потом)))
Достаточно просто думать "а как я буду с ним разбираться через полгода-год" "САПР на баз AUtoCAD - как это делается". Настоятельно рекомендую. Дополнительно: http://autolisp.ru/2009/09/12/code-formatting/
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 05.06.2011, 22:45
#11
swkx


 
Регистрация: 22.01.2010
Сообщений: 311


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Достаточно просто думать "а как я буду с ним разбираться через полгода-год"
Со своим кодом разобраться всегда можно, но ведь вполне возможна и следующая вполне типичная ситуация:
обычный продвинутый инженер-проектировщик обращается к кому-нибудь с просьбой написать программу, получает её, самостоятельно вешает её на кнопку и наслаждается жизнью. Через некоторое время обращается к другому программисту с очередным заданием, проделывает то же самое и наслаждается до тех пор, пока не нарвётся на описанную выше хрень.
А вероятность того, что в двух программах разных авторов окажутся НЕ локальные функции с одинаковыми именами, довольно высока. Например, вывод в Excel (toexcel), создания диалога "на лету" (make-dialog), перевода углов в радианы (dtor) и т.п. и т.п.
swkx вне форума  
 
Непрочитано 05.06.2011, 22:57
#12
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


Цитата:
Сообщение от swkx Посмотреть сообщение
А вероятность того, что в двух программах разных авторов окажутся НЕ локальные функции с одинаковыми именами, довольно высока
Зависит от автора
Цитата:
Сообщение от swkx Посмотреть сообщение
вывод в Excel
_kpblc-datas-export-to-excel
Цитата:
Сообщение от swkx Посмотреть сообщение
создания диалога "на лету"
fun_make-dlg, и ее в локальные
Цитата:
Сообщение от swkx Посмотреть сообщение
перевода углов в радианы
_kpblc-conv-degrees-to-radians или _kpblc-angle-convert. Попробуй найти еще подобные имена.
Еще раз говорю - внешняя команда, которую и вызывает пользователь, может иметь любое имя. Все остальное - потроха, про само существование которых пользователь зать не должен.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 05.06.2011, 23:29
#13
swkx


 
Регистрация: 22.01.2010
Сообщений: 311


Алексей,

а причем тут твои функции ? Не все же ими пользуются. Рискну даже предположить, что не все заглядывают на этот форум, хотя это и трудно себе представить)))). Я говорю про двух разных программистов, программы которых окажутся у одного пользователя, который действительно не должен ничего знать про внутренности. И вот в этих двух программах вполне могут оказаться одноименные функции.
И для этого самого пользователя вызов команды ^C^C(load "C:\\test1.lsp");test1; - единственный надежный выход из положения.
swkx вне форума  
 
Непрочитано 06.06.2011, 00:01
#14
Li6-D


 
Регистрация: 03.05.2009
Сообщений: 112


Если после (load "C:\\test1.lsp") ввести (load "C:\\test2.lsp"), то все глобальные переменные (включая функции), определенные в файле C:\test1.lsp будут заменены новыми из C:\test2.lsp при совпадении имен.
Тут ничего не поделаешь. Культурный программист постарается не использовать
глобальные переменные-функции или даст им уникальные имена
Например, Алексей добавляет префикс _kpblc.
Li6-D вне форума  
 
Непрочитано 06.06.2011, 00:17
#15
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


swkx, а я говорил про принципы именования функций и ни про что иное. Формируешь свой принцип и строго ему следуешь. Вот и все...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 06.06.2011, 06:52
#16
swkx


 
Регистрация: 22.01.2010
Сообщений: 311


Li6-D и kpblc,

вы правы, до меня сразу не дошло, о чем говорил Алексей.
Однако это принципы, которыми нужно руководствоваться при написании будущих программ. Учту.
Хотя изначально речь шла о выходе из положения при уже свершившемся факте.
swkx вне форума  
 
Непрочитано 06.06.2011, 08:25
#17
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 979


А кто-то мешает прямо сейчас переделать пару кодов? Ну или сделать примерно так, как описано в http://autolisp.ru/2009/10/21/lisp-overloading/ ?
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 06.06.2011, 08:58
#18
E-degtyarev

Помогаю, кому делать нечего.
 
Регистрация: 27.03.2009
Русская деревня
Сообщений: 394


swhx, Загружаю Lisp-ы именно так, как ты предлагаешь (без IF) начиная где-то с 1997года. Никаких проблем не возникало, хотя теоретически их можно придумать. До 1997 года работал на машине АТ286 с "куриными мозгами" (хотя тогда это было круто). Там даже приходилось делать оверлеи и подгружать их. А современная машина несколько десятков килобайт lisp-a проглатывает не жуя. При этом не чихает и не кашляет. ИМХО.

PS: С точки зрения профессионала это конечно тупо, но я Lisp-любитель, кустарь-одиночка, и все себе заранее прощаю.

Последний раз редактировалось E-degtyarev, 06.06.2011 в 09:05.
E-degtyarev вне форума  
 
Автор темы   Непрочитано 06.06.2011, 09:20
#19
swkx


 
Регистрация: 22.01.2010
Сообщений: 311


Цитата:
Сообщение от Лиспер Посмотреть сообщение
А кто-то мешает прямо сейчас переделать пару кодов?
Сейчас уже никто и ничто не мешает. А описание проблемы я увидел в почте на мобильном, причины и способ решения стали понятны сразу, но Автокада под руками не было, вот и пришлось посоветовать самый простой выход.

E-degtyarev,
я это и хотел услышать ))
Кстати, мне тоже приходилось использовать собственные лиспы на 286-м компе и 9-м автокаде. Выручала только функция (gc).
swkx вне форума  
 
Непрочитано 06.06.2011, 15:50
#20
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


swkx, у вас все лиспы находятся в корне диска с:? а если я захочу установить на другой диск? На каком-нибудь 10 уровне вглубь... как будет меню выглядеть?
как-то сделал функцию загрузки и запуска команды:
Код:
[Выделить все]
 (defun cdl-run (cmd fil / tmp)
;;; функция загруски и запуска команд
;;; (cdl-run 'ALIST "ALIST.LSP")
  (if (not (boundp (read (setq tmp (strcat "c:" (vl-princ-to-string cmd))))))
	  (progn (if *cdl_nomute* (prompt "\nЗагрузка..."))(load (findfile fil)))
  )
  (eval (read (strcat "(" tmp ")")))
)
вроде все хорошо... но когда изменяешь код программы, то естественно он не подгружается заново... но с другой стороны каждый раз грузить одно и тоже - не рационально... хотя бы чисто теоретически...
такой метод просто делает код меню вдвое меньше... (хм... еще кнопки можно по диску разбросать и совсем полный абзац будет...)
Для себя уяснил две вещи... в меню только команды и опции (это позволит набирать с команду клавиатуры сразу после загрузки меню), все иконки в библиотеке (так их не надо искать)...
gomer вне форума  
 
Автор темы   Непрочитано 06.06.2011, 16:13
#21
swkx


 
Регистрация: 22.01.2010
Сообщений: 311


Я пример на ходу лепил, только чтобы суть пояснить, поэтому для простоты и нацарапал C:\\test1.lsp
swkx вне форума  
 
Непрочитано 06.06.2011, 21:10
#22
Vov.Ka


 
Регистрация: 21.07.2008
Луцьк
Сообщений: 179


компили в separate namespace vlx c экспортом только заглавной функции
Vov.Ka вне форума  
 
Непрочитано 15.06.2011, 23:07
#23
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Dmitrij_Kulikovs Посмотреть сообщение
С вами полностью согласен. Уже ведь 21 век, а мы все используем старые макросы.
Обновите дату модификации - они сразу станут как новые (современные)
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 16.06.2011, 05:44
#24
ShaggyDoc

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 команда записана примерно так:

Код:
[Выделить все]
<Macro type="Any">
  <Revision MajorVersion="16" MinorVersion="2" UserVersion="1" /> 
  <ModifiedRev MajorVersion="17" MinorVersion="1" UserVersion="1" /> 
  <Name xlate="true" UID="XLS_0003">XML: 3D-Трубопроводы 4301</Name> 
  <Command>^C^C^P4301</Command> 
  <HelpString xlate="true" UID="XLS_4113">3D: Прямые и гнутые участки трубопроводов</HelpString> 
  <SmallImage Name="RU_XML_3D_PIPE_LINE_16.BMP" /> 
  <LargeImage Name="RU_XML_3D_PIPE_LINE_16.BMP" /> 
</Macro>
Здесь вызывается команда с именем 4301.

3. Определение команды записано в MNL:

Код:
[Выделить все]
 (defun C:4301 ()
  (ru-xml-pop-mnu  "3d/ru_3d_pipe_lines"  "Трассы трубопроводов")
  (princ)
)
Как видим, суть команды заключается в выполнении библиотечной функции с аргументами.

Там, где требуется загрузка кода из файла команда имеет вид наподобие:

Код:
[Выделить все]
 (defun C:0911 ()
  (ru-app-load "profi/ru_pro_arrange_blocks")
  (princ)
)
Обратите внимание - нет никакого вызова "исполнительной" функции. Он выполняется внутри загруженного файла.
ShaggyDoc вне форума  
 
Непрочитано 16.06.2011, 10:28
#25
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Обратите внимание - нет никакого вызова "исполнительной" функции. Он выполняется внутри загруженного файла.
Откровенно говоря спорный метод - а тогда как у Вас происходит загрузка програмных подфункций (общие-то наверняка есть), они либо в каждом файле продублированны должны быть (уверен на 100% - у Вас не так), либо загружаться при каждом вызове из внешнего файла (а в автолиспе с этим проблеммы - так как пути надо "жестко" прописывать - то есть инсталятору добавляется "ненужной" работы - изменить пути в каждом файле - ну либо инициализировать некую переменную где эти пути прописанны (способ проще но с надежностью потенциальные проблемы), или заставлять грузить "жестко" из какого-нибудь %appdata%\myprogram - тоже не есть гуд т.к. если придеться .net подмешивать (у меня к "сожалению" его все больше и больше) - проблемы с разными версиями (на одном компьютере) возникнут), либо сразу "при старте" должны быть уже загруженны - тогда вобще смысла никакого нет - проще сразу и все c:xxx тоже загрузить.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 16.06.2011, 13:39
#26
Jonas

конструктор машиностроитель
 
Регистрация: 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 "<файл>"));<команда>;

В чем разница?
Jonas вне форума  
 
Непрочитано 16.06.2011, 14:08
#27
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Первые 3 ничем - так сказать богатство языка, последний загрузка без проверки загружен-ли уже лисп.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 16.06.2011, 15:06
#28
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
а тогда как у Вас происходит загрузка програмных подфункций (общие-то наверняка есть), они либо в каждом файле продублированны должны быть (уверен на 100% - у Вас не так), либо загружаться при каждом вызове из внешнего файла (а в автолиспе с этим проблеммы - так как пути надо "жестко" прописывать - то есть инсталятору добавляется "ненужной" работы - изменить пути в каждом файле - ну либо инициализировать некую переменную где эти пути прописанны
Все эти "программные подфункции" находятся в файле библиотеки функций. Он постоянно загружается автоматически при работе в определенном профиле - через acaddoc.lsp, т.е. при открытии любого DWG.

Никакие пути не надо жестко прописывать - все вычисляется на лету, относительно папки с установленной системой. Инсталлятор, разумеется, необходим - чтобы не делать никаких ручных настроек. Часть файлов устанавливается в %Program Files%, осовная - в %Local Application Data%. Все настройки хранятся в INI-файле, расположение которого системе известно. Там может быть записано что угодно, в том числе пути к различным компонентам системы.

Могут использоваться и разные версии AutoCAD попеременно. Для каждой версии часть файлов является специфичными, загружаются из своих папок.

В настройки самого AutoCAD никаких изменений не вносится, никакие его файлы не затрагиваются. Только добавляется свой профиль - ради включения дополнительных папок в %ACAD%.

Файл acaddoc.lsp генерируется на лету из специального шаблона. В шаблоне имеется масса "плейсхолдеров", в которые подставляются значения различных переменных. В результате во время работы будут записаны абсолютные пути. После завершения работы acaddoc.lsp уничтожается и никому не мешает.
Цитата:
проще сразу и все c:xxx тоже загрузить.
А их примерно 15000. Зачем их грузить? Они определены в MNL-файлах, которые сами и загружаются при подгрузке соответствующего "фрагментарного" меню. А таких меню сейчас 11 штук (по темам).

Цитата:
если придеться .net подмешивать (у меня к "сожалению" его все больше и больше) - проблемы с разными версиями (на одном компьютере) возникнут
"Проблемы индейцев шерифа не волнуют". Мне до сих пор ни разу не пришлось столкнуться с чем-нибудь, требующим именно .NET. У меня нормальная, обычная, ориентация. Во всех смыслах. Я даже от ARX отказался, когда он стал привязываться к определенным версиям AutoCAD и компилятора VC.

Хотя уверен, что вопрос и с версиями библиотек .NET можно решить. Если подходить с правильной стороны.
ShaggyDoc вне форума  
 
Непрочитано 16.06.2011, 15:36
#29
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
А их примерно 15000
15000 команд c:xxx? - тут что-то не так с организацией команд - подумайте сами - слов в русском языке меньше, команды типа c:xxx предназначенны для непосредсвенного исполнения пользователем, столько нету нигде ни в автокаде, ни в операционных системах, ни в msoffice со всеми возможными надстройками.
p.s. из кода:
Код:
[Выделить все]
 (defun C:0911 ()
  (ru-app-load "profi/ru_pro_arrange_blocks")
  (princ)
)
я пологаю что у Вас примерно 15000 тысяч файлов??
p.p.s - откровенно говоря мне с большим трудом верится, что у Вас все 15000 функций абсолютно "разношерстные" - сильно-ли отличается из Вашего примера "ru_pro_arrange_block" от какого-нибудь "ru_pro_XXX_block"? не повторяется-ли там 90% кода - если так то может логичнее заменить на функцию с аргуметном, а не плодить "клонов" - хотя это только мои предположения.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 16.06.2011 в 16:09.
Дима_ вне форума  
 
Непрочитано 16.06.2011, 19:02
#30
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
15000 команд c:xxx? - тут что-то не так с организацией команд - подумайте сами - слов в русском языке меньше, команды типа c:xxx предназначенны для непосредсвенного исполнения пользователем
А об этом пусть думают те, кто непременно оформляет свои программы в виде C:XXX. Я давным-давно понял, что это совершенно не нужно делать. Зачем нужна функция-команда?

1. Да они появились исторически, когда AutoCAD обладал минимальным интерфейсом и даже не всегда мышка была. Тогда чаще всего команды вводили с клавиатуры. Времена были такие, мерзопакостные. Вот и сделали возможность программистам создавать "команды".
Иногда действительно проще команду ввести с клавиатуры, чем лазить по многочисленным элементам интерфейса. Но имя должно быть простым и запоминающимся. Не "КРАНШАРОВЫЙБАБОЧКАШТУЦЕР-РЕЗЬБА_20" или наподобие. Вот и ввел цифровые имена. Легко запоминаются (те, которые надо), труднее ошибиться. И то только для тех, кому удобнее запомнить номер и вводить с клавиатуры. В общем-то удобно.

2. Последнюю выполненную "команду" можно повторить нажатием Enter. Тоже надо. Раньше все команды имели одно и то же имя - ради повтора. Оно было и невидимым (все равно не набирать), и в виде RU. Потом, как написал выше, сделал цифровые имена.

15000 - это не имен команд, и не пунктов в меню. Это полезных конечных действий. Да и то это я когда-то насчитал, сбился и плюнул. Теперь намного больше. Разумеется, нет никаких 15000 файлов. На сей момент их ровно 299. Это таких, в которых что-то индивидуальное. А большинство действий реализуется вызовом библиотечных функций с аргументами. Самые ходовые и оформлены в виде C:XXX. Я приводил пример:

Код:
[Выделить все]
 (defun C:4301 ()
  (ru-xml-pop-mnu  "3d/ru_3d_pipe_lines"  "Трассы трубопроводов")
  (princ)
)
Классический вызов библиотечной функции с двумя аргументами, только обернут именем 4301 ради быстрого вызова. Это как раз функция вызова иллюстрированного XML-меню, картинками которых я всех задолбал.

А вот уже в этом меню, в конечных листочках дерева, и сидят выховы функций с аргументами. Пункт такого меню выглядит наподобие

Код:
[Выделить все]
<item name="Катушка фланцевая 100-16" 
 image="3d\pipes\ru_3d_pipe_2_flange_rev.png" 
 comment="Прямой участок с фланцами на концах"
 macro="(ru-3d-pipe-draw-any (quote ru-3d-pipe-2-flange-draw-revolved) (ru-3d-pipe-flange-std-100-16) "Начало катушки" "Конец катушки" nil)" 
/>
Вот в атрибуте macro

Код:
[Выделить все]
 (ru-3d-pipe-draw-any (quote ru-3d-pipe-2-flange-draw-revolved) (ru-3d-pipe-flange-std-100-16) "Начало катушки" "Конец катушки" nil)
и записано LISP-выражение, с аргументами, да еще в качестве аргументов передаются имена других функций.

Например функция ru-3d-pipe-draw-any рисует "что угодно", имеющее начало и конец. В данном случае ей, с помощью функции quote передается имя функции ru-3d-pipe-2-flange-draw-revolved, рисующей в 3D фланцы приварные встык.

А если вызвать
Код:
[Выделить все]
 (ru-3d-pipe-draw-any (quote ru-3d-tee-muff) (list 48.0 33.5 100.0) "Вход среды" "Направление протока" 100.0)
то та же самая функция будет рисовать уже тройники муфтовые. Причем создавать такие пункты меню может и "смышленая тетка", безо всякого программирования. Что они и делают.

Впрочем, мы отвлеклись от темы ветки про "макросами кнопок"
ShaggyDoc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Неприятные особенности использования запуска команд макросами кнопок



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В русской версии AutoCAD 2010 SP1 32-bit файл Acad.PGP содержит ошибки. hwd Баги и пожелания в Autodesk 21 21.04.2010 20:27
Программное управление макросами кнопок Supermax Программирование 2 24.12.2007 14:07