Schöck
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Последовательное применение lisp-функции к множеству файлов DWG

Последовательное применение lisp-функции к множеству файлов DWG

Ответ
Поиск в этой теме
Непрочитано 07.02.2009, 13:52 #1
Последовательное применение lisp-функции к множеству файлов DWG
Apelsinov
 
Проектировщик ВК. LISP-любитель.
 
Москва
Регистрация: 15.12.2003
Сообщений: 1,127

Есть некая функция F0 , которая обрабатывает чертеж, необходимо применить ее к большому количеству файлов, находящихся в одной дирректории (с поддирректориями и т.д). То есть так: открываем файл, применяем F0 , сохраняем файл и закрываем его, открываем следующий...и т.д. как это можно автоматизировать?

Пока у меня есть только одна идея как это сделать - добавить F0 в автоисполнение при загрузке dwg, далее я указываю акаду на открытие файлов, он в каждом из них запускает F0 , в которой прописано сохранение и закрытие файла. Но этот метод мне не нравится по причине того, что прописывать F0 в автоисполнение придется в ручную.
Если же запускать F0 в автоисполнение по некоему флагу, который будет устанавливать функция запуска (хранить его можно, например, во внешнем файле) - то это решит проблему, но как то боязно, ибо сглючит что нибудь и не поменяется флаг на исходный, будет очень не приятно.

В идеале это все должно выглядеть так: запускае какую то программу (не обязательно на лиспе), она выдает окно для выбора дирректории, выбираем дирректорию, и жмем на старт - автокад начинает применять лисповую функцию последовательно к каждому файлу из этой дирректории, закрытие и сохранение файла можем отдать на откуп F0.
Просмотров: 16839
 
Непрочитано 07.02.2009, 13:53
#2
Кулик Алексей aka kpblc
Moderator

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


Самый главный вопрос - в функции применяются интерактивные лисповые функции (типа get*) и командные методы или нет?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 07.02.2009, 14:19
#3
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,127
<phrase 1=


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Самый главный вопрос - в функции применяются интерактивные лисповые функции (типа get*) и командные методы или нет?
нет, от пользователя функция никак не зависит
Apelsinov вне форума  
 
Непрочитано 07.02.2009, 14:58
2 | #4
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,816
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Это ответ на половину вопроса.
Цитата:
...и командные методы или нет?
1. Если командных методов нет можешь воспользоваться этим:
Как реализовать обработку нескольких файлов в каталоге ?
Там приведена заготовка с ф-цией dofile, в которую передается указатель на активный документ. Длальше с помощью vla можно что-то делать.
Код:
[Выделить все]
;;;curDOC — Vla указатель на обрабатываемый документ
;;; типа (vla-get-activedocument (vlax-get-acad-object))
  (defun dofile ( curDOC)
;;;Для примера
;;;Печать имени файла
(princ "\nИмя файла:")
(princ  (vlax-variant-value (vla-GetVariable curDOC "DWGNAME")))
;;;  Очистка
  (vla-purgeall curDOC)
    )
Здесь можно посмотреть пример
2. Если есть командные методы, то связка bat scr и lsp думаю актуальна до сих пор. В свое время обрабатывал достаточно большие (по тем временам) объемы информации. Запускал перед обедом и шел кушать
Все что нужно здесь в посте #11
3. На theswamp.org помотри тему Execute commands on all open drawings (требуется регистрация)
PS. Код перенесен на Exchange ( OpenDwgsCmds) (ссылка LISP и DVB)
4. См. пост 10
5. Используя ObjectDBX: Пример ObjectDBX Base Program и Пример2
6. Автодесковский ScriptPro 2.0. Подробнее см #32
Сам пока не пользовался, но есть отзывы
7. Для тех, кому словосочетания DLL, .NET, ObjectArx не являются матерными Менеджер пакетной обработки чертежей
8. Программа для пакетной обработки файлов v.1.1
Вложения
Тип файла: lsp ObjectDBX.lsp (10.2 Кб, 170 просмотров)
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 28.05.2016 в 12:45. Причина: Добавлен п.6
VVA вне форума  
 
Автор темы   Непрочитано 09.02.2009, 10:06
#5
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,127
<phrase 1=


VVA, спасибо за такой подробный ответ!
из соображений совместимости больше всего понравилась "связка bat scr и lsp", посмотрел файлы по ссылке, там есть такой bat:
Код:
[Выделить все]
ECHO OFF
md GOTOVO
FOR %%A IN (*.DWG) DO "C:\Program Files\AutoCAD 2004\acad.exe" %%A /B layren.SCR
я не очень понимаю что такое %%A, это вроде как переменная?

Можно ли сделать так, чтобы батник работал не только папками в корне дирректории, но и с теми, что во вложенных папках?

Вопрос о сохранении обработанных файлов можно не рассматривать, так, как думаю буду сохранять по старым путям с измененным именем.
Apelsinov вне форума  
 
Непрочитано 09.02.2009, 13:26
#6
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,455


http://forum.dwg.ru/showthread.php?t=16562
может быть это поможет.
Sleekka вне форума  
 
Непрочитано 09.02.2009, 15:37
#7
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,816
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Apelsinov,
Цитата:
я не очень понимаю что такое %%A, это вроде как переменная?
Да это переменная, в которую поочередно подставляются имена, найденные по маске. В данном случае *.dwg. Пример.
Цитата:
Можно ли сделать так, чтобы батник работал не только папками в корне дирректории, но и с теми, что во вложенных папках?
Bat писался еще во времена DOS. И тогда это сделать было нельзя (наверное). В XP добавили много команд и ключей. Хорошая статья про bat'ы
Справку можно посмотреть, набрав for /? >>for.txt
Фрагмент

Цитата:
FOR /R [[диск:]путь] %переменная IN (набор) DO команда [параметры]

Выполнение команды для каталога [диск:]путь, а также для всех
подкаталогов этого пути. Если после ключа /R не указано имя каталога,
выполнение команды начинается с текущего каталога.
Если вместо набора указана только точка (.), команда выводит список
всех подкаталогов.
Второй вариант.
Лиспом по ссылке с поста #6 создаешь bat файл, где построчно перечисляешь каждый найденный файл.
Пример bat:
Цитата:
"C:\Program Files\AutoCAD 2004\acad.exe" "D:\Myfiles\file1.dwg" /B "D:\LISP\layren.SCR"
"C:\Program Files\AutoCAD 2004\acad.exe" "D:\Myfiles\file2.dwg" /B "D:\LISP\layren.SCR"
Правде нужно проверить, воспримет ли Автокад после ключа /B полный путь с scr файлу. Если нет, придестя кидать его в каждую поддиректорию.
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 06.10.2010 в 18:55.
VVA вне форума  
 
Автор темы   Непрочитано 10.02.2009, 17:01
#8
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,127
<phrase 1=


открывая файлы батником в виде
Код:
[Выделить все]
FOR %%A IN (*.DWG) DO "C:\Program Files\AutoCAD 2004\acad.exe" %%A /B layren.SCR
столкнулся с тем, что для каждого следующего файла открывается свое приложение автокада, можно ли сделать так, чтобы файлы открывались в разных окнах одного приложения?
Apelsinov вне форума  
 
Непрочитано 10.02.2009, 17:43
#9
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,816
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Apelsinov, Это самый большой минус bat'а. У меня в свое время не вышло. . Это 10-й Автокад пулей загружался. Сейчас нужно терпение.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 10.02.2009, 18:49
1 | #10
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 11,179


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

Я чаще всего использую вот такую функцию

Код:
[Выделить все]
(defun ru-batch-file-operations (first_message files_list test_func
                                                quoted_func / do_it)
  (if (not first_message)
    (setq do_it t)
    (setq do_it ((eval test_func) first_message))
  ) ;_ end of if
  (if do_it (mapcar quoted_func files_list))
  (princ)
)
Функции передаются аргументы:
first_message — предупреждающее сообщение перед запуском массовых операций, или NIL, если предупреждения не требуется;
files_list — список полных имен обрабатываемых файлов;
test_func — имя тестовой функции, выводящей first_message и проверяющей возможность начала обработки файлов по списку;
quoted_func — имя функции, выполняющей операцию с именем одного файла из списка.

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

Код:
[Выделить все]
(ru-batch-file-operations (strcat "Вывод списка файлов" 
"\nПОЛЬЗОВАТЬСЯ ОСТОРОЖНО!\n\nБудем делать")
(list "ru-lib-bolt.dwg" "ru-lib-build.dwg"
 "ru-lib-car.dwg")
'ru-yes 'print)
В этом примере основной функцией, выполняющей операции, является print, то есть будут просто выведены имена файлов. Тестовая функция ru-yes, выведет предупреждающее сообщение, и, если будет нажата кнопка «Да», опасная операция печати списка будет выполнена.

Разумеется, нам нужны функции, делающие что-то полезное, и их можно разработать сколько угодно, главное, чтобы в момент выполнения функции ru-batch-file-operations и тестовая, и основная функции были определены.

Типовой алгоритм (не универсальный), применяемый нами для обработки посторонних DWG-файлов:
1. создается новый пустой рабочий файл;
2. в него вставляется обрабатываемый файл в виде блока;
3. производится требуемая обработка;
4. обработанный блок вновь сохраняется в файл .

В конкретных вариантах возможны нюансы (например расчленение вставленного блока, запись в другой каталог, ведение LOG-файлов), но обязательным является дублированное несколько раз до и после обработки удаление «мусора», обеспечивающее постоянную «пустоту» рабочего файла.

Таким способом я обрабатывал за раз до тысячи файлов топографических планшетов. Запускал на выходной и на дачу уезжал. Но способ не универсальный. Для DWG где всё только в модели - подходит хорошо.
ShaggyDoc вне форума  
 
Непрочитано 10.02.2009, 19:01
#11
Кулик Алексей aka kpblc
Moderator

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


Мне кажется, что вариант #4 (при соответствующей квалификации, конечно) является самым оптимальным.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.05.2010, 13:11
#12
apxap


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


Знающие люди, а кто может подкинуть лисп или там еще что (Я в этом вообще не понимаю) для того что-бы выполнить команду purge all, во всех файлах директории и сохранить их. Помогите пожалуйста
apxap вне форума  
 
Непрочитано 19.05.2010, 13:52
#13
E-degtyarev

Помогаю, кому делать нечего.
 
Регистрация: 27.03.2009
Русская деревня
Сообщений: 394


apxap, Вот этим пользуюсь. Где-то на форуме нашел.
Вложения
Тип файла: lsp PurgeFiles.LSP (3.3 Кб, 272 просмотров)
E-degtyarev вне форума  
 
Непрочитано 19.05.2010, 17:20
#14
apxap


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


E-degtyarev
Вот спасибо) То что нужно
apxap вне форума  
 
Непрочитано 01.11.2010, 16:31
#15
elena_k


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


Добрый день!
В продолжение этой темы. Необходимо напечатать в PDF 500 файлов. Чертежи сделаны и в модели, и в листах.
Подскажите, что я делаю не так. В функцию DOFILE - дописала печать документа. Но на печать выводится активный документ.
Вот мой код.
Код:
[Выделить все]
;| Основной код взят с
  CADALYST 03/05 Tip2023: PurgeFiles.lsp  Directory Clean Up  (c) Andrzej Gumula
  [c]2004 Andrzej Gumula, Katowice, Poland
  e-mail: a.gumula@wp.pl|;
(vl-load-com)
(defun dofile ( curDOC)
(princ "\nИмя файла:")
(princ  (vlax-variant-value (vla-GetVariable curDOC "DWGNAME")))
   (setq old_cmdecho (vlax-variant-value (vla-GetVariable curDOC "cmdecho")))
   (setq dwg_name (vlax-variant-value (vla-GetVariable curDOC "DWGNAME")) name (vl-string-right-trim ".dwg" dwg_name))
   (setq dwg_prefix (vl-string-right-trim "\\" (vlax-variant-value (vla-GetVariable curDOC  "dwgprefix"))))
   (vl-registry-write "HKEY_CURRENT_USER\\SOFTWARE\\ADOBE\\ACROBAT DISTILLER\\PRINTERJOBCONTROL" "LastPdfPortFolder - acad.exe" dwg_prefix)
   (setq scale_block (vlax-variant-value (vla-GetVariable curDOC "ltscale")))
   (setq curlayout (vla-get-activelayout curdoc))
   (setq plgf (vla-get-plotconfigurations curdoc))
   (setq pl_m (vla-get-CanonicalMediaName curlayout))
   (setq pl_or (vla-get-PlotRotation curlayout))
   (vla-GetPaperSize curLayout 'Width 'Height)
   
   (if (= (vlax-variant-value (vla-GetVariable curdoc "tilemode")) 1)
   (progn
      ;функция поиска крайних точек форматки
      ;(find_point_insert_block)
   )
   ;  list  
   (progn
       (if (= pl_or 1)
	   (setq x_pt (- height 10) y_pt (- width 10))
           (setq x_pt (- width 10)  y_pt (- height 10)))
   ))
   (setq el_format "")
   (if (> y_pt x_pt)
       (setq orient "_P")
       (setq orient "_L"))
   (if (= orient "_L") (progn
       (if (= el_format "")
	   (setq el_format "A2_a"))
       (setq printer_name "adobe pdf_a.pc3")			 
       (vlax-put-property activelayout 'PlotRotation "1"))
       (progn
       (if (= el_format "")
	   (setq el_format "A2_k"))	 
       (setq printer_name "adobe pdf_k.pc3")			  
       (vlax-put-property activelayout 'PlotRotation "0"))
   )
   (vla-put-configname curlayout printer_name) 
   ;(vla-plottodevice (vla-get-plot curdoc ) printer_name)
   (vla-plottodevice (vla-get-plot curdoc ) )

 );end dofile

Последний раз редактировалось Кулик Алексей aka kpblc, 01.11.2010 в 16:47.
elena_k вне форума  
 
Непрочитано 02.11.2010, 10:14
#16
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


elena_k, тебе надо вывести на напечать много файлов. Допустим, подшивка тебя не устраивает.

1. У тебя все эти файлы уже открыты или есть их список? Если есть список, где он в коде?
2. Ты так уверенно берешь чужой лисп, который лезет в реестр и не боишся?
3. Ты запускаешь код в одном файле, а хочешь чтобы он продолжал работать в других?
4. Что такое curDOC тебе расшифровать? "текущий документ". Ты загрузила функцию в текущий документ и распечатала его, дальше что? Кто загрузит следующий документ и загрузит в него эту функцию?

На мой взгляд надо делать так:
1. Определится из какого документа ты собираешся работать со всем массивом остальных документов.
2. Создать список dwg файлов с полными путями.
3. прочесть эти две ссылки
http://forum.dwg.ru/showpost.php?p=636946&postcount=47
http://forum.dwg.ru/showthread.php?t=58328
в первой запуск лиспа при открытии документа
во второй запуск лиспа в уже открытом документе и многократно, если это необходимо. Имеется в виду запуск лиспа из вне, то есть из другого документа.
4. Если твоя функция работает, в смысле распечатывает активный документ, то запускай ее при каждом открытии нового документа.
(бедный, бедный твой реестр)
Supermax вне форума  
 
Непрочитано 02.11.2010, 15:15
#17
elena_k


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


Я не стала полностью приводить код. Он взят с форума
http://www.caduser.ru/forum/index.ph...#message161511
сообщение VVA.
У меня есть список файлов.Я пыталась изменить только функцию DOFILE
Я для себя писала программу вывода в PDF активного файла, в которой нужно только выбрать область печати, а дальше автоматом
определяю какой это формат,
в зависимости от ориентации чертежа выбираю файл *.pc3 ( заранее создала для альбомной и книжной ).
А в реестр пишу путь, где лежит DWG файл.Не нужно выбирать куда сохранять PDF. Получалось значительно быстрее, чем просто печать файла.
Но хотелось все сделать автоматом.
Спасибо за участие и ссылки - буду изучать.
elena_k вне форума  
 
Непрочитано 02.11.2010, 16:14
#18
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Вы, как я уже говорил, должны определиться откуда будете по очереди открывать файлы?
Вариантов всего два. Либо из скрипт-файла, либо из какого-то документа самого автокада.
Я так понимаю, что вы выбираете второй путь?

Если да, то переделайте свою функцию DOFILE и уберите в ней аргумент.
Функция DOFILE должна всегда обрабатывать текущий активный.
Весьма рекомендую в ней разобраться и в реестр не лезть!

Запишите ее временно в acaddoc.lsp не забыв в конце дописать закрытие документа.
Создайте функцию, которая создает список и по очереди просто открывает файлы.
Файл откроется, обработается и сам закроется.

Если такое не нравится, то создайте лисп с этой функцией, и как я вам написал в ссылках запускайте по очереди этот файл в разных документах.
Supermax вне форума  
 
Непрочитано 03.11.2010, 08:53
#19
elena_k


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


Спасибо, буду разбираться. По аналогии сделала замену текста для целой кучи чертежей- все работает.
elena_k вне форума  
 
Непрочитано 04.11.2010, 09:37
#20
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,816
<phrase 1= Отправить сообщение для VVA с помощью Skype™


elena_k, Можешь попробовать использовать еще ObjectDBX. Я добавил п.5 к посту #4
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Последовательное применение lisp-функции к множеству файлов DWG

Tekla Structures. Видеокурс. ЖЕЛЕЗОБЕТОН
Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DwgRuLispLib: Команда. Загрузка lisp файлов из указанной папки VVA Библиотека функций 7 15.02.2018 10:10
Грамотное открытие файлов DWG из макса (6,7,8) Chuma AutoCAD 11 03.02.2010 08:05
Где можно найти в инете обширную библиотеку DWG файлов для проектирования??? Romeo1786 Поиск литературы, чертежей, моделей и прочих материалов 7 28.05.2008 10:30
Программирование с использованием файлов DWG fiandy Программирование 3 22.03.2008 20:27