ЛИСП код для копирования файла из известной папки в папку с путем из автокада
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > ЛИСП код для копирования файла из известной папки в папку с путем из автокада

ЛИСП код для копирования файла из известной папки в папку с путем из автокада

Ответ
Поиск в этой теме
Непрочитано 14.06.2013, 12:27 #1
ЛИСП код для копирования файла из известной папки в папку с путем из автокада
UniquE
 
г.Пермь
Регистрация: 14.06.2013
Сообщений: 4

Прошу помощи у знатоков AutoLISP.

Суть вопроса такова: Надо автоматизировать процесс копирования файла настройки принтера из сетевого ресурса на локальное рабочее место.

Теперь подробнее:
1. Есть сетевой ресурс на котором лежит файл настройки принтера (имя файла и пути известны) - отнесем это к исходным данным.
2. В настройках автокада есть путь к папке с плоттерами, команда "_plottermanager" - путь к этой папке необходимо извлекать, как я понимаю.
А сделать надо следующее: из папки (см. п.1) скопировать файл, скажем "ТЕСТ.pc3", в папку с плоттерами, путь к которой будет извлечен из настроек автокада (см. п.2).

Можно ли такое провернуть средствами АвтоЛИСП-а?
Надеюсь, я доступно объяснил.
Просмотров: 4462
 
Непрочитано 14.06.2013, 13:08
#2
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от UniquE Посмотреть сообщение
В настройках автокада есть путь к папке с плоттерами, команда "_plottermanager" - путь к этой папке необходимо извлекать, как я понимаю.
Код:
[Выделить все]
(vla-get-PrinterConfigPath (vla-get-files (vla-get-Preferences (vlax-get-acad-object))))
Цитата:
Сообщение от UniquE Посмотреть сообщение
скопировать файл
см. vl-file-copy, vl-file-delete
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 14.06.2013, 13:54
#3
UniquE


 
Регистрация: 14.06.2013
г.Пермь
Сообщений: 4


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Код:
[Выделить все]
(vla-get-PrinterConfigPath (vla-get-files (vla-get-Preferences (vlax-get-acad-object))))
см. vl-file-copy, vl-file-delete
Спасибо. Я с чистой совестью скажу, что пробовал сам что то сделать с этой информацией, но за 7 лет все, что изучал на курсе в инс-те, позабылось, тем более все что мы там делали - рисовали из лиспа по координатам отрезками. Поэтому мои старания не оправдались, цель не достигнута.
Можно, если не затруднит, написать сначала и до конца, что бы просто скопипастить в ЛИСП весь код.
Путь к файлу обзывать "путь\имя.pc3". Я бы потом заменил эту строку

Заранее благодарен!
PC: Я в дальнейшем, потихоньку, разберусь со всем этим.
UniquE вне форума  
 
Непрочитано 18.06.2013, 18:22
#4
Кулик Алексей aka kpblc
Moderator

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


Примерно так (особо не проверял):
Код:
[Выделить все]
 (defun _dwgru-copy-plotter-configs (path / pref vl-browsefiles-in-directory-nested _kpblc-get-file-date files exist err)
                                   ;|
*    Выполняет копирование файлов конфигураций (pc3, pmp) из серверного каталога на локальную машину
*    Парамеры вызова:
  path   серверный каталог. Должен существовать.
*    Примеры вызова:
(_dwgru-copy-plotter-configs "\\\\server\\settings\\plotters")
|;

  (defun _kpblc-get-file-date (file / lst res copy)
                              ;|
*    Получение строкового представления даты и времени создания файла вида
* YYYYMMDDHHMMSS
*    Параметры вызова:
	file		имя файла
*    Если файл не существует или его невозможно открыть, возвращает nil
|;
    (if (findfile file)
      (if (setq lst (vl-file-systime file))
        (foreach item '((0 . 4)
                        (1 . 2)
                        (3 . 2)
                        (4 . 2)
                        (5 . 2)
                        (6 . 2)
                        )
          (setq res (append res
                            (list ((lambda (/ tmp)
                                     (setq tmp (itoa (nth (car item) lst)))
                                     (while (< (strlen tmp) (cdr item))
                                       (setq tmp (strcat "0" tmp))
                                       ) ;_ end of while
                                     tmp
                                     ) ;_ end of LAMBDA
                                   )
                                  ) ;_ end of list
                            ) ;_ end of append
                ) ;_ end of setq
          ) ;_ end of foreach
        ) ;_ end of if
      ) ;_ end of if
    (cond
      ((and res (listp res))
       (apply 'strcat res)
       )
      (res)
      ) ;_ end of cond
    ) ;_ end of defun

  (defun vl-browsefiles-in-directory-nested (path mask)
;;;    Функция возвращает список файлов указанной маски, находящихся в
;;; заданном каталоге
;;;    Параметры вызова:
;;;	path	путь к корневому каталогу. nil недопустим
;;;  	mask	маска имени файла. nil или список недопустим
;;;    Примеры вызова:
    ;|
(vl-browsefiles-in-directory-nested "c:\\documents" "*.dwg")
|;
    (apply (function append)
           (cons (if (vl-directory-files path mask)
                   (mapcar (function (lambda (x) (strcat (vl-string-right-trim "\\" path) "\\" x)) ;_ end of lambda
                                     ) ;_ end of function
                           (vl-directory-files path mask)
                           ) ;_ end of mapcar
                   ) ;_ if
                 (mapcar (function
                           (lambda (x)
                             (vl-browsefiles-in-directory-nested (strcat (vl-string-right-trim "\\" path) "\\" x) mask)
          ; _ end of
          ; vl-browsefiles-in-directory-nested
                             ) ;_ end of lambda
                           ) ;_ end of function
                         (vl-remove ".." (vl-remove "." (vl-directory-files path nil -1))) ;_ end of vl-remove
                         ) ;_ mapcar
                 ) ;_ cons
           ) ;_ end of apply
    ) ;_ end of defun

  (if (findfile path)
    (progn
      (setq pref  (vla-get-files (vla-get-preferences (vlax-get-acad-object)))
            files (vl-remove-if (function vl-file-directory-p) (vl-browsefiles-in-directory-nested path "*.*"))
            files (mapcar
                    (function
                      (lambda (a)
                        (cons (car a)
                              (vl-remove-if-not
                                (function
                                  (lambda (x)
                                    (= (strcase (vl-filename-extension x)) (cdr a))
                                    ) ;_ end of lambda
                                  ) ;_ end of function
                                files
                                ) ;_ end of vl-remove-if-not
                              ) ;_ end of cons
                        ) ;_ end of lambda
                      ) ;_ end of function
                    '(("PrinterConfigPath" . ".PC3")
                      ("PrinterDescPath" . ".PMP")
                      )
                    ) ;_ end of mapcar
            ) ;_ end of setq
      ;;
      (foreach filetype files
        (foreach item (cdr filetype)
          (if (vl-catch-all-error-p
                (setq
                  err (vl-catch-all-apply
                        (function
                          (lambda ()
                            (cond
                              ((and (setq exist (findfile (strcat (vl-string-right-trim "\\" (vlax-get-property pref (car filetype)))
                                                                  "\\"
                                                                  (vl-filename-base item)
                                                                  (vl-filename-extension item)
                                                                  ) ;_ end of strcat
                                                          ) ;_ end of findfile
                                          ) ;_ end of setq
                                    (< (_kpblc-get-file-date exist)
                                       (_kpblc-get-file-date item)
                                       ) ;_ end of <
                                    ) ;_ end of and
                               (vl-file-delete exist)
                               (vl-file-copy item exist)
                               )
                              ((not exist)
                               (vl-file-copy item
                                             (strcat (vl-string-right-trim "\\" (vlax-get-property pref (car filetype)))
                                                     "\\"
                                                     (vl-filename-base item)
                                                     (vl-filename-extension item)
                                                     ) ;_ end of strcat
                                             ) ;_ end of vl-file-copy
                               )
                              ) ;_ end of cond
                            ) ;_ end of lambda
                          ) ;_ end of function
                        ) ;_ end of vl-catch-all-apply
                  ) ;_ end of setq
                ) ;_ end of vl-catch-all-error-p
            (princ (strcat "\nCan't copy file " item " to a local computer"))
            ) ;_ end of if
          ) ;_ end of foreach
        ) ;_ end of foreach
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.10.2014, 13:46
#5
peacemaker_kiss


 
Регистрация: 12.04.2011
Сообщений: 37


Все конечно прекрасно, но неужели нет возможности не писать тома кодов чтобы скопировать файл C:\\1\1.txt в папку С:\\2 Ибо в моем случае копирование файла лишь малая часть задачи, vl-file-copy по Полещуку мне совсем не помог! Вразумите кто этой командой совершал копирование, укажите синтаксис команды при копировании, если у этой команды есть такая возможность
peacemaker_kiss вне форума  
 
Непрочитано 20.02.2015, 13:50
#6
sdv79

Инженер ЭОМ
 
Регистрация: 05.03.2009
Москва
Сообщений: 215
Отправить сообщение для sdv79 с помощью Skype™


Тут есть простое решение http://www.cadtutor.net/forum/showth...ory-to-another
sdv79 вне форума  
 
Непрочитано 20.02.2015, 14:00
#7
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от peacemaker_kiss Посмотреть сообщение
но неужели нет возможности не писать тома кодов чтобы скопировать файл C:\\1\1.txt в папку С:\\2
Есть. Открыть проводник и скопировать файлы в нем.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.02.2015, 15:47
#8
sdv79

Инженер ЭОМ
 
Регистрация: 05.03.2009
Москва
Сообщений: 215
Отправить сообщение для sdv79 с помощью Skype™


Иногда необходимо "заготовку" скопировать из пункта А в пункт В, без всяких заморочек. И этот код работает.
Код:
[Выделить все]
 
(vl-file-copy 
"D:\\Sologubov_D\\mySchema\\DB\\Specification_db.myDB"
"d:\\Sologubov_D\\mySchema\\DB\\Ñâåòèëüíèêè\\Northcliffe\\IP20,ÑÓ Breeze DPAR\\Breeze 418 I92 HF.myDB" 
)
а потом его при необходимости отредактировать
Код:
[Выделить все]
 
  (setq notepad  "\"C:\\Windows\\System32\\notepad.exe\"")
      (cond
       (
        (null (findfile notepad))
	 (alert "Áëîêíîò íå íàéäåí ")
      )) ;/ cond
(startapp notepad "d:\\Sologubov_D\\mySchema\\DB\\Ñâåòèëüíèêè\\Northcliffe\\IP20,ÑÓ Breeze DPAR\\Breeze 418 I92 HF.MYDB" )
sdv79 вне форума  
 
Непрочитано 20.02.2015, 16:17
#9
Кулик Алексей aka kpblc
Moderator

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


sdv79, ты забыл пару моментов:
1. Файл-получатель уже существует. Что с ним будем делать? Удалять? Переименовывать? А если файл доступен только для чтения (кстати, это тоже надо проверить)?
2. Допустим, Копирование надо выполнить в несуществующий на момент вызова каталог (например, в c:\files\backups\2015-02-20). Т.е. надо предварительно каталог создать и как минимум проверить его существование.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.02.2015, 16:22
#10
sdv79

Инженер ЭОМ
 
Регистрация: 05.03.2009
Москва
Сообщений: 215
Отправить сообщение для sdv79 с помощью Skype™


Нет, не забыл ЭТО ОСНОВА, есть проверка. Все так и есть
вот
Код:
[Выделить все]
 
;(setq way_myDB (findfile (strcat adres_typ Tip_OP_name ".myDB")) )
(setq way_myDB  "d:\\Sologubov_D\\mySchema\\DB\\Ñâåòèëüíèêè\\Northcliffe\\IP20,ÑÓ Breeze DPAR\\Breeze 418 I92 HF.MYDB" )
   (cond ; åñëè íåò îïèñàíèÿ, ñîçäàäèì ôàéë ïóòåì ýòàëîíà è ïåðåèìåíîâàíèåì
       (
	(null way_myDB)

  	 (vl-file-copy ; http://www.cadtutor.net/forum/showthread.php?45564-How-to-copy-a-list-of-files-from-one-directory-to-another
	   (findfile (strcat adres_db "Specification_db.myDB"))
	   (strcat adres_typ Tip_OP_name ".myDB")
	 )  ;/ vl-file-copy 
      )) 

sdv79 вне форума  
 
Непрочитано 20.02.2015, 16:33
#11
Кулик Алексей aka kpblc
Moderator

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


sdv79, у тебя на машине есть каталог "c:\files\backups\2015"? Нет? Прекрасно. Выполни свой код над файлом (findfile "acad.exe"), скопировав его со старого места в c:\files\backups\2015\acad_exe_copies\acad.exe
Ну а если каталог c:\files существует, то выбери любое другое слово (ObjARX2015, к примеру )
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.02.2015, 17:38
#12
sdv79

Инженер ЭОМ
 
Регистрация: 05.03.2009
Москва
Сообщений: 215
Отправить сообщение для sdv79 с помощью Skype™


Естественно, я пишу проверки, с учетом, того, что каталог существует. ЭТО АКСОМА! Иначе, програмист пишеь провекри на соответствие католога и наличие файла.
Вопрос в том как как сделать копирование файлов! Остальное оставляем на совесть программиста, есть у него, проверка, что он для этого делает, вы можете посоветовать, как это сделать. Важно четкий ответ. Он есть. Это важно. Все приходит с опытом.
sdv79 вне форума  
 
Непрочитано 20.02.2015, 18:00
#13
Кулик Алексей aka kpblc
Moderator

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


Функция копирования должна быть одна. И в ней при необходимости и создание каталога, и все проверки. Это выводы на основе моего личного опыта - если этого не делать, рано или поздно что-нибудь да забудешь.
Но дело ваше.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.05.2015, 21:07
#14
Gaa

сан-техник на пенсии
 
Регистрация: 23.05.2005
Сообщений: 140


Поискал по форуму, но не нашел ответа.

Пытаюсь функцией

(vl-file-copy "c:\\PROG\\DAT.bat" "c:\\DAT.bat" T)
(vl-file-copy "c:\\PROG\\DAT.bat" "c:\\Windows\\DAT.bat" T)

скопировать\дописать файл в корень С: и С:\Windows, но функция снимается т.к. требуются права доступа, как это можно программно обойти?
WIN 8.1 64
Acad 2012
__________________
Спасибо
Gaa вне форума  
 
Непрочитано 02.05.2015, 22:29
#15
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Gaa Посмотреть сообщение
скопировать\дописать файл в корень С: и С:\Windows, но функция снимается т.к. требуются права доступа, как это можно программно обойти?
Дать права доступа в корень системного диска пользователю, из-под которого запускается акад и лисп. За это оторвать админу руки-а лучше заранее, для профилактики)
Сергей812 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > ЛИСП код для копирования файла из известной папки в папку с путем из автокада