Тема: Подскажите новичку-профану )))

Ответ желательно давать с учетом того, что всё это делается для большого количества людей, которые не знают даже что такое "загрузка приложений" в акаде!
Я создал папку C:\support_lgp\programs\. Прописал её в настройках. Внутри неё есть лисповские приложения. Также там есть файл load.lsp следующего содержания (честно - я его скомуниздил):

;Отображает внизу экрана текущее значение dimlfac
(setvar 'MODEMACRO "Масштаб линейных размеров: $(rtos,$(getvar, dimlfac))")
;;Список команд, исполняемых функций и имен файлов
(SETQ cmdl (LIST
      '(C:DIM-CHECK DIM-CHECK "dimcheck.lsp") ;Команда поиска и выделения цветом размеров, текст которых был отредактирован "вручную"
      '(C:TXT-FRAME TXT-FRAME "txtframe.lsp") ;Команда рисования рамки вокруг текста, мультитекста или размерного текста
      '(C:R-COPY R-COPY "rcopy.lsp") ;Команда множественного копирования по кругу
      '(C:EXTENTS EXTENTS "extents.lsp") ;Команда определения габаритов группы объектов
      '(C:MLENGTH MLENGTH "mlength.lsp") ;Команда вычисления суммарной длины отрезков и дуг
      );LIST
   );SETQ
;;Рекурсивная функция определения и загрузки команд из списка cmdl
(DEFUN LOADER (cmdl)
   (COND
      ((NULL cmdl) nil)
      (T
         (EVAL
            (LIST
               'DEFUN (CAR (CAR cmdl)) '()
               (LIST
                  'COND
                  (LIST
                     (LIST 'AND (CADR (CAR cmdl))
                        (LIST 'LISTP (CADR (CAR cmdl)))
                        );LIST
                     (LIST (CADR (CAR cmdl)))
                     );LIST
                  (LIST
                     (LIST 'EQ "failed"
                        (LIST 'LOAD (CADDR (CAR cmdl)) "failed")
                        );LIST
                     (LIST 'PRINC
                        (STRCAT "\nОшибка загрузки файла "
                           (CADDR (CAR cmdl))
                           "! "
                           );STRCAT
                        );LIST
                     '(PRINC)
                     );LIST
                  (LIST 'T (LIST (CADR (CAR cmdl))))
                  );LIST
               );LIST
            );EVAL
         (LOADER (CDR cmdl))
         )
      );COND
   );DEFUN
(LOADER cmdl)
(SETQ

Создал свой файл НПИ в котором есть меню (делал через "адаптацию") "загрузка lisp" в которой поместил load.lsp. Создал своё меню с добавлением нескольких команд. Макрос примерно такой ^C^C_TXT-FRAME. Понятно, что в лисповских файлах defun идет без С:
Вроде все это удобно. Я пришел к кому то, установил мою папку C:\support_lgp\, установил прфиль со всеми его настройками и один раз запустил мой НПИ. Все работает, все рады. Я ушел...
Теперь вопросы:
1. Если в лисп-приложении для defun будет С:, что тогда?
2. При загрузке акада есть такая строка: Утилиты меню AutoCAD загружены.; ошибка: неверно сформирванный список на входе
*Прервано*
Это почему? (связано полагаю с моим load.lsp)
3. Как мне прописать другие приложения? Например *.arx
4. Этот вариант вообще хороший?
Просьбы:
1. Прошу не давать "заумных" ответов ))) Ну чтобы понятно было среднему пользователю. Желательно типа: 1 - сделай так... 2 - сделай тут вот так...
2. Желательно не давать ссылки на другие ветки форума, где обсуждалось что-нить похожее, но при этом не понятно "среднему пользователю"!
Заранее огромное спасибо!!!

Re: Подскажите новичку-профану )))

Макрос примерно такой ^C^C_TXT-FRAME.

Неверно записан макрос. Выше команда определена так:

'(C:TXT-FRAME TXT-FRAME "txtframe.lsp")

Подчерк не нужен.
Что-то мне в этой теме не нравится. Может быть, категорическая форма и напор?

Re: Подскажите новичку-профану )))

> Владимир Громов
Ну ведь кнопки то с таким макросом работатю :)
Вроде же нет разницы стоит _ или не стоит. Что-то подобное я слышал. Точне - _ ставится в русифицированном автокаде для набора команд по-английски, так что хуже быть не должно.
И Вы мне не на один вопрос не ответили :(
А такая категоричная форма вопроса, потому-что обычно ответы начинают "утекать в другое русло"...

Re: Подскажите новичку-профану )))

Я бы этот LOADER вообще не использовал.

Re: Подскажите новичку-профану )))

> Владимир Громов
Ну а как бы сделать по другому?
Ответ желательно давать с учетом того, что всё это делается для большого количества людей, которые не знают даже что такое "загрузка приложений" в акаде!

Re: Подскажите новичку-профану )))

Modis пишет:

Ответ желательно давать с учетом того, что всё это делается для большого количества людей, которые не знают даже что такое "загрузка приложений" в акаде!

Покажите своему большому количеству людей как загружать приложения и они к Вам не будут приставать. Если они реально увидят, что им нужны ваши программы, то научатся загружать приложения при переустановки автокада очень быстро. Могут и друг у друга поспрашивать. Это самый оптимальный вариант.

И Вы мне не на один вопрос не ответили :(

Вам ответили. Только Вы этого не заметили.
И вообще, на вопросы, сформулированные безо всяких условий отвечать значительно интереснее.

Re: Подскажите новичку-профану )))

> brigval
Я не могу всем показывать как подгружать лисп-программы - у меня на это нет времени, а людей много (штук 8 строительных групп).
На вопросы (4 штуки) ответа небыло...
Кстати, loader помоему все-таки удобно - если я добавляю новые лисп-программы, то мне надо провести всего лишь несколько манипуляций - поместить программы и иконки в нужные папки и заменить мой файл НПИ и load.lsp.
Попробовал всавить новую лисп-программу, в которой фунуция определялась через С:. И вписал её в loader. В итоге кнопка почему-то работала только со 2 нажатия. Стер С: - стало все хорошо.
Все ещё жду ответы на 4 мои вопроса!

Re: Подскажите новичку-профану )))

Modis пишет:

у меня на это нет времени

Покажите по одному человеку из каждой группы. Он покажет остальным.

Все ещё жду ответы на 4 мои вопроса!

Дождитсь хотя бы будней, что ж людей в праздники загружать? :))) 23-е февраля как никак...

Re: Подскажите новичку-профану )))

https://www.caduser.ru/forum/topic19699.html не поможет?

Re: Подскажите новичку-профану )))

> Кулик Алексей aka kpblc
Да я смотрел там... не очень понятно среденему пользователю:)
А мне, честно, мой вариант нравится. Мне бы помогли подредактировать код load.lsp и ответить на 2 и 3 вопросы. Я был бы счастлив)))

Re: Подскажите новичку-профану )))

Имея свое подгружаемое меню, я бы сделал и файл *.mnl, в который и поместил бы коды, указанные выше. Нет, я бы записал по другому:

(load "dimcheck.lsp") ;Команда поиска и выделения цветом размеров, текст которых был отредактирован "вручную"
(load "txtframe.lsp") ;Команда рисования рамки вокруг текста, мультитекста или размерного текста
(load "rcopy.lsp") ;Команда множественного копирования по кругу
(load "extents.lsp") ;Команда определения габаритов группы объектов
(load "mlength.lsp") ;Команда вычисления суммарной длины отрезков и дуг

Но сначала добавил бы С: в коды программ. В этом случае LOADER не нужен.
По пункту 2 ответить нечего, поскольку неизвестно, что загружается автоматически после acad.mnl.
По пункту 3.
Приложение ARX загружается так:

(arxload "имя_файла.arx")

По пункту 4 ответить трудно. Маститые программисты могут ответить, что специальный универсальный загрузчик лучше. Может быть и так, если вы решили плюнуть на конструирование и заняться разработкой САПР на базе AutoCAD.

Re: Подскажите новичку-профану )))

Мне, если честно, нравится loader. Вполне удобно. За день слегка изменился:

;Отображает внизу экрана текущее значение dimlfac
(setvar 'MODEMACRO "Масштаб линейных размеров: $(rtos,$(getvar, dimlfac))")
;Загрузка приложений *.arx
(arxload "GeomProps2007.arx")
(arxload "cl-DwgMan_07-08.arx")
;;Список команд, исполняемых функций и имен файлов
(SETQ cmdl (LIST
      '(C:DIM-CHECK DIM-CHECK "dimcheck.lsp") ;Команда поиска и выделения цветом размеров, текст которых был отредактирован "вручную"
      '(C:TXT-FRAME TXT-FRAME "txtframe.lsp") ;Команда рисования рамки вокруг текста, мультитекста или размерного текста
      '(C:R-COPY R-COPY "rcopy.lsp") ;Команда множественного копирования по кругу
      '(C:EXTENTS EXTENTS "extents.lsp") ;Команда определения габаритов группы объектов
      '(C:MLENGTH MLENGTH "mlength.lsp") ;Команда вычисления суммарной длины отрезков и дуг
      '(C:BURST BURST "burst.lsp") ;Команда расчленения блоков с превращением атрибутов в текст
      '(TCASE TCASE "tcase.lsp") ;Команда изменения регистра текста
      '(NCOPY NCOPY "trexblk.lsp") ;Команда копирования простых примитивов, входящих в блок
      );LIST
   );SETQ
;;Рекурсивная функция определения и загрузки команд из списка cmdl
(DEFUN LOADER (cmdl)
   (COND
      ((NULL cmdl) nil)
      (T
         (EVAL
            (LIST
               'DEFUN (CAR (CAR cmdl)) '()
               (LIST
                  'COND
                  (LIST
                     (LIST 'AND (CADR (CAR cmdl))
                        (LIST 'LISTP (CADR (CAR cmdl)))
                        );LIST
                     (LIST (CADR (CAR cmdl)))
                     );LIST
                  (LIST
                     (LIST 'EQ "failed"
                        (LIST 'LOAD (CADDR (CAR cmdl)) "failed")
                        );LIST
                     (LIST 'PRINC
                        (STRCAT "\nОшибка загрузки файла "
                           (CADDR (CAR cmdl))
                           "! "
                           );STRCAT
                        );LIST
                     '(PRINC)
                     );LIST
                  (LIST 'T (LIST (CADR (CAR cmdl))))
                  );LIST
               );LIST
            );EVAL
         (LOADER (CDR cmdl))
         )
      );COND
   );DEFUN
(LOADER cmdl)
(SETQ

Все работает. Если в самой лисп-программе нет С:, то строка типа такой:

'(C:R-COPY R-COPY "rcopy.lsp")

а если есть С:, то типа так:

'(TCASE TCASE "tcase.lsp")

По поводу ошибки: это точно в моем load.lsp. Проверял с ним и без него.
Вот протокол:

Файл настройки загружен успешно. Группа настройки: ACAD
Файл настройки загружен успешно. Группа настройки: CUSTOM
Файл настройки загружен успешно. Группа настройки: EXPRESS
Файл настройки загружен успешно. Группа настройки: LGP
Выполняется регенерация модели.
DwgMan Build Date: Nov 09, 2007
AutoCAD Express Tools Copyright © 2002-2004 Autodesk, Inc.
Утилиты меню AutoCAD загружены.; ошибка: неверно сформирванный список на входе
*Прервано*
Команда: КОМСТР
Команда: properties

Было бы неплохо, если бы кто-нить подсказал где ошибка в коде, а то через 2 дня уже ставить буду на много машин на работе.

Re: Подскажите новичку-профану )))

Отвечу в обратном порядке.
4. ИМХО - вариант не очень. Во-первых, в лисп-кодах и так по идее прописывается defun и имя определяемой функции и/или команды (не рассматриваю вариант применения defun-q, поскольку сам с ним не работал ни разу). Во-вторых, количество загружаемых лиспов может быть приличным, каждый прописывать помрешь. В-третьих, помимо lsp и arx, бывают еще и fas и vlx с несколькими определенными функциями / командами, а их по указанной технологии не загрузить.
3. Уже дали ответ - (arxload).
2. Непонятно - в коде загрузчика последний

(setq

что делает?
Один из вариантов загрузки всего чего угодно:

(defun loader (/ getfile err_lst)
  (defun getfile (f p)
    ;; By ElpanovEvgeniy
    ;; (getfile "acad*.lsp" "C:\\Program Files")
    ;|
 Функция поиска файла или файлов в указанной папке и всех вложенных папках
 файл задается именем или маской
 Аргументы:
 P — начальный путь поиска,
 например "C:" или "C:\\Program Files"
 F — название файла,
 возможно использование подстановочных символов.
 например
 "*.dwg" — найдет все dwg-файлы
 или "acad*.lsp"
 Вызывать
 (getfile "acad*.lsp" "C:\\Program Files")
 Возвращает список файлов с полным путем до них и названием без маски.
 '("C:\\Program Files\\AutoCAD 2004\\Express\\acadinfo.lsp"
    "C:\\Program Files\\AutoCAD 2004\\Support\\acad2004.lsp"
    "C:\\Program Files\\AutoCAD 2004\\Support\\acad2004doc.lsp"
    "C:\\Program Files\\AutoCAD 2004\\Support\\acadinfo.lsp"
  )
|;
    (apply
      (function append)
      (cons
        (if (vl-directory-files p f)
          (mapcar (function (lambda (x) (strcat p "\\" x)))
                  (vl-directory-files p f)
                  ) ;_ end of mapcar
          ) ;_ if
        (mapcar (function (lambda (x) (getfile f (strcat p "\\" x))))
                (vl-remove ".." (vl-remove "." (vl-directory-files p nil -1)))
                ) ;_ mapcar
        ) ;_ cons
      ) ;_ apply
    ) ;_ end of defun
  (vl-load-com)
  (foreach file (apply 'append
                       (mapcar '(lambda (x) (getfile "c:\\adds" x))
                               '("*.lsp" "*.fas" "*.vlx" "*.arx")
                               ) ;_ end of mapcar
                       ) ;_ end of apply
    (if (vl-catch-all-error-p (vl-catch-all-apply '(lambda () (load file))))
      (setq err_lst (cons file err_lst))
      ) ;_ end of if
    ) ;_ end of foreach
  (if err_lst
    (princ
      (strcat
        "\nОшибки загрузки файлов:"
        (apply 'strcat (mapcar '(lambda (x) (strcat "\n" x)) (reverse err_lst)))
        "\n"
        ) ;_ end of strcat
      ) ;_ end of princ
    ) ;_ end of if
  ) ;_ end of defun

Код не проверял. На dvb-модулях не тестировал.

Re: Подскажите новичку-профану )))

> Кулик Алексей aka kpblc
Я же профан :) Я не понял как использовать предоставленный вами код

Re: Подскажите новичку-профану )))

:) Хорошая шутка :)
Кстати, в коде нашел ошибку (выделено полужирным). Вот этот вариант более верен:

(defun loader (/ getfile err_lst)
  (defun getfile (f p)
    ;; By ElpanovEvgeniy
    ;; (getfile "acad*.lsp" "C:\\Program Files")
    ;|
 Функция поиска файла или файлов в указанной папке и всех вложенных папках
 файл задается именем или маской
 Аргументы:
 P — начальный путь поиска,
 например "C:" или "C:\\Program Files"
 F — название файла,
 возможно использование подстановочных символов.
 например
 "*.dwg" — найдет все dwg-файлы
 или "acad*.lsp"
 Вызывать
 (getfile "acad*.lsp" "C:\\Program Files")
 Возвращает список файлов с полным путем до них и названием без маски.
 '("C:\\Program Files\\AutoCAD 2004\\Express\\acadinfo.lsp"
    "C:\\Program Files\\AutoCAD 2004\\Support\\acad2004.lsp"
    "C:\\Program Files\\AutoCAD 2004\\Support\\acad2004doc.lsp"
    "C:\\Program Files\\AutoCAD 2004\\Support\\acadinfo.lsp"
  )
|;
    (apply
      (function append)
      (cons
        (if (vl-directory-files p f)
          (mapcar (function (lambda (x) (strcat p "\\" x)))
                  (vl-directory-files p f)
                  ) ;_ end of mapcar
          ) ;_ if
        (mapcar (function (lambda (x) (getfile f (strcat p "\\" x))))
                (vl-remove ".." (vl-remove "." (vl-directory-files p nil -1)))
                ) ;_ mapcar
        ) ;_ cons
      ) ;_ apply
    ) ;_ end of defun
  (vl-load-com)
  (foreach file (apply 'append
                       (mapcar '(lambda (x) [b](getfile x "C:\\support_lgp\\programs"))[/b]
                               '("*.lsp" "*.fas" "*.vlx" "*.arx")
                               ) ;_ end of mapcar
                       ) ;_ end of apply
    (if (vl-catch-all-error-p (vl-catch-all-apply '(lambda () (load file))))
      (setq err_lst (cons file err_lst))
      ) ;_ end of if
    ) ;_ end of foreach
  (if err_lst
    (princ
      (strcat
        "\nОшибки загрузки файлов:"
        (apply 'strcat (mapcar '(lambda (x) (strcat "\n" x)) (reverse err_lst)))
        "\n"
        ) ;_ end of strcat
      ) ;_ end of princ
    ) ;_ end of if
  ) ;_ end of defun
(loader)

Код закидывается в любой lsp, загружаемый автоматически. Этот файл не должен находиться в каталоге C:\support_lgp\programs\.

Re: Подскажите новичку-профану )))

> Кулик Алексей aka kpblc
я так понял этот лисп загружает все файлы, которые найдет в определенной дирректории. А если их вдруг станет очень много? не загрузит это систему? Мой load грузил лисп-программу по запросу.
При загрузке автокада пишет, что не может загрузить arx
А еще один раз акад не включился. Потом написал, что его переустановить надо...

Re: Подскажите новичку-профану )))

Специально переустановил акад для проверки. Этот лоадер не загружает arx

Утилиты меню AutoCAD загружены.
DimCheck.lsp загружен...
EXTENTS.lsp загружен...
MLENGTH.lsp загружен...
Rcopy.lsp загружен...
TxtFrame.lsp загружен...
Ошибки загрузки файлов:
C:\support_lgp\programs\All\cl-DwgMan_07-08.arx
C:\support_lgp\programs\All\GeomProps2007.arx
C:\support_lgp\programs\All\SelSim2007.arx

Re: Подскажите новичку-профану )))

Нда, все же отдыхать иногда надо :) Сам говорил про (arxload), и сам же про него забыл ;) Хотя, с другой стороны, переделать код особой проблемы не составляет :)
Теперь насчет "загрузки". У меня около 1000 лиспов, с десяток arx и dbx (с контролем версий) грузятся не больше 30 секунд (зависит от машины). А fas - так тот вообще моментально ;)

Re: Подскажите новичку-профану )))

> Кулик Алексей aka kpblc
Спасибо конечно, но я же профан - не забывайте. Я не знаю как правильно (и в какую часть кода) вставить (arxload). А "обновление" на работе собираюсь уже завтра ставить!

Re: Подскажите новичку-профану )))

Тогда не раньше вечера. Уже все, я машину вынужден отдавать.

Re: Подскажите новичку-профану )))

> Кулик Алексей aka kpblc
Возлагаю все надежды на Вас. Жду вечера

Re: Подскажите новичку-профану )))

> Modis
Я смотрю ты пытаешься грузить arx программу А.Ривилиса ((arxload "GeomProps2007.arx")), но ее нужно загрузить только один раз. Прочитай инструкцию по ее использованию на https://www.caduser.ru/forum/topic36136.html а именно пост > Александр Ривилис (2007-06-04 11:05:37) и особенно > Александр Ривилис (2007-06-05 13:19:19).
Что за зверь (arxload "cl-DwgMan_07-08.arx") не знаю, но тоже почитай про него как его загружать.
Еще рекомендую https://www.caduser.ru/forum/topic38009.html .

Re: Подскажите новичку-профану )))

> off
Я так понял, что arx вобще достаточно один раз загрузить - потом они уже сами загрузяться. Что же мне теперь - у всех пройти загрузить нужные arx? А вот например, функция txt2mtxt в express tools - это же тоже arx. Если я захочу её забрать себе и поставить там, где нет express tools, мне её тоже 1 раз надо загрузить или каждый раз.
Мне бы советик - как обойти эту проблемку...

Re: Подскажите новичку-профану )))

> Modis
Тут я пас. Это надо у А.Ривилиса спросить он по arx специализируется.

Re: Подскажите новичку-профану )))

http://my.opera.com/kpblc/blog/show.dml/299368 и там поиск по kpblc-loader  - еще пара вариантов.
тутошний код, минимум переделок, без проверок на корректность работы:

(defun loader (/ getfile err_lst err)
  (defun getfile (f p)
    ;; By ElpanovEvgeniy
    ;; (getfile "acad*.lsp" "C:\\Program Files")
    ;|
 Функция поиска файла или файлов в указанной папке и всех вложенных папках
 файл задается именем или маской
 Аргументы:
 P — начальный путь поиска,
 например "C:" или "C:\\Program Files"
 F — название файла,
 возможно использование подстановочных символов.
 например
 "*.dwg" — найдет все dwg-файлы
 или "acad*.lsp"
 Вызывать
 (getfile "acad*.lsp" "C:\\Program Files")
 Возвращает список файлов с полным путем до них и названием без маски.
 '("C:\\Program Files\\AutoCAD 2004\\Express\\acadinfo.lsp"
    "C:\\Program Files\\AutoCAD 2004\\Support\\acad2004.lsp"
    "C:\\Program Files\\AutoCAD 2004\\Support\\acad2004doc.lsp"
    "C:\\Program Files\\AutoCAD 2004\\Support\\acadinfo.lsp"
  )
|;
    (apply
      (function append)
      (cons
        (if (vl-directory-files p f)
          (mapcar (function (lambda (x) (strcat p "\\" x)))
                  (vl-directory-files p f)
                  ) ;_ end of mapcar
          ) ;_ if
        (mapcar (function (lambda (x) (getfile f (strcat p "\\" x))))
                (vl-remove ".." (vl-remove "." (vl-directory-files p nil -1)))
                ) ;_ mapcar
        ) ;_ cons
      ) ;_ apply
    ) ;_ end of defun
  (vl-load-com)
  (foreach file
           (apply 'append
                  (mapcar '(lambda (x) (getfile x "C:\\support_lgp\\programs"))
                          '("*.lsp" "*.fas" "*.vlx")
                          ) ;_ end of mapcar
                  ) ;_ end of apply
    (if (vl-catch-all-error-p (vl-catch-all-apply '(lambda () (load file))))
      (setq err_lst (cons file err_lst)
            ) ;_ end of setq
      ) ;_ end of if
    ) ;_ end of foreach
  (foreach file
           (apply 'append
                  (mapcar '(lambda (x) (getfile x "C:\\support_lgp\\programs"))
                          '("*.arx" "*.dbx")
                          ) ;_ end of mapcar
                  ) ;_ end of apply
    (if
      (not (member
             (strcase
               (strcat (vl-filename-directory file) (vl-filename-extension file))
               ) ;_ end of strcase
             (mapcar 'strcase (arx))
             ) ;_ end of member
           ) ;_ end of not
       (if (vl-catch-all-error-p
             (vl-catch-all-apply '(lambda () (arxload file)))
             ) ;_ end of vl-catch-all-error-p
         (setq err_lst (cons file err_lst))
         ) ;_ end of if
       ) ;_ end of if
    ) ;_ end of foreach
  (if err_lst
    (princ
      (strcat
        "\nОшибки загрузки файлов:"
        (apply 'strcat
               (mapcar '(lambda (x) (strcat "\n" x))
                       (reverse err_lst)
                       ) ;_ end of mapcar
               ) ;_ end of apply
        "\n"
        ) ;_ end of strcat
      ) ;_ end of princ
    ) ;_ end of if
  ) ;_ end of defun
(loader)