Тема: Как узнать сколько слоёв в .dwg?

Задача следующая, нужно перебрать все слои в .dwg. Если я правильно понимаю acdbHostApplicationServices()->workingDatabase()->getLayerTable(pTable, AcDb::kForRead)
в pTable теперь сидят указатели на слои. А как узнать их названия или количество.
P.S. Я ламер в этом деле не смейтесь слишком громко.

Re: Как узнать сколько слоёв в .dwg?

void iterateLayers()
{
    Acad::ErrorStatus es;
    AcDbLayerTable *pTbl;
    int nLayers = 0;
    es = acdbHostApplicationServices()->workingDatabase()->getLayerTable(pTbl, AcDb::kForRead);
    if (es != Acad::eOk || !pTbl) {
      acutPrintf("\nОшибка открытия таблицы слоев!");
      return;
    }
    AcDbLayerTableIterator *pIterator;
    es = pTbl->newIterator(pIterator);
    if (es != Acad::eOk || !pIterator) {
      acutPrintf("\nОшибка создания итератора таблицы слоев!");
      pTbl->close();
      return;
    }
    pTbl->close();
    AcDbLayerTableRecord *pRcd;
    for(; !pIterator->done(); pIterator->step()) {
      nLayers++;
      char *pName = NULL;
      if (Acad::eOk == pIterator->getRecord(pRcd, AcDb::kForWrite) && pRcd) {
        if (Acad::eOk == pRcd->getName(pName) && pName) {
          acutPrintf("\nСлой: <%s>", pName);
          free(pName);
        }
      }
    }
    delete pIterator;
    acutPrintf("\nВсего слоев: <%d>", nLayers);
}

Re: Как узнать сколько слоёв в .dwg?

Всем спасибо, разобрался. Криво написанный for =)

Re: Как узнать сколько слоёв в .dwg?

> dimsan
У меня? И чем он тебе не понравился?

Re: Как узнать сколько слоёв в .dwg?

> Александр Ривилис
Нет это у нас был криво написанный for :)
А когда пробовал наоборот, так из-за чего-то автокад вылетал когда я пытался полусить описание слоя. Пока обхожусь без него

Re: Как узнать сколько слоёв в .dwg?

> Pharaon
Кстати, у меня в коде:

if (Acad::eOk == pIterator->getRecord(pRcd, AcDb::kForWrite) && pRcd) {

В данном случае это не правильно. Я брал из примера, который модифицирует имена слоев. Лучше использовать:

if (Acad::eOk == pIterator->getRecord(pRcd, AcDb::kForRead) && pRcd) {

Re: Как узнать сколько слоёв в .dwg?

И еще pRcd->close(); в конце цикла забыл вставить - вот что значит быстро переделывать свой пример для чужих нужд. smile

if (Acad::eOk == pIterator->getRecord(pRcd, AcDb::kForRead) && pRcd) {
   if (Acad::eOk == pRcd->getName(pName) && pName) {
     acutPrintf("\nСлой: <%s>", pName);
     free(pName);
   }
   pRcd->close();
}

Re: Как узнать сколько слоёв в .dwg?

> Александр Ривилис
Поэтому лучше использовать интелектуальные указатели smile

Re: Как узнать сколько слоёв в .dwg?

> archimag
Согласен. Меня оправдывает только то, что этот пример был взят из программы, которая работала во всех версиях AutoCAD начиная с R14, где интеллектуальных указателей еще не было...