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

04/06/2016

Как можно передавать сообщения в Fusion 360 по-русски из C++

Когда я создал тестовое приложение для Fusion 360 на C++ я обратил внимание, что цифры и английские буквы показываются нормально, а вместо кириллицы я увидел абракадабру. При этом в приложении на JavaScript и Python русские буквы воспроизводятся нормально. В чем же проблема? Оказалось, что скрипты JavaScript и Python сохраняются в кодировке UTF8 (если сохранять их в другой кодировке, то русские буквы тоже заменяются на абракадабру), и строки передаются именно в этой кодировке. Значит и в C++ необходимо передавать строки в этой же кодировке. Это можно сделать следующим образом (спасибо за подсказку liujac с форума Autodesk):

Код - C++: [Выделить]
  1. // Функция преобразования строки в UTF8
  2. inline std::string toUTF8(std::wstring w)
  3. {
  4.   std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
  5.   return converter.to_bytes(w);
  6. }

 

Результирующий код:

Код - C++: [Выделить]
  1. #include <locale>
  2. #include <codecvt>
  3. #include <windows.h>
  4. #include <Core/CoreAll.h>
  5. #include <Fusion/FusionAll.h>
  6. #include <CAM/CAMAll.h>
  7.  
  8. using namespace adsk::core;
  9. using namespace adsk::fusion;
  10. using namespace adsk::cam;
  11. // Функция преобразования строки в UTF8
  12. inline std::string toUTF8(std::wstring w)
  13. {
  14.   std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
  15.   return converter.to_bytes(w);
  16. }
  17.  
  18. Ptr<Application> app;
  19. Ptr<UserInterface> ui;
  20.  
  21. extern "C" XI_EXPORT bool run(const char* context)
  22. {
  23.   app = Application::get();
  24.  
  25.   if (!app)
  26.     return false;
  27.  
  28.   ui = app->userInterface();
  29.   if (!ui)
  30.     return false;
  31.  
  32.  
  33.   HMODULE hdll = LoadLibraryW(L"C:\\test.dll");
  34.   if (hdll) {
  35.     ui->messageBox(toUTF8(L"Dll загружено"));
  36.   } else {
  37.     ui->messageBox(toUTF8(L"Dll не загружено"));
  38.   }
  39.  
  40.   return true;
  41. }
  42.  
  43. extern "C" XI_EXPORT bool stop(const char* context)
  44. {
  45.   if (ui)
  46.   {
  47.     ui->messageBox(toUTF8(L"Выход "));
  48.     ui = nullptr;
  49.   }
  50.  
  51.   return true;
  52. }
  53.  
  54.  
  55. #ifdef XI_WIN
  56.  
  57. #include <windows.h>
  58.  
  59. BOOL APIENTRY DllMain(HMODULE hmodule, DWORD reason, LPVOID reserved)
  60. {
  61.   switch (reason)
  62.   {
  63.   case DLL_PROCESS_ATTACH:
  64.   case DLL_THREAD_ATTACH:
  65.   case DLL_THREAD_DETACH:
  66.   case DLL_PROCESS_DETACH:
  67.     break;
  68.   }
  69.   return TRUE;
  70. }
  71.  
  72. #endif // XI_WIN


Автор: Александр Ривилис

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

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