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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Получить список, состоящий из имен всех папок в каталоге.

Получить список, состоящий из имен всех папок в каталоге.

Ответ
Поиск в этой теме
Непрочитано 25.04.2017, 10:50 #1
Получить список, состоящий из имен всех папок в каталоге.
Romazn
 
Регистрация: 17.02.2017
Сообщений: 9

Добрый день!
Никак не могу найти ни одной подходящей команды. Может, кто сможет подсказать.
Нужна команда, которая смогла бы собрать все имена папок из одной конкретной папки в один список.
Например есть папка c:\archiv\ , в ней папки c:\archiv\1\, c:\archiv\2\, c:\archiv\3\, c:\archiv\4\, c:\archiv\5\.
должен получиться список (1.2.3.4.5).
Заранее спасибо)
Просмотров: 4122
 
Непрочитано 25.04.2017, 10:55
#2
Кулик Алексей aka kpblc
Moderator

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


См. vl-directory-files и его опции.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.04.2017, 13:37
#3
VVA

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


Visual Lisp - Directories and Files
DwgRuLispLib: получение списка файлов по маске с необязательной проверкой вложенных
LISP. Список файлов в каталоге и подкаталогах
Directory Files
read all lisp routeens found in sub-directorys of given parent folder
+
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
vl-directory-files и его опции.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 26.04.2017, 11:07
1 | #4
Romazn


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


Большое спасибо, более менее разобрался в этом) но теперь столкнулся с непонятной мне проблемой)
Вот код:
Код:
[Выделить все]
 (setq TT (cdr (assoc 1 (entget(car(entsel "\nSelect text:"))))))
(setq tr (atoi tt))
(setq arch (vl-directory-files "//PDC/Archiv/  Архив САВ"))
(setq rez 0)
(setq nom 0)
(while (/= rez nil)
  (setq nom (+ nom 1))
  (setq rez (substr (nth nom arch) 1 6))
  (setq rezt (atoi rez))
  (if (= rezt tr) (setq rez nil) )
  (setq nomr nom)
  )
(setq mash (nth nom arch))
(setq put (strcat "\\PDC\Archiv\  Архив САВ\" mash "\" tt ".dwg"))
(command "_open" put "")
А вот то, что он выдает. Я не пойму, что не так?
Код:
[Выделить все]
 "575100.2721156"
575100
(здесь очень длинная строка с перечислением всех папок)
0
0
667
"575100 (99402-0000010-04)"
; ошибка: неверный тип аргумента: stringp nil
Буду очень благодарен, если мне укажете на ошибки)

----- добавлено через ~5 мин. -----
Да, забыл. конечный путь выглядит так:
\\PDC\Archiv\ Архив САВ\575100 (99402-0000010-04)\575100.2721156.dwg
Romazn вне форума  
 
Непрочитано 26.04.2017, 12:10
#5
Кулик Алексей aka kpblc
Moderator

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


Во-первых, оформи все в функцию. Во-вторых, слеши либо обратные, либо сдвоенные.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 26.04.2017, 12:32
#6
Romazn


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


Так в этой строке же слеши в виде строки, и этот путь открывается в автокаде.
Код:
[Выделить все]
 (setq put (strcat "\\PDC\Archiv\  Архив САВ\" mash "\" tt ".dwg"))
командой
Код:
[Выделить все]
 (command "_open" put "")
А автокад понимает только прямые слеши
В функцию не оформлял потому что запускал пока через консоль лисп, так быстрее проверять) Это может влиять на работоспособность?
Romazn вне форума  
 
Непрочитано 26.04.2017, 18:30
#7
VVA

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
слеши либо обратные,
Цитата:
Сообщение от Romazn Посмотреть сообщение
А автокад понимает только прямые слеши
Сделай так, как у тебя в #4 в коде в строке №3
Цитата:
Сообщение от Romazn Посмотреть сообщение
(setq arch (vl-directory-files "//PDC/Archiv/ Архив САВ"))
Чтобы Автокад "понял" обратные слеши, добавь findfile
(без проверки)
Код:
[Выделить все]
(setq put (strcat "//PDC/Archiv/  Архив САВ/" mash "/" tt ".dwg"))
(command "_open" (findfile put) "")
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 27.04.2017, 09:28
#8
frostmourn


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


Offtop: Вообще-то, такой слэш "/" - прямой, такой "\" - обратный.
frostmourn вне форума  
 
Непрочитано 27.04.2017, 09:31
#9
Кулик Алексей aka kpblc
Moderator

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


Ок, не вопрос. Я их постоянно путаю
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 28.04.2017, 06:32
#10
Romazn


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


Попробовал я с fileopen. Ничего не работало( В итоге нашел на англоязычном форуме решение.
Выкладываю готовый код, вдруг кому пригодится.
Программа поиска и открытия файла в архиве.
Код:
[Выделить все]
 (defun c:otkr (/ tt tr arch rez nom rezt nomr mash put)
(setq TT (cdr (assoc 1 (entget(car(entsel "\nSelect text:"))))))
(setq tr (atoi tt))
(setq arch (vl-directory-files "//PDC/Archiv/  Архив САВ"))
(setq rez 0)
(setq nom 0)
(while (/= rez nil)
  (setq nom (+ nom 1))
  (setq rez (substr (nth nom arch) 1 6))
  (setq rezt (atoi rez))
  (if (= rezt tr) (setq rez nil) )
  (setq nomr nom)
  )
(setq mash (nth nom arch))
(setq put (strcat "//PDC/Archiv/  Архив САВ/" mash "/" tt ".dwg"))
(vla-open (vla-get-documents
(vla-get-application (vlax-get-acad-object))
)
put
)
  ); end_defun
Romazn вне форума  
 
Непрочитано 28.04.2017, 08:24
#11
Кулик Алексей aka kpblc
Moderator

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


Есть одно "но": при выполнении vla-open AutoCAD может запросто переключиться в открытый документ. И выполнение твоего кода остановится, пока ты не вернешься в исходный файл.
Решения для пакетной обработки файлов на форуме (и не только на форуме) были - советую поискать.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.04.2017, 16:50
#12
VVA

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


Последовательное применение lisp-функции к множеству файлов DWG
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 11.05.2017, 10:46
#13
Romazn


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Есть одно "но": при выполнении vla-open AutoCAD может запросто переключиться в открытый документ.
сначала не понял, о чем ты говоришь, но теперь дошло) Мне и нужно, что бы он на него переключался, это цель программы)
Но теперь возникла проблема, никак не могу понять, в чем ошибка. Вот код:
Код:
[Выделить все]
 (defun c:otkr (/ tt tr arch rez nom rezt nomr mash put)
(vl-load-com)
(setq TT (cdr (assoc 1 (entget(car(entsel "\nSelect text:"))))))   ; выбор текста и помещение его в ТТ
(setq tr (atoi tt))						   ; tr - номер машины
(setq arch (vl-directory-files "//PDC/Archiv/  Архив САВ"))	   ; Список ARCH - список всех папок архива
(setq rez 0)				
(setq nom 0)
(while (/= rez nil)						   ; пока rez не равно nil
  (setq nom (+ nom 1))						   ; перебор позиций в arch
  (setq rez (substr (nth nom arch) 1 6))			   ; оставляет первые 6 знаков названия папки
  (setq rezt (atoi rez))
  (if (= rezt tr) (setq rez nil) )				   ; если первые 6 зн совпали с номером машины
  (setq nomr nom)
  )
(setq mash (nth nom arch))					   ; название папки в переменной mash 

(setq rez 0)
(setq nom 0)
(setq base (vl-directory-files (strcat "//PDC/Archiv/  Архив САВ/" mash))) ; содержимое папки в переменную base
	
  	
 (while (/= rez nil)						;пока rez не равно nil
  (setq nom (+ nom 1))						;перебор номеров элементов
  (setq rez (nth nom base))					;переменная rez - n-ный элемент

   (if (and							
	(/= rez nil)						;если строка не равна nil
	(> (strlen rez) 5)					;если в строке элемента > 5 символов
	(= (wcmatch rez "*изм*") nil))				;если в строке элемента нет *изм*
      		(progn
		  (setq dl (- (strlen rez) 4))			;переменная dl - количество символов без расширения
		  (setq rez (substr rez 1 dl))))		;Убираем расширение файла

   (if (and							
	(/= rez nil)						;если строка не равна nil
	(= (wcmatch rez "*изм*") t))				;если в строке элемента есть *изм*
	 			(progn
				   (setq dl(VL-STRING-SEARCH "и" rez))		;переменная dl - количество символов до буквы "и"
				   (if (= (substr rez dl 1) " ") (setq dl (- dl 1))) ;если перед "и" пробел, то количество символов до него
				   (setq rez (substr rez 1 dl))))		;убираем из переменной rez часть, начинающуюся с изм..

  (if (and
	 (/= rez nil)
	 (= rez tt))  (progn			;если строка не равна nil и если rez = tt
		   	(setq rez nil)				;выход из цикла
		  	(setq tt (nth nom base))		;переменная tt - полное имя файла.
			))))
  )

(setq put (strcat "//PDC/Archiv/  Архив САВ/" mash "/" tt))
(vla-activate (vla-open (vla-get-documents (vla-get-application (vlax-get-acad-object)))put))
  ); end_defun
вот такая ошибка:
; ошибка: неверный тип аргумента: lentityp nil
но она вызвана тем, что цикл не находит значения, хотя с помощью точек останова я посмотрел, что такое значение есть, значит в коде я накосячил((
[IMG]http://i12.********/storage/6/2/9/Bezimyanni_5679491_26145629.png[/IMG]
вот скрин, не пойму, в чем проблема.
Заранее спасибо)) Если будут какие то еще косяки там у меня, буду рад, если укажете))
изображение чет не вставляется( вот на гугл диск ссылка https://drive.google.com/open?id=0B8...mtEb0xVby1rTE0
Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.png
Просмотров: 23
Размер:	104.5 Кб
ID:	187774  

Последний раз редактировалось Romazn, 11.05.2017 в 11:20.
Romazn вне форума  
 
Непрочитано 11.05.2017, 18:27
#14
Кулик Алексей aka kpblc
Moderator

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


Так, еще разок. lisp-функция выполняется в контексте документа, куда она загружена. Точка. При смене активного документа выполнение останавливается. Это во-первых.
Во-вторых, ты где-то намудрил со скобками.
В-третьих, выполняй код пошагово и смотри значения переменных. Учитывая, что я с другими документами работаю совершенно по-другому, а также то, что я не имею ни малейшего представления, что ты хочешь получить, в твоей ситуации придется разбираться тебе самому.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Получить список, состоящий из имен всех папок в каталоге.

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Lisp Как правильно получить список стилей ячеек табличного стиля? Kirill_Ja LISP 3 17.08.2016 17:30
C#. Получить список всех форматов для каждого принтера Leo_fmf Программирование 4 25.04.2015 22:36
Программно получить список системных переменных (без вывода в текстовый файл) Ax3 Программирование 3 27.12.2010 16:29
Как вывести список всех подпримитивов блока или др. элемента. Neo_ Программирование 16 25.01.2010 19:53
Помощь по Лире Серега М Лира / Лира-САПР 52 28.05.2007 02:47