Re: LISP. Общее. Загрузка файла. Вызовы функций

У меня организация загрузки LSP файлов следняя
В Туулбаре есть кнопка, которая стартирует програму для поиска и загрузки файлов. У нее два окна - левий директории, правий - лисп файлы в избраной директории. под ним текстовое поле, в которое выводиться короткое описание предназначение програм в файле.
При избор файла стартируется програма для запуска програм.
У нее два окна - верхний список загруженних файлов, нижнее - список функции в избранном файле и короткое описание действия функции.
Под ним находятся кнопки RUN, Новий файл и CANCEL.
До кнопки RUN стоит имя последней стартиранной функции. Если нажат кнопку RUN стартиреутся эта функция, если в окне выбираеш другую функцию - стартируется она. С командной строки можно написат RUN и стартируется последная выбранная функция.
Чтобы это работало в лисп файле в первой строке есть коментар с короткое описание предназначение програм в файле, а перед каждом (DEFUN есть строка - коментар с короткое описание предназначении дефинируемой функции. Програма берет эти строки и отображает в диалоговом окне. Выбранние функции потом берется по имени из списка возвращаемом функции ATOMSFAMILY и записивается в глобалной переменной RUNFUN.  В ACAD.LSP дефинирована функция C:RUN, которая в конечном итоге выполняет (EVAL RUNFUN).
У меня есть и другая организация - эсли хочу про загрузки файла автоматично загружат нужние проги.
Для того в entityname (HANDENT "1") записиваю через XDATA  имена нужних файлов (создал отделную програму, которая зяпускается в конце первой загрузки файла - в самом файле последняя строка запускает ету прогу). В ACAD.LSP создал прогу, которая проверяет за наличии XDATA в (HANDENT "1") и загружает записание файли. Конечно проверяется за наличии файла, выводится список с имена файлов и т.п

Re: LISP. Общее. Загрузка файла. Вызовы функций

1.Создал файл из вашего кода autoload.lsp.
2. Добавил его в автозагрузку.
3. Перезапустил кад.
4. Как прописать путь к нужной мне папке?
5. Обнулил директорию, правда не совсем понятно, с какой целью и нужно ли делать это вообще?
Возможно путь к папке автозапуска прописать в самой программе?
5. Попытался задать новый путь к папке командой (z-files-in-directory "D:\\Lisp" '("*.lsp" "*.fas") t) выводит ошибку

; ошибка: no function definition: Z-FILES-IN-DIRECTORY

6. Положил файл lsp в папку, результат нулевой, та же самая ошибка.
Можете помочь в решении проблемы, заранее благодарен за ответ.
Спасибо за программу.

Re: LISP. Общее. Загрузка файла. Вызовы функций

> guest
Ошибка говорит о том что не загруженна функция - возможна причина - неправильное добавление загрузки файла в автозагрузку.
Пример добавления файла в автозагрузку:
1) Tools>Load Aplication = команда _appload
2) Кнопка "Contens" (Чемоданчик)
3) Нажимаете кнопку "Add" (добавить)
4) выбираете файл и ок.
5) выходите из команды и перезагрузить акад.
Возможен и другой прикол - ошибка при загрузке файла, тоесть при загрузке файла (посмотрите F2) если была ошибка при загрузке файла там будет сообщение. Тогда ошибка в файле.

Re: LISP. Общее. Загрузка файла. Вызовы функций

Ох валенок я.
Переместите код:
; Проверка и задание переменной *z_root_dir* путь к папке автозагрузки
(if (or  (not (getenv "*z_root_dir*"))
  (= (getenv "*z_root_dir*") "")
  ) ;_ or
  (setenv "*z_root_dir*" (BrowseFolder))
)
; Обнуление переменной *z_root_dir* для задания нового пути к папке
;(setenv  "*z_root_dir*" "")
;|
в конец перед кодом:
;загрузка библиотеки лиспов
(mapcar  'load
  (z-files-in-directory (getenv "*z_root_dir*") '("*.lsp" "*.fas" "*.vlx") t)
  ) ;_ mapcar

Re: LISP. Общее. Загрузка файла. Вызовы функций

ZZZ
Только последний символ

;|

делает неактивным загрузку библиотеки лиспов.
Спасибо за программу, теперь все работает нормально.

Re: LISP. Общее. Загрузка файла. Вызовы функций

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

Re: LISP. Общее. Загрузка файла. Вызовы функций

http://my.opera.com/kpblc/blog/show.dml/299368 и там в самый конец - 2 варианта загрузчиков.

Re: LISP. Общее. Загрузка файла. Вызовы функций

Кулик Алексей aka kpblc
В программе ZZZ каталог указывается, может быть имеет смысл так сделать выбор папки, а не вбиванием в программу адреса?
И еще выдает ошибку на vlx файлахЭ зато arx грузится нормально и подпапки нормально подгружаются.

Утилиты меню AutoCAD загружены.
Загружаю файл E:\Nikola\Lisp\AlxdDike.arx
AlxdDike 3.0 Copyright © 2003 Alexander Shchetinin
Загружаю файл E:\Nikola\Lisp\ExplodeProxy2006.arx
Загружаю файл E:\Nikola\Lisp\selsim\SelSim2006.arx
Загружаю файл E:\Nikola\Lisp\OFF2.lsp
Наберите в командной строке OFF2
Загружаю файл E:\Nikola\Lisp\dvl.lsp
Загружаю файл E:\Nikola\Lisp\per.lsp
Загружаю файл E:\Nikola\Lisp\c_step.lsp
Загружаю файл E:\Nikola\Lisp\entLen.lsp
Загружаю файл E:\Nikola\Lisp\coor.lsp
Загружаю файл E:\Nikola\Lisp\grf_numb.VLX; ошибка: неверный тип аргумента: (or
stringp symbolp): ("E:\\Nikola\\Lisp\\procat_ru\\PROKAT_O.LSP : неверный тип
аргумента: stringp nil\n")

Re: LISP. Общее. Загрузка файла. Вызовы функций

В моем рабочем варианте каталог, откуда надо грузить файлы, читается из реестра (а записывается туда инсталлятором). Выложен же пример, а путь приложений уж как определять - каждый решает сам.
Насчет vlx / fas... Дело в том, что в силу различных причин (так уж сложилось) я не использую компилированные приложения (fas и vlx) в повседневной работе.
В качестве "быстрого" рецепта могу посоветовать только попробовать заменить вызов load на vl-load-all. Я этот метод не проверял и ничего (пока) обещать не могу.

Re: LISP. Общее. Загрузка файла. Вызовы функций

> gest
процедура BrowseFolder зачем? Это не тупое вбивание в программу адреса, а предназнаяенна для стартового выбора папки посредством диалогового окна. Путь к папке хранится в реестре.

Re: LISP. Общее. Загрузка файла. Вызовы функций

ZZZ
Имел ввиду программу Андрея, а не твою. В твоей как я уже и говорил метод выбора просто превосходный.

Re: LISP. Общее. Загрузка файла. Вызовы функций

> gest
Попробуй этот код в посте > ZZZ (2005-11-06 17:10:59)

;загрузка библиотеки лиспов
(mapcar  'load
  (z-files-in-directory (getenv "*z_root_dir*") '("*.lsp" "*.fas" "*.vlx") t)
  ) ;_ mapcar

заменить на

;загрузка библиотеки лиспов с отловом ошибок
(vl-load-com) ;_На всякий случай
(foreach fil (z-files-in-directory (getenv "*z_root_dir*") '("*.lsp" "*.fas" "*.vlx") t)
      (if (vl-catch-all-error-p
      (vl-catch-all-apply '(lambda ()(load fil))))
    (princ (strcat "\nОшибка загрузки файла " fil))
    )
      )

Re: LISP. Общее. Загрузка файла. Вызовы функций

VVA
Загрузка в программе ZZZ приложений нормальная, только нехватает arx приложений, который есть в программе kpblc, только у него нет fas, и на vlx ошибка вылетает, вот если бы совместить и сделать универсальный загрузчик.

Re: LISP. Общее. Загрузка файла. Вызовы функций

У меня есть предложение - выслать мне на мыло пару-тройку "незагружаемых" vlx / fas, чтоб я мог их поковырять. Те fas'ы и vlx'ы, которые я нашел у себя, корректно загружались через load. Но там, как говорится, "возможны варианты", связанные с параметрами компиляции (ЯТД).

Re: LISP. Общее. Загрузка файла. Вызовы функций

> gest
Ну тогда в варианте ZZZ

;загрузка библиотеки лиспов
(mapcar  'load
  (z-files-in-directory (getenv "*z_root_dir*") '("*.lsp" "*.fas" "*.vlx") t)
  ) ;_ mapcar

замени на

;загрузка библиотеки лиспов и arx модулей с отловом ошибок
(vl-load-com) ;_На всякий случай
(foreach fil (z-files-in-directory
               (getenv "*z_root_dir*")
               '("*.lsp" "*.fas" "*.vlx" "*.arx")
               t
             ) ;_ end of z-files-in-directory
  (if (vl-catch-all-error-p
        (vl-catch-all-apply
          '(lambda ()
             (if (= (strcase (vl-filename-extension fil)) ".ARX")
               (arxload fil)
               (load fil)
             ) ;_ end of if
           ) ;_ end of lambda
        ) ;_ end of vl-catch-all-apply
      ) ;_ end of vl-catch-all-error-p
    (princ (strcat "\nОшибка загрузки файла " fil))
  ) ;_ end of if
) ;_ end of foreach

Re: LISP. Общее. Загрузка файла. Вызовы функций

Огромное спасибо, то что нужно.

Re: LISP. Общее. Загрузка файла. Вызовы функций

Обнаружила, что поиск lisp (findfile name_i) загрузка посредством (Load name_i) чуствительна к регистру имени файла и расширения!

Re: LISP. Общее. Загрузка файла. Вызовы функций

> Lidia
Странно.

(defun test (/ file)
  (setq file
         (findfile
           "e:\\files\\cadware\\lsp\\db\\insert\\leader\\_kpblc-db-insert-leader.lsp"
           ) ;_ end of findfile
        ) ;_ end of setq
  (load (strcase file) "Файл не найден")
  ) ;_ end of defun

Работает вполне корректно.

Re: LISP. Общее. Загрузка файла. Вызовы функций

Очень полезная для меня вещь. Давно искал что то подобное. У самого сейчас все организовано через указание пути и загрузку каждого лиспа в отдельности.
Так же как и guest
создал файл autoload.lsp
но при его загрузке выдается ошибка
; error: no function definition: BROWSEFOLDER

Re: LISP. Общее. Загрузка файла. Вызовы функций

http://dwg.ru/f/showthread.php?t=16560 либо https://www.caduser.ru/forum/topic21141.html

Re: LISP. Общее. Загрузка файла. Вызовы функций

Извини, но нельзя ли более подробно объяснить? Я в программирования не силен.
Если я правильно понял. Мне нужно заменить вот этот кусок из лиспа ZZZ
;(BrowseFolder)
;http://discussion.autodesk.com
(defun BrowseFolder ( / ShlObj Folder FldObj OutVal)
  (vl-load-com)
  (setq
    ShlObj (vla-getInterfaceObject
       (vlax-get-acad-object)
       "Shell.Application"
     )
    Folder (vlax-invoke-method ShlObj 'BrowseForFolder 0 "" 0)
  )
  (vlax-release-object ShlObj)
  (if Folder
    (progn
      (setq
  FldObj (vlax-get-property Folder 'Self)
  OutVal (vlax-get-property FldObj 'Path)
      )
      (vlax-release-object Folder)
      (vlax-release-object FldObj)
      OutVal
    )
  )
)
на то что ты предложил?
Или предложенное нужно вставить перед лиспом ZZZ , чтобв определить функцию BrowseFolder?

Re: LISP. Общее. Загрузка файла. Вызовы функций

BrowseFolder есть на предыдущей странице в посте ZZZ
Полный вариант с учетом arx и т.п.
Код функций

(vl-load-com) ;_На всякий случай
;|=======================================================================================
*    функция z-files-in-directory возвращает список файлов находящаяся в заданной
* директории
*    Автор : Зуенко Виталий (ZZZ)
*  Параметры:
*    directory  путь к папке например "D:\\Мои документы\\ZEF\\Lisp"
*    pattern    шаблон например "*.lsp" или список '("*.dwg" "*.dxf")
*    nested    искать в вложенных папках: t (да) или nil (нет)
* Пример вызова:
(z-files-in-directory "D:\\Мои документы\\ZEF\\Lisp" "*.lsp" t)
(z-files-in-directory "D:\\Мои документы\\ZEF\\Lisp" '("*.lsp" "*.fas") t)
=======================================================================================|;
(defun z-files-in-directory (directory pattern nested /)
  (if (not (listp pattern))
    (setq pattern (list pattern))
    ) ;_ if
  (if nested
    (apply
      'append
      (append
  (mapcar  '(lambda (_pattern)
       (mapcar '(lambda (f) (strcat directory "\\" f))
         (vl-directory-files directory _pattern 1)
         ) ;_ list
       ) ;_ lambda
    pattern
    ) ;_ mapcar
  (mapcar
    '(lambda (d)
       (z-files-in-directory
         (strcat directory "\\" d)
         pattern
         nested
         ) ;_ z-files-in-directory
       ) ;_ lambda
    (vl-remove
      "."
      (vl-remove ".." (vl-directory-files directory nil -1))
      ) ;_ vl-remove
    ) ;_ mapcar
  ) ;_ append
      ) ;_ append
    (apply
      'append
      (mapcar '(lambda (_pattern)
     (mapcar '(lambda (f) (strcat directory "\\" f))
       (vl-directory-files directory _pattern 1)
       ) ;_ list
     ) ;_ lambda
        pattern
        ) ;_ mapcar
      ) ;_ apply
    ) ;_ if
  ) ;_ defun
;(BrowseFolder)
;http://discussion.autodesk.com
(defun BrowseFolder ( / ShlObj Folder FldObj OutVal)
  (vl-load-com)
  (setq
    ShlObj (vla-getInterfaceObject
       (vlax-get-acad-object)
       "Shell.Application"
     )
    Folder (vlax-invoke-method ShlObj 'BrowseForFolder 0 "" 0)
  )
  (vlax-release-object ShlObj)
  (if Folder
    (progn
      (setq
  FldObj (vlax-get-property Folder 'Self)
  OutVal (vlax-get-property FldObj 'Path)
      )
      (vlax-release-object Folder)
      (vlax-release-object FldObj)
      OutVal
    )
  )
)

Загрузка

; Проверка и задание переменной *z_root_dir* путь к папке автозагрузки
(if (or  (not (getenv "*z_root_dir*"))
  (= (getenv "*z_root_dir*") "")
  ) ;_ or
  (setenv "*z_root_dir*" (BrowseFolder))
)
; Обнуление переменной *z_root_dir* для задания нового пути к папке
;(setenv  "*z_root_dir*" "")
;|
;Вместо старого кода
;загрузка библиотеки лиспов
(mapcar  'load
  (z-files-in-directory (getenv "*z_root_dir*") '("*.lsp" "*.fas" "*.vlx") t)
  ) ;_ mapcar
|;
;загрузка библиотеки лиспов и arx модулей с отловом ошибок и запросом директории
(foreach fil (z-files-in-directory
               (getenv "*z_root_dir*")
               '("*.lsp" "*.fas" "*.vlx" "*.arx")
               t
             ) ;_ end of z-files-in-directory
  (if (vl-catch-all-error-p
        (vl-catch-all-apply
          '(lambda ()
             (if (= (strcase (vl-filename-extension fil)) ".ARX")
               (arxload fil)
               (load fil)
             ) ;_ end of if
           ) ;_ end of lambda
        ) ;_ end of vl-catch-all-apply
      ) ;_ end of vl-catch-all-error-p
    (princ (strcat "\nОшибка загрузки файла " fil))
  ) ;_ end of if
) ;_ end of foreach

Re: LISP. Общее. Загрузка файла. Вызовы функций

Если путь известен (его можно получить, нгабрав в командной строке (BrowseFolder)), например   "C:\\Temp\\!vva" (обращаю внимание на двойные слэши)
То вариант заргузки с известным путем
Загрузка

;загрузка библиотеки лиспов и arx модулей с отловом ошибок
(foreach fil (z-files-in-directory
                 "C:\\Temp\\!vva" [b];_Здесь пишем известный нам путь[/b]
               '("*.lsp" "*.fas" "*.vlx" "*.arx")
               t
             ) ;_ end of z-files-in-directory
  (if (vl-catch-all-error-p
        (vl-catch-all-apply
          '(lambda ()
             (if (= (strcase (vl-filename-extension fil)) ".ARX")
               (arxload fil)
               (load fil)
             ) ;_ end of if
           ) ;_ end of lambda
        ) ;_ end of vl-catch-all-apply
      ) ;_ end of vl-catch-all-error-p
    (princ (strcat "\nОшибка загрузки файла " fil))
  ) ;_ end of if
) ;_ end of foreach

Re: LISP. Общее. Загрузка файла. Вызовы функций

Спасибо, теперь загрузка работает.
Видимо до этого я запускал вариант без отлова ошибок, и при первой же загрузка прекращалась.
Теперь нужно разобраться с ошибками.

Re: LISP. Общее. Загрузка файла. Вызовы функций

О великие гуру, не подумайте плохо, но если не тяжело, напишите от начала до конца, как пользоваться предлагаемыми текстами программ. Как, что, куда копировать и загружать, выше написанное как то все запутало. Подготовка по ЛИСП = 0, умею пока только чертить, но увидел столько интереснейших программок, что нетерпится опробовать.