Тема: Удаление Entity из базы

Я воспользовался для создания линий следуйщим примеров взятым из arxdoc
Как теперь удалить эту линию?

AcDbObjectId
createLine()
{
    AcGePoint3d startPt(4.0, 2.0, 0.0);
    AcGePoint3d endPt(10.0, 7.0, 0.0);
    AcDbLine *pLine = new AcDbLine(startPt, endPt);
    AcDbBlockTable *pBlockTable;
    acdbHostApplicationServices()->workingDatabase()
        ->getSymbolTable(pBlockTable, AcDb::kForRead);
    AcDbBlockTableRecord *pBlockTableRecord;
    pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,
        AcDb::kForWrite);
    pBlockTable->close();
    AcDbObjectId lineId;
    pBlockTableRecord->appendAcDbEntity(lineId, pLine);
    pBlockTableRecord->close();
    pLine->close();
    return lineId;
}

Заранее благодарен...

Re: Удаление Entity из базы

  Acad::ErrorStatus DeleteEntity(AcDbObjectId objId)
  {
    Acad::ErrorStatus es = Acad::eOk;
    AcDbObjectPointer<AcDbObject> pObj(objId,AcDb::kForWrite);
    if ((es = pObj.openStatus()) == Acad::eOk) {
      return pObj->erase();
    }
    return es;
  }

В функцию DeleteEntity нужно передать AcDbObjectId, котрый возвращает createLine

Re: Удаление Entity из базы

Рекомендую использовать следующий метод: просто с erase() могут возникнуть траблы о которых я писал ранее, ломает повторять - поищи поиском acdbEntDel и erase по форуму.
Acad::ErrorStatus delEntity(AcDbObjectId id, AcDbDataBase* pDb)
{
    AcAxDocLock LockDoc(pDb);
    ads_name adsEnt;
    Acad::ErrorStatus es = acdbGetAdsName(adsEnt, id);
    if ( es != Acad::eOk )
        return Acad::eNo;
    if ( acdbEntDel(adsEnt) == RTNORM )
        retrun Acad::eOk;
    return Acad::eNo;
}

Re: Удаление Entity из базы

Спасибо... Пока для демо преподам пойдет и первый вариант. Траблы нашел - очень забавно получается.
Всем еще раз спасибо (особенно за оперативность).

Re: Удаление Entity из базы

Помогите please
1. Что нужно передать в DeleteEntity()в данном случае;
Acad::ErrorStatus DeleteEntity(AcDbObjectId objId)
    {
     Acad::ErrorStatus es = Acad::eOk;
     AcDbObjectPointer<AcDbObject>
     pObj(objId,AcDb::kForWrite);
     if ((es = pObj.openStatus()) == Acad::eOk)
        {
         return pObj->erase();
        }
     return es;
  }
// This is command 'PROGA'
void Proga()
{
AcDbObjectId
createLine();
{
    AcGePoint3d startPt(4.0, 2.0, 0.0);
    AcGePoint3d endPt(10.0, 7.0, 0.0);
    AcDbLine *pLine = new AcDbLine(startPt, endPt);
    AcDbBlockTable *pBlockTable;
    acdbHostApplicationServices()->workingDatabase()
        ->getSymbolTable(pBlockTable, AcDb::kForRead);
    AcDbBlockTableRecord *pBlockTableRecord;
    pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,
        AcDb::kForWrite);
    pBlockTable->close();
    AcDbObjectId lineId;
    pBlockTableRecord->appendAcDbEntity(lineId, pLine);
    pBlockTableRecord->close();
    pLine->close();
}
    int iParameterUnrolling;
    if(acedGetInt("\nУкажите параметр  (1-отменить): ",&iParameterUnrolling)!=RTNORM)
        return;
       
        if (iParameterUnrolling==1)
   
        {
            DeleteEntity(...);
        }
   
}

Re: Удаление Entity из базы

> TOD
Как видно из описания этой функции необходимо ей передать параметр типа AcDbObjectId
А что это за вложеная функции createLine?

Re: Удаление Entity из базы

Я разобрался с тем, что нужно передовать ф-ции, но почему-то ничего не произошло, моя линия не удалилась
void Proga()
{
    AcDbObjectId my_line;
{
    AcGePoint3d startPt(4.0, 2.0, 0.0);
    AcGePoint3d endPt(10.0, 7.0, 0.0);
    AcDbLine *pLine = new AcDbLine(startPt, endPt);
    AcDbBlockTable *pBlockTable;
    acdbHostApplicationServices()->workingDatabase()
        ->getSymbolTable(pBlockTable, AcDb::kForRead);
    AcDbBlockTableRecord *pBlockTableRecord;
    pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,
        AcDb::kForWrite);
    pBlockTable->close();
    AcDbObjectId lineId;
    pBlockTableRecord->appendAcDbEntity(lineId, pLine);
    pBlockTableRecord->close();
    pLine->close();
}
    int iParameterUnrolling;
    if(acedGetInt("\nУкажите параметр  (1-отменить): ",&iParameterUnrolling)!=RTNORM)
        return;
       
        if (iParameterUnrolling==1)
   
        {
            DeleteEntity(my_line);
        }
}

Re: Удаление Entity из базы

> TOD
У меня такое впечатление что идет разговор слепого с глухим. Есть две функции (описаны выше), так пользуйся ими. В твоем конкретном примере надо где-то так:

void Proga()
{
  AcDbObjectId my_line;
  //{ <-  это еще зачем???
  AcGePoint3d startPt(4.0, 2.0, 0.0);
  AcGePoint3d endPt(10.0, 7.0, 0.0);
  AcDbLine *pLine = new AcDbLine(startPt, endPt);
  AcDbBlockTable *pBlockTable;
  acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable, AcDb::kForRead);
  AcDbBlockTableRecord *pBlockTableRecord;
  pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
  pBlockTable->close();
  //AcDbObjectId lineId; // <- эта фигня тоже не нужна
  pBlockTableRecord->appendAcDbEntity([b]my_line[/b], pLine);
  pBlockTableRecord->close();
  pLine->close();
  //} <- смотри выше
  int iParameterUnrolling;
  if(acedGetInt("\nУкажите параметр (1-отменить): ",&iParameterUnrolling)!=RTNORM) return;
  if (iParameterUnrolling==1)
  {
    DeleteEntity(my_line);
  }
}

вот, но правильне было бы так:

void Proga()
{
  AcDbObjectId my_line;
  my_line = createLine();
  int iParameterUnrolling;
  if(acedGetInt("\nУкажите параметр (1-отменить): ",&iParameterUnrolling)!=RTNORM) return;
  if (iParameterUnrolling==1)
  {
    DeleteEntity(my_line);
  }
}

Re: Удаление Entity из базы

Уже разобрался сам, что было не так, но все равно спасибо

Re: Удаление Entity из базы

Возник новый вопрос, а как удалить полилинию?

Re: Удаление Entity из базы

а разницы нет.
передаешь id и ни о чем е думаешь

Re: Удаление Entity из базы

Я попробовал удалить прямоугольник, созданный полилинией,по аналогии с удалением отрезка но пока что-то не выходит
        AcDbObjectId my_Polyline;
        AcDb2dPolyline *pRectLine = new AcDb2dPolyline();
        pRectLine->setColorIndex(5);
        pVertex=new AcDb2dVertex(AcGePoint3d(0,250,0),0,0,0,0);
        pRectLine->appendVertex(pVertex);
        pVertex=new AcDb2dVertex(AcGePoint3d(2000,250,0),0,0,0,0);
        pRectLine->appendVertex(pVertex);
        pVertex=new AcDb2dVertex(AcDb2dVertex(AcGePoint3d(2000,250-1300,0),0,0,0,0));
        pRectLine->appendVertex(pVertex);
        pVertex=new AcDb2dVertex(AcDb2dVertex(AcGePoint3d(0,250-1300,0),0,0,0,0));
        pRectLine->appendVertex(pVertex);
        pRectLine->makeClosed();
        addEntityToDb(pObmRectLine);
          AcDbBlockTable *pBlockTable;
          acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable, AcDb::kForRead);
          AcDbBlockTableRecord *pBlockTableRecord;
          pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
          pBlockTable->close();
          pBlockTableRecord->appendAcDbEntity(my_Polyline, pRectLine);
          pBlockTableRecord->close();
        pRectLine->close();
        }
...
...
...
DeleteEntity(my_Polyline);

Re: Удаление Entity из базы

> TOD
Анализируй коды возврата функций и будешь знать в чем проблема.

Re: Удаление Entity из базы

addEntityToDb(pObmRectLine); - это что такое?
Ты ведь добавляешь узлы в pRectLine
Здается мне что код приведен ОЧЕНЬ фрагментарно.
Поэтому разобраться с тем что есть проблематично

Re: Удаление Entity из базы

Я по существу ничего не поменял, просто вместо отрезка - прямоугольник. Вместо pObmRectLine - pRectLine. Но это не влияет. У меня в коде это место правильно, а прямоугольник не удаляется.
Внизу пропущено
int iParameterUnrolling;
if(acedGetInt("\nУкажите параметр (1-отменить): ",&iParameterUnrolling)!=RTNORM)
return;
if (iParameterUnrolling==1)
{
DeleteEntity(my_Polyline);
}
}

Re: Удаление Entity из базы

> TOD
Еще раз повторяю - что возвращает DeleteEntity()?

Re: Удаление Entity из базы

Вчера вечером, чтобы проверить как все работает сделал простенький проект, прога рисует отрезок, прямоугольник и круг и пореакции пользователь удаляет какой либо из этих эл-тов. Так вот с отрезком и кругом проблем при удалении не возникает, а с прямоугольником продолжаю мучаться.
Acad::ErrorStatus DeleteEntity(AcDbObjectId objId)
    {
     Acad::ErrorStatus es = Acad::eOk;
     AcDbObjectPointer<AcDbObject>
     pObj(objId,AcDb::kForWrite);
     if ((es = pObj.openStatus()) == Acad::eOk)
        {
         return pObj->erase();
        }
     return es;
  }
AcDb2dVertex *pVertex; //Объявляем указатель на вершину
void Proga()
{
        //Рисуем отрезок
    AcDbObjectId my_line;
  AcGePoint3d startPt(500, 50, 0.0);
  AcGePoint3d endPt(1000, 100, 0.0);
  AcDbLine *pLine = new AcDbLine(startPt, endPt);
  AcDbBlockTable *pBlockTable;
  acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable, AcDb::kForRead);
  AcDbBlockTableRecord *pBlockTableRecord;
  pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
  pBlockTable->close();
  pBlockTableRecord->appendAcDbEntity(my_line, pLine);
  pBlockTableRecord->close();
  pLine->close();
/////////////////////////////////////////////////////////////////////////////////
           
            //Рисуем прямоугольник
        AcDbObjectId my_Polyline;
       
        {   
        AcDb2dPolyline *pRectLine = new AcDb2dPolyline();//Объявляем полилинию для обмотки
        pRectLine->setColorIndex(5);
        pVertex=new AcDb2dVertex(AcGePoint3d(0,250,0),0,0,0,0);//Cоздаем 4 вершины и добавляем их к полилинии
        pRectLine->appendVertex(pVertex);
        pVertex=new AcDb2dVertex(AcGePoint3d(2000,250,0),0,0,0,0);
        pRectLine->appendVertex(pVertex);
        pVertex=new AcDb2dVertex(AcDb2dVertex(AcGePoint3d(2000,250-1300,0),0,0,0,0));
        pRectLine->appendVertex(pVertex);
        pVertex=new AcDb2dVertex(AcDb2dVertex(AcGePoint3d(0,250-1300,0),0,0,0,0));
        pRectLine->appendVertex(pVertex);
        pRectLine->makeClosed();//делаем полилинию замкнутой
        addEntityToDb(pRectLine);//добавляем полилинию в базу данных
          AcDbBlockTable *pBlockTable;
          acdbHostApplicationServices()->workingDatabase()
              ->getSymbolTable(pBlockTable, AcDb::kForRead);
          AcDbBlockTableRecord *pBlockTableRecord;
          pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
          pBlockTable->close();
          pBlockTableRecord->appendAcDbEntity(my_Polyline, pRectLine);
          pBlockTableRecord->close();
          pRectLine->close(); //закрываем полилинию
        }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////           
                                //Рисуем круг
        AcDbObjectId my_Circle;
               
        {
            AcGePoint3d center(0,0, 0.0);
            AcGeVector3d normal(0.0, 0.0, 1.0);
            AcDbCircle *pCirc = new AcDbCircle(center, normal, 200);
            AcDbBlockTable *pBlockTable;
            pCirc->setColorIndex(3);
            acdbHostApplicationServices()->workingDatabase()
                ->getSymbolTable(pBlockTable, AcDb::kForRead);
            AcDbBlockTableRecord *pBlockTableRecord;
            pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,
                AcDb::kForWrite);
            pBlockTable->close();
            pBlockTableRecord->appendAcDbEntity(my_Circle, pCirc);
            pBlockTableRecord->close();
            pCirc->close();
       
        }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////       
    int iParameterUnrolling;
    if(acedGetInt("\nУкажите параметр  (1-удалить отрезок; 2-удалить прямоугольник; 3-удалить круг): ",&iParameterUnrolling)!=RTNORM)
        return;
       
        if (iParameterUnrolling==1)
   
        {
            DeleteEntity(my_line);
        }
   
        if (iParameterUnrolling==2)
   
        {
            DeleteEntity(my_Polyline);
        }
        if (iParameterUnrolling==3)
   
        {
            DeleteEntity(my_Circle);
        }
}
Подскажите, что же не так.

Re: Удаление Entity из базы

На первый взгляд проблема в

addEntityToDb(pRectLine); //<- первая запись в базу
///////////////////////
// вторая запись в базу
// | | |
// v v v
AcDbBlockTable *pBlockTable;
acdbHostApplicationServices()->workingDatabase()
->getSymbolTable(pBlockTable, AcDb::kForRead);
AcDbBlockTableRecord *pBlockTableRecord;
pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
pBlockTable->close();
pBlockTableRecord->appendAcDbEntity(my_Polyline, pRectLine);
pBlockTableRecord->close();
pRectLine->close(); //закрываем полилинию
///////////////

ты пишешь в базу полилинию два раза.
addEntityToDb(pRectLine) - разве не возвращает objectid?
если возвращает, то

my_Polyline = addEntityToDb(pRectLine);

а все остальное выкинь, если не возвращает, то выкинь addentitytodb :)

Re: Удаление Entity из базы

Большое спасибо, ошибка была именно в этом