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

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

Проверка на doslib

Ответ
Поиск в этой теме
Непрочитано 28.07.2006, 15:46 #1
Проверка на doslib
Apelsinov
 
Проектировщик ВК. LISP-любитель.
 
Москва
Регистрация: 15.12.2003
Сообщений: 1,202

Хочется использовать что-то из этой библиотеки, и создать универсальную функцию для проверки на ее загруженность.
Пробую так:
Код:
[Выделить все]
(defun apel-dos_lib_load (/)
  (if (< "15" (substr (getvar "acadver") 1 2))
    (setq libfile "DOSLib 6.1\\doslib2004.arx")
    (setq libfile "DOSLib 6.1\\doslib2k.arx")
  )
  (if (member (strcat (VL-FILENAME-BASE libfile)
		      (VL-FILENAME-EXTENSION libfile)
	      )
	      (arx)
      )
    T
    (if
      (APEL-GETKWORD_YESNO
	T
	"\nВНИМАНИЕ! Скорее всего, библиотека DOS_LIB не загружена \nВы хотите загрузить библиотеку?"
      )
       (if (and	(setq libfile (FINDFILE libfile))
		(arxload (findfile libfile))
	   )
	 (princ (strcat "Библиотека DOS_LIB загружена из " libfile))
	 (princ "\nБиблиотека DOS_LIB не была загружена!")
       )
    )
  )
)
Но есть сомнение в правильности такого подхода, так как файл с библиотекой может иметь и другое имя.
__________________
apel.fas
Просмотров: 4941
 
Непрочитано 28.07.2006, 19:56
#2
Александр Ривилис

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


Для проверки загружен или нет какой-нибудь arx-файл, который экспортирует lisp-функции, я обычно использую проверку на nil одной из этих функций. Этот способ годится и для doslib - но вот загрузить arx-file не зная его имени (!!!) - это проблема.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 31.07.2006, 11:22
#3
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


Александр Ривилис



Ну вопрос, конечно, не про "загрузить", а про "проверить".

Раньше тоже делал проверку на существование используемой функции, а тут решил написать что-то универсальное.

Спасибо. Натолкнули меня на мысль- сделаю функцию-обертку для dislib'овских функций с проверкой на тип.
__________________
apel.fas
Apelsinov вне форума  
 
Автор темы   Непрочитано 31.07.2006, 17:08
#4
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


Ну вот как-то так:
Код:
[Выделить все]
;;;Обертка для функций doslib c проверкой на существование функции и загрузкой библиотеки.
;;;DL_function - функция
;;;list_arg - список аргументов
(defun apel-apply_doslib_function (DL_function list_arg / libfile)
  (if
    (or
      (eq (type (eval DL_function)) 'EXRXSUBR)
      (if
	(APEL-GETKWORD_YESNO
	  T
	  "\nВНИМАНИЕ! Библиотека DOSLIB не загружена \nВы хотите загрузить библиотеку?"
	)
	 (if
	   (and	(setq
		  libfile (FINDFILE
			    (cond
			      ((< "15" (substr (getvar "acadver") 1 2))
			       "tmp\\DOSLib 6.1\\doslib2004.arx"
			      )
			      ("tmp\\DOSLib 6.1\\doslib2k.arx")
			    )
			  )
		)
		(arxload (findfile libfile))
	   )
	    (princ (strcat "Библиотека DOSLIB загружена из " libfile))
	    (null (princ "\nБиблиотека DOS_LIB не была загружена!"))
	 )
      )
    )
     (apel-catch-apply DL_function list_arg)
  )
)
;;;(apel-apply_doslib_function 'DOS_CLIPBOARD nil)
__________________
apel.fas
Apelsinov вне форума  
 
Непрочитано 31.07.2006, 18:18
#5
Александр Ривилис

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


Я бы сделал немного универсальнее, т.е. не фиксировал бы имя каталога (и возможно имя arx-файла), а предложил бы пользователю выбрать его. Если arx-файл нормально загрузился и функция появилась, то записал бы в регистратуру путь к arx-файлу при помощи (setenv ...). Это необходимо было бы делать однократно при первом обращении к любой из функций doslib. Разумеется для каждой из линеек AutoCAD (setenv ...) записывал в свою переменную. При последующих вызовах при помощи (getenv ...) в зависмости от линейки AutoCAD находил бы arx-файл и загружал его...
Как-то так...
Александр Ривилис вне форума  
 
Непрочитано 01.08.2006, 08:24
#6
Кулик Алексей aka kpblc
Moderator

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


Может, будет лучше писать вообще в свой ключ реестра? Тогда к конкретной линейке када привязываться не надо будет...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 01.08.2006, 09:57
#7
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


Александр Ривилис
ИМХО пользователю нафиг не надо знать что такое вообще doslib, и тем более заставлять его искать некий непонятный файл.
Вот если по умолчальному пути он найден не будет, тогда можно, как запасной вариант.

Ну надо ж, а я впервые узнал о getenv и setenv :shock:
Можно поподробнее об этом?

kpblc
а как не привязываться, если arx разные для разных версий?
Или я чего-то недопонимаю?
__________________
apel.fas
Apelsinov вне форума  
 
Непрочитано 01.08.2006, 10:07
#8
ShaggyDoc

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


И ARX разные, и нет системы в наименовании ARX. Последний называется DOSLib17.arx.

Вообще-то все действительно нужное из DOSLib лучше перекрыть своими. И забыть, с благодарностью автору за многолетнее развитие библиотеки.

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

Например:

[DOSLib]
15=DOSLib2k.arx
16=DOSLib2004.arx
17.1=DOSLib17.arx
19.4=DOSLib2009.arx

Можно происывать и полный путь, чтобы сразу загружать
ShaggyDoc вне форума  
 
Непрочитано 01.08.2006, 10:07
#9
Кулик Алексей aka kpblc
Moderator

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


(getenv "ACAD") - получишь пути поддержки текущего профиля када.
(setenv "ACAD") - соответственно установишь.
Насчет версий arx. Если уже получен список нужных arx, попробуй такое:
Код:
[Выделить все]
(foreach file_counter	files_list
    (if	(not (member (strcat (vl-filename-base file_counter) ".arx") (arx)))
      (if
	(vl-catch-all-error-p (vl-catch-all-apply 'arxload (list file_counter)))
	 (princ	(strcat	"\nНе могу загрузить файл "
			(vl-filename-base file_counter)
			".arx"
			) ;_ end of strcat
		) ;_ end of princ
	 ) ;_ end of if
      ) ;_ end of if
    ) ;_ end of foreach
---
Добавлено: имена должны быть полными. Для их получения я использую функцию от ZZZ с http://www.autocad.ru/cgi-bin/f1/board.cgi?t=19612AN :
Код:
[Выделить все]
;|=============================================================================
*    функция z-files-in-directory возвращает список файлов находящаяся в заданной
* директории
*    Автор : Зуенко Виталий (ZZZ)
*  Параметры:
*    directory  путь к папке например "D:\\Мои документы\\ZEF\\Lisp"
*    pattern    шаблон например "*.lsp" или список '("*.dwg" "*.dxf")
*    nested    искать в вложенных папках: t (да) или nil (нет)
* Пример вызова:
(z-files-in-directory "D:\\Мои документы\\ZEF\\Lisp" "*.lsp" t)
(z-files-in-directory "D:\\Мои документы\\ZEF\\Lisp" '("*.lsp" "*.fas") t)
=============================================================================|;
(defun z-files-in-directory (directory pattern nested /)
  (if (not (listp pattern))
    (setq pattern (list pattern))
    ) ;_ if
  (if nested
    (apply
      'append
      (append
	(mapcar	'(lambda (_pattern)
		   (mapcar '(lambda (f) (strcat directory "\\" f))
			   (vl-directory-files directory _pattern 1)
			   ) ;_ list
		   ) ;_ lambda
		pattern
		) ;_ mapcar
	(mapcar
	  '(lambda (d)
	     (z-files-in-directory
	       (strcat directory "\\" d)
	       pattern
	       nested
	       ) ;_ z-files-in-directory
	     ) ;_ lambda
	  (vl-remove
	    "."
	    (vl-remove ".."
		       (vl-directory-files directory nil -1)
		       ) ;_ end of vl-remove
	    ) ;_ vl-remove
	  ) ;_ mapcar
	) ;_ append
      ) ;_ append
    (apply
      'append
      (mapcar '(lambda (_pattern)
		 (mapcar '(lambda (f) (strcat directory "\\" f))
			 (vl-directory-files directory _pattern 1)
			 ) ;_ list
		 ) ;_ lambda
	      pattern
	      ) ;_ end of mapcar
      ) ;_ end of apply
    ) ;_ end of if
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 01.08.2006, 10:37
#10
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


kpblc
Это все к чему (про загрузку)?
__________________
apel.fas
Apelsinov вне форума  
 
Непрочитано 01.08.2006, 10:43
#11
Кулик Алексей aka kpblc
Moderator

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


Как к чему? Натравливаешь z-files-in-directory на каталоги, в которых могут быть нужные тебе arx-ы, получаешь на выходе список файлов arx с полными именами и загружаешь их, если это вообще возможно.
Или теперь уже я ничего не понял?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 01.08.2006, 11:08
#12
Александр Ривилис

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


Цитата:
Сообщение от Apelsinov
Вот если по умолчальному пути он найден не будет, тогда можно, как запасной вариант.
Я именно это и имел в виду.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 01.08.2006, 11:34
#13
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


Цитата:
Сообщение от kpblc
Как к чему? Натравливаешь z-files-in-directory на каталоги, в которых могут быть нужные тебе arx-ы, получаешь на выходе список файлов arx с полными именами и загружаешь их, если это вообще возможно.
то есть ты предлагаешь не разбираться с версиями, а просто загрузить все файлы. Как-то это боязно, кто их знает, как они там переопределятся....

z-files-in-directory в несколько измененном виде я пользуюсь для загрузки своей базы функций, но здесь, мне кажется, оно не надо, т.к. те файлы с библиотекой что я сам к базе приложу, известны с именем и отн. путем, а тот что может быть у пользователя - он сам точно и укажет.
__________________
apel.fas
Apelsinov вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Проверка на doslib