找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 910|回复: 3

[求助]:2dpolyline做块问题

[复制链接]
发表于 2002-6-21 09:28:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
我用2dpolyline线做成块的时候pBlockTable->add(BlockId,blktab)出问题
如何解决 ???急
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-6-21 09:31:05 | 显示全部楼层

Re: [求助]:2dpolyline做块问题

最初由 missmoney 发布
[B]我用2dpolyline线做成块的时候pBlockTable->add(BlockId,blktab)出问题
如何解决 ???急 [/B]


把你的代码贴出来吧。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-6-21 09:37:51 | 显示全部楼层
{
        ads_printf("len:%d",ObjIdArr.length());

        //ads_alert("in");
        AcDbBlockTableRecord* blktab;
        //        char judge[2];
        int len;
        AcDbEntity* ent;
        AcDbEntity* entclone;
        AcDbBlockReference* blkref;
        AcDbDatabase *pEntityDb;
        AcDbBlockTable *pBlockTable;
        AcDbBlockTableRecord *pBlockTableRecord;
        len=ObjIdArr.length();
        ads_printf("len:%d",len);
        for(int qj=0; qj<len; qj++)
        {
                ads_printf("id:%ld",ObjIdArr[qj]);
        }
        CString name;
        name=pszName;
        int judge=0;
        if(name=="")
                return 2;
        //acutPrintf("\nlen%d",len);
        pEntityDb = acdbCurDwg();//ObjectARX2000的形式
        // Get the model space Block Table Record

        if(pEntityDb->getBlockTable(pBlockTable, AcDb::kForWrite)!=Acad::eOk)
                return 2;  
//        ads_alert("end getBlockTable");
        if(pBlockTable->has(pszName))
        {
        //        ads_alert("has");
                if(pBlockTable->getAt(pszName,blktab,AcDb::kForWrite)!=Acad::eOk)
                       
                {
                        pBlockTable->close();
                        return 2;
                }
                BlockId=blktab->objectId();
                /*        AcDbBlockReferenceIdIterator* bIter;
                blktab->newBlockReferenceIdIterator(bIter);
                for(int n=0; n<len; n++)
                {
                if(bIter->seek(ObjIdArr[n])==Acad::eOk)
                {
                blktab->close();
                pBlockTable->close();
                return 1;
                }
        }*/
               
               
               
               
                AcDbObjectId idd;
                AcDbBlockTableRecordIterator *pBTableRecordItr;
        //        ads_alert("pBlockTable");
                if(pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite)!=Acad::eOk)
                {
                        blktab->close();
                        pBlockTable->close();
                        return 2;
                }
        //        ads_alert(" end pBlockTable");
                pBlockTableRecord->newIterator(pBTableRecordItr);
               
                AcDbBlockReference* iddEnt;
               
                //        AcArray<AcDbEntity*> entitiesToMove;
                for(pBTableRecordItr->start(); !pBTableRecordItr->done();
                pBTableRecordItr->step())
                {
                        if(pBTableRecordItr->getEntity((AcDbEntity*&)iddEnt,AcDb::kForRead)!=Acad::eOk)
                        {      
                                pBlockTable->close();
                                pBlockTableRecord->close();
                                blktab->close();   
                                return 2;
                        }
                        if(iddEnt->isKindOf(AcDbBlockReference::desc()) == Adesk::kTrue)
                        {
                               
                               
                                if(iddEnt->blockTableRecord()==BlockId)
                                {
                                        idd=iddEnt->objectId();
                                        for(int n=0; n<len; n++)
                                        {
                                                if(idd==ObjIdArr[n])
                                                {
                                                        blktab->close();
                                                        iddEnt->close();
                                                        pBlockTableRecord->close();
                                                        pBlockTable->close();
                                                        return 1;
                                                }
                                        }
                                }//endif
                        }//endif
                        iddEnt->close();
                       
                }
                pBlockTableRecord->close();//判断是否自身引用;end*/
                AcDbBlockTableRecordIterator *pBlockTableRecordItr;
                blktab->newIterator(pBlockTableRecordItr);
                AcDbEntity* pEnt;
                //        AcArray<AcDbEntity*> entitiesToMove;
                for(pBlockTableRecordItr->start(); !pBlockTableRecordItr->done();
                pBlockTableRecordItr->step())
                {
                        if(pBlockTableRecordItr->getEntity(pEnt,AcDb::kForWrite)!=Acad::eOk)
                        {
                                pBlockTable->close();
                                blktab->close();
                                return 2;
                        }
                       
                        AcTransaction* pTrans=actrTransactionManager->startTransaction();
                       
                        //actrTransactionManager->enableGraphicsFlush(Adesk::kTrue);
                        actrTransactionManager->addNewlyCreatedDBRObject(pEnt);
                       
                       
                       
                        if(pEnt->erase(Adesk::kTrue)!=Acad::eOk)
                        {
                                pBlockTable->close();
                                blktab->close();
                                pEnt->close();
                                // acutPrintf("\nerase");
                                return 2;
                        }
                        actrTransactionManager->endTransaction();
                        pEnt->close();
                       
                }//删除原来实体;
                delete pBlockTableRecordItr;
                /*        if(pBlockTableRecord->assumeOwnershipOf(entitiesToMove)!=Acad::eOk)
                {
                pBlockTableRecord->close();
                return false;
                        }*/
        //        ads_alert("acdbOpenAcDbEntity");
                for(int i=0;i<len;i++)
                {
                        if(acdbOpenAcDbEntity(ent,ObjIdArr,AcDb::kForRead)!=Acad::eOk)
                               
                        {
                                pBlockTable->close();
                                blktab->close();
                                // acutPrintf("/n1");
                                return 2;
                        }
                        //modified 2002-03-21
                        //begin
                        //将2dpolyline实体转换成polyline
                        if (ent->isKindOf(AcDb2dPolyline::desc()))
                        {
                                AcDbPolyline *pPline;
                                Poly2dToPoly(ent,pPline);
                                entclone = AcDbEntity::cast( pPline->clone() );
                                delete pPline;
                                ent->close();
                        }
                        else
                        {
                                entclone = AcDbEntity::cast( ent->clone() );
                                ent->close();
                        }
//                        entclone = AcDbEntity::cast( ent->clone() );
//                        ent->close();
                        //end
        //                ads_alert("appendAcDbEntity");
                        if(blktab->appendAcDbEntity(entclone)!=Acad::eOk)
                        {
                                pBlockTable->close();
                                blktab->close();
                                entclone->close();
                                //acutPrintf("/n2");
                                return 2;
                        }
        //                ads_alert("end appendAcDbEntity");

                        entclone->close();
                       
                }//加入新实体;
//                ads_alert(" end ");
                if(blktab->setOrigin(ptBase)!=Acad::eOk)
                {
                        //acutPrintf("\norigin\n");
                        blktab->close();
                        pBlockTable->close();
                        return 2;
                }
               
                /* pBlockTable->close();
                pBlockTableRecord->close();
                return true;*/
                judge=1;
        }//end已存在此块;
       
        else
        {
//                ads_alert("not has");
                //ads_alert("不已存在此块");
                blktab=new         AcDbBlockTableRecord();//创建块表记录;
                blktab->setName(pszName);
               
//                ads_alert("open 1");
                for(int i=0;i<len;i++)
                {//ads_alert("open in");
                        if(acdbOpenAcDbEntity(ent,ObjIdArr,AcDb::kForRead)!=Acad::eOk)
                               
                        {
                                pBlockTable->close();
                                blktab->close();
                                // acutPrintf("/n1");
                                return 2;
                        }
                //        ads_alert("end open in");

                        //modified 2002-03-21
                        //begin
                /*        if (ent->isKindOf(AcDb2dPolyline::desc()))
                        {
                                ads_alert("2dp");
                                AcDbPolyline *pPline;
                                Poly2dToPoly(ent,pPline);
                                ads_alert("2dp clone");
                                entclone = AcDbEntity::cast( pPline->clone() );
                                ads_alert("end 2dp clone");
                            pPline->close();        //delete
                                ent->close();
                                ads_alert("end clone");
                        }
                        else
                        {
                                entclone = AcDbEntity::cast( ent->clone() );
                                ent->close();
                        }*/       
        //                ads_alert("2dp clone");

                        entclone = AcDbEntity::cast( ent->clone() );
                        ent->close();
                //        ads_alert(" end 2dp clone");

                        //end

//ads_alert("appendAcDbEntity1");
                        if(blktab->appendAcDbEntity(entclone)!=Acad::eOk)
                        {
                                ads_alert("!=Acad::eOk");
                                pBlockTable->close();
                                blktab->close();
                                entclone->close();
                                //acutPrintf("/n2");
                                return 2;
                        }
                //        ads_alert(" end  appendAcDbEntity1");
                        entclone->close();
                       
                }
                ads_alert("setOrigin");
                if(blktab->setOrigin(ptBase)!=Acad::eOk)
                {
                        return 2;
                }
                ads_alert(" end setOrigin");
                if(pBlockTable->add(BlockId,blktab)!=Acad::eOk)
                {
                        ads_alert("pBlockTable->add(BlockId,blktab)!=Acad::eOk");
                        blktab->close();
                        pBlockTable->close();
                        //        acutPrintf("\n nono");
                        return 2;
                }
                pBlockTable->close();
                ads_alert("pBlockTable  ");
        }//end else;
        //acutPrintf("\nid%d",BlockId);
        // pBlockTable->close();
        ads_alert("end else;");
        if(judge==1)
        {
                ads_alert("judge");
                AcDbBlockTableRecordIterator* pBlkTblRcdItr;
               
                if(pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite)!=Acad::eOk)
                {
                        blktab->close();
                        pBlockTable->close();
                        return 2;
                }
                pBlockTableRecord->newIterator(pBlkTblRcdItr);
                AcDbEntity* pEntItr;
                AcDbObjectId id;
                for(pBlkTblRcdItr->start(); ! pBlkTblRcdItr->done(); pBlkTblRcdItr->step())
                {
                        pBlkTblRcdItr->getEntityId(id);
                        AcTransaction* pTrans=actrTransactionManager->startTransaction();
                        if(pTrans->getObject((AcDbObject*&)pEntItr,id ,  AcDb::kForWrite)!=Acad::eOk )
                        {
                                blktab->close();
                                pBlockTable->close();
                                pBlockTableRecord->close();
                               
                                return 2;
                        }
                       
                       
                        pEntItr->erase( Adesk::kTrue);
                        pEntItr->erase( Adesk::kFalse);
                       
                        pEntItr->close();
                        actrTransactionManager->endTransaction();   
                       
                }
                pBlockTable->close();
                pBlockTableRecord->close();
               
               
               
               
                /*        AcDbBlockReferenceIdIterator* pIterator;
                AcDbObjectId id;
                AcDbEntity* ident;
                //ads_name entname;
                blktab->newBlockReferenceIdIterator( pIterator);
                blktab->close();
                for(pIterator->start(); !pIterator->done();        pIterator->step())
                {
                //acdbGetAdsName( entname,ids[k]);
                //acedRedraw(entname , 1);
               
                  pIterator->getBlockReferenceId (id);
                  AcTransaction* pTrans=actrTransactionManager->startTransaction();
                  if(pTrans->getObject((AcDbObject*&)ident,id ,  AcDb::kForWrite)!=Acad::eOk )
                  
                        //        if(acdbOpenAcDbEntity(ent,,AcDb::kForWrite)!=Acad::eOk)
                        {
                        //acutPrintf("\nopen");
                        return false;
                        }
                       
                          ads_printf("\nt");
                          ident->erase( Adesk::kTrue);
                          ident->erase( Adesk::kFalse);
                          
                               
                                  
                                        // ident->draw();
                                        ident->close();
                                        //  actrTransactionManager->queueForGraphicsFlush();   
                                        //  actrTransactionManager->flushGraphics();   
                                       
                                          actrTransactionManager->endTransaction();   
                                          
        }  */
                ads_alert("en d judge");
        }
        blktab->close();
        //  AcDbBlockReference* blkref;
    blkref=new AcDbBlockReference();//创建块引用;
        if(blkref->setBlockTableRecord(BlockId)!=Acad::eOk);
       
        blkref->setPosition(ptBase);
        //加入引用块;
        pEntityDb =acdbCurDwg();//ObjectARX2000的形式
        // Get the model space Block Table Record
        if(pEntityDb->getBlockTable(pBlockTable, AcDb::kForRead)!=Acad::eOk)
        {
                blkref->close();
                return 2;  
        }
        if(pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite)!=Acad::eOk)
        {
                blkref->close();
                pBlockTable->close();
                return 2;
        }
        pBlockTable->close();
        if(pBlockTableRecord->appendAcDbEntity(BlockRefID,blkref)!=Acad::eOk)
        {        pBlockTableRecord->close();
        blkref->close();
        return 2;
        }
        pBlockTableRecord->close();
    blkref->close();
        //删除实体;
        ads_alert("删除实体");
        for(int h=0;h<len;h++)
        {
                AcTransaction* pTrans=actrTransactionManager->startTransaction();
                if(pTrans->getObject((AcDbObject*&)ent,ObjIdArr[h] ,  AcDb::kForWrite)!=Acad::eOk )
                       
                        //        if(acdbOpenAcDbEntity(ent,,AcDb::kForWrite)!=Acad::eOk)
                {
                        //acutPrintf("\nopen");
                        return 2;
                }
                if(ent->erase(Adesk::kTrue)!=Acad::eOk)
                {        ent->close();
               
                // acutPrintf("\nerase");
               
                return 2;
                }
                actrTransactionManager->endTransaction();
                               
        }//end erase;
       
        //        BlockRefID=NULL;
        return 0;
       
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-6-21 09:49:35 | 显示全部楼层
最初由 missmoney 发布
[B]{
        ads_printf("len:%d",ObjIdArr.length());

        //ads_alert("in");
        AcDbBlockTableRecord* blktab;
        //        char judge[2];
        int len;
        AcDbEntity* ent;
        AcDbEntity* entclone;
        AcDbBlockReference* blkre... [/B]


一般来说,出现这样结果的原因是:

AcDb2dPolyline是复杂实体,出了主实体ID外,还包括AcDb2dVertex实体。因此,在你把2DPOLY添加到一个AcDbBlockTableRecord(块表记录)里的时候,只把主实体的所属ID设置成了块表记录,但是子实体AcDb2dVertex对象的所属ID没有设置,造成了一个块中的实体有不同的BLOCKID,因此出错了。

解决方法是对子实体对象调用下setBlockId设置下所属ID为AcDbBlockTableRecord的ID值。

你试试。

对于2dpoly的操作,推荐最好还是实现转换为AcDbPolyline对象,这样是简单的实体,做其后的工作都很方便。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-15 23:21 , Processed in 0.186526 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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