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

21/12/2016

Создание фильтра примитивов унаследованных от полилиний

Вопрос: У меня есть собственные примитивы, унаследованные от AcDbPolyline. Я хочу иметь возможность фильтровать их, а также другие типы полилиний (AcDb2dPolyline и AcDb3dPolyline), при помощи функции acedSSGet. Я пробовал создавать фильтр при помощи такого кода:

Код - C++: [Выделить]
  1. acutBuildList( 8, _T("TheLayerName"),
  2.                -4, _T("<or"),
  3.                    RTDXF0, _T("POLYLINE"),
  4.                    100,    _T("AcDbPolyline"),
  5.                -4, _T("or>"),
  6.                 0) ;

Но увы. Этот фильтр отбирает все примитивы на заданном слое, а не только полилинии и их наследники. Как можно самым простым способом получить нужный мне фильтр?

Ответ: Фильтровать по коду группы 100 нельзя. Так что потребуется другой способ. Следующий код позволяет получить строку, которая содержит все DXF-наименования примитивов-наследников всех видов полилиний. Хочу обратить внимание, что нельзя наследовать от AcDb2dPolyline и AcDb3dPolyline, так как они являются владельцами своих примитивов-вершин. Но в коде мы это не учитываем.

Код - C++: [Выделить]
  1. //-----------------------------------------------------------------------------
  2. //----- acrxEntryPoint.cpp
  3. //-----------------------------------------------------------------------------
  4. #include "StdAfx.h"
  5. #include "resource.h"
  6.  
  7. //-----------------------------------------------------------------------------
  8. #define szRDS _RXST("")
  9.  
  10. //-----------------------------------------------------------------------------
  11. //----- ObjectARX EntryPoint
  12. class CSelectAllPolyApp : public AcRxArxApp {
  13. public:
  14.        CSelectAllPolyApp () : AcRxArxApp () {}
  15.        virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
  16.              AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
  17.              return (retCode) ;
  18.        }
  19.        virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
  20.              AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;
  21.              return (retCode) ;
  22.        }
  23.  
  24.        virtual void RegisterServerComponents () {}
  25.   //////////////////////////////////////////////////////////////////////////
  26.   //   Вспомогательная функция для создания строки-фильтра
  27.   //////////////////////////////////////////////////////////////////////////
  28.   static AcString DXFPlineNames(void)
  29.   {
  30.     AcString dxfStr = _T("");
  31.     AcRxDictionary* classDict = acrxClassDictionary;
  32.     AcRxDictionaryIterator* iter;
  33.     if ((classDict == NULL) || ((iter = classDict->newIterator()) == NULL)) {
  34.       return dxfStr;
  35.     }
  36.     AcRxObject* classDictItem;
  37.     AcRxClass* classObj;
  38.     AcStringArray dxfnames;
  39.     for (; !iter->done(); iter->next()) {
  40.       classDictItem = iter->object();
  41.       if ((classObj = AcRxClass::cast(classDictItem)) != NULL) {
  42.         if (classObj->isDerivedFrom(AcDb2dPolyline::desc()) ||
  43.           classObj->isDerivedFrom(AcDb3dPolyline::desc()) ||
  44.           classObj->isDerivedFrom(AcDbPolyline::desc()))
  45.         {
  46.           if (!dxfnames.contains(classObj->dxfName()))
  47.           {
  48.             dxfnames.append(classObj->dxfName());
  49.           }
  50.         }
  51.       }
  52.     }
  53.     delete iter;
  54.     if (dxfnames.length() > 0)
  55.     {
  56.       dxfStr = dxfnames[0];
  57.       for (int i = 1; i < dxfnames.length(); i++) {
  58.         dxfStr += _T(",");
  59.         dxfStr += dxfnames[i];
  60.       }
  61.       // acutPrintf(_T("\nСтрока фильтра: \"%s\""), dxfStr.constPtr());
  62.     }
  63.     return dxfStr;
  64.   }
  65.   static void RivilisSelectPlines(void)
  66.   {
  67.     resbuf *rb = acutBuildList(RTDXF0, DXFPlineNames().constPtr(), RTNONE);
  68.     ads_name ss;
  69.     if (acedSSGet(NULL, NULL, NULL, rb, ss) == RTNORM) {
  70.       Adesk::Int32 len = 0;
  71.       acedSSLength(ss, &len);
  72.       acutPrintf(_T("\nОтобрано полилиний и их наследников: %d"), len);
  73.     } else {
  74.       acutPrintf(_T("\nНичего не выбрано!"));
  75.     }
  76.   }
  77. } ;
  78.  
  79. //-----------------------------------------------------------------------------
  80. IMPLEMENT_ARX_ENTRYPOINT(CSelectAllPolyApp)
  81.  
  82. ACED_ARXCOMMAND_ENTRY_AUTO(CSelectAllPolyApp, Rivilis, SelectPlines, SelectPlines, ACRX_CMD_MODAL, NULL)

 

Видео:

 

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

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

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