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

26/02/2014

AutoCAD API для ленты с использованием C++/CLI

Есть уже несколько примеров на блоге иллюстрирующих использование API Ленты с помощью .NET, но пока нет ни одного использующего C++/CLI, так что пусть этот будет первым. Кроме того такой вопрос уже задавался членами ADN в прошлом…

Есть несколько причин когда вам нужно вызвать это API из смешенного-управляемого кода::

- Вам нравится этот синтаксис (серьезно?!)

- Вам нужно вызывать C++ код из вашего проекта

- У вас есть существующие MFC диалоги и у вас нет времени или ресурсов для миграции на .NET

- Вам не нравится .NET и вы даже не хотите его пробовать, но вам нужно использовать API для настройки Ленты в AutoCAD

Для любого из этих соображений и для любых других вот как можно вызывать это API из C++. Заметим, что этот проект содержит много примеров, а не только показанные здесь:

Код - C++: [Выделить]
  1. [CommandMethod("AddButtonMixMng")]
  2. void AddButtonMixMng()
  3. {
  4.      Autodesk::Windows::RibbonControl^ ribbonControl =
  5.            Autodesk::Windows::ComponentManager::Ribbon;
  6.  
  7.      RibbonTab^ Tab = gcnew RibbonTab();
  8.      Tab->Title = "Test Ribbon";
  9.      Tab->Id = gcnew String("TESTRIBBON_TAB_ID");
  10.  
  11.      ribbonControl->Tabs->Add(Tab);
  12.  
  13.      RibbonPanelSource^ srcPanel = gcnew RibbonPanelSource();
  14.      srcPanel->Title = "Panel1";
  15.  
  16.      RibbonPanel^ panel = gcnew RibbonPanel();
  17.      panel->Source = srcPanel;
  18.      Tab->Panels->Add(panel);
  19.  
  20.      RibbonButton^ button = gcnew RibbonButton();
  21.      button->Text = "Button Test";
  22.      button->ShowText = true;
  23.      button->ShowImage = true;
  24.      button->Orientation =
  25.               System::Windows::Controls::Orientation::Horizontal;
  26.      button->Size = RibbonItemSize::Large;
  27.      button->Image =
  28.               getBitmapEmbedded(L"Icon16x16.png", 16, 16);
  29.      button->LargeImage =
  30.               getBitmapEmbedded(L"Icon32x32.png", 32, 32);
  31.      button->CommandParameter = "._HelloCmdMng ";
  32.      button->CommandHandler = gcnew ButtonCmdHandler();
  33.  
  34.      srcPanel->Items->Add(button);
  35.  
  36.      Tab->IsActive = true;
  37. }
  38.  
  39. BitmapImage^ getBitmapEmbedded(LPCTSTR pName, int height, int width)
  40. {
  41.      String^ str=
  42.            System::Runtime::InteropServices::Marshal::PtrToStringUni(
  43.               (IntPtr)(void*)pName);
  44.      Bitmap^ image =
  45.               gcnew Bitmap(Assembly::GetExecutingAssembly()->
  46.                   GetManifestResourceStream(str));
  47.  
  48.      MemoryStream^ stream = gcnew MemoryStream();
  49.      image->Save(stream,
  50.               System::Drawing::Imaging::ImageFormat::Png);
  51.      BitmapImage^ bmp = gcnew BitmapImage();
  52.  
  53.      bmp->BeginInit();
  54.      bmp->StreamSource = stream;
  55.      bmp->DecodePixelHeight = height;
  56.      bmp->DecodePixelWidth = width;
  57.      bmp->EndInit();
  58.  
  59.      return bmp;
  60. }
  61.  
  62. ref class ButtonCmdHandler : public System::Windows::Input::ICommand
  63. {
  64.      template < class T, class Cls > bool isInstance(Cls c)
  65.     {
  66.         return dynamic_cast< T >(c) != nullptr;
  67.      }
  68.  
  69. public:
  70.                                   
  71.      virtual bool __clrcall CanExecute(
  72.               System::Object^ parameter) sealed
  73.     {
  74.         return true;
  75.     }
  76.  
  77.     virtual event EventHandler^ CanExecuteChanged;
  78.  
  79.      virtual void __clrcall Execute(System::Object^ parameter) sealed
  80.     {
  81.         if (isInstance<RibbonButton^>(parameter))
  82.         {
  83.             RibbonButton^ button =
  84.                 dynamic_cast<RibbonButton^>(parameter);
  85.  
  86.             Document^ doc =
  87.                 Application::DocumentManager->MdiActiveDocument;
  88.             doc->SendStringToExecute(
  89.                 dynamic_cast<String^>(button->CommandParameter),
  90.                      true, false, false);
  91.         }
  92.     }
  93. };

Исходный код: ArxMngRibbon.zip

Источник: http://adndevblog.typepad.com/autocad/2013/11/autocad-ribbon-runtime-api-with-ccli.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=561

Опубликовано 26.02.2014