Тема: Замена шрифта в текстовом стиле

Написал функцию, которая меняет шрифт во всех текстовых стилях чертежа на заданный.
Если использую ее для установки shx-шрифта, то он успешно применяется, но при последующей загрузке чертежа выдается сообщение в командную строку - "txt.shx - файл обычного шрифта, а не файл форм."
и выдается диалог выбора компилированной формы shx.
При установке этого же шрифта через настройку стилей такой проблемы не возникает.
Что я упускаю?

// вызов - ReplaceAllFonts(_T("txt.shx"));

BOOL ReplaceAllFonts( CString sFont, AcDbDatabase* pDb/*=0*/)
{
    if(!pDb) pDb = acdbHostApplicationServices()->workingDatabase();
    if(!pDb) 
    {
        acutPrintf( _T("Ошибка доступа к базе данных чертежа"));
        return FALSE;
    }
    // перебираем стили
    Acad::ErrorStatus es;
    AcDbTextStyleTable* pTsTable=0;
    es = pDb->getTextStyleTable(pTsTable, AcDb::kForRead);
    if (es != Acad::eOk) 
    {
        acutPrintf( _T("Ошибка доступа к таблице текстовых стилей чертежа %s"), pDb->originalFileName());
        return FALSE;
    }
    AcDbTextStyleTableIterator *pTsIter;
    es = pTsTable->newIterator(pTsIter);
    if (es != Acad::eOk) 
    {
        pTsTable->close();
        acutPrintf( _T("Ошибка создания итератора к таблице текстовых стилей чертежа %s"), pDb->originalFileName());
        return FALSE;
    }
    AcDbTextStyleTableRecord *pTsRecord;
    for (; !pTsIter->done(); pTsIter->step()) 
    {
        es = pTsIter->getRecord(pTsRecord,    AcDb::kForWrite);
        if (es != Acad::eOk) 
        {
            delete pTsIter;
            pTsTable->close();
            acutPrintf( _T("Ошибка доступа к текстовому стилю чертежа %s"), pDb->originalFileName());
            return FALSE;
        }
        AcString styleName;
        pTsRecord->getName(styleName);
        if( 0 == sFont.Right(4).CompareNoCase(_T(".shx")))
        {
            es = pTsRecord->setFileName(sFont.LockBuffer());
            sFont.UnlockBuffer();
        }
        else
        {
            TCHAR* pTypeFace;
            Adesk::Boolean bold,italic;
            int charset, pitch;
            es = pTsRecord->font( pTypeFace, bold, italic, charset, pitch);
            es = pTsRecord->setFont(sFont.LockBuffer(),  bold, italic, charset, pitch);
            sFont.UnlockBuffer();
            delete pTypeFace;
        }
        if (es != Acad::eOk) 
        {
            delete pTsIter;
            pTsRecord->close();
            pTsTable->close();
            acutPrintf _T("Ошибка установки шрифта для стиля '%s' чертежа %s"), styleName.kwszPtr(), pDb->originalFileName());
            return FALSE;
        }
        pTsRecord->close();
    }
    delete pTsIter;
    pTsTable->close();
    return TRUE;
}

Re: Замена шрифта в текстовом стиле

Перед AcString styleName; вставь:

// Файл форм не трогаем.
if (pTsRecord->isShapeFile()) {
  pTsRecord->close(); 
  continue; 
}

Re: Замена шрифта в текстовом стиле

Спасибо!

Попутно мне для общего понимания не подскажете одну вещь?

Обрабатываю несколько файлов (выжимка из кода):

// имена файлов до и после обработки - ACHAR* fn, ACHAR* fnNew
// шрифт - CString font
{
 AcDbDatabase* pDb = new AcDbDatabase;
 ErrorStatus es = pDb->readDwgFile(fn);
 // проверка es ... 
 if(ReplaceAllFonts(font,pDb))
 {
    es = pDb->saveAs(fnNew);
    // проверка es ... 
 }
 delete pDb;
 pDb = 0;
}

При последующем открытии полученных файлов Автокад требует выполнить команду ВОССТАН.
Дело в использовании readDwgFile и его механизма ленивой загрузки? Проблемы нет, если каждый файл открывать (acedSyncFileOpen(fn), у меня SDI).

Re: Замена шрифта в текстовом стиле

Подозреваю, что проблема в строке:

AcDbDatabase* pDb = new AcDbDatabase; 

Возможно нужно заменить на:

AcDbDatabase* pDb = new AcDbDatabase(false,true); 

(изменено: Muxa, 30 января 2013г. 14:20:21)

Re: Замена шрифта в текстовом стиле

Да, похоже на то. По крайней мере после такой правки выборочная проверка вашу правоту подтверждает.

Еще раз - спасибо большое!