Тема: AcDmUtil

необходимо получить Id стрелки размерного стиля (например "_Dot") и при необходимости загрузить данный блок стрелки в чертеж для дальнейшего использования в размерном стиле... нашел, что это можно сделать с помошью AcDmUtil. но AcDmUtil::getArrowId(...) почемуто не срабатывает, а именно не подгружает стрелку и не возвращает Id. как быть? может есть какие то другие методы по работе со стрелками размерных стилей?

Re: AcDmUtil

добавлю...

AcDbObjectId dimblkid;
Acad::ErrorStatus es = AcDmUtil::getArrowId("_Dot", dimblkid);

es получается eWasOpenForRead, вместо eOk, dimblkid остается равным 0.

Re: AcDmUtil

> Serj!
Если это встроенное имя стрелки, то  блок должен создаться автоматически (согласно документации - не проверял), если же нет, то тогда блок уже должен быть в чертеже, т.е. его нужно или создать программно или  вставить из другого чертежа.

Re: AcDmUtil

> Serj!
А у тебя таблица блоков или запись таблицы блоков с именем "_Dot" не открыта для чтения в этот момент?

Re: AcDmUtil

> Александр Ривилис
DimStyleTable, SymbolTable и TextStyleTable открыты... это может мешать?

Re: AcDmUtil

> Александр Ривилис
спасибо ОГРОМНОЕ!!!:) стоило закрыть SymbolTable как все получилось:)

Re: AcDmUtil

> Serj!
:) Анализировать нужно коды возврата: eWasOpenForRead - явно говорит, что что-то открыто для чтения и соответственно не может быть открыто для записи.

Re: AcDmUtil

> Александр Ривилис
я просто сразу не понял что он имеет ввиду... толи открыл стрелку для чтения, толи что... в мануале то написано, что он возвращает либо eOk либо eInvalidKey:) сразу не допер, что ему для создания стрелки нужна blockTable на запись:) поэтому для меня eWasOpenForRead оказалось неожиданностью:)

Re: AcDmUtil

Продолжение...
есть код:

bool
cACADActions::DSsLoad(CString DSName)
{
    Acad::ErrorStatus es;
    AcDbDimStyleTable *pDimTable;
    AcDbTextStyleTable *pTS;
    AcDbDimStyleTableRecord *pDimTblRecord = NULL;
    acdbHostApplicationServices()->workingDatabase()->getDimStyleTable(pDimTable, AcDb::kForRead);
    if(!pDimTable->has(DSName))
    {
        pDimTable->close();
        pDimTblRecord = new AcDbDimStyleTableRecord;
        pDimTblRecord->setName(DSName);
        pDimTblRecord->setDimadec(...);
        pDimTblRecord->setDimalt(...);
        pDimTblRecord->setDimaltd(...);
        pDimTblRecord->setDimaltf(...);
        pDimTblRecord->setDimaltrnd(...);
        pDimTblRecord->setDimalttd(...);
        pDimTblRecord->setDimalttz(...);
        pDimTblRecord->setDimaltu(...);
        pDimTblRecord->setDimaltz(...);
        pDimTblRecord->setDimapost(...);
        pDimTblRecord->setDimasz(...);
        pDimTblRecord->setDimatfit(...);
        pDimTblRecord->setDimaunit(...);
        pDimTblRecord->setDimazin(...);
        //dimblk
        [b]AcDbObjectId dimblkid;
        es = AcDmUtil::getArrowId(..., dimblkid);
        if(es == Acad::eOk && dimblkid != 0)
        {
            pDimTblRecord->setDimblk(dimblkid);
        }
        //dimblk1
        AcDbObjectId dimblk1id;
        es = AcDmUtil::getArrowId(..., dimblk1id);
        if(es == Acad::eOk && dimblk1id != 0)
        {
            pDimTblRecord->setDimblk1(dimblk1id);
        }
        //dimblk2
        AcDbObjectId dimblk2id;
        es = AcDmUtil::getArrowId(..., dimblk2id);
        if(es == Acad::eOk && dimblk2id != 0)
        {
            pDimTblRecord->setDimblk2(dimblk2id);
        }[/b]
        pDimTblRecord->setDimcen(...);
        //dimclrd
        Adesk::UInt16 vald = ...;
        AcCmColor dimclrd;
        dimclrd.setColorIndex(vald);
        pDimTblRecord->setDimclrd(dimclrd);
        //dimclre
        Adesk::UInt16 vale = ...;
        AcCmColor dimclre;
        dimclre.setColorIndex(vale);
        pDimTblRecord->setDimclre(dimclre);
        //dimclrt
        Adesk::UInt16 valt = ...;
        AcCmColor dimclrt;
        dimclrt.setColorIndex(valt);
        pDimTblRecord->setDimclrt(dimclrt);
        pDimTblRecord->setDimdec(...);
        pDimTblRecord->setDimdle(...);
        pDimTblRecord->setDimdli(...);
        pDimTblRecord->setDimdsep(...);
        pDimTblRecord->setDimexe(...);
        pDimTblRecord->setDimexo(...);
        pDimTblRecord->setDimfrac(...);
        pDimTblRecord->setDimgap(...);
        pDimTblRecord->setDimjust(...);
        //dimldrblk
        [b]AcDbObjectId dimldrblk;
        es = AcDmUtil::getArrowId(..., dimldrblk);
        if(es == Acad::eOk && dimldrblk != 0)
        {
            pDimTblRecord->setDimldrblk(dimldrblk);
        }[/b]
        pDimTblRecord->setDimlfac(...);
        pDimTblRecord->setDimlim(...);
        pDimTblRecord->setDimlunit(...);
        pDimTblRecord->setDimlwd(...);
        pDimTblRecord->setDimlwe(...);
        pDimTblRecord->setDimpost(...);
        pDimTblRecord->setDimrnd(...);
        pDimTblRecord->setDimsah(...);
        pDimTblRecord->setDimscale(...);
        pDimTblRecord->setDimsd1(...);
        pDimTblRecord->setDimsd2(...);
        pDimTblRecord->setDimse1(...);
        pDimTblRecord->setDimse2(...);
        pDimTblRecord->setDimsoxd(...);
        pDimTblRecord->setDimtad(...);
        pDimTblRecord->setDimtdec(...);
        pDimTblRecord->setDimtfac(...);
        pDimTblRecord->setDimtih(...);
        pDimTblRecord->setDimtix(...);
        pDimTblRecord->setDimtm(...);
        pDimTblRecord->setDimtmove(...);
        pDimTblRecord->setDimtofl(...);
        pDimTblRecord->setDimtoh(...);
        pDimTblRecord->setDimtol(...);
        pDimTblRecord->setDimtolj(...);
        pDimTblRecord->setDimtp(...);
        pDimTblRecord->setDimtsz(...);
        pDimTblRecord->setDimtvp(...);
        //dimtxsty
        acdbHostApplicationServices()->workingDatabase()->getTextStyleTable(pTS, AcDb::kForRead);
        char *pBTRecName4 = ..;
        AcDbObjectId dimtxsty;
        es = pTS->getAt(pBTRecName4, dimtxsty);
        if(dimtxsty != 0)
        {
            es = pDimTblRecord->setDimtxsty(dimtxsty);
        }
        else
        {
            es = pTS->erase();
            es = pTS->close();
            TextStylesLoad();
            acdbHostApplicationServices()->workingDatabase()->getTextStyleTable(pTS, AcDb::kForRead);
            pTS->getAt(pBTRecName4, dimtxsty);
            if(dimtxsty != 0)
                pDimTblRecord->setDimtxsty(dimtxsty);
        }
        es = pTS->close();
        pDimTblRecord->setDimtxt(...);
        pDimTblRecord->setDimtzin(...);
        pDimTblRecord->setDimupt(...);
        pDimTblRecord->setDimzin(...);
        acdbHostApplicationServices()->workingDatabase()->getDimStyleTable(pDimTable, AcDb::kForWrite);
        pDimTable->add(pDimTblRecord);
        es = pDimTblRecord->close();
        es = pDimTable->close();
    }    
    return true;
}

точки означают некие int, double и char значения.
При однократном использовании (создание одного размерного стиля) все нормально срабатывает. При создании нескольких размерных стилей все создается, НО при последующей попытке просмотреть список размерных стилей AutoCAD вываливается с ошибкой, причем нашел список "шаманских" манипуляций для избежания ошибки (если после создания просмотреть список слоев и список стилей таблиц, то потом список размерных стилей открывается и можно просмотреть успешный результат создания нескольких размерных стилей). Также, если убрать код, который выделен жирным шрифтом, то несколько размерных стилей создается и без проблем просматривается. Такое чувство, что я чтото не закрыл, но что понять не могу... или может AcDmUtil::getArrowId не правильно работает, хотя все время возвращает eOk... подскажите кто что думает?

Re: AcDmUtil

1) Сравнение типа AcDbObjectId с 0 - не корректно. Поэтому:

char *pBTRecName4 = ..;
    AcDbObjectId dimtxsty;
    es = pTS->getAt(pBTRecName4, dimtxsty);
    if(dimtxsty != 0)
    {
      es = pDimTblRecord->setDimtxsty(dimtxsty);
    }

Должно быть:

    if(dimtxsty.isValid()) // или if(!dimtxsty.isNull())
    {
      es = pDimTblRecord->setDimtxsty(dimtxsty);
    }

Кроме того ты дважды закрываешь pTS. И нет кода TextStylesLoad() - возможно ошибка в нем.

Re: AcDmUtil

> Александр Ривилис
хмм... странно... после перезагрузки компьютера все работает стабильно, а до этого как то через раз было... зря я похоже вас беспокоил...
ЗЫ: сравнения изменил, спасибо за совет