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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Библиотека функций > DwgRuLispLib: Функция открытия диалога Open\Save As файла (файлов)

DwgRuLispLib: Функция открытия диалога Open\Save As файла (файлов)

Ответ
Поиск в этой теме
Непрочитано 13.01.2008, 15:35 #1
DwgRuLispLib: Функция открытия диалога Open\Save As файла (файлов)
Supermax
 
Руководитель фирмы
 
Москва
Регистрация: 28.03.2007
Сообщений: 1,831

Код:
[Выделить все]
;;; ************************************************************************
;;; * Библиотека DWGruLispLib Copyright ©2007  DWGru Programmers Group
;;; *
;;; * DwgRu-BrowseForFile
;;; *
;;; * 14/01/2008 Версия 0001.    Андрей Лазебный (Supermax), Кулик Алексей (Kpblc)
;;; ************************************************************************
;;; Функция использует функции свободно распостраняемой библиотеки  Allosys.dll
;;; Автор - Юрий Лукач © Студия "АЛЛО" http://allo.usaaa.ru/workshop/sample...ns/sysfuns.htm
;;; использование функции DwgRu-BrowseForFile требует инсталяцию данной библиотеки.
;;; В функции использована функция PL:String->List автор - Лоскутов П.В. 
;;; Опубликована в книге Полещук Н.Н. Лоскутов П.В."AutoLISP и Visual LISP в среде AutuCAD"
;;;
 ;;; Описание:
  ;;; Вызывает стандартный диалог Open/Save As и возвращает список состоящий из строк 
  ;;; в которых заключены полные пути и имена выбранных файлов, если нажато "Открыть", или список с пустой строкой, если нажато "Отмена".
 ;;; Синтаксис: 
  ;;; (dwgru-BrowseForFile toggle title initDir filter flags x y)
 ;;; Аргументы:
  ;;; toggle - тип диалога (строка) (true = Open, false = Save As), по умолчанию true
  ;;; title - заголовок диалога (строка), по умолчанию системный заголовок
  ;;; initDir - начальный каталог диалога (строка), по умолчанию текущий каталог
  ;;; filter - фильтры диалога (строка), по умолчанию "All files (*.*)|*.*|"
  ;;; flags - флаги диалога (строка с числом), по умолчанию OFN_HIDEREADONLY | OFN_ALLOWMULTISELECT
  ;;; x - смещение окна диалога от верхнего левого угла экрана; по X. (строка с числом) По умолчанию окно центруется
  ;;; y - смещение окна диалога от верхнего левого угла экрана; по Y. (строка с числом) По умолчанию окно центруется
  ;;; 
  ;;; Умолчания - пустые строки "".
  ;;; filter должен иметь следующий формат:  "Executable files (*.exe)|*.exe|All files (*.*)|*.*|".
  ;;; 
  ;;; flags - это комбинация следующих флагов:
   ;;; 0x00000001 (OFN_READONLY)          Включает переключатель диалога "Read Only"
   ;;; 0x00000002 (OFN_OVERWRITEPROMPT)   При задании имени существующего файла выводит запрос
   ;;;                                    на подтверждение перезаписи файла (Save As)
   ;;; 0x00000004 (OFN_HIDEREADONLY)      Прячет переключатель диалога "Read Only"
   ;;; 0x00000008 (OFN_NOCHANGEDIR)       Восстанавливает текущий каталог после выхода из диалога
   ;;; 0x00000200 (OFN_ALLOWMULTISELECT)  Разрешает выбор нескольких файлов
   ;;; 0x00000800 (OFN_PATHMUSTEXIST)   Запрещает ввод имен несуществующих путей и файлов
   ;;; 0x00001000 (OFN_FILEMUSTEXIST)     Запрещает ввод имен несуществующих файлов
   ;;; 0x00002000 (OFN_CREATEPROMPT)    При задании имени несуществующего файла выводит запрос
   ;;;                                    на подтверждение создания файла (Open)
   ;;; 0x00020000 (OFN_NONETWORKBUTTON)   Прячет и запрещает кнопку диалога "Network"
   ;;; 
   ;;; Если флаг OFN_HIDEREADONLY не был установлен, то в конец возвращаемой строки добавляется
   ;;; подстрока "|1" или "|0" в зависимости то того, выбрал или нет пользователь опцию Read Only.
   ;;; 
  ;;; Возврат: 
   ;;; Cписок состоящий из строк в которых заключены полные пути и имена выбранных файлов, если нажато "Открыть", или список с пустой строкой, если нажато "Отмена".
  ;;; 
  ;;;   Для регистрации компоненты в меню пуск\выполнить наберите команду: regsvr32 allosys.dll.

(defun dwgru-BrowseForFile ( toggle title initDir filter flags x y / svr res PL:String->List)
  (if (setq svr (vlax-get-or-create-object "ALLO.SystemFunctions"))
       (setq res (vlax-variant-value (vlax-invoke-method svr 'BrowseForFile toggle title initDir filter flags x y))))
       (vl-catch-all-apply '(lambda () (vlax-release-object svr)))
; Глава 10\Book01\PL_String-_List.lsp
; В книге: Н.Н.Полещук, П.В.Лоскутов
;"AutoLISP и Visual LISP в среде AutoCAD"
; (издательство "БХВ-Петербург", 2006)
;
; Листинг 10.2. Функция PL:String->List
;
; Функция разделяет строку на список строк по заданному разделителю.

(defun PL:String->List (_str _br / _pos)
  (if (setq _pos (vl-string-search _br _str))
;;; Если в строке обнаружено вхождение подстроки-разделителя,
;;; то запоминается его начальная позиция в переменной _pos.
    (cons (substr _str 1 _pos)
;;; Отрезается фрагмент исходной строки, от ее начала и до начала
;;; строки-разделителя. Функция cons ожидает возврата следующего
;;; рекурсивного вызова. По завершению этого вызова фрагмент исходной
;;; строки добавляется в начало возвращенного списка.
          (PL:String->List (substr _str (+ (strlen _br) _pos 1)) _br))
;;; Рекурсивный вызов. В качестве первого аргумента выступает фрагмент
;;; исходной строки, от конца первого вхождения строки-разделителя
;;; и до конца исходной строки.
    (list _str)
;;; Если строка-разделитель в исходной не обнаружена, то возвращается
;;; список, в который помещается исходная строка без изменений.
  ))
;;; Пример применения:
;(PL:String->List "Тест разделения  строки" " ")
;;; ("Тест" "разделения" "" "строки")
(princ (PL:String->List res "|"))
); конец (defun dwgru-BrowseForFile
Пример использования:
Код:
[Выделить все]
(dwgru-browseforfile "true" "Множественное открытие файлов *.txt" "" "Текстовые файлы (*.txt) |*.txt|" "0x00000008" "" "")

Вложения
Тип файла: rar allosys.rar (12.3 Кб, 449 просмотров)
Тип файла: lsp DwgRu-BrowseForFile.lsp (5.1 Кб, 427 просмотров)


Последний раз редактировалось Supermax, 14.01.2008 в 17:18.
Просмотров: 22237
 
Автор темы   Непрочитано 14.01.2008, 12:24
#2
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Слегка отредактировал описание возвращаемого значения. Можно конечно и nil сделать, если нажали отмена, но думаю, возврат всегда должен быть истинным.
Здесь я плыву в постановке задачи.
Supermax вне форума  
 
Непрочитано 14.01.2008, 13:55
#3
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 10,917


Как-то некорректно тащить чужие функции, тем более, что сам автор (Петр Лоскутов) над библиотекой работает. Он, если надо будет, сделает правильно, а не с princ в возрате.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 14.01.2008, 14:33
#4
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Я не знаю почему, но когда я запускаю без princ, то иногда показывает эхом возвращенные значения, то не показывает. А иногда показывает возврат, но кавычек в строках нет. Если возвращаемое значение сохранять в переменной, то всегда показывает возвращаемое значение.
По поводу чужих функций - в книжке написано, что все функции можно применять в своих разработках и проектах, только автора не забывать поминать не злым, тихим словом. Его функция безупречно работает, если сама по себе, а не в теле другой функции.
Supermax вне форума  
 
Автор темы   Непрочитано 14.01.2008, 14:37
#5
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Добавлю:
Если функция Петра Лоскутова войдет в библиотеку, как самостоятельная, то хотя я и криво отношусь к связанным функциям, изменю текст и просто использую в нем библиотечную функцию, без всякой встроенности.
Supermax вне форума  
 
Непрочитано 14.01.2008, 14:50
#6
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 10,917


Цитата:
Сообщение от Supermax Посмотреть сообщение
Добавлю:
Если функция Петра Лоскутова войдет в библиотеку, как самостоятельная, то хотя я и криво отношусь к связанным функциям, изменю текст и просто использую в нем библиотечную функцию, без всякой встроенности.
Тебе не надо никак ним "относиться". Функции надо правильно писать и использовать. Изменять - пожалуйста, у себя, в своих программах.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 14.01.2008, 15:03
#7
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Я чего-то слабо понимаю суть наезда.
Цитата:
Тебе не надо никак к ним "относиться".


Цитата:
Функции надо правильно писать и использовать.
Кто спорит? Надо! А я где не правильно написал? И что я не правильно использовал? Опять демогогируем?

Цитата:
Изменять - пожалуйста, у себя, в своих программах.
Что я изменил? Функцию PL:String->List ? Где?
Я даже описание атрибутов функции из библиотеки Allosys.dll постарался не менять на сколько это возможно.

Не нравится pinc - подскажи что лучше.
Supermax вне форума  
 
Автор темы   Непрочитано 14.01.2008, 17:13
#8
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Я подумал и понял, чем не доволен ShaggyDoc.
Мне лично - "по барабану". Если мы печатаем исходники, для общеобразовательных целей, то не обижайтесь, что некоторые комментарии "слегка" великоваты и не к месту. Все равно при переброске в fas все убивается.

Функцию исправил.

Функция писалась как продолжение главы про рекурсию. А теперь, что? Нравится что получилось? Я написал функцию для выбора файлов, а получился учебник по рекурсии.

Последний раз редактировалось Supermax, 14.01.2008 в 17:26.
Supermax вне форума  
 
Непрочитано 15.02.2010, 21:43
#9
2123


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


Не получается вызвать Save As

Код:
[Выделить все]
(dwgru-browseforfile "false" "Сохранить *.mif" "" "Файлы (*.mif)  |*.mif|" "0x00002000" "" "")
Что не правильно делаю?
2123 вне форума  
 
Непрочитано 16.02.2010, 00:20
#10
Кулик Алексей aka kpblc
Moderator

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


2123, а из архива dll в системе зарегистрирована?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 16.02.2010, 08:18
#11
2123


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


Да allosys зарегистрирована в системе. Диалог open работает, а Save As не работает (возвращает nil при вводе нового имени файла).
P.S.
Помоему библиотека "сыровата" или неполностью описана.
Getfiled работает.
2123 вне форума  
 
Непрочитано 20.07.2012, 12:08
#12
annt

программист
 
Регистрация: 24.06.2008
Москва
Сообщений: 39


А не могли ли бы Вы сделать для Windows 7 64 bit?
Для 32 bit работает, а для 64 нет.
annt вне форума  
 
Непрочитано 02.09.2013, 10:06
#13
hwd

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


Если уж всё равно юзаются сторонние библиотеки (Allosys.dll), да ещё имеется и зависимость от версии операционки, а так же её разрядности, то возможно целесообразней было бы целиком написать одну LISP функцию на .NET (ну или на ObjectARX)... С одной стороны, если писать на .NET, то получится DLL, не зависящая от версии и разрядности ОС, но с другой - это будет библиотека, зависящая от версии AutoCAD... Однако один и тот же исходный .NET-код можно без изменений скомпилировать под нужную версию AutoCAD. Кроме того, в написанной на .NET сигнатуре функции не будет необходимости указывать параметры в шестнадцатеричном виде, а вместо этого можно будет указывать вполне "человеческие" наименования. Весь код получается маленьким и компактным, по количеству строк примерно как в #1 (я делал в CAD Recovery).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 02.09.2013 в 10:12.
hwd вне форума  
 
Непрочитано 02.09.2013, 11:52
#14
gomer

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


Цитата:
Сообщение от hwd Посмотреть сообщение
то получится DLL, не зависящая от версии и разрядности ОС, но с другой - это будет библиотека, зависящая от версии AutoCAD...
Цитата:
Всё, я разобрался в чём причина. Мне придётся компилировать код CAD Recovery не просто под конкретные версии AutoCAD, но и под конкретные платформы.
Будьте последовательны в утверждениях...
gomer вне форума  
 
Непрочитано 02.09.2013, 12:29
#15
VVA

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


Пример работы с диалогами с использованием стандартного shell.application
Lee Mac Directory Dialog
И с использованием dcl файла
Lee Mac Get Files Dialog
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 02.09.2013, 12:36
#16
hwd

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


Цитата:
Сообщение от gomer Посмотреть сообщение
Будьте последовательны в утверждениях...
Я последователен, gomer. Компанией Autodesk часть AutoCAD .NET API скомпилирована под AnyCPU (каталог inc), а часть - под конкретную платформу (каталоги inc-x64 и inc-win32). Т.о. если в вашем коде задействованы только библиотеки AnyCPU, то и свои можно компилировать такими же. А в CAD Recovery используемый функционал не ограничен одним лишь открытием диалогового окна и задействованы некоторые возможности, размещённые в x64\x86.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 02.09.2013, 13:37
#17
gomer

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


Цитата:
Сообщение от hwd Посмотреть сообщение
Я последователен
Я просто уточнил, а то ведь и такие бывают, что принимают на веру любое утверждение. Да и так ли нужен множественный выбор файлов, если можно создать файл проекта, в котором хранить информацию о его составляющих...
gomer вне форума  
 
Непрочитано 02.09.2013, 13:43
#18
hwd

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


Цитата:
Сообщение от gomer Посмотреть сообщение
Да и так ли нужен множественный выбор файлов, если можно создать файл проекта, в котором хранить информацию о его составляющих...
Это кому адресовано? Я вроде ничего такого не писал.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 02.09.2013, 14:40
#19
gomer

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


Цитата:
Сообщение от hwd Посмотреть сообщение
Это кому адресовано? Я вроде ничего такого не писал.
Ну, если не вам, то можно было и не отвечать Я тут нашлепал форму, как это могло бы выглядеть красиво. Но, во-первых, получилось громоздко, во-вторых, на лиспе такое не сделать без бубна. А нашлепки к лиспу я не признаю как класс: если писать на чем-то более серьезном, то писать на нем все.
gomer вне форума  
 
Непрочитано 14.03.2018, 09:57
#20
gool


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


Здравствуйте!
Не могу зарегистрировать allosys.dll. Ошибка - "возможно модуль не совместим с версией windows". Подскажите, пожалуйста, работает ли он в windows 7 64-разрядной?
Спасибо.
gool вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Библиотека функций > DwgRuLispLib: Функция открытия диалога Open\Save As файла (файлов)

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна функция импорта блока из файла Krieger Программирование 20 18.01.2017 07:19
структурированный список Holon Программирование 22 11.09.2007 14:09
чтение данных из файла Александер Программирование 6 08.09.2005 10:24