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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Операции с папками и путями

Операции с папками и путями

Ответ
Поиск в этой теме
Непрочитано 24.11.2010, 21:00 #1
Операции с папками и путями
swkx
 
Регистрация: 22.01.2010
Сообщений: 311

Что-то я перегрелся к вечеру

Объясните, плиз, как строку

X:\Dir1\Dir2
преобразовать в строку
X:\\Dir1\\Dir2
Какая-то неразбериха с кавычками и слэшами...

И ещё: можно ли программно получить путь папки Рабочего стола ?

Последний раз редактировалось swkx, 24.11.2010 в 21:09.
Просмотров: 5235
 
Непрочитано 24.11.2010, 21:51
#2
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,238
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от swkx Посмотреть сообщение
преобразовать в строку
Зачем?
Цитата:
Сообщение от swkx Посмотреть сообщение
И ещё: можно ли программно получить путь папки Рабочего стола ?
Можно. Как вариант прочитать значение переменной Desktop из ключа реестра:
Код:
[Выделить все]
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 24.11.2010, 22:01
#3
swkx


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


Спасибо!

А вопрос про преобразования строк всплыл, потому что оказалось, что функция

(vl-string-subst "НовыйКусокСтроки" "СтарыйКусокСтроки" ВсяСтрока)

почему-то меняет только первый попавшийся ей на глаза "СтарыйКусокСтроки".
А остальными, если таковые имеются, что делать ?

Последний раз редактировалось swkx, 24.11.2010 в 22:32.
swkx вне форума  
 
Непрочитано 25.11.2010, 09:54
#4
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,843


Цитата:
Сообщение от swkx Посмотреть сообщение
почему-то меняет только первый попавшийся ей на глаза "СтарыйКусокСтроки".
А остальными, если таковые имеются, что делать ?
Изучать рекурсию.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 25.11.2010, 10:51
#5
swkx


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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Изучать рекурсию.
Ну! Так каждый дурак может

Просто гораздо логичнее выглядело бы
(vl-string-subst "НовыйКусокСтроки" "СтарыйКусокСтроки" "ВсяСтрока" [СкокаРазЗаменить])

Нет параметра [СкокаРазЗаменить] - меняй всё подряд.

Или похожая функция всё-таки есть ?
swkx вне форума  
 
Непрочитано 25.11.2010, 11:01
#6
hwd

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


Цитата:
Сообщение от swkx Посмотреть сообщение
Или похожая функция всё-таки есть ?
Даже если нет, что мешает самому написать её? За то время, что ты здесь потратил на этот топик, уже можно было 100 раз написать её и забыть за проблему.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 25.11.2010, 11:16
#7
swkx


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


hwd, прав абсолютно!

Если бы проблема не отпала сама собой через час после появления, так бы и сделал.

А так, поскольку я старый и ленивый, решил просто поворчать и мысли высказать
swkx вне форума  
 
Непрочитано 25.11.2010, 12:02
#8
Do$

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


Иногда полезно заглянуть в готовые функции:
http://forum.dwg.ru/showthread.php?t=15661
Do$ вне форума  
 
Непрочитано 26.04.2012, 11:02
#9
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,235


Может, уже и не актуально, но всё же отпишусь. Если речь о системной переменной DWGPREFIX, которая возвращает путь расположения текущего файла чертежа в виде X:\Dir1\Dir2\, то конструкция (getvar "DWGPREFIX") вернёт X:\\Dir1\\Dir2\\

>Do$
а готовая библиотечная функция dwgru-string-replace слэши воспринимает как переход на новую строку - и ничего не выходит.
skkkk на форуме  
 
Непрочитано 26.04.2012, 12:32
#10
Do$

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


Цитата:
Сообщение от skkkk Посмотреть сообщение
а готовая библиотечная функция dwgru-string-replace слэши воспринимает как переход на новую строку - и ничего не выходит
Вот лично я из этой фразы проблемы не понял. Лучше код показывайте, а то когда вы своими словами что-то объяснять пытаетесь, мозг взрывается
Do$ вне форума  
 
Непрочитано 26.04.2012, 14:54
#11
VVA

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


Цитата:
Сообщение от swkx Посмотреть сообщение
можно ли программно получить путь папки Рабочего стола ?
Парочку функций
Код:
[Выделить все]
(defun mip-get-special-folder (folder / WS ret)
;;; Функция для определения одной из "специальных папок" Windows
;;; folder может быть:
;;; "AllUsersDesktop" - Windows 2000, Windows XP
;;; "AllUsersStartMenu" - Windows 2000, Windows XP
;;; "AllUsersPrograms" - Windows 2000, Windows XP
;;; "AllUsersStartup" - Windows 2000, Windows XP
;;; "Desktop" - Windows 98/ME, Windows 2000, Windows XP
;;; "Favorites" - Windows 98/ME, Windows 2000, Windows XP
;;; "Fonts" - Windows 98/ME, Windows 2000, Windows XP
;;; "MyDocuments" - Windows 98/ME, Windows 2000, Windows XP
;;; "NetHood" - Windows 98/ME, Windows 2000, Windows XP
;;; "PrintHood" - Windows 98/ME, Windows 2000, Windows XP
;;; "Programs" - Windows 98/ME, Windows 2000, Windows XP
;;; "Recent" - Windows 98/ME, Windows 2000, Windows XP
;;; "SendTo" - Windows 98/ME, Windows 2000, Windows XP
;;; "StartMenu" - Windows 98/ME, Windows 2000, Windows XP
;;; "Startup" - Windows 2000, Windows XP
;;; "Templates" - Windows 2000, Windows XP
;;; Возвращает или путь, или ""
;;; Пример:
;;;  (mip-get-special-folder "PrintHood")
(vl-load-com)
  (and
    (setq WS (vlax-get-or-create-object "WScript.Shell"))
    (setq folder (mip-conv-to-str folder))
    (setq ret (vlax-invoke-method (vlax-get-property WS "SpecialFolders") "Item" folder))
    (vlax-release-object ws)
    )
  ret
);defun
и
Код:
[Выделить все]
(defun _GetSpecialFolder ( int / fso fob res )
;;; USE: (_GetSpecialFolder 0) ;_"C:\\Windows"
;;; USE: (_GetSpecialFolder 1) ;_"C:\\Windows\\System32"
;;; USE: (_GETSPECIALFOLDER 2) ;_"C:\\Users\\azarko\\AppData\\Local\\Temp"
;;; http://www.theswamp.org/index.php?topic=39415.0
;;; http://msdn.microsoft.com/en-us/library/a72y2t1c%28v=VS.85%29.aspx
    (vl-catch-all-apply
       '(lambda nil
            (setq fso (vlax-create-object "Scripting.FileSystemObject")
                  fob (vlax-invoke-method fso 'getspecialfolder int)
                  res (vlax-get-property fob 'path)
            )
        )
    )
    (if fob (vlax-release-object fob))
    (if fso (vlax-release-object fso))
    res
)
По поводу замены можно попробовать эту
Код:
[Выделить все]
    (defun mip-string-subst (newchar curchar str / pos)
    ;|===========================================================================================
Функция заменяет в строке str все встречающие сочетания символов chars_old на chars_new. 
Фактически является расширением функции vl-string-subst, которая заменяет только первое
попавшееся сочетание
* Регистрозависимо
*	newchar	новая подстрока
*	curchar	старая подстрока
*	str		исходная строка
*    Примеры вызова:
(mip-string-subst "Па" "Ма" "Мама мыла раму")
; "Пама мыла раму" 
=============================================================================|;      
      (setq pos 0)
      (while (setq pos (vl-string-search curchar str pos))
        (setq str (vl-string-subst newchar curchar str)
              pos (+ (strlen newchar) pos)
        ) ;_ end of setq
      ) ;_ end of while
      str
    ) ;_ end of defun
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 26.04.2012, 16:24
#12
gomer

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


skkkk, надеюсь ты уже понял, где слажал, если нет, то:
Код:
[Выделить все]
 (princ (getvar 'dwgprefix))
Цитата:
Сообщение от Do$ Посмотреть сообщение
Иногда полезно заглянуть в готовые функции:
а иногда и вредно!
gomer вне форума  
 
Непрочитано 26.04.2012, 16:24
#13
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,235


Цитата:
Сообщение от Do$ Посмотреть сообщение
Лучше код показывайте, а то когда вы своими словами что-то объяснять пытаетесь, мозг взрывается
Да, сэнсэй, как скажешь... Мозг-то собрать смогёшь? ("Вы" - это мы - ламеры, как я понимаю)

Код:
[Выделить все]
(dwgru-string-replace "X:\Dir1\Dir2" "\" "\\")
- вот так не выходит. Только непонятно, что непонятного? Как правильно-то эту загвоздку объяснить?
>VVA
Код:
[Выделить все]
(mip-string-subst "\\" "\" "X:\Dir1\Dir2")
- тоже не получается. В обоих случаях выдает В принципе, замена одного символа на два таких же работает, но не со слэшем.
skkkk на форуме  
 
Непрочитано 26.04.2012, 16:48
#14
Do$

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


Код:
[Выделить все]
"X:\Dir1\Dir2"
- откуда такая строка появляется? В лиспе она равнозначна вот такой:
Код:
Если же в строке есть одинарные слеши, то строка должна выглядеть так: "X:\\Dir1\\Dir2". Эта особенность из-за использования такого слеша в спецсимволах: \n, \r, \t и т.п.
Это еще полезно почитать.
Do$ вне форума  
 
Непрочитано 26.04.2012, 17:31
#15
gomer

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


Цитата:
Сообщение от Do$ Посмотреть сообщение
- откуда такая строка появляется?
из командной строки
gomer вне форума  
 
Непрочитано 26.04.2012, 20:22
#16
Кулик Алексей aka kpblc
Moderator

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


gomer, что-то у тебя не то:
Код:
[Выделить все]
Command: (setq aa (getstring t "\nEnter string:"))

Enter string:c:\program files\autocad 2009
"c:\\program files\\autocad 2009"

Command: !aa
"c:\\program files\\autocad 2009"
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.04.2012, 20:27
#17
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,235


Цитата:
Сообщение от Do$ Посмотреть сообщение
- откуда такая строка появляется?
см. #9. Я в лиспе нуб-самоучка, поэтому шагаю иной раз по граблям Ну не сразу я сообразил, что чтобы получить "X:\\Dir1\\Dir2", надо сказать (getvar "DWGPREFIX"), а не (dwgru-string-replace (vl-princ-to-string "DWGPREFIX") "\" "\\"). Ноги вообще растут отсюда.

Цитата:
Сообщение от gomer Посмотреть сообщение
skkkk, надеюсь ты уже понял, где слажал, если нет, то:

Код:
[Выделить все]
(princ (getvar 'dwgprefix))
Не понял... Это вернуло мне
Код:
[Выделить все]
E:\Temp\"E:\\Temp\\"
а мне-то нужно
Код:
. В чем подвох?
Вообще я уже написал себе команду, уже пользуюсь во всю, кайфую, осталось отлов ошибок замутить, обработку там кнопки Отмена и всякое такое... Выложу код тогда уж вам совсем поржать
Код:
[Выделить все]
(defun C:my-imageattach (/ pt1 pt2)
	(command 
		"_-image" 
		"В";русская опция 
		(strcat 
			(getvar "DWGPREFIX") 
			(vl-princ-to-string 
				(mydcl "Выберите файл" 
					(mapcar 
						(function 
							(lambda(x) 
								(strcat 
									(vl-filename-base x)
									(vl-filename-extension x)
								);end strcat
							);end lambda
						);end function
						(dwgru-browsefiles-in-directory (getvar "DWGPREFIX") "*.jpg" nil)
					);end mapcar
				);end mydcl
			);end vl-princ-to-string


		);end strcat 
		pause 
		"0.1" 
		""

		"_draworder"
		"_l"
		""
		"А";русская опция

		"_rotate"
		"_l"
		""
		(setq pt1 (getpoint "Укажите первую точку линии, которая должна стать горизонтальной"))
		"_r"
		(getvar "lastpoint")
		(setq pt2 (getpoint "Укажите вторую точку линии"))
		(polar pt1 0 5)
	);end command

);end defun
Используется функция mydcl от VVA и dwgru-browsefiles-in-directory. Команда выдает список растров в папке с текущим чертежом, вставляет выбранный, ну и так далее...
skkkk на форуме  
 
Непрочитано 26.04.2012, 20:44
#18
Кулик Алексей aka kpblc
Moderator

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


(setq aa (getvar 'dwgprefix))
И проверь значение аа.
__________________

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

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,235


Код:
[Выделить все]
(dwgru-browsefiles-in-directory (getvar "DWGPREFIX") "*.jpg" nil)
А так неправильно что ли? Работает ведь.
skkkk на форуме  
 
Непрочитано 26.04.2012, 21:13
#20
gomer

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


skkkk, посмотри функцию princ что она делает и что возвращает!
даю наводку, то что ты видишь в ком. строке вводит тебя в заблуждение
gomer вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Операции с папками и путями

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему после операции над 3D телом исчезают ручки sanchez206283 AutoCAD 20 19.10.2011 14:52
повторное выполнение операции с ощибкой msblast Программирование 7 14.03.2009 23:04
Булевы операции над объектами в AutoCAD MEP AlleksT Вертикальные решения на базе AutoCAD 5 25.08.2008 14:19
Невозможно провести булевы операции с солидами Torino AutoCAD 1 29.08.2003 17:15