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

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

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

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

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

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

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

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


Самый главный вопрос - в функции применяются интерактивные лисповые функции (типа get*) и командные методы или нет?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 07.02.2009, 14:19
#3
Apelsinov

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


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

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Это ответ на половину вопроса.
Цитата:
...и командные методы или нет?
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 Кб, 204 просмотров)
__________________
Как использовать код на Лиспе читаем здесь

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

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<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,335


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

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


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,202
<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,996


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"В
Сообщений: 13,372


Кроме того, при работе по сценарию никак не обрабатываются возможные ситуации. Понадобится Автокаду для какого-нибудь файла какой-то 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
С.-Петербург
Сообщений: 40,450


Мне кажется, что вариант #4 (при соответствующей квалификации, конечно) является самым оптимальным.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей 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 Кб, 321 просмотров)
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,996


elena_k, Можешь попробовать использовать еще ObjectDBX. Я добавил п.5 к посту #4
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 04.11.2010, 10:44
#21
Кулик Алексей aka kpblc
Moderator

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


http://autolisp.ru/2010/04/08/procee...tive-document/ не подойдет?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 08.11.2010, 10:40
#22
elena_k


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


Добрый день!
VVA, kpblc спасибо. Знаний, наверное, пока малова-то . Надеялась, что смогу использовать готовый код, п.1 пост #4, только изменив функцию DOFILE. Но увы . Может быть дело в методе (vla-plottodevice (vla-get-plot curdoc ) printer_name)? другие-то работают.С ObjectDBX буду разбираться, сейчас текучки много. Еще раз большое спасибо.
elena_k вне форума  
 
Непрочитано 08.11.2010, 11:01
#23
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от elena_k Посмотреть сообщение
Может быть дело в методе (vla-plottodevice (vla-get-plot curdoc ) printer_name)? другие-то работают.
Вполне возможно, что так и есть. Программа ошибки или сообщения в командную строку выдает?
Do$ вне форума  
 
Непрочитано 25.10.2012, 10:21
#24
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от VVA Посмотреть сообщение
2. Если есть командные методы, то связка bat scr и lsp думаю актуальна до сих пор.
На сегодняшний день ничего не изменилось?
Нужно пакетно обработать файлы в определенной папке с учетом вложенных. Будут командные методы, а также подгрузка и выполнение лиспов. Пока лучше этого варианта ничего не могу найти/придумать.
Do$ вне форума  
 
Непрочитано 25.10.2012, 10:34
#25
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Do$ Посмотреть сообщение
На сегодняшний день ничего не изменилось?
Появился AcCoreConsole.exe - он подобного рода задачи выполняет гораздо быстрее, чем acad.exe. Насколько мне известно, на последнем слёте пионеров Евгений Елпанов на эту тему делал доклад. Однако продукт пока весьма кривой.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 25.10.2012, 10:49
#26
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от hwd Посмотреть сообщение
Насколько мне известно, на последнем слёте пионеров Евгений Елпанов на эту тему делал доклад.
Да, я присутствовал на этом докладе. Штука весьма интересная, но пока неприменимая для русскоязычных версий. К тому же, мне нужно работать пока с версией 2010 в основном.
Do$ вне форума  
 
Непрочитано 25.10.2012, 10:52
#27
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Do$, Ознакомься с докладом Евгения. Он обещал его выложить, но думаю в личку получится быстрее.
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 25.10.2012 в 11:02. Причина: Орфография #28
VVA вне форума  
 
Непрочитано 25.10.2012, 10:59
#28
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от VVA Посмотреть сообщение
Но обещал
"Но" => "Он"?
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 25.10.2012, 11:01
#29
Klo

Инженер-конструктор
 
Регистрация: 29.10.2007
Юбилейный МО
Сообщений: 269


Есть неплохое описание редактирования нескольких файлов в книжке "AutoCAD секреты, которые должен знать каждый пользователь" Дэн Эббот, глава "Редактирование тысяч чертежей" стр. 338. Там он создаёт командный файл (*.bat) в котором запускает выполнение скрипта (*.scr), третьим шагом из скрипта запускается лист (*.lsp).

Ой, не заметил, что ещё первая страница есть )

Последний раз редактировалось Klo, 25.10.2012 в 11:19. Причина: Ой, не заметил, что ещё первая страница есть )
Klo вне форума  
 
Непрочитано 25.10.2012, 11:02
#30
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


hwd, Спасибо, исправил
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 25.10.2012, 11:06
#31
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от VVA Посмотреть сообщение
Do$, Ознакомься с докладом Евгения. Он обещал его выложить, но думаю в личку получится быстрее.
VVA, см. #26
Klo, перечитай тему с самого начала
Do$ вне форума  
 
Непрочитано 25.10.2012, 11:18
3 | #32
bargool


 
Регистрация: 16.08.2006
Санкт-Петербург
Сообщений: 508
<phrase 1=


а есть ещё такая штука, как ScriptPro 2.0, скачать можно с автодесковской странички.
Описание с этой же страницы
Цитата:
ScriptPro takes AutoCAD scripting to a new level with an easy-to-use interface, logging, reusable project files, enhanced scripting with new keywords and utilities, and robust error recovery. Using ScriptPro, you can apply a set of commands to multiple drawings by simply specifying a script file and the list of drawings that you would like to apply the script to.
Перевод самого главного:
Цитата:
Используя ScriptPro, вы можете применить набор команд к множеству чертежей просто указав файл скрипта и список чертежей.
bargool вне форума  
 
Непрочитано 25.10.2012, 11:33
#33
Кулик Алексей aka kpblc
Moderator

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


ИМХО: для пакетной обработки чертежей можно использовать ObjectDBX (но там есть некоторые ограничения).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.10.2012, 11:44
1 | #34
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Do$
На сегодняшний день ничего не изменилось?
тынц.

UPD
Как дополнительный вариант:
можно в автозагрузку AutoCAD засунуть плагин, который бы анализировал параметры строки запуска acad.exe и вытаскивал бы из них твои дополнительные параметры. Эти параметры игнорируются автокадом, но могут обрабатываться тобой. В обозначенном плагине ты можешь иметь XML файл, в настройках которого можно указывать, какие дополнительные параметры, каким образом следует обрабатывать.
Код:
[Выделить все]
// It's ain't working:
//Process proc = Process.GetCurrentProcess();
//String arguments = proc.StartInfo.Arguments;// empty string

// It's working:
String cmdLine = Environment.CommandLine;// full acad.exe command line string
Миниатюры
Нажмите на изображение для увеличения
Название: program.jpg
Просмотров: 898
Размер:	31.7 Кб
ID:	89177  
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 25.10.2012 в 12:54.
hwd вне форума  
 
Непрочитано 25.10.2012, 13:01
#35
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Впечатляет. Спасибо, буду разбираться!
Do$ вне форума  
 
Непрочитано 25.10.2012, 13:08
#36
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


mulscr старинного индусского производства можно еще попробовать, есть в виде лиспа, есть в виде отдельного приложения
gomer вне форума  
 
Непрочитано 27.08.2013, 20:21
#37
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,075


Цитата:
Сообщение от Apelsinov Посмотреть сообщение
из соображений совместимости больше всего понравилась "связка bat scr и lsp", посмотрел файлы по ссылке, там есть такой bat:
ECHO OFF
md GOTOVO
FOR %%A IN (*.DWG) DO "C:\Program Files\AutoCAD 2004\acad.exe" %%A /B layren.SCR
По своему незнанию лиспа и т.п. пытаюсь воспользоваться хотя бы этим вариантом.
У меня задача для каждого файла из набора создать новый файл на основе нужного шаблона, вставить в него данные из файла набора средствами Autocad Map 3D и т.п., сохранить файл. Сохранить лучше под новым именем или в другую папку. Т.е. сам файл из набора открывать не нужно - только данные из него вставить.
Скрипт я вроде бы написал, но для одного конкретного файла. Не могу сообразить, как в скрипте описать путь и название файла, т.е. как в скрипте указать вместо названия переменную?

Последний раз редактировалось АлексЮстасу, 27.08.2013 в 20:46.
АлексЮстасу вне форума  
 
Непрочитано 27.08.2013, 20:59
#38
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Сохранить лучше под новым именем или в другую папку. Т.е. сам файл из набора открывать не нужно - только данные из него вставить.
Скрипт я вроде бы написал, но для одного конкретного файла. Не могу сообразить, как в скрипте описать путь и название файла, т.е. как в скрипте указать вместо названия переменную?
По ссылке в #4 п.2 есть пример (файл layren.scr) Там и другой путь и "указать вместо названия переменную"
Код:
[Выделить все]
(getvar "DWGNAME")
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 28.08.2013, 02:59
#39
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,075


Цитата:
Сообщение от VVA Посмотреть сообщение
По ссылке в #4 п.2 есть пример (файл layren.scr) Там и другой путь и "указать вместо названия переменную"
Код:
(getvar "DWGNAME")
Гут!
Но при запуске бат-файла открывается один из файлов папки. А в моем случае это не нужно - из активного файла вставка данных средствами Map 3D запрещена. Можно как-то сделать, чтобы запускался Autocad, но не с файлом из папки, а с новым файлом на основе нужного dwt-файла?
И (getvar "DWGNAME") после создания нового файла будет возвращать "Чертеж N", а мне нужно подключать файл с именем из папки. Т.е. как сохранить в начале скрипта имя текущего файла из папки?

Последний раз редактировалось АлексЮстасу, 28.08.2013 в 03:41.
АлексЮстасу вне форума  
 
Непрочитано 28.08.2013, 07:43
#40
trir


 
Регистрация: 18.12.2010
Сообщений: 5,115


Как меня тут поправили :
Код:
[Выделить все]
 (command "_qnew")
(setq layer_name "Т_город_500.TAB")
(setq path1 <путь 1>)
(setq path2 <путь 2>)
(command "_ADESETCRDSYS" "с" "Pulkovo42.LL" "вЫход")
(command "-MapImport" "mapinfo" (strcat path1 layer_name) "Нет" "С" "У" "Т_город_500" "С" "Д" "Код" "Д" "С" "В" "В")
(command "_saveas" "2007" (strcat path2 layer_name) "_close")
Цитата:
на основе нужного dwt-файла
для _qnew dwt настраивается в настройках акад'а
trir вне форума  
 
Непрочитано 28.08.2013, 16:46
#41
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,075


Цитата:
Сообщение от trir Посмотреть сообщение
Как меня тут поправили :
Код:
[Выделить все]
 (command "_qnew")
(setq layer_name "Т_город_500.TAB")
(setq path1 <путь 1>)
(setq path2 <путь 2>)
(command "_ADESETCRDSYS" "с" "Pulkovo42.LL" "вЫход")
(command "-MapImport" "mapinfo" (strcat path1 layer_name) "Нет" "С" "У" "Т_город_500" "С" "Д" "Код" "Д" "С" "В" "В")
(command "_saveas" "2007" (strcat path2 layer_name) "_close")
Плз, ткните пальцем, где в этом коде запомнить название файла, приходящего из bat-а. Я честно не вижу.
Цитата:
Сообщение от trir Посмотреть сообщение
для _qnew dwt настраивается в настройках акад'а
Можно и без настроек Автокада - использовать не _qnew, а _new. В последнем шаблон прописывают прямо.
Но вопрос был немного другой. Можно ли в bat-е для открывания Автокада сразу прописать нужный шаблон?

Последний раз редактировалось АлексЮстасу, 28.08.2013 в 16:52.
АлексЮстасу вне форума  
 
Непрочитано 28.08.2013, 17:44
1 | #42
bernata


 
Регистрация: 22.09.2005
здесь могла быть ваша реклама
Сообщений: 1,296


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Можно ли в bat-е для открывания Автокада сразу прописать нужный шаблон?
в bat'е (так же как и в ярлыке автокада, так и в ком. строке) можно поставить переключатель /t , а после него имя *.dwg или *.dwt файла, который будет запущен как шаблон вместе с автокад.
bernata вне форума  
 
Непрочитано 28.08.2013, 18:56
1 | #43
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от bernata Посмотреть сообщение
в bat'е (так же как и в ярлыке автокада, так и в ком. строке) можно поставить переключатель /t , а после него имя *.dwg или *.dwt файла, который будет запущен как шаблон вместе с автокад.
Все ключи командной строки

Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
где в этом коде запомнить название файла, приходящего из bat-а
1. Например в bate через SET запомнить в переменной имя файла, а в Автокаде через (getenv "имя_переменной") прочитать его.
2. В бате командой echo и > перенаправить вывод имени файла в файл, который потом прочитать лиспом. тынц
3. Как вариант не открывать пустой файл на основе шаблона, а в BAT'e копировать нужный шаблон в известное место под именем файла, который хотим подгрузить. Имя открытого файла и есть искомое имя файла, осталось только путь нужный подставить.
Надеюсь, понятно объяснил. Если что спрашивай
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 28.08.2013, 19:10
#44
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,075


Цитата:
Сообщение от bernata Посмотреть сообщение
в bat'е (так же как и в ярлыке автокада, так и в ком. строке) можно поставить переключатель /t , а после него , который будет запущен как шаблон вместе с автокад.
Я правильно понял, что при /t имя *.dwg или *.dwt файла Автокад откроет не файл из каталога, а новый файл?
Сейчас увидел, что Автокад пишет:
Цитата:
Нельзя задавать имя шаблона при открытии чертежа.
Имя шаблона игнорируется.
VVA - я не понимаю, куда в bat втискивать, допустим, SET? Вроде бы место для него не предусмотрено.
Допустим, в такой на основе Вашего старого:
Код:
[Выделить все]
ECHO OFF
md GOTOVO
FOR %%A IN (*.DWG) DO "C:\Program Files\Autodesk\AutoCAD Civil 3D 2012\acad.exe" %%A /B Trans_SC1.scr
Или в такой, с /t:
Код:
[Выделить все]
ECHO OFF
md GOTOVO
FOR %%A IN (*.DWG) DO "C:\Program Files\Autodesk\AutoCAD Civil 3D 2012\acad.exe" /t "C:\Users\mis\appdata\local\autodesk\c3d 2012\rus\template\acadiso_m.dwt" %%A /B Trans_SC1.scr
И, пардон, как записываются эти SET ? Как-то так: SET FL00=%%A? Или с одним процентом?
Наугад написал:
Цитата:
FOR %%A IN (*.DWG) DO "C:\Program Files\Autodesk\AutoCAD Civil 3D 2012\acad.exe" /t "C:\Users\mis\appdata\local\autodesk\c3d 2012\rus\template\acadiso_m.dwt" %%A SET FL00=%%A /B Trans_SC2.scr
Автокад пока мне отвечает:
Цитата:
Команда: (getenv "FL00")
nil

Последний раз редактировалось АлексЮстасу, 28.08.2013 в 20:16.
АлексЮстасу вне форума  
 
Непрочитано 29.08.2013, 10:10
1 | #45
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


АлексЮстасу, Разархивируй архив в какую-либо папку и запусти ustas.bat. В файле autocad.bat поправь путь к автокаду
PS А мне больше вариант 3 нравится. Тем более, что
Цитата:
Нельзя задавать имя шаблона при открытии чертежа.
Вложения
Тип файла: zip ustas.zip (22.1 Кб, 72 просмотров)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 31.08.2013, 05:12
#46
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,075


Цитата:
Сообщение от VVA Посмотреть сообщение
апусти ustas.bat. В файле autocad.bat поправь путь к автокаду
PS А мне больше вариант 3 нравится. Тем более, что
Цитата:
Нельзя задавать имя шаблона при открытии чертежа.
Спасибо! Кое-как удалось запустить этот bat со своим скриптом. Сам мой скрипт и мешал в основном. Точнее, моя тупость
Но одна засада есть - не подключается файл-источник данных командой Map 3D.
Цитата:
Какие чертежи подключить (? - список): (getenv "FL00")
Выбрано чертежей: 0.
Засада оказалась, во-первых, в том, что команде подключения чертежей нужен к имени еще и полный путь. Заполучил его с помощью %~dp0.
Но вторая засада в том, что при подключении/отключении средствами Map 3D путь с именем необходимо задавать без кавычек. А (getenv "FL00") выдает в кавычках.
Как с такой бедой бороться?

Все-таки свершилось. Почему-то из команды и параметров, записанных в скрипте лисп-выражением, все сделалось. В нем кавычки имени файла воспринялись как кавычки параметра?

Последний раз редактировалось АлексЮстасу, 31.08.2013 в 05:59.
АлексЮстасу вне форума  
 
Непрочитано 31.08.2013, 09:33
#47
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Если на машинах пользователей операционная система не старее, чем Windows Vista, то скрипты гораздо удобней (и приятней) писать на PowerShell. В коде таких скриптов можно использовать различные технологии, в т.ч. и платформу .Net: непосредственно в коде скрипта, можно даже свои типы создавать (классы со свойствами и методами), подходящие под конкретные задачи, решаемые скриптом. Причём в Windows для PowerShell встроен и довольно удобный родной редактор. Присутствует возможность, к примеру, запускать скрипт на исполнение, просматривая результаты его работы без фактического выполнения скрипта. Т.е. если ваш скрипт должен выборочно удалить некоторые файлы, то запустив скрипт в таком режиме, вы увидите, какие файлы были бы удалены, в случае реального запуска. Если Windows XP, то PowerShell придётся ставить отдельно (бесплатен и доступен для скачивания). Те, кто имеет некоторый опыт написания кода на .NET могут неплохо развернуться на данном поле... PowerShell может всё то, что может cmd.exe и сверх этого много-много более. Майкрософт разработала и внедрила в Windows эту программу, дабы создать более мощную замену для cmd.exe: Cmd.exe нервно курит в сторонке. PowerShell, в отличие от cmd.exe и bash оперирует не текстом, а объектами (со всеми вытекающими плюшками). Если уж есть возможность, то писать скрипты лучше сразу на PowerShell. имхо.

Если интерес к указанному инструменту возникнет, то в качестве ознакомления можно почитать некоторые мои зарисовки по теме:
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

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

Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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