明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2243|回复: 11

朋友们帮忙看看错在哪里

[复制链接]
发表于 2014-11-20 10:15:01 | 显示全部楼层 |阅读模式
下面是两段ARX定义并引用图块的代码,第一种方式成功了,但第二种未成功,请帮忙分析一下错误在哪,是语法错了、思路错了、理解错了?不多说了,贴代码:

第一种:(成功了)
BOOL TestDlg::testBlock1()
{
        Acad::ErrorStatus es;
        AcDbDatabase* pDatabase;
        AcDbDatabase *extDb;
        AcDbObjectId blockId0;
        AcDbObjectId blockId1;

        extDb = new AcDbDatabase;
        extDb->readDwgFile(_T("d:\\rsk_rect.dwg"));

        pDatabase = acdbHostApplicationServices()->workingDatabase();
        es = pDatabase->insert(blockId0,_T("testBlock1"),extDb,true);
        if(es != Acad::eOk){
                return false;
        }

        /*********以上为图块定义,以下为图块引用******************/

        AcDbBlockTableRecordPointer spBlkRec( _T("testBlock1"),pDatabase, AcDb::kForRead );
        if( spBlkRec.openStatus() == Acad::eOk )
        {
                blockId1 = spBlkRec->objectId();
                spBlkRec->close();
        }

        AcGePoint3d ptInsert(100,100,0);
        AcDbBlockReference *pBlkRef =new AcDbBlockReference() ;
        pBlkRef->setBlockTableRecord(blockId1);
        pBlkRef->setPosition(ptInsert);
        //McGeScale3d scale(dScale);//放大比例
        //pBlkRef->setScaleFactors(scale);
        //pBlkRef->setRotation(dRotation*PI/180) ;//旋转弧度,单位为弧度,不是角度(弧长=半径,弧度为1)

        AcDbBlockTable *pBlockTable;
        es = pDatabase->getBlockTable(pBlockTable,McDb::kForRead);
        if(es != Acad::eOk){
                AfxMessageBox(_T("获得块表失败"));
        }

        AcDbBlockTableRecord * pBTableRec1;
        es = pBlockTable->getAt(MCDB_MODEL_SPACE, pBTableRec1,McDb::kForWrite);
        if(es != Acad::eOk){
                AfxMessageBox(_T("获得块记录失败"));
        }

        AcDbObjectId newEntId;
        es = pBTableRec1->appendAcDbEntity(newEntId,pBlkRef);
        if(es != Acad::eOk){
                AfxMessageBox(_T("插入实体失败"));
        }

        pBTableRec1->close();
        pBlockTable->close();
        pBlkRef->close();
        return true;
}

第二种方式:(失败了)
BOOL TestDlg::testBlock2()
{
        Acad::ErrorStatus es;
        AcDbDatabase* pDatabase;
        AcDbObjectId blockId0;
        AcDbObjectId blockId1;
        AcDbBlockTable *pBlockTable;
        AcDbObjectId newEntId0;
        AcDbObjectId newEntId1;
        AcGePoint3d start0(0,0,0);
        AcGePoint3d end0(10,10,0);
        AcGePoint3d start1(0,0,0);
        AcGePoint3d end1(-10,10,0);
        AcDbLine *pLine=new AcDbLine(start0,end0);
        AcDbLine *pLine1=new AcDbLine(start1,end1);

        pDatabase = acdbHostApplicationServices()->workingDatabase();
        es = pDatabase->getBlockTable(pBlockTable,McDb::kForWrite);
        if(es != Acad::eOk){
                AfxMessageBox(_T("获得块表失败"));
        }

       //定义一个图块,包括2条直线
        AcDbObjectId id0;
        AcDbBlockTableRecord * pBTableRec1;
        pBTableRec1 = new AcDbBlockTableRecord();
        pBTableRec1->setName(_T("testBlock2"));
        pBTableRec1->appendAcDbEntity(newEntId0,pLine);
        pBTableRec1->appendAcDbEntity(newEntId1,pLine1);
        pBlockTable->add(id0,pBTableRec1);
        pBTableRec1->close();
        pBlockTable->close();


        /*********以上为图块定义,以下为图块引用******************/

        AcDbBlockTableRecordPointer spBlkRec( _T("testBlock2"),pDatabase, AcDb::kForRead );
        if( spBlkRec.openStatus() == Acad::eOk )
        {
                blockId1 = spBlkRec->objectId();
                spBlkRec->close();
        }

        AcGePoint3d ptInsert(100,100,0);
        AcDbBlockReference *pBlkRef =new AcDbBlockReference() ;
        pBlkRef->setBlockTableRecord(blockId1);
        pBlkRef->setPosition(ptInsert);
        AcGeScale3d scale(3);//放大比例
        pBlkRef->setScaleFactors(scale);
        //pBlkRef->setRotation(dRotation*PI/180) ;//旋转弧度,单位为弧度,不是角度(弧长=半径,弧度为1)

        es = pDatabase->getBlockTable(pBlockTable,McDb::kForRead);
        if(es != Acad::eOk){
                AfxMessageBox(_T("获得块表失败"));
        }

        es = pBlockTable->getAt(MCDB_MODEL_SPACE, pBTableRec1,McDb::kForWrite);
        if(es != Acad::eOk){
                AfxMessageBox(_T("获得块记录失败"));
        }

        AcDbObjectId newEntId;
        es = pBTableRec1->appendAcDbEntity(newEntId,pBlkRef);
        if(es != Acad::eOk){
                AfxMessageBox(_T("插入实体失败"));
        }

        pBTableRec1->close();
        pBlockTable->close();
        pBlkRef->close();
        return true;
}


调用:testBlock1(); 或 testBlock2();


发表于 2014-11-20 10:41:45 | 显示全部楼层
先不说其他的问题,就说这个吧,
es = pDatabase->getBlockTable(pBlockTable,McDb::kForWrite);
        if(es != Acad::eOk){
                AfxMessageBox(_T("获得块表失败"));
        }

  es = pDatabase->getBlockTable(pBlockTable,McDb::kForRead);
        if(es != Acad::eOk){
                AfxMessageBox(_T("获得块表失败"));
        }

这里,es肯定是eWasOpenForWrite
 楼主| 发表于 2014-11-20 11:47:58 | 显示全部楼层
luowy 发表于 2014-11-20 10:41
先不说其他的问题,就说这个吧,
es = pDatabase->getBlockTable(pBlockTable,McDb::kForWrite);
       ...

这个位置 es == Acad::eOk 下图是我跟踪的结果


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2014-11-20 13:13:36 | 显示全部楼层
pBTableRec1->appendAcDbEntity(newEntId0,pLine);
        pBTableRec1->appendAcDbEntity(newEntId1,pLine1);
pLine和pLine1没有关闭
 楼主| 发表于 2014-11-20 13:45:27 | 显示全部楼层
yanguiming 发表于 2014-11-20 13:13
pBTableRec1->appendAcDbEntity(newEntId0,pLine);
        pBTableRec1->appendAcDbEntity(newEntId1,pLi ...

我尝试着把这两个对象关闭,还是没成功。
 楼主| 发表于 2014-11-20 15:39:34 | 显示全部楼层
顶起来,别沉下去
发表于 2014-11-20 17:15:33 | 显示全部楼层
那错误提示呢?
 楼主| 发表于 2014-11-20 20:49:17 | 显示全部楼层
netsky2580 发表于 2014-11-20 15:39
顶起来,别沉下去

没有错误,程序可以从头执行到尾,但就是图块显示不出来。
发表于 2014-11-21 08:46:49 | 显示全部楼层
本帖最后由 三水合一 于 2014-11-21 08:58 编辑

//定义一个图块,包括2条直线
        AcDbObjectId id0;
        AcDbBlockTableRecord * pBTableRec1;
        pBTableRec1 = new AcDbBlockTableRecord();
        pBTableRec1->setName(_T("testBlock2"));
        pBTableRec1->appendAcDbEntity(newEntId0,pLine);
        pBTableRec1->appendAcDbEntity(newEntId1,pLine1);
        pBlockTable->add(id0,pBTableRec1);
        pBTableRec1->close();
        pBlockTable->close();
//////////////分析//////////////////////////////////////
1、先把新的块表记录加到块表中,关闭;
2、在打开刚才新建的块表记录,吧你创建的实体(也就是你的那些直线)加到新块表中,关闭实体和块表记录。
3、再执行下面的操作试试。

我试了下
替换你的上面的这段代码:
//定义一个图块,包括2条直线
        AcDbObjectId id0;
        AcDbBlockTableRecord * pBTableRec1;
        pBTableRec1 = new AcDbBlockTableRecord();
        pBTableRec1->setName(_T("testBlock2"));
        pBlockTable->add(id0,pBTableRec1);
        pBTableRec1->close();
        pBlockTable->close();

        es = pDatabase->getBlockTable(pBlockTable,AcDb::kForRead);
        if (es != Acad::eOk)
        {
                delete pLine;
                delete pLine1;
                return;
        }

        es = pBlockTable->getAt(_T("testBlock2"), pBTableRec1,AcDb::kForWrite);
        if (es != Acad::eOk)
        {
                delete pLine;
                delete pLine1;
                return;
        }

        pBTableRec1->appendAcDbEntity(newEntId0,pLine);
        pBTableRec1->appendAcDbEntity(newEntId1,pLine1);
        pBTableRec1->close();
        pBlockTable->close();

再执行下面的操作,OK,ACAD2012测试,没问题,你试试

评分

参与人数 1金钱 +10 收起 理由
netsky2580 + 10

查看全部评分

发表于 2014-11-21 09:05:28 | 显示全部楼层
下面附一张效果图:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 06:41 , Processed in 0.185468 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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