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

Вернуться   Форум 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
Отправить сообщение для Supermax с помощью Skype™

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

Код:
[Выделить все]
;;; ************************************************************************
;;; * Библиотека 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 Кб, 428 просмотров)
Тип файла: lsp DwgRu-BrowseForFile.lsp (5.1 Кб, 413 просмотров)


Последний раз редактировалось Supermax, 14.01.2008 в 17:18.
Просмотров: 11286
 
Автор темы   Непрочитано 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"В
Сообщений: 9,642


Как-то некорректно тащить чужие функции, тем более, что сам автор (Петр Лоскутов) над библиотекой работает. Он, если надо будет, сделает правильно, а не с 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"В
Сообщений: 9,642


Цитата:
Сообщение от 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
С.-Петербург
Сообщений: 34,427


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
Москва
Сообщений: 22


А не могли ли бы Вы сделать для 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,529
Отправить сообщение для gomer с помощью ICQ Отправить сообщение для gomer с помощью Skype™


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

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


Цитата:
Сообщение от 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,529
Отправить сообщение для gomer с помощью ICQ Отправить сообщение для gomer с помощью Skype™


Цитата:
Сообщение от hwd Посмотреть сообщение
Это кому адресовано? Я вроде ничего такого не писал.
Ну, если не вам, то можно было и не отвечать Я тут нашлепал форму, как это могло бы выглядеть красиво. Но, во-первых, получилось громоздко, во-вторых, на лиспе такое не сделать без бубна. А нашлепки к лиспу я не признаю как класс: если писать на чем-то более серьезном, то писать на нем все.
gomer вне форума вставить имя Обратить внимание модератора на это сообщение  
Ответ
Вернуться   Форум 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

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


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