305 lines
8.5 KiB
C++
305 lines
8.5 KiB
C++
#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; i<rMesh.Length(); i++) {
|
|
AcDbPolyFaceMeshVertex *pVertex=new AcDbPolyFaceMeshVertex(rMesh[i]);
|
|
pVertex->setPropertiesFrom(pMesh);
|
|
VERIFY(pMesh->appendVertex(pVertex)==Acad::eOk);
|
|
pVertex->close();
|
|
}
|
|
for(i=0; i<rMesh.faces.Length(); i++) {
|
|
const XPolyFacet &rFace=rMesh.faces[i];
|
|
AcDbFaceRecord *pFaceRec=new AcDbFaceRecord(rFace.vt1, rFace.vt2, rFace.vt3, rFace.vt4);
|
|
pFaceRec->setPropertiesFrom(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; i<nLen; i++) {
|
|
AcDbEntity *pEnt=(AcDbEntity *)entSet[i];
|
|
if (pEnt->isA()==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<TExplodeSet> 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<TExplodeSet> 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; idx<lstNewSet.Length(); idx++) {
|
|
TExplodeSet &entSetNew=*lstNewSet[idx];
|
|
if (bExp3d) {
|
|
AcDbVoidPtrArray entSetFace;
|
|
TCHAR szLayer[256]=_T("");
|
|
while(Select3DFacesByLayer(entSetNew, entSetFace, szLayer)) {
|
|
//if (_tcscmp(szLayer, _T("0"))==0)
|
|
// strcpy(szLayer, szLay);
|
|
int nLen=entSetFace.length();
|
|
XPface *pMesh=ConstructPolyFace(entSetFace);
|
|
if (pMesh) {
|
|
AddToBlockTableRecord(*pMesh, entSetNew.m_prop, szLayer, pRec);
|
|
delete pMesh;
|
|
ReleaseEntSet(entSetFace);
|
|
} else {
|
|
for(int n=0; n<nLen; n++) {
|
|
AcDbEntity *pNewEnt=(AcDbEntity *)entSetFace[n];
|
|
pRec->appendAcDbEntity(pNewEnt);
|
|
pNewEnt->close();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//加入新转换的对象
|
|
int num=entSetNew.length();
|
|
for(int n=0; n<num; n++) {
|
|
AcDbEntity *pNewEnt=(AcDbEntity *)entSetNew[n];
|
|
VERIFY(pRec->appendAcDbEntity(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"));
|
|
}
|