#include "stdafx.h" #include "MaterialRecord.h" #include "TDbBlockInsert.h" BOOL GetMaterialsFromBlock(const AcDbObjectId &idBlock, AcDbObjectIdArray &idArray) { XDbBlockTableRec rm_sdb("RM_SDB", AcDb::kForRead); if(!rm_sdb) return FALSE; AcDbObjectId idMater = rm_sdb.m_pBlockTableRec->objectId(); rm_sdb.Close(); OPENOBJ_BEGIN(idBlock, AcDb::kForRead, AcDbBlockTableRecord, pBlockRec); if(pBlockRec){ AcDbBlockTableRecordIterator *pRecIter = NULL; if(pBlockRec->newIterator(pRecIter)!=Acad::eOk || !pRecIter) return FALSE; for(pRecIter->start(); !pRecIter->done(); pRecIter->step()) { AcDbEntity *pEnt = NULL; if(pRecIter->getEntity(pEnt, AcDb::kForRead)!=Acad::eOk) continue; XDbObject obj(pEnt); if(pEnt->isA() == AcDbBlockReference::desc()) { AcDbBlockReference *pRef=(AcDbBlockReference *)pEnt; if(pRef->blockTableRecord() == idMater){ resbuf *rb=pRef->xData("AVE_MATERIAL"); if(!rb){ continue; } RBList rbList(rb); idArray.append(pEnt->objectId()); } } } delete pRecIter; } OPENOBJ_END(); return TRUE; } // 由块表记录获得给定名称的材质ID TARCH_EXP BOOL MaterialName2IdFromBlock(const AcDbObjectId &idBlock, const XStringList &lstNewMat, AcDbObjectIdArray &idArray) { XDbBlockTableRec rm_sdb("RM_SDB", AcDb::kForRead); if(!rm_sdb) return FALSE; AcDbObjectId idMater = rm_sdb.m_pBlockTableRec->objectId(); rm_sdb.Close(); OPENOBJ_BEGIN(idBlock, AcDb::kForRead, AcDbBlockTableRecord, pBlockRec); if(pBlockRec){ AcDbBlockTableRecordIterator *pRecIter = NULL; if(pBlockRec->newIterator(pRecIter)!=Acad::eOk || !pRecIter) return FALSE; for(pRecIter->start(); !pRecIter->done(); pRecIter->step()) { AcDbEntity *pEnt = NULL; if(pRecIter->getEntity(pEnt, AcDb::kForRead)!=Acad::eOk) continue; XDbObject obj(pEnt); if(pEnt->isA() == AcDbBlockReference::desc()) { AcDbBlockReference *pRef=(AcDbBlockReference *)pEnt; if(pRef->blockTableRecord() == idMater){ resbuf *rb=pRef->xData("AVE_MATERIAL"); if(!rb){ continue; } RBList rbList(rb); Groups *group=rbList.SearchNode(1000); if(group && ((XStringList &)lstNewMat).Index(group->string, FALSE)>=0) { idArray.append(pEnt->objectId()); } } } } delete pRecIter; } OPENOBJ_END(); return TRUE; } // 由块表记录获得给定名称的材质ID TARCH_EXP AcDbObjectId MaterialName2IdFromBlock(const AcDbObjectId &idBlock, const char *szMatName) { AcDbObjectId idRet; XDbBlockTableRec rm_sdb("RM_SDB", AcDb::kForRead); if(!rm_sdb) return idRet; AcDbObjectId idMater = rm_sdb.m_pBlockTableRec->objectId(); rm_sdb.Close(); OPENOBJ_BEGIN(idBlock, AcDb::kForRead, AcDbBlockTableRecord, pBlockRec); if(pBlockRec){ AcDbBlockTableRecordIterator *pRecIter = NULL; if(pBlockRec->newIterator(pRecIter)!=Acad::eOk || !pRecIter) return FALSE; for(pRecIter->start(); !pRecIter->done(); pRecIter->step()) { AcDbEntity *pEnt = NULL; if(pRecIter->getEntity(pEnt, AcDb::kForRead)!=Acad::eOk) continue; XDbObject obj(pEnt); if(pEnt->isA() == AcDbBlockReference::desc()) { AcDbBlockReference *pRef=(AcDbBlockReference *)pEnt; if(pRef->blockTableRecord() == idMater){ resbuf *rb=pRef->xData("AVE_MATERIAL"); if(!rb){ continue; } RBList rbList(rb); Groups *group=rbList.SearchNode(1000); if(group && stricmp(group->string, szMatName)==0) { idRet=pEnt->objectId(); break; } } } } delete pRecIter; } OPENOBJ_END(); return idRet; } BOOL GetBlkRecMatName(AcDbObjectId idBlock, XStringList &lstMatName, XStringList &lstGroupName) { XDbBlockTableRec rm_sdb("RM_SDB", AcDb::kForRead); if(!rm_sdb) return FALSE; AcDbObjectId id = rm_sdb.m_pBlockTableRec->objectId(); rm_sdb.Close(); OPENOBJ_BEGIN(idBlock, AcDb::kForRead, AcDbBlockTableRecord, pBlockRec); if(pBlockRec){ AcDbBlockTableRecordIterator *pRecIter = NULL; if(pBlockRec->newIterator(pRecIter)!=Acad::eOk || !pRecIter) return FALSE; for(pRecIter->start(); !pRecIter->done(); pRecIter->step()) { AcDbEntity *pEnt = NULL; if(pRecIter->getEntity(pEnt, AcDb::kForRead)!=Acad::eOk) continue; XDbObject obj(pEnt); if(pEnt->isA() == AcDbBlockReference::desc()) { AcDbBlockReference *pRef=(AcDbBlockReference *)pEnt; if(pRef->blockTableRecord() == id){ resbuf *rb=pRef->xData("AVE_MATERIAL"); if(!rb){ delete pRecIter; return FALSE; } RBList rbList(rb); Groups *group=rbList.SearchNode(1000); if(group) { CString csMatName = group->string; lstMatName.Append(strnew(csMatName)); } continue; } } resbuf *pxData = pEnt->xData("TCH_GROUPNAME"); CString csName; if(pxData) { resbuf *pNext = pxData->rbnext; if(pNext && pNext->restype == 1000) { csName = pNext->resval.rstring; //编号 if(lstGroupName.Index(csName) < 0) lstGroupName.Append(strnew(csName)); } ads_relrb(pxData); } } delete pRecIter; } OPENOBJ_END(); return TRUE; } void ListCurMatFromMSpace(XStringList &lstMats) { lstMats.Reset(); XDbBlockTableRec rm_sdb("RM_SDB", AcDb::kForRead); if(!rm_sdb) return; AcDbObjectId id = rm_sdb.m_pBlockTableRec->objectId(); rm_sdb.Close(); AcDbBlockTable *pTable = NULL; AcDbDatabase *dwg = acdbCurDwg(); if (acdbCurDwg()->getBlockTable(pTable, AcDb::kForRead) != Acad::eOk) return; if(!pTable) return; AcDbBlockTableRecord *pBlockTableRecord = NULL; VERIFY(pTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,AcDb::kForRead)==Acad::eOk); pTable->close(); if(!pBlockTableRecord) return; AcDbBlockTableRecordIterator* pBlockIterator = NULL; pBlockTableRecord->newIterator(pBlockIterator); if(!pBlockIterator){ pBlockTableRecord->close(); return; } AcRxClass *pClass = AcDbBlockReference::desc(); for(pBlockIterator->start(); !pBlockIterator->done(); pBlockIterator->step()) { AcDbEntity *pEnt = NULL; pBlockIterator->getEntity(pEnt, AcDb::kForRead); if(pEnt){ XDbObject obj(pEnt); if(pEnt->isA() == pClass) { AcDbBlockReference *pRef=(AcDbBlockReference *)pEnt; if(pRef->blockTableRecord() == id){ //材质块 resbuf *rb=pRef->xData("AVE_MATERIAL"); if(!rb){ continue; } RBList rbList(rb); Groups *group=rbList.SearchNode(1000); if(group) { if(stricmp(group->string, "*全局*") != 0 && stricmp(group->string, "*GLOBAL*") != 0) lstMats.Append(strnew(group->string)); } } } } } delete pBlockIterator; pBlockTableRecord->close(); } BOOL GetMatByMatName(const char * csMat, CMaterialData &matData) { if(!csMat || !csMat[0]) return FALSE; CAvRmatParam rmatPara; rmatPara.mode = AvRmatList; rmatPara.flags = AvRmatName; rmatPara.name = strdup(csMat); AvErrorCode retCode = av_rmat(&rmatPara); //其他信息,如贴图文件没有被释放 if(retCode!=AvRetNorm) { //free(rmatPara.name); return FALSE; } matData.ConvertFrom(rmatPara); //free(rmatPara.name); return TRUE; } BOOL DeleteMatInBlk(AcDbObjectId idBlock) { XDbBlockTableRec rm_sdb("RM_SDB", AcDb::kForRead); if(!rm_sdb) return FALSE; AcDbObjectId id = rm_sdb.m_pBlockTableRec->objectId(); rm_sdb.Close(); OPENOBJ_BEGIN(idBlock, AcDb::kForRead, AcDbBlockTableRecord, pBlockRec); if(pBlockRec){ AcDbBlockTableRecordIterator *pRecIter = NULL; if(pBlockRec->newIterator(pRecIter)!=Acad::eOk || !pRecIter) return FALSE; for(pRecIter->start(); !pRecIter->done(); pRecIter->step()) { AcDbEntity *pEnt = NULL; if(pRecIter->getEntity(pEnt, AcDb::kForWrite)!=Acad::eOk) continue; XDbObject obj(pEnt); if(pEnt->isA() == AcDbBlockReference::desc()) { AcDbBlockReference *pRef=(AcDbBlockReference *)pEnt; if(pRef->blockTableRecord() == id){ pRef->erase(); continue; } } } delete pRecIter; } OPENOBJ_END(); return TRUE; } // ******************** 把图块的材质移动到模型空间 ****************************** // 1. 如果模型空间已经存在同名材质,则删除图块的材质。并把模型空间材质附到图块部件 // 2. 如果模型空间没有同名材质,则记录图块材质,删除图块材质,然后在模型空间创建材质并附到图块部件 TARCH_IMPEXP BOOL MoveMaterial2MSpace(AcDbObjectId idBlock) { if (av_loadlib() != AvRetNorm) { acdbFail("Library initialization failed.\n"); return 1; } av_initialize(); XDbBlockTableRec rm_sdb("RM_SDB", AcDb::kForRead); if(!rm_sdb) return FALSE; AcDbObjectId id = rm_sdb.m_pBlockTableRec->objectId(); rm_sdb.Close(); //这个不关闭,将造成AV命令执行不正常。 XStringList lstMatName, lstMSpaceMat, lstGroup, lstNewMat; if(!GetBlkRecMatName(idBlock, lstMatName, lstGroup) || lstMatName.Length() < 1) return FALSE; ListCurMatFromMSpace(lstMSpaceMat); for(int i=0;i15) { //DbMaterial和AvMaterial同步 AvRprefParam pref; pref.mode = AvRprefSet; pref.flags = AvRprefToggle; pref.toggle.AvRprefSyncDatabaseToggle = TRUE; pref.toggle.flags = AvRprefSyncDatabase; AvErrorCode retCode = av_rpref(&pref); if(retCode!=AvRetNorm) adsout << av_errorstr(retCode); } //R16的AV调用不支持,图块材质的访问,因此要把材质移动到模型空间 /* AcDbObjectIdArray idArray; MaterialName2IdFromBlock(idBlock, lstNewMat, idArray); AcDbIdMapping idMap; Acad::ErrorStatus esOk=acdbCurDwg()->deepCloneObjects(idArray, idMSpace, idMap, false); */ // 创建Db的材质,从外部数据库获取 XString sFilePath; if(lstNewMat.Length() && FindFile("上华标准材质.TML", sFilePath)) { CMaterialRecord matRec; if(matRec.Open(sFilePath)) { for(matRec.MoveFirst(); !matRec.IsEOF(); matRec.MoveNext()) { if(lstNewMat.Index(matRec.m_sItem, FALSE)>=0) { matRec.DbCreate(); lstNewMat.Remove(); CAvRmatParam rmat; if(matRec.ConvertTo(rmat)) rmat.MatModify(); if(!lstNewMat) break; } } } } #else // 这一段可能导致图中的最后一个物体被删除 for(i=0;inewIterator(pRecIter)!=Acad::eOk || !pRecIter) return FALSE; for(pRecIter->start(); !pRecIter->done(); pRecIter->step()) { AcDbEntity *pEnt = NULL; if(pRecIter->getEntity(pEnt, AcDb::kForWrite)!=Acad::eOk) continue; XDbObject obj(pEnt); resbuf *pxData = pEnt->xData("TCH_GROUPNAME"); CString csName; if(pxData) { CString csMatName; resbuf *pNext = pxData->rbnext; if(pNext && pNext->restype == 1000) { csName = pNext->resval.rstring; //编号 pNext = pNext->rbnext; } if(pNext && pNext->restype == 1000) csMatName = pNext->resval.rstring; //材质 ads_relrb(pxData); RBList xd2=pEnt->xData("AVE_FINISH"); Groups *rb=xd2.SearchNode(1005); if(rb) { AcDbObjectId idMat=MaterialName2IdFromBlock(idMSpace, csMatName); if(idMat.isValid()) { AcDbHandle hand=idMat.handle(); char szHand[256]=""; hand.getIntoAsciiBuffer(szHand); free(rb->string); rb->string=strdup(szHand); } pEnt->setXData(xd2); } /* CAvRmatParam rmatPara; rmatPara.attachment =AvRmatByObject; rmatPara.name=strdup(csMatName); rmatPara.mode = AvRmatAttachResbuf; rmatPara.flags = AvRmatName|AvRmatRb; if(av_rmat(&rmatPara)==AvRetNorm) { resbuf *pXData2 = rmatPara.rb; pEnt->setXData(pXData2); }*/ } } delete pRecIter; } OPENOBJ_END(); //#endif return TRUE; } BOOL IsMultiViewBlock(const AcDbBlockTableRecord *pBlock) { BOOL bRet=FALSE; if(pBlock) { resbuf *pxData = pBlock->xData(TCHXD); // 读扩展数据 if(pxData) { resbuf *pNext = pxData->rbnext; if(pNext && pNext->restype == 1005) { bRet=TRUE; } ads_relrb(pxData); } } return bRet; } // 从TArch6Beta1版本升级多视图图块,消除图块中的材质 void UpdateMViewBlock() { if (av_loadlib() != AvRetNorm) { acdbFail("AvLibrary initialization failed.\n"); return; } av_initialize(); AcDbObjectIdArray idBlockArray; AcDbBlockTable *pNewBlockTab=NULL; VERIFY(acdbCurDwg()->getSymbolTable(pNewBlockTab, AcDb::kForRead)==Acad::eOk); ASSERT(pNewBlockTab); AcDbBlockTableIterator *pIterator=NULL; Acad::ErrorStatus es1=pNewBlockTab->newIterator(pIterator); pNewBlockTab->close(); if(es1==Acad::eOk && pIterator) { for(pIterator->start(); !pIterator->done(); pIterator->step()) { AcDbBlockTableRecord *pRec=NULL; if(pIterator->getRecord(pRec, AcDb::kForWrite)==Acad::eOk && pRec && !pRec->isFromExternalReference()) { if(IsMultiViewBlock(pRec)) idBlockArray.append(pRec->objectId()); pRec->close(); } } delete pIterator; } int nCount=idBlockArray.length(); for(int i=0; iIsMultiView()) { TDbMultiViewInsert *pInsert2=new TDbMultiViewInsert; pInsert2->setPropertiesFrom(pInsert1); pInsert2->SetBlockId(TRUE, pInsert1->blockTableRecord()); pInsert2->SetBlockId(FALSE, pInsert1->Get2DBlockId()); XPoint ptLoc=pInsert1->position(); pInsert2->SetLocation(ptLoc); pInsert2->SetScaleFactors(pInsert1->scaleFactors()); pInsert2->SetRotation(pInsert1->rotation()); Acad::ErrorStatus es=pInsert1->handOverTo(pInsert2); if(es==Acad::eObjectToBeDeleted) { pInsert2->close(); delete pInsert1; } else { pInsert1->close(); delete pInsert2; // ZJQ add this line on 2003/10/16 } } else { pInsert1->close(); } } /* OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbBlockInsert, pInsert); int nFlag=pInsert->GetMaskFlag(); if(nFlag&BIF_T6BETA1) { nFlag &= ~BIF_T6BETA1; pInsert->SetMaskFlag(nFlag); } OPENOBJ_END(); */ } } }