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

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

Флаг CommandFlags.Undefined

Ответ
Поиск в этой теме
Непрочитано 15.02.2010, 18:51 #1
Флаг CommandFlags.Undefined
hwd
 
C, C++, C#
 
С-Пб.
Регистрация: 07.10.2009
Сообщений: 2,762

Через реестр зарегистрирована .Net-сборка.

Фрагмент кода в составе сборки:
Код:
[Выделить все]
        [CommandMethod("hwd","www", CommandFlags.Modal | CommandFlags.Undefined)]
        public void PrintHello()
        {...
Если в коде изменить значение флага на другое (например оставить только CommandFlags.Modal), то вызвать www или hwd.www можно. Однако при комбинации флагов, указанных мною выше в коде, вызвать команду hwd.www не удаётся - вываливается сообщения мол неизвестная команда.

В реестре, ветка зарегистрированного плагина, по правилам, может иметь разделы Commands и Groups.
Заметил, что если сборка является arx-файлом, то вызвать удастся только те команды, которые прописаны в группе Commands (создаётся запись, содержащая в качестве значения имя команды). Во всяком случае у меня получалось именно так...

В том же случае, если регистрируется .Net-библиотека, то все команды успешно загружаются и работают (если оставить в моём коде только флаг CommandFlags.Modal), даже при отсутствии в реестре ветвей Commands и Groups. Однако если добавить указанный выше флаг (CommandFlags.Undefined) - работать перестают, и не работают даже при добавлении выше озвученных ветвей со всеми причитающимися записями (если я их верно формирую там)...

Еще не могу понять такого момента:
в Groups лежат записи, содержащие имена групп, имеющихся в зарегистрированной сборке, а в Commands - команды... но...

Далее пример из ObjectARX:
Код:
[Выделить все]
\\HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\R17.1\
    ACAD-6001:409\
 Applications\polysamp\
            DESCRIPTION:REG_SZ:PolyCad
            LOADCTRLS:REG_DWORD:0xd
            LOADER:REG_SZ:C:\Program Files\polysampinc\polyui.arx
 
            Commands\
                ASDKPOLY:REG_SZ:ASDKPOLY
                ASDKDRAGPOLY:REG_SZ:ASDKDRAGPOLY
                ASDKPOLYEDIT:REG_SZ:ASDKPOLYEDIT
            Groups\
                ASDK:REG_SZ:ASDK
                ...
здесь какое-то масло маслянное (на мой мутный взгляд)... В качестве группы указан
ASDK, а в записях команд он засунут префиксом как в значения, так и в имена записей, хранящих эти значения.

Вообще идёт полный дубляж: Имя = Значение.

Не пойму, почему код, например, не такой (я в нём точки добавил):
Код:
[Выделить все]
\\HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\R17.1\
    ACAD-6001:409\
 Applications\polysamp\
            DESCRIPTION:REG_SZ:PolyCad
            LOADCTRLS:REG_DWORD:0xd
            LOADER:REG_SZ:C:\Program Files\polysampinc\polyui.arx
 
            Commands\
                ASDKPOLY:REG_SZ:ASDK.POLY
                ASDKDRAGPOLY:REG_SZ:ASDK.DRAGPOLY
                ASDKPOLYEDIT:REG_SZ:ASDK.POLYEDIT
            Groups\
                ASDK:REG_SZ:ASDK
                ...
Т.е. почему в значениях нет точки, отделяющей имя группы от имени команды?

ИМХО - такая версия была бы более понятной. Если я верно понимаю, когда пользователь наберёт команду ASDK.POLY, автокад, как только увидит, что в памяти такой команды нет, полезет в реестр. Начнет искать в разделах Groups каждого зарегистрированного плагина запись, со значением (не с именем, а именно со значением "ASDK" - это имя группы). Как только найдет такую запись, это означает, что в группе Commands есть шанс найти команду POLY, относящуюся к этому пространству. А т.к. в разделе Groups может иметься несколько записей, с разными значениями (т.е. сборка может содержать несколько групп), то записи в разделе Commands должны быть как-то понятно соотнесены каждая к нужному разделу, например так: ИмяРаздела.ИмяКоманды (согласно приведённому варианту из ObjectARX - ASDK.POLY). Во всяком случае мне это видится именно так. В ObjectARX на эту тему не очень много информации (к сожалению).
Верно я понимаю логику поиска информации в реестре или нет?

Имена (не значения, а именно имена) переменных реестра в группах Commands и Groups могут быть совершенно любые - Автокад смотрит на значения (я менял имена записей произвольно, и при этом команды всё равно работали, но стоило изменить сохранённые в них значения - работать переставали). Если так, то наличие точек, отделяющих имя группы от имени команды - всё же было бы логичным...
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 16.02.2010 в 11:51.
Просмотров: 3666
 
Непрочитано 15.02.2010, 23:25
#2
Александр Ривилис

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


Цитата:
Сообщение от hwd Посмотреть сообщение
CommandFlags.Undefined
Команда с таким флагом неопределена в момент загрузки приложения. Чтобы AutoCAD начал ее воспринимать нужно его "подтолкнуть". Для этого используется функция acedCmdUndefine (в чистом ObjectARX).
P.S.: А вообще ты полез в такие дебри...
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 15.02.2010, 23:27
#3
hwd

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


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Команда с таким флагом неопределена в момент загрузки приложения. Чтобы AutoCAD начал ее воспринимать нужно его "подтолкнуть". Для этого используется функция acedCmdUndefine (в чистом ObjectARX).
Спасибо, похоже, что в .Net-плагинах данный атрибут использовать не следует (acedCmdUndefine only works with ARX registered commands).
А по поводу Commands и Groups?
Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
А вообще ты полез в такие дебри...
Ни в какие дебри я не полез. Просто хочу понимать, что именно я делаю, какова логика Автокада при обработке данных, прописанных в реестре, и каков правильный синтаксис.
Мною написана библиотека, выполняющая всю работу, связанную с вопросами регистрации плагинов Автокада в реестре. Но в ней я не стал реализовывать работу с группами Commands и Groups, т.к. заметил, что .Net-плагины прекрасно работают и при их отсутствии (может я чего упустил из вида?). Однако в последствии обнаружил, что без этих групп не работают arx-плагины. Соответственно, мне нужно внести изменения в состав библиотеки, дописав код, который создаст нужные группы и добавит в них записи. Это не проблема - нужно только разобраться с синтаксисом добавляемых в Groups и Commands записей, дабы информация была представлена в понятном Автокаду формате - о чём и спросил выше в топике. Правда есть ещё одна заковырка - через рефлексию я легко могу проанализировать .Net-сборку на предмет имеющихся в ней команд и групп, в состав которых они входят, после чего можно без проблем добавить в группы Commands и Groups нужные записи, но как это программно сделать для arx-приложения - не знаю.
Ниже привожу скрин состава библиотеки (рабочий вариант), но буду её изменять, добавляя в состав интерфейса IAcadPlagin свойства Commands и Groups, а так же методы AddCommand, AddGroup, RemoveCommand, RemoveGroup.

__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 16.02.2010 в 11:34.
hwd вне форума  
 
Непрочитано 16.02.2010, 13:28
#4
Александр Ривилис

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


Цитата:
Сообщение от hwd Посмотреть сообщение
но как это программно сделать для arx-приложения - не знаю.
Из приложения, которое не загружено в AutoCAD эту информацию получить нельзя. Кроме того в отличие от .NET добавлять и удалять команды в arx-приложении можно динамически (в процессе работы приложения). Так что непонятно в какой момент проверять список команд и групп. Таким образом делать инсталлятор для абстрактных неизвестных arx-приложений нельзя.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 16.02.2010, 13:30
#5
hwd

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


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Из приложения, которое не загружено в AutoCAD эту информацию получить нельзя. Кроме того в отличие от .NET добавлять и удалять команды в arx-приложении можно динамически (в процессе работы приложения). Так что непонятно в какой момент проверять список команд и групп. Таким образом делать инсталлятор для абстрактных неизвестных arx-приложений нельзя.
Ясно, спасибо. а насчёт синтаксиса в Groups и Commands? )
hwd вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Флаг CommandFlags.Undefined



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сбор ветровой нагрузки на флаг kostroma Конструкции зданий и сооружений 19 09.12.2016 10:49
мой интерфейс Jоhnny AutoCAD 112 28.01.2013 18:58