Re: LISP. Открытие файлов WORD, EXCEL и других типов из папки активного DWG-чертежа

Денис! А нельзя ли сделать так, чтобы окно открывалось на последней открытой папке. У меня стоит AutoCAD 2002, и окно открывается всегда на той папке, в которой был открыт последний DWG-шный файл, а не файл какого-либо другого приложения. И, кстати, имена файлов DWG, содержащие скобки () игнорируются, сообщается Microsoft Visual Basic, что файл не найден.

Re: LISP. Открытие файлов WORD, EXCEL и других типов из папки активного DWG-чертежа

> Jedem_das_seine
Как сделать, чтобы окно открывалось на последней открытой папке, не знаю. Правда, и окно должно открываться не с папкой последнего открытого  DWG-файла, а с папкой активного, т.е. из которого вызывается программа,  DWG-файла. Насчет   имен DWG-файлов (да и папок) содержащих скобки, пока проверил на 2008, вроде все нормально. Позже проверю на других машинах с более ранними версиями  AutoCAD'а, но не уверен, что найду 2002-ой. Короче, буду разбираться и править.

Re: LISP. Открытие файлов WORD, EXCEL и других типов из папки активного DWG-чертежа

> Jedem_das_seine
Я проверил на 2002 Автокаде вариант > Денис Флюстиков (2007-06-13 11:37:10) Файл открылся. Название файла AutoLISP (Reference) Guide.doc
По поводу открытия на последней папке можно сделать так

;|=======================================
Открытие различных типов файлов из папки активного DWG-чертежа, а
при выборе bak или sv$-файлов с предварительным переводом их в DWG-формат
Программа Дениса Флюстикова "Open_Den" от 13.06.07
Увеличено количество видов открываемых файлов;
Активация DWG-чертежа без повторного открытия.
Макрос для кнопки: ^C^C^P(load "Open_Den");Open_Den
Большое спасибо VVA за помощь в доработке программы
===========================================|;
(defun c:Open_Den (/ a1 a2 a3 a4)
(if (setq a2
           (if *LAST_DIR*                              ;_ <= Add VVA 18.09.2007
             (getfiled "" *LAST_DIR* "*" 16)           ;_ <= Add VVA 18.09.2007
             (getfiled "" (getvar "dwgprefix") "*" 16) ;_ <= Add VVA 18.09.2007
             ))                                        ;_ <= Add VVA 18.09.2007
  (progn
(vl-load-com)
(setq *LAST_DIR* (strcat (vl-filename-directory a2) "\\")) ;_ <= Add VVA 18.09.2007 Запоминаем папку
(VL-PROPAGATE '*LAST_DIR*)                                 ;_ <= Add VVA 18.09.2007 Тиражируем во все открытые документы
(setq a1 (strcase a2 T))
(if (vl-filename-extension a2)
(cond ((wcmatch a1 "*.exe,*.cmd,*.com,*.pif,*.lnk,*.bat,*.msi,*.dat")
(vlax-invoke-method (setq a3 (vlax-get-or-create-object "wscript.shell"))
  "run" (strcat  "\"" a2  "\"") 1 :vlax-false)
(vlax-release-object a3)
)
      ((and (wcmatch a1 "*.bak,*.sv$")
      (wcmatch (read-line (setq a3 (open a1 "r"))) "AC10*")
      )
(close a3)
(setq a1 (vl-filename-base a2))
(if (findfile (strcat (vl-filename-directory a2) "\\""" a1 ".dwg"))
(setq a1 (strcat a1 (vl-filename-extension a2))
      a3 3)
(setq a3 1))
(while a3
(if (= a3 3)
(princ (strcat "\nПапка уже содержит DWG-файл \"" (vl-filename-base a1) "\""))
(if (= a3 1)
(princ (strcat "\nВосстановление DWG-файла \"" a1 "\""))
(if (= a3 0)
(princ "\nНедопустимый символ в имени файла")
(princ (strcat "\nПапка уже содержит DWG-файл \"" a1 "\"")))))
(if (= a3 2)
(setq a3 "\nНовое имя DWG-файла:")
(setq a3 (strcat "\nНовое имя DWG-файла или <" a1 ">:")))
(setq a3 (vl-catch-all-apply 'getstring (list T a3)))
(if (= (type a3) 'STR)(progn
(setq a3 (vl-string-translate "/\\:?<*\|\"" ">>>>>>>>" (vl-string-trim " " a3)))
(if (wcmatch a3 "*>*")
(setq a3 0)
(progn
(if (= a3 "")(setq a3 a1))
(setq a1 a3
      a3 (strcat (vl-filename-directory a2) "\\""" a3 ".dwg"))
(if (findfile a3)
(setq a3 2)
(setq a1 a3
      a3 nil))
))
)
(setq a1 nil a3 nil)
)
)
(if a1 (progn
(setvar "CMDECHO" 0)
(if (vl-file-rename  a2 a1)
(command "_.vbastmt" (strcat "AcadApplication.Documents.Open\42" a1 "\42"))
(princ "\nПереименовать файл не удалось"))
(setvar "CMDECHO" 1))
))
      ((wcmatch a1 "*.dwg,*.dwt,*.dxf,*.dws")
(setvar "CMDECHO" 0)
(setq a3 0)
(vlax-for doc (vla-get-Documents (vlax-get-acad-object))
(if (= (strcase (vla-get-fullname doc) T) a1)(progn
(princ (strcat "\n" a2 " в данный момент открыт"))
(command "_.vbastmt" (strcat "AcadApplication.Documents.Item(" (itoa a3) ").Activate"))
(setq a1 nil)
))
(setq a3 (1+ a3))
)
(if a1 (command "_.vbastmt" (strcat "AcadApplication.Documents.Open\42" a1 "\42")))
(setvar "CMDECHO" 1))
      (T
(if (setq a2 (vl-registry-read (strcat "HKEY_CLASSES_ROOT\\" (vl-filename-extension a1))))
(if (setq a3 (strcat "HKEY_CLASSES_ROOT\\" a2 "\\shell")
    a4 (vl-registry-descendents a3))
(progn (setq a4 (append '("open" "view") a4))
(while a4
(if (setq a2 (vl-registry-read (strcat a3 "\\" (car a4) "\\command")))
(setq a4 nil))
(setq a4 (cdr a4))))
(setq a2 nil)
))
(if a2 (progn
(if (= (type a2) 'LIST)(setq a2 (cdr a2)))
(setq a2 (strcase (vl-string-left-trim "\"" a2) T)
      a2 (substr a2 1 (vl-string-search "\"" a2))
      a2 (vl-string-subst "" "%systemroot%\\system32\\" a2)
      a1 (strcat "\"" a1 "\""))
(if (setq a3 (vl-string-search "%" a2))
(setq a2 (substr a2 1 a3)))
(if (setq a3 (vl-string-search ".exe " a2))
(setq a2 (substr a2 1 (+ a3 4))))
(if (not (wcmatch a2 "rundll32*"))
(setq a1 (strcat  "\"" a2  "\"" " " a1)))
(vlax-invoke-method (setq a3 (vlax-get-or-create-object "wscript.shell"))
  "run" a1 1 :vlax-false)
(vlax-release-object a3)
)
))
)
(setq a2 nil))
(if (null a2)(princ "\nПрограмма для открытия файлов данного типа не найдена"))
))
(princ)
)

Там написал все в коментариях, должно быть понятно. Путь к последней открытой папке сохраняется в пределах сеанса работы. Если есть необходимость, можно путь сохранять в реестр. Тогда будет без разницы, в каких сеансах или Автокадах запускается команда.

Re: LISP. Открытие файлов WORD, EXCEL и других типов из папки активного DWG-чертежа

> VVA
Даже иногда стыдно свои коды показывать среди профессионалов, которые моментально находят красивые решения. Спасибо

Re: LISP. Открытие файлов WORD, EXCEL и других типов из папки активного DWG-чертежа

Денис и Владимир! Последний вариант работает на ура, но с файлами со скобками в имени не понятно ничего. Может в 2002 есть какие-нибудь ограничения, хотя в имеющейся литературе на русском не нашел даже намеков.

Re: LISP. Открытие файлов WORD, EXCEL и других типов из папки активного DWG-чертежа

> Jedem_das_seine
У меня работает на 2002. Тестовый файл назывался AutoLISP (Reference) Guide.doc и открылся без проблем. Здесь от Автокада не должно зависеть, т.к. вызывается метод "Run" объекта wscript.shell. Причем указанный файл берется в кавычки  "" (на случай длинных имен и т.п.)
См. a1 (strcat "\"" a1 "\""))

Re: LISP. Открытие файлов WORD, EXCEL и других типов из папки активного DWG-чертежа

Владимир, речь идет о DWG-файлах со скобками в именах, файлы *.DOC открываются без проблем.
Кстати, все дело, возможно, во вложенности файлов.
Попробовал создать каталог со следующим путем C:\Downloads\software\111\222\333\444\555\6666\777\Корпус 555 (612 002).dwg - открывается без вопросов.
Но если пробую открыть тот же файл с путем C:\Documents and Settings\designers\Мои документы\AutoCad\Ювелирка\Запрессовка втулок (612)\Корпус 555 (612 002).dwg (это место где файл изначально создан и находится) - при открытии сообщается Microsoft Visual Basic, что файл не найден, однако в падающем меню "файл", в списке недавно открытых файлов появляется "корпус 55"

Re: LISP. Открытие файлов WORD, EXCEL и других типов из папки активного DWG-чертежа

> Денис Флюстиков
Здравствуйте!
Скачала программу, но не уверенна правильно ли я поняла ее суть. Предположим мне нужно вставить doc файл в dwg файл. Сможет ли мне помочь в этом Ваша программа?
Спасибо

Re: LISP. Открытие файлов WORD, EXCEL и других типов из папки активного DWG-чертежа

> Olga
Прошу прощения, раньше ответить не мог.
Программа только сможет открыть doc файл, точнее это сделает не сама, а с помощью приложения, которое записано в реестре за этим типом файлов. В принципе эту функцию сможет выполнить макрос:
^P^C^C(startapp "explorer.exe" (strcat "/n,/e," (getvar "dwgprefix")))(princ)
(с форума dwg.ru)

(изменено: Владимир Азарко, 22 июля 2009г. 10:59:24)

Re: LISP. Открытие файлов WORD, EXCEL и других типов из папки активного DWG-чертежа

> [B]Денис[/B]
Нашел в интернете еще один вариант запуска файлов с помощью  зарегистрированных приложений. Может будет интересно.


(defun xopen(name / di na sh)
;; http://www.theswamp.org/index.php?topic=29548.0
;;;Usage
;;;(setq my_file (xopen "c:/test.txt"))
;;;(setq my_file (xopen "c:/test.avi"))
;;;(setq my_file (xopen "c:/test.3gp"))

  (and    (setq name (findfile name))
    (setq sh (vlax-create-object "Shell.Application"))
    (setq di (vlax-invoke sh 'Namespace (vl-filename-directory name)))
    (setq na (vlax-invoke di 'parsename (strcat (vl-filename-base name) (vl-filename-extension name))))
    (vlax-invoke-method na 'invokeverbex "open")
  )
  (vlax-release-object sh)
  na
)

Re: LISP. Открытие файлов WORD, EXCEL и других типов из папки активного DWG-чертежа

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

Re: LISP. Открытие файлов WORD, EXCEL и других типов из папки активного DWG-чертежа

Владимир Азарко,
Доброго Вам времени суток Владимир, Не прошло и года. В предложенном варианте. Программа открывает выше изложенные файлы. И при всём умещается в 10 строчках. Кроме всего её можно посадить на кнопку? :)

Re: LISP. Открытие файлов WORD, EXCEL и других типов из папки активного DWG-чертежа

Valery Brelovsky, Можно на кнопку, можно создать команду с указанием открываемого файла. Вопрос в твоем последнем предложении что означает ?

Re: LISP. Открытие файлов WORD, EXCEL и других типов из папки активного DWG-чертежа

Владимир Азарко, Вопрос он относительно кнопки. А с остальным разобрался. Программа сама по ссылке. Это в общем то не мне. На работе сотруднику надо. Сам я работаю проще, мне не надо открывать другие программы из Автокада.  :)