Начало работы в AutoCAD с файлов открытых в прошлой сессии
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Начало работы в AutoCAD с файлов открытых в прошлой сессии

Начало работы в AutoCAD с файлов открытых в прошлой сессии

Ответ
Поиск в этой теме
Непрочитано 12.11.2007, 11:16 #1
Начало работы в AutoCAD с файлов открытых в прошлой сессии
Krieger
 
инженер (КМ)
 
Красноярск
Регистрация: 30.10.2004
Сообщений: 3,837

Можно ли начинать работу в AutoCAD с файлов открытых в прошлой сессии?
Или как программно открыть файл в запущенном AutoCAD? Только не через (command "_open" path)
Просмотров: 5540
 
Непрочитано 12.11.2007, 11:34
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,377


Теоретически - можно. Вопрос только в том, где хранить данные о последних сохраненных файлах. Потребуется командный реактор, наверное. Ну или отдельно, руками запускаемый лисп. К примеру, так:
Код:
[Выделить все]
(vl-load-com)
(setq *reg-path* "HKEY_CURRENT_USER\\Software\\Autodesk\\DWG\\Saved")

(defun _open-last-files (/ lst _kpblc-string-parser)
  (defun _kpblc-string-parser (string separator / i)
                              ;|
*    Функция разбора строки. Возвращает список либо точечную пару.
*    Параметры вызова:
*	string		разбираемая строка
*	separator	символ, используемый в качестве разделителя частей
*    Примеры вызова:
(_kpblc-string-parser "1;2;3;4;5;6" ";")	;'(1 2 3 4 5 6)
(_kpblc-string-parser "1;2" ";")		;'(1 . 2)
*    За основу взяты уроки Евгения Елпанова по рекурсиям
|;
    (cond
      ((= string "") nil)
      ((setq i (vl-string-search separator string))
       (cons (substr string 1 i)
             (_kpblc-string-parser
               (substr string (+ (strlen separator) 1 i))
               separator
               ) ;_ end of _kpblc-string-parser
             ) ;_ end of cons
       )
      (t (list string))
      ) ;_ end of cond
    ) ;_ end of defun
 ;_ end of defun

  (if (setq lst (vl-registry-read *reg-path* "Names"))
    (foreach item (_kpblc-string-parser lst ";")
      (if (vl-catch-all-error-p
            (setq err
                   (vl-catch-all-apply
                     '(lambda ()
                        (vla-open (vla-get-documents (vlax-get-acad-object)) item)
                        ) ;_ end of lambda
                     ) ;_ end of vl-catch-all-apply
                  ) ;_ end of setq
            ) ;_ end of VL-CATCH-ALL-ERROR-P
        (princ (strcat "\nОшибка открытия файла "
                       item
                       " : "
                       (vl-catch-all-error-message err)
                       ) ;_ end of strcat
               ) ;_ end of princ
        ) ;_ end of if
      ) ;_ end of foreach
    ) ;_ end of if
  (princ)
  ) ;_ end of defun

(defun _save-files (/ lst count)
  (vlax-for doc (vla-get-documents (vlax-get-acad-object))
    (if (= (vlax-variant-value (vla-getvariable doc "dbmod")) 0)
      (setq lst (cons (vla-get-fullname doc) lst))
      ) ;_ end of if
    ) ;_ end of vlax-for
  (vl-registry-write
    *reg-path*
    "Names"
    (vl-string-trim
      ";"
      (apply 'strcat (mapcar '(lambda (x) (strcat x ";")) lst))
      ) ;_ end of vl-string-trim
    ) ;_ end of vl-registry-write
  (princ)
  ) ;_ end of defun
Нечто типа такого...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 12.11.2007, 12:18
#3
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


Я так понял _save-files сохраняет, а _open-last-files запускает сохраненный файлы?
Не работает. И ни чего не пишет.
Krieger вне форума  
 
Непрочитано 12.11.2007, 12:24
#4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,377


Во моя дурная привычка не писать команды... Вызов - со скобками, то есть (_open-last-files) и (_save-files) соответственно. для работы надо иметь права на запись в реестр, ветка HKEY_CURRENT_USER\Software\AutoCAD. Сохраняются только имена файлов, которые были сохранены. Имена файлов, которые были изменены, не хранятся.
А, стоп, я ж dbmode проверяю... Попробуй заменить _save-files на
Код:
[Выделить все]
(defun _save-files (/ lst count)
  (vlax-for doc (vla-get-documents (vlax-get-acad-object))
    (if (and (equal (vla-get-saved doc) :vlax-true)
             (/= (vla-get-fullname doc) "")
             ) ;_ end ofand
      (setq lst (cons (vla-get-fullname doc) lst))
      ) ;_ end of if
    ) ;_ end of vlax-for
  (vl-registry-write
    *reg-path*
    "Names"
    (vl-string-trim
      ";"
      (apply 'strcat (mapcar '(lambda (x) (strcat x ";")) lst))
      ) ;_ end of vl-string-trim
    ) ;_ end of vl-registry-write
  (princ)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 12.11.2007, 13:09
#5
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


Да то что это функции, а не команды понятно...

(/= (vla-get-fullname doc) "") выдает nil хоть тресни и дальше соответсвенно ничего не двигается.

В переменной doc у fullname пустая строка.
Krieger вне форума  
 
Непрочитано 12.11.2007, 13:27
#6
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,377


Так значит документ еще не сохранен. Вообще нигде и ни разу. Открой пару-тройку файлов (любых), поменяй их и сохрани; потом вызови (_save-files). Для контроля проверь значения в ветке реестра HKEY_CURRENT_USER\Software\Autodesk\DWG\Saved - там должен быть всего один параметр, где через символ ";" перечислены полные имена файлов. Есть?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.11.2007, 14:17
#7
Alan

CAD
 
Регистрация: 28.08.2003
Киев
Сообщений: 1,834
<phrase 1=


Цитата:
Сообщение от Krieger Посмотреть сообщение
Можно ли начинать работу в AutoCAD с файлов открытых в прошлой сессии?
Или как программно открыть файл в запущенном AutoCAD? Только не через (command "_open" path)
Так и хочется вспомнить добрым словом "Проектный центр Автокада 2002"
Зачем его убрали, кому мешал, кто знает? Архиполезнейшая штука!
__________________
По теории майский жук летать не может.
Но он этого не знает. И летает...
Alan вне форума  
 
Автор темы   Непрочитано 12.11.2007, 16:50
#8
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Так значит документ еще не сохранен. Вообще нигде и ни разу. Открой пару-тройку файлов (любых), поменяй их и сохрани; потом вызови (_save-files). Для контроля проверь значения в ветке реестра HKEY_CURRENT_USER\Software\Autodesk\DWG\Saved - там должен быть всего один параметр, где через символ ";" перечислены полные имена файлов. Есть?
Ну здрасти, не сохранен..., все сохранено, подредактировано и еще раз сохранено...
Однако, дома чудесным образом заработало... Завтра на работе еще раз гляну. Только неизменяемые файлы тоже надо открывать.
Krieger вне форума  
 
Автор темы   Непрочитано 13.11.2007, 06:09
#9
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


Кулик Алексей aka kpblc

Спасибо. Все работает.
Krieger вне форума  
 
Непрочитано 13.11.2007, 08:16
#10
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,377


Я сейчас подумал - возможно, при большом количестве файлов или длинных путях до них могут быть проблемы (если строки в реестре не хватит на общую длину). Тогда понадобится переделывать.
Идея пришла в мою дурную голову: а если еще и по сессиям распределять? Типа "сессия от 10.10.2007 - файлы <...>"; "сессия от 12.11.2007 - файлы <...>". Да еще окно прописать... Да еще инсталлятор сделать... Не, зря я ночь не спал
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 13.11.2007, 08:30
#11
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


Разделить по сессиям канечно можно, но не очень это надобно. Обычно ты работаешь над одним проектом несколько дней, для чего открываешь необходимые файлы. Вот их и надо загружать скопом. А чего я делал месяц назад я и не вспомню. Лучше доработай этот вариант.
1. Я могу открывать файл только для просмотра или копирования от туда чего либо, но сохранять я его не буду. Однако он понадобится в следующей сессии.
2. При начале работы запускается файл из шаблона, а он мне в данный момент не нужен. Можно ли закрыть не сохраненный файл с названием Drawing1.dwg при нажатии кнопки с функцией (_open-last-files)?
Krieger вне форума  
 
Непрочитано 13.11.2007, 09:40
#12
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,377


Попробовал уйти от ограничения (если оно вообще есть) длины строки реестра. Снято требование на сохраненность файла. Исключена ошибка попытки повторного открытия файла.
Код:
[Выделить все]
(vl-load-com)
(setq *reg-path* "HKEY_CURRENT_USER\\Software\\Autodesk\\DWG\\Saved")

(defun _open-last-files (/ lst err docs)
  (setq docs ((lambda (/ res)
                (vlax-for doc (vla-get-documents (vlax-get-acad-object))
                  (setq
                    res
                     (cons
                       (strcase (strcat (vla-get-path doc) "\\" (vla-get-name doc)))
                       res
                       ) ;_ end of cons
                    ) ;_ end of setq
                  ) ;_ end of vlax-for
                res
                ) ;_ end of lambda
              )
        ) ;_ end of setq
  (if (setq lst (vl-registry-descendents *reg-path* "@"))
    (progn
      (foreach file
                    (vl-sort
                      (mapcar '(lambda (x)
                                 (cons (atoi (vl-string-trim "file" x))
                                       (vl-registry-read *reg-path* x)
                                       ) ;_ end of cons
                                 ) ;_ end of lambda
                              lst
                              ) ;_ end of mapcar
                      '(lambda (a b) (< (car a) (car b)))
                      ) ;_ end of vl-sort
        (if
          (vl-catch-all-error-p
            (setq
              err (vl-catch-all-apply
                    (function
                      (lambda ()
                        (if (not (member (strcase (cdr file)) docs))
                          (vla-open (vla-get-documents (vlax-get-acad-object))
                                    (cdr file)
                                    ) ;_ end of vla-open
                          ) ;_ end of if
                        ) ;_ end of lambda
                      ) ;_ end of function
                    ) ;_ end of vl-catch-all-apply
              ) ;_ end of setq
            ) ;_ end of vl-catch-all-error-p
           (princ (strcat "\nОшибка открытия файла "
                          (cdr file)
                          " : "
                          (vl-catch-all-error-message err)
                          ) ;_ end of strcat
                  ) ;_ end of princ
           ) ;_ end of if
        ) ;_ end of foreach
      ) ;_ end of progn
    ) ;_ end of if
  (princ)
  ) ;_ end of defun

(defun _save-files (/ lst count)
  (vlax-for doc (vla-get-documents (vlax-get-acad-object))
    (if (/= (vla-get-fullname doc) "")
      (setq lst (cons (vla-get-fullname doc) lst))
      ) ;_ end of if
    ) ;_ end of vlax-for
  (vl-registry-delete *reg-path*)
  (if (and lst (> (setq count (length lst)) 0))
    (foreach item lst
      (vl-registry-write
        *reg-path*
        (strcat "file" (itoa (1+ (setq count (1- count)))))
        item
        ) ;_ end of vl-registry-write
      ) ;_ end of foreach
    ) ;_ end of if
  (princ)
  ) ;_ end of defun
Закрывать файл Drawing.dwg можно, конечно, но я не рискнул бы - у тебя там могут быть выполнены временные построения; имя может быть Drawing156.dwg ну и тому подобное.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.11.2007, 10:02
#13
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


А список последних сохраненных файлов в меню "File" ("Файл") разве не годится?
Profan вне форума  
 
Автор темы   Непрочитано 13.11.2007, 10:07
#14
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


Именно Drawing1.dwg или Рисунок1.dwg и ничего другого. Этот файл не сохранен. Просто отправить на него команду _close, а если там были построения, то кад спросит сохранить или нет. Кстати если самим это проверить, при изменении начального документа его не надо закрывать. Кстати AutoCAD так и делает, если включить AutoCAD и ничего не делая в начальном файле открыть сразу другой файл, то пустой закрывается.
Хотя вобщем, так как активным остаётся после загрузки файлов именно Drawing1.dwg, то вопрос можно частично решить, добавив команду к макросу:
^C^C(_open-last-files);_close

Profan
Не годится. Я поработал, и начал ерундой заниматься, какой-нить динблок стряпать штук 10. И этот список испортится. И потом там вроде сохраняются не закрытые файлы, а открытые.
Krieger вне форума  
 
Непрочитано 13.11.2007, 10:13
#15
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Да, такое бывает. В список попадает всякая ерунда. А разве эта же ерунда не попадет и в список в программе?
Profan вне форума  
 
Непрочитано 13.11.2007, 10:15
#16
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,377


Krieger, а если у тебя лиспы засунуты в startup suite (то бишь автозагрузка), а файл ты открыл двойным кликом на нем? И при этом (файл-то по сути временный, но сейчас нужный) файл имеет имя Drawing1.dwg?
Думаю, что проще всего будет сделать 2 отдельные кнопки: одна на простое открытие сохраненных файлов; вторая - с закрытием текущего, как ты показал.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 13.11.2007, 10:43
#17
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


Profan, не поподает, так как функция (_save-files) весит на кнопке. Нажал, т.е. закончил работу, и только после этого начал заниматься ерундой.

Кулик Алексей aka kpblc, ну во-первых, нету у меня сохраненных файлов с названием Drawing1.dwg, хотя нет, в папке "мусор" есть. Но ведь он сохранен, а значит не трогаем. Т.е. если (vla-get-FullName (vla-get-Documents(vlax-get-acad-object))) выдаст "", а (vla-get-Name doc) выдаст Drawing1.dwg - мочим. Вроде так... Ну, в принцепе, это и сам попробую доделать.
Krieger вне форума  
 
Непрочитано 13.11.2007, 11:35
#18
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


А если не пачкать реестр, а записывать в файл, типа такого:
Код:
[Выделить все]
 
(defun C:rec_dwg ( / name_dwg fil fl )
(command "_QSAVE")
(setq name_dwg (strcat (getvar "DWGPREFIX") (getvar "DWGNAME")))
(setq fil "E:\\recent\\rec_dwg.txt")
       (if (not (findfile fil))
           (progn
           (setq fl (open fil "w"))
           (princ name_dwg fl)
           (princ "\n" fl)
           (close fl)
           )
           (progn
           (setq fl (open fil "a"))
           (princ name_dwg fl)
           (princ "\n" fl)
           (close fl)
           )
           )
(princ)
)
А потом вытаскивать имена файлов из списка...
Profan вне форума  
 
Непрочитано 13.11.2007, 11:43
#19
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,377


Файловые операции в Windows под доменом могут не выполняться (Добавлено: имею в виду запись в программные каталоги). И потом, плодить файлы черт-те где, а потом их собирать... Не гуд. txt-файл должен храниться так, чтоб его acad в любой момент мог найти. Независимо ни от чего. Сохранение в каталоге текущего документа нужного эффекта, скорее всего, не даст.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.11.2007, 11:55
#20
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Так наверняка есть папка, прописанная в AutoCAD'е. А чего плодить? Нужен всего один файл *.txt. Немного лишь развить программу. Ладно, дело хозяйское (доменное).
Profan вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Начало работы в AutoCAD с файлов открытых в прошлой сессии



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Открытие нескольких файлов в одном окне AutoCad TanyaNuri AutoCAD 67 17.01.2023 13:04
запуск программы из AutoCADа kminas Программирование 19 15.06.2012 13:42
Разделение работы AutoCAD | AutoCAD Mechanical PVal Вертикальные решения на базе AutoCAD 3 23.03.2012 10:16
Уже работаю в AutoCAD 2006, но нужна книжка чтобы знать все тонкости работы с 2D графикой. Unt0nich Поиск литературы, чертежей, моделей и прочих материалов 17 06.05.2008 17:58