Удаление всех прокси-примитивов из чертежа средствами ObjectARX
Вопрос:
Я хочу работать с чертежом, содержащем пользовательские объекты, для которых у меня нет соответствующего приложения. Я бы хотел использовать данные из чертежа для построения новой «геометрии». Какие-то примитивы можно расчленить, а какие-то нет. И они отмечены как неудаляемые. Я создаю эквивалент для этих примитивов, а вот удалить их не могу. Возможно ли их удалить?
Ответ
Средствами ObjectARX можно заменить прокси-примитивы на какие-то другие. Следующий код делает именно это: проходит по всем примитивам чертежа, переключая все прокси-примитивы на анонимные блоки. Блоки содержат эквивалентную геометрию прокси-примитивов. Заметим, что нельзя создать примитив содержащий ту же информацию, что и исходный примитив.
- void RemoveProxy()
- {
- AcDbObjectIdArray proxies;
- // Проходим по всем записям
- // Создаём список всех прокси, а обработаем их потом.
- AcDbBlockTable* pTable;
- acdbHostApplicationServices()->
- workingDatabase()->getBlockTable( pTable, AcDb::kForRead);
- if(pTable == NULL)
- return;
- AcDbBlockTableIterator* pTableIter;
- for( pTable->newIterator(pTableIter); !pTableIter->done(); pTableIter->step())
- {
- AcDbBlockTableRecord* pRecord;
- pTableIter->getRecord(pRecord,AcDb::kForRead);
- if(pRecord == NULL)
- {
- acutPrintf(_T("\nНе открывается BTR"));
- continue;
- }
- AcDbBlockTableRecordIterator* pRecordIter;
- for (pRecord->newIterator(pRecordIter); !pRecordIter->done(); pRecordIter->step())
- {
- AcDbEntity*pEnt;
- pRecordIter->getEntity(pEnt, AcDb::kForRead);
- if(pEnt != NULL )
- {
- if( pEnt->isKindOf(AcDbProxyEntity::desc()))
- {
- proxies.append(pEnt->objectId() );
- }
- pEnt->close();
- }
- }
- delete pRecordIter;
- pRecord->close();
- }
- delete pTableIter;
- if( Acad::eOk != pTable->upgradeOpen())
- {
- acutPrintf(_T("\nНе могу открыть таблицу для записи"));
- pTable->close();
- return;
- }
- int nProxies = proxies.length();
- for( int i=0;i<nProxies; i++ )
- {
- AcDbProxyEntity* pProxy;
- AcDbObject* pObj;
- acdbOpenAcDbObject(pObj, proxies[i], AcDb::kForRead);
- pProxy = AcDbProxyEntity::cast(pObj);
- if( NULL == pProxy )
- {
- pObj->close () ;
- continue;
- }
- AcDbVoidPtrArray explodedEnts;
- pProxy->explode(explodedEnts);
- int nExplodedEnts = explodedEnts.length();
- if( nExplodedEnts > 0 )
- {
- AcDbBlockTableRecord*pRecord = new AcDbBlockTableRecord();
- pRecord->setName(_T("*B"));
- AcDbObjectId blockId;
- pTable->add(blockId, pRecord );
- for( int j=0; j<nExplodedEnts; j++)
- {
- AcDbEntity*pEnt =(AcDbEntity*)(explodedEnts[j]);
- pRecord->appendAcDbEntity(pEnt);
- pEnt->setColorIndex(0);
- pEnt->close();
- }
- pRecord->close();
- AcDbBlockTableRecord* pOwningRecord;
- acdbOpenObject(pOwningRecord, pProxy->ownerId(), AcDb::kForWrite);
- if( NULL != pOwningRecord)
- {
- AcDbBlockReference* pRef = new AcDbBlockReference;
- pRef->setBlockTableRecord(blockId);
- pOwningRecord->close();
- pProxy->upgradeOpen();
- pProxy->handOverTo(pRef);
- pRef->setColor(pProxy->color());
- pRef->setLayer(pProxy->layerId());
- pRef->setVisibility(pProxy->visibility());
- delete pProxy;
- pRef->close();
- }
- }
- else
- {
- pProxy->close();
- }
- }
- pTable->close();
- }
Примечание переводчика: этот код обрабатывает только прокси-примитивы, но не прокси-объекты.
Обсуждение: http://adn-cis.org/forum/index.php?topic=404
Опубликовано 18.12.2013