Тема: Как удалить Xrecord?

Добрый день!
Подскажите как правильно удалить Xrecord ? допустим если он создан как в примере :

createXrecord()
{
    AcDbDictionary *pNamedobj, *pDict;
    acdbHostApplicationServices()->workingDatabase()
        ->getNamedObjectsDictionary(pNamedobj, AcDb::kForWrite);

    if (pNamedobj->getAt("ASDK_DICT", (AcDbObject*&) pDict,
        AcDb::kForWrite) == Acad::eKeyNotFound)
    {
        pDict = new AcDbDictionary;
        AcDbObjectId DictId;
        pNamedobj->setAt("ASDK_DICT", pDict, DictId);
    }
    pNamedobj->close();

    // Add a new xrecord to the ASDK_DICT dictionary.
    //
    AcDbXrecord *pXrec = new AcDbXrecord;
    AcDbObjectId xrecObjId;
    pDict->setAt("XREC1", pXrec, xrecObjId);
    pDict->close();
}

Re: Как удалить Xrecord?

Поиском пользоваться не пробовал? https://www.caduser.ru/forum/topic29058.html

Re: Как удалить Xrecord?

Александр, а в данном примере где объект верхнего уровня ? pNamedobj->remove() ведь удаляет только  из AcDbDictionary.

(изменено: Александр Ривилис, 27 января 2011г. 17:56:48)

Re: Как удалить Xrecord?

Хорошо. Вот тебе пример, как удалить Xrecord из приведенного тобой примера:

void eraseXrecord()
{
  Acad::ErrorStatus es;
  AcDbDictionaryPointer pNamedobj(acdbCurDwg()->namedObjectsDictionaryId(), AcDb::kForRead);
  if ((es = pNamedobj.openStatus()) != Acad::eOk) {
    acutPrintf(_T("\nError open namedObjectsDictionary: %s"),acadErrorStatusText(es));
    return;
  }
  AcDbObjectId idDict;
  if ((es = pNamedobj->getAt(_T("ASDK_DICT"), idDict)) != Acad::eOk) {
    acutPrintf(_T("\nError pNamedobj->getAt(): %s"),acadErrorStatusText(es));
    return;
  }
  AcDbDictionaryPointer pDict(idDict, AcDb::kForWrite);
  if ((es = pDict.openStatus()) != Acad::eOk) {
    acutPrintf(_T("\nError open Dict: %s"),acadErrorStatusText(es));
    return;
  }
  AcDbObjectId idXrec;
  if ((es = pDict->getAt(_T("XREC1"), idXrec)) != Acad::eOk) {
    acutPrintf(_T("\nError pDict->getAt(): %s"),acadErrorStatusText(es));
    return;
  }
  if ((es = pDict->remove(_T("XREC1"))) != Acad::eOk) {
    acutPrintf(_T("\nError pDict->remove(): %s"),acadErrorStatusText(es));
    return;
  }
  AcDbObjectPointer<AcDbXrecord> pXrec(idXrec,AcDb::kForWrite,true);
  if ((es = pXrec.openStatus()) != Acad::eOk) {
    acutPrintf(_T("\nError open Xrecord: %s"),acadErrorStatusText(es));
    return;
  }
  if (!pXrec->isErased()) {
    if ((es = pXrec->erase()) != Acad::eOk) {
      acutPrintf(_T("\nError pXrec->erase(): %s"),acadErrorStatusText(es));
      return;
    }
  }
  acutPrintf(_T("\nXrecord erased!"));
}

Re: Как удалить Xrecord?

Александр, спасибо большое!

Re: Как удалить Xrecord?

Александр, а что может быть причиной если pDict->remove(_T("XREC1")) возвращает код ошибки eWasOpenForWrite ? Значит ли это что объект в словаре по имени XREC1 не закрыт? И надо его закрыть в функции createXrecord? В eraseXrecord() соответственно pNamedobj->close(); pDict->close(); pXrec->close() расставлены.

Re: Как удалить Xrecord?

ash09 пишет:

Александр, а что может быть причиной если pDict->remove(_T("XREC1")) возвращает код ошибки eWasOpenForWrite ? Значит ли это что объект в словаре по имени XREC1 не закрыт?

Именно это и значит.

ash09 пишет:

И надо его закрыть в функции createXrecord?

Обязательно! Обрати внимание, что в createXrecord практически нет обработки ошибок.

ash09 пишет:

В eraseXrecord() соответственно pNamedobj->close(); pDict->close(); pXrec->close() расставлены.

Встречный вопрос. Ты используешь мой код или переписал его без интеллектуальных указателей? Если переписал, то зачем?

Re: Как удалить Xrecord?

Да, забыл что интеллектуальные указатели не требуют close()...

Re: Как удалить Xrecord?

Нечисто здесь что-то... :o все равно ошибка выскакивает... CreateXrecord проходит все нормально, никаких ошибок, getXrecord все прекрасно восстанавливает, а pDict->remove() не удаляет.....

Re: Как удалить Xrecord?

Выложи код всех трех функций. Иначе я пас.

(изменено: ash09, 27 января 2011г. 17:22:04)

Re: Как удалить Xrecord?

Пример из библиотеки samples\database\xrecord_dg

void createXrecord()
{
        Acad::ErrorStatus es;
    AcDbObjectId DictId, xrecObjId;
    AcDbDictionary *pDict;

    AcDbDictionaryPointer pNamedobj(acdbHostApplicationServices()->workingDatabase()->
        namedObjectsDictionaryId(), AcDb::kForWrite);

    if ((es = pNamedobj.openStatus()) != Acad::eOk) { 
        acutPrintf(_T("\nError open namedObjectsDictionary: %s"), acadErrorStatusText(es)); 
        return; 
    }    
       if ((es = pNamedobj->getAt(_T("ASDK_DICT"), DictId)) == Acad::eKeyNotFound)
    {                
        pDict = new AcDbDictionary;
        if ((es = pNamedobj->setAt(_T("ASDK_DICT"), pDict, DictId)) != Acad::eOk)
        {    acutPrintf(_T("\nError pNamedobj->setAt(): %s"), acadErrorStatusText(es)); 
            return; }
        }
    else if (es != Acad::eOk)  
    {    acutPrintf(_T("\nError pNamedobj->getAt(): %s"), acadErrorStatusText(es)); 
        return; }    
    AcDbXrecord *pXrec = new AcDbXrecord;
    
        if ((es = pDict->setAt(_T("XREC1"), pXrec, xrecObjId)) != Acad::eOk) { 
        acutPrintf(_T("\nError pDict->getAt(): %s"), acadErrorStatusText(es)); 
        return; 
    } 

    pDict->close();

    // Create a resbuf list to add to the xrecord.
    struct resbuf *pHead;
    ads_point testpt = {1.0, 2.0, 0.0};
    pHead = acutBuildList(AcDb::kDxfText,
        _T("This is a test Xrecord list"),
        AcDb::kDxfXCoord, testpt,
        AcDb::kDxfReal, 3.14159,
        AcDb::kDxfAngle, 3.14159,
        AcDb::kDxfColor, 1,
        AcDb::kDxfInt16, 180,
        0);

    pXrec->setFromRbChain(*pHead);

    acutRelRb(pHead);
    pXrec->close();
}
void getXrecord()
{
    Acad::ErrorStatus es;
        AcDbDictionaryPointer pNamedobj(acdbHostApplicationServices()->workingDatabase()
        ->namedObjectsDictionaryId(), AcDb::kForRead);
    if ((es = pNamedobj.openStatus()) != Acad::eOk) { 
        acutPrintf(_T("\nError open namedObjectsDictionary: %s"),acadErrorStatusText(es)); 
        return; 
    } 
    
    AcDbDictionary *pDict;
    if ((es = pNamedobj->getAt(_T("ASDK_DICT"), (AcDbObject*&)pDict,
        AcDb::kForRead)) != Acad::eOk)
    {    acutPrintf(_T("\nError pNamedobj->getAt(): %s"),acadErrorStatusText(es)); 
        pNamedobj->close();
        return; }
    
    AcDbXrecord *pXrec;
    if ((es = pDict->getAt(_T("XREC1"), (AcDbObject*&) pXrec, AcDb::kForRead)) != Acad::eOk)
    {    acutPrintf(_T("\nError pDict->getAt(): %s"), acadErrorStatusText(es)); 
        pDict->close();
        return; } 
    pDict->close();

    struct resbuf *pRbList;
    pXrec->rbChain(&pRbList);
    pXrec->close();

    printList(pRbList);
    acutRelRb(pRbList);
}

ну и eraseXrecord указанная выше...
специально проверял, eraseXrecord выдает eWasOpenForWrite....

(изменено: Александр Ривилис, 27 января 2011г. 17:58:27)

Re: Как удалить Xrecord?

Изменил код в #4. Так должно работать.

Re: Как удалить Xrecord?

Александр, спасибо, работает.