Тема: LISP. Функция выбора папки.

Код не мой и приведен в теме "общее.... и т.д."
но учитывая количество связанных с этим вопросов посчитал необходимым вынести его отдельную тему

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;Функция вызывает окно выбора папки
;;;
;;;Аргументы - нет
;;;Возвращаемое значение - путь к папке вида:
;;;disc:\\dir1\\....\\dirN
;;;
;;;Вызов (BrowseFolder)
;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun BrowseFolder ( / ShlObj Folder FldObj OutVal)
  (vl-load-com)
  (setq
    ShlObj (vla-getInterfaceObject
       (vlax-get-acad-object)
       "Shell.Application"
     )
    Folder (vlax-invoke-method ShlObj 'BrowseForFolder 0 "" 0)
  )
  (vlax-release-object ShlObj)
  (if Folder
    (progn
      (setq
  FldObj (vlax-get-property Folder 'Self)
  OutVal (vlax-get-property FldObj 'Path)
      )
      (vlax-release-object Folder)
      (vlax-release-object FldObj)
      OutVal
    )
  )
)

Re: LISP. Функция выбора папки.

Здесь не хватает одной замыкающей скобки.

Re: LISP. Функция выбора папки.

> Владимир Громов
Исправлено.

Re: LISP. Функция выбора папки.

> den-si
Пожелание:
Может стоит завести в разделе "программирование" кроме ветки "готовые программы" еще одну, под названием "библиотечные функции"?
Уверен - у многих найдется что туда выложить.

Re: LISP. Функция выбора папки.

> Random
А чем они будут отличаться?

Re: LISP. Функция выбора папки.

> den-si
Тем что готовая программа предназначена для конечного пользователя. В результате ее выполнения получается некий конечный результат.
Библиотечные же функции больше интересны для таких как я людей с зачатками знаний и навыков в программировании и используются в качестве "кирпичей" при построении "готовых программ".
Разница налицо.

Re: LISP. Функция выбора папки.

Random пишет:

Разница налицо.

Не очевидно.

Re: LISP. Функция выбора папки.

> Random
В готовых программах в названии темы пишут
LISP.
ObjectARX.
Можно писать
LISP.LIB
ObjectARX.LIB

Re: LISP. Функция выбора папки.

> Random
IMHO, библиотечная функция хороша тогда, когда прозрачно ее применение и она явно востребована. Ну, или хотя бы к ней есть примеры применения. Иначе может получится просто архив личных функций, а пользователи разных уровней будут ломать голову, зачем это здесь и как этим воспользоваться. Все-таки пользователей больше интересует конечный результат, а не то, что возвращает та или иная функция. Я думаю, что интересные функции могут быть размещены и в этом разделе, если они снабжены примерами применения или достаточно подробным описанием.
Вот такое примечание к функции:

Код не претендует на оптимальность, более того он не мой, а мной немного модифицированный.
Тем не менее работает.

как-то настораживает, потому что доводка до ума "Готовой программы" вполне реальна, а кто будет "доводить" функцию, не зная, понадобится она кому-нибудь или нет?

Re: LISP. Функция выбора папки.

Было бы совсем неплохо, если бы знающие выложили еще и описание (НА РУССКОМ) параметров, входящих в используемой здесь

(vlax-invoke-method ShlObj 'BrowseForFolder Hwnd sTitle iOptions vRootFolder)

Т.е. я о "Hwnd" "sTitle" "iOptions" "vRootFolder".
Я, например, нашел на аглицком, но мое "со словарем..." НЕ ШИБКО!

Re: LISP. Функция выбора папки.

> Евгений Елпанов
Я поначалу так и назвал тему - с приставкой LIB, но приставка эта была ликвидирована.

> Владимир Громов
Для примера возьмем ф-цию смены координат:
https://www.caduser.ru/forum/topic21142.html
можно реализовать так как я это сделал в самом начале освоения лиспа:

(defun change_point (point    ;точка
         dx      ;смещение по х
         dy      ;смещение по y
         / new_point  ;измененная точка
                    )
  ;;изменение координаты х
  (setq  new_point
   (subst                         ;заменить
     (+ (car point) dx)    ;на новую x
     (car point)      ;старую x
     point      ;в координатах точки point
   )        ;end subst
  )          ;end setq
  (setq point new_point)
  ;;изменение координаты y
  (setq  new_point
   (subst
     (+ (cadr point) dy)    ;new y
     (cadr point)      ;old y
     point      ;list
   )        ;end subst
  )          ;end setq
)

А можно сделать так как предложил Runa:

(defun change_point (point    ;точка
         dx      ;смещение по х
         dy      ;смещение по y
(mapcar '+ point (list dx dy))
)

А так как посещают данный сайт не только юзеры, но и начинающие программисты типа меня, для того чтобы не вынуждать их изобретать велосипед,да еще и с квадратными колесами, я и выдвинул свое предложение. Это к вопросу о моем примечании насчет оптимальности.

Re: LISP. Функция выбора папки.

> kserg
Я и на английском у себя нигде не нашёл. А мне в этом диалоге больше всего не нравилось отсутствие возможности поместить фокус на конкретную папку, чтобы не надо было всегда дерево полностью разворачивать вручную. Если можно, вышлите описание. Пожалуйста.

Re: LISP. Функция выбора папки.

> JS
Ну описание найти не так уж сложно: http://msdn.microsoft.com/library/en-us … frame=true
А вот с фокусом на конкретную папку в VisualLisp - проблема. Для этой цели нужно передать имя callback-функции, которая установит эту папку в диалоге. Но IMHO в чистом VisualLISP это невозможно.

Re: LISP. Функция выбора папки.

JS пишет:

"...Если можно, вышлите описание..."

Вы уж извините за выставляемую мною ГАЛИМАТЬЮ, но это черновой (наспех) вариант и перевода, и экспериментов. Серьезно заняться еще не было времени. На аглицком - идите по ссылке, данной  Александр Ривилис (2005-10-04 18:11:59)
А на русском, уж не обессудьте :

; (vlax-invoke-method ShlObj 'BrowseForFolder Hwnd sTitle iOptions vRootFolder)
; Примеры:
;  (vlax-invoke-method ShlObj
;   'BrowseForFolder 0 "Текст под шапкой" 48 "E:\\ARHIV\\")
;  (vlax-invoke-method ShlObj 'BrowseForFolder 0 "" 512 "")
;Где:
;Hwnd   (обязательный параметр)
;  Дескриптор родительского окна диалогового окна (м.б. = 0)
;
;sTitle   (обязательный параметр)
;  Строка заголовка, отображаемого внутри диалогового окна (м.б. = "")
;
;iOptions   (обязательный параметр)
;  Целочисленное значение, которое содержит варианты метода.
;  Комбинация следующих значений
;      0  - ???
;      1  - RestrictToFilesystem  :
;         Рабочий стол
;           Мои документы
;           Мой компъютер
;           Сетевое окружение
;           Папка выгрузки Share-to-Web
;      2  - RestrictToDomain
;         Рабочий стол
;           Мои документы
;           Мой компъютер
;           Сетевое окружение
;             Корзина
;           Папка выгрузки Share-to-Web
;      8  - RestrictToSubfolders
;             как 1, но.........
;     16  - ShowTextBox
;             как 2, но.........
;             добавляется окно редактирования "Папка", где
;             можно вручную набрать путь к папке
;     32  - ValidateSelection
;             как 16, но.........
;             если пользователь напечатает недопустимое имя в
;             окне редактирования "Папка", то будет выдано
;             соответствующее предупреждение (если флаг 16
;             тоже определен)
;     64  - NewDialogStyle
;             как 16, но.........
;             используется (?) дополнительный интерфейс, для
;             чего предварительно перед запросом SHBrowseForFolder
;             следует вызвать (объявить ?) OleInitialize или
;             CoInitialize
;    128  - ???
;    256  - ???
;    512  - ???
;   1024  - ???
;   2048  - ???
;   4096  - BrowseForComputer
;             как 2, но.........
;   8192  - BrowseForPrinter
;             Обзор принтеров (?).........
;  16384  - BrowseForEverything
;             как 2, но.........
;             будут отображаться и файлы..........
;
;vRootFolder   (необязательный параметр)
;  Строка, определяющая папку (и все внутри ее; пользователь не сможет
;  просмотреть "дерево" папок выше этой папки; если это значение не
;  определено, то используется "рабочий стол"; если использовать строку
;  "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}", то предлагается только
;  содержимое "Мой компъютер", как раз то что надо!; м.б. = ""), или
;  одно из следующих значений :
;       0  - "C:\\Documents and Settings\\User\\Desktop"
;       1  -     не работает (Internet Explorer)
;       2  - "C:\\Documents and Settings\\User\\Start Menu\\Programs"
;       3  - "Панель управления"
;       4  - "Принтеры и факсы"
;       5  - "C:\\Documents and Settings\\User\\My Documents"
;       6  - "C:\\Documents and Settings\\User\\Favorites"
;       8  - "C:\\Documents and Settings\\User\\Recent"
;       7  - "C:\\Documents and Settings\\User\\Start Menu\\Programs\\Startup"
;       9  - "C:\\Documents and Settings\\User\\SendTo"
;      10  - корзина
;      11  - "C:\\Documents and Settings\\User\\Start Menu"
;      12  - "C:\\Documents and Settings\\User\\My Documents"
;      13  - "C:\\Documents and Settings\\User\\My Documents\\My Music"
;      14  - "C:\\Documents and Settings\\User\\My Documents\\My Videos"
;      15  - корзина
;      16  - "C:\\Documents and Settings\\User\\Desktop"
;      17  - "Мой компъютер" (то что надо!)
;      18  - "Сетевое окружение"
;      19  - "C:\\Documents and Settings\\User\\NetHood"
;      20  - "C:\\WINDOWS\\Fonts"
;      21  - "C:\\Documents and Settings\\User\\Templates"
;      22  - "C:\\Documents and Settings\\All Users\\Start Menu"
;      23  - "C:\\Documents and Settings\\All Users\\Start Menu\\Programs"
;      24  - "C:\\Documents and Settings\\All Users\\Start Menu\\Programs\\Startup"
;      25  - "C:\\Documents and Settings\\User\\Desktop"
;      26  - "C:\\Documents and Settings\\User\\Application Data"
;      27  - "C:\\Documents and Settings\\User\\PrintHood"
;      28  - "C:\\Documents and Settings\\User\\Local Settings\\Application Data"
;      29  - возможность неограниченного выбора конкретного пользователя
;      30  - возможность неограниченного выбора для всех пользователей
;      31  - "C:\\Documents and Settings\\All Users\\Favorites"
;      32  - "C:\\Documents and Settings\\User\\Local Settings\\Temporary Internet Files"
;      33  - "C:\\Documents and Settings\\User\\Cookies"
;      34  - "C:\\Documents and Settings\\User\\Local Settings\\History"
;      35  - "C:\\Documents and Settings\\All Users\\Application Data"
;      36  - "C:\\WINDOWS"
;      37  - "C:\\WINDOWS\\system32"
;      38  - "C:\\Program Files"
;      39  - "C:\\Documents and Settings\\User\\My Documents\\My Pictures"
;      40  - "C:\\Documents and Settings\\User"

Причем, следует иметь ввиду, что сие - есть опробованное в Win XP.

Re: LISP. Функция выбора папки.

Да......

Re: LISP. Функция выбора папки.

Спасибо! Похоже, что в нечистом тоже.

Re: LISP. Функция выбора папки.

Уважаемый Smel! Спасибо! И ещё маленькая просьба. Нельзя ли из приведённого кода вычистить то, что не касается VBA и поместить его на страничку: https://www.caduser.ru/forum/topic21141.html ? Там бы это неплохо смотрелось.
Всего хорошего.

Re: LISP. Функция выбора папки.

> den-si
Прошу прощения! Это я по ошибке сюда п …  18:57:54)
.
Если можно, его отсюда удалить, то лучьше это сделать. И эти строчки тоже.

Re: LISP. Функция выбора папки.

> JS
:) коммент рулит :) с лиспом не дружу, но недавно убедился, что зря. если вычеркнуть то, что не касаема VBA и VB, то останется как раз то, о чем я и не имею представление :( короче без сторонней помощи ничего у меня скоро не получится ;). Вот о чем идет речь https://www.caduser.ru/forum/topic22967.html