乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 151|回复: 9

朋友们帮忙看看错在哪里

[复制链接]

2

主题

7

帖子

1

银币

初来乍到

Rank: 1

铜币
15
发表于 2014-11-20 10:15:00 | 显示全部楼层 |阅读模式
下面是两段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();
回复

使用道具 举报

2

主题

165

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
173
发表于 2014-11-20 10:41:00 | 显示全部楼层
先不说其他的问题,就说这个吧,
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
回复

使用道具 举报

2

主题

7

帖子

1

银币

初来乍到

Rank: 1

铜币
15
发表于 2014-11-20 11:47:00 | 显示全部楼层

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

qpql1koleaq.jpg

qpql1koleaq.jpg

回复

使用道具 举报

0

主题

9

帖子

2

银币

初来乍到

Rank: 1

铜币
9
发表于 2014-11-20 13:13:00 | 显示全部楼层
pBTableRec1->appendAcDbEntity(newEntId0,pLine);
        pBTableRec1->appendAcDbEntity(newEntId1,pLine1);
pLine和pLine1没有关闭
回复

使用道具 举报

2

主题

7

帖子

1

银币

初来乍到

Rank: 1

铜币
15
发表于 2014-11-20 13:45:00 | 显示全部楼层

我尝试着把这两个对象关闭,还是没成功。
回复

使用道具 举报

2

主题

7

帖子

1

银币

初来乍到

Rank: 1

铜币
15
发表于 2014-11-20 15:39:00 | 显示全部楼层
顶起来,别沉下去
回复

使用道具 举报

2

主题

165

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
173
发表于 2014-11-20 17:15:00 | 显示全部楼层
那错误提示呢?
回复

使用道具 举报

2

主题

7

帖子

1

银币

初来乍到

Rank: 1

铜币
15
发表于 2014-11-20 20:49:00 | 显示全部楼层

没有错误,程序可以从头执行到尾,但就是图块显示不出来。
回复

使用道具 举报

0

主题

6

帖子

1

银币

初来乍到

Rank: 1

铜币
6
发表于 2014-11-21 08:46:00 | 显示全部楼层

//定义一个图块,包括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测试,没问题,你试试
回复

使用道具 举报

0

主题

6

帖子

1

银币

初来乍到

Rank: 1

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

eaeiwzu22oe.jpg

eaeiwzu22oe.jpg
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-5 04:05 , Processed in 0.349123 second(s), 75 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表