明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1423|回复: 3

SOS!各位大侠救救小弟,

[复制链接]
发表于 2003-5-31 15:34 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2003-5-31 15:34:30 编辑

下面是把选中的实体从数据库中删除,但不成功,该如何实现,望各位大虾指点迷津,以解燃眉之急
        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;
        }
发表于 2003-5-31 22:15 | 显示全部楼层

正确用法如下

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);
 楼主| 发表于 2003-6-2 20:15 | 显示全部楼层

多谢whyangdong大侠,需要进一步指点 您提供的例子我能实现删除实体,但有一些问题

多谢whyangdong大侠 您提供的例子我能实现删除实体,但有一些问题
我把原程序拿来,请大侠分析出错误的原因是什么
autoCAD报错是在第二次调用删除命令时和退出autoCAD时报错
/* ArxMain.cpp - Interface file of ObjectARX */

#include "MyEntity.h"
#include <aced.h>
#include <rxregsvc.h>
#include <dbapserv.h>                // for acdbHostApplicationServices macro
#include <dbsymtb.h>                // for AcDbBlockTable class
#include <geassign.h>                // for asDblArray
#include <adslib.h>
#include <gelnsg3d.h>
#include <dbents.h>
#include <acdocman.h>
#include <string.h>                        // 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;
}
发表于 2003-6-4 09:49 | 显示全部楼层

你两次获得块表指针是错误的

在执行删除命令前,你又一次打开当前模型空间块表指针而且没有关闭块表指针,这一步是多余的,去掉即可
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-17 16:15 , Processed in 0.252085 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表