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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как в лисп PurgeFiles.lsp внедрить команду _.laydel, чтобы это работало

Как в лисп PurgeFiles.lsp внедрить команду _.laydel, чтобы это работало

Ответ
Поиск в этой теме
Непрочитано 04.03.2019, 17:29
Как в лисп PurgeFiles.lsp внедрить команду _.laydel, чтобы это работало
Чигинский Дмитрий
 
ГИП
 
Тула
Регистрация: 09.09.2006
Сообщений: 112

Здравствуйте, помогите, пожалуйста скрестить ежа с ужом, а именно, решить задачу удаления конкретного слоя (имеющегося во всех файлах) и очистки файлов в рамках иерархической структурой папок.

Исходные данные.
1. Имеется работающая функциональность удаления слоя "_Подписи" и очистки файла командой "SuperPurge" посредством кнопки на панели быстрого доступа в AutoCAD 2018 к которой привязан следующий макрос:
Код:
[Выделить все]
^C^C^R_laydel;_name;_Подписи;^C^C_-Purge;_All;;_No;^C^C_.audit;_y;_-Purge;_All;;_No;_-Purge;_All;;_No;
2. Всё устраивает пока файлов до 10 шт., но когда файлов кратно больше и они разложены по подпапкам хотелось бы процесс автоматизировать, пусть и под контролем человека.

3. Поиском были обнаружены следующие части мозайки:

3.1. Лисп, работающий, найдены здесь на форуме http://forum.dwg.ru/showpost.php?p=569996&postcount=13 и/или http://forum.dwg.ru/showpost.php?p=54725&postcount=3,
посредством которого происходит обход и очистка файлов, в том числе, по иерархической структуре папок.
Код:
[Выделить все]
 
;;;CADALYST 03/05 Tip2023: PurgeFiles.lsp	Directory Clean Up	(c) Andrzej Gumula


;;; [c]2004 Andrzej Gumula, Katowice, Poland
;;; e-mail: a.gumula@wp.pl
;;; This routine purge dwg files from selected folder


(vl-load-com)

(defun c:PurgeFiles (/ FilesList DwgPath SubDir Files File)

(defun GetFolder (/ Dir Item Path)
 (cond
  ((setq Dir (vlax-invoke (vlax-get-or-create-object "Shell.Application") 'browseforfolder 0 "Выберите папку с DWG файлами:" 1 ""))
   (cond
    ((not (vl-catch-all-error-p (vl-catch-all-apply 'vlax-invoke-method (list Dir 'Items))))
     (setq Item (vlax-invoke-method (vlax-invoke-method Dir 'Items) 'Item))
     (setq Path (vla-get-path Item))
     (if (not (member (substr Path (strlen Path) 1) (list "/" "\\")))
      (setq Path (strcat Path "\\"))
     );end if
    )
   );end cond
  )
 );end cond
 Path
);end GetFolder


(defun vl-findfile (Location / DirList Path AllPath)
 (MakeDirList Location)
 (setq DirList (cons Location DirList))
 (foreach Elem DirList 
  (if (setq Path (vl-directory-files Elem "*.dwg"))
   (foreach Item Path (setq AllPath (cons (strcat Elem "/" Item)  AllPath)))
  );end if
 )
 (reverse AllPath)
);end vl-findfile

(defun MakeDirList (Arg / TmpList)
 (setq TmpList (cddr (vl-directory-files Arg nil -1)))
 (cond
  (TmpList
   (setq DirList (append DirList (mapcar '(lambda (z) (strcat Arg "/" z)) TmpList)))
   (foreach Item TmpList (MakeDirList (strcat Arg "/" Item)))
  )
 );end cond
);end MakeDirList

(if (not FileSystemObject)
  (setq FileSystemObject (vla-getInterfaceObject (vlax-get-acad-object) "Scripting.FileSystemObject"))
);end if

(cond
((= (getvar "SDI") 0)
(cond
 ((setq DwgPath (GetFolder))
  (initget "Yes No")
  (setq Subdir (cond ((getkword "\nИскать во вложенных папках? No,[Yes]: "))
		     (T "Yes")))
  (if (equal SubDir "Yes")
   (setq Files (vl-findfile (substr DwgPath 1 (1- (strlen DwgPath)))))
   (setq Files (mapcar '(lambda (x) (strcat dwgpath x))(vl-directory-files DwgPath "*.dwg" 1)))
  );end if
  (setq Files (mapcar 'strcase Files))
  (cond
    (Files
     (vlax-for & (vla-get-documents (vlax-get-acad-object )) (setq FilesList (cons (strcase (vla-get-fullname &)) FilesList)))
     (foreach & Files
      (cond
	((not (member & FilesList ))
         (cond
	  ((/= (logand (vlax-get-property (vlax-invoke-method FileSystemObject 'getfile &) 'Attributes) 1) 1)
	   (cond
	     ((setq File (vla-open (vla-get-documents (vlax-get-acad-object)) &))
	      (prompt (strcat "\nPurge " & ". Please wait..."))
              (vla-purgeall File)
	      (prompt (strcat "\nSave and close " &))
	      (vla-save File)
	      (vla-close File)
	      (vlax-release-object File)
	     )
	     (T (prompt (strcat "\nCannot open " & "\nDrawing file was created by an incompatible version. ")))
	   );end cond
	  )
	  (T (prompt (strcat & " is read-only. Purge canceled. ")))
	 );end cond
	)
	(T (prompt (strcat & " is open now. Purge canceled. ")))
      );end cond

     );end foreach
    )
    (T (prompt "\nNothing files found to purge. "))
  );end cond
 )
 (T (prompt "\nNothing selected. "))
);end cond
)
(T (prompt "\nThe routine is not available in SDI mode. "))
);end cond
(princ)
);end c:PurgeFile

(prompt "\nLoaded new command PurgeFiles. ")
(prompt "\n[c]2004 Andrzej Gumula. ")
(princ)
3.2. Команда на лисп http://www.arch-pub.com/Laydel-in-Lisp_10744991.html для удаления слоёв и всего, что в них содержится:
Код:
[Выделить все]
(command "_.laydel" "n" "_Подписи" "" "y")
Прошу подсказать каким образом можно совместить одно с другим, чтобы реализовать указанную выше задачу.

Заранее благодарю.
__________________
С уважением, Чигинский Дмитрий.
Просмотров: 2564
 
Автор темы   Непрочитано 07.03.2019, 13:11
#21
Чигинский Дмитрий

ГИП
 
Регистрация: 09.09.2006
Тула
Сообщений: 112
<phrase 1= Отправить сообщение для Чигинский Дмитрий с помощью Yahoo Отправить сообщение для Чигинский Дмитрий с помощью Skype™


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Блоки *D, *T - это соответственно блоки размеров и таблиц.
Если хочешь, повтори три раза строку с очисткой - уйдут.
Благодарю!

Цитата:
Сообщение от doctorraz Посмотреть сообщение
ну коль консольный АК не взлетел....
Спасибо за уточнение, теперь то что и было нужно.

Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
ExplodeProxyXXX.crx то загружается и работает.
Надо попробовать ExplodeProxyXXX встроить на досуге.
Как понимаю, будет тогда вообще шикарно.
__________________
С уважением, Чигинский Дмитрий.
Чигинский Дмитрий вне форума  
 
Непрочитано 07.03.2019, 14:09
#22
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 1,544
Отправить сообщение для doctorraz с помощью Skype™


Цитата:
Сообщение от Чигинский Дмитрий Посмотреть сообщение
Надо попробовать ExplodeProxyXXX встроить на досуге.
никаких проблем его встроить...
скачиваешь, подгружаешь один раз в АК (можно просто мышкой *.arx перетащить в окно чертежа)), потом в скрипт добавляешь перед окончательной очисткой и аудитом
Код:
[Выделить все]
EXPLODEALLPROXY
REMOVEALLPROXY
__________________
Мастерская СПДС
doctorraz на форуме  
 
Непрочитано 07.03.2019, 14:43
#23
koMon


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Еще в 2005 году было обсуждение на другом форуме (caduser.ru) про скорость и особенности работы лиспа на неактивном документе.
пакетник для каждого файла условия каждый раз запускает акад (1), открывает файл (2), запускает команды из скрипта (3), которые в том числе содержат код лиспа, сохраняет файл (4), закрывает акад (5). и эти 5 операций будут производится для каждого файла!
если делать лисп по первоначальном варианту tc, то получим следующее. открываем акад (-2) однократно!, открываем какой-то dwg/создаём новый (-1) однократно!, загружаем лисп (0) однократно!, запускаем загруженную команду (1) для выбора группы файлов, обрабатываем файл (2, 3, 4).
то есть в этих двух вариантах действия пересекаются только в пунктах 2, 3, 4. во втором случае исключаются временные интервалы (1+5)*количество файлов. таким образом теоретически и я думаю практически скорость обработки группы файлов по второму сценарию будет всё-таки больше) да к тому же vla методы работают ГОРАЗДО быстрее нежели методы командные.
koMon вне форума  
 
Непрочитано 07.03.2019, 15:53
#24
frostmourn


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
koMon, я много раз пробовал провести аудит на нетекущем документе (вплоть до 2018 версии; на 2019 не проверял) - не работало. Как и vla-purgeall
Только что пробовал - работает.
frostmourn вне форума  
 
Непрочитано 07.03.2019, 15:57
#25
Кулик Алексей aka kpblc
Moderator

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


Уточнение: я документы открывал через ObjectDBX.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.03.2019, 16:16
#26
Сергей812


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


Цитата:
Сообщение от koMon Посмотреть сообщение
пакетник для каждого файла условия каждый раз запускает акад (1), открывает файл (2), запускает команды из скрипта (3), которые в том числе содержат код лиспа, сохраняет файл (4), закрывает акад (5). и эти 5 операций будут производится для каждого файла!
если делать лисп по первоначальном варианту tc, то получим следующее. открываем акад (-2) однократно!, открываем какой-то dwg/создаём новый (-1) однократно!, загружаем лисп (0) однократно!, запускаем загруженную команду (1) для выбора группы файлов, обрабатываем файл (2, 3, 4).
то есть в этих двух вариантах действия пересекаются только в пунктах 2, 3, 4. во втором случае исключаются временные интервалы (1+5)*количество файлов. таким образом теоретически и я думаю практически скорость обработки группы файлов по второму сценарию будет всё-таки больше) да к тому же vla методы работают ГОРАЗДО быстрее нежели методы командные.
Очень существенная разница между открытием чертежа в явном виде с его неизбежной активацией, регенерацией и т.д. - и открытием БД чертежа. Для пакетной обработки приемлю только последнее.
Offtop:
Кстати, привязкой к активному окну документа и тот же эксель страдает при выполнении кода VBA - ряд операций с группами ячеек (сортировка, ресайз) не на активном листе вызывает явления: от появления артефактов отображения до появления ошибки кода, а в особо тяжелых случаях - и вылета приложения.
Сергей812 вне форума  
 
Непрочитано 07.03.2019, 20:47
#27
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 1,544
Отправить сообщение для doctorraz с помощью Skype™


извините, что вмешиваюсь в столь высокоинтелектуальный спор, без сомнения все эти технологии хороши, но я пока не увидел ни одной строчки высокого кода. по теме топа.. ну впрочем не об этом.. если скриптом удалять несуществующий слой, то все дело сразу стопорится..
учитывая, что ТС просил помощь, а все отписавшиеся тут де факто ее оказывают, ну и типо я тож помогаю, но в лиспе Е-10..уважаемые, коль отписались в теме.. может чтонить по теме сможете набросать коду кагонить легкоприменимого для ламеров мимоходом так

----- добавлено через ~4 мин. -----
насколько я понял не важно за сколько времени, важен результат
чреслами мериться тут мудрым мужам, да еще пред юнцами... ну вы поняли уважаемые..
__________________
Мастерская СПДС
doctorraz на форуме  
 
Непрочитано 07.03.2019, 21:00
#28
Кулик Алексей aka kpblc
Moderator

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


Если "нужен результат, по-быстрому и с минимальными затратами" - то scr, консольный acad и понеслась.
Если чистый лисп, то ситуация меняется очень сильно. И нарисовать код "на ура" вряд ли получится. По крайней мере у меня...
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.03.2019, 22:01
#29
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 1,544
Отправить сообщение для doctorraz с помощью Skype™


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
то scr, консольный acad и понеслась.
по опыту предыдущих стрельб убедились, что консоль много чо не может.. в т.ч. удалять слои((((
теесу вроде скорость не критична, но при удалении несуществующего слоя процесс останавливается..
в принципе маленький лисп проверки слоя перед удалением ему бы помог наверное, но возможно он уже все сделал руками, пока тут обсуждают какая технология работает эффективнее))

----- добавлено через ~12 ч. -----
Цитата:
Сообщение от Чигинский Дмитрий Посмотреть сообщение
Хотя возникает желание перед удалением слоя поставить условие-проверку о его наличии в файле)
Можно ли это организовать?
строчку в скрипте с удалением слоя меняем на эту
Код:
[Выделить все]
(if (/= (tblsearch "Layer" "_Подписи") nil) (command "_.laydel" "_n" "_Подписи" "" "_y"))
__________________
Мастерская СПДС

Последний раз редактировалось doctorraz, 08.03.2019 в 10:18. Причина: укоротил))
doctorraz на форуме  
 
Непрочитано 08.03.2019, 18:11
1 | #30
Кулик Алексей aka kpblc
Moderator

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


Или так:
Код:
[Выделить все]
(if (tblsearch "Layer" "_Подписи") (command-s "_.-laydel" "_n" "_Подписи" "" "_y"))
__________________

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


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Уточнение: я документы открывал через ObjectDBX.
ну так это как бы совсем другое дело, а то, Алексей, вводишь людей в заблуждения, а они верют

----- добавлено через ~4 мин. -----
Цитата:
Сообщение от doctorraz Посмотреть сообщение
но я пока не увидел ни одной строчки высокого кода. по теме топа..
ну ежели по быренькому, на низком так сказать полёте, то можно, например, выполнить такой лисп, предварительно забив полный путь для обрабатываемой папки:
Код:
[Выделить все]
 
(setq work_directory "Диск:\\Рабочая папка\\")
(foreach dwg_file (vl-directory-files work_directory "*.dwg" 1)
	(princ (strcat "\nДокумент \"" (strcat work_directory dwg_file) "\" открыт"))
	(setq document_to_process (vla-open (vla-get-documents (vlax-get-acad-object)) (strcat work_directory dwg_file))
		  dwg_Layers_collection (vla-get-Layers document_to_process)
		  layer_to_delete_name "_Подписи"
	)
	(if (/= 'vl-catch-all-apply-error (type (setq layer_to_delete (vl-catch-all-apply 'vla-item (list dwg_Layers_collection layer_to_delete_name)))))
		(progn
			(princ (strcat "\nСлой \"" (vla-get-name layer_to_delete) "\" удалён"))
			(if (= 'vl-catch-all-apply-error (type (vl-catch-all-apply 'vla-delete (list layer_to_delete))))
				(progn
					(vla-put-activelayer document_to_process (vla-item dwg_Layers_collection "0"))
					(vla-delete layer_to_delete)
				)
			)
		)
		(princ (strcat "\nСлой \"" layer_to_delete_name "\" не найден"))
	)
	(princ (strcat "\n        Purging all..."))
	(vla-purgeall document_to_process)
	(princ (strcat "готово"))
	(princ (strcat "\n        Auditing..."))
	(vla-AuditInfo document_to_process :vlax-true)
	(princ (strcat "готово"))
	(vl-catch-all-apply 'vla-save (list document_to_process))
	(vla-close document_to_process)
	(princ (strcat "\nДокумент \"" (strcat work_directory dwg_file) "\" закрыт\n"))
)
(princ)

Последний раз редактировалось koMon, 12.03.2019 в 13:48.
koMon вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как в лисп PurgeFiles.lsp внедрить команду _.laydel, чтобы это работало

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать, чтобы ключевые слова отображались в менюшке? -mavlin- Программирование 3 06.05.2009 15:32
Задумал лисп для layout Red Nova LISP 40 05.06.2008 17:59
Нужен маленький лисп - для текста maksimys LISP 2 28.11.2007 08:51
Нужен лисп (пронизыватель лайаутов) dextron3 LISP 91 25.07.2007 07:37
Из лиспа в команду. Pave1 LISP 4 25.07.2005 16:08