четверг, 15 августа 2013 г.

Создание DLL файла ресурсов для Partial CUI файла

Графические изображения, которые используются в CUI файлах, могут браться как из внешних BMP файлов, так и из неуправляемого DLL файла ресурсов, в который эти изображения помещены. Второй способ более удобен в использовании. В этой записи я покажу, как создавать такие DLL файлы и как их использовать в CUI файлах.

AutoCAD давно использует формат CUIX в качестве частичных файлов меню, представляющий собой обычный архив, расширение которого переименовано с ZIP на CUIX. Однако в нашей компании используется AutoCAD 2009 SP3, который не умеет работать с CUIX, но использует более старый формат - CUI файлы, содержимое которых представлено в формате XML. 

О версиях AutoCAD и MS Visual Studio (небольшое отступление от общей темы)

Для того, чтобы написать управляемый плагин для AutoCAD, можно использовать любую версию MS Visual Studio, в которой имеется возможность компилировать управляемый код под ту версию платформы .NET (2.0, 3.0, 3.5, 4.0, 4.5), которая используется в интересующей нас версии AutoCAD. Целевая версия .NET Framework указана в конфигурационном файле acad.exe.config и при желании мы можем переназначить её.

Для написания неуправляемых ARX плагинов для AutoCAD 2009 так же можно использовать любую версию MS Visual Studio, но лишь при условии, что на компьютере имеется та версия инструментов построения, которая необходима для вашей версии AutoCAD и эти инструменты доступны для использования в вашей IDE. Например, для того, чтобы написать ARX плагин для AutoCAD 2009, требуется та версия инструментов, которая присутствует в MS Visual Studio 2005. По факту можно использовать и более новые версии указанной IDE, при условии, что в настройка проекта будет указана необходимая версия инструментов, которая должна использоваться при сборке проекта:


Для того, чтобы в раскрывающемся списке свойства Platform Toolset присутствовал набор элементов, позволяющий выбрать нужную версию инструментов, эти инструменты должны быть предварительно установлены. Т.е. на компьютере должны быть установлены все те версии MS Visual Studio, чьи инструменты вы хотите использовать для построения. При этом получается, что фактически вы работаете в более новой IDE, используя её преимущества и удобства, а за кулисами код будет компилироваться инструментами той версии, которую вы укажете в настройках своего проекта.

Устанавливать версии MS Visual Studio следует в последовательном порядке, начиная от более старой версии и заканчивая более новой, дабы избежать различного рода конфликтов. Установив очередную версию IDE, не забудьте установить и пакеты её обновлений.

По умолчанию MS Visual Studio 2012 "видит" и отображает в раскрывающемся списке Platform Toolset только инструменты от VS 2012, 2010 и 2008. Для того, чтобы в списке отображались и более старые версии IDE, необходимо выполнить любое (т.е. одно из) из перечисленных ниже действий:

  • Установить MSI пакет, любезно предоставленный Owen Wengard.
  • Выполнить конфигурацию вручную, как это указано здесь.

Однако, когда речь заходит о создании DLL файл ресурсов, то тут всё гораздо проще: достаточно скомпилировать файл один раз (используя любую версию инструментов), с конфигурацией Release Win32, и затем использовать его на платформах x86\x64 (я компилировал DLL x86 и при этом в Windows 7 x64 мой CUI файл успешно извлекал из него изображения). 

Создание DLL файла ресурсов

В MS Visual Studio 2012 создаём новый проект, на основе шаблона Empty Project и назначаем ему нужное имя:


Первым делом сразу устанавливаем конфигурацию в Release Win32:


Теперь в окне Solution Explorer нажимаем правой кнопкой мыши на имени проекта и в появившемся контекстном меню выбираем пункт Properties. Назначаем нужные значения свойствам Target Extension и Configuration Type:


Несмотря на то, что DLL файл собирается для CUI, который будет использоваться в AutoCAD 2009, в свойстве Platform Toolset указана версия v110, соответствующая Visual Studio 2012, а не v80 (инструменты Visual Studio 2005), которая была бы необходима для компиляции ARX плагинов под эту версию AutoCAD.

Кроме этого, в настройках проекта нужно изменить ещё одну опцию - No Entry Point:


Произведя обозначенные выше изменения, жмём кнопку Применить и ОК. Теперь свойства нашего, пока ещё пустого проекта настроены должным образом. На вкладке Solution Explorer, из контекстного меню проекта, выбираем пункт Add -> New Item... и в появившемся диалоговом окне выбираем шаблон файла ресурсов:


Имя файлу можно назначить любое, в нашем примере оставляем Resource.rc. Жмём кнопку Add. Добавленный нами файл будет содержать в себе перечень изображений, которые будут использоваться в наших CUI файлах. 

Теперь в каталоге нашего проекта вручную создадим подкаталог, в который скопируем все файлы изображений, которые желаем добавить в DLL файл. Имя подкаталога может быть произвольным, назовём его images. На вкладке Solution Explorer из контекстного меню проекта выбираем пункт Open Folder in File Explorer:


В открывшемся окне Проводника создаём подкаталог images и копируем в него все нужные нам BMP файлы. 

В качестве эксперимента добавим BMP файлы разных размеров: 16x16, 24x24, 32x32, 48x48, 64x64 и 128x128. Кнопки на палитрах инструментов должны содержать изображения размером 16x16, а кнопки, размещённые на палитрах Ribbon, имеют размеры поболее. В нашем тестовом CUI файле разместим кнопки с указанными выше разрешениями и там и там, дабы посмотреть результат использования различных размеров. 

Можно было бы копировать и файлы в формате PNG, однако AutoCAD 2009 не умеет в CUI файлах использовать изображения такого формата. Теперь возвращаемся к нашей IDE: переключаемся на вкладку Resource View.


Из контекстного меню элемента Resource.rc вызываем пункт Add Resource...


В диалоговом окне Add Resource в списке Resource type выбираем элемент Bitmap, жмём кнопку Import... и указываем BMP файлы из созданного нами ранее подкаталога images. Получаем такой результат:


Теперь для каждого элемента значение свойства ID нужно обособить двойными кавычками, чтобы их можно было успешно использовать в наших CUI файлах:


Всё, теперь компилируем наш DLL файл:


Смотрим отчёт о результатах компиляции:


А вот и наш долгожданный DLL:



Полученный DLL файл копируем в тот же каталог, где хранится наш CUI файл и назначаем им одинаковые имена: test.cui и test.dll. Теперь в CUI файле в качестве источника BMP иконок можно использовать наш DLL файл, назначая командам нашего CUI файла (см. свойства Small Image и Large Image) то значение свойства ID, которое ранее обособляли двойными кавычками:


Значки, указанные в свойстве Small Image будут использоваться на палитрах Toolbar, а те, что указаны для Large Image - используются в Ribbon.

Обратите внимание, что на нашей панели Some toolbar отобразились все BMP изображения кроме последней - той, размеры которой были 128x128.

Autodesk рекомендует для маленьких изображений назначать картинки размером 16x16:


а для больших - 32x32:


Помимо этого, создадим тестовый вариант палитры для Ribbon:


Как видим, в случае использования Ribbon не отображаются изображения размерами 16x16 и 128x128. Визуально всё это безобразия выглядит так:


Т.о. видим, что AutoCAD способен отображать на кнопках изображений, размеры которых отличаются от 16x16 и 32x32, чем можно успешно воспользоваться на панелях Ribbon (при желании). Однако, возможно будет лучше придерживаться рекомендаций Autodesk, назначая для маленьких иконок изображения 16x16, а для больших - 32x32.

Примечание [29.09.2015]
RGB 192,192,192 понимается AutoCAD'ом как прозрачный цвет.

UPD [29.09.2015]
Дополнительные ресурсы по теме:

7 комментариев:

Алексей Викторович комментирует...

Из статьи неясно, как назначить команде в имеющемся cui-файле конкретное изображение из dll. И можно это сделать из другого dll, например shell32.dll из операционки Windows.

Дмитрий Загорулькин комментирует...

Даже не знаю, куда уж яснее. Даже скриншоты все толково приведены и нужное красным цветом обведено. Очень подробная и полезная статья! Есть подозрение, что Вы просто не знакомы с настройкой пользовательского интерфейса в AutoCAD. Насчет shell32.dll - а при чем здесь она? Статья о другом немного.

Disney GeoBuilder комментирует...

В VS Express 2012 в Add -> new item... нет Ресурсов :-( Это ограничение версии Express или что-то не так сделал?
Уже установили Visual Studio Community но там вообще всё по другому...

Андрей Бушман комментирует...

У меня нет Express версии. Если говорить о 2012-й IDE, то у меня установлена Premium - в ней точно есть. Если говорить о 2015-й IDE, то у меня нет Community, но есть Enterprise - в ней так же присутствует возможность создания ресурсов. Обрати внимание на то, что создаётся пустой проект не C#, но C++ (возможно ты изначально не тот язык программирования выбрал, когда создавал новый пустой проект).

Насчёт "всё по другому" я не понял, особой разницы я не вижу.

Андрей Бушман комментирует...

@Disney, так же убедись, что ты открываешь контекстное меню именно проекта (project), а не решения (solution). Как вариант, можешь попробовать сделать то же самое из меню IDE: Project -> Add new Item... Там так же возможен и вариант Project -> Add Resource...

Disney GeoBuilder комментирует...

Всё разобрался, в VS 2012 express по ходу просто это такое ограничение.
В VS 2015 Community всё получилось, просто запускал сначала вместо VS какой-то "Blend for Visual Studio 2015" и растерялся, что там всё не так.
dll создал спасибо!
Но появились некоторые другие сложности с иконками и версиями AutoCAD
http://adn-cis.org/forum/index.php?topic=3138.0

Андрей Бушман комментирует...

Насколько я понимаю, по указанной ссылке все вопросы благополучно разрешились, пока я дочитал до конца все три страницы... :)

В конце своей заметки добавил "Примечание" и "UPD".