天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 5|回复: 0

使用wblockCloneObjects从后台读取dwg文件复制实体到当前数据库

[复制链接]
  • TA的每日心情
    开心
    昨天 15:23
  • 签到天数: 69 天

    [LV.6]常住居民II

    410

    主题

    167

    回帖

    2704

    积分

    管理员

    积分
    2704
    发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
    AcDbDatabase *pNewDb=new AcDbDatabase(Adesk::kFalse);        
            if (pNewDb == NULL)
            {
                return;
            }
            Acad::ErrorStatus es= pNewDb->readDwgFile(_T("D:\\123.dwg"));
            if (Acad::eOk != es || NULL == pNewDb)
            {
                acutPrintf(_T("\n打开dwg文件失败,错误码:%s"),acadErrorStatusText(es));
                return;
            }
            AcDbObjectIdArray objIdArray;
            AcDbBlockTable *pBlkTbl=NULL;
            es= pNewDb->getBlockTable(pBlkTbl,AcDb::kForRead);
            if (Acad::eOk != es || NULL == pBlkTbl)
            {
                acutPrintf(_T("\n获取源数据库块表失败,错误码:%s"),acadErrorStatusText(es));
                delete pNewDb;
                pNewDb=NULL;
                return;
            }
            AcDbBlockTableRecord *pMsBlkRcd=NULL;
            es= pBlkTbl->getAt(ACDB_MODEL_SPACE,pMsBlkRcd,AcDb::kForRead);
            pBlkTbl->close();
            if (Acad::eOk != es || NULL == pMsBlkRcd)
            {
                acutPrintf(_T("\n获取源数据库模型空间块表记录失败,错误码:%s"),acadErrorStatusText(es));
                delete pNewDb;
                pNewDb=NULL;
                return;
            }
            //遍历源数据库模型空间块记录中的实体
            AcDbBlockTableRecordIterator *pIter=NULL;
            pMsBlkRcd->newIterator(pIter);
            pMsBlkRcd->close();
            AcDbObjectId objId;        
            for (pIter->start();!pIter->done();pIter->step())
            {
                pIter->getEntityId(objId);
                objIdArray.append(objId);
                //将扩展字典改为硬拥有,否则写块出去后会丢失
                AcDbEntity *pEnt=NULL;
                es = pIter->getEntity(pEnt,AcDb::kForWrite);
                if (Acad::eOk == es)
                {
                    AcDbObjectId dicId= pEnt->extensionDictionary();
                    if (AcDbObjectId::kNull != dicId)
                    {
                        AcDbObjectPointer<AcDbDictionary> pDic(dicId,AcDb::kForWrite);
                        if(Acad::eOk == pDic.openStatus())
                        {
                            pDic->setTreatElementsAsHard(Adesk::kTrue);
                            pDic->close();
                        }
                    }
                    pEnt->close();
                }
            }
            delete pIter;        

            //检查objectId
            if (objIdArray.isEmpty())
            {
                acutPrintf(_T("\n克隆失败,源数据库的模型空间没有实体!"));
                delete pNewDb;
                pNewDb=NULL;
                return;
            }
            AcDbIdMapping idMap;
            AcDbDatabase *pDb= acdbHostApplicationServices()->workingDatabase();
            //获取当前数据库的空间ID
            AcDbObjectId mSpaceId= pDb->currentSpaceId();
            //写块克隆 忽略重定义模式
            es =  pNewDb->wblockCloneObjects(objIdArray,mSpaceId,idMap,AcDb::kDrcIgnore);
            if (Acad::eOk != es)
            {
                acutPrintf(_T("\ndeepCloneObjects失败错误码:%s"),acadErrorStatusText(es));
                delete pNewDb;
                pNewDb=NULL;
                return;
            }
            //删除临时数据库
            delete pNewDb;
            pNewDb=NULL;
            
       
            
            AcDbIdPair IdPair;
            AcDbObjectIdArray arrID2;
            //获取克隆后的和原id匹配的对象的objectid,克隆idmap是全部的id映射,包括一些附带的数据
            for (int i=0;i<objIdArray.length();i++)  
            {
                IdPair.setKey(objIdArray[i]);
                if (idMap.compute(IdPair))
                {
                    arrID2.append(IdPair.value());
                }
            }
            if (!arrID2.isEmpty())
            {
                acutPrintf(_T("\n复制:%d个对象成功!"),arrID2.length());
            }
            
            //#define Randmod(x) rand()%x
            //亮显选择集
            ads_name ss,ent;
            acedSSAdd(NULL,NULL,ss);
            for (int i=0;i<arrID2.length();i++)
            {
                AcDbEntityPointer pEnt(arrID2[i],AcDb::kForWrite);
                if (Acad::eOk == pEnt.openStatus())
                {
                    //pEnt->setColorIndex(Randmod(11));
                    acdbGetAdsName(ent,arrID2[i]);
                    acedSSAdd(ent,ss,ss);
    //                 if (pEnt->isKindOf(AcDbDimension::desc()))
    //                 {
    //                     AcDbDimension *pDim=AcDbDimension::cast(pEnt);
    //                     pDim->recomputeDimBlock();
    //                 }
                    pEnt->recordGraphicsModified();
                    pEnt->close();
                }                    
            }
            Adesk::Int32 nLength;
            acedSSLength(ss,&nLength);        
            if (nLength>0)
            {
                acedSSSetFirst(ss,NULL);
            }
            //acedCommand(RTSTR,_T("_.select"),RTPICKS,ss,RTSTR,_T(""),RTNONE);        
            acedSSFree(ss);

     

     

     

     

    使用wblockCloneObjects从后台读取dwg文件复制实体到当前数据库
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|

    GMT+8, 2024-7-1 05:30 , Processed in 0.059540 second(s), 22 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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