Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Исходные тексты на AutoLISP
.:LAVteam:. > Инженерный форум > AutoCAD - утилиты и разработка ПО
kpblc
Для гарантированного поиска можно попробовать такой лиспик:
Код
(defun try-to-find (file / tmp _kpblc-string-parse-to-list res)

  (defun _kpblc-string-parse-to-list (str pat / i)
;;;    Разбивка строки на список подстрок через разделитель
;;;    Параметры вызова:
;;;   str   строка
;;;   divider   разделитель
;;;    Возвращает список из подстрок. Примеры вызова:
;;;(_kpblc-string-parse-to-list "string" "r")  ; '("st" "ing")
;;;(_kpblc-string-parse-to-list "string" "a")  ; '("string")
    (cond
      ((= str "") nil)
      ((setq i (vl-string-search pat str))
       (cons
         (substr str 1 i)
         (_kpblc-string-parse-to-list (substr str (+ 2 i)) pat)
         );_ end of cons
       )
      (t (list str))
      );_ end of cond
    );_ end of defun

  (vl-load-com)
  (foreach item
           (_kpblc-string-parse-to-list
             (vla-get-supportpath
               (vla-get-files (vla-get-preferences (vlax-get-acad-object)))
               );_ end of vla-get-supportpath
             ";"
             );_ end of _kpblc-string-parse-to-list
    (if
      (and (not res)
           (setq tmp (findfile (strcat (vl-string-right-trim "//" item) file)))
           );_ end of and
       (setq res tmp)
       );_ end of if
    );_ end of foreach
  res
  );_ end of defun

Пример вызова:
Код
_$ (try-to-find "3d.fas")
"C:\\Program Files\\Autodesk Architectural Desktop 2005\\Support\\3d.fas"
_$ (try-to-find "\\3d.fas")
"C:\\Program Files\\Autodesk Architectural Desktop 2005\\Support\\3d.fas"

Похоже, при ином подходе у тебя кад просто не находит vlx...
Barma1ey
В этот топик будем постить всевозможные исходные тексты на языке AutoLISP, а также ссылки на них и ресурсы по разработке.
Luka
Отличная мысль, но с комментирование подробным, хотя бы на уровне, для чего и как юзать -)
kpblc
Слегка оффтопа, потом конкретика smile.gif
[<offtopic>]Перефразируя известный стишок, "адды разные нужны, адды разные важны". Исходников по инету масса, некоторые из них достаточно интересны и нужны. Их все надо подгружать в акад, чтобы они работали.[/<offtopic>]
[Не<offtopic>]Для загрузки приложений существует несколько путей.
1. Если приложение (lsp / vlx / fas / arx) одно, его проще всего загружать, используя команду _appload и в окошке - жать на "Портфель" (StartupSuite). Приложения, перечисленные в StartupSuite, загружаются во все профили AutoCAD'a и во все документы, и загружаются они, как правило, после штатных и перед теми, которые прописаны в остальных методах. Среди несомненных плюсов метода можно отметить, что путь к файлу приложения можно не прописывать в _options -> Files -> Support files path (Настройка -> Файлы -> Пути поддержки). Среди минусов - невозможно использовать относительные пути, только абсолютные. Со всеми вытекающими.
2. Использовать один из штатных "автозагрузчиков" - acad.lsp / acad2000.lsp / acaddoc.lsp / acad2000doc.lsp, прописывая в них команды наподобие
Код
(load (findfile "c:\\mylisps\\adds\\main.lsp")
Метод немногим отличается от п.1
3. Для приложений, которые используют меню, можно в качестве макроса (той команды, что "прописана" на кнопке) использовать нечто наподобие:
Код
^C^C^P(if (not (<ИмяКоманды>)) (load <ПутьДоФайлаОписания>));<ИмяКоманды>

Сам я этот метод принципиально не использую, так что если нужны подробности - то немного позже, просто уточнить тонкости понадобится.
4. Опять же, если используется меню. Если имя файла меню, например, такое - MyFunniesAndPerfectMenu (расширение файла - mnu, mns, или cui - в принципе пофигу), рядом с файлом самого меню можно положить файл MyFunniesAndPerfectMenu.mnl. Это обычный лисп-файл, в котором можно прописывать все что угодно.[/Не<offtopic>]
[Конкретика]Так вот, лично мой опыт меня убедил, что проще всего использовать именно 4-й путь. То есть создается свое меню, и рядышком кладется файл mnl, в котором прописывается полный загрузчик.
Все исполняемые файлы приложений (дальше просто не буду расшифровывать, на самом деле подразумеваю файлы с расширениями lsp, fas, vlx, arx) я скидываю в один каталог (например, d:\files\cad\adds). С разбивкой по подкаталогам, как мне сейчас интересно и важно. Неиспользуемые / отлаживаемые / криво написанные лиспы кидаются в отдельный каталог, например d:\files\cad\error_adds - чтобы они не лезли в общую картину. Создается собственное меню (штатные без крайней необходимости стараюсь не трогать) - обычный текстовый файлик с расширением .mnu и рядом с ним - .mnl.
Внутри mnl прописываю загрузчик, одним из следующих методов:
- сначала обязательно функция загрузки - на выбор:
Код
(vl-load-com)

(defun z-files-in-directory (directory pattern nested /)
                          ;|
*    функция 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)
http://www.autocad.ru/cgi-bin/f1/board.cgi?t=19612AN
|;
  (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)
                       );_ end of vl-remove
            );_ 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
              );_ end of mapcar
      );_ end of apply
    );_ end of if
  );_ end of defun

либо
Код
;|
Автор: Евгений Елпанов
http://www.autocad.ru/cgi-bin/f1/board.cgi?t=32891aD
Функция поиска файла или файлов в указанной папке и всех вложенных папках
файл задается именем или маской

Аргументы:
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"
  )
|;
(defun GetFile (f p)
;; By ElpanovEvgeniy
;; (getfile "acad*.lsp" "C:\\Program Files")
(apply (function append)
        (cons (if (vl-directory-files p f)
               (mapcar (function (lambda (x) (strcat p "\\" x))) (vl-directory-files p f))
              );_ if
              (mapcar (function (lambda (x) (GetFile f (strcat p "\\" x))))
                      (vl-remove ".." (vl-remove "." (vl-directory-files p nil -1)))
              );_ mapcar
        );_ cons
);_ apply
)

Использую вариант z-files-in-directory, скорее всего, в силу привычкиsmile.gif
И дальше в том же самом mnl пишу примерно так:
Код
(defun kpblc-loader (/ err_lst err_msg)
  (setq *kpblc-path-add-execute* "d:\\files\\cad\\adds")
  (mapcar
    '(lambda (x / err)
       (foreach item (z-files-in-directory
                       *kpblc-path-add-execute*
                       (strcat "*." x)
                       t
                       );_ end of z-files-in-directory
        ; Следующая строка носит чисто иллюстративный характер
         (princ (strcat "\nЗагружаю файл " (vl-princ-to-string item)))
         (if (vl-catch-all-error-p
               (setq err (vl-catch-all-apply
                           '(lambda ()
                              (if (= x "arx")
                                (arxload item)
                                (load item)
                                );_ end of if
                              );_ end of lambda
                           );_ end of vl-catch-all-apply
                     );_ end of setq
               );_ end of vl-catch-all-error-p
           (setq err_lst
                  (cons (cons item (vl-catch-all-error-message err)) err_lst)
                 );_ end of setq
           );_ end of if
         );_ end of foreach
       );_ end of lambda
    '("arx" "lsp" "fas" "vlx")
    );_ end of mapcar
  (if err_lst
    (alert
      (strcat "Не могу загрузить файлы:"
              (vl-string-right-trim
                "\n"
                (mapcar 'strcat
                        (mapcar '(lambda (x) (strcat (car x) " : " (cdr x) "\n"))
                                (reverse err_lst)
                                );_ end of mapcar
                        );_ end of mapcar
                );_ end of vl-string-right-trim
              );_ end of strcat
      );_ end of alert
    );_ end of if
  );_ end of defun

(kpblc-loader)

Если чего неясно - сообщите, будем разбирать дальше smile.gif
Barma1ey
Думаю, из вышестоящего поста стоит сделать часть FAQ'а для данного раздела, а именно по подгрузке приложений под Акад. Остальное со временем добавится.
kpblc
Немного еще порастекаюсь мыслию по древу smile.gif - расскажу о некоторых ограничениях, с которыми я столкнулся.
Многие рекомендуют закидывать поставляемые лиспы / меню / блоки в пути поддержки када. Ну или прописать в них путь до своей папки. Но:
1. Общее количество путей не может превышать то ли 12, то ли 16 штук - точно не помню цифру, но ограничение 100% есть.
2. По (неподтвержденной) информации, если "сложить" все пути, разделив их символом ";", то общая длина строки не может превышать 256 символов (скорее всего, информация больше относится к старым версиям када, но проверять на собственной шкуре не хочется).
Теперь о том, что здесь будет, так сказать, "в общем". "Для чего и как юзать" smile.gif
Для чего - ну это будет и так видно, по запросу. Например, "надо перевести все примитивы в настройки ПоСлою, а то, что входит внутрь блоков - ПоБлоку". Пишется лисп / vba, назначение которого уже из запроса понятно smile.gif
Как определять язык, на котором написано, и как вызывать.
Если в коде присутствует огромное количество скобок (как правило, по нескольку штук на одну строку), то это - лисп. Если же в коде есть строки типа Sub MyMainSub(), Function EvaluateFunc() и т.д., то это - vba. О вызове и прописывании на меню можно, конечно, отправить на dwg.ru/art/2 и dwg.ru/art/8, а можно и здесь порассуждать smile.gif Как удобнее?
===
Добавлено:
О, и еще момент. ИМХО при запросе обязательно надо указывать, для какой платформы и какой версии выполнять решения. Потому как то, что прокатывает на "чистом" acad'e, может не прокатить, например, на adt. В зависимости от версии acad'a могут меняться опции команд (если они используются). А уж про bricscad или связку "acad lt + lt extender" я вообще молчу smile.gif
Aikok
(setq r1 (getreal "\nдлина,м: ")
o1 (getreal "\nВысота,м: ")
r2 (getreal "\nДлина,м: ")
o2 (getreal "\nВысота,м: "))

[i][b] (setq mg (getreal "\nМасштаб горизонтальный,1: ")
mv (getreal "\nМасштаб вертикальный,1: ")
r (getreal "\nРасстояние,м ")
o (getreal "\nВысота,м ")
k (getreal "\nРасстояние,м ")
l (getreal "\nВысота,м ")
r1 (+ 60 (/ (* r 1000) mg))
o1 (+ 100 (/ (* o 1000) mv))
k1 (+ 60 (* k 0.5))
l1 (+ 100 (* l 10))
ro (list r1 o1)
kl (list k1 l1))
(command "Отрезок" ro kl "")
)

Как видоизменить чтобы чертил отрезок только по ro повторенный n число раз?
Ramzes
вот такая штука попалась.
http://www.cad.dp.ua/links/links6.php
artivilius
please mate, can you share autolisp software?? or tell me where can I get it
thanks
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.