buanhui 发表于 2003-5-31 15:34:00

SOS!各位大侠救救小弟,

下面是把选中的实体从数据库中删除,但不成功,该如何实现,望各位大虾指点迷津,以解燃眉之急
      rc = acedEntSel("\nSelect target layer entity. ", ent, ptpoint);
      switch(rc)
      {
                case RTERROR :
                        acutPrintf("\nNothing selected!! ");
                           break;
                      case RTCAN :
                        acutPrintf("\nUser canceled. ");
                           break;
                case RTNORM :
                        
                acdbGetObjectId(obId,ent);
                acdbOpenObject(myobj,obId, AcDb::kForRead);
                myobj->erase(Adesk::kTrue);//此处的用法是否有错误,劳指点?
                acedRedraw(ent,1);//此处的用法是否有错误,劳指点?
                break;
      }

whyangdong 发表于 2003-5-31 22:15:00

ads_name ent;
      ads_point ptpoint;
      int rc;
      AcDbObjectId obId;
      AcDbObject *myobj;
      AcApDocument* pDoc = acDocManager->curDocument();
    Acad::ErrorStatus es = acDocManager->lockDocument(pDoc);
    if (es != Acad::eOk)
      {
      acedAlert("Failed to lock the document!");
      return;
    }
      
rc=acedEntSel("\nSelect target layer entity. ", ent, ptpoint);
switch(rc)
{
case RTERROR :
acutPrintf("\nNothing selected!! ");
         break;
case RTCAN :
acutPrintf("\nUser canceled. ");
         break;
case RTNORM :
acdbGetObjectId(obId,ent);
acdbOpenObject(myobj,obId, AcDb::kForWrite);
myobj->erase(true);
myobj->close();
break;
}
acDocManager->unlockDocument(pDoc);

buanhui 发表于 2003-6-2 20:15:00

多谢whyangdong大侠 您提供的例子我能实现删除实体,但有一些问题
我把原程序拿来,请大侠分析出错误的原因是什么
autoCAD报错是在第二次调用删除命令时和退出autoCAD时报错
/* ArxMain.cpp - Interface file of ObjectARX */
#include "MyEntity.h"
#include
#include
#include               // for acdbHostApplicationServices macro
#include               // for AcDbBlockTable class
#include               // for asDblArray
#include
#include
#include
#include
#include                         // test
void createTriangle(void)
{
      AcGePoint3d leftPnt3d, rightPnt3d,leftdPnt, rightdPnt,ptmy,point0,point1;
      ads_point pt,ptpoint;
      ads_real wallWd,layerHd;
      ads_name ent;
          AcDbObjectId obId,obId1;
          AcGePoint3dArray points;
      int rc;
      AcDbVoidPtrArray xplode;
      AcGeLineSeg3d thisline,otherline;
      MyEntity* pTriangle;
      AcDbObject *myobj;
    AcApDocument* pDoc = acDocManager->curDocument();
    Acad::ErrorStatus es = acDocManager->lockDocument(pDoc);
    if (es != Acad::eOk)
      {
      acedAlert("Failed to lock the document!");
      return;
    }
      acdbHostApplicationServices()->workingDatabase()->setElevation(1000);
      if(acedGetPoint(NULL, "开始画墙...左点: ", pt) != RTNORM)
                return;
      leftPnt3d = asPnt3d(pt);
      if(acedGetPoint(pt, "\n右点: ", pt) != RTNORM)
                return;
      rightPnt3d = asPnt3d(pt);
      if(acedGetReal("\n墙的宽度: ", &wallWd) != RTNORM)
                return;
      if(acedGetReal("\n墙的高度: ", &layerHd) != RTNORM)
                return;
    pTriangle = new AcDbEquiTriangle();
      pTriangle->set(leftPnt3d, rightPnt3d,wallWd,layerHd);
    pTriangle->getdownPoints( leftdPnt, rightdPnt);
      
      // 将新建实体(pTriangle)添加到图形数据库中
      AcDbBlockTable *pBlockTable;
      acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable, AcDb::kForRead);
      AcDbBlockTableRecord *pBlockTableRecord;
      pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
      pBlockTable->close();
      AcDbObjectId objectId;
      pBlockTableRecord->appendAcDbEntity(objectId, (AcDbEquiTriangle *)pTriangle);
      pBlockTableRecord->close();
      pTriangle->close();
      acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable, AcDb::kForWrite);
    acutPrintf("\nSelect target layer entity. ");
    rc=acedEntSel("\nSelect target layer entity. ", ent, ptpoint);
    switch(rc)
      {
          case RTERROR :
            acutPrintf("\nNothing selected!! ");
            break;
          case RTCAN :
            acutPrintf("\nUser canceled. ");
            break;
          case RTNORM :
            acdbGetObjectId(obId,ent);
            acdbOpenObject(myobj,obId, AcDb::kForWrite);
            myobj->erase(true);
            myobj->close();
            break;
      }
acDocManager->unlockDocument(pDoc);
    return;
}

whyangdong 发表于 2003-6-4 09:49:00

在执行删除命令前,你又一次打开当前模型空间块表指针而且没有关闭块表指针,这一步是多余的,去掉即可
页: [1]
查看完整版本: SOS!各位大侠救救小弟,