Создание фильтра примитивов унаследованных от полилиний
Вопрос: У меня есть собственные примитивы, унаследованные от AcDbPolyline. Я хочу иметь возможность фильтровать их, а также другие типы полилиний (AcDb2dPolyline и AcDb3dPolyline), при помощи функции acedSSGet. Я пробовал создавать фильтр при помощи такого кода:
Но увы. Этот фильтр отбирает все примитивы на заданном слое, а не только полилинии и их наследники. Как можно самым простым способом получить нужный мне фильтр?
Ответ: Фильтровать по коду группы 100 нельзя. Так что потребуется другой способ. Следующий код позволяет получить строку, которая содержит все DXF-наименования примитивов-наследников всех видов полилиний. Хочу обратить внимание, что нельзя наследовать от AcDb2dPolyline и AcDb3dPolyline, так как они являются владельцами своих примитивов-вершин. Но в коде мы это не учитываем.
- //-----------------------------------------------------------------------------
- //----- acrxEntryPoint.cpp
- //-----------------------------------------------------------------------------
- #include "StdAfx.h"
- #include "resource.h"
- //-----------------------------------------------------------------------------
- #define szRDS _RXST("")
- //-----------------------------------------------------------------------------
- //----- ObjectARX EntryPoint
- class CSelectAllPolyApp : public AcRxArxApp {
- public:
- CSelectAllPolyApp () : AcRxArxApp () {}
- virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
- AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
- return (retCode) ;
- }
- virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
- AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;
- return (retCode) ;
- }
- virtual void RegisterServerComponents () {}
- //////////////////////////////////////////////////////////////////////////
- // Вспомогательная функция для создания строки-фильтра
- //////////////////////////////////////////////////////////////////////////
- static AcString DXFPlineNames(void)
- {
- AcString dxfStr = _T("");
- AcRxDictionary* classDict = acrxClassDictionary;
- AcRxDictionaryIterator* iter;
- if ((classDict == NULL) || ((iter = classDict->newIterator()) == NULL)) {
- return dxfStr;
- }
- AcRxObject* classDictItem;
- AcRxClass* classObj;
- AcStringArray dxfnames;
- for (; !iter->done(); iter->next()) {
- classDictItem = iter->object();
- if ((classObj = AcRxClass::cast(classDictItem)) != NULL) {
- if (classObj->isDerivedFrom(AcDb2dPolyline::desc()) ||
- classObj->isDerivedFrom(AcDb3dPolyline::desc()) ||
- classObj->isDerivedFrom(AcDbPolyline::desc()))
- {
- if (!dxfnames.contains(classObj->dxfName()))
- {
- dxfnames.append(classObj->dxfName());
- }
- }
- }
- }
- delete iter;
- if (dxfnames.length() > 0)
- {
- dxfStr = dxfnames[0];
- for (int i = 1; i < dxfnames.length(); i++) {
- dxfStr += _T(",");
- dxfStr += dxfnames[i];
- }
- // acutPrintf(_T("\nСтрока фильтра: \"%s\""), dxfStr.constPtr());
- }
- return dxfStr;
- }
- static void RivilisSelectPlines(void)
- {
- resbuf *rb = acutBuildList(RTDXF0, DXFPlineNames().constPtr(), RTNONE);
- ads_name ss;
- if (acedSSGet(NULL, NULL, NULL, rb, ss) == RTNORM) {
- Adesk::Int32 len = 0;
- acedSSLength(ss, &len);
- acutPrintf(_T("\nОтобрано полилиний и их наследников: %d"), len);
- } else {
- acutPrintf(_T("\nНичего не выбрано!"));
- }
- }
- } ;
- //-----------------------------------------------------------------------------
- IMPLEMENT_ARX_ENTRYPOINT(CSelectAllPolyApp)
- ACED_ARXCOMMAND_ENTRY_AUTO(CSelectAllPolyApp, Rivilis, SelectPlines, SelectPlines, ACRX_CMD_MODAL, NULL)
Видео:
Обсуждение: http://adn-cis.org/forum/index.php?topic=7526
Опубликовано 21.12.2016