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

16/12/2013

Расчленение всех примитивов из набора

Ниже код для расчленения всех примитивов из набора. Мы используем метод explode() класса AcDbEntity class и результат расчленения сохраняется в массиве AcDbVoidPtrArray. Все примитивы из AcDbVoidPtrArray добавляются к базе, а оригинальные примитивы стираются.

Код - C++: [Выделить]
  1. static void AdskProject_EXPENT(void)
  2. {
  3.     ads_name ss;
  4.     ads_name eName;
  5.     AcDbObjectId objId;
  6.     AcDbEntity* pEnt;
  7.  
  8.     if (acedSSGet(NULL, NULL,NULL,NULL,ss) != RTNORM)
  9.         return;
  10.  
  11.     long i=0;
  12.     acedSSLength(ss,&i);
  13.  
  14.     // Расчленяем все примитивы из набора
  15.     for (int j=0;j<i;j++)
  16.     {
  17.         if(acedSSName(ss,j,eName) != RTNORM)
  18.         {
  19.             acedSSFree(ss);
  20.             return;
  21.         }
  22.         acdbGetObjectId(objId,eName) ;
  23.         acdbOpenAcDbEntity(pEnt,objId,AcDb::kForWrite);
  24.  
  25.         AcDbVoidPtrArray eSet;
  26.         Acad::ErrorStatus es=pEnt->explode(eSet);
  27.         if (es == Acad::eOk)
  28.         {   
  29.             pEnt->close();
  30.  
  31.             // удаляем исходный примитив
  32.             acdbEntDel(eName);
  33.  
  34.             // добавляем новые примитивы в базу
  35.             es=postToDatabase(eSet);
  36.             if (es != Acad::eOk)
  37.             {
  38.                 acutPrintf(L"\nОшибка при добавлении примитивов в базу");
  39.                 acedSSFree(ss);
  40.                 return;
  41.             }
  42.         }
  43.         else // сохраняем
  44.             pEnt->close();
  45.     }   
  46.     acedSSFree(ss);
  47. }
  48.  
  49. static Acad::ErrorStatus postToDatabase(AcDbVoidPtrArray eSet)
  50. {
  51.     Acad::ErrorStatus es;
  52.     AcDbBlockTable *pBtbl;
  53.     AcDbBlockTableRecord *pBtblr;
  54.     es =acdbHostApplicationServices()->workingDatabase()
  55.                         ->getSymbolTable(pBtbl, AcDb::kForRead);
  56.     if (es != Acad::eOk)
  57.     {
  58.         acutPrintf(L"\nОшибка при открытии таблицы блоков");
  59.         return es;
  60.     }
  61.     es=pBtbl->getAt(ACDB_MODEL_SPACE, pBtblr,AcDb::kForWrite);
  62.     if (es != Acad::eOk)
  63.     {
  64.         acutPrintf(L"\nОшибка при открытии записи таблицы блоков");
  65.         es =pBtbl->close();
  66.         if (es != Acad::eOk)
  67.         {
  68.             acutPrintf(L"\nОшибка при закрытии таблицы блоков");
  69.         }
  70.         return es;
  71.     }
  72.  
  73.     es =pBtbl->close();
  74.     if (es != Acad::eOk)
  75.     {
  76.         acutPrintf(L"\nОшибка при закрытии таблицы блоков");
  77.         return es;
  78.     }
  79.  
  80.     for(int i=0; i < eSet.length(); i++)
  81.     {
  82.         AcDbObjectId ObjId;
  83.         AcDbEntity *pNewEnt=AcDbEntity::cast((AcRxObject*)eSet[i]);
  84.         es=pBtblr->appendAcDbEntity(ObjId, pNewEnt);
  85.         if (es != Acad::eOk)
  86.         {
  87.             acutPrintf(L"\nОшибка при добавлении примитива ");
  88.         }
  89.  
  90.         es=pNewEnt->close();
  91.         if (es != Acad::eOk)
  92.         {
  93.             acutPrintf(L"\nОшибка при закрытии примитива ");
  94.         }
  95.     }
  96.  
  97.     es=pBtblr->close();
  98.     if (es != Acad::eOk)
  99.     {
  100.         acutPrintf(L"\nОшибка при закрытии записи таблицы блоков");
  101.     }
  102.     return es;
  103. }

Источник: http://adndevblog.typepad.com/autocad/2012/06/exploding-all-entities-in-a-selection-set.html

 

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

Опубликовано 16.12.2013
Отредактировано 16.12.2013 в 16:16:16