16/12/2013
Расчленение всех примитивов из набора
Ниже код для расчленения всех примитивов из набора. Мы используем метод explode() класса AcDbEntity class и результат расчленения сохраняется в массиве AcDbVoidPtrArray. Все примитивы из AcDbVoidPtrArray добавляются к базе, а оригинальные примитивы стираются.
Код - C++: [Выделить]
- static void AdskProject_EXPENT(void)
- {
- ads_name ss;
- ads_name eName;
- AcDbObjectId objId;
- AcDbEntity* pEnt;
- if (acedSSGet(NULL, NULL,NULL,NULL,ss) != RTNORM)
- return;
- long i=0;
- acedSSLength(ss,&i);
- // Расчленяем все примитивы из набора
- for (int j=0;j<i;j++)
- {
- if(acedSSName(ss,j,eName) != RTNORM)
- {
- acedSSFree(ss);
- return;
- }
- acdbGetObjectId(objId,eName) ;
- acdbOpenAcDbEntity(pEnt,objId,AcDb::kForWrite);
- AcDbVoidPtrArray eSet;
- Acad::ErrorStatus es=pEnt->explode(eSet);
- if (es == Acad::eOk)
- {
- pEnt->close();
- // удаляем исходный примитив
- acdbEntDel(eName);
- // добавляем новые примитивы в базу
- es=postToDatabase(eSet);
- if (es != Acad::eOk)
- {
- acutPrintf(L"\nОшибка при добавлении примитивов в базу");
- acedSSFree(ss);
- return;
- }
- }
- else // сохраняем
- pEnt->close();
- }
- acedSSFree(ss);
- }
- static Acad::ErrorStatus postToDatabase(AcDbVoidPtrArray eSet)
- {
- Acad::ErrorStatus es;
- AcDbBlockTable *pBtbl;
- AcDbBlockTableRecord *pBtblr;
- es =acdbHostApplicationServices()->workingDatabase()
- ->getSymbolTable(pBtbl, AcDb::kForRead);
- if (es != Acad::eOk)
- {
- acutPrintf(L"\nОшибка при открытии таблицы блоков");
- return es;
- }
- es=pBtbl->getAt(ACDB_MODEL_SPACE, pBtblr,AcDb::kForWrite);
- if (es != Acad::eOk)
- {
- acutPrintf(L"\nОшибка при открытии записи таблицы блоков");
- es =pBtbl->close();
- if (es != Acad::eOk)
- {
- acutPrintf(L"\nОшибка при закрытии таблицы блоков");
- }
- return es;
- }
- es =pBtbl->close();
- if (es != Acad::eOk)
- {
- acutPrintf(L"\nОшибка при закрытии таблицы блоков");
- return es;
- }
- for(int i=0; i < eSet.length(); i++)
- {
- AcDbObjectId ObjId;
- AcDbEntity *pNewEnt=AcDbEntity::cast((AcRxObject*)eSet[i]);
- es=pBtblr->appendAcDbEntity(ObjId, pNewEnt);
- if (es != Acad::eOk)
- {
- acutPrintf(L"\nОшибка при добавлении примитива ");
- }
- es=pNewEnt->close();
- if (es != Acad::eOk)
- {
- acutPrintf(L"\nОшибка при закрытии примитива ");
- }
- }
- es=pBtblr->close();
- if (es != Acad::eOk)
- {
- acutPrintf(L"\nОшибка при закрытии записи таблицы блоков");
- }
- return es;
- }
Источник: 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