Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: art_rrc от 21-10-2015, 12:08:02

Название: Получить доступ из Resources к Bitmap
Отправлено: art_rrc от 21-10-2015, 12:08:02
Приветствую! Наконец-то решился на создание первого плагина на .NET. До этого имеется определенный опыт программирования на VBA. Изучив кое какие теоретические азы по .NET, практическое применение пока к сожалению вызывает слишком много вопросов. Теперь ближе к сути вопроса... В качестве первой программы я для себя выбрал "Создание собственной вкладки на ленте". Опираясь на несколько примеров из интернета, научился создавать кнопки, но прикрутить к ним собственную иконку не получается. Подскажите как же быть? Является ли верным подход включения иконок в раздел "Resources", с указанием свойства Build Action -> Resource?
На данный момент пытаюсь осуществить это через функцию (нашел тут: http://habrahabr.ru/post/263373/):
Код - C# [Выбрать]
  1. System.Windows.Media.Imaging.BitmapImage LoadImage(string ImageName)
  2.         {
  3.             return new System.Windows.Media.Imaging.BitmapImage(
  4.                 new Uri("pack://application:,,,/ACadRibbon;component/" + ImageName + ".png"));
  5.         }
Которую нагло перегнал через конвертер, т.к. иначе вообще не представляю как подступиться. Получилось вот что:
Код - vb.net [Выбрать]
  1.         Function LoadImage(ImageName As String) As System.Windows.Media.Imaging.BitmapImage
  2.             Return New System.Windows.Media.Imaging.BitmapImage(New Uri("pack://application:,,,/ACadRibbon;component/" + ImageName + ".png"))
  3.         End Function
Также пытался использовать информацию отсюда "https://support.microsoft.com/en-us/kb/324566" - безрезультатно.

Код целиком:
Извините, вам запрещён просмотр содержимого спойлеров.

ps Не судите строго. Я только учусь. :)


Название: Re: Получить доступ из Resources к Bitmap
Отправлено: Андрей Бушман от 21-10-2015, 12:12:36
Цитата: Modis
создать файл АПИ (cui) со своей лентой и подгружать его. На мой взгляд самый плохой и проблемный вариант. ИМХО
А на мой взгляд - это самый простой и целесообразный вариант. Вот (http://bushman-andrey.blogspot.ru/2013/08/dll-partial-cui.html) глянь.
Название: Re: Получить доступ из Resources к Bitmap
Отправлено: art_rrc от 21-10-2015, 12:18:51
Огромное спасибо! Особенно за оперативность! Буду изучать.

А на мой взгляд - это самый простой и целесообразный вариант. Вот глянь.
Изучил. Но там скорее подспорье для того, чтоб создать ленту другим способом и подробное описание настроек, но ни одной строчки кода. Название говорит само за себя "Создание DLL файла ресурсов для Partial CUI файла", об этом пока речь не идет. Моя задача гораздо скромнее: "Занести в значение переменной vb.net информацию объекта типа "icon.png", который изначально хранится на жестком диске, но так чтоб он остался в сборке .dll "
Название: Re: Получить доступ из Resources к Bitmap
Отправлено: Александр Пекшев aka Modis от 21-10-2015, 13:00:02
http://habrahabr.ru/post/263373/

И еще сто раз готов повторить - VB.Net - ФУ ФУ ФУ!!!
Название: Re: Получить доступ из Resources к Bitmap
Отправлено: art_rrc от 21-10-2015, 13:07:53
Modis, Прекрасная статья! Ссылка на нее есть кстати в посте #1. ;) С наскока от VBA сразу на C# оказалось сложновато, пока решил подняться на промежуточную ступеньку vb.net. Но не хотелось бы отдаляться от темы...
Название: Re: Получить доступ из Resources к Bitmap
Отправлено: Андрей Бушман от 21-10-2015, 13:19:20
Цитировать
В качестве первой программы я для себя выбрал "Создание собственной вкладки на ленте".
Возможно я тебя не верно понял, а понял я тебя сначала так: мол тебе нужно, наиболее простым и быстрым способом [не важно каким], создать для своего плагина файл меню с лентами, "туллбарами", "палетками" и т.д. который будет подгружаться в AutoCAD. Это легко и быстро делается при помощи "родного" визуального инструмента (т.н. "батоно-кидательство"), имеющегося в AutoCAD (присутствует на скринах в моей заметке) без какого-либо программирования. На выходе, всего за пару-тройку минут работы, получаем файл CUI или CUIX (зависит от версии AutoCAD). Моя заметка предполагает, что читатель знаком с этим "родным" функционалом AutoCAD, а если нет, то в состоянии нажать F1 и прочитать об этом в справке AutoCAD.

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

Но там скорее подспорье для того, чтоб создать ленту другим способом и подробное описание настроек, но ни одной строчки кода.
Нет, это подспорье на тему того, как все ресурсы, необходимые CUI файлу запихнуть в один DLL, вместо того, чтобы держать рядом кучу bmp и прочих картинок.
Название: Re: Получить доступ из Resources к Bitmap
Отправлено: Александр Пекшев aka Modis от 21-10-2015, 13:27:58
New Uri("pack://application:,,,/ACadRibbon;component/" + ImageName + ".png")
Ошибка в этой строке, т.к. неправильно задан путь. В моем примере картинки лежали в корневом каталоге, а у вас в папке Resources...
Вот это (https://msdn.microsoft.com/ru-ru/library/aa970069(v=vs.110).aspx) почитайте
Modis, Прекрасная статья!
Тогда плюсуй мне карму  ;D ;D ;D
С наскока от VBA сразу на C# оказалось сложновато, пока решил подняться на промежуточную ступеньку vb.net
Я это проходил - тоже сначала на VB.Net пробовал. Результат один - потеря времени ))
Название: Re: Получить доступ из Resources к Bitmap
Отправлено: art_rrc от 21-10-2015, 13:43:23
Видимо плохо сформулировал поставленные цели. Постараюсь исправиться:
Цитировать
Это легко и быстро делается при помощи "родного" визуального инструмента (т.н. "батоно-кидательство"), имеющегося в AutoCAD (присутствует на скринах в моей заметке) без какого-либо программирования.
Все верно. И мне эта тема неплохо знакома (как пример, прикрепляю старый скрин ленты). Но для среднестатистического пользователя это темный лес. А должно быть так.. я отправляю .dll-файл стороннему пользователю  и при загрузке через "netload" все панели и кнопки создаются сами, все готово к работе.
Немного не понимаю, чем же этот способ вы сочли неэффективным, код составляет с десяток строк, а функционал что надо!
Modis, Плюсанул! Огромное спасибо за ссылки!
Название: Re: Получить доступ из Resources к Bitmap
Отправлено: Андрей Бушман от 21-10-2015, 13:52:22
Немного не понимаю, чем же этот способ вы сочли неэффективным, код составляет с десяток строк, а функционал что надо!
Я не писал, что он "неэффективен". Я писал, что создать меню "родными" средствами акада будет быстрее и проще, если знаком с родным, акадовским дизайнером меню. Во всяком случае мне это проще и видится более удобным способом.

Но для среднестатистического пользователя это темный лес.
У тебя какое-то невесёлое мнение о "среднестатестическом пользователе". :) Тёмный лес это только для деревянного пользователя. Почти все мои юзеры (около 300 человек) знают как загружать менюшки.

А должно быть так.. я отправляю .dll-файл стороннему пользователю  и при загрузке через "netload" все панели и кнопки создаются сами, все готово к работе.
Ты легко можешь сделать так, что в твоём коде  загрузка (http://through-the-interface.typepad.com/through_the_interface/2006/11/loading_a_parti.html) твоей менюшки будет выполняться автоматически, при загрузке твоей DLL.
Название: Re: Получить доступ из Resources к Bitmap
Отправлено: Doublefish от 21-10-2015, 14:34:30
Я, например, пришел к выводу, что проще сделать один файл cuix вручную, запихав в него всё, и затем в xml плагина прописать одну строку с его загрузкой, чем делать отдельный файл ресурсов в виде dll и не пихать эти иконки в dll плагина.

Хотя наверное это зависит ситуации, если всего одна иконка, то возможно проще всё в один файл dll плагина запихать и всё.

VB.Net - false, C# - true
Название: Re: Получить доступ из Resources к Bitmap
Отправлено: Андрей Бушман от 21-10-2015, 14:36:17
Хотя наверное это зависит ситуации
Например от такой: AutoCAD 2009 не умеет работать с CUIX. Именно эта версия акада используется в нашей организации. Я указывал на это в заметке, на которую давал ссылку.
Название: Re: Получить доступ из Resources к Bitmap
Отправлено: Александр Пекшев aka Modis от 21-10-2015, 14:39:18
Хотя наверное это зависит ситуации
Например от такой: AutoCAD 2009 не умеет работать с CUIX. Именно эта версия акада используется в нашей организации. Я указывал на это в заметке, на которую давал ссылку.
Не только. У меня, например, надстройка (ну мой ModPlus) сделана в виде плагиного приложения - функции подключаются/отключаются. Поэтому обойтись одним файлом cui(x) не получится... А файлы иконок так вообще хранятся в самих подключаемых функциях
Название: Re: Получить доступ из Resources к Bitmap
Отправлено: art_rrc от 21-10-2015, 14:46:56
Ну ни в какую... Хотя возможно нужно просто отдохнуть и продолжить со свежей головой. Хотя на данном этапе появился конкретный вопрос: "Пространство имен System.IO имеет какое либо отношение к решении данной задачи?" А то в ошибке на него программа ссылается, но всевозможные вариации с подключением/отключением, прописыванием в Imports на первый взгляд никакого влияния на работу не оказывает.
Название: Re: Получить доступ из Resources к Bitmap
Отправлено: Александр Пекшев aka Modis от 21-10-2015, 14:52:40
У вас проект называется ну никак не art_Ribbon  ;)
Название: Re: Получить доступ из Resources к Bitmap
Отправлено: art_rrc от 21-10-2015, 15:13:14
У вас проект называется ну никак не art_Ribbon  ;)
Спасибо за бесценные советы. Но переименование к результату не привело. Может быть у кого-то есть возможность  мой код у себя для теста запустить?
ps отлично представляю, какие элементарные и стыдные вопросы задаю, просто нахожусь в самом начале изучения и даже самые базовые вещи представляются непреодалимыми проблемами..
Название: Re: Получить доступ из Resources к Bitmap
Отправлено: Владимир Шу от 21-10-2015, 15:14:17
Может быть у кого-то есть возможность  мой код у себя для теста запустить?
Так вы не картинку прикладывайте, а архив с проектом...
Название: Re: Получить доступ из Resources к Bitmap
Отправлено: Александр Пекшев aka Modis от 21-10-2015, 15:14:23
Может быть у кого-то есть возможность  мой код у себя для теста запустить?
Ну дык - давай проект)
Название: Re: Получить доступ из Resources к Bitmap
Отправлено: art_rrc от 21-10-2015, 15:17:02
Я не очень опытен и мне казалось, что текстового кода из поста №1 достаточно. Теперь понял, что был не прав  :) Вот архив.
Название: Re: Получить доступ из Resources к Bitmap
Отправлено: Андрей Бушман от 21-10-2015, 15:17:37
Так а чем, если не секрет, всё же не устроил вариант создания менюшки вручную с последующей её автоматической подгрузкой при загрузке DLL в AutoCAD? Я как-то пока не увидел в данной теме объективных причин для отказа от такого способа решения... За то время, что ты потратил на данную тему (пытаясь сделать это программно), уже можно было раз 10 решить это обозначенным мною способом (и это вместе с "попить кофе"). :)
Название: Re: Получить доступ из Resources к Bitmap
Отправлено: Дмитрий Загорулькин от 21-10-2015, 15:20:28
А на мой взгляд - это самый простой
Не соглашусь, в этом варианте тоже есть много неочевидных сложностей. Как раз недавно плотно работал с этими CUIX. Была мысль, что если бы я программно формировал ленту, было бы гораздо легче справиться с некоторыми проблемами.
и целесообразный вариант.
А вот тут обеими руками  "за" :)
Название: Re: Получить доступ из Resources к Bitmap
Отправлено: Александр Пекшев aka Modis от 21-10-2015, 15:22:16
Я не очень опытен и мне казалось, что текстового кода из поста №1 достаточно. Теперь понял, что был не прав  :) Вот архив.
А самого файла art_Ribbon.vb и нету.... :)
Название: Re: Получить доступ из Resources к Bitmap
Отправлено: Андрей Бушман от 21-10-2015, 15:22:48
Была мысль, что если бы я программно формировал ленту, было бы гораздо легче справиться с некоторыми проблемами.
А поконкретней? :) Насколько я понимаю, автору не требуется, чтобы кнопочки играли в футбол и бегали за пивом.
Название: Re: Получить доступ из Resources к Bitmap
Отправлено: Александр Пекшев aka Modis от 21-10-2015, 15:27:28
Вот так нужно строку было написать
Код - vb.net [Выбрать]
  1. Return New System.Windows.Media.Imaging.BitmapImage(New Uri("pack://application:,,,/AutoCAD VB plug-in3;component/Resources/" + ImageName + ".png"))
А на картинке ответ на вопрос - почему так?  ;D
Название: Re: Получить доступ из Resources к Bitmap
Отправлено: Doublefish от 21-10-2015, 15:36:11
Ну если раскоментарить строку
Код - C# [Выбрать]
  1. button4.LargeImage = LoadImage("Form32x32")
- то иконка появляется нормально )))
Название: Re: Получить доступ из Resources к Bitmap
Отправлено: Александр Ривилис от 21-10-2015, 15:39:19
art_rrc
Напоминаю. Как нужно форматировать код для форума указано у меня в подписи.
Название: Re: Получить доступ из Resources к Bitmap
Отправлено: art_rrc от 21-10-2015, 16:50:26
Прошу прощения за поздние ответы. Я тут прилег перевести дух и случайно уснул..) Итак по теме:
Так а чем, если не секрет, всё же не устроил вариант создания менюшки вручную с последующей её автоматической подгрузкой при загрузке DLL в AutoCAD? Я как-то пока не увидел в данной теме объективных причин для отказа от такого способа решения... За то время, что ты потратил на данную тему (пытаясь сделать это программно), уже можно было раз 10 решить это обозначенным мною способом (и это вместе с "попить кофе").
Начну из далека. Перед началом написания кода, читал много литературы/статей и форумов. Ближе к делу смотрел конкретные примеры по программному созданию элементов ленты, вникал в матчасть, запоминал как называются элементы, компилировал и запускал чужие коды на С# (в котором понимаю только интуитивно, так что исправления вносил методом тыка). Вникал архитектуру классов с подобным функционалом. Наконец, на основе полученной информации написал свою процедуру, но споткнулся в одном незначительном моменте, который я думал подскажут буквально одним двумя постами (кто бы мог подумать, что тут холивар на пол дня разгорится  :) ). В общем я тут почти осилил первый этап, а тут Вы мне говорите, что все не так, нужно в корне поменять подход. Конечно мне хочется сначала все закончить, а уже потом смотреть по сторонам. Это вам, зная плюсы и минусы, можно с высока рассуждать как лучше. У меня пока задачи разобраться с синтаксисом и т.п.
Ваш способ (предложенный вами), считаю хорошим и актуальным в тот момент когда "все готово". Все функции и классы плагина написаны, а остается добавить немного интерактивности. Тогда быстро зашел, как вы называете "Батоны" потягал за 3 минуты и все готово. Результат есть, но развития нет, просто вынужденная рутина для достижения скорейшего результата. Более того, внося изменения в функционал, каждый раз будет необходимость возвращаться с нашим "батонам". Скучно и неинтересно. Создавая же элементы программно, я постепенно вникаю в новую и пока немного враждебную среду программирования. Откровенно говоря, рассчитываю что совсем скоро "пропрет", и как минимум пока буду переводить свои старые идеи с VBA на .NET, то новые функции будут появляться как горячие пирожки. Тогда нужно будет в классе с лентой придумывать доп. функции и процедуры/обработчики событий, т.к. все будет разрастаться, а это доп. развитие.
Напоминаю. Как нужно форматировать код для форума указано у меня в подписи.
Прошу прощения, я новичек на форуме. Предательски сбила с толку кнопка "код". Теперь буду форматировать как надо.
Вот так нужно строку было написать
Супер! Буду сейчас пробовать и уверен, что все получится!
Добавлено:
Спасибо Modis'у, все работает! Отметил его пост как решение! Уверен, будет полезно не только мне.