CAD-страница НП | Статьи | English

C.И.Васильев. "Маленькие хитрости текущего каталога"

В данной статье предлагаю вниманию читателя упражнение, показывающее необычное поведение некоторых функций AutoLISP при работе с файлами в версиях AutoCAD, начиная с 2002, на примере функции OPEN.

В документации к AutoLISP формат функции OPEN для чтения файлов указывается в следующем виде: (OPEN <имя файла> "r"), где <имя файла> может быть указано как с описанием полного пути к файлу (например, "c:\\razv_nn\\1451\\korsht"), так и без полного пути, т.е. korsht. Во втором случае используется путь, который в первоисточнике называется "AutoCAD default drawing directory". В нашей литературе он исторически называется "текущим каталогом", и мы будем этого придерживаться.

Для демонстрации некоторых особенностей функции OPEN скопируйте на свой компьютер из архива две папки: FOLDER1 и FOLDER2, которые содержат файлы:
FOLDER1: acad.dwg, korsht1, 1-1.dwg
FOLDER2: korsht2, 1-2.dwg

1. Войдите в AutoCAD, дважды щелкнув по файлу ACAD.DWG. Понятно, что при этом "текущим каталогом" будет FOLDER1.

2. Наберите в командной строке:
Команда: (open "korsht1" "r")
#<file "korsht1">

Последняя строка означает, что файл KORSHT1 обнаружен и открыт.

3. Нажмите клавишу "стрелка вверх" для вызова последней команды и исправьте имя файла KORSHT1 на KORSHT2. Нажмите ENTER.
Команда: (open "korsht2" "r")
nil

Все верно, последний nil свидетельствует о том, что файл KORSHT2 не обнаружен в текущем каталоге.

4. Выполните вставку файла 1-2.dwg как блока:
Вставка => Блок => FOLDER2 => 1-2.dwg
Команда: _insert
Укажите точку вставки или [Базовая точка/Масштаб/Поворот/ПМасштаб/ППоворот]:
Укажите масштаб <1>:

5. Выбором клавиши "стрелка вверх" проверим работу функции OPEN:
Команда: (open "korsht1" "r")
#<file "korsht">

Команда: (open "korsht2" "r")
nil

Пока не произошло никаких изменений.

6. Повторно выполните вставку файла 1-2.dwg как блока и проверку функции OPEN (во второй раз необходимо вставить блок 1-2 с переопределением существующего в чертеже одноименного блока):
Команда: (open "korsht1" "r")
nil

Команда: (open "korsht2" "r")
#<file "korsht2">

ВНИМАНИЕ! Результаты противоположны предыдущим! Файл KORSHT1 не обнаружен, зато файл KORSHT2 вдруг оказался доступен для открытия, т.е. теперь текущим каталогом стал FOLDER2.

7. Как теперь обеспечить чтение файла KORSHT1? Один из возможных способов следующий:
Команда: (open (strcat (getvar "dwgprefix") "korsht1") "r")
#<file "C:\\Razv_14.nn\\folder1\\korsht1">

Здесь использовано значение системной переменной DWGPREFIX, в которой находится путь к папке рисунка.

8. Можно восстановить значение текущего каталога на FOLDER1, дважды вставив блок 1-1.dwg (во второй раз необходимо вставить с переопределением существующего в чертеже блока 1-1):
Команда: _insert
Укажите точку вставки или [Базовая точка/Масштаб/Поворот/ПМасштаб/ППоворот]:
Укажите масштаб <1>:
Команда: _insert
Укажите точку вставки или [Базовая точка/Масштаб/Поворот/ПМасштаб/ППоворот]:
Укажите масштаб <1>:

9. Выбором клавиши "стрелка вверх" проверим работу функции OPEN:
Команда: (open "korsht1" "r")
#<file "korsht1">

Команда: (open "korsht2" "r")
nil

Все вернулось на место.

ВЫВОДЫ:

1. Некоторые команды AutoCAD, работающие с файлами (в частности, команда вставки блока _INSERT), изменяют значение переменной, в которой находится путь, принимаемый по умолчанию, т.е. текущий каталог. Аналогичные проблемы возникают после выполнения команды вставки внешней ссылки (_XATTACH). Возможно, что и некоторые другие команды AutoCAD приводят к подобным проблемам.

2. Функции AutoLISP, работающие с файлами (OPEN, VL-FILE-DELETE, VL-FILE-COPY и др.) ведут себя в этом случае НЕПРЕДСКАЗУЕМО (формулировка Н.Н.Полещука).

3. При программировании в AutoLISP следует воздержаться от использования функций, работающих с файлами, без указания полного пути.

4. Одним из способов решения данной проблемы является использование системных переменных (в частности, DWGPREFIX).

Васильев Сергей Изотович, г. Нижний Новгород
Тел. (8312) 64-57-45
E-mail: razv_nn@mail.ru

CAD-страница НП | Статьи | English