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

06/11/2014

Импортирование Палитры инструментов/Группы палитр из XTP/XPG файлов

Импортирование Палитры инструментов или Группы палитр инструментов из xtp и xpg файлов требует в AutoCAD взаимодействия с пользователем. Вот пример кода на ObjectARX для автоматизации этого. Часть кода получает информацию из xtp / xtg файлов при помощи чтения чистого XML документа. Этот код работает для простых файлов xtp и xpg, которые я использовал для тестов. Возможно потребуется дополнительная проверка и обработка ошибок в вашем конкретном случае.

Код - C++: [Выделить]
  1. CAcTcUiManager *pTcUiManager = AcTcUiGetManager();
  2. CAcTcUiToolPaletteSet *pTpset = AcTcUiGetToolPaletteWindow();
  3.  
  4. // Список xtp файлов для импорта
  5. AcArray<AcString> xtpFiles;
  6. xtpFiles.append(ACRX_T("C:\\Temp\\MyTP.xtp"));
  7.  
  8. // Список xpg файлов для импорта
  9. AcArray<AcString> xpgFiles;
  10. xpgFiles.append(ACRX_T("C:\\Temp\\MyTPGroup.xpg"));
  11.  
  12. // Импортируем ToolPalette из xtp файла
  13. // По умолчанию Toolpalette добавляется в группу "AllPalettesGroup"
  14. // После импортирования xtp файла, получаем его имя
  15. // Нам понадобится перенести toolpalette в группу
  16. // toolpalette, которую мы импортировали из xpg файла.
  17. AcArray<AcString> toolPaletteNames;
  18. for(int xtpFileIndex =0;
  19.         xtpFileIndex < xtpFiles.length(); xtpFileIndex++)
  20. {
  21.     // Получаем путь к xtp файлу
  22.     AcString xtpFilePath = xtpFiles.at(xtpFileIndex);
  23.  
  24.     if(pTcUiManager->Import(xtpFilePath))
  25.     {
  26.         acutPrintf(ACRX_T("\nИмпортирован %s"), xtpFilePath);
  27.     }
  28.  
  29.     // ToolPalette импортирована, но нам нужно найти ее имя
  30.     // чтобы перенести ее в нашу ToolPaletteGroup
  31.     // Находим имя ToolPalette, которую мы импортировали из
  32.     // XTP файла.
  33.     CComPtr<IXMLDOMDocument> pXTPDoc;
  34.     HRESULT hr = pXTPDoc.CoCreateInstance(CLSID_DOMDocument,
  35.                                 NULL, CLSCTX_INPROC_SERVER);
  36.     if (FAILED(hr))
  37.         return;
  38.  
  39.     CComVariant xmlSource = xtpFilePath.constPtr();
  40.     VARIANT_BOOL varSuccess = VARIANT_FALSE;
  41.     hr = pXTPDoc->load(xmlSource, &varSuccess);
  42.     if (FAILED(hr) || ! varSuccess)
  43.         return;
  44.  
  45.     // Находим узел <Palette></Palette> в xml
  46.     CComPtr<IXMLDOMNodeList> pTPNodeList = NULL;
  47.     hr = pXTPDoc->getElementsByTagName(ACRX_T("Palette"),
  48.                                                 &pTPNodeList);
  49.     if (FAILED(hr))
  50.         return;
  51.  
  52.     long tpCount = 0;
  53.     hr = pTPNodeList->get_length(&tpCount);
  54.     if(FAILED(hr))
  55.         return;
  56.  
  57.     pTPNodeList->reset();
  58.     for(int ii = 0; ii < tpCount; ii++)
  59.     {
  60.         CComPtr<IXMLDOMNode> pTPNode = NULL;
  61.         hr = pTPNodeList->get_item(ii, &pTPNode);
  62.         if(FAILED(hr))
  63.             return;
  64.  
  65.         if(pTPNode)
  66.         {
  67.             CComPtr<IXMLDOMNode> pTPParentNode = NULL;
  68.             hr = pTPNode->get_parentNode(&pTPParentNode);
  69.             if(SUCCEEDED(hr))
  70.             {
  71.                 // Проверяем имя родительского узла
  72.                 // чтобы убедится, что мы нашли именно
  73.                 // имя ToolPalette
  74.                 CComBSTR bstrParentNodeName;
  75.                 hr = pTPParentNode->get_nodeName
  76.                                         (&bstrParentNodeName);
  77.                 if(SUCCEEDED(hr)
  78.                 && bstrParentNodeName == ACRX_T("ToolSource"))
  79.                 {
  80.                     BSTR bstrTPName = NULL;
  81.                     hr = pTPNode->get_text(&bstrTPName);
  82.                     if(SUCCEEDED(hr))
  83.                     {
  84.                         AcString toolPaletteName(bstrTPName);
  85.                         toolPaletteNames.append(toolPaletteName);
  86.                         ::SysFreeString(bstrTPName);
  87.                     }
  88.                 }
  89.             }
  90.         }
  91.     }
  92. }
  93.  
  94. // Импорт ToolPaletteGroup из xpg файла
  95. // По умолчанию toolpalettegroup пустая
  96. // После импорта из xpg файла,
  97. // мы должны перенести импортированные toolpalette’ы в группу импортированную
  98. // из xpg файла.
  99. for(int xpgFileIndex =0;
  100.             xpgFileIndex < xpgFiles.length(); xpgFileIndex++)
  101. {
  102.     AcString xpgFilePath = xpgFiles.at(xpgFileIndex);
  103.  
  104.     // Создаем экземпляр XML документа
  105.     CComPtr<IXMLDOMDocument> pXPGDoc;
  106.     HRESULT hr = pXPGDoc.CoCreateInstance(CLSID_DOMDocument,
  107.                                  NULL, CLSCTX_INPROC_SERVER);
  108.     if (FAILED(hr))
  109.         return;
  110.  
  111.     // Загружаем XPG-файл как XML документ
  112.     CComVariant xmlSource = xpgFilePath.constPtr();
  113.     VARIANT_BOOL bSuccess = VARIANT_FALSE;
  114.     hr = pXPGDoc->load(xmlSource, &bSuccess);
  115.     if (FAILED(hr) || ! bSuccess)
  116.         return;
  117.  
  118.     // Получаем узел XML из XPG файла, соответствующий
  119.     // группе ToolPalette
  120.     CComPtr<IXMLDOMNodeList> pTPGNodeList = NULL;
  121.     hr = pXPGDoc->getElementsByTagName(
  122.                                   ACRX_T("ToolPaletteGroup"),
  123.                                   &pTPGNodeList);
  124.     if (FAILED(hr))
  125.         return;
  126.  
  127.     // Находим количество узлов групп ToolPalette
  128.     // из XPG файла
  129.     long tpgCount = 0;
  130.     hr = pTPGNodeList->get_length(&tpgCount);
  131.     if(FAILED(hr))
  132.         return;
  133.  
  134.     pTPGNodeList->reset();
  135.     for(int tpgIndex = 0; tpgIndex < tpgCount; tpgIndex++)
  136.     {
  137.         // Получаем единичный узел XML соответствующий
  138.         // группе ToolPalette
  139.         CComPtr<IXMLDOMNode> pTPGNode = NULL;
  140.         hr = pTPGNodeList->get_item(tpgIndex, &pTPGNode);
  141.         if(FAILED(hr) || pTPGNode == NULL)
  142.             return;
  143.  
  144.         // Создаем новую группу ToolPalette и
  145.         CAcTcUiToolPaletteGroup *pRootTpgroup
  146.                         = pTpset->GetToolPaletteGroup(FALSE);
  147.         CAcTcUiToolPaletteGroup * pMyToolPaletteGroup = NULL;
  148.         pRootTpgroup->Clone(pMyToolPaletteGroup);
  149.         pMyToolPaletteGroup->Reset();
  150.  
  151.         // импортируем настройки группыe ToolPalette из
  152.         // файла XPG
  153.         if(pMyToolPaletteGroup->Load(pTPGNode))
  154.         {
  155.             pRootTpgroup->AddItem(pMyToolPaletteGroup);
  156.             pTpset->SetActivePaletteGroup(pMyToolPaletteGroup);
  157.             acutPrintf(ACRX_T("\nИмпортирован %s"), xpgFilePath);
  158.         }
  159.  
  160.         // Добавляем свои ToolPalette
  161.         // в свою группу ToolPalette.
  162.         CAcTcUiToolPaletteGroup *pAllPalettesGroup
  163.                             = pTpset->GetAllPalettesGroup();
  164.         for(int ii =0; ii < toolPaletteNames.length(); ii++)
  165.         {
  166.             AcString toolPaletteName = toolPaletteNames.at(ii);
  167.             CAcTcUiToolPalette *pMyCustomPalette
  168.                 = pAllPalettesGroup->FindPalette(
  169.                                     toolPaletteName, NULL);
  170.             if(pMyCustomPalette != NULL)
  171.             {
  172.                 // Добавляем единичную ToolPalette к своей
  173.                 // группе ToolPalette.
  174.                 pMyToolPaletteGroup->AddItem(pMyCustomPalette);
  175.             }
  176.         }
  177.     }
  178. }

 

Источник: http://adndevblog.typepad.com/autocad/2013/11/importing-toolpalettetoolpalettegroup-from-xtpxtg-files.html

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

Опубликовано 06.11.2014
Отредактировано 06.11.2014 в 11:01:54