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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Проверка на предмет загруженного ARX-приложения

Проверка на предмет загруженного ARX-приложения

Ответ
Поиск в этой теме
Непрочитано 18.09.2009, 19:55 #1
Проверка на предмет загруженного ARX-приложения
acyxou
 
Регистрация: 12.07.2008
Сообщений: 211

Столкнулся с такой проблемой, нужно сделать toggle-button на зугрузку/выгрузку приложения. А именно: если прога не загружена, то загрузить и засунуть в Startup Suite, если загружена, то выгрузить и удалить из Startup Suite.
Код из сэмплов Autodesk'а конечно хорош, но я не знаю как выгрузить приложение.
Код:
[Выделить все]
(if (not (member "Programm.arx" (arx)))
(arxload "Programm.arx")
)
Напомню, что сделать надо чтоб работало именно с одной кнопки.
Можно рассмотреть вариант с записью/удалением названия приложения в acad.rx файл, а не в Startup Suite.
__________________
Users are not stupid, they are busy.
Просмотров: 4241
 
Непрочитано 18.09.2009, 20:05
#2
Кулик Алексей aka kpblc
Moderator

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


arxunload поможет
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 18.09.2009, 20:10
#3
acyxou


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


сам по себе arxunload не поможет!
Надо еще прикрепить функцию проверки, ее я не могу найти нигде.... т.е. если приложение загружено, то arxunload...
__________________
Users are not stupid, they are busy.
acyxou вне форума  
 
Непрочитано 18.09.2009, 22:31
#4
Кулик Алексей aka kpblc
Moderator

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


Без запущенного AutoCAD, проверка за тобой:
Код:
[Выделить все]
(setq arx_name "program.arx" arx_path (findfile "program.arx"))
(if (member (strcase (vl-filename-base arx_name)) (mapcar (function (lambda(x) (strcase (vl-filename-base x)))) (arx))
(arxunload arx_name))
P.S. Можно преобразовать список (arx) в строку и выполнять проверку через wcmatch. Или обернуть arxunload в vl-catch-all-apply. В общем, варианты есть
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 18.09.2009, 22:58
#5
acyxou


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


Во, спасибо!
В понедельник буду тестировать
__________________
Users are not stupid, they are busy.
acyxou вне форума  
 
Автор темы   Непрочитано 21.09.2009, 10:20
#6
acyxou


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


Не работает
Код:
[Выделить все]
error: too few arguments
А что же на счет автозагрузки? Возможно еще помещать и удалять файл в автозагрузку?
__________________
Users are not stupid, they are busy.
acyxou вне форума  
 
Непрочитано 21.09.2009, 13:48
#7
Кулик Алексей aka kpblc
Moderator

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


В каком конкретно месте "ошибка"?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 21.09.2009, 14:28
#8
acyxou


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


Полагаю что в том месте, где начинается If... я загрузил свое приложение, дальше пробую твой код, надеясь что он мне его выгрузит... arx_name и arx_path значения приняли, а дальше фиг...
__________________
Users are not stupid, they are busy.
acyxou вне форума  
 
Непрочитано 21.09.2009, 16:48
#9
Кулик Алексей aka kpblc
Moderator

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


Я ж говорил, что код проверить надо
Код:
[Выделить все]
(setq arx_name "program.arx"
      arx_path (findfile "program.arx")
      ) ;_ end of setq
(if (member (strcase (vl-filename-base arx_name))
            (mapcar (function (lambda (x) (strcase (vl-filename-base x)))) (arx))
            ) ;_ end of member
  (arxunload arx_name)
  ) ;_ end of if
Так работает?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 21.09.2009, 17:28
#10
acyxou


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


Ага, так работает, спасибо!
А как лиспом поместить программу в автозагрузку? ну и соответственно удалить ее о туда...
__________________
Users are not stupid, they are busy.
acyxou вне форума  
 
Непрочитано 21.09.2009, 23:41
#11
Кулик Алексей aka kpblc
Moderator

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


Я пытался в свое время разобраться с этим делом, но как-то безуспешно. В результате загрузку arx (да и не только их) выполняю через mnl-файл.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 22.09.2009, 12:30
#12
acyxou


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


Алексей, короче я тут узнал что в Startup Suite приложение можно добавить следующим образом:
Код:
[Выделить все]
(vl-load-com)
(setq arx_name "program.arx"
      arx_path (findfile "program.arx")
)
					;
(if (not (member arx_name (arx)))
  (arxload arx_name)
)
(vl-registry-write
  (strcat
    "HKEY_CURRENT_USER\\"
    (vlax-product-key)
    "\\Profiles\\"
    (getvar "cprofile")
    "\\Dialogs\\Appload\\Startup")
    "1Startup"
    arx_path
  )
Выгружается аналогично, но тут проблема.... как узнать каким по счету идет наше загружаемое приложение? Вдруг у юзера будет несколько своих приложений помещенных в автозагрузку.....как нам определить какой ключ добавлять/удалять (1Startup, 2Startup и т.д.)? На это у меня мозгов пока не хватает....
__________________
Users are not stupid, they are busy.

Последний раз редактировалось acyxou, 22.09.2009 в 12:44.
acyxou вне форума  
 
Непрочитано 22.09.2009, 13:21
#13
Александр Ривилис

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


А не проще для автозагрузки модифицировать файл acad.rx (дописать в него путь к arx-файлу)?
Александр Ривилис вне форума  
 
Непрочитано 22.09.2009, 13:30
#14
Кулик Алексей aka kpblc
Moderator

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


Ххе, это будет слишком просто и не всегда верно.
Сначала определяем вообще сколько записей в StartupSuite есть (и есть ли они вообще):
Код:
[Выделить все]
(setq *reg-key* (strcat "HKEY_CURRENT_USER\\"
                        (vlax-product-key)
                        "\\Profiles\\"
                        (vla-get-activeprofile
                          (vla-get-profiles
                            (vla-get-preferences
                              (vlax-get-acad-object)
                              ) ;_ end of vla-get-preferences
                            ) ;_ end of vla-get-profiles
                          ) ;_ end of vla-get-activeprofile
                        "\\Dialogs\\Appload\\Startup"
                        ) ;_ end of strcat
      ) ;_ end of setq
Теперь поехали (последовательно):
  1. Получаем количество записей
    Код:
    [Выделить все]
    (vl-registry-descendents *reg-key* "")
  2. Читаем значения ключей
    Код:
    [Выделить все]
    (mapcar
        (function
          (lambda (x)
            (cons x (vl-registry-read *reg-key* x))
            ) ;_ end of lambda
          ) ;_ end of function
        (vl-registry-descendents *reg-key* "")
        )
  3. Исключаем из них, во-первых, те, у которых вначале не число, и, во-вторых, те, у которых имя arx-приложения не совпадает с program:
    Код:
    [Выделить все]
    (vl-remove-if
        (function
          (lambda (x)
            (or (= (atoi (car x)) 0)
                (/= (strcase (vl-filename-base (cdr x))) "PROGRAM")
                ) ;_ end of or
            ) ;_ end of lambda
          ) ;_ end of function
        (mapcar
          (function
            (lambda (x)
              (cons x (vl-registry-read *reg-key* x))
              ) ;_ end of lambda
            ) ;_ end of function
          (vl-registry-descendents *reg-key* "")
          ) ;_ end of mapcar
        ) ;_ end of vl-remove-if
  4. И теперь анализируем список: если он не nil, то приложение уже есть в списке и ничего делать не надо. Если он nil, то придется менять значение ключа NumStartup и добавлять еще один ключ, с твоим program.arx
Это все - теоретически. Практически срабатывало не всегда (причин уже не помню).
P.S. Учти, что в 2010 немного изменились функции работы с реестром, так что там надо проверять отдельно корректность кода.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 22.09.2009 в 13:36.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.09.2009, 13:36
#15
Александр Ривилис

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Это все - теоретически. Практически срабатывало не всегда (причин уже не помню).
Вот именно поэтому я и предлагаю не мудрить и записать в acad.rx или в крайнем случае в реестр, но в стандартную arx автозагрузку, а не в эту, которая завязана на APPLOAD
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 22.09.2009, 13:40
#16
acyxou


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


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
А не проще для автозагрузки модифицировать файл acad.rx (дописать в него путь к arx-файлу)?
если использовать acad.rx, то работы будет не меньше... запись туда arx-файла, потом "выписка" его от туда
__________________
Users are not stupid, they are busy.
acyxou вне форума  
 
Непрочитано 22.09.2009, 13:42
#17
Александр Ривилис

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


Не смеши! :-)
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 22.09.2009, 13:49
#18
acyxou


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


мне же нужно все это на программном уровне сделать!
Если юзеру нужно приложение, то он кликает на кнопочку, приложение загружается и помещается в автозагрузку. Если не нужно - то кликает, приложение выгружается и удаляется из автозагрузки...
__________________
Users are not stupid, they are busy.
acyxou вне форума  
 
Непрочитано 22.09.2009, 13:56
#19
Александр Ривилис

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


Ну так и в чем проблема читать/писать в простой текстовый файл в котором каждая строка - путь к arx/файлу?
Александр Ривилис вне форума  
 
Непрочитано 22.09.2009, 14:44
#20
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Это все - теоретически. Практически срабатывало не всегда (причин уже не помню).
На arcade это было: LISP. Реестр. Запись своих приложений в автозагрузку
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Проверка на предмет загруженного ARX-приложения



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как Извлечь из строки числа Kostinok Программирование 7 12.08.2008 08:00