06/11/2014
Импортирование Палитры инструментов/Группы палитр из XTP/XPG файлов
Импортирование Палитры инструментов или Группы палитр инструментов из xtp и xpg файлов требует в AutoCAD взаимодействия с пользователем. Вот пример кода на ObjectARX для автоматизации этого. Часть кода получает информацию из xtp / xtg файлов при помощи чтения чистого XML документа. Этот код работает для простых файлов xtp и xpg, которые я использовал для тестов. Возможно потребуется дополнительная проверка и обработка ошибок в вашем конкретном случае.
Код - C++: [Выделить]
- CAcTcUiManager *pTcUiManager = AcTcUiGetManager();
- CAcTcUiToolPaletteSet *pTpset = AcTcUiGetToolPaletteWindow();
- // Список xtp файлов для импорта
- AcArray<AcString> xtpFiles;
- xtpFiles.append(ACRX_T("C:\\Temp\\MyTP.xtp"));
- // Список xpg файлов для импорта
- AcArray<AcString> xpgFiles;
- xpgFiles.append(ACRX_T("C:\\Temp\\MyTPGroup.xpg"));
- // Импортируем ToolPalette из xtp файла
- // По умолчанию Toolpalette добавляется в группу "AllPalettesGroup"
- // После импортирования xtp файла, получаем его имя
- // Нам понадобится перенести toolpalette в группу
- // toolpalette, которую мы импортировали из xpg файла.
- AcArray<AcString> toolPaletteNames;
- for(int xtpFileIndex =0;
- xtpFileIndex < xtpFiles.length(); xtpFileIndex++)
- {
- // Получаем путь к xtp файлу
- AcString xtpFilePath = xtpFiles.at(xtpFileIndex);
- if(pTcUiManager->Import(xtpFilePath))
- {
- acutPrintf(ACRX_T("\nИмпортирован %s"), xtpFilePath);
- }
- // ToolPalette импортирована, но нам нужно найти ее имя
- // чтобы перенести ее в нашу ToolPaletteGroup
- // Находим имя ToolPalette, которую мы импортировали из
- // XTP файла.
- CComPtr<IXMLDOMDocument> pXTPDoc;
- HRESULT hr = pXTPDoc.CoCreateInstance(CLSID_DOMDocument,
- NULL, CLSCTX_INPROC_SERVER);
- if (FAILED(hr))
- return;
- CComVariant xmlSource = xtpFilePath.constPtr();
- VARIANT_BOOL varSuccess = VARIANT_FALSE;
- hr = pXTPDoc->load(xmlSource, &varSuccess);
- if (FAILED(hr) || ! varSuccess)
- return;
- // Находим узел <Palette></Palette> в xml
- CComPtr<IXMLDOMNodeList> pTPNodeList = NULL;
- hr = pXTPDoc->getElementsByTagName(ACRX_T("Palette"),
- &pTPNodeList);
- if (FAILED(hr))
- return;
- long tpCount = 0;
- hr = pTPNodeList->get_length(&tpCount);
- if(FAILED(hr))
- return;
- pTPNodeList->reset();
- for(int ii = 0; ii < tpCount; ii++)
- {
- CComPtr<IXMLDOMNode> pTPNode = NULL;
- hr = pTPNodeList->get_item(ii, &pTPNode);
- if(FAILED(hr))
- return;
- if(pTPNode)
- {
- CComPtr<IXMLDOMNode> pTPParentNode = NULL;
- hr = pTPNode->get_parentNode(&pTPParentNode);
- if(SUCCEEDED(hr))
- {
- // Проверяем имя родительского узла
- // чтобы убедится, что мы нашли именно
- // имя ToolPalette
- CComBSTR bstrParentNodeName;
- hr = pTPParentNode->get_nodeName
- (&bstrParentNodeName);
- if(SUCCEEDED(hr)
- && bstrParentNodeName == ACRX_T("ToolSource"))
- {
- BSTR bstrTPName = NULL;
- hr = pTPNode->get_text(&bstrTPName);
- if(SUCCEEDED(hr))
- {
- AcString toolPaletteName(bstrTPName);
- toolPaletteNames.append(toolPaletteName);
- ::SysFreeString(bstrTPName);
- }
- }
- }
- }
- }
- }
- // Импорт ToolPaletteGroup из xpg файла
- // По умолчанию toolpalettegroup пустая
- // После импорта из xpg файла,
- // мы должны перенести импортированные toolpalette’ы в группу импортированную
- // из xpg файла.
- for(int xpgFileIndex =0;
- xpgFileIndex < xpgFiles.length(); xpgFileIndex++)
- {
- AcString xpgFilePath = xpgFiles.at(xpgFileIndex);
- // Создаем экземпляр XML документа
- CComPtr<IXMLDOMDocument> pXPGDoc;
- HRESULT hr = pXPGDoc.CoCreateInstance(CLSID_DOMDocument,
- NULL, CLSCTX_INPROC_SERVER);
- if (FAILED(hr))
- return;
- // Загружаем XPG-файл как XML документ
- CComVariant xmlSource = xpgFilePath.constPtr();
- VARIANT_BOOL bSuccess = VARIANT_FALSE;
- hr = pXPGDoc->load(xmlSource, &bSuccess);
- if (FAILED(hr) || ! bSuccess)
- return;
- // Получаем узел XML из XPG файла, соответствующий
- // группе ToolPalette
- CComPtr<IXMLDOMNodeList> pTPGNodeList = NULL;
- hr = pXPGDoc->getElementsByTagName(
- ACRX_T("ToolPaletteGroup"),
- &pTPGNodeList);
- if (FAILED(hr))
- return;
- // Находим количество узлов групп ToolPalette
- // из XPG файла
- long tpgCount = 0;
- hr = pTPGNodeList->get_length(&tpgCount);
- if(FAILED(hr))
- return;
- pTPGNodeList->reset();
- for(int tpgIndex = 0; tpgIndex < tpgCount; tpgIndex++)
- {
- // Получаем единичный узел XML соответствующий
- // группе ToolPalette
- CComPtr<IXMLDOMNode> pTPGNode = NULL;
- hr = pTPGNodeList->get_item(tpgIndex, &pTPGNode);
- if(FAILED(hr) || pTPGNode == NULL)
- return;
- // Создаем новую группу ToolPalette и
- CAcTcUiToolPaletteGroup *pRootTpgroup
- = pTpset->GetToolPaletteGroup(FALSE);
- CAcTcUiToolPaletteGroup * pMyToolPaletteGroup = NULL;
- pRootTpgroup->Clone(pMyToolPaletteGroup);
- pMyToolPaletteGroup->Reset();
- // импортируем настройки группыe ToolPalette из
- // файла XPG
- if(pMyToolPaletteGroup->Load(pTPGNode))
- {
- pRootTpgroup->AddItem(pMyToolPaletteGroup);
- pTpset->SetActivePaletteGroup(pMyToolPaletteGroup);
- acutPrintf(ACRX_T("\nИмпортирован %s"), xpgFilePath);
- }
- // Добавляем свои ToolPalette
- // в свою группу ToolPalette.
- CAcTcUiToolPaletteGroup *pAllPalettesGroup
- = pTpset->GetAllPalettesGroup();
- for(int ii =0; ii < toolPaletteNames.length(); ii++)
- {
- AcString toolPaletteName = toolPaletteNames.at(ii);
- CAcTcUiToolPalette *pMyCustomPalette
- = pAllPalettesGroup->FindPalette(
- toolPaletteName, NULL);
- if(pMyCustomPalette != NULL)
- {
- // Добавляем единичную ToolPalette к своей
- // группе ToolPalette.
- pMyToolPaletteGroup->AddItem(pMyCustomPalette);
- }
- }
- }
- }
Обсуждение: http://adn-cis.org/forum/index.php?topic=1063
Опубликовано 06.11.2014Отредактировано 06.11.2014 в 11:01:54