четверг, 1 апреля 2010 г.

Загрузка библиотек Lisp-файлов

На днях довольно случайным образом удалось решить проблему загрузки библиотек lisp.

В поисках программы для нумерации блоков забрел на форум caduser.ru и случайно натолкнулся на эту тему.
Особенно полезной для меня оказалась функция Getfile (спасибо Елпанову Евгению). Взяв ее за основу и дополнив функцией START

(defun START (file_name folder / file_list)
  (setq file_list (GetFile file_name folder))
  (if (foreach file file_list
        (load file (strcat "\nФайл " file " не найден"))
      ) ;_ end of foreach
    (princ (strcat "\nБиблиотека " folder " загружена"))
  ) ;_ end of if
) ;_ end of defun

получаем инструмент для загрузки всех лиспов из заданного каталога. Например так

(START "*.lsp" "Z:\\Настройки\\LISP\\Sourse")

8 комментариев:

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

    ОтветитьУдалить
  2. ну если все команды лиспов вы всегда вводите вручную, то да. А если делаете кнопки, то вариант отстойный... Зачем понапрасну захламлять память автокада кучей программ которыми вы, возможно, не воспользуетесь в эту рабочую сессию...

    ОтветитьУдалить
  3. Да, может я не использую все программы в одной сессии, но цеплять загрузку функций на конкретную кнопку - не выход. Так можно делать если в команде одна функция, а если их много?

    Вот, например, написал программку для нумерации блоков. Но я ее не с нуля писал, а взял готовые из книжки (САПР на базе..), просто собрал, доработал, усовершенствовал, написал диалог с разбором значений. Но этих функций в итоговую команду вошло 7 или 8 (примерно, точно не помню), а как организовать их загрузку, в один макрос затолкать?

    Вот из таких соображений...

    ОтветитьУдалить
  4. Ну возможно я себе не очень представляю ваши потребности... Тогда извинятйе:) А вообще для запуска итоговой команды можно сделать кнопку примерно такого содержания:
    ^C^C(if (not C:КОМАНДА) (load "НАЗВАНИЕ_ЛИСПА"));КОМАНДА;
    и получаете загрузку лиспа по нажатию на эту кнопку.

    ОтветитьУдалить
  5. Это я знаю.

    Постараюсь пояснить:
    -берем функцию для выбора примитивов (ru-ssentget-by-type, она фильтрует примитивы по типу и др.)
    -функция для преобразования набора в список
    -проверяем блок на наличие нужного атрибута
    -меняем значения атрибутов на заданные

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

    в основную программу входят функция сохранения окружения (ru-app-begin) и его восстановления по окончании работы программы (ru-app-end), диалог с разбором значений, сюда же входят обработчики ошибок и все такое. Итого, считая вложенные функции, около 10 получается. Причем эти функции типовые, они повторяются и в других программах. Отслеживать же все функции (особенно вложенные) проблематично, поэтому и такое решение. Да и авторы "САПР на базе...", Кулик Алексей советуют программы разделять на небольшие функции.

    ОтветитьУдалить
  6. кстати на YouTube выложил ролик с демонстрацией такой программки, если интересно то посмотреть можно здесь:
    http://www.youtube.com/user/shpolvind?feature=mhw5

    ОтветитьУдалить
  7. Понятно...
    А программка вкусненькая получилась ;)

    ОтветитьУдалить