dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

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

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

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

Romazn вне форума Вставить имя

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

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


См. vl-directory-files и его опции.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 25.04.2017, 13:37
#3
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,509
Отправить сообщение для VVA с помощью ICQ Отправить сообщение для 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
Сообщений: 8


Большое спасибо, более менее разобрался в этом) но теперь столкнулся с непонятной мне проблемой)
Вот код:
Код:
[Выделить все]
 (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
С.-Петербург
Сообщений: 34,654


Во-первых, оформи все в функцию. Во-вторых, слеши либо обратные, либо сдвоенные.
__________________

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


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


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

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,509
Отправить сообщение для VVA с помощью ICQ Отправить сообщение для 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
Сообщений: 110


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

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


Ок, не вопрос. Я их постоянно путаю
__________________

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


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


Попробовал я с 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
С.-Петербург
Сообщений: 34,654


Есть одно "но": при выполнении vla-open AutoCAD может запросто переключиться в открытый документ. И выполнение твоего кода остановится, пока ты не вернешься в исходный файл.
Решения для пакетной обработки файлов на форуме (и не только на форуме) были - советую поискать.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 28.04.2017, 16:50
#12
VVA

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


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


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


Цитата:
Сообщение от Кулик Алексей 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
Просмотров: 11
Размер:	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
С.-Петербург
Сообщений: 34,654


Так, еще разок. 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

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||


Размещение рекламы