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

29/03/2017

Как получить имя примитива из Панели свойств?

Вопрос: В панели свойств есть название примитива, который находится в наборе предварительного выбора (pickfirst):

 

Это название – локализованная строка. Например, в русской локализации – Дуга, в английской – Arc. Как можно имея идентификатор AcDbObjectId этого примитива узнать его имя?

Ответ: Ниже приводится полный код, который печатает имя выбранного примитива:

Код - C++: [Выделить]
  1. //-----------------------------------------------------------------------------
  2. //----- acrxEntryPoint.cpp
  3. //-----------------------------------------------------------------------------
  4. #include "StdAfx.h"
  5. #include "opmext.h"
  6. #include "resource.h"
  7.  
  8. //-----------------------------------------------------------------------------
  9. #define szRDS _RXST("")
  10.  
  11. //-----------------------------------------------------------------------------
  12. //----- ObjectARX EntryPoint
  13. class CGetOPMNameApp : public AcRxArxApp {
  14.  
  15. public:
  16.   CGetOPMNameApp() : AcRxArxApp() {}
  17.  
  18.   virtual AcRx::AppRetCode On_kInitAppMsg(void *pkt) {
  19.     AcRx::AppRetCode retCode = AcRxArxApp::On_kInitAppMsg(pkt);
  20.     return (retCode);
  21.   }
  22.  
  23.   virtual AcRx::AppRetCode On_kUnloadAppMsg(void *pkt) {
  24.     AcRx::AppRetCode retCode = AcRxArxApp::On_kUnloadAppMsg(pkt);
  25.     return (retCode);
  26.   }
  27.  
  28.   virtual void RegisterServerComponents() {    }
  29.  
  30.   static void RivilisGetOPMName() {
  31.     ads_name en;  ads_point pt;
  32.     if (acedEntSel(L"\nSelect entity: ", en, pt) == RTNORM)
  33.     {
  34.       AcDbObjectId id; acdbGetObjectId(id, en);
  35.       AcDbEntityPointer pEnt(id);
  36.       if (pEnt.openStatus() == Acad::eOk)
  37.       {
  38.         CLSID clsid;
  39.         if (pEnt->getClassID(&clsid) == Acad::eOk)
  40.         {
  41.           CComQIPtr<IOPMPropertyExtension> OPEHelper;
  42.           OPEHelper.CoCreateInstance(clsid);
  43.           HRESULT hr = S_OK;
  44.           if (OPEHelper)
  45.           {
  46.             LPOLESTR  pbstrName;
  47.             ///////////////////////////////////////////////////////////////
  48.             // Магическое число 0x401 для получения OPM-имени примитива   
  49.             ///////////////////////////////////////////////////////////////
  50.             hr = OPEHelper->GetDisplayName(0x401, &pbstrName);
  51.             if (SUCCEEDED(hr) && pbstrName)
  52.             {
  53.               acutPrintf(L"\nИмя = \"%s\"", pbstrName);
  54.             }
  55.           }
  56.         }
  57.       }
  58.     }
  59.   }
  60. };
  61.  
  62. //-----------------------------------------------------------------------------
  63. IMPLEMENT_ARX_ENTRYPOINT(CGetOPMNameApp)
  64. ACED_ARXCOMMAND_ENTRY_AUTO(CGetOPMNameApp, Rivilis, GetOPMName, GetOPMName, ACRX_CMD_MODAL, NULL)

 

Так это выглядит:

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

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

Опубликовано 29.03.2017
Отредактировано 29.03.2017 в 21:02:51