#include "stdafx.h" #include "acestext.h" #include "resource.h" extern TARCH_IMPEXP AcDbObjectId g_idPubWall; extern GEOAPI int g_nProductId; // extern GEOAPI XPface * ConstructPolyFace(const AcDbVoidPtrArray &entSet); class TExplodeSet: public AcDbVoidPtrArray { public: TMasterProperties m_prop; }; void RemoveTchSolidData(AcDbEntity *pEnt) { resbuf* pRb = pEnt->xData(TCH_SOLID_APPNAME); if (!pRb) return; RBList rb(pRb); AcDbObjectId idDict = pEnt->extensionDictionary(); if (!idDict.isValid()) return ; BOOL bClear = FALSE; pRb = acutBuildList(1001, TCH_SOLID_APPNAME, 0); RBList rbNew(pRb); AcDbObject* pPart = NULL; AcDbDictionary* pDict = NULL; OPENOBJ_BEGIN(idDict, AcDb::kForRead, AcDbDictionary, pDict); if (pDict == NULL) return; AcDbObject *pObj=NULL; if (pDict->getAt(TCH_SOLID_PART, pObj, AcDb::kForWrite) != Acad::eOk) return ; if (pObj) { pObj->erase(); pObj->close(); } OPENOBJ_END(); pEnt->setXData(pRb); pEnt->releaseExtensionDictionary(); } //把pface加入图块 BOOL AddToBlockTableRecord(const XPface &rMesh, const TMasterProperties &prop, const TCHAR *szLay, AcDbBlockTableRecord *pRec) { ASSERT(pRec && szLay); AcDbPolyFaceMesh *pMesh=new AcDbPolyFaceMesh; pMesh->setDatabaseDefaults(pRec->database()); //prop.SetTo(pMesh); pMesh->setLayer(prop.m_idLayer); pMesh->setLinetype(prop.m_idLineType); pMesh->setColorIndex(prop.m_nColor); #if ADS>16 pMesh->setMaterial(prop.m_idMaterial); #endif if (szLay && _tcscmp(szLay, _T("0"))!=0) pMesh->setLayer(GetLayerIdFromString(szLay, pRec->database())); VERIFY(pRec->appendAcDbEntity(pMesh)==Acad::eOk); for(int i=0; isetPropertiesFrom(pMesh); VERIFY(pMesh->appendVertex(pVertex)==Acad::eOk); pVertex->close(); } for(i=0; isetPropertiesFrom(pMesh); Acad::ErrorStatus es=pMesh->appendFaceRecord(pFaceRec); assert(es==Acad::eOk); pFaceRec->close(); } pMesh->close(); return TRUE; } // 从集合中筛选出同一层的3DFACE放入另外一个集合,并从原集会中扣除 // entSet(I/O) -- 原集合 // faceSet(O)--目标集合 // szLayer(O) --图层 BOOL Select3DFacesByLayer(AcDbVoidPtrArray &entSet, AcDbVoidPtrArray &faceSet, TCHAR *szLayer) { int nLen=entSet.length(); //AcDbIntArray indexArray; BOOL bFirstCase=TRUE; for(int i=0; iisA()==AcDbFace::desc()) { TCHAR *pLayer=pEnt->layer(); ASSERT(pLayer); if (bFirstCase) { _tcscpy(szLayer, pLayer); faceSet.append(pEnt); entSet.removeAt(i); i--; nLen--; //indexArray.append(i); bFirstCase=FALSE; } else if (_tcsicmp(szLayer, pLayer)==0) { faceSet.append(pEnt); entSet.removeAt(i); i--; nLen--; //indexArray.append(i); } acutDelString(pLayer); } } return !bFirstCase; } //在图块内分解上华对象 BOOL RemoveTchSolidData(AcDbBlockTableRecord *pRec) { AcDbBlockTableRecordIterator *pRecIter=NULL; if (pRec->newIterator(pRecIter)==Acad::eOk && pRecIter) { } else return FALSE; //对块表记录中的对象进行分解 //AcDbVoidPtrArray entSetNew; DList lstNewSet; for(pRecIter->start(); !pRecIter->done(); pRecIter->step()) { AcDbEntity *pEnt=NULL; if (pRecIter->getEntity(pEnt, AcDb::kForWrite)==Acad::eOk) { ASSERT(pEnt); if (_tcsicmp(pEnt->isA()->dxfName(), _T("3DSOLID"))==0) { RemoveTchSolidData(pEnt); } pEnt->close(); } } delete pRecIter; return TRUE; } //在图块内分解上华对象 BOOL ExplodeWithinBlock(AcDbBlockTableRecord *pRec, BOOL bExp3d) { AcDbBlockTableRecordIterator *pRecIter=NULL; if (pRec->newIterator(pRecIter)==Acad::eOk && pRecIter) { } else return FALSE; //对块表记录中的对象进行分解 //AcDbVoidPtrArray entSetNew; DList lstNewSet; for(pRecIter->start(); !pRecIter->done(); pRecIter->step()) { AcDbEntity *pEnt=NULL; if (pRecIter->getEntity(pEnt, AcDb::kForWrite)==Acad::eOk) { ASSERT(pEnt); if (pEnt->isKindOf(TDbEntity::desc()) || pEnt->isKindOf(TDbCurveEntity::desc()) || pEnt->isKindOf(TDbBlockInsert::desc())) { //分解对象 TExplodeSet *pNewSet=new TExplodeSet; pEnt->explode(*pNewSet); pNewSet->m_prop.m_idLayer=pEnt->layerId(); pNewSet->m_prop.m_idLineType=pEnt->linetypeId(); pNewSet->m_prop.m_nColor=pEnt->colorIndex(); #if ADS>16 pNewSet->m_prop.m_idMaterial=pEnt->materialId(); #endif lstNewSet.Append(pNewSet); } else if (_tcsicmp(pEnt->isA()->dxfName(), _T("3DSOLID"))==0) { RemoveTchSolidData(pEnt); } pEnt->close(); } } //对块表中的上华对象进行删除 for(pRecIter->start(); !pRecIter->done(); pRecIter->step()) { AcDbEntity *pEnt=NULL; if (pRecIter->getEntity(pEnt, AcDb::kForWrite)==Acad::eOk) { ASSERT(pEnt); if (pEnt->isKindOf(TDbEntity::desc()) || pEnt->isKindOf(TDbCurveEntity::desc()) || pEnt->isKindOf(TDbBlockInsert::desc())) { pEnt->erase(); //删除对象 } pEnt->close(); } } for(int idx=0; idxappendAcDbEntity(pNewEnt); pNewEnt->close(); } } } } //加入新转换的对象 int num=entSetNew.length(); for(int n=0; nappendAcDbEntity(pNewEnt)==Acad::eOk); pNewEnt->close(); } } delete pRecIter; return TRUE; } // 取多个文件 BOOL GetDwgFilesDia(XStringList &lstFiles, CWnd *pParent, const TCHAR *pszDir, const TCHAR *pszTitle) { const TCHAR *pszFilter = _T("DWG Files (*.dwg)|*.dwg||"); CFileDialog dlg(TRUE, _T("DWG"), NULL, OFN_ALLOWMULTISELECT|OFN_HIDEREADONLY, pszFilter, pParent); TCHAR szFileName[4056] = _T(""); const TCHAR * szDlgTitle = pszTitle; int maxChar = 4055; dlg.m_ofn.lpstrFile = szFileName; dlg.m_ofn.nMaxFile = maxChar; dlg.m_ofn.lpstrTitle = szDlgTitle; dlg.m_ofn.lpstrInitialDir = pszDir; if (dlg.DoModal() !=IDOK ) return FALSE; //strcpy(pszDir, dlg.GetPathName()); POSITION pos = dlg.GetStartPosition(); while(pos!=NULL) { CString csPath = dlg.GetNextPathName(pos); lstFiles.Append(tstrnew(csPath)); } return TRUE; } void TestAppId() { XString sFile; if (GetFileDia(sFile, 0, _T("dwg"), _T("Test file"))!=RTNORM) return; AcDbDatabase db(false, true); #if ADS < 21 if (db.readDwgFile(sFile, _SH_DENYNO, false)!=Acad::eOk) #else if (db.readDwgFile(sFile, AcDbDatabase::kForReadAndAllShare, false)!=Acad::eOk) #endif return; AcDbRegAppTable *pAppTab=NULL; VERIFY(db.getSymbolTable(pAppTab, AcDb::kForWrite)==Acad::eOk); if (!pAppTab->has(_T("WTHICK"))) { AcDbRegAppTableRecord *pRec=new AcDbRegAppTableRecord; pRec->setName(_T("WTHICK")); VERIFY(pAppTab->add(pRec)==Acad::eOk); pRec->close(); } pAppTab->close(); AcDbObjectId idMSpace=GetMSpaceId(&db); if (!idMSpace.isValid()) return; OPENOBJ_BEGIN(idMSpace, AcDb::kForRead, AcDbBlockTableRecord, pRec); if (pRec) { AcDbBlockTableRecordIterator *pRecIter=NULL; if (pRec->newIterator(pRecIter)==Acad::eOk && pRecIter) { for(pRecIter->start(); !pRecIter->done(); pRecIter->step()) { AcDbEntity *pEnt=NULL; if (pRecIter->getEntity(pEnt, AcDb::kForWrite)==Acad::eOk) { ASSERT(pEnt); XDbObject autoClose1(pEnt); if (pEnt->isKindOf(TDbWall::desc())) { RBList xd=ads_buildlist(1001, _T("WTHICK"), 1040, 200.0, NULL); pEnt->setXData(xd); } } } delete pRecIter; } } OPENOBJ_END(); db.saveAs(_T("d:\\temp\\abc.dwg")); }