Тема: Изменение цвета примитивов

Всем доброго времени суток! Написал процедуру по изменению цвета примитивов в блоке, но чет не совсем понимаю, с одними чертежами работает на ура, а снекоторыми не совсем. Вот с которыми не совсем, просто стопориться в блоке и не даёт удалить слой на котором находиться блок, но работу продолжает.
Использовал интеллектуальные указатели подскажите че не так, буду очень благодарен. Вот код:

void changeBlockColor()
{
AcAxDocLock lock(acdbHostApplicationServices()->workingDatabase(), AcAxDocLock::kNormal);
if ((lock.lockStatus() != Acad::eOk) | (lock.lockStatus() != Acad::eNoDatabase))
{
AcDbBlockTable *pBlkTbl;
acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlkTbl, AcDb::kForRead);

AcDbBlockTableIterator *itr;
if (pBlkTbl->newIterator(itr) == Acad::eOk)
{
for (itr->start(); !itr->done(); itr->step())
{
AcDbBlockTableRecord *pRecord;
if (itr->getRecord(pRecord, AcDb::kForRead) == Acad::eOk) 
{
char *pName;
pRecord->getName(pName);
AcDbBlockTableRecordIterator * pIter;
pRecord->newIterator(pIter);
for (pIter->start(); !pIter->done(); pIter->step()) 
{
AcDbObjectId pObj;
pIter->getEntityId(pObj);
ads_name  ent;
acdbGetObjectId(pObj, ent);
AcDbObjectPointer<AcDbEntity> pEntity(pObj, AcDb::kForWrite);
if (pEntity.openStatus() == Acad::eOk) 
{
if (checkEntity(pEntity->layer()) == true)
{        
if (pEntity->isKindOf(AcDbLine::desc()))
{
if (pEntity->layer() == CString("0"))
{
int colorIndex = pEntity->colorIndex();    
AcCmColor color = pEntity->color();
if (color.isByLayer())
{
AcCmColor col;
col.setColorMethod(AcCmEntityColor::kByBlock);
pEntity->setColor(col);
}
}
}
else
if (pEntity->isKindOf(AcDbPolyline::desc()))
{
if (pEntity->layer() == CString("0"))
{
int colorIndex = pEntity->colorIndex();    
AcCmColor color = pEntity->color();
if (color.isByLayer())
{
AcCmColor col;
col.setColorMethod(AcCmEntityColor::kByBlock);
pEntity->setColor(col);
}
}
}
else
pEntity->setColor(getLayerColor(CString(pEntity->layer())));
}
}    
}
delete pIter;
pRecord->close();    
} 
}
}
delete itr;
pBlkTbl->close();
}
} 

Re: Изменение цвета примитивов

Для начала непонятно чего ты добивался этим:

if ((lock.lockStatus() != Acad::eOk) | (lock.lockStatus() != Acad::eNoDatabase)) 
{
 ...
}

И что это такое:

AcDbObjectId pObj;
pIter->getEntityId(pObj);
// Следующие две строки не нужны!!!
ads_name  ent;
acdbGetObjectId(pObj, ent); // Ты получаешь pObj из неинициализированной ent
AcDbObjectPointer<AcDbEntity> pEntity(pObj, AcDb::kForWrite); 

:?:

Re: Изменение цвета примитивов

Да точно косяк. Странно, но проблема осталась.

Re: Изменение цвета примитивов

Косяк нашел, Лександр спасибо за подсказки.

Re: Изменение цвета примитивов

Здравствуйте. А вот если есть у нас есть примитив, и хочется получить его цвет в формате RGB. Хорошо если  Color->isByColor(), то тогда можно просто у Color взять соответственные значения. А если isByLayer. То надо в базе искать layer по строке которая у нас есть в Entity->Layer(), либо по Entity->layerId(). Как это сделать? Ну и тот же вопрос и про isByBlock.

(изменено: Александр Ривилис, 24 сентября 2013г. 22:29:43)

Re: Изменение цвета примитивов

AcDbLayerTableRecordProinter pLayer(Entity->layerId(),AcDb::kForRead);
if (pLayer.openStatus() == Acad::eOk) {
  AcCmColor color = pLayer->color(); // Получаешь цвет слоя
}